/[thuban]/branches/WIP-pyshapelib-bramz/Thuban/UI/projdialog.py
ViewVC logotype

Diff of /branches/WIP-pyshapelib-bramz/Thuban/UI/projdialog.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1795 by bh, Wed Oct 8 17:35:52 2003 UTC revision 1861 by jan, Fri Oct 24 16:03:03 2003 UTC
# Line 24  from Thuban.Model.resource import get_us Line 24  from Thuban.Model.resource import get_us
24                                    read_proj_file, write_proj_file                                    read_proj_file, write_proj_file
25  from Thuban.UI.dialogs import NonModalNonParentDialog  from Thuban.UI.dialogs import NonModalNonParentDialog
26    
27    from common import ThubanBeginBusyCursor, ThubanEndBusyCursor
28    from sizers import NotebookLikeSizer
29    from projlist import PROJ_SELECTION_CHANGED, ProjectionList
30    from common import ThubanBeginBusyCursor, ThubanEndBusyCursor
31    
32    
33    
 ID_PROJ_ADVANCED  = 4001  
34  ID_PROJ_PROJCHOICE = 4002  ID_PROJ_PROJCHOICE = 4002
35  ID_PROJ_ADDTOLIST    = 4003  ID_PROJ_ADDTOLIST    = 4003
36  ID_PROJ_NEW       = 4004  ID_PROJ_NEW       = 4004
# Line 49  class ProjFrame(NonModalNonParentDialog) Line 54  class ProjFrame(NonModalNonParentDialog)
54                          SetProjection(projection)                          SetProjection(projection)
55                          GetProjection()                          GetProjection()
56          """          """
57                    NonModalNonParentDialog.__init__(self, parent, name, title)
58    
59            self.projection_panel_defs = [
60                ("tmerc", _("Transverse Mercator"), TMPanel),
61                ("utm", _("Universal Transverse Mercator"), UTMPanel),
62                ("lcc", _("Lambert Conic Conformal"), LCCPanel),
63                ("latlong", _("Geographic"), GeoPanel),
64                ("longlat", _("Geographic"), GeoPanel)]#longlat is an alias of proj
65          self.receiver = receiver          self.receiver = receiver
66          self.haveTried = False          self.haveTried = False
67          self.curProjPanel = None          self.curProjPanel = None
68            self.__usrProjFile = None
69            self.__sysProjFile = None
70    
71          self.projPanels = []          self.build_dialog()
72          self.projPanels.append(          self.Layout()
             ("tmerc", _("Transverse Mercator"), TMPanel))  
         self.projPanels.append(  
             ("utm", _("Universal Transverse Mercator"), UTMPanel))  
         self.projPanels.append(  
             ("lcc", _("Lambert Conic Conformal"), LCCPanel))  
         self.projPanels.append(  
             ("latlong", _("Geographic"), GeoPanel))  
73    
74          NonModalNonParentDialog.__init__(self, parent, name, title)          self.originalProjection = self.receiver.GetProjection()
         # originally generate by wxGlade  
         self.panel_1 = wxPanel(self, -1)  
         self.panel_edit = wxPanel(self, -1)  
         self.label_5 = wxStaticText(self.panel_1, -1,  
                         _("Available Projections:"))  
75    
76          # Projection List specific actions (Import/Export/Remove)          self.projection_list.SelectProjection(self.originalProjection)
77          self.button_import = wxButton(self.panel_1, ID_PROJ_IMPORT,          self.projection_list.SetFocus()
                                       _("Import..."))  
         self.button_export = wxButton(self.panel_1, ID_PROJ_EXPORT,  
                                       _("Export..."))  
         self.button_remove = wxButton(self.panel_1, ID_PROJ_REMOVE,  
                                       _("Remove"))  
   
         # The Projection List  
         self.availprojs = wxListBox(self.panel_1, ID_PROJ_AVAIL,  
                                     style=wxLB_EXTENDED|wxLB_SORT)  
         self.projfilepath = wxStaticText(self.panel_1, -1, "")  
78    
79          # Projection Specific Entries (Name/Projection)      def build_dialog(self):
80          self.label_2 = wxStaticText(self.panel_edit, -1, _("Name:"))          """Build the dialog's widgets and set the event handlers"""
81          self.projname = wxTextCtrl(self.panel_edit, ID_PROJ_PROJNAME, "")          self.topBox = top_box = wxBoxSizer(wxVERTICAL)
         self.label_3 = wxStaticText(self.panel_edit, -1, _("Projection:"))  
         self.projchoice = wxChoice(self.panel_edit, ID_PROJ_PROJCHOICE)  
82    
83          # Projection Specific actions (New/Save/Add)          main_box = wxBoxSizer(wxHORIZONTAL)
84          self.button_new = wxButton(self.panel_edit, ID_PROJ_NEW, _("New"))          top_box.Add(main_box, 1, wxALL|wxEXPAND)
         self.button_add = wxButton(self.panel_edit, ID_PROJ_ADDTOLIST,  
                                       _("Add to List"))  
         self.button_save = wxButton(self.panel_edit, ID_PROJ_SAVE,_("Update"))  
85    
86          # Main Action buttons (Try/Revert/OK/Close)          #
87          self.button_try = wxButton(self, wxID_APPLY, _("Try"))          #    The projection list and associated controls
88          self.button_revert = wxButton(self, ID_PROJ_REVERT,          #
89                                        _("Revert"))          vbox = wxBoxSizer(wxVERTICAL)
90          self.button_ok = wxButton(self, wxID_OK, _("OK"))          main_box.Add(vbox, 4, wxALL|wxEXPAND)
         self.button_ok.SetDefault()  
         self.button_close = wxButton(self, wxID_CANCEL,  
                                      _("Close"))  
