/[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 1786 by bh, Wed Oct 8 10:39:11 2003 UTC revision 1851 by bh, Tue Oct 21 14:17:24 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          self.receiver = receiver          self.receiver = receiver
65          self.haveTried = False          self.haveTried = False
66          self.curProjPanel = None          self.curProjPanel = None
67            self.__usrProjFile = None
68            self.__sysProjFile = None
69    
70          self.projPanels = []          self.build_dialog()
71          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))  
72    
73          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:"))  
74    
75          # Projection List specific actions (Import/Export/Remove)          self.projection_list.SelectProjection(self.originalProjection)
76          self.button_import = wxButton(self.panel_1, ID_PROJ_IMPORT,          self.button_ok.SetFocus()
77                                        _("Import..."))          self.projection_list.SetFocus()
         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            NonModalNonParentDialog.OnClose(self, event)
213    
214      def OnApply(self, event):      def OnApply(self, event):
215          self.__SetProjection()          self.__SetProjection()
# Line 157  class ProjFrame(NonModalNonParentDialog) Line 232  class ProjFrame(NonModalNonParentDialog)
232    
233      def _OnNew(self, event):      def _OnNew(self, event):
234    
235          # clear all selections          self.projection_list.ClearSelection()
         sel = self.availprojs.GetSelections()  
         for index in sel:  
             self.availprojs.SetSelection(index, False)  
   
