/[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 1819 by bh, Mon Oct 13 15:55:43 2003 UTC revision 1941 by bh, Tue Nov 11 18:27:48 2003 UTC
# Line 21  from Thuban import _ Line 21  from Thuban import _
21  from Thuban.Model.proj import Projection, ProjFile  from Thuban.Model.proj import Projection, ProjFile
22    
23  from Thuban.Model.resource import get_user_proj_file, get_system_proj_file, \  from Thuban.Model.resource import get_user_proj_file, get_system_proj_file, \
24                                    read_proj_file, write_proj_file                                    read_proj_file, write_proj_file, \
25                                      DEFAULT_PROJ_FILE, EPSG_PROJ_FILE, \
26                                      EPSG_DEPRECATED_PROJ_FILE
27  from Thuban.UI.dialogs import NonModalNonParentDialog  from Thuban.UI.dialogs import NonModalNonParentDialog
28    
29    from common import ThubanBeginBusyCursor, ThubanEndBusyCursor
30  from sizers import NotebookLikeSizer  from sizers import NotebookLikeSizer
31    from projlist import PROJ_SELECTION_CHANGED, ProjectionList
32    from common import ThubanBeginBusyCursor, ThubanEndBusyCursor
33    
34    
35    
 ID_PROJ_ADVANCED  = 4001  
36  ID_PROJ_PROJCHOICE = 4002  ID_PROJ_PROJCHOICE = 4002
37  ID_PROJ_ADDTOLIST    = 4003  ID_PROJ_ADDTOLIST    = 4003
38  ID_PROJ_NEW       = 4004  ID_PROJ_NEW       = 4004
# Line 56  class ProjFrame(NonModalNonParentDialog) Line 62  class ProjFrame(NonModalNonParentDialog)
62              ("tmerc", _("Transverse Mercator"), TMPanel),              ("tmerc", _("Transverse Mercator"), TMPanel),
63              ("utm", _("Universal Transverse Mercator"), UTMPanel),              ("utm", _("Universal Transverse Mercator"), UTMPanel),
64              ("lcc", _("Lambert Conic Conformal"), LCCPanel),              ("lcc", _("Lambert Conic Conformal"), LCCPanel),
65              ("latlong", _("Geographic"), GeoPanel)]              ("latlong", _("Geographic"), GeoPanel),
66                ("longlat", _("Geographic"), GeoPanel)]#longlat is an alias of proj
67          self.receiver = receiver          self.receiver = receiver
68          self.haveTried = False          self.haveTried = False
69          self.curProjPanel = None          self.curProjPanel = None
70            self.__usrProjFile = None
71            self._sys_proj_files = {}
72    
73          self.build_dialog()          self.build_dialog()
74          self.Layout()          self.Layout()
75    
76          self.originalProjection = self.receiver.GetProjection()          self.originalProjection = self.receiver.GetProjection()
77    
78          self.__DoOnProjAvail()          self.projection_list.SelectProjection(self.originalProjection)
79          self.button_ok.SetFocus()          self.projection_list.SetFocus()
         self.availprojs.SetFocus()  