91    
92          self.__set_properties()          #label = wxStaticText(self, -1, _("Available Projections:"))
93          self.__do_layout()          #vbox.Add(label, 0, wxLEFT|wxRIGHT|wxTOP, 4)
94    
95          # wxGlade          hbox = wxBoxSizer(wxHORIZONTAL)
96            vbox.Add(hbox, 1, wxALL|wxEXPAND)
97            self.projection_list = ProjectionList(self, self.load_system_proj(),
98                                                  self.load_user_proj(),
99                                                  self.receiver.GetProjection())
100            hbox.Add(self.projection_list, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)
101            self.projection_list.Subscribe(PROJ_SELECTION_CHANGED,
102                                           self.proj_selection_changed)
103    
104            # Projection List specific actions (Import/Export/Remove)
105            buttons = wxBoxSizer(wxVERTICAL)
106            hbox.Add(buttons, 0, wxALL)
107            self.button_import = wxButton(self, ID_PROJ_IMPORT, _("Import..."))
108            EVT_BUTTON(self, ID_PROJ_IMPORT, self._OnImport)
109            buttons.Add(self.button_import, 1, wxALL|wxEXPAND, 4)
110            self.button_export = wxButton(self, ID_PROJ_EXPORT, _("Export..."))
111            EVT_BUTTON(self, ID_PROJ_EXPORT, self._OnExport)
112            buttons.Add(self.button_export, 1, wxALL|wxEXPAND, 4)
113            buttons.Add(20, 20, 0, wxEXPAND, 0)
114            self.button_remove = wxButton(self, ID_PROJ_REMOVE, _("Remove"))
115            EVT_BUTTON(self, ID_PROJ_REMOVE, self._OnRemove)
116            buttons.Add(self.button_remove, 1, wxALL|wxEXPAND, 4)
117    
118            # The file path
119            self.projfilepath = wxStaticText(self, -1, "")
120            vbox.Add(self.projfilepath, 0, wxALL|wxEXPAND)
121    
122            #
123            #   The projection editor part
124            #
125            self.edit_box = wxStaticBox(self, -1, _("Edit"))
126            sizer_edit = wxStaticBoxSizer(self.edit_box, wxHORIZONTAL)
127            main_box.Add(sizer_edit, 5, wxALL|wxEXPAND)
128    
129            # Projection Specific Entries (Name/Projection)
130            self.sizer_projctrls = wxBoxSizer(wxVERTICAL)
131            sizer_edit.Add(self.sizer_projctrls, 1, wxALL|wxEXPAND)
132    
133            hbox = wxBoxSizer(wxHORIZONTAL)
134            self.sizer_projctrls.Add(hbox, 0, wxALL|wxEXPAND)
135            label = wxStaticText(self, -1, _("Name:"))
136            hbox.Add(label, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)
137            self.projname = wxTextCtrl(self, ID_PROJ_PROJNAME, "")
138            EVT_TEXT(self, ID_PROJ_PROJNAME, self._OnProjName)
139            hbox.Add(self.projname, 1, wxALL|wxEXPAND, 4)
140    
141            hbox = wxBoxSizer(wxHORIZONTAL)
142            self.sizer_projctrls.Add(hbox, 0, wxALL|wxEXPAND)
143            label = wxStaticText(self, -1, _("Projection:"))
144            hbox.Add(label, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)
145            self.projchoice = wxChoice(self, ID_PROJ_PROJCHOICE)
146            self.projchoice.SetSelection(0)
147            EVT_CHOICE(self, ID_PROJ_PROJCHOICE, self._OnProjChoice)
148            hbox.Add(self.projchoice, 1, wxALL|wxEXPAND, 4)
149          # Fill the projection choice list.          # Fill the projection choice list.
150          for proj, name, clazz in self.projPanels:          self.nbsizer = NotebookLikeSizer()
151              self.projchoice.Append(name, [clazz, None])          self.sizer_projctrls.Add(self.nbsizer, 1,
152                                     wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)
153            self.projection_panels = []
154            self.projchoice.Append(_("<Unknown>"), "")
155            for proj_type, name, cls in self.projection_panel_defs:
156                self.projchoice.Append(name, proj_type)
157                panel = cls(self, self.receiver)
158                panel.Hide()
159                panel.projection_index = len(self.projection_panels)
160                panel.projection_type = proj_type
161                self.projection_panels.append(panel)
162                self.nbsizer.Add(panel)
163            self.unknown_projection_panel = UnknownProjPanel(self, self.receiver)
164            self.unknown_projection_panel.Hide()
165            self.nbsizer.Add(self.unknown_projection_panel)
166    
167          self.originalProjection = self.receiver.GetProjection()          # Projection Specific actions (New/Save/Add)
168            buttons = wxBoxSizer(wxVERTICAL)
169            sizer_edit.Add(buttons, 0, wxALL)
170            self.button_new = wxButton(self, ID_PROJ_NEW, _("New"))
171            EVT_BUTTON(self, ID_PROJ_NEW, self._OnNew)
172            buttons.Add(self.button_new, 0, wxEXPAND|wxALL, 4)
173            self.button_add = wxButton(self, ID_PROJ_ADDTOLIST, _("Add to List"))
174            EVT_BUTTON(self, ID_PROJ_ADDTOLIST, self._OnAddToList)
175            buttons.Add(self.button_add, 0, wxEXPAND|wxALL, 4)
176            buttons.Add(20, 20, 0, wxEXPAND, 0)
177            self.button_save = wxButton(self, ID_PROJ_SAVE,_("Update"))
178            EVT_BUTTON(self, ID_PROJ_SAVE, self._OnSave)
179            buttons.Add(self.button_save, 0, wxEXPAND|wxALL|wxALIGN_BOTTOM, 4)
180    
181          self.__DoOnProjAvail()          #
182          self.button_ok.SetFocus()          # Main Action buttons (Try/Revert/OK/Close)
183          self.availprojs.SetFocus()          #
184                    buttons = wxBoxSizer(wxHORIZONTAL)
185            top_box.Add(buttons, 0, wxALL|wxALIGN_RIGHT, 10)
186            self.button_try = wxButton(self, wxID_APPLY, _("Try"))
187          EVT_BUTTON(self, wxID_APPLY, self.OnApply)          EVT_BUTTON(self, wxID_APPLY, self.OnApply)
188            buttons.Add(self.button_try, 0, wxRIGHT, 10)
189            self.button_revert = wxButton(self, ID_PROJ_REVERT, _("Revert"))
190          EVT_BUTTON(self, ID_PROJ_REVERT, self._OnRevert)          EVT_BUTTON(self, ID_PROJ_REVERT, self._OnRevert)
191            buttons.Add(self.button_revert, 0, wxRIGHT, 10)
192            self.button_ok = wxButton(self, wxID_OK, _("OK"))
193          EVT_BUTTON(self, wxID_OK, self.OnOK)          EVT_BUTTON(self, wxID_OK, self.OnOK)
194            self.button_ok.SetDefault()
195            buttons.Add(self.button_ok, 0, wxRIGHT, 10)
196            self.button_close = wxButton(self, wxID_CANCEL, _("Close"))
197          EVT_BUTTON(self, wxID_CANCEL, self.OnCancel)          EVT_BUTTON(self, wxID_CANCEL, self.OnCancel)
198          EVT_CHOICE(self, ID_PROJ_PROJCHOICE, self._OnProjChoice)          buttons.Add(self.button_close, 0, wxRIGHT, 10)
         EVT_LISTBOX(self, ID_PROJ_AVAIL, self._OnProjAvail)  
         EVT_BUTTON(self, ID_PROJ_IMPORT, self._OnImport)  
         EVT_BUTTON(self, ID_PROJ_EXPORT, self._OnExport)  
         EVT_BUTTON(self, ID_PROJ_REMOVE, self._OnRemove)  