236          self.projname.Clear()          self.projname.Clear()
237    
238          # supply a projection panel if there wasn't one          # supply a projection panel if there wasn't one
# Line 169  class ProjFrame(NonModalNonParentDialog) Line 240  class ProjFrame(NonModalNonParentDialog)
240              self.projchoice.SetSelection(0)              self.projchoice.SetSelection(0)
241              self.__DoOnProjChoice()              self.__DoOnProjChoice()
242    
243          self.curProjPanel.Clear()          if self.curProjPanel is not None:
244                self.curProjPanel.Clear()
245    
246      def _OnSave(self, event):      def _OnSave(self, event):
247    
248          sel = self.availprojs.GetSelections()          sel = self.projection_list.selected_projections()
249          assert len(sel) == 1,  "button shouldn't be enabled"          assert len(sel) == 1,  "button shouldn't be enabled"
250    
251          proj, projfile = self.availprojs.GetClientData(sel[0])          proj, projfile = sel[0]
252    
253          assert proj is not None and projfile is not None          assert proj is not None and projfile is not None
254    
255          newproj = self.__GetProjection()          newproj = self.__GetProjection()
256    
257          if newproj is not None:          if newproj is not None:
258                # FIXME: we should only allow this for the user proj file.
259              projfile.Replace(proj, newproj)              projfile.Replace(proj, newproj)
260              try:              self.write_proj_file(projfile)
261                  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())  
262    
263      def _OnAddToList(self, event):      def _OnAddToList(self, event):
264    
265          proj = self.__GetProjection()          proj = self.__GetProjection()
266          if proj is not None:          if proj is not None:
267              self.__usrProjFile.Add(proj)              self.__usrProjFile.Add(proj)
268              try:              self.write_proj_file(self.__usrProjFile)
269                  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()  
270    
271      def show_warnings(self, title, filename, warnings):      def show_warnings(self, title, filename, warnings):
272          """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 279  class ProjFrame(NonModalNonParentDialog)
279              self.parent.RunMessageBox(title, text)              self.parent.RunMessageBox(title, text)
280    
281      def _OnImport(self, event):      def _OnImport(self, event):
282            """Handler for the 'Import' button
283    
284            Ask the user for a filename, read the projections from that file
285            add them to the user ProjFile object and write the user file
286            back to disk.
287            """
288          dlg = wxFileDialog(self, _("Import"), style = wxOPEN)          dlg = wxFileDialog(self, _("Import"), style = wxOPEN)
289    
290          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
291              path = dlg.GetPath()              path = dlg.GetPath()
292    
293                ThubanBeginBusyCursor()
294              try:              try:
295                  projFile, warnings = read_proj_file(path)                  try:
296                  self.show_warnings(_("Warnings"), path, warnings)                      projFile, warnings = read_proj_file(path)
297                  for proj in projFile.GetProjections():                  except IOError, (errno, errstr):
298                      self.__usrProjFile.Add(proj)                      self.__ShowError(dlg.GetPath(), errstr)
299                  write_proj_file(self.__usrProjFile)                  else:
300              except IOError, (errno, errstr):                      self.show_warnings(_("Warnings"), path, warnings)
301                  self.__ShowError(dlg.GetPath(), errstr)                      for proj in projFile.GetProjections():
302                            self.__usrProjFile.Add(proj)
303              self.__FillAvailList()                      self.write_proj_file(self.__usrProjFile)
304                finally:
305                    ThubanEndBusyCursor()
306          dlg.Destroy()          dlg.Destroy()
307    
308      def _OnExport(self, event):      def _OnExport(self, event):
309            """Handler for the 'Export' button.
310    
311          sel = self.availprojs.GetSelections()          Ask the user for a filename and write the selected projections
312            to that file.
313            """
314            sel = self.projection_list.selected_projections()
315          assert len(sel) != 0, "button should be disabled"          assert len(sel) != 0, "button should be disabled"
316    
317          dlg = wxFileDialog(self, _("Export"),          dlg = wxFileDialog(self, _("Export"), style=wxSAVE|wxOVERWRITE_PROMPT)
                         style = wxSAVE|wxOVERWRITE_PROMPT)  
318    
319          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
320              path = dlg.GetPath()              proj_file = ProjFile(dlg.GetPath())
321                for proj, pf in sel:
             projFile = ProjFile(path)  
   
             for i in sel:  
                 proj = self.availprojs.GetClientData(i)[CLIENT_PROJ]  
322                  if proj is not None:                  if proj is not None:
323                      projFile.Add(proj)                      proj_file.Add(proj)
324                self.write_proj_file(proj_file)
             try:  
                 write_proj_file(projFile)  
             except IOError, (errno, errstr):  
                 self.__ShowError(dlg.GetPath(), errstr)  
325    
326          dlg.Destroy()          dlg.Destroy()
327    
328      def _OnRemove(self, event):      def _OnRemove(self, event):
329            """Handler for the 'Remove' button
330    
331          sel = self.availprojs.GetSelections()          Remove any selected projection that came from the user's
332            ProjFile. If the user ProjFile was modified write it back to
333            disk.
334            """
335            sel = self.projection_list.selected_projections()
336          assert len(sel) != 0, "button should be disabled!"          assert len(sel) != 0, "button should be disabled!"
337    
338          #          modified = False
339          # remove the items backwards so the indices don't change          for proj, pf in sel:
340          #              if proj is not None and pf is self.__usrProjFile:
341          sel = list(sel)                  pf.Remove(proj)
342          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()  
343    
344          #          if modified:
345          # 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()  
346    
347      def _OnProjName(self, event):      def _OnProjName(self, event):
348          self.__VerifyButtons()          self.__VerifyButtons()
349    
350      def __ShowError(self, filename, errstr):      def __ShowError(self, filename, errstr):
351          wxMessageDialog(self,          wxMessageDialog(self,
352              _("The following error occured:\n") +              _("The following error occured:\n") +
353              filename + "\n" + errstr,              filename + "\n" + errstr,
354              _("Error"), wxOK | wxICON_ERROR).ShowModal()              _("Error"), wxOK | wxICON_ERROR).ShowModal()
355    
356      def __VerifyButtons(self):      def __VerifyButtons(self):
357          """Enable or disable the appropriate buttons based on the          """Update button sensitivity"""
         current state of the dialog.  
         """  
358    
359          sel = self.availprojs.GetSelections()          num_sel = self.projection_list.GetSelectedItemCount()
360    
361          self.button_import.Enable(True)          self.button_import.Enable(True)
362          self.button_export.Enable(True)          self.button_export.Enable(True)
363          self.button_save.Enable(True)          self.button_save.Enable(True)
364          self.button_remove.Enable(True)          self.button_remove.Enable(True)
365    
366          self.panel_edit.Enable(True)          self.edit_box.Enable(True)
367    
368          for ctrl in [self.button_import,          for ctrl in [self.button_import,
369                       self.button_export,                       self.button_export,
# Line 337  class ProjFrame(NonModalNonParentDialog) Line 372  class ProjFrame(NonModalNonParentDialog)
372                       self.button_add,                       self.button_add,
373                       self.projchoice,                       self.projchoice,
374                       self.projname,                       self.projname,
375                       self.panel_edit]:                       self.edit_box]:
376              ctrl.Enable(True)              ctrl.Enable(True)
377    
378          if self.curProjPanel is not None:          if self.curProjPanel is not None:
379              self.curProjPanel.Enable(True)              self.curProjPanel.Enable(True)
380    
381          if len(sel) == 0:          if num_sel == 0:
382              self.button_import.Enable(True)              self.button_import.Enable(True)
383              self.button_export.Enable(False)              self.button_export.Enable(False)
384              self.button_remove.Enable(False)              self.button_remove.Enable(False)
385              self.button_save.Enable(False)              self.button_save.Enable(False)
386    
387          elif len(sel) == 1:          elif num_sel == 1:
388    
389              proj, projFile = self.availprojs.GetClientData(sel[0])              selection = self.projection_list.selected_projections()
390                proj, projFile = selection[0]
391    
392              self.button_save.Enable(len(self.projname.GetValue()) > 0)              self.button_save.Enable(len(self.projname.GetValue()) > 0)
393              self.button_add.Enable(len(self.projname.GetValue()) > 0)              self.button_add.Enable(len(self.projname.GetValue()) > 0)
# Line 376  class ProjFrame(NonModalNonParentDialog) Line 412  class ProjFrame(NonModalNonParentDialog)
412                  self.button_save.Enable(False)                  self.button_save.Enable(False)
413    
414          else:          else:
415              self.panel_edit.Enable(False)              self.edit_box.Enable(False)
   
     def __DoOnProjAvail(self):  
416    
417          sel = self.availprojs.GetSelections()      def proj_selection_changed(self, projs):
418          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]  
419    
420            Update the dialog to reflect the new selection.
421            """
422            if len(projs) == 0:
423                self.projfilepath.SetLabel(_("No Projections selected"))
424            elif len(projs) == 1:
425                proj, projfile = projs[0]
426              if proj is None:              if proj is None:
427                  # user selected <None>                  # user selected <None>
428                  self.projname.Clear()                  self.projname.Clear()
429                  self.projfilepath.SetLabel(_("Projection File: "))                  self.projfilepath.SetLabel("")
430              else:              else:
               