80    
81      def build_dialog(self):      def build_dialog(self):
82          """Build the dialog's widgets and set the event handlers"""          """Build the dialog's widgets and set the event handlers"""
# Line 81  class ProjFrame(NonModalNonParentDialog) Line 89  class ProjFrame(NonModalNonParentDialog)
89          #    The projection list and associated controls          #    The projection list and associated controls
90          #          #
91          vbox = wxBoxSizer(wxVERTICAL)          vbox = wxBoxSizer(wxVERTICAL)
92          main_box.Add(vbox, 0, wxALL|wxEXPAND)          main_box.Add(vbox, 4, wxALL|wxEXPAND)
93    
94          label = wxStaticText(self, -1, _("Available Projections:"))          #label = wxStaticText(self, -1, _("Available Projections:"))
95          vbox.Add(label, 0, wxLEFT|wxRIGHT|wxTOP, 4)          #vbox.Add(label, 0, wxLEFT|wxRIGHT|wxTOP, 4)
96    
97          hbox = wxBoxSizer(wxHORIZONTAL)          hbox = wxBoxSizer(wxHORIZONTAL)
98          vbox.Add(hbox, 1, wxALL|wxEXPAND)          vbox.Add(hbox, 1, wxALL|wxEXPAND)
99          self.availprojs = wxListBox(self, ID_PROJ_AVAIL,          proj_files = [self.load_user_proj(),
100                                      style=wxLB_EXTENDED|wxLB_SORT)                        self.load_system_proj(DEFAULT_PROJ_FILE)]
101          EVT_LISTBOX(self, ID_PROJ_AVAIL, self._OnProjAvail)          self.projection_list = ProjectionList(self, proj_files,
102          hbox.Add(self.availprojs, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)                                                self.receiver.GetProjection())
103          self.__FillAvailList(selectCurrent = True)          hbox.Add(self.projection_list, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)
104            self.projection_list.Subscribe(PROJ_SELECTION_CHANGED,
105                                           self.proj_selection_changed)
106    
107          # Projection List specific actions (Import/Export/Remove)          # Projection List specific actions (Import/Export/Remove)
108          buttons = wxBoxSizer(wxVERTICAL)          buttons = wxBoxSizer(wxVERTICAL)
# Line 108  class ProjFrame(NonModalNonParentDialog) Line 118  class ProjFrame(NonModalNonParentDialog)
118          EVT_BUTTON(self, ID_PROJ_REMOVE, self._OnRemove)          EVT_BUTTON(self, ID_PROJ_REMOVE, self._OnRemove)
119          buttons.Add(self.button_remove, 1, wxALL|wxEXPAND, 4)          buttons.Add(self.button_remove, 1, wxALL|wxEXPAND, 4)
120    
121            buttons.Add(20, 20, 0, wxEXPAND, 0)
122            label = wxStaticText(self, -1, _("Show EPSG:"))
123            buttons.Add(label, 0, wxLEFT|wxRIGHT|wxTOP, 4)
124            self.check_epsg = wxCheckBox(self, -1, _("Normal"))
125            EVT_CHECKBOX(self, self.check_epsg.GetId(), self._OnShowEPSG)
126            buttons.Add(self.check_epsg, 1, wxALL|wxEXPAND, 4)
127            self.check_epsg_depr = wxCheckBox(self, -1, _("Deprecated"))
128            EVT_CHECKBOX(self, self.check_epsg_depr.GetId(), self._OnShowEPSG)
129            buttons.Add(self.check_epsg_depr, 1, wxALL|wxEXPAND, 4)
130    
131          # The file path          # The file path
132          self.projfilepath = wxStaticText(self, -1, "")          self.projfilepath = wxStaticText(self, -1, "")
133          vbox.Add(self.projfilepath, 0, wxALL|wxEXPAND)          vbox.Add(self.projfilepath, 0, wxALL|wxEXPAND)
# Line 117  class ProjFrame(NonModalNonParentDialog) Line 137  class ProjFrame(NonModalNonParentDialog)
137          #          #
138          self.edit_box = wxStaticBox(self, -1, _("Edit"))          self.edit_box = wxStaticBox(self, -1, _("Edit"))
139          sizer_edit = wxStaticBoxSizer(self.edit_box, wxHORIZONTAL)          sizer_edit = wxStaticBoxSizer(self.edit_box, wxHORIZONTAL)
140          main_box.Add(sizer_edit, 1, wxALL|wxEXPAND)          main_box.Add(sizer_edit, 5, wxALL|wxEXPAND)
141    
142          # Projection Specific Entries (Name/Projection)          # Projection Specific Entries (Name/Projection)
143          self.sizer_projctrls = wxBoxSizer(wxVERTICAL)          self.sizer_projctrls = wxBoxSizer(wxVERTICAL)
# Line 144  class ProjFrame(NonModalNonParentDialog) Line 164  class ProjFrame(NonModalNonParentDialog)
164          self.sizer_projctrls.Add(self.nbsizer, 1,          self.sizer_projctrls.Add(self.nbsizer, 1,
165                                   wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)                                   wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)
166          self.projection_panels = []          self.projection_panels = []
167            self.projchoice.Append(_("<Unknown>"), "")
168          for proj_type, name, cls in self.projection_panel_defs:          for proj_type, name, cls in self.projection_panel_defs:
169              self.projchoice.Append(name, proj_type)              self.projchoice.Append(name, proj_type)
170              panel = cls(self, self.receiver)              panel = cls(self, self.receiver)
# Line 198  class ProjFrame(NonModalNonParentDialog) Line 219  class ProjFrame(NonModalNonParentDialog)
219          top_box.Fit(self)          top_box.Fit(self)
220          top_box.SetSizeHints(self)          top_box.SetSizeHints(self)
221    
222        def OnClose(self, event):
223            self.projection_list.Unsubscribe(PROJ_SELECTION_CHANGED,
224                                             self.proj_selection_changed)
225            # Destroy the projection list explicitly so that it properly
226            # unsubscribes everything. It would be cleaner if the projection
227            # could do this by itself but wx doesn't always send destroy
228            # events for non-top-level widgets
229            self.projection_list.Destroy()
230            NonModalNonParentDialog.OnClose(self, event)
231    
232      def OnApply(self, event):      def OnApply(self, event):
233          self.__SetProjection()          self.__SetProjection()
234          self.haveTried = True          self.haveTried = True
# Line 219  class ProjFrame(NonModalNonParentDialog) Line 250  class ProjFrame(NonModalNonParentDialog)
250    
251      def _OnNew(self, event):      def _OnNew(self, event):
252    
253          # clear all selections          self.projection_list.ClearSelection()
         sel = self.availprojs.GetSelections()  
         for index in sel:  
             self.availprojs.SetSelection(index, False)  
   
