/[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 1806 by bh, Fri Oct 10 10:36:34 2003 UTC revision 1854 by bh, Wed Oct 22 09:38:36 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 51  class ProjFrame(NonModalNonParentDialog) Line 56  class ProjFrame(NonModalNonParentDialog)
56          """          """
57          NonModalNonParentDialog.__init__(self, parent, name, title)          NonModalNonParentDialog.__init__(self, parent, name, title)
58    
59          self.projection_panels = [          self.projection_panel_defs = [
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),
# Line 59  class ProjFrame(NonModalNonParentDialog) Line 64  class ProjFrame(NonModalNonParentDialog)
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.build_dialog()          self.build_dialog()
71          self.Layout()          self.Layout()
72    
73          self.originalProjection = self.receiver.GetProjection()          self.originalProjection = self.receiver.GetProjection()
74    
75          self.__DoOnProjAvail()          self.projection_list.SelectProjection(self.originalProjection)
76          self.button_ok.SetFocus()          self.projection_list.SetFocus()
         self.availprojs.SetFocus()  
77    
78      def build_dialog(self):      def build_dialog(self):
79          """Build the dialog's widgets and set the event handlers"""          """Build the dialog's widgets and set the event handlers"""
# Line 80  class ProjFrame(NonModalNonParentDialog) Line 86  class ProjFrame(NonModalNonParentDialog)
86          #    The projection list and associated controls          #    The projection list and associated controls
87          #          #
88          vbox = wxBoxSizer(wxVERTICAL)          vbox = wxBoxSizer(wxVERTICAL)
89          main_box.Add(vbox, 0, wxALL|wxEXPAND)          main_box.Add(vbox, 4, wxALL|wxEXPAND)
90    
91          label = wxStaticText(self, -1, _("Available Projections:"))          #label = wxStaticText(self, -1, _("Available Projections:"))
92          vbox.Add(label, 0, wxLEFT|wxRIGHT|wxTOP, 4)          #vbox.Add(label, 0, wxLEFT|wxRIGHT|wxTOP, 4)
93    
94          hbox = wxBoxSizer(wxHORIZONTAL)          hbox = wxBoxSizer(wxHORIZONTAL)
95          vbox.Add(hbox, 1, wxALL|wxEXPAND)          vbox.Add(hbox, 1, wxALL|wxEXPAND)
96          self.availprojs = wxListBox(self, ID_PROJ_AVAIL,          self.projection_list = ProjectionList(self, self.load_system_proj(),
97                                      style=wxLB_EXTENDED|wxLB_SORT)                                                self.load_user_proj(),
98          EVT_LISTBOX(self, ID_PROJ_AVAIL, self._OnProjAvail)                                                self.receiver.GetProjection())
99          hbox.Add(self.availprojs, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)          hbox.Add(self.projection_list, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)
100          self.__FillAvailList(selectCurrent = True)          self.projection_list.Subscribe(PROJ_SELECTION_CHANGED,
101                                           self.proj_selection_changed)
102    
103          # Projection List specific actions (Import/Export/Remove)          # Projection List specific actions (Import/Export/Remove)
104          buttons = wxBoxSizer(wxVERTICAL)          buttons = wxBoxSizer(wxVERTICAL)
# Line 116  class ProjFrame(NonModalNonParentDialog) Line 123  class ProjFrame(NonModalNonParentDialog)
123          #          #
124          self.edit_box = wxStaticBox(self, -1, _("Edit"))          self.edit_box = wxStaticBox(self, -1, _("Edit"))
125          sizer_edit = wxStaticBoxSizer(self.edit_box, wxHORIZONTAL)          sizer_edit = wxStaticBoxSizer(self.edit_box, wxHORIZONTAL)
126          main_box.Add(sizer_edit, 1, wxALL|wxEXPAND)          main_box.Add(sizer_edit, 5, wxALL|wxEXPAND)
127    
128          # Projection Specific Entries (Name/Projection)          # Projection Specific Entries (Name/Projection)
129          self.sizer_projctrls = wxBoxSizer(wxVERTICAL)          self.sizer_projctrls = wxBoxSizer(wxVERTICAL)
# Line 139  class ProjFrame(NonModalNonParentDialog) Line 146  class ProjFrame(NonModalNonParentDialog)
146          EVT_CHOICE(self, ID_PROJ_PROJCHOICE, self._OnProjChoice)          EVT_CHOICE(self, ID_PROJ_PROJCHOICE, self._OnProjChoice)
147          hbox.Add(self.projchoice, 1, wxALL|wxEXPAND, 4)          hbox.Add(self.projchoice, 1, wxALL|wxEXPAND, 4)
148          # Fill the projection choice list.          # Fill the projection choice list.
149          for proj, name, clazz in self.projection_panels:          self.nbsizer = NotebookLikeSizer()
150              self.projchoice.Append(name, [clazz, None])          self.sizer_projctrls.Add(self.nbsizer, 1,
151                                     wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)
152            self.projection_panels = []
153            self.projchoice.Append(_("<Unknown>"), "")
154            for proj_type, name, cls in self.projection_panel_defs:
155                self.projchoice.Append(name, proj_type)
156                panel = cls(self, self.receiver)
157                panel.Hide()
158                panel.projection_index = len(self.projection_panels)
159                panel.projection_type = proj_type
160                self.projection_panels.append(panel)
161                self.nbsizer.Add(panel)
162            self.unknown_projection_panel = UnknownProjPanel(self, self.receiver)
163            self.unknown_projection_panel.Hide()
164            self.nbsizer.Add(self.unknown_projection_panel)
165    
166          # Projection Specific actions (New/Save/Add)          # Projection Specific actions (New/Save/Add)
167          buttons = wxBoxSizer(wxVERTICAL)          buttons = wxBoxSizer(wxVERTICAL)
# Line 184  class ProjFrame(NonModalNonParentDialog) Line 205  class ProjFrame(NonModalNonParentDialog)
205          top_box.Fit(self)          top_box.Fit(self)
206          top_box.SetSizeHints(self)          top_box.SetSizeHints(self)
207    
208        def OnClose(self, event):
209            self.projection_list.Unsubscribe(PROJ_SELECTION_CHANGED,
210                                             self.proj_selection_changed)
211            # Destroy the projection list explicitly so that it properly
212            # unsubscribes everything. It would be cleaner if the projection
213            # could do this by itself but wx doesn't always send destroy
214            # events for non-top-level widgets
215            self.projection_list.Destroy()
216            NonModalNonParentDialog.OnClose(self, event)
217    
218      def OnApply(self, event):      def OnApply(self, event):
219          self.__SetProjection()          self.__SetProjection()
220          self.haveTried = True          self.haveTried = True
# Line 205  class ProjFrame(NonModalNonParentDialog) Line 236  class ProjFrame(NonModalNonParentDialog)
236    
237      def _OnNew(self, event):      def _OnNew(self, event):
238    
239          # clear all selections          self.projection_list.ClearSelection()
         sel = self.availprojs.GetSelections()  
         for index in sel:  
             self.availprojs.SetSelection(index, False)  
   
240          self.projname.Clear()          self.projname.Clear()
241    
242          # supply a projection panel if there wasn't one          # supply a projection panel if there wasn't one
# Line 217  class ProjFrame(NonModalNonParentDialog) Line 244  class ProjFrame(NonModalNonParentDialog)
244              self.projchoice.SetSelection(0)              self.projchoice.SetSelection(0)
245              self.__DoOnProjChoice()              self.__DoOnProjChoice()
246    
247          self.curProjPanel.Clear()          if self.curProjPanel is not None:
248                self.curProjPanel.Clear()
249    
250      def _OnSave(self, event):      def _OnSave(self, event):
251    
252          sel = self.availprojs.GetSelections()          sel = self.projection_list.selected_projections()
253          assert len(sel) == 1,  "button shouldn't be enabled"          assert len(sel) == 1,  "button shouldn't be enabled"
254    
255          proj, projfile = self.availprojs.GetClientData(sel[0])          proj, projfile = sel[0]
256    
257          assert proj is not None and projfile is not None          assert proj is not None and projfile is not None
258    
259          newproj = self.__GetProjection()          newproj = self.__GetProjection()
260    
261          if newproj is not None:          if newproj is not None:
262                # FIXME: we should only allow this for the user proj file.
263              projfile.Replace(proj, newproj)              projfile.Replace(proj, newproj)
264              try:              self.write_proj_file(projfile)
265                  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())  
266    
267      def _OnAddToList(self, event):      def _OnAddToList(self, event):
268    
269          proj = self.__GetProjection()          proj = self.__GetProjection()
270          if proj is not None:          if proj is not None:
271              self.__usrProjFile.Add(proj)              self.__usrProjFile.Add(proj)
272              try:              self.write_proj_file(self.__usrProjFile)
273                  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()  
274    
275      def show_warnings(self, title, filename, warnings):      def show_warnings(self, title, filename, warnings):
276          """Show the warnings (a list of strings) in a dialog          """Show the warnings (a list of strings) in a dialog
# Line 266  class ProjFrame(NonModalNonParentDialog) Line 283  class ProjFrame(NonModalNonParentDialog)
283              self.parent.RunMessageBox(title, text)              self.parent.RunMessageBox(title, text)
284    
285      def _OnImport(self, event):      def _OnImport(self, event):
286            """Handler for the 'Import' button
287    
288            Ask the user for a filename, read the projections from that file
289            add them to the user ProjFile object and write the user file
290            back to disk.
291            """
292          dlg = wxFileDialog(self, _("Import"), style = wxOPEN)          dlg = wxFileDialog(self, _("Import"), style = wxOPEN)
293    
294          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
295              path = dlg.GetPath()              path = dlg.GetPath()
296    
297                ThubanBeginBusyCursor()
298              try:              try:
299                  projFile, warnings = read_proj_file(path)                  try:
300                  self.show_warnings(_("Warnings"), path, warnings)                      projFile, warnings = read_proj_file(path)
301                  for proj in projFile.GetProjections():                  except IOError, (errno, errstr):
302                      self.__usrProjFile.Add(proj)                      self.__ShowError(dlg.GetPath(), errstr)
303                  write_proj_file(self.__usrProjFile)                  else:
304              except IOError, (errno, errstr):                      self.show_warnings(_("Warnings"), path, warnings)
305                  self.__ShowError(dlg.GetPath(), errstr)                      for proj in projFile.GetProjections():
306                            self.__usrProjFile.Add(proj)
307              self.__FillAvailList()                      self.write_proj_file(self.__usrProjFile)
308                finally:
309                    ThubanEndBusyCursor()
310          dlg.Destroy()          dlg.Destroy()
311    
312      def _OnExport(self, event):      def _OnExport(self, event):
313            """Handler for the 'Export' button.
314    
315          sel = self.availprojs.GetSelections()          Ask the user for a filename and write the selected projections
316            to that file.
317            """
318            sel = self.projection_list.selected_projections()
319          assert len(sel) != 0, "button should be disabled"          assert len(sel) != 0, "button should be disabled"
320    
321          dlg = wxFileDialog(self, _("Export"),          dlg = wxFileDialog(self, _("Export"), style=wxSAVE|wxOVERWRITE_PROMPT)
                         style = wxSAVE|wxOVERWRITE_PROMPT)  
322    
323          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
324              path = dlg.GetPath()              proj_file = ProjFile(dlg.GetPath())
325                for proj, pf in sel:
             projFile = ProjFile(path)  
   
             for i in sel:  
                 proj = self.availprojs.GetClientData(i)[CLIENT_PROJ]  
326                  if proj is not None:                  if proj is not None:
327                      projFile.Add(proj)                      proj_file.Add(proj)
328                self.write_proj_file(proj_file)
             try:  
                 write_proj_file(projFile)  
             except IOError, (errno, errstr):  
                 self.__ShowError(dlg.GetPath(), errstr)  
329    
330          dlg.Destroy()          dlg.Destroy()
331    
332      def _OnRemove(self, event):      def _OnRemove(self, event):
333            """Handler for the 'Remove' button
334    
335          sel = self.availprojs.GetSelections()          Remove any selected projection that came from the user's
336            ProjFile. If the user ProjFile was modified write it back to
337            disk.
338            """
339            sel = self.projection_list.selected_projections()
340          assert len(sel) != 0, "button should be disabled!"          assert len(sel) != 0, "button should be disabled!"
341    
342          #          modified = False
343          # remove the items backwards so the indices don't change          for proj, pf in sel:
344          #              if proj is not None and pf is self.__usrProjFile:
345          sel = list(sel)                  pf.Remove(proj)
346          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()  
347    
348          #          if modified:
349          # 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()  
350    
351      def _OnProjName(self, event):      def _OnProjName(self, event):
352          self.__VerifyButtons()          self.__VerifyButtons()
353    
354      def __ShowError(self, filename, errstr):      def __ShowError(self, filename, errstr):
355          wxMessageDialog(self,          wxMessageDialog(self,
356              _("The following error occured:\n") +              _("The following error occured:\n") +
357              filename + "\n" + errstr,              filename + "\n" + errstr,
358              _("Error"), wxOK | wxICON_ERROR).ShowModal()              _("Error"), wxOK | wxICON_ERROR).ShowModal()
359    
360      def __VerifyButtons(self):      def __VerifyButtons(self):
361          """Enable or disable the appropriate buttons based on the          """Update button sensitivity"""
         current state of the dialog.  
         """  
362    
363          sel = self.availprojs.GetSelections()          num_sel = self.projection_list.GetSelectedItemCount()
364    
365          self.button_import.Enable(True)          self.button_import.Enable(True)
366          self.button_export.Enable(True)          self.button_export.Enable(True)
# Line 391  class ProjFrame(NonModalNonParentDialog) Line 382  class ProjFrame(NonModalNonParentDialog)
382          if self.curProjPanel is not None:          if self.curProjPanel is not None:
383              self.curProjPanel.Enable(True)              self.curProjPanel.Enable(True)
384    
385          if len(sel) == 0:          if num_sel == 0:
386              self.button_import.Enable(True)              self.button_import.Enable(True)
387              self.button_export.Enable(False)              self.button_export.Enable(False)
388              self.button_remove.Enable(False)              self.button_remove.Enable(False)
389              self.button_save.Enable(False)              self.button_save.Enable(False)
390    
391          elif len(sel) == 1:          elif num_sel == 1:
392    
393              proj, projFile = self.availprojs.GetClientData(sel[0])              selection = self.projection_list.selected_projections()
394                proj, projFile = selection[0]
395    
396              self.button_save.Enable(len(self.projname.GetValue()) > 0)              self.button_save.Enable(len(self.projname.GetValue()) > 0)
397              self.button_add.Enable(len(self.projname.GetValue()) > 0)              self.button_add.Enable(len(self.projname.GetValue()) > 0)
# Line 426  class ProjFrame(NonModalNonParentDialog) Line 418  class ProjFrame(NonModalNonParentDialog)
418          else:          else:
419              self.edit_box.Enable(False)              self.edit_box.Enable(False)
420    
421      def __DoOnProjAvail(self):      def proj_selection_changed(self, projs):
422            """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]  
423    
424            Update the dialog to reflect the new selection.
425            """
426            if len(projs) == 0:
427                self.projfilepath.SetLabel(_("No Projections selected"))
428            elif len(projs) == 1:
429                proj, projfile = projs[0]
430              if proj is None:              if proj is None:
431                  # user selected <None>                  # user selected <None>
432                  self.projname.Clear()                  self.projname.Clear()
433                  self.projfilepath.SetLabel(_("Projection File: "))                  self.projfilepath.SetLabel("")
434              else:              else:
               
435                  if projfile is not None:                  if projfile is not None:
436                      self.projfilepath.SetLabel(_("Projection File: ") +                      filename = os.path.basename(projfile.GetFilename())
437                          os.path.basename(projfile.GetFilename()))                      self.projfilepath.SetLabel(_("Source of Projection: %s")
438                                                   % filename)
439                  else:                  else:
440                      # only None if the currently used projection is selected                      # only None if the currently used projection is selected
441                      self.projfilepath.SetLabel(_("Projection File: "))                      self.projfilepath.SetLabel("")
442    
443                  self.projname.SetValue(proj.GetName())                  self.projname.SetValue(proj.Label())
444    
445                  myProjType = proj.GetParameter("proj")                  myProjType = proj.GetParameter("proj")
446                  i = 0                  i = 0
447                  for projType, name, clazz in self.projection_panels:                  for projType, name, cls in self.projection_panel_defs:
448                      if myProjType == projType:                      if myProjType == projType:
449                          self.projchoice.Enable(True)                          self.projchoice.Enable(True)
450                          self.projchoice.SetSelection(i)                          self.projchoice.SetSelection(i + 1)
451                          self.__DoOnProjChoice()                          self.__DoOnProjChoice()
452    
453                          #                          #
# Line 467  class ProjFrame(NonModalNonParentDialog) Line 460  class ProjFrame(NonModalNonParentDialog)
460                          break                          break
461                      i += 1                      i += 1
462                  else:                  else:
463                        self.projchoice.Select(0)
464                      self.projchoice.Disable()                      self.projchoice.Disable()
465                      self._show_proj_panel(UnknownProjPanel(self,                      self._show_proj_panel(UnknownProjPanel)
466                                                             self.receiver))          else:
467                self.projfilepath.SetLabel(_("Multiple Projections selected"))
468    
469          self.__VerifyButtons()          self.__VerifyButtons()
470    
# Line 490  class ProjFrame(NonModalNonParentDialog) Line 485  class ProjFrame(NonModalNonParentDialog)
485    
486          sel = choice.GetSelection()          sel = choice.GetSelection()
487          if sel != -1:          if sel != -1:
488              clazz, obj = choice.GetClientData(sel)              proj_type = choice.GetClientData(sel)
489              if obj is None:              for t, name, cls in self.projection_panel_defs:
490                  obj = clazz(self, self.receiver)                  if t == proj_type:
491                  choice.SetClientData(sel, [clazz, obj])                      self._show_proj_panel(cls)
492              self._show_proj_panel(obj)                      break
493            # FIXME: what to do if sel == -1?
494    
495      def _show_proj_panel(self, panel):      def _show_proj_panel(self, panel_class):
496          """Show the panel as the projection panel"""          """Show the panel as the projection panel"""
497          if self.curProjPanel is not None:          if panel_class is UnknownProjPanel:
498              self.curProjPanel.Hide()              self.edit_box.Disable()
499              self.sizer_projctrls.Remove(self.curProjPanel)              self.nbsizer.Activate(self.unknown_projection_panel)
500                self.curProjPanel = self.unknown_projection_panel
501          self.curProjPanel = panel          else:
502          self.curProjPanel.Show()              self.edit_box.Enable(True)
503                self.unknown_projection_panel.Hide()
504          self.sizer_projctrls.Add(self.curProjPanel, 1,              for panel in self.projection_panels:
505              wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)                  if panel.__class__ is panel_class:
506          self.sizer_projctrls.Layout()                      self.nbsizer.Activate(panel)
507          self.Layout()                      self.curProjPanel = panel
         self.topBox.SetSizeHints(self)  
508    
509      def __SetProjection(self):      def __SetProjection(self):
510          """Set the receiver's projection."""          """Set the receiver's projection."""
# Line 527  class ProjFrame(NonModalNonParentDialog) Line 522  class ProjFrame(NonModalNonParentDialog)
522          Could be None.          Could be None.
523          """          """
524    
525          sel = self.availprojs.GetSelections()          assert self.projection_list.GetSelectedItemCount() < 2, \
526          assert len(sel) < 2, "button should be disabled"                 "button should be disabled"
   
527    
528            sel = self.projection_list.selected_projections()
529          if len(sel) == 1:          if len(sel) == 1:
530              proj = self.availprojs.GetClientData(sel[0])[CLIENT_PROJ]              if sel[0][0] is None:
             if proj is None:  
531                  # <None> is selected                  # <None> is selected
532                  return None                  return None
533    
534          #          # self.curProjPanel should always contain the most relevant data
535          # self.curProjPanel should always contain the most          # for a projection
         # relevant data for a projection  
         #  
536          if self.curProjPanel is not None:          if self.curProjPanel is not None:
537              return Projection(self.curProjPanel.GetParameters(),              return Projection(self.curProjPanel.GetParameters(),
538                                self.projname.GetValue())                                self.projname.GetValue())
539    
540          return None          return None
541    
542      def __FillAvailList(self, selectCurrent = False, selectProj = None):      def load_user_proj(self):
543          """Populate the list of available projections.          ThubanBeginBusyCursor()
544                    try:
545          selectCurrent -- if True, select the projection used by              if self.__usrProjFile is None:
546                           the receiver, otherwise select nothing.                  projfile, warnings = get_user_proj_file()
547          selectProj    -- if set, select the projection found under the                  self.show_warnings(_("Warnings"), projfile.GetFilename(),
548                           specified name. This overwrites any other                                     warnings)
549                           selection estimate.                  self.__usrProjFile = projfile
550          """              return self.__usrProjFile
551            finally:
552          self.availprojs.Clear()              ThubanEndBusyCursor()
553    
554          #      def load_system_proj(self):
555          # the list can never be empty. there will always be          ThubanBeginBusyCursor()
556          # at least this one item          try:
557          #              if self.__sysProjFile is None:
558          self.availprojs.Append("<None>", (None, None))                  projfile, warnings = get_system_proj_file()
559                    self.show_warnings(_("Warnings"), projfile.GetFilename(),
560                                       warnings)
561                    self.__sysProjFile = projfile
562                return self.__sysProjFile
563            finally:
564                ThubanEndBusyCursor()
565    
566          projfile, warnings = get_system_proj_file()      def write_proj_file(self, proj_file):
567          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.GetName(), [proj, projfile])  
         self.__sysProjFile = projfile  