431                  if projfile is not None:                  if projfile is not None:
432                      self.projfilepath.SetLabel(_("Projection File: ") +                      filename = os.path.basename(projfile.GetFilename())
433                          os.path.basename(projfile.GetFilename()))                      self.projfilepath.SetLabel(_("Source of Projection: %s")
434                                                   % filename)
435                  else:                  else:
436                      # only None if the currently used projection is selected                      # only None if the currently used projection is selected
437                      self.projfilepath.SetLabel(_("Projection File: "))                      self.projfilepath.SetLabel("")
438    
439                  self.projname.SetValue(proj.GetName())                  self.projname.SetValue(proj.Label())
440    
441                  myProjType = proj.GetParameter("proj")                  myProjType = proj.GetParameter("proj")
442                  i = 0                  i = 0
443                  for projType, name, clazz in self.projPanels:                  for projType, name, cls in self.projection_panel_defs:
444                      if myProjType == projType:                      if myProjType == projType:
445                          self.projchoice.SetSelection(i)                          self.projchoice.Enable(True)
446                            self.projchoice.SetSelection(i + 1)
447                          self.__DoOnProjChoice()                          self.__DoOnProjChoice()
448    
449                          #                          #
# Line 415  class ProjFrame(NonModalNonParentDialog) Line 453  class ProjFrame(NonModalNonParentDialog)
453                          assert self.curProjPanel is not None                          assert self.curProjPanel is not None
454    
455                          self.curProjPanel.SetProjection(proj)                          self.curProjPanel.SetProjection(proj)
456                            break
457                      i += 1                      i += 1
458                    else:
459                        self.projchoice.Select(0)
460                        self.projchoice.Disable()
461                        self._show_proj_panel(UnknownProjPanel)
462            else:
463                self.projfilepath.SetLabel(_("Multiple Projections selected"))
464    
465          self.__VerifyButtons()          self.__VerifyButtons()
466    
# Line 432  class ProjFrame(NonModalNonParentDialog) Line 477  class ProjFrame(NonModalNonParentDialog)
477          At the end of this method self.curProjPanel will not be None          At the end of this method self.curProjPanel will not be None
478          if there was a item selected.          if there was a item selected.
479          """          """
   