254          self.projname.Clear()          self.projname.Clear()
255    
256          # supply a projection panel if there wasn't one          # supply a projection panel if there wasn't one
# Line 231  class ProjFrame(NonModalNonParentDialog) Line 258  class ProjFrame(NonModalNonParentDialog)
258              self.projchoice.SetSelection(0)              self.projchoice.SetSelection(0)
259              self.__DoOnProjChoice()              self.__DoOnProjChoice()
260    
261          self.curProjPanel.Clear()          if self.curProjPanel is not None:
262                self.curProjPanel.Clear()
263    
264      def _OnSave(self, event):      def _OnSave(self, event):
265    
266          sel = self.availprojs.GetSelections()          sel = self.projection_list.selected_projections()
267          assert len(sel) == 1,  "button shouldn't be enabled"          assert len(sel) == 1,  "button shouldn't be enabled"
268    
269          proj, projfile = self.availprojs.GetClientData(sel[0])          proj, projfile = sel[0]
270    
271          assert proj is not None and projfile is not None          assert proj is not None and projfile is not None
272    
273          newproj = self.__GetProjection()          newproj = self.__GetProjection()
274    
275          if newproj is not None:          if newproj is not None:
276                # FIXME: we should only allow this for the user proj file.
277              projfile.Replace(proj, newproj)              projfile.Replace(proj, newproj)
278              try:              self.write_proj_file(projfile)
279                  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.Label())  
280    
281      def _OnAddToList(self, event):      def _OnAddToList(self, event):
282    
283          proj = self.__GetProjection()          proj = self.__GetProjection()
284          if proj is not None:          if proj is not None:
285              self.__usrProjFile.Add(proj)              self.__usrProjFile.Add(proj)
286              try:              self.write_proj_file(self.__usrProjFile)
287                  write_proj_file(self.__usrProjFile)              self.projection_list.SelectProjection(proj)
             except IOError, (errno, errstr):  
                 self.__ShowError(self.__userProjFile.GetFilename(), errstr)  
   
             self.__FillAvailList( selectProj = proj.Label())  
   
     def _OnProjAvail(self, event):  
         self.__DoOnProjAvail()  