568    
569          projfile, warnings = get_user_proj_file()          Show a busy cursor while writing and if an error occurs show a
570          self.show_warnings(_("Warnings"), projfile.GetFilename(), warnings)          dialog with the error message.
571          for proj in projfile.GetProjections():          """
572              self.availprojs.Append(proj.GetName(), [proj, projfile])          try:
573          self.__usrProjFile = projfile              ThubanBeginBusyCursor()
574                try:
575                    write_proj_file(proj_file)
576                finally:
577                    ThubanEndBusyCursor()
578            except IOError, (errno, errstr):
579                self.__ShowError(proj_file.GetFilename(), errstr)
580    
         #  
         # 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)  
                     )  
581    
582    
583  class ProjPanel(wxPanel):  class ProjPanel(wxPanel):
# Line 608  class ProjPanel(wxPanel): Line 587  class ProjPanel(wxPanel):
587          wxPanel.__init__(self, parent, -1)          wxPanel.__init__(self, parent, -1)
588    
589          self.__ellps = wxChoice(self, -1)          self.__ellps = wxChoice(self, -1)
590          self.ellpsData = [("airy"  , _("Airy")),          self.ellpsData = [("", _("<Unknown>")),
591                              ("airy"  , _("Airy")),
592                            ("bessel", _("Bessel 1841")),                            ("bessel", _("Bessel 1841")),
593                            ("clrk66", _("Clarke 1866")),                            ("clrk66", _("Clarke 1866")),
594                            ("clrk80", _("Clarke 1880")),                            ("clrk80", _("Clarke 1880")),
595                            ("GRS80" , _("GRS 1980 (IUGG, 1980)")),                            ("GRS80" , _("GRS 1980 (IUGG, 1980)")),
596                            ("intl"  , _("International 1909 (Hayford)")),                            ("intl"  , _("International 1909 (Hayford)")),
# Line 656  class ProjPanel(wxPanel): Line 636  class ProjPanel(wxPanel):
636          self.__ellps.SetSelection(0)          self.__ellps.SetSelection(0)
637    
638      def GetParameters(self):      def GetParameters(self):
639          return ["ellps=" + self.__ellps.GetClientData(          ellps = self.__ellps.GetSelection()
640                                          self.__ellps.GetSelection())]          if ellps > 0:
641                return ["ellps=" + self.__ellps.GetClientData(ellps)]
642            return []
643    
644    
645  ID_TMPANEL_LAT = 4001  ID_TMPANEL_LAT = 4001
# Line 679  class UnknownProjPanel(ProjPanel): Line 661  class UnknownProjPanel(ProjPanel):
661          sizer = wxBoxSizer(wxVERTICAL)          sizer = wxBoxSizer(wxVERTICAL)
662    
663          sizer.Add(wxStaticText(self, -1,          sizer.Add(wxStaticText(self, -1,
664                                 _("Thuban does not know the parameters for the"                                 _("Thuban does not know the parameters\n"
665                                   " current projection\n"                                   "for the current projection and cannot\n"
666                                   "and cannot display a configuration panel.")))                                   "display a configuration panel.")))
667    
668          ProjPanel._DoLayout(self, sizer)          ProjPanel._DoLayout(self, sizer)
669    
# Line 702  class TMPanel(ProjPanel): Line 684  class TMPanel(ProjPanel):
684    
685          self.__latitude = wxTextCtrl(self, ID_TMPANEL_LAT)          self.__latitude = wxTextCtrl(self, ID_TMPANEL_LAT)
686          self.__longitude = wxTextCtrl(self, ID_TMPANEL_LONG)          self.__longitude = wxTextCtrl(self, ID_TMPANEL_LONG)
         self.__scale = wxTextCtrl(self, ID_TMPANEL_SCALE)  
687          self.__falseEast = wxTextCtrl(self, ID_TMPANEL_FASLE_EAST)          self.__falseEast = wxTextCtrl(self, ID_TMPANEL_FASLE_EAST)
688          self.__falseNorth = wxTextCtrl(self, ID_TMPANEL_FALSE_NORTH)          self.__falseNorth = wxTextCtrl(self, ID_TMPANEL_FALSE_NORTH)
689            self.__scale = wxTextCtrl(self, ID_TMPANEL_SCALE)
690    
691          self._DoLayout()          self._DoLayout()
692    
693      def _DoLayout(self):      def _DoLayout(self):
694    
695          sizer = wxFlexGridSizer(4, 4, 0, 0)          sizer = wxFlexGridSizer(4, 2, 0, 0)
696          sizer.Add(wxStaticText(self, -1, _("Latitude:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("Latitude:")), 0, wxALL, 4)
697          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)  
698          sizer.Add(wxStaticText(self, -1, _("Longitude:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("Longitude:")), 0, wxALL, 4)
699          sizer.Add(self.__longitude, 0, wxALL, 4)          sizer.Add(self.__longitude, 0, wxALL, 4)
700            sizer.Add(wxStaticText(self, -1, _("False Easting:")), 0, wxALL, 4)
701            sizer.Add(self.__falseEast, 0, wxALL, 4)
702          sizer.Add(wxStaticText(self, -1, _("False Northing:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("False Northing:")), 0, wxALL, 4)
703          sizer.Add(self.__falseNorth, 0, wxALL, 4)          sizer.Add(self.__falseNorth, 0, wxALL, 4)
704          sizer.Add(wxStaticText(self, -1, _("Scale Factor:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("Scale Factor:")), 0, wxALL, 4)
# Line 839  class LCCPanel(ProjPanel): Line 821  class LCCPanel(ProjPanel):
821                    
822          self.__fspLatitude = wxTextCtrl(self, -1)          self.__fspLatitude = wxTextCtrl(self, -1)
823          self.__sspLatitude = wxTextCtrl(self, -1)          self.__sspLatitude = wxTextCtrl(self, -1)
         self.__originLat   = wxTextCtrl(self, -1)  
824          self.__meridian    = wxTextCtrl(self, -1)          self.__meridian    = wxTextCtrl(self, -1)
825            self.__originLat   = wxTextCtrl(self, -1)
826          self.__falseEast   = wxTextCtrl(self, -1)          self.__falseEast   = wxTextCtrl(self, -1)
827          self.__falseNorth  = wxTextCtrl(self, -1)          self.__falseNorth  = wxTextCtrl(self, -1)
828    

Legend:
Removed from v.1806  
changed lines
  Added in v.1854

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26