199    
         EVT_BUTTON(self, ID_PROJ_NEW, self._OnNew)  
         EVT_BUTTON(self, ID_PROJ_SAVE, self._OnSave)  
         EVT_BUTTON(self, ID_PROJ_ADDTOLIST, self._OnAddToList)  
200    
201          EVT_TEXT(self, ID_PROJ_PROJNAME, self._OnProjName)          #
202            # Automatic Layout
203            #
204            self.SetAutoLayout(1)
205            self.SetSizer(top_box)
206            top_box.Fit(self)
207            top_box.SetSizeHints(self)
208    
209        def OnClose(self, event):
210            self.projection_list.Unsubscribe(PROJ_SELECTION_CHANGED,
211                                             self.proj_selection_changed)
212            # Destroy the projection list explicitly so that it properly
213            # unsubscribes everything. It would be cleaner if the projection
214            # could do this by itself but wx doesn't always send destroy
215            # events for non-top-level widgets
216            self.projection_list.Destroy()
217            NonModalNonParentDialog.OnClose(self, event)
218    
219      def OnApply(self, event):      def OnApply(self, event):
220          self.__SetProjection()          self.__SetProjection()
# Line 157  class ProjFrame(NonModalNonParentDialog) Line 237  class ProjFrame(NonModalNonParentDialog)
237    
238      def _OnNew(self, event):      def _OnNew(self, event):
239    
240          # clear all selections          self.projection_list.ClearSelection()
         sel = self.availprojs.GetSelections()  
         for index in sel:  
             self.availprojs.SetSelection(index, False)  
   
241          self.projname.Clear()          self.projname.Clear()
242    
243          # supply a projection panel if there wasn't one          # supply a projection panel if there wasn't one
# Line 169  class ProjFrame(NonModalNonParentDialog) Line 245  class ProjFrame(NonModalNonParentDialog)
245              self.projchoice.SetSelection(0)              self.projchoice.SetSelection(0)
246              self.__DoOnProjChoice()              self.__DoOnProjChoice()
247    
248          self.curProjPanel.Clear()          if self.curProjPanel is not None:
249                self.curProjPanel.Clear()
250    
251      def _OnSave(self, event):      def _OnSave(self, event):
252    
253          sel = self.availprojs.GetSelections()          sel = self.projection_list.selected_projections()
254          assert len(sel) == 1,  "button shouldn't be enabled"          assert len(sel) == 1,  "button shouldn't be enabled"
255    
256          proj, projfile = self.availprojs.GetClientData(sel[0])          proj, projfile = sel[0]
257    
258          assert proj is not None and projfile is not None          assert proj is not None and projfile is not None
259    
260          newproj = self.__GetProjection()          newproj = self.__GetProjection()
261    
262          if newproj is not None:          if newproj is not None:
263                # FIXME: we should only allow this for the user proj file.
264              projfile.Replace(proj, newproj)              projfile.Replace(proj, newproj)
265              try:              self.write_proj_file(projfile)
266                  write_proj_file(projfile)              self.projection_list.SelectProjection(newproj)
             except IOError, (errno, errstr):  
                 self.__ShowError(projfile.GetFilename(), errstr)  
             self.availprojs.SetClientData(sel[0], [newproj, projfile])  
   
             self.__FillAvailList( selectProj = newproj.GetName())  
267    
268      def _OnAddToList(self, event):      def _OnAddToList(self, event):
269    
270          proj = self.__GetProjection()          proj = self.__GetProjection()
271          if proj is not None:          if proj is not None:
272              self.__usrProjFile.Add(proj)              self.__usrProjFile.Add(proj)
273              try:              self.write_proj_file(self.__usrProjFile)
274                  write_proj_file(self.__usrProjFile)              self.projection_list.SelectProjection(proj)
             except IOError, (errno, errstr):  
                 self.__ShowError(self.__userProjFile.GetFilename(), errstr)  
   
             self.__FillAvailList( selectProj = proj.GetName())  
   
     def _OnProjAvail(self, event):  
         self.__DoOnProjAvail()  