288    
289      def show_warnings(self, title, filename, warnings):      def show_warnings(self, title, filename, warnings):
290          """Show the warnings (a list of strings) in a dialog          """Show the warnings (a list of strings) in a dialog
# Line 280  class ProjFrame(NonModalNonParentDialog) Line 297  class ProjFrame(NonModalNonParentDialog)
297              self.parent.RunMessageBox(title, text)              self.parent.RunMessageBox(title, text)
298    
299      def _OnImport(self, event):      def _OnImport(self, event):
300            """Handler for the 'Import' button
301    
302            Ask the user for a filename, read the projections from that file
303            add them to the user ProjFile object and write the user file
304            back to disk.
305            """
306          dlg = wxFileDialog(self, _("Import"), style = wxOPEN)          dlg = wxFileDialog(self, _("Import"), style = wxOPEN)
307    
308          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
309              path = dlg.GetPath()              path = dlg.GetPath()
310    
311                ThubanBeginBusyCursor()
312              try:              try:
313                  projFile, warnings = read_proj_file(path)                  try:
314                  self.show_warnings(_("Warnings"), path, warnings)                      projFile, warnings = read_proj_file(path)
315                  for proj in projFile.GetProjections():                  except IOError, (errno, errstr):
316                      self.__usrProjFile.Add(proj)                      self.__ShowError(dlg.GetPath(), errstr)
317                  write_proj_file(self.__usrProjFile)                  else:
318              except IOError, (errno, errstr):                      self.show_warnings(_("Warnings"), path, warnings)
319                  self.__ShowError(dlg.GetPath(), errstr)                      for proj in projFile.GetProjections():
320                            self.__usrProjFile.Add(proj)
321              self.__FillAvailList()                      self.write_proj_file(self.__usrProjFile)
322                finally:
323                    ThubanEndBusyCursor()
324          dlg.Destroy()          dlg.Destroy()
325    
326      def _OnExport(self, event):      def _OnExport(self, event):
327            """Handler for the 'Export' button.
328    
329          sel = self.availprojs.GetSelections()          Ask the user for a filename and write the selected projections
330            to that file.
331            """
332            sel = self.projection_list.selected_projections()
333          assert len(sel) != 0, "button should be disabled"          assert len(sel) != 0, "button should be disabled"
334    
335          dlg = wxFileDialog(self, _("Export"),          dlg = wxFileDialog(self, _("Export"), style=wxSAVE|wxOVERWRITE_PROMPT)
                         style = wxSAVE|wxOVERWRITE_PROMPT)  
336    
337          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
338              path = dlg.GetPath()              proj_file = ProjFile(dlg.GetPath())
339                for proj, pf in sel:
             projFile = ProjFile(path)  
   
             for i in sel:  
                 proj = self.availprojs.GetClientData(i)[CLIENT_PROJ]  
340                  if proj is not None:                  if proj is not None:
341                      projFile.Add(proj)                      proj_file.Add(proj)
342                self.write_proj_file(proj_file)
             try:  
                 write_proj_file(projFile)  
             except IOError, (errno, errstr):  
                 self.__ShowError(dlg.GetPath(), errstr)  
343    
344          dlg.Destroy()          dlg.Destroy()
345    
346      def _OnRemove(self, event):      def _OnRemove(self, event):
347            """Handler for the 'Remove' button
348    
349          sel = self.availprojs.GetSelections()          Remove any selected projection that came from the user's
350            ProjFile. If the user ProjFile was modified write it back to
351            disk.
352            """
353            sel = self.projection_list.selected_projections()
354          assert len(sel) != 0, "button should be disabled!"          assert len(sel) != 0, "button should be disabled!"
355    
356          #          modified = False
357          # remove the items backwards so the indices don't change          for proj, pf in sel:
358          #              if proj is not None and pf is self.__usrProjFile:
359          sel = list(sel)                  pf.Remove(proj)
360          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)  
361    
362          self.__FillAvailList()          if modified:
363                self.write_proj_file(self.__usrProjFile)
364    
365          #      def _OnShowEPSG(self, event):
366          # this *could* produce incorrect results if the .proj files          """Handler for the EVT_CHECKBOX events from the EPSG check button
         # 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)  
