/[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 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  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 56  class ProjFrame(NonModalNonParentDialog) Line 60  class ProjFrame(NonModalNonParentDialog)
60              ("tmerc", _("Transverse Mercator"), TMPanel),              ("tmerc", _("Transverse Mercator"), TMPanel),
61              ("utm", _("Universal Transverse Mercator"), UTMPanel),              ("utm", _("Universal Transverse Mercator"), UTMPanel),
62              ("lcc", _("Lambert Conic Conformal"), LCCPanel),              ("lcc", _("Lambert Conic Conformal"), LCCPanel),
63              ("latlong", _("Geographic"), GeoPanel)]              ("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.build_dialog()          self.build_dialog()
72          self.Layout()          self.Layout()
73    
74          self.originalProjection = self.receiver.GetProjection()          self.originalProjection = self.receiver.GetProjection()
75    
76          self.__DoOnProjAvail()          self.projection_list.SelectProjection(self.originalProjection)
77          self.button_ok.SetFocus()          self.projection_list.SetFocus()
         self.availprojs.SetFocus()  
78    
79      def build_dialog(self):      def build_dialog(self):
80          """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 87  class ProjFrame(NonModalNonParentDialog)
87          #    The projection list and associated controls          #    The projection list and associated controls
88          #          #
89          vbox = wxBoxSizer(wxVERTICAL)          vbox = wxBoxSizer(wxVERTICAL)
90          main_box.Add(vbox, 0, wxALL|wxEXPAND)          main_box.Add(vbox, 4, wxALL|wxEXPAND)
91    
92          label = wxStaticText(self, -1, _("Available Projections:"))          #label = wxStaticText(self, -1, _("Available Projections:"))
93          vbox.Add(label, 0, wxLEFT|wxRIGHT|wxTOP, 4)          #vbox.Add(label, 0, wxLEFT|wxRIGHT|wxTOP, 4)
94    
95          hbox = wxBoxSizer(wxHORIZONTAL)          hbox = wxBoxSizer(wxHORIZONTAL)
96          vbox.Add(hbox, 1, wxALL|wxEXPAND)          vbox.Add(hbox, 1, wxALL|wxEXPAND)
97          self.availprojs = wxListBox(self, ID_PROJ_AVAIL,          self.projection_list = ProjectionList(self, self.load_system_proj(),
98                                      style=wxLB_EXTENDED|wxLB_SORT)                                                self.load_user_proj(),
99          EVT_LISTBOX(self, ID_PROJ_AVAIL, self._OnProjAvail)                                                self.receiver.GetProjection())
100          hbox.Add(self.availprojs, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)          hbox.Add(self.projection_list, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)
101          self.__FillAvailList(selectCurrent = True)          self.projection_list.Subscribe(PROJ_SELECTION_CHANGED,
102                                           self.proj_selection_changed)
103    
104          # Projection List specific actions (Import/Export/Remove)          # Projection List specific actions (Import/Export/Remove)
105          buttons = wxBoxSizer(wxVERTICAL)          buttons = wxBoxSizer(wxVERTICAL)
# Line 117  class ProjFrame(NonModalNonParentDialog) Line 124  class ProjFrame(NonModalNonParentDialog)
124          #          #
125          self.edit_box = wxStaticBox(self, -1, _("Edit"))          self.edit_box = wxStaticBox(self, -1, _("Edit"))
126          sizer_edit = wxStaticBoxSizer(self.edit_box, wxHORIZONTAL)          sizer_edit = wxStaticBoxSizer(self.edit_box, wxHORIZONTAL)
127          main_box.Add(sizer_edit, 1, wxALL|wxEXPAND)          main_box.Add(sizer_edit, 5, wxALL|wxEXPAND)
128    
129          # Projection Specific Entries (Name/Projection)          # Projection Specific Entries (Name/Projection)
130          self.sizer_projctrls = wxBoxSizer(wxVERTICAL)          self.sizer_projctrls = wxBoxSizer(wxVERTICAL)
# Line 144  class ProjFrame(NonModalNonParentDialog) Line 151  class ProjFrame(NonModalNonParentDialog)
151          self.sizer_projctrls.Add(self.nbsizer, 1,          self.sizer_projctrls.Add(self.nbsizer, 1,
152                                   wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)                                   wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)
153          self.projection_panels = []          self.projection_panels = []
154            self.projchoice.Append(_("<Unknown>"), "")
155          for proj_type, name, cls in self.projection_panel_defs:          for proj_type, name, cls in self.projection_panel_defs:
156              self.projchoice.Append(name, proj_type)              self.projchoice.Append(name, proj_type)
157              panel = cls(self, self.receiver)              panel = cls(self, self.receiver)
# Line 198  class ProjFrame(NonModalNonParentDialog) Line 206  class ProjFrame(NonModalNonParentDialog)
206          top_box.Fit(self)          top_box.Fit(self)
207          top_box.SetSizeHints(self)          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()
221          self.haveTried = True          self.haveTried = True
# Line 219  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 231  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.Label())  
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.Label())  
   
     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 280  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)  
348    
349          self.__FillAvailList()          if modified:
350                self.write_proj_file(self.__usrProjFile)
         #  
         # this *could* produce incorrect results if the .proj files  
         # 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)
# Line 405  class ProjFrame(NonModalNonParentDialog) Line 383  class ProjFrame(NonModalNonParentDialog)
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 440  class ProjFrame(NonModalNonParentDialog) Line 419  class ProjFrame(NonModalNonParentDialog)
419          else:          else:
420              self.edit_box.Enable(False)              self.edit_box.Enable(False)
421    
422      def __DoOnProjAvail(self):      def proj_selection_changed(self, projs):
423            """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]  
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.Label())                  self.projname.SetValue(proj.Label())
445    
# Line 468  class ProjFrame(NonModalNonParentDialog) Line 448  class ProjFrame(NonModalNonParentDialog)
448                  for projType, name, cls in self.projection_panel_defs:                  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 481  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._show_proj_panel(UnknownProjPanel)
467                        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 540  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()
556    
557          #      def load_system_proj(self):
558          # the list can never be empty. there will always be          ThubanBeginBusyCursor()
559          # at least this one item          try:
560          #              if self.__sysProjFile is None:
561          self.availprojs.Append("<None>", (None, None))                  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          projfile, warnings = get_system_proj_file()      def write_proj_file(self, proj_file):
570          self.show_warnings(_("Warnings"), projfile.GetFilename(), warnings)          """Write the ProjFile object proj_file back to its file
         for proj in projfile.GetProjections():  
             self.availprojs.Append(proj.Label(), [proj, projfile])  
         self.__sysProjFile = projfile  
571    
572          projfile, warnings = get_user_proj_file()          Show a busy cursor while writing and if an error occurs show a
573          self.show_warnings(_("Warnings"), projfile.GetFilename(), warnings)          dialog with the error message.
574          for proj in projfile.GetProjections():          """
575              self.availprojs.Append(proj.Label(), [proj, projfile])          try:
576          self.__usrProjFile = projfile              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    
         #  
         # 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)  
                     )  
584    
585    
586  class ProjPanel(wxPanel):  class ProjPanel(wxPanel):
# Line 621  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 669  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 686  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\n"  
                                  "for the current projection and cannot\n"  
                                  "display a configuration panel.")))  
674    
675          ProjPanel._DoLayout(self, sizer)          ProjPanel._DoLayout(self, sizer)
676    
# Line 702  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 715  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    
# Line 852  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.1819  
changed lines
  Added in v.1861

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26