480          choice = self.projchoice          choice = self.projchoice
481    
482          sel = choice.GetSelection()          sel = choice.GetSelection()
483          if sel != -1:          if sel != -1:
484                proj_type = choice.GetClientData(sel)
485              clazz, obj = choice.GetClientData(sel)              for t, name, cls in self.projection_panel_defs:
486                    if t == proj_type:
487              if obj is None:                      self._show_proj_panel(cls)
488                  obj = clazz(self.panel_edit, self.receiver)                      break
489                  choice.SetClientData(sel, [clazz, obj])          # FIXME: what to do if sel == -1?
490    
491              if self.curProjPanel is not None:      def _show_proj_panel(self, panel_class):
492                  self.curProjPanel.Hide()          """Show the panel as the projection panel"""
493                  self.sizer_projctrls.Remove(self.curProjPanel)          if panel_class is UnknownProjPanel:
494                self.edit_box.Disable()
495              self.curProjPanel = obj              self.nbsizer.Activate(self.unknown_projection_panel)
496              self.curProjPanel.Show()              self.curProjPanel = self.unknown_projection_panel
497            else:
498              self.sizer_projctrls.Add(self.curProjPanel, 1,              self.edit_box.Enable(True)
499                  wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)              self.unknown_projection_panel.Hide()
500              self.sizer_projctrls.Layout()              for panel in self.projection_panels:
501              self.Layout()                  if panel.__class__ is panel_class:
502              self.topBox.SetSizeHints(self)                      self.nbsizer.Activate(panel)
503                        self.curProjPanel = panel
504    
505      def __SetProjection(self):      def __SetProjection(self):
506          """Set the receiver's projection."""          """Set the receiver's projection."""
# Line 473  class ProjFrame(NonModalNonParentDialog) Line 518  class ProjFrame(NonModalNonParentDialog)
518          Could be None.          Could be None.
519          """          """
520    
521          sel = self.availprojs.GetSelections()          assert self.projection_list.GetSelectedItemCount() < 2, \
522          assert len(sel) < 2, "button should be disabled"                 "button should be disabled"
   
523    
524            sel = self.projection_list.selected_projections()
525          if len(sel) == 1:          if len(sel) == 1:
526              proj = self.availprojs.GetClientData(sel[0])[CLIENT_PROJ]              if sel[0][0] is None:
             if proj is None:  
527                  # <None> is selected                  # <None> is selected
528                  return None                  return None
529    
530          #          # self.curProjPanel should always contain the most relevant data
531          # self.curProjPanel should always contain the most          # for a projection
         # relevant data for a projection  
         #  
532          if self.curProjPanel is not None:          if self.curProjPanel is not None:
533              return Projection(self.curProjPanel.GetParameters(),              return Projection(self.curProjPanel.GetParameters(),
534                                self.projname.GetValue())                                self.projname.GetValue())
535    
536          return None          return None
537    
538      def __FillAvailList(self, selectCurrent = False, selectProj = None):      def load_user_proj(self):
539          """Populate the list of available projections.          ThubanBeginBusyCursor()
540                    try:
541          selectCurrent -- if True, select the projection used by              if self.__usrProjFile is None:
542                           the receiver, otherwise select nothing.                  projfile, warnings = get_user_proj_file()
543          selectProj    -- if set, select the projection found under the                  self.show_warnings(_("Warnings"), projfile.GetFilename(),
544                           specified name. This overwrites any other                                     warnings)
545                           selection estimate.                  self.__usrProjFile = projfile
546          """              return self.__usrProjFile
547            finally:
548          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)  
   
         self.projname.SetMaxLength(32)  
   
     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)  