367    
368          self.__VerifyButtons()          If the button is checked add the EPSG_PROJ_FILE to the list of
369            projfiles shown by the projection list. Otherwise remove it
370            """
371            proj_files = [self.load_user_proj(),
372                          self.load_system_proj(DEFAULT_PROJ_FILE)]
373            if self.check_epsg.IsChecked():
374                proj_files.append(self.load_system_proj(EPSG_PROJ_FILE))
375            if self.check_epsg_depr.IsChecked():
376                proj_files.append(self.load_system_proj(EPSG_DEPRECATED_PROJ_FILE))
377            self.projection_list.SetProjFiles(proj_files)
378    
379      def _OnProjName(self, event):      def _OnProjName(self, event):
380          self.__VerifyButtons()          self.__VerifyButtons()
381    
382      def __ShowError(self, filename, errstr):      def __ShowError(self, filename, errstr):
383          wxMessageDialog(self,          wxMessageDialog(self,
384              _("The following error occured:\n") +              _("The following error occured:\n") +
385              filename + "\n" + errstr,              filename + "\n" + errstr,
386              _("Error"), wxOK | wxICON_ERROR).ShowModal()              _("Error"), wxOK | wxICON_ERROR).ShowModal()
387    
388      def __VerifyButtons(self):      def __VerifyButtons(self):
389          """Enable or disable the appropriate buttons based on the          """Update button sensitivity"""
         current state of the dialog.  
         """  
390    
391          sel = self.availprojs.GetSelections()          num_sel = self.projection_list.GetSelectedItemCount()
392    
393          self.button_import.Enable(True)          self.button_import.Enable(True)
394          self.button_export.Enable(True)          self.button_export.Enable(True)
# Line 405  class ProjFrame(NonModalNonParentDialog) Line 410  class ProjFrame(NonModalNonParentDialog)
410          if self.curProjPanel is not None:          if self.curProjPanel is not None:
411              self.curProjPanel.Enable(True)              self.curProjPanel.Enable(True)
412    
413          if len(sel) == 0:          if num_sel == 0:
414              self.button_import.Enable(True)              self.button_import.Enable(True)
415              self.button_export.Enable(False)              self.button_export.Enable(False)
416              self.button_remove.Enable(False)              self.button_remove.Enable(False)
417              self.button_save.Enable(False)              self.button_save.Enable(False)
418    
419          elif len(sel) == 1:          elif num_sel == 1:
420    
421              proj, projFile = self.availprojs.GetClientData(sel[0])              selection = self.projection_list.selected_projections()
422                proj, projFile = selection[0]
423    
424              self.button_save.Enable(len(self.projname.GetValue()) > 0)              self.button_save.Enable(len(self.projname.GetValue()) > 0)
425              self.button_add.Enable(len(self.projname.GetValue()) > 0)              self.button_add.Enable(len(self.projname.GetValue()) > 0)
# Line 440  class ProjFrame(NonModalNonParentDialog) Line 446  class ProjFrame(NonModalNonParentDialog)
446          else:          else:
447              self.edit_box.Enable(False)              self.edit_box.Enable(False)
448    
449      def __DoOnProjAvail(self):      def proj_selection_changed(self, projs):
450            """Subscribed to the projection_list's PROJ_SELECTION_CHANGED message
         sel = self.availprojs.GetSelections()  
         if len(sel) == 1:  
   
             proj = self.availprojs.GetClientData(sel[0])[CLIENT_PROJ]  
             projfile = self.availprojs.GetClientData(sel[0])[CLIENT_PROJFILE]  