275    
276      def show_warnings(self, title, filename, warnings):      def show_warnings(self, title, filename, warnings):
277          """Show the warnings (a list of strings) in a dialog          """Show the warnings (a list of strings) in a dialog
# Line 218  class ProjFrame(NonModalNonParentDialog) Line 284  class ProjFrame(NonModalNonParentDialog)
284              self.parent.RunMessageBox(title, text)              self.parent.RunMessageBox(title, text)
285    
286      def _OnImport(self, event):      def _OnImport(self, event):
287            """Handler for the 'Import' button
288    
289            Ask the user for a filename, read the projections from that file
290            add them to the user ProjFile object and write the user file
291            back to disk.
292            """
293          dlg = wxFileDialog(self, _("Import"), style = wxOPEN)          dlg = wxFileDialog(self, _("Import"), style = wxOPEN)
294    
295          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
296              path = dlg.GetPath()              path = dlg.GetPath()
297    
298                ThubanBeginBusyCursor()
299              try:              try:
300                  projFile, warnings = read_proj_file(path)                  try:
301                  self.show_warnings(_("Warnings"), path, warnings)                      projFile, warnings = read_proj_file(path)
302                  for proj in projFile.GetProjections():                  except IOError, (errno, errstr):
303                      self.__usrProjFile.Add(proj)                      self.__ShowError(dlg.GetPath(), errstr)
304                  write_proj_file(self.__usrProjFile)                  else:
305              except IOError, (errno, errstr):                      self.show_warnings(_("Warnings"), path, warnings)
306                  self.__ShowError(dlg.GetPath(), errstr)                      for proj in projFile.GetProjections():
307                            self.__usrProjFile.Add(proj)
308              self.__FillAvailList()                      self.write_proj_file(self.__usrProjFile)
309                finally:
310                    ThubanEndBusyCursor()
311          dlg.Destroy()          dlg.Destroy()
312    
313      def _OnExport(self, event):      def _OnExport(self, event):
314            """Handler for the 'Export' button.
315    
316          sel = self.availprojs.GetSelections()          Ask the user for a filename and write the selected projections
317            to that file.
318            """
319            sel = self.projection_list.selected_projections()
320          assert len(sel) != 0, "button should be disabled"          assert len(sel) != 0, "button should be disabled"
321    
322          dlg = wxFileDialog(self, _("Export"),          dlg = wxFileDialog(self, _("Export"), style=wxSAVE|wxOVERWRITE_PROMPT)
                         style = wxSAVE|wxOVERWRITE_PROMPT)  
323    
324          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
325              path = dlg.GetPath()              proj_file = ProjFile(dlg.GetPath())
326                for proj, pf in sel:
             projFile = ProjFile(path)  
   
             for i in sel:  
                 proj = self.availprojs.GetClientData(i)[CLIENT_PROJ]  
327                  if proj is not None:                  if proj is not None:
328                      projFile.Add(proj)                      proj_file.Add(proj)
329                self.write_proj_file(proj_file)
             try:  
                 write_proj_file(projFile)  
             except IOError, (errno, errstr):  
                 self.__ShowError(dlg.GetPath(), errstr)  
330    
331          dlg.Destroy()          dlg.Destroy()
332    
333      def _OnRemove(self, event):      def _OnRemove(self, event):
334            """Handler for the 'Remove' button
335    
336          sel = self.availprojs.GetSelections()          Remove any selected projection that came from the user's
337            ProjFile. If the user ProjFile was modified write it back to
338            disk.
339            """
340            sel = self.projection_list.selected_projections()
341          assert len(sel) != 0, "button should be disabled!"          assert len(sel) != 0, "button should be disabled!"
342    
343          #          modified = False
344          # remove the items backwards so the indices don't change          for proj, pf in sel:
345          #              if proj is not None and pf is self.__usrProjFile:
346          sel = list(sel)                  pf.Remove(proj)
347          sel.sort()                  modified = True
         sel.reverse()  
   
         newselection = -1  
         if len(sel) == 1:  
             newselection = sel[0] - 1  
             if newselection < 0:  
                 newselection = 0  
   
         for i in sel:  
             proj, projfile = self.availprojs.GetClientData(i)  
   
             #  
             # this could be the case if they selected <None> or  
             # the currently used projection  
             #  
             if proj is not None and projfile is not None:  
                 projfile.Remove(proj)  
   
         try:  
             write_proj_file(projfile)  
         except IOError, (errno, errstr):  
             self.__ShowError(projfile.GetFilename(), errstr)  
   
         self.__FillAvailList()  
348    
349          #          if modified:
350          # this *could* produce incorrect results if the .proj files              self.write_proj_file(self.__usrProjFile)
         # change between the last list update and this selection  
         # because the list has been repopulated.  
         #  
         if newselection != -1 and self.availprojs.GetCount() > 0:  
             self.availprojs.SetSelection(newselection)  
   
         self.__VerifyButtons()  
351    
352      def _OnProjName(self, event):      def _OnProjName(self, event):
353          self.__VerifyButtons()          self.__VerifyButtons()
354    
355      def __ShowError(self, filename, errstr):      def __ShowError(self, filename, errstr):
356          wxMessageDialog(self,          wxMessageDialog(self,
357              _("The following error occured:\n") +              _("The following error occured:\n") +
358              filename + "\n" + errstr,              filename + "\n" + errstr,
359              _("Error"), wxOK | wxICON_ERROR).ShowModal()              _("Error"), wxOK | wxICON_ERROR).ShowModal()
360    
361      def __VerifyButtons(self):      def __VerifyButtons(self):
362          """Enable or disable the appropriate buttons based on the          """Update button sensitivity"""
         current state of the dialog.  
         """  