549    
550          self.sizer_mainbttns.Add(sizer_6, 0,      def load_system_proj(self):
551              wxALL|wxEXPAND|wxADJUST_MINSIZE, 10)          ThubanBeginBusyCursor()
552            try:
553                if self.__sysProjFile is None:
554                    projfile, warnings = get_system_proj_file()
555                    self.show_warnings(_("Warnings"), projfile.GetFilename(),
556                                       warnings)
557                    self.__sysProjFile = projfile
558                return self.__sysProjFile
559            finally:
560                ThubanEndBusyCursor()
561    
562          self.topBox.Add(self.sizer_mainctrls, 1, wxALL|wxEXPAND, 4)      def write_proj_file(self, proj_file):
563          self.topBox.Add(self.sizer_mainbttns, 0, wxALIGN_RIGHT|wxBOTTOM, 0)          """Write the ProjFile object proj_file back to its file
564    
565          self.SetAutoLayout(1)          Show a busy cursor while writing and if an error occurs show a
566          self.SetSizer(self.topBox)          dialog with the error message.
567          self.topBox.Fit(self)          """
568          self.topBox.SetSizeHints(self)          try:
569          self.Layout()              ThubanBeginBusyCursor()
570                try:
571                    write_proj_file(proj_file)
572                finally:
573                    ThubanEndBusyCursor()
574            except IOError, (errno, errstr):
575                self.__ShowError(proj_file.GetFilename(), errstr)
576    
 # end of class ProjFrame  