451    
452            Update the dialog to reflect the new selection.
453            """
454            if len(projs) == 0:
455                self.projfilepath.SetLabel(_("No Projections selected"))
456            elif len(projs) == 1:
457                proj, projfile = projs[0]
458              if proj is None:              if proj is None:
459                  # user selected <None>                  # user selected <None>
460                  self.projname.Clear()                  self.projname.Clear()
461                  self.projfilepath.SetLabel(_("Projection File: "))                  self.projfilepath.SetLabel("")
462              else:              else:
   
463                  if projfile is not None:                  if projfile is not None:
464                      self.projfilepath.SetLabel(_("Projection File: ") +                      filename = os.path.basename(projfile.GetFilename())
465                          os.path.basename(projfile.GetFilename()))                      self.projfilepath.SetLabel(_("Source of Projection: %s")
466                                                   % filename)
467                  else:                  else:
468                      # only None if the currently used projection is selected                      # only None if the currently used projection is selected
469                      self.projfilepath.SetLabel(_("Projection File: "))                      self.projfilepath.SetLabel("")
470    
471                  self.projname.SetValue(proj.Label())                  self.projname.SetValue(proj.Label())
472    
# Line 468  class ProjFrame(NonModalNonParentDialog) Line 475  class ProjFrame(NonModalNonParentDialog)
475                  for projType, name, cls in self.projection_panel_defs:                  for projType, name, cls in self.projection_panel_defs:
476                      if myProjType == projType:                      if myProjType == projType:
477                          self.projchoice.Enable(True)                          self.projchoice.Enable(True)
478                          self.projchoice.SetSelection(i)                          self.projchoice.SetSelection(i + 1)
479                          self.__DoOnProjChoice()                          self.__DoOnProjChoice()
480    
481                          #                          #
# Line 481  class ProjFrame(NonModalNonParentDialog) Line 488  class ProjFrame(NonModalNonParentDialog)
488                          break                          break
489                      i += 1                      i += 1
490                  else:                  else:
491                        self.projchoice.Select(0)
492                      self.projchoice.Disable()                      self.projchoice.Disable()
493                      self._show_proj_panel(UnknownProjPanel)                      self._show_proj_panel(UnknownProjPanel)
494                        assert self.curProjPanel is not None
495                        self.curProjPanel.SetProjection(proj)
496            else:
497                self.projfilepath.SetLabel(_("Multiple Projections selected"))
498    
499          self.__VerifyButtons()          self.__VerifyButtons()
500    
# Line 540  class ProjFrame(NonModalNonParentDialog) Line 552  class ProjFrame(NonModalNonParentDialog)
552          Could be None.          Could be None.
553          """          """
554    
555          sel = self.availprojs.GetSelections()          assert self.projection_list.GetSelectedItemCount() < 2, \
556          assert len(sel) < 2, "button should be disabled"                 "button should be disabled"
   
557    
558            sel = self.projection_list.selected_projections()
559          if len(sel) == 1:          if len(sel) == 1:
560              proj = self.availprojs.GetClientData(sel[0])[CLIENT_PROJ]              if sel[0][0] is None:
             if proj is None:  
561                  # <None> is selected                  # <None> is selected
562                  return None                  return None
563    
564          #          # self.curProjPanel should always contain the most relevant data
565          # self.curProjPanel should always contain the most          # for a projection
         # relevant data for a projection  
         #  
566          if self.curProjPanel is not None:          if self.curProjPanel is not None:
567              return Projection(self.curProjPanel.GetParameters(),              return Projection(self.curProjPanel.GetParameters(),
568                                self.projname.GetValue())                                self.projname.GetValue())
569    
570          return None          return None
571    
572      def __FillAvailList(self, selectCurrent = False, selectProj = None):      def load_user_proj(self):
573          """Populate the list of available projections.          """Return the user's ProjFile
           
         selectCurrent -- if True, select the projection used by  
                          the receiver, otherwise select nothing.  
         selectProj    -- if set, select the projection found under the  
                          specified name. This overwrites any other  
                          selection estimate.  
         """  