363    
364          sel = self.availprojs.GetSelections()          num_sel = self.projection_list.GetSelectedItemCount()
365    
366          self.button_import.Enable(True)          self.button_import.Enable(True)
367          self.button_export.Enable(True)          self.button_export.Enable(True)
368          self.button_save.Enable(True)          self.button_save.Enable(True)
369          self.button_remove.Enable(True)          self.button_remove.Enable(True)
370    
371          self.panel_edit.Enable(True)          self.edit_box.Enable(True)
372    
373          for ctrl in [self.button_import,          for ctrl in [self.button_import,
374                       self.button_export,                       self.button_export,
# Line 337  class ProjFrame(NonModalNonParentDialog) Line 377  class ProjFrame(NonModalNonParentDialog)
377                       self.button_add,                       self.button_add,
378                       self.projchoice,                       self.projchoice,
379                       self.projname,                       self.projname,
380                       self.panel_edit]:                       self.edit_box]:
381              ctrl.Enable(True)              ctrl.Enable(True)
382    
383          if self.curProjPanel is not None:          if self.curProjPanel is not None:
384              self.curProjPanel.Enable(True)              self.curProjPanel.Enable(True)
385    
386          if len(sel) == 0:          if num_sel == 0:
387              self.button_import.Enable(True)              self.button_import.Enable(True)
388              self.button_export.Enable(False)              self.button_export.Enable(False)
389              self.button_remove.Enable(False)              self.button_remove.Enable(False)
390              self.button_save.Enable(False)              self.button_save.Enable(False)
391    
392          elif len(sel) == 1:          elif num_sel == 1:
393    
394              proj, projFile = self.availprojs.GetClientData(sel[0])              selection = self.projection_list.selected_projections()
395                proj, projFile = selection[0]
396    
397              self.button_save.Enable(len(self.projname.GetValue()) > 0)              self.button_save.Enable(len(self.projname.GetValue()) > 0)
398              self.button_add.Enable(len(self.projname.GetValue()) > 0)              self.button_add.Enable(len(self.projname.GetValue()) > 0)
# Line 376  class ProjFrame(NonModalNonParentDialog) Line 417  class ProjFrame(NonModalNonParentDialog)
417                  self.button_save.Enable(False)                  self.button_save.Enable(False)
418    
419          else:          else:
420              self.panel_edit.Enable(False)              self.edit_box.Enable(False)
   
     def __DoOnProjAvail(self):  
421    
422          sel = self.availprojs.GetSelections()      def proj_selection_changed(self, projs):
423          if len(sel) == 1:          """Subscribed to the projection_list's PROJ_SELECTION_CHANGED message
   
             proj = self.availprojs.GetClientData(sel[0])[CLIENT_PROJ]  
             projfile = self.availprojs.GetClientData(sel[0])[CLIENT_PROJFILE]  
424    
425            Update the dialog to reflect the new selection.
426            """
427            if len(projs) == 0:
428                self.projfilepath.SetLabel(_("No Projections selected"))
429            elif len(projs) == 1:
430                proj, projfile = projs[0]
431              if proj is None:              if proj is None:
432                  # user selected <None>                  # user selected <None>
433                  self.projname.Clear()                  self.projname.Clear()
434                  self.projfilepath.SetLabel(_("Projection File: "))                  self.projfilepath.SetLabel("")
435              else:              else:
               
436                  if projfile is not None:                  if projfile is not None:
437                      self.projfilepath.SetLabel(_("Projection File: ") +                      filename = os.path.basename(projfile.GetFilename())
438                          os.path.basename(projfile.GetFilename()))                      self.projfilepath.SetLabel(_("Source of Projection: %s")
439                                                   % filename)
440                  else:                  else:
441                      # only None if the currently used projection is selected                      # only None if the currently used projection is selected
442                      self.projfilepath.SetLabel(_("Projection File: "))                      self.projfilepath.SetLabel("")
443    
444                  self.projname.SetValue(proj.GetName())                  self.projname.SetValue(proj.Label())
445    
446                  myProjType = proj.GetParameter("proj")                  myProjType = proj.GetParameter("proj")
447                  i = 0                  i = 0
448                  for projType, name, clazz in self.projPanels:                  for projType, name, cls in self.projection_panel_defs:
449                      if myProjType == projType:                      if myProjType == projType:
450                          self.projchoice.Enable(True)                          self.projchoice.Enable(True)
451                          self.projchoice.SetSelection(i)                          self.projchoice.SetSelection(i + 1)
452                          self.__DoOnProjChoice()                          self.__DoOnProjChoice()
453    
454                          #                          #
# Line 419  class ProjFrame(NonModalNonParentDialog) Line 461  class ProjFrame(NonModalNonParentDialog)
461                          break                          break
462                      i += 1                      i += 1
463                  else:                  else:
464                        self.projchoice.Select(0)
465                      self.projchoice.Disable()                      self.projchoice.Disable()
466                      self._show_proj_panel(UnknownProjPanel(self.panel_edit,                      self._show_proj_panel(UnknownProjPanel)
467                                                             self.receiver))                      assert self.curProjPanel is not None
468                        self.curProjPanel.SetProjection(proj)
469            else:
470                self.projfilepath.SetLabel(_("Multiple Projections selected"))
471    
472          self.__VerifyButtons()          self.__VerifyButtons()
473    
# Line 438  class ProjFrame(NonModalNonParentDialog) Line 484  class ProjFrame(NonModalNonParentDialog)
484          At the end of this method self.curProjPanel will not be None          At the end of this method self.curProjPanel will not be None
485          if there was a item selected.          if there was a item selected.
486          """          """
   