577    
578    
579  class ProjPanel(wxPanel):  class ProjPanel(wxPanel):
# Line 642  class ProjPanel(wxPanel): Line 583  class ProjPanel(wxPanel):
583          wxPanel.__init__(self, parent, -1)          wxPanel.__init__(self, parent, -1)
584    
585          self.__ellps = wxChoice(self, -1)          self.__ellps = wxChoice(self, -1)
586          self.ellpsData = [("airy"  , _("Airy")),          self.ellpsData = [("", _("<Unknown>")),
587                              ("airy"  , _("Airy")),
588                            ("bessel", _("Bessel 1841")),                            ("bessel", _("Bessel 1841")),
589                            ("clrk66", _("Clarke 1866")),                            ("clrk66", _("Clarke 1866")),
590                            ("clrk80", _("Clarke 1880")),                            ("clrk80", _("Clarke 1880")),
591                            ("GRS80" , _("GRS 1980 (IUGG, 1980)")),                            ("GRS80" , _("GRS 1980 (IUGG, 1980)")),
592                            ("intl"  , _("International 1909 (Hayford)")),                            ("intl"  , _("International 1909 (Hayford)")),
# Line 690  class ProjPanel(wxPanel): Line 632  class ProjPanel(wxPanel):
632          self.__ellps.SetSelection(0)          self.__ellps.SetSelection(0)
633    
634      def GetParameters(self):      def GetParameters(self):
635          return ["ellps=" + self.__ellps.GetClientData(          ellps = self.__ellps.GetSelection()
636                                          self.__ellps.GetSelection())]          if ellps > 0:
637                return ["ellps=" + self.__ellps.GetClientData(ellps)]
638            return []
639    
640    
641  ID_TMPANEL_LAT = 4001  ID_TMPANEL_LAT = 4001
# Line 701  ID_TMPANEL_FALSE_NORTH = 4004 Line 645  ID_TMPANEL_FALSE_NORTH = 4004
645  ID_TMPANEL_SCALE = 4005  ID_TMPANEL_SCALE = 4005
646    
647  class UnknownProjPanel(ProjPanel):  class UnknownProjPanel(ProjPanel):
648    
649        """Panel for unknown projection types"""
650    
651      def __init__(self, parent, receiver):      def __init__(self, parent, receiver):
652          ProjPanel.__init__(self, parent)          ProjPanel.__init__(self, parent)
653    
# Line 710  class UnknownProjPanel(ProjPanel): Line 657  class UnknownProjPanel(ProjPanel):
657          sizer = wxBoxSizer(wxVERTICAL)          sizer = wxBoxSizer(wxVERTICAL)
658    
659          sizer.Add(wxStaticText(self, -1,          sizer.Add(wxStaticText(self, -1,
660                                 _("Thuban does not know the parameters for the"                                 _("Thuban does not know the parameters\n"
661                                   " current projection and cannot display a"                                   "for the current projection and cannot\n"
662                                   " configuration panel.")))                                   "display a configuration panel.")))
663    
664          ProjPanel._DoLayout(self, sizer)          ProjPanel._DoLayout(self, sizer)
665    
# Line 733  class TMPanel(ProjPanel): Line 680  class TMPanel(ProjPanel):
680    
681          self.__latitude = wxTextCtrl(self, ID_TMPANEL_LAT)          self.__latitude = wxTextCtrl(self, ID_TMPANEL_LAT)
682          self.__longitude = wxTextCtrl(self, ID_TMPANEL_LONG)          self.__longitude = wxTextCtrl(self, ID_TMPANEL_LONG)
         self.__scale = wxTextCtrl(self, ID_TMPANEL_SCALE)  
683          self.__falseEast = wxTextCtrl(self, ID_TMPANEL_FASLE_EAST)          self.__falseEast = wxTextCtrl(self, ID_TMPANEL_FASLE_EAST)
684          self.__falseNorth = wxTextCtrl(self, ID_TMPANEL_FALSE_NORTH)          self.__falseNorth = wxTextCtrl(self, ID_TMPANEL_FALSE_NORTH)
685            self.__scale = wxTextCtrl(self, ID_TMPANEL_SCALE)
686    
687          self._DoLayout()          self._DoLayout()
688    
689      def _DoLayout(self):      def _DoLayout(self):
690    
691          sizer = wxFlexGridSizer(4, 4, 0, 0)          sizer = wxFlexGridSizer(4, 2, 0, 0)
692          sizer.Add(wxStaticText(self, -1, _("Latitude:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("Latitude:")), 0, wxALL, 4)
693          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)  
694          sizer.Add(wxStaticText(self, -1, _("Longitude:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("Longitude:")), 0, wxALL, 4)
695          sizer.Add(self.__longitude, 0, wxALL, 4)          sizer.Add(self.__longitude, 0, wxALL, 4)
696            sizer.Add(wxStaticText(self, -1, _("False Easting:")), 0, wxALL, 4)
697            sizer.Add(self.__falseEast, 0, wxALL, 4)
698          sizer.Add(wxStaticText(self, -1, _("False Northing:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("False Northing:")), 0, wxALL, 4)
699          sizer.Add(self.__falseNorth, 0, wxALL, 4)          sizer.Add(self.__falseNorth, 0, wxALL, 4)
700          sizer.Add(wxStaticText(self, -1, _("Scale Factor:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("Scale Factor:")), 0, wxALL, 4)
# Line 870  class LCCPanel(ProjPanel): Line 817  class LCCPanel(ProjPanel):
817                    
818          self.__fspLatitude = wxTextCtrl(self, -1)          self.__fspLatitude = wxTextCtrl(self, -1)
819          self.__sspLatitude = wxTextCtrl(self, -1)          self.__sspLatitude = wxTextCtrl(self, -1)
         self.__originLat   = wxTextCtrl(self, -1)  
820          self.__meridian    = wxTextCtrl(self, -1)          self.__meridian    = wxTextCtrl(self, -1)
821            self.__originLat   = wxTextCtrl(self, -1)
822          self.__falseEast   = wxTextCtrl(self, -1)          self.__falseEast   = wxTextCtrl(self, -1)
823          self.__falseNorth  = wxTextCtrl(self, -1)          self.__falseNorth  = wxTextCtrl(self, -1)
824    

Legend:
Removed from v.1786  
changed lines
  Added in v.1851

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26