574    
575          self.availprojs.Clear()          If the file has not yet been loaded by the dialog, load it first
576            with get_user_proj_file and cache it in self.__usrProjFile.
577    
578          #          Show a busy cursor while loading the file.
579          # the list can never be empty. there will always be          """
580          # at least this one item          if self.__usrProjFile is None:
581          #              ThubanBeginBusyCursor()
582          self.availprojs.Append("<None>", (None, None))              try:
583                    projfile, warnings = get_user_proj_file()
584                    self.show_warnings(_("Warnings"), projfile.GetFilename(),
585                                       warnings)
586                    self.__usrProjFile = projfile
587                finally:
588                    ThubanEndBusyCursor()
589            return self.__usrProjFile
590    
591        def load_system_proj(self, name):
592            """Load the system ProjFile with the given name.
593    
594            If the file has not been loaded yet, load it first with
595            get_system_proj_file and put it into the cache. The name is
596            simply forwarded to get_system_proj_file.
597    
598          projfile, warnings = get_system_proj_file()          Show a busy cursor while loading the file.
599          self.show_warnings(_("Warnings"), projfile.GetFilename(), warnings)          """
600          for proj in projfile.GetProjections():          if name not in self._sys_proj_files:
601              self.availprojs.Append(proj.Label(), [proj, projfile])              ThubanBeginBusyCursor()
602          self.__sysProjFile = projfile              try:
603                    projfile, warnings = get_system_proj_file(name)
604                    self.show_warnings(_("Warnings"), projfile.GetFilename(),
605                                       warnings)
606                    self._sys_proj_files[name] = projfile
607                finally:
608                    ThubanEndBusyCursor()
609            return self._sys_proj_files[name]
610    
611          projfile, warnings = get_user_proj_file()      def write_proj_file(self, proj_file):
612          self.show_warnings(_("Warnings"), projfile.GetFilename(), warnings)          """Write the ProjFile object proj_file back to its file
613          for proj in projfile.GetProjections():  
614              self.availprojs.Append(proj.Label(), [proj, projfile])          Show a busy cursor while writing and if an error occurs show a
615          self.__usrProjFile = projfile          dialog with the error message.
616            """
617            try:
618                ThubanBeginBusyCursor()
619                try:
620                    write_proj_file(proj_file)
621                finally:
622                    ThubanEndBusyCursor()
623            except IOError, (errno, errstr):
624                self.__ShowError(proj_file.GetFilename(), errstr)
625    
         #  
         # 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.Label()  
             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)  
                     )  