487          choice = self.projchoice          choice = self.projchoice
488    
489          sel = choice.GetSelection()          sel = choice.GetSelection()
490          if sel != -1:          if sel != -1:
491              clazz, obj = choice.GetClientData(sel)              proj_type = choice.GetClientData(sel)
492              if obj is None:              for t, name, cls in self.projection_panel_defs:
493                  obj = clazz(self.panel_edit, self.receiver)                  if t == proj_type:
494                  choice.SetClientData(sel, [clazz, obj])                      self._show_proj_panel(cls)
495              self._show_proj_panel(obj)                      break
496            # FIXME: what to do if sel == -1?
497    
498      def _show_proj_panel(self, panel):      def _show_proj_panel(self, panel_class):
499          """Show the panel as the projection panel"""          """Show the panel as the projection panel"""
500          if self.curProjPanel is not None:          if panel_class is UnknownProjPanel:
501              self.curProjPanel.Hide()              self.edit_box.Disable()
502              self.sizer_projctrls.Remove(self.curProjPanel)              self.nbsizer.Activate(self.unknown_projection_panel)
503                self.curProjPanel = self.unknown_projection_panel
504          self.curProjPanel = panel          else:
505          self.curProjPanel.Show()              self.edit_box.Enable(True)
506                self.unknown_projection_panel.Hide()
507          self.sizer_projctrls.Add(self.curProjPanel, 1,              for panel in self.projection_panels:
508              wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)                  if panel.__class__ is panel_class:
509          self.sizer_projctrls.Layout()                      self.nbsizer.Activate(panel)
510          self.Layout()                      self.curProjPanel = panel
         self.topBox.SetSizeHints(self)  
511    
512      def __SetProjection(self):      def __SetProjection(self):
513          """Set the receiver's projection."""          """Set the receiver's projection."""
# Line 480  class ProjFrame(NonModalNonParentDialog) Line 525  class ProjFrame(NonModalNonParentDialog)
525          Could be None.          Could be None.
526          """          """
527    
528          sel = self.availprojs.GetSelections()          assert self.projection_list.GetSelectedItemCount() < 2, \
529          assert len(sel) < 2, "button should be disabled"                 "button should be disabled"
   
530    
531            sel = self.projection_list.selected_projections()
532          if len(sel) == 1:          if len(sel) == 1:
533              proj = self.availprojs.GetClientData(sel[0])[CLIENT_PROJ]              if sel[0][0] is None:
             if proj is None:  
534                  # <None> is selected                  # <None> is selected
535                  return None                  return None
536    
537          #          # self.curProjPanel should always contain the most relevant data
538          # self.curProjPanel should always contain the most          # for a projection
         # relevant data for a projection  
         #  
539          if self.curProjPanel is not None:          if self.curProjPanel is not None:
540              return Projection(self.curProjPanel.GetParameters(),              return Projection(self.curProjPanel.GetParameters(),
541                                self.projname.GetValue())                                self.projname.GetValue())
542    
543          return None          return None
544    
545      def __FillAvailList(self, selectCurrent = False, selectProj = None):      def load_user_proj(self):
546          """Populate the list of available projections.          ThubanBeginBusyCursor()
547                    try:
548          selectCurrent -- if True, select the projection used by              if self.__usrProjFile is None:
549                           the receiver, otherwise select nothing.                  projfile, warnings = get_user_proj_file()
550          selectProj    -- if set, select the projection found under the                  self.show_warnings(_("Warnings"), projfile.GetFilename(),
551                           specified name. This overwrites any other                                     warnings)
552                           selection estimate.                  self.__usrProjFile = projfile
553          """              return self.__usrProjFile
554            finally:
555          self.availprojs.Clear()              ThubanEndBusyCursor()
   
         #  
         # the list can never be empty. there will always be  
         # at least this one item  
         #  
         self.availprojs.Append("<None>", (None, None))  
   
         projfile, warnings = get_system_proj_file()  
         self.show_warnings(_("Warnings"), projfile.GetFilename(), warnings)  
         for proj in projfile.GetProjections():  
             self.availprojs.Append(proj.GetName(), [proj, projfile])  
         self.__sysProjFile = projfile  
   
         projfile, warnings = get_user_proj_file()  
         self.show_warnings(_("Warnings"), projfile.GetFilename(), warnings)  
         for proj in projfile.GetProjections():  
             self.availprojs.Append(proj.GetName(), [proj, projfile])  
         self.__usrProjFile = projfile  
   
         #  
         # We add the current projection to the list at last.  
         # Since the list is resorted immediately a following FindString()  
         # determines the index correctly.  
         #  
         proj = self.receiver.GetProjection()  
         if proj is not None:  
             proj_item = _("%s (current)") % proj.GetName()  
             self.availprojs.Append(proj_item, [proj, None])  
             if selectCurrent:  
                 self.availprojs.SetSelection(  
                         self.availprojs.FindString(proj_item)  
                     )  
         else:  
             if selectCurrent:  
                 self.availprojs.SetSelection(  
                         self.availprojs.FindString("<None>")  
                     )  
         if selectProj:  
             self.availprojs.SetSelection(  
                         self.availprojs.FindString(selectProj)  
                     )  
   
                   
   
     def __set_properties(self):  
   
         #self.availprojs.SetSelection(0)  
         self.projchoice.SetSelection(0)  
   
         self.__FillAvailList(selectCurrent = True)  
   
     def __do_layout(self):  
         # originally generated by wxGlade  
   
         self.topBox = wxBoxSizer(wxVERTICAL)  
         self.sizer_panel = wxBoxSizer(wxVERTICAL)  
         sizer_6 = wxBoxSizer(wxHORIZONTAL)  
         self.sizer_mainbttns = wxBoxSizer(wxHORIZONTAL)  
         self.sizer_mainctrls = wxBoxSizer(wxHORIZONTAL)  
         self.sizer_edit = wxStaticBoxSizer(wxStaticBox(self.panel_edit, -1, _("Edit")), wxHORIZONTAL)  
         sizer_11 = wxBoxSizer(wxVERTICAL)  
         self.sizer_projctrls = wxBoxSizer(wxVERTICAL)  
         sizer_14 = wxBoxSizer(wxHORIZONTAL)  
         sizer_13 = wxBoxSizer(wxHORIZONTAL)  
         sizer_15 = wxBoxSizer(wxVERTICAL)  
         sizer_15.Add(self.button_import, 0, wxALL, 4)  
         sizer_15.Add(self.button_export, 0, wxALL, 4)  
         sizer_15.Add(20, 20, 0, wxEXPAND, 0)  
         sizer_15.Add(self.button_remove, 0, wxALL|wxALIGN_BOTTOM, 4)  
   
         # list controls  
         grid_sizer_1 = wxFlexGridSizer(3, 2, 0, 0)  
         grid_sizer_1.Add(self.label_5, 0, wxLEFT|wxRIGHT|wxTOP, 4)  
         grid_sizer_1.Add(20, 20, 0, wxEXPAND, 0)  
         grid_sizer_1.Add(self.availprojs, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)  
         grid_sizer_1.Add(sizer_15, 0, wxALL|wxEXPAND, 4)  
         grid_sizer_1.Add(self.projfilepath, 0, wxEXPAND|wxALL|wxADJUST_MINSIZE, 4)  
         grid_sizer_1.AddGrowableRow(1)  
         grid_sizer_1.AddGrowableCol(0)  
   
         # edit controls  
         sizer_13.Add(self.label_2, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)  
         sizer_13.Add(self.projname, 1, wxALL, 4)  
         self.sizer_projctrls.Add(sizer_13, 0, wxEXPAND, 0)  
         sizer_14.Add(self.label_3, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)  
         sizer_14.Add(self.projchoice, 1, wxALL|wxALIGN_CENTER_VERTICAL, 4)  
         self.sizer_projctrls.Add(sizer_14, 0, wxEXPAND, 0)  
         self.sizer_edit.Add(self.sizer_projctrls, 1, wxEXPAND, 0)  
         sizer_11.Add(self.button_new, 0, wxEXPAND|wxALL, 4)  
         sizer_11.Add(self.button_add, 0, wxEXPAND|wxALL, 4)  
         sizer_11.Add(20, 20, 0, wxEXPAND, 0)  
         sizer_11.Add(self.button_save, 0, wxEXPAND|wxALL|wxALIGN_BOTTOM, 4)  
         self.sizer_edit.Add(sizer_11, 0, wxALL|wxEXPAND, 4)  
   
         sizer_6.Add(self.button_try, 0, wxRIGHT| wxEXPAND, 10)  
         sizer_6.Add(self.button_revert, 0, wxRIGHT| wxEXPAND, 10)  
         sizer_6.Add(self.button_ok, 0, wxRIGHT| wxEXPAND, 10)  
         sizer_6.Add(self.button_close, 0, wxRIGHT| wxEXPAND, 10)  
   
         self.panel_1.SetAutoLayout(1)  
         self.panel_1.SetSizer(grid_sizer_1)  
         grid_sizer_1.Fit(self.panel_1)  
         grid_sizer_1.SetSizeHints(self.panel_1)  
   
         self.panel_edit.SetAutoLayout(1)  
         self.panel_edit.SetSizer(self.sizer_edit)  
         self.sizer_edit.Fit(self.panel_edit)  
         self.sizer_edit.SetSizeHints(self.panel_edit)  
   
         self.sizer_mainctrls.Add(self.panel_1, 0,  
             wxALL|wxEXPAND|wxADJUST_MINSIZE, 0)  
         self.sizer_mainctrls.Add(self.panel_edit, 1,  
             wxALL|wxEXPAND|wxADJUST_MINSIZE, 0)  
