/[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 816 by jonathan, Mon May 5 15:05:16 2003 UTC revision 1806 by bh, Fri Oct 10 10:36:34 2003 UTC
# Line 1  Line 1 
1  # Copyright (c) 2003 by Intevation GmbH  # Copyright (c) 2003 by Intevation GmbH
2  # Authors:  # Authors:
3  # Jonathan Coles <[email protected]>  # Jonathan Coles <[email protected]>
4    # Frank Koormann <[email protected]>
5    # Jan-Oliver Wagner <[email protected]>
6  #  #
7  # This program is free software under the GPL (>=v2)  # This program is free software under the GPL (>=v2)
8  # Read the file COPYING coming with Thuban for details.  # Read the file COPYING coming with Thuban for details.
9                                                                                    
10  import os, sys, math  """Projection dialog"""
11    
12    __version__ = "$Revision$"
13    # $Source$
14    # $Id$
15    
16    import os
17  from wxPython.wx import *  from wxPython.wx import *
18    
19  from Thuban import _  from Thuban import _
20    
21  from Thuban.Model.proj import Projection, ProjFile  from Thuban.Model.proj import Projection, ProjFile
22    
23  from Thuban.Model.resource import GetUserProjFiles, GetSystemProjFiles, \  from Thuban.Model.resource import get_user_proj_file, get_system_proj_file, \
24                                    ReadProjFile, WriteProjFile                                    read_proj_file, write_proj_file
25  from Thuban.UI.dialogs import NonModalDialog  from Thuban.UI.dialogs import NonModalNonParentDialog
26    
27    
28  ID_PROJ_ADVANCED  = 4001  ID_PROJ_ADVANCED  = 4001
# Line 32  ID_PROJ_PROJNAME  = 4014 Line 40  ID_PROJ_PROJNAME  = 4014
40  CLIENT_PROJ = 0  CLIENT_PROJ = 0
41  CLIENT_PROJFILE = 1  CLIENT_PROJFILE = 1
42    
43  class ProjFrame(NonModalDialog):  class ProjFrame(NonModalNonParentDialog):
44    
45      def __init__(self, parent, name, title, receiver):      def __init__(self, parent, name, title, receiver):
46          """Initialize the projection dialog.          """Initialize the projection dialog.
# Line 41  class ProjFrame(NonModalDialog): Line 49  class ProjFrame(NonModalDialog):
49                          SetProjection(projection)                          SetProjection(projection)
50                          GetProjection()                          GetProjection()
51          """          """
52                    NonModalNonParentDialog.__init__(self, parent, name, title)
53    
54            self.projection_panels = [
55                ("tmerc", _("Transverse Mercator"), TMPanel),
56                ("utm", _("Universal Transverse Mercator"), UTMPanel),
57                ("lcc", _("Lambert Conic Conformal"), LCCPanel),
58                ("latlong", _("Geographic"), GeoPanel)]
59          self.receiver = receiver          self.receiver = receiver
60          self.haveTried = False          self.haveTried = False
61          self.curProjPanel = None          self.curProjPanel = None
62    
63          self.projPanels = []          self.build_dialog()
64          self.projPanels.append(          self.Layout()
             ("tmerc", _("Transverse Mercator"), TMPanel))  
         self.projPanels.append(  
             ("utm", _("Universal Transverse Mercator"), UTMPanel))  
         self.projPanels.append(  
             ("lcc", _("Lambert Conic Conformal"), LCCPanel))  
         self.projPanels.append(  
             ("latlong", _("Geographic"), GeoPanel))  
   
         NonModalDialog.__init__(self, parent, name, title)  
         # originally generate by wxGlade  
         self.panel_1 = wxPanel(self, -1)  
         self.panel_edit = wxPanel(self, -1)  
         self.panel_buttons = wxPanel(self, -1)  
         self.label_5 = wxStaticText(self.panel_1, -1,  
                         _("Available Projections:"))  
         self.availprojs = wxListBox(self.panel_1, ID_PROJ_AVAIL,  
                                     style=wxLB_EXTENDED|wxLB_SORT)  
         self.projfilepath = wxStaticText(self.panel_1, -1, "")  
         self.label_2 = wxStaticText(self.panel_edit, -1, _("Name:"))  
         self.projname = wxTextCtrl(self.panel_edit, ID_PROJ_PROJNAME, "")  
         self.label_3 = wxStaticText(self.panel_edit, -1, _("Projection:"))  
         self.projchoice = wxChoice(self.panel_edit, ID_PROJ_PROJCHOICE)  
         self.button_import = wxButton(self.panel_1, ID_PROJ_IMPORT,  
                                       _("Import..."))  
         self.button_export = wxButton(self.panel_1, ID_PROJ_EXPORT,  
                                       _("Export..."))  
         self.button_remove = wxButton(self.panel_1, ID_PROJ_REMOVE, _("Remove"))  
         self.button_new = wxButton(self.panel_edit, ID_PROJ_NEW, _("New"))  
         self.button_save = wxButton(self.panel_edit, ID_PROJ_SAVE,_("Save"))  
         self.button_add = wxButton(self.panel_edit, ID_PROJ_ADDTOLIST,  
                                       _("Add to List"))  
         self.button_try = wxButton(self.panel_buttons, wxID_APPLY, _("Try"))  
         self.button_revert = wxButton(self.panel_buttons, ID_PROJ_REVERT,  
                                       _("Revert"))  
         self.button_ok = wxButton(self.panel_buttons, wxID_OK, _("OK"))  
         self.button_ok.SetDefault()  
         self.button_close = wxButton(self.panel_buttons, wxID_CANCEL,  
                                      _("Close"))  
   
         self.__set_properties()  
         self.__do_layout()  
         # wxGlade  
65    
66          self.originalProjection = self.receiver.GetProjection()          self.originalProjection = self.receiver.GetProjection()
67    
68          self.__DoOnProjAvail()          self.__DoOnProjAvail()
69          self.button_ok.SetFocus()          self.button_ok.SetFocus()
70          self.availprojs.SetFocus()          self.availprojs.SetFocus()
71            
72          EVT_BUTTON(self, wxID_APPLY, self.OnApply)      def build_dialog(self):
73          EVT_BUTTON(self, ID_PROJ_REVERT, self._OnRevert)          """Build the dialog's widgets and set the event handlers"""
74          EVT_BUTTON(self, wxID_OK, self.OnOK)          self.topBox = top_box = wxBoxSizer(wxVERTICAL)
75          EVT_BUTTON(self, wxID_CANCEL, self.OnCancel)  
76          EVT_CHOICE(self, ID_PROJ_PROJCHOICE, self._OnProjChoice)          main_box = wxBoxSizer(wxHORIZONTAL)
77            top_box.Add(main_box, 1, wxALL|wxEXPAND)
78    
79            #
80            #    The projection list and associated controls
81            #
82            vbox = wxBoxSizer(wxVERTICAL)
83            main_box.Add(vbox, 0, wxALL|wxEXPAND)
84    
85            label = wxStaticText(self, -1, _("Available Projections:"))
86            vbox.Add(label, 0, wxLEFT|wxRIGHT|wxTOP, 4)
87    
88            hbox = wxBoxSizer(wxHORIZONTAL)
89            vbox.Add(hbox, 1, wxALL|wxEXPAND)
90            self.availprojs = wxListBox(self, ID_PROJ_AVAIL,
91                                        style=wxLB_EXTENDED|wxLB_SORT)
92          EVT_LISTBOX(self, ID_PROJ_AVAIL, self._OnProjAvail)          EVT_LISTBOX(self, ID_PROJ_AVAIL, self._OnProjAvail)
93            hbox.Add(self.availprojs, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)
94            self.__FillAvailList(selectCurrent = True)
95    
96            # Projection List specific actions (Import/Export/Remove)
97            buttons = wxBoxSizer(wxVERTICAL)
98            hbox.Add(buttons, 0, wxALL)
99            self.button_import = wxButton(self, ID_PROJ_IMPORT, _("Import..."))
100          EVT_BUTTON(self, ID_PROJ_IMPORT, self._OnImport)          EVT_BUTTON(self, ID_PROJ_IMPORT, self._OnImport)
101            buttons.Add(self.button_import, 1, wxALL|wxEXPAND, 4)
102            self.button_export = wxButton(self, ID_PROJ_EXPORT, _("Export..."))
103          EVT_BUTTON(self, ID_PROJ_EXPORT, self._OnExport)          EVT_BUTTON(self, ID_PROJ_EXPORT, self._OnExport)
104            buttons.Add(self.button_export, 1, wxALL|wxEXPAND, 4)
105            buttons.Add(20, 20, 0, wxEXPAND, 0)
106            self.button_remove = wxButton(self, ID_PROJ_REMOVE, _("Remove"))
107          EVT_BUTTON(self, ID_PROJ_REMOVE, self._OnRemove)          EVT_BUTTON(self, ID_PROJ_REMOVE, self._OnRemove)
108            buttons.Add(self.button_remove, 1, wxALL|wxEXPAND, 4)
109    
110            # The file path
111            self.projfilepath = wxStaticText(self, -1, "")
112            vbox.Add(self.projfilepath, 0, wxALL|wxEXPAND)
113    
114            #
115            #   The projection editor part
116            #
117            self.edit_box = wxStaticBox(self, -1, _("Edit"))
118            sizer_edit = wxStaticBoxSizer(self.edit_box, wxHORIZONTAL)
119            main_box.Add(sizer_edit, 1, wxALL|wxEXPAND)
120    
121            # Projection Specific Entries (Name/Projection)
122            self.sizer_projctrls = wxBoxSizer(wxVERTICAL)
123            sizer_edit.Add(self.sizer_projctrls, 1, wxALL|wxEXPAND)
124    
125            hbox = wxBoxSizer(wxHORIZONTAL)
126            self.sizer_projctrls.Add(hbox, 0, wxALL|wxEXPAND)
127            label = wxStaticText(self, -1, _("Name:"))
128            hbox.Add(label, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)
129            self.projname = wxTextCtrl(self, ID_PROJ_PROJNAME, "")
130            EVT_TEXT(self, ID_PROJ_PROJNAME, self._OnProjName)
131            hbox.Add(self.projname, 1, wxALL|wxEXPAND, 4)
132    
133            hbox = wxBoxSizer(wxHORIZONTAL)
134            self.sizer_projctrls.Add(hbox, 0, wxALL|wxEXPAND)
135            label = wxStaticText(self, -1, _("Projection:"))
136            hbox.Add(label, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)
137            self.projchoice = wxChoice(self, ID_PROJ_PROJCHOICE)
138            self.projchoice.SetSelection(0)
139            EVT_CHOICE(self, ID_PROJ_PROJCHOICE, self._OnProjChoice)
140            hbox.Add(self.projchoice, 1, wxALL|wxEXPAND, 4)
141            # Fill the projection choice list.
142            for proj, name, clazz in self.projection_panels:
143                self.projchoice.Append(name, [clazz, None])
144    
145            # Projection Specific actions (New/Save/Add)
146            buttons = wxBoxSizer(wxVERTICAL)
147            sizer_edit.Add(buttons, 0, wxALL)
148            self.button_new = wxButton(self, ID_PROJ_NEW, _("New"))
149          EVT_BUTTON(self, ID_PROJ_NEW, self._OnNew)          EVT_BUTTON(self, ID_PROJ_NEW, self._OnNew)
150          EVT_BUTTON(self, ID_PROJ_SAVE, self._OnSave)          buttons.Add(self.button_new, 0, wxEXPAND|wxALL, 4)
151            self.button_add = wxButton(self, ID_PROJ_ADDTOLIST, _("Add to List"))
152          EVT_BUTTON(self, ID_PROJ_ADDTOLIST, self._OnAddToList)          EVT_BUTTON(self, ID_PROJ_ADDTOLIST, self._OnAddToList)
153            buttons.Add(self.button_add, 0, wxEXPAND|wxALL, 4)
154            buttons.Add(20, 20, 0, wxEXPAND, 0)
155            self.button_save = wxButton(self, ID_PROJ_SAVE,_("Update"))
156            EVT_BUTTON(self, ID_PROJ_SAVE, self._OnSave)
157            buttons.Add(self.button_save, 0, wxEXPAND|wxALL|wxALIGN_BOTTOM, 4)
158    
159          EVT_TEXT(self, ID_PROJ_PROJNAME, self._OnProjName)          #
160            # Main Action buttons (Try/Revert/OK/Close)
161            #
162            buttons = wxBoxSizer(wxHORIZONTAL)
163            top_box.Add(buttons, 0, wxALL|wxALIGN_RIGHT, 10)
164            self.button_try = wxButton(self, wxID_APPLY, _("Try"))
165            EVT_BUTTON(self, wxID_APPLY, self.OnApply)
166            buttons.Add(self.button_try, 0, wxRIGHT, 10)
167            self.button_revert = wxButton(self, ID_PROJ_REVERT, _("Revert"))
168            EVT_BUTTON(self, ID_PROJ_REVERT, self._OnRevert)
169            buttons.Add(self.button_revert, 0, wxRIGHT, 10)
170            self.button_ok = wxButton(self, wxID_OK, _("OK"))
171            EVT_BUTTON(self, wxID_OK, self.OnOK)
172            self.button_ok.SetDefault()
173            buttons.Add(self.button_ok, 0, wxRIGHT, 10)
174            self.button_close = wxButton(self, wxID_CANCEL, _("Close"))
175            EVT_BUTTON(self, wxID_CANCEL, self.OnCancel)
176            buttons.Add(self.button_close, 0, wxRIGHT, 10)
177    
178    
179            #
180            # Automatic Layout
181            #
182            self.SetAutoLayout(1)
183            self.SetSizer(top_box)
184            top_box.Fit(self)
185            top_box.SetSizeHints(self)
186    
187      def OnApply(self, event):      def OnApply(self, event):
188          self.__SetProjection()          self.__SetProjection()
189          self.haveTried = True          self.haveTried = True
# Line 133  class ProjFrame(NonModalDialog): Line 203  class ProjFrame(NonModalDialog):
203              self.receiver.SetProjection(self.originalProjection)              self.receiver.SetProjection(self.originalProjection)
204              self.haveTried = False              self.haveTried = False
205    
   
206      def _OnNew(self, event):      def _OnNew(self, event):
207    
208          # clear all selections          # clear all selections
# Line 164  class ProjFrame(NonModalDialog): Line 233  class ProjFrame(NonModalDialog):
233          if newproj is not None:          if newproj is not None:
234              projfile.Replace(proj, newproj)              projfile.Replace(proj, newproj)
235              try:              try:
236                  WriteProjFile(projfile)                  write_proj_file(projfile)
237              except IOError, (errno, errstr):              except IOError, (errno, errstr):
238                  self.__ShowError(projfile.GetFilename(), errstr)                  self.__ShowError(projfile.GetFilename(), errstr)
239              self.availprojs.SetClientData(sel[0], [newproj, projfile])              self.availprojs.SetClientData(sel[0], [newproj, projfile])
240    
241                self.__FillAvailList( selectProj = newproj.GetName())
242    
243      def _OnAddToList(self, event):      def _OnAddToList(self, event):
244    
245          proj = self.__GetProjection()          proj = self.__GetProjection()
246          if proj is not None:          if proj is not None:
247              self.__usrProjFile.Add(proj)              self.__usrProjFile.Add(proj)
248              try:              try:
249                  WriteProjFile(self.__usrProjFile)                  write_proj_file(self.__usrProjFile)
250              except IOError, (errno, errstr):              except IOError, (errno, errstr):
251                  self.__ShowError(self.__userProjFile.GetFilename(), errstr)                  self.__ShowError(self.__userProjFile.GetFilename(), errstr)
252    
253              self.__FillAvailList()              self.__FillAvailList( selectProj = proj.GetName())
254    
255      def _OnProjAvail(self, event):      def _OnProjAvail(self, event):
256          self.__DoOnProjAvail()          self.__DoOnProjAvail()
257    
258        def show_warnings(self, title, filename, warnings):
259            """Show the warnings (a list of strings) in a dialog
260    
261            If the list is empty no dialog will be shown.
262            """
263            if warnings:
264                text = (_('Warnings when reading "%s":\n\n%s')
265                        % (filename, "\n\n".join(warnings)))
266                self.parent.RunMessageBox(title, text)
267    
268      def _OnImport(self, event):      def _OnImport(self, event):
269    
270          dlg = wxFileDialog(self, _("Import"), style = wxOPEN)          dlg = wxFileDialog(self, _("Import"), style = wxOPEN)
# Line 192  class ProjFrame(NonModalDialog): Line 273  class ProjFrame(NonModalDialog):
273              path = dlg.GetPath()              path = dlg.GetPath()
274    
275              try:              try:
276                  projFile = ReadProjFile(path)                  projFile, warnings = read_proj_file(path)
277                    self.show_warnings(_("Warnings"), path, warnings)
278                  for proj in projFile.GetProjections():                  for proj in projFile.GetProjections():
279                      self.__usrProjFile.Add(proj)                      self.__usrProjFile.Add(proj)
280                  WriteProjFile(self.__usrProjFile)                  write_proj_file(self.__usrProjFile)
281              except IOError, (errno, errstr):              except IOError, (errno, errstr):
282                  self.__ShowError(dlg.GetPath(), errstr)                  self.__ShowError(dlg.GetPath(), errstr)
283    
# Line 222  class ProjFrame(NonModalDialog): Line 304  class ProjFrame(NonModalDialog):
304                      projFile.Add(proj)                      projFile.Add(proj)
305    
306              try:              try:
307                  WriteProjFile(projFile)                  write_proj_file(projFile)
308              except IOError, (errno, errstr):              except IOError, (errno, errstr):
309                  self.__ShowError(dlg.GetPath(), errstr)                  self.__ShowError(dlg.GetPath(), errstr)
310    
# Line 257  class ProjFrame(NonModalDialog): Line 339  class ProjFrame(NonModalDialog):
339                  projfile.Remove(proj)                  projfile.Remove(proj)
340    
341          try:          try:
342              WriteProjFile(projfile)              write_proj_file(projfile)
343          except IOError, (errno, errstr):          except IOError, (errno, errstr):
344              self.__ShowError(projfile.GetFilename(), errstr)              self.__ShowError(projfile.GetFilename(), errstr)
345    
# Line 294  class ProjFrame(NonModalDialog): Line 376  class ProjFrame(NonModalDialog):
376          self.button_save.Enable(True)          self.button_save.Enable(True)
377          self.button_remove.Enable(True)          self.button_remove.Enable(True)
378    
379          self.panel_edit.Enable(True)          self.edit_box.Enable(True)
380    
381          for ctrl in [self.button_import,          for ctrl in [self.button_import,
382                       self.button_export,                       self.button_export,
# Line 303  class ProjFrame(NonModalDialog): Line 385  class ProjFrame(NonModalDialog):
385                       self.button_add,                       self.button_add,
386                       self.projchoice,                       self.projchoice,
387                       self.projname,                       self.projname,
388                       self.panel_edit]:                       self.edit_box]:
389              ctrl.Enable(True)              ctrl.Enable(True)
390    
391          if self.curProjPanel is not None:          if self.curProjPanel is not None:
# Line 313  class ProjFrame(NonModalDialog): Line 395  class ProjFrame(NonModalDialog):
395              self.button_import.Enable(True)              self.button_import.Enable(True)
396              self.button_export.Enable(False)              self.button_export.Enable(False)
397              self.button_remove.Enable(False)              self.button_remove.Enable(False)
398                self.button_save.Enable(False)
399    
400          elif len(sel) == 1:          elif len(sel) == 1:
401    
# Line 341  class ProjFrame(NonModalDialog): Line 424  class ProjFrame(NonModalDialog):
424                  self.button_save.Enable(False)                  self.button_save.Enable(False)
425    
426          else:          else:
427              self.panel_edit.Enable(False)              self.edit_box.Enable(False)
428    
429      def __DoOnProjAvail(self):      def __DoOnProjAvail(self):
430    
# Line 354  class ProjFrame(NonModalDialog): Line 437  class ProjFrame(NonModalDialog):
437              if proj is None:              if proj is None:
438                  # user selected <None>                  # user selected <None>
439                  self.projname.Clear()                  self.projname.Clear()
440                                    self.projfilepath.SetLabel(_("Projection File: "))
441              else:              else:
442                            
443                  if projfile is not None:                  if projfile is not None:
444                      self.projfilepath.SetLabel(projfile.GetFilename())                      self.projfilepath.SetLabel(_("Projection File: ") +
445                            os.path.basename(projfile.GetFilename()))
446                  else:                  else:
447                      # only None if the currently used projection is selected                      # only None if the currently used projection is selected
448                      self.projfilepath.SetLabel("")                      self.projfilepath.SetLabel(_("Projection File: "))
449    
450                  self.projname.SetValue(proj.GetName())                  self.projname.SetValue(proj.GetName())
451    
452                  myProjType = proj.GetParameter("proj")                  myProjType = proj.GetParameter("proj")
453                  i = 0                  i = 0
454                  for projType, name, clazz in self.projPanels:                  for projType, name, clazz in self.projection_panels:
455                      if myProjType == projType:                      if myProjType == projType:
456                            self.projchoice.Enable(True)
457                          self.projchoice.SetSelection(i)                          self.projchoice.SetSelection(i)
458                          self.__DoOnProjChoice()                          self.__DoOnProjChoice()
459    
# Line 379  class ProjFrame(NonModalDialog): Line 464  class ProjFrame(NonModalDialog):
464                          assert self.curProjPanel is not None                          assert self.curProjPanel is not None
465    
466                          self.curProjPanel.SetProjection(proj)                          self.curProjPanel.SetProjection(proj)
467                            break
468                      i += 1                      i += 1
469                    else:
470                        self.projchoice.Disable()
471                        self._show_proj_panel(UnknownProjPanel(self,
472                                                               self.receiver))
473    
474          self.__VerifyButtons()          self.__VerifyButtons()
475    
# Line 396  class ProjFrame(NonModalDialog): Line 486  class ProjFrame(NonModalDialog):
486          At the end of this method self.curProjPanel will not be None          At the end of this method self.curProjPanel will not be None
487          if there was a item selected.          if there was a item selected.
488          """          """
   
489          choice = self.projchoice          choice = self.projchoice
490    
491          sel = choice.GetSelection()          sel = choice.GetSelection()
492          if sel != -1:          if sel != -1:
   
493              clazz, obj = choice.GetClientData(sel)              clazz, obj = choice.GetClientData(sel)
   
494              if obj is None:              if obj is None:
495                  obj = clazz(self.panel_edit, self.receiver)                  obj = clazz(self, self.receiver)
496                  choice.SetClientData(sel, [clazz, obj])                  choice.SetClientData(sel, [clazz, obj])
497                self._show_proj_panel(obj)
498    
499              if self.curProjPanel is not None:      def _show_proj_panel(self, panel):
500                  self.curProjPanel.Hide()          """Show the panel as the projection panel"""
501                  self.sizer_projctrls.Remove(self.curProjPanel)          if self.curProjPanel is not None:
502                self.curProjPanel.Hide()
503              self.curProjPanel = obj              self.sizer_projctrls.Remove(self.curProjPanel)
504              self.curProjPanel.Show()  
505            self.curProjPanel = panel
506              self.sizer_projctrls.Add(self.curProjPanel, 1,          self.curProjPanel.Show()
507                  wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)  
508              self.sizer_projctrls.Layout()          self.sizer_projctrls.Add(self.curProjPanel, 1,
509              self.Layout()              wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)
510              self.topBox.SetSizeHints(self)          self.sizer_projctrls.Layout()
511            self.Layout()
512            self.topBox.SetSizeHints(self)
513    
514      def __SetProjection(self):      def __SetProjection(self):
515          """Set the receiver's projection."""          """Set the receiver's projection."""
# Line 457  class ProjFrame(NonModalDialog): Line 547  class ProjFrame(NonModalDialog):
547    
548          return None          return None
549    
550      def __FillAvailList(self, selectCurrent = False):      def __FillAvailList(self, selectCurrent = False, selectProj = None):
551          """Populate the list of available projections.          """Populate the list of available projections.
552                    
553          selectCurrent -- if True, select the projection used by          selectCurrent -- if True, select the projection used by
554                           the receiver, otherwise select nothing.                           the receiver, otherwise select nothing.
555            selectProj    -- if set, select the projection found under the
556                             specified name. This overwrites any other
557                             selection estimate.
558          """          """
559    
560          self.availprojs.Clear()          self.availprojs.Clear()
561    
562          #          #
         # We add the current projection to the list first so that  
         # we are sure that it's at index 0. That way we can  
         # set the selection with confidence. The problem is the  
         # the list is automatically sorted when an item is appended  
         # and the index of where it was inserted is not returned.  
         #  
         proj = self.receiver.GetProjection()  
         if proj is not None:  
             self.availprojs.Append(_("%s (current)") % proj.GetName(),  
                                    [proj, None])  
             if selectCurrent:  
                 self.availprojs.SetSelection(0)  
                 self.availprojs.SetFirstItem(0)  
   
         #  
563          # the list can never be empty. there will always be          # the list can never be empty. there will always be
564          # at least this one item          # at least this one item
565          #          #
566          self.availprojs.Append("<None>", (None, None))          self.availprojs.Append("<None>", (None, None))
567    
568          # proj is only None when <None> should be selected          projfile, warnings = get_system_proj_file()
569          if proj is None and selectCurrent:          self.show_warnings(_("Warnings"), projfile.GetFilename(), warnings)
             self.availprojs.SetSelection(0)  
             self.availprojs.SetFirstItem(0)  
   
         projfile = GetSystemProjFiles()  
         projfile = projfile[0]  
570          for proj in projfile.GetProjections():          for proj in projfile.GetProjections():
571              self.availprojs.Append(proj.GetName(), [proj, projfile])              self.availprojs.Append(proj.GetName(), [proj, projfile])
572          self.__sysProjFile = projfile          self.__sysProjFile = projfile
573    
574          projfile = GetUserProjFiles()          projfile, warnings = get_user_proj_file()
575          projfile = projfile[0]          self.show_warnings(_("Warnings"), projfile.GetFilename(), warnings)
576          for proj in projfile.GetProjections():          for proj in projfile.GetProjections():
577              self.availprojs.Append(proj.GetName(), [proj, projfile])              self.availprojs.Append(proj.GetName(), [proj, projfile])
578          self.__usrProjFile = projfile          self.__usrProjFile = projfile
579    
580          for proj, name, clazz in self.projPanels:          #
581              self.projchoice.Append(name, [clazz, None])          # We add the current projection to the list at last.
582            # Since the list is resorted immediately a following FindString()
583      def __set_properties(self):          # determines the index correctly.
584            #
585          #self.availprojs.SetSelection(0)          proj = self.receiver.GetProjection()
586          self.projchoice.SetSelection(0)          if proj is not None:
587                proj_item = _("%s (current)") % proj.GetName()
588          self.__FillAvailList(selectCurrent = True)              self.availprojs.Append(proj_item, [proj, None])
589                if selectCurrent:
590          self.projname.SetMaxLength(32)                  self.availprojs.SetSelection(
591                            self.availprojs.FindString(proj_item)
592      def __do_layout(self):                      )
593          # originally generated by wxGlade          else:
594                if selectCurrent:
595          self.topBox = wxBoxSizer(wxVERTICAL)                  self.availprojs.SetSelection(
596          self.sizer_panel = wxBoxSizer(wxVERTICAL)                          self.availprojs.FindString("<None>")
597          sizer_6 = wxBoxSizer(wxHORIZONTAL)                      )
598          self.sizer_mainctrls = wxBoxSizer(wxHORIZONTAL)          if selectProj:
599          self.sizer_edit = wxStaticBoxSizer(wxStaticBox(self.panel_edit, -1, _("Edit")), wxHORIZONTAL)              self.availprojs.SetSelection(
600          sizer_11 = wxBoxSizer(wxVERTICAL)                          self.availprojs.FindString(selectProj)
601          self.sizer_projctrls = wxBoxSizer(wxVERTICAL)                      )
         sizer_14 = wxBoxSizer(wxHORIZONTAL)  
         sizer_13 = wxBoxSizer(wxHORIZONTAL)  
         sizer_15 = wxBoxSizer(wxVERTICAL)  
         sizer_15.Add(self.button_import, 0, wxALL, 4)  
         sizer_15.Add(self.button_export, 0, wxALL, 4)  
         sizer_15.Add(20, 20, 0, wxEXPAND, 0)  
         sizer_15.Add(self.button_remove, 0, wxALL|wxALIGN_BOTTOM, 4)  
   
         # list controls  
         grid_sizer_1 = wxFlexGridSizer(3, 2, 0, 0)  
         grid_sizer_1.Add(self.label_5, 0, wxLEFT|wxRIGHT|wxTOP, 4)  
         grid_sizer_1.Add(20, 20, 0, wxEXPAND, 0)  
         grid_sizer_1.Add(self.availprojs, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)  
         grid_sizer_1.Add(sizer_15, 0, wxALL|wxEXPAND, 4)  
         grid_sizer_1.Add(self.projfilepath, 0, wxALL|wxADJUST_MINSIZE, 4)  
         grid_sizer_1.AddGrowableRow(1)  
         grid_sizer_1.AddGrowableCol(0)  
   
         # edit controls  
         sizer_13.Add(self.label_2, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)  
         sizer_13.Add(self.projname, 1, wxALL, 4)  
         self.sizer_projctrls.Add(sizer_13, 0, wxEXPAND, 0)  
         sizer_14.Add(self.label_3, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)  
         sizer_14.Add(self.projchoice, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)  
         self.sizer_projctrls.Add(sizer_14, 0, wxEXPAND, 0)  
         self.sizer_edit.Add(self.sizer_projctrls, 1, wxEXPAND, 0)  
         sizer_11.Add(self.button_new, 0, wxALL|wxEXPAND, 4)  
         sizer_11.Add(self.button_save, 0, wxALL|wxEXPAND, 4)  
         sizer_11.Add(self.button_add, 0, wxALL|wxEXPAND, 4)  
         self.sizer_edit.Add(sizer_11, 0, wxALL|wxEXPAND, 4)  
   
         sizer_6.Add(20, 20, 1, wxEXPAND, 0)  
         sizer_6.Add(self.button_try, 0, wxALL, 4)  
         sizer_6.Add(20, 20, 1, 0, 0)  
         sizer_6.Add(self.button_revert, 0, wxALL, 4)  
         sizer_6.Add(20, 20, 1, 0, 0)  
         sizer_6.Add(self.button_ok, 0, wxALL, 4)  
         sizer_6.Add(20, 20, 1, 0, 0)  
         sizer_6.Add(self.button_close, 0, wxALL, 4)  
         sizer_6.Add(20, 20, 1, wxEXPAND, 0)  
   
         self.panel_1.SetAutoLayout(1)  
         self.panel_1.SetSizer(grid_sizer_1)  
         grid_sizer_1.Fit(self.panel_1)  
         grid_sizer_1.SetSizeHints(self.panel_1)  
   
         self.panel_edit.SetAutoLayout(1)  
         self.panel_edit.SetSizer(self.sizer_edit)  
         self.sizer_edit.Fit(self.panel_edit)  
         self.sizer_edit.SetSizeHints(self.panel_edit)  
   
         self.panel_buttons.SetAutoLayout(1)  
         self.panel_buttons.SetSizer(sizer_6)  
         sizer_6.Fit(self.panel_buttons)  
         sizer_6.SetSizeHints(self.panel_buttons)  
   
         self.sizer_mainctrls.Add(self.panel_1, 0,  
             wxALL|wxEXPAND|wxADJUST_MINSIZE, 0)  
         self.sizer_mainctrls.Add(self.panel_edit, 1,  
             wxALL|wxEXPAND|wxADJUST_MINSIZE, 0)  
   
         self.topBox.Add(self.sizer_mainctrls, 1, wxALL|wxEXPAND, 4)  
         self.topBox.Add(self.panel_buttons, 0, wxEXPAND, 0)  
   
         self.SetAutoLayout(1)  
         self.SetSizer(self.topBox)  
         self.topBox.Fit(self)  
         self.topBox.SetSizeHints(self)  
         self.Layout()  
   
 # end of class ProjFrame  
602    
603    
604  class ProjPanel(wxPanel):  class ProjPanel(wxPanel):
# Line 623  class ProjPanel(wxPanel): Line 625  class ProjPanel(wxPanel):
625    
626          panelSizer = wxBoxSizer(wxVERTICAL)          panelSizer = wxBoxSizer(wxVERTICAL)
627    
         if childPanel is not None:  
             panelSizer.Add(childPanel, 0, wxEXPAND, 0)  
               
628          sizer = wxBoxSizer(wxHORIZONTAL)          sizer = wxBoxSizer(wxHORIZONTAL)
629          sizer.Add(wxStaticText(self, -1, _("Ellipsoid:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("Ellipsoid:")), 0,
630          sizer.Add(self.__ellps, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)                                      wxALL|wxALIGN_CENTER_VERTICAL, 4)
631            sizer.Add(self.__ellps, 1, wxALL|wxALIGN_CENTER_VERTICAL, 4)
632          panelSizer.Add(sizer, 0, wxALL|wxEXPAND, 4)          panelSizer.Add(sizer, 0, wxALL|wxEXPAND, 4)
633    
634            if childPanel is not None:
635                panelSizer.Add(childPanel, 0, wxEXPAND, 0)
636                
637          self.SetAutoLayout(1)          self.SetAutoLayout(1)
638          self.SetSizer(panelSizer)          self.SetSizer(panelSizer)
639          panelSizer.Fit(self)          panelSizer.Fit(self)
# Line 664  ID_TMPANEL_FALSE_NORTH = 4004 Line 667  ID_TMPANEL_FALSE_NORTH = 4004
667  ID_TMPANEL_SCALE = 4005  ID_TMPANEL_SCALE = 4005
668    
669  class UnknownProjPanel(ProjPanel):  class UnknownProjPanel(ProjPanel):
670    
671        """Panel for unknown projection types"""
672    
673      def __init__(self, parent, receiver):      def __init__(self, parent, receiver):
674          ProjPanel.__init__(self, parent)          ProjPanel.__init__(self, parent)
675    
# Line 672  class UnknownProjPanel(ProjPanel): Line 678  class UnknownProjPanel(ProjPanel):
678      def _DoLayout(self):      def _DoLayout(self):
679          sizer = wxBoxSizer(wxVERTICAL)          sizer = wxBoxSizer(wxVERTICAL)
680    
681          sizer.Add(wxStaticText(self, -1,          sizer.Add(wxStaticText(self, -1,
682              _("Thuban does not know the parameters for the " +                                 _("Thuban does not know the parameters for the"
683                "current projection and cannot display a " +                                   " current projection\n"
684                "configuration panel.")))                                   "and cannot display a configuration panel.")))
685    
686          ProjPanel._DoLayout(self, sizer)          ProjPanel._DoLayout(self, sizer)
687    
# Line 696  class TMPanel(ProjPanel): Line 702  class TMPanel(ProjPanel):
702    
703          self.__latitude = wxTextCtrl(self, ID_TMPANEL_LAT)          self.__latitude = wxTextCtrl(self, ID_TMPANEL_LAT)
704          self.__longitude = wxTextCtrl(self, ID_TMPANEL_LONG)          self.__longitude = wxTextCtrl(self, ID_TMPANEL_LONG)
705            self.__scale = wxTextCtrl(self, ID_TMPANEL_SCALE)
706          self.__falseEast = wxTextCtrl(self, ID_TMPANEL_FASLE_EAST)          self.__falseEast = wxTextCtrl(self, ID_TMPANEL_FASLE_EAST)
707          self.__falseNorth = wxTextCtrl(self, ID_TMPANEL_FALSE_NORTH)          self.__falseNorth = wxTextCtrl(self, ID_TMPANEL_FALSE_NORTH)
         self.__scale = wxTextCtrl(self, ID_TMPANEL_SCALE)  
708    
709          self._DoLayout()          self._DoLayout()
710    
# Line 806  class UTMPanel(ProjPanel): Line 812  class UTMPanel(ProjPanel):
812          ProjPanel.Clear(self)          ProjPanel.Clear(self)
813    
814      def _OnPropose(self, event):      def _OnPropose(self, event):
815          UTMProposeZoneDialog          """Call the propose dialog.
816            If the receiver (e.g. the current map) has no bounding box,
817            inform the user accordingly.
818            """
819            bb = self.receiver.BoundingBox()
820            if bb is None:
821                dlg = wxMessageDialog(self,
822                        _("Can not propose: No bounding box found."),
823                        _("Projection: Propose UTM Zone"),
824                        wxOK | wxICON_INFORMATION)
825                dlg.CenterOnParent()
826                result = dlg.ShowModal()
827                dlg.Destroy()
828                return
829    
830          dlg = UTMProposeZoneDialog(self, self.receiver.BoundingBox())          dlg = UTMProposeZoneDialog(self, self.receiver.BoundingBox())
831          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
832              self.__zone.SetValue(dlg.GetProposedZone())              self.__zone.SetValue(dlg.GetProposedZone())
# Line 835  class LCCPanel(ProjPanel): Line 855  class LCCPanel(ProjPanel):
855          sizer.Add(wxStaticText(self, -1,          sizer.Add(wxStaticText(self, -1,
856              _("Latitude of second standard parallel:")))              _("Latitude of second standard parallel:")))
857          sizer.Add(self.__sspLatitude, 0, wxALL, 4)          sizer.Add(self.__sspLatitude, 0, wxALL, 4)
         sizer.Add(wxStaticText(self, -1, _("Latitude of origin:")))  
         sizer.Add(self.__originLat, 0, wxALL, 4)  
858          sizer.Add(wxStaticText(self, -1, _("Central Meridian:")))          sizer.Add(wxStaticText(self, -1, _("Central Meridian:")))
859          sizer.Add(self.__meridian, 0, wxALL, 4)          sizer.Add(self.__meridian, 0, wxALL, 4)
860            sizer.Add(wxStaticText(self, -1, _("Latitude of origin:")))
861            sizer.Add(self.__originLat, 0, wxALL, 4)
862          sizer.Add(wxStaticText(self, -1, _("False Easting:")))          sizer.Add(wxStaticText(self, -1, _("False Easting:")))
863          sizer.Add(self.__falseEast, 0, wxALL, 4)          sizer.Add(self.__falseEast, 0, wxALL, 4)
864          sizer.Add(wxStaticText(self, -1, _("False Northing:")))          sizer.Add(wxStaticText(self, -1, _("False Northing:")))
# Line 887  class GeoPanel(ProjPanel): Line 907  class GeoPanel(ProjPanel):
907      def __init__(self, parent, receiver):      def __init__(self, parent, receiver):
908          ProjPanel.__init__(self, parent)          ProjPanel.__init__(self, parent)
909    
910          self.__choices = [(_("Radians"), "1"),          self.__choices = [(_("Degrees"), "0.017453"),
911                            (_("Degrees"), "0.017453")]                            (_("Radians"), "1")]
912    
913          self.__scale = wxChoice(self, -1)          self.__scale = wxChoice(self, -1)
914          for choice, value in self.__choices:          for choice, value in self.__choices:
# Line 922  class GeoPanel(ProjPanel): Line 942  class GeoPanel(ProjPanel):
942          sizer = wxBoxSizer(wxHORIZONTAL)          sizer = wxBoxSizer(wxHORIZONTAL)
943    
944          sizer.Add(wxStaticText(self, -1, _("Source Data is in: ")),          sizer.Add(wxStaticText(self, -1, _("Source Data is in: ")),
945                    0, wxALL, 4)                    0, wxALL|wxALIGN_CENTER_VERTICAL, 4)
946          sizer.Add(self.__scale, 1, wxEXPAND|wxALL, 4)          sizer.Add(self.__scale, 1, wxEXPAND|wxALL, 4)
947    
948          self.__scale.SetSelection(0)          self.__scale.SetSelection(0)
# Line 933  class GeoPanel(ProjPanel): Line 953  class GeoPanel(ProjPanel):
953  ID_UTM_PROPOSE_ZONE_DIALOG_TAKE   = 4001  ID_UTM_PROPOSE_ZONE_DIALOG_TAKE   = 4001
954  ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL = 4002  ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL = 4002
955  class UTMProposeZoneDialog(wxDialog):  class UTMProposeZoneDialog(wxDialog):
956                                                                                    
957      """Propose a sensible Zone considering the current map extent."""      """Propose a sensible Zone considering the current map extent."""
958                                                                                    
959      def __init__(self, parent, (x, y, x2, y2)):      def __init__(self, parent, (x, y, x2, y2)):
960          wxDialog.__init__(self, parent, -1, _("Projection: Propose UTM Zone"),          wxDialog.__init__(self, parent, -1, _("Projection: Propose UTM Zone"),
961                            wxDefaultPosition, wxSize(200, 100))                            wxDefaultPosition, wxSize(200, 100))
962          self.parent = parent          self.parent = parent
         #x, y, x2, y2 = elf.parent.parent.map_bounding_box  
963          x = x + 180          x = x + 180
964          x2 = x2 + 180          x2 = x2 + 180
965          center = (x2 - x) / 2 + x          center = (x2 - x) / 2 + x
966          self.proposedZone = int(center / 6 + 1)          self.proposedZone = int(center / 6 + 1)
967          self.dialogLayout()          self.dialogLayout()
968                                                                                    
969      def dialogLayout(self):      def dialogLayout(self):
970          topBox = wxBoxSizer(wxVERTICAL)          topBox = wxBoxSizer(wxVERTICAL)
971                                                                                    
972          textBox = wxBoxSizer(wxVERTICAL)          textBox = wxBoxSizer(wxVERTICAL)
973          textBox.Add(wxStaticText(self, -1, _("The current map extent center " +          textBox.Add(wxStaticText(self, -1, _("The current map extent center "
974                                             "lies in UTM Zone")),                                               "lies in UTM Zone")),
975                      0, wxALIGN_CENTER|wxALL, 4)                      0, wxALIGN_CENTER|wxALL, 4)
976          textBox.Add(wxStaticText(self, -1, str(self.proposedZone)),          textBox.Add(wxStaticText(self, -1, str(self.proposedZone)),
977                      0, wxALIGN_CENTER|wxALL, 4)                      0, wxALIGN_CENTER|wxALL, 4)
978                                                                                    
979          topBox.Add(textBox, 1, wxEXPAND|wxALL, 4)          topBox.Add(textBox, 1, wxEXPAND|wxALL, 4)
980                                                                                    
981          buttonBox = wxBoxSizer(wxHORIZONTAL)          buttonBox = wxBoxSizer(wxHORIZONTAL)
982          buttonBox.Add(wxButton(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE,          buttonBox.Add(wxButton(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE,
983                        _("Take")), 0, wxALL, 4)                        _("Take")), 0, wxALL, 4)
# Line 967  class UTMProposeZoneDialog(wxDialog): Line 986  class UTMProposeZoneDialog(wxDialog):
986          topBox.Add(buttonBox, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10)          topBox.Add(buttonBox, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10)
987          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE, self.OnTake)          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE, self.OnTake)
988          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL, self.OnCancel)          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL, self.OnCancel)
989                                                                                    
990          self.SetAutoLayout(True)          self.SetAutoLayout(True)
991          self.SetSizer(topBox)          self.SetSizer(topBox)
992          topBox.Fit(self)          topBox.Fit(self)
993          topBox.SetSizeHints(self)          topBox.SetSizeHints(self)
994                                                                                    
995      def OnTake(self, event):      def OnTake(self, event):
996          self.EndModal(wxID_OK)          self.EndModal(wxID_OK)
997                                                                                    
998      def OnCancel(self, event):      def OnCancel(self, event):
999          self.EndModal(wxID_CANCEL)          self.EndModal(wxID_CANCEL)
1000    

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26