626    
627    
628  class ProjPanel(wxPanel):  class ProjPanel(wxPanel):
# Line 621  class ProjPanel(wxPanel): Line 632  class ProjPanel(wxPanel):
632          wxPanel.__init__(self, parent, -1)          wxPanel.__init__(self, parent, -1)
633    
634          self.__ellps = wxChoice(self, -1)          self.__ellps = wxChoice(self, -1)
635          self.ellpsData = [("airy"  , _("Airy")),          self.ellpsData = [("", _("<Unknown>")),
636                              ("airy"  , _("Airy")),
637                            ("bessel", _("Bessel 1841")),                            ("bessel", _("Bessel 1841")),
638                            ("clrk66", _("Clarke 1866")),                            ("clrk66", _("Clarke 1866")),
639                            ("clrk80", _("Clarke 1880")),                            ("clrk80", _("Clarke 1880")),
640                            ("GRS80" , _("GRS 1980 (IUGG, 1980)")),                            ("GRS80" , _("GRS 1980 (IUGG, 1980)")),
641                            ("intl"  , _("International 1909 (Hayford)")),                            ("intl"  , _("International 1909 (Hayford)")),
# Line 669  class ProjPanel(wxPanel): Line 681  class ProjPanel(wxPanel):
681          self.__ellps.SetSelection(0)          self.__ellps.SetSelection(0)
682    
683      def GetParameters(self):      def GetParameters(self):
684          return ["ellps=" + self.__ellps.GetClientData(          ellps = self.__ellps.GetSelection()
685                                          self.__ellps.GetSelection())]          if ellps > 0:
686                return ["ellps=" + self.__ellps.GetClientData(ellps)]
687            return []
688    
689    
690  ID_TMPANEL_LAT = 4001  ID_TMPANEL_LAT = 4001
# Line 686  class UnknownProjPanel(ProjPanel): Line 700  class UnknownProjPanel(ProjPanel):
700      def __init__(self, parent, receiver):      def __init__(self, parent, receiver):
701          ProjPanel.__init__(self, parent)          ProjPanel.__init__(self, parent)
702    
703            self.__text = _("Thuban does not know the parameters\n"
704                            "for the current projection and cannot\n"
705                            "display a configuration panel.\n\n"
706                            "The unidentified set of parameters is:\n\n")
707    
708            self.__textbox = wxTextCtrl(self, -1, self.__text, size=(100,200),
709                                style=wxTE_READONLY|wxTE_MULTILINE|wxTE_LINEWRAP)
710          self._DoLayout()          self._DoLayout()
711    
712      def _DoLayout(self):      def _DoLayout(self):
713          sizer = wxBoxSizer(wxVERTICAL)          sizer = wxBoxSizer(wxVERTICAL)
714    
715          sizer.Add(wxStaticText(self, -1,          sizer.Add(self.__textbox, 0, wxALL|wxEXPAND, 4)
                                _("Thuban does not know the parameters\n"  
                                  "for the current projection and cannot\n"  
                                  "display a configuration panel.")))  
716    
717          ProjPanel._DoLayout(self, sizer)          ProjPanel._DoLayout(self, sizer)
718    
# Line 702  class UnknownProjPanel(ProjPanel): Line 720  class UnknownProjPanel(ProjPanel):
720          return "Unknown"          return "Unknown"
721    
722      def SetProjection(self, proj):      def SetProjection(self, proj):
723          pass          """Append the available parameters to the info text."""
724            text = self.__text
725            for param in proj.GetAllParameters():
726                text = text + '%s\n' % param
727            self.__textbox.SetValue(text)
728    
729      def GetParameters(self):      def GetParameters(self):
730          return None          return None
# Line 715  class TMPanel(ProjPanel): Line 737  class TMPanel(ProjPanel):
737    
738          self.__latitude = wxTextCtrl(self, ID_TMPANEL_LAT)          self.__latitude = wxTextCtrl(self, ID_TMPANEL_LAT)
739          self.__longitude = wxTextCtrl(self, ID_TMPANEL_LONG)          self.__longitude = wxTextCtrl(self, ID_TMPANEL_LONG)
         self.__scale = wxTextCtrl(self, ID_TMPANEL_SCALE)  
740          self.__falseEast = wxTextCtrl(self, ID_TMPANEL_FASLE_EAST)          self.__falseEast = wxTextCtrl(self, ID_TMPANEL_FASLE_EAST)
741          self.__falseNorth = wxTextCtrl(self, ID_TMPANEL_FALSE_NORTH)          self.__falseNorth = wxTextCtrl(self, ID_TMPANEL_FALSE_NORTH)
742            self.__scale = wxTextCtrl(self, ID_TMPANEL_SCALE)
743    
744          self._DoLayout()          self._DoLayout()
745    
# Line 852  class LCCPanel(ProjPanel): Line 874  class LCCPanel(ProjPanel):
874                    
875          self.__fspLatitude = wxTextCtrl(self, -1)          self.__fspLatitude = wxTextCtrl(self, -1)
876          self.__sspLatitude = wxTextCtrl(self, -1)          self.__sspLatitude = wxTextCtrl(self, -1)
         self.__originLat   = wxTextCtrl(self, -1)  
877          self.__meridian    = wxTextCtrl(self, -1)          self.__meridian    = wxTextCtrl(self, -1)
878            self.__originLat   = wxTextCtrl(self, -1)
879          self.__falseEast   = wxTextCtrl(self, -1)          self.__falseEast   = wxTextCtrl(self, -1)
880          self.__falseNorth  = wxTextCtrl(self, -1)          self.__falseNorth  = wxTextCtrl(self, -1)
881    

Legend:
Removed from v.1819  
changed lines
  Added in v.1941

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26