556    
557          self.sizer_mainbttns.Add(sizer_6, 0,      def load_system_proj(self):
558              wxALL|wxEXPAND|wxADJUST_MINSIZE, 10)          ThubanBeginBusyCursor()
559            try:
560                if self.__sysProjFile is None:
561                    projfile, warnings = get_system_proj_file()
562                    self.show_warnings(_("Warnings"), projfile.GetFilename(),
563                                       warnings)
564                    self.__sysProjFile = projfile
565                return self.__sysProjFile
566            finally:
567                ThubanEndBusyCursor()
568    
569          self.topBox.Add(self.sizer_mainctrls, 1, wxALL|wxEXPAND, 4)      def write_proj_file(self, proj_file):
570          self.topBox.Add(self.sizer_mainbttns, 0, wxALIGN_RIGHT|wxBOTTOM, 0)          """Write the ProjFile object proj_file back to its file
571    
572          self.SetAutoLayout(1)          Show a busy cursor while writing and if an error occurs show a
573          self.SetSizer(self.topBox)          dialog with the error message.
574          self.topBox.Fit(self)          """
575          self.topBox.SetSizeHints(self)          try:
576          self.Layout()              ThubanBeginBusyCursor()
577                try:
578                    write_proj_file(proj_file)
579                finally:
580                    ThubanEndBusyCursor()
581            except IOError, (errno, errstr):
582                self.__ShowError(proj_file.GetFilename(), errstr)
583    
 # end of class ProjFrame  
584    
585    
586  class ProjPanel(wxPanel):  class ProjPanel(wxPanel):
# Line 647  class ProjPanel(wxPanel): Line 590  class ProjPanel(wxPanel):
590          wxPanel.__init__(self, parent, -1)          wxPanel.__init__(self, parent, -1)
591    
592          self.__ellps = wxChoice(self, -1)          self.__ellps = wxChoice(self, -1)
593          self.ellpsData = [("airy"  , _("Airy")),          self.ellpsData = [("", _("<Unknown>")),
594                              ("airy"  , _("Airy")),
595                            ("bessel", _("Bessel 1841")),                            ("bessel", _("Bessel 1841")),
596                            ("clrk66", _("Clarke 1866")),                            ("clrk66", _("Clarke 1866")),
597                            ("clrk80", _("Clarke 1880")),                            ("clrk80", _("Clarke 1880")),
598                            ("GRS80" , _("GRS 1980 (IUGG, 1980)")),                            ("GRS80" , _("GRS 1980 (IUGG, 1980)")),
599                            ("intl"  , _("International 1909 (Hayford)")),                            ("intl"  , _("International 1909 (Hayford)")),
# Line 695  class ProjPanel(wxPanel): Line 639  class ProjPanel(wxPanel):
639          self.__ellps.SetSelection(0)          self.__ellps.SetSelection(0)
640    
641      def GetParameters(self):      def GetParameters(self):
642          return ["ellps=" + self.__ellps.GetClientData(          ellps = self.__ellps.GetSelection()
643                                          self.__ellps.GetSelection())]          if ellps > 0:
644                return ["ellps=" + self.__ellps.GetClientData(ellps)]
645            return []
646    
647    
648  ID_TMPANEL_LAT = 4001  ID_TMPANEL_LAT = 4001
# Line 712  class UnknownProjPanel(ProjPanel): Line 658  class UnknownProjPanel(ProjPanel):
658      def __init__(self, parent, receiver):      def __init__(self, parent, receiver):
659          ProjPanel.__init__(self, parent)          ProjPanel.__init__(self, parent)
660    
661            self.__text = _("Thuban does not know the parameters\n"
662                            "for the current projection and cannot\n"
663                            "display a configuration panel.\n\n"
664                            "The unidentified set of parameters is:\n\n")
665    
666            self.__textbox = wxTextCtrl(self, -1, self.__text, size=(100,200),
667                                style=wxTE_READONLY|wxTE_MULTILINE|wxTE_LINEWRAP)
668          self._DoLayout()          self._DoLayout()
669    
670      def _DoLayout(self):      def _DoLayout(self):
671          sizer = wxBoxSizer(wxVERTICAL)          sizer = wxBoxSizer(wxVERTICAL)
672    
673          sizer.Add(wxStaticText(self, -1,          sizer.Add(self.__textbox, 0, wxALL|wxEXPAND, 4)
                                _("Thuban does not know the parameters for the"  
                                  " current projection\n"  
                                  "and cannot display a configuration panel.")))  
674    
675          ProjPanel._DoLayout(self, sizer)          ProjPanel._DoLayout(self, sizer)
676    
# Line 728  class UnknownProjPanel(ProjPanel): Line 678  class UnknownProjPanel(ProjPanel):
678          return "Unknown"          return "Unknown"
679    
680      def SetProjection(self, proj):      def SetProjection(self, proj):
681          pass          """Append the available parameters to the info text."""
682            text = self.__text
683            for param in proj.GetAllParameters():
684                text = text + '%s\n' % param
685            self.__textbox.SetValue(text)
686    
687      def GetParameters(self):      def GetParameters(self):
688          return None          return None
# Line 741  class TMPanel(ProjPanel): Line 695  class TMPanel(ProjPanel):
695    
696          self.__latitude = wxTextCtrl(self, ID_TMPANEL_LAT)          self.__latitude = wxTextCtrl(self, ID_TMPANEL_LAT)
697          self.__longitude = wxTextCtrl(self, ID_TMPANEL_LONG)          self.__longitude = wxTextCtrl(self, ID_TMPANEL_LONG)
         self.__scale = wxTextCtrl(self, ID_TMPANEL_SCALE)  
698          self.__falseEast = wxTextCtrl(self, ID_TMPANEL_FASLE_EAST)          self.__falseEast = wxTextCtrl(self, ID_TMPANEL_FASLE_EAST)
699          self.__falseNorth = wxTextCtrl(self, ID_TMPANEL_FALSE_NORTH)          self.__falseNorth = wxTextCtrl(self, ID_TMPANEL_FALSE_NORTH)
700            self.__scale = wxTextCtrl(self, ID_TMPANEL_SCALE)
701    
702          self._DoLayout()          self._DoLayout()
703    
704      def _DoLayout(self):      def _DoLayout(self):
705    
706          sizer = wxFlexGridSizer(4, 4, 0, 0)          sizer = wxFlexGridSizer(4, 2, 0, 0)
707          sizer.Add(wxStaticText(self, -1, _("Latitude:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("Latitude:")), 0, wxALL, 4)
708          sizer.Add(self.__latitude, 0, wxALL, 4)          sizer.Add(self.__latitude, 0, wxALL, 4)
         sizer.Add(wxStaticText(self, -1, _("False Easting:")), 0, wxALL, 4)  
         sizer.Add(self.__falseEast, 0, wxALL, 4)  
709          sizer.Add(wxStaticText(self, -1, _("Longitude:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("Longitude:")), 0, wxALL, 4)
710          sizer.Add(self.__longitude, 0, wxALL, 4)          sizer.Add(self.__longitude, 0, wxALL, 4)
711            sizer.Add(wxStaticText(self, -1, _("False Easting:")), 0, wxALL, 4)
712            sizer.Add(self.__falseEast, 0, wxALL, 4)
713          sizer.Add(wxStaticText(self, -1, _("False Northing:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("False Northing:")), 0, wxALL, 4)
714          sizer.Add(self.__falseNorth, 0, wxALL, 4)          sizer.Add(self.__falseNorth, 0, wxALL, 4)
715          sizer.Add(wxStaticText(self, -1, _("Scale Factor:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("Scale Factor:")), 0, wxALL, 4)
# Line 878  class LCCPanel(ProjPanel): Line 832  class LCCPanel(ProjPanel):
832                    
833          self.__fspLatitude = wxTextCtrl(self, -1)          self.__fspLatitude = wxTextCtrl(self, -1)
834          self.__sspLatitude = wxTextCtrl(self, -1)          self.__sspLatitude = wxTextCtrl(self, -1)
         self.__originLat   = wxTextCtrl(self, -1)  
835          self.__meridian    = wxTextCtrl(self, -1)          self.__meridian    = wxTextCtrl(self, -1)
836            self.__originLat   = wxTextCtrl(self, -1)
837          self.__falseEast   = wxTextCtrl(self, -1)          self.__falseEast   = wxTextCtrl(self, -1)
838          self.__falseNorth  = wxTextCtrl(self, -1)          self.__falseNorth  = wxTextCtrl(self, -1)
839    

Legend:
Removed from v.1795  
changed lines
  Added in v.1861

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26