/[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 1058 by frank, Tue May 27 11:30:29 2003 UTC revision 1809 by bh, Fri Oct 10 17:00:17 2003 UTC
# Line 2  Line 2 
2  # Authors:  # Authors:
3  # Jonathan Coles <[email protected]>  # Jonathan Coles <[email protected]>
4  # Frank Koormann <[email protected]>  # 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 NonModalNonParentDialog  from Thuban.UI.dialogs import NonModalNonParentDialog
26    
27    from sizers import NotebookLikeSizer
28    
29  ID_PROJ_ADVANCED  = 4001  ID_PROJ_ADVANCED  = 4001
30  ID_PROJ_PROJCHOICE = 4002  ID_PROJ_PROJCHOICE = 4002
# Line 42  class ProjFrame(NonModalNonParentDialog) Line 50  class ProjFrame(NonModalNonParentDialog)
50                          SetProjection(projection)                          SetProjection(projection)
51                          GetProjection()                          GetProjection()
52          """          """
53                    NonModalNonParentDialog.__init__(self, parent, name, title)
54    
55            self.projection_panel_defs = [
56                ("tmerc", _("Transverse Mercator"), TMPanel),
57                ("utm", _("Universal Transverse Mercator"), UTMPanel),
58                ("lcc", _("Lambert Conic Conformal"), LCCPanel),
59                ("latlong", _("Geographic"), GeoPanel)]
60          self.receiver = receiver          self.receiver = receiver
61          self.haveTried = False          self.haveTried = False
62          self.curProjPanel = None          self.curProjPanel = None
63    
64          self.projPanels = []          self.build_dialog()
65          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))  
66    
67          NonModalNonParentDialog.__init__(self, parent, name, title)          self.originalProjection = self.receiver.GetProjection()
         # originally generate by wxGlade  
         self.panel_1 = wxPanel(self, -1)  
         self.panel_edit = wxPanel(self, -1)  
         self.label_5 = wxStaticText(self.panel_1, -1,  
                         _("Available Projections:"))  
68    
69          # Projection List specific actions (Import/Export/Remove)          self.__DoOnProjAvail()
70          self.button_import = wxButton(self.panel_1, ID_PROJ_IMPORT,          self.button_ok.SetFocus()
71                                        _("Import..."))          self.availprojs.SetFocus()
72          self.button_export = wxButton(self.panel_1, ID_PROJ_EXPORT,  
73                                        _("Export..."))      def build_dialog(self):
74          self.button_remove = wxButton(self.panel_1, ID_PROJ_REMOVE,          """Build the dialog's widgets and set the event handlers"""
75                                        _("Remove"))          self.topBox = top_box = wxBoxSizer(wxVERTICAL)
76    
77            main_box = wxBoxSizer(wxHORIZONTAL)
78            top_box.Add(main_box, 1, wxALL|wxEXPAND)
79    
80          # The Projection List          #
81          self.availprojs = wxListBox(self.panel_1, ID_PROJ_AVAIL,          #    The projection list and associated controls
82            #
83            vbox = wxBoxSizer(wxVERTICAL)
84            main_box.Add(vbox, 0, wxALL|wxEXPAND)
85    
86            label = wxStaticText(self, -1, _("Available Projections:"))
87            vbox.Add(label, 0, wxLEFT|wxRIGHT|wxTOP, 4)
88    
89            hbox = wxBoxSizer(wxHORIZONTAL)
90            vbox.Add(hbox, 1, wxALL|wxEXPAND)
91            self.availprojs = wxListBox(self, ID_PROJ_AVAIL,
92                                      style=wxLB_EXTENDED|wxLB_SORT)                                      style=wxLB_EXTENDED|wxLB_SORT)
93          self.projfilepath = wxStaticText(self.panel_1, -1, "")          EVT_LISTBOX(self, ID_PROJ_AVAIL, self._OnProjAvail)
94            hbox.Add(self.availprojs, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)
95            self.__FillAvailList(selectCurrent = True)
96    
97            # Projection List specific actions (Import/Export/Remove)
98            buttons = wxBoxSizer(wxVERTICAL)
99            hbox.Add(buttons, 0, wxALL)
100            self.button_import = wxButton(self, ID_PROJ_IMPORT, _("Import..."))
101            EVT_BUTTON(self, ID_PROJ_IMPORT, self._OnImport)
102            buttons.Add(self.button_import, 1, wxALL|wxEXPAND, 4)
103            self.button_export = wxButton(self, ID_PROJ_EXPORT, _("Export..."))
104            EVT_BUTTON(self, ID_PROJ_EXPORT, self._OnExport)
105            buttons.Add(self.button_export, 1, wxALL|wxEXPAND, 4)
106            buttons.Add(20, 20, 0, wxEXPAND, 0)
107            self.button_remove = wxButton(self, ID_PROJ_REMOVE, _("Remove"))
108            EVT_BUTTON(self, ID_PROJ_REMOVE, self._OnRemove)
109            buttons.Add(self.button_remove, 1, wxALL|wxEXPAND, 4)
110    
111            # The file path
112            self.projfilepath = wxStaticText(self, -1, "")
113            vbox.Add(self.projfilepath, 0, wxALL|wxEXPAND)
114    
115            #
116            #   The projection editor part
117            #
118            self.edit_box = wxStaticBox(self, -1, _("Edit"))
119            sizer_edit = wxStaticBoxSizer(self.edit_box, wxHORIZONTAL)
120            main_box.Add(sizer_edit, 1, wxALL|wxEXPAND)
121    
122          # Projection Specific Entries (Name/Projection)          # Projection Specific Entries (Name/Projection)
123          self.label_2 = wxStaticText(self.panel_edit, -1, _("Name:"))          self.sizer_projctrls = wxBoxSizer(wxVERTICAL)
124          self.projname = wxTextCtrl(self.panel_edit, ID_PROJ_PROJNAME, "")          sizer_edit.Add(self.sizer_projctrls, 1, wxALL|wxEXPAND)
125          self.label_3 = wxStaticText(self.panel_edit, -1, _("Projection:"))  
126          self.projchoice = wxChoice(self.panel_edit, ID_PROJ_PROJCHOICE)          hbox = wxBoxSizer(wxHORIZONTAL)
127            self.sizer_projctrls.Add(hbox, 0, wxALL|wxEXPAND)
128            label = wxStaticText(self, -1, _("Name:"))
129            hbox.Add(label, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)
130            self.projname = wxTextCtrl(self, ID_PROJ_PROJNAME, "")
131            EVT_TEXT(self, ID_PROJ_PROJNAME, self._OnProjName)
132            hbox.Add(self.projname, 1, wxALL|wxEXPAND, 4)
133    
134            hbox = wxBoxSizer(wxHORIZONTAL)
135            self.sizer_projctrls.Add(hbox, 0, wxALL|wxEXPAND)
136            label = wxStaticText(self, -1, _("Projection:"))
137            hbox.Add(label, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)
138            self.projchoice = wxChoice(self, ID_PROJ_PROJCHOICE)
139            self.projchoice.SetSelection(0)
140            EVT_CHOICE(self, ID_PROJ_PROJCHOICE, self._OnProjChoice)
141            hbox.Add(self.projchoice, 1, wxALL|wxEXPAND, 4)
142            # Fill the projection choice list.
143            self.nbsizer = NotebookLikeSizer()
144            self.sizer_projctrls.Add(self.nbsizer, 1,
145                                     wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)
146            self.projection_panels = []
147            for proj_type, name, cls in self.projection_panel_defs:
148                self.projchoice.Append(name, proj_type)
149                panel = cls(self, self.receiver)
150                panel.Hide()
151                panel.projection_index = len(self.projection_panels)
152                panel.projection_type = proj_type
153                self.projection_panels.append(panel)
154                self.nbsizer.Add(panel)
155            self.unknown_projection_panel = UnknownProjPanel(self, self.receiver)
156            self.unknown_projection_panel.Hide()
157            self.nbsizer.Add(self.unknown_projection_panel)
158    
159          # Projection Specific actions (New/Save/Add)          # Projection Specific actions (New/Save/Add)
160          self.button_new = wxButton(self.panel_edit, ID_PROJ_NEW, _("New"))          buttons = wxBoxSizer(wxVERTICAL)
161          self.button_add = wxButton(self.panel_edit, ID_PROJ_ADDTOLIST,          sizer_edit.Add(buttons, 0, wxALL)
162                                        _("Add to List"))          self.button_new = wxButton(self, ID_PROJ_NEW, _("New"))
163          self.button_save = wxButton(self.panel_edit, ID_PROJ_SAVE,_("Update"))          EVT_BUTTON(self, ID_PROJ_NEW, self._OnNew)
164            buttons.Add(self.button_new, 0, wxEXPAND|wxALL, 4)
165            self.button_add = wxButton(self, ID_PROJ_ADDTOLIST, _("Add to List"))
166            EVT_BUTTON(self, ID_PROJ_ADDTOLIST, self._OnAddToList)
167            buttons.Add(self.button_add, 0, wxEXPAND|wxALL, 4)
168            buttons.Add(20, 20, 0, wxEXPAND, 0)
169            self.button_save = wxButton(self, ID_PROJ_SAVE,_("Update"))
170            EVT_BUTTON(self, ID_PROJ_SAVE, self._OnSave)
171            buttons.Add(self.button_save, 0, wxEXPAND|wxALL|wxALIGN_BOTTOM, 4)
172    
173            #
174          # Main Action buttons (Try/Revert/OK/Close)          # Main Action buttons (Try/Revert/OK/Close)
175            #
176            buttons = wxBoxSizer(wxHORIZONTAL)
177            top_box.Add(buttons, 0, wxALL|wxALIGN_RIGHT, 10)
178          self.button_try = wxButton(self, wxID_APPLY, _("Try"))          self.button_try = wxButton(self, wxID_APPLY, _("Try"))
         self.button_revert = wxButton(self, ID_PROJ_REVERT,  
                                       _("Revert"))  
         self.button_ok = wxButton(self, wxID_OK, _("OK"))  
         self.button_ok.SetDefault()  
         self.button_close = wxButton(self, wxID_CANCEL,  
                                      _("Close"))  
   
         self.__set_properties()  
         self.__do_layout()  
         # wxGlade  
   
         self.originalProjection = self.receiver.GetProjection()  
   
         self.__DoOnProjAvail()  
         self.button_ok.SetFocus()  
         self.availprojs.SetFocus()  
           
179          EVT_BUTTON(self, wxID_APPLY, self.OnApply)          EVT_BUTTON(self, wxID_APPLY, self.OnApply)
180            buttons.Add(self.button_try, 0, wxRIGHT, 10)
181            self.button_revert = wxButton(self, ID_PROJ_REVERT, _("Revert"))
182          EVT_BUTTON(self, ID_PROJ_REVERT, self._OnRevert)          EVT_BUTTON(self, ID_PROJ_REVERT, self._OnRevert)
183            buttons.Add(self.button_revert, 0, wxRIGHT, 10)
184            self.button_ok = wxButton(self, wxID_OK, _("OK"))
185          EVT_BUTTON(self, wxID_OK, self.OnOK)          EVT_BUTTON(self, wxID_OK, self.OnOK)
186            self.button_ok.SetDefault()
187            buttons.Add(self.button_ok, 0, wxRIGHT, 10)
188            self.button_close = wxButton(self, wxID_CANCEL, _("Close"))
189          EVT_BUTTON(self, wxID_CANCEL, self.OnCancel)          EVT_BUTTON(self, wxID_CANCEL, self.OnCancel)
190          EVT_CHOICE(self, ID_PROJ_PROJCHOICE, self._OnProjChoice)          buttons.Add(self.button_close, 0, wxRIGHT, 10)
         EVT_LISTBOX(self, ID_PROJ_AVAIL, self._OnProjAvail)  
         EVT_BUTTON(self, ID_PROJ_IMPORT, self._OnImport)  
         EVT_BUTTON(self, ID_PROJ_EXPORT, self._OnExport)  
         EVT_BUTTON(self, ID_PROJ_REMOVE, self._OnRemove)  
191    
         EVT_BUTTON(self, ID_PROJ_NEW, self._OnNew)  
         EVT_BUTTON(self, ID_PROJ_SAVE, self._OnSave)  
         EVT_BUTTON(self, ID_PROJ_ADDTOLIST, self._OnAddToList)  
   
         EVT_TEXT(self, ID_PROJ_PROJNAME, self._OnProjName)  
192    
193            #
194            # Automatic Layout
195            #
196            self.SetAutoLayout(1)
197            self.SetSizer(top_box)
198            top_box.Fit(self)
199            top_box.SetSizeHints(self)
200    
201      def OnApply(self, event):      def OnApply(self, event):
202          self.__SetProjection()          self.__SetProjection()
# Line 144  class ProjFrame(NonModalNonParentDialog) Line 217  class ProjFrame(NonModalNonParentDialog)
217              self.receiver.SetProjection(self.originalProjection)              self.receiver.SetProjection(self.originalProjection)
218              self.haveTried = False              self.haveTried = False
219    
   
220      def _OnNew(self, event):      def _OnNew(self, event):
221    
222          # clear all selections          # clear all selections
# Line 175  class ProjFrame(NonModalNonParentDialog) Line 247  class ProjFrame(NonModalNonParentDialog)
247          if newproj is not None:          if newproj is not None:
248              projfile.Replace(proj, newproj)              projfile.Replace(proj, newproj)
249              try:              try:
250                  WriteProjFile(projfile)                  write_proj_file(projfile)
251              except IOError, (errno, errstr):              except IOError, (errno, errstr):
252                  self.__ShowError(projfile.GetFilename(), errstr)                  self.__ShowError(projfile.GetFilename(), errstr)
253              self.availprojs.SetClientData(sel[0], [newproj, projfile])              self.availprojs.SetClientData(sel[0], [newproj, projfile])
254    
255                self.__FillAvailList( selectProj = newproj.GetName())
256    
257      def _OnAddToList(self, event):      def _OnAddToList(self, event):
258    
259          proj = self.__GetProjection()          proj = self.__GetProjection()
260          if proj is not None:          if proj is not None:
261              self.__usrProjFile.Add(proj)              self.__usrProjFile.Add(proj)
262              try:              try:
263                  WriteProjFile(self.__usrProjFile)                  write_proj_file(self.__usrProjFile)
264              except IOError, (errno, errstr):              except IOError, (errno, errstr):
265                  self.__ShowError(self.__userProjFile.GetFilename(), errstr)                  self.__ShowError(self.__userProjFile.GetFilename(), errstr)
266    
267              self.__FillAvailList()              self.__FillAvailList( selectProj = proj.GetName())
268    
269      def _OnProjAvail(self, event):      def _OnProjAvail(self, event):
270          self.__DoOnProjAvail()          self.__DoOnProjAvail()
271    
272        def show_warnings(self, title, filename, warnings):
273            """Show the warnings (a list of strings) in a dialog
274    
275            If the list is empty no dialog will be shown.
276            """
277            if warnings:
278                text = (_('Warnings when reading "%s":\n\n%s')
279                        % (filename, "\n\n".join(warnings)))
280                self.parent.RunMessageBox(title, text)
281    
282      def _OnImport(self, event):      def _OnImport(self, event):
283    
284          dlg = wxFileDialog(self, _("Import"), style = wxOPEN)          dlg = wxFileDialog(self, _("Import"), style = wxOPEN)
# Line 203  class ProjFrame(NonModalNonParentDialog) Line 287  class ProjFrame(NonModalNonParentDialog)
287              path = dlg.GetPath()              path = dlg.GetPath()
288    
289              try:              try:
290                  projFile = ReadProjFile(path)                  projFile, warnings = read_proj_file(path)
291                    self.show_warnings(_("Warnings"), path, warnings)
292                  for proj in projFile.GetProjections():                  for proj in projFile.GetProjections():
293                      self.__usrProjFile.Add(proj)                      self.__usrProjFile.Add(proj)
294                  WriteProjFile(self.__usrProjFile)                  write_proj_file(self.__usrProjFile)
295              except IOError, (errno, errstr):              except IOError, (errno, errstr):
296                  self.__ShowError(dlg.GetPath(), errstr)                  self.__ShowError(dlg.GetPath(), errstr)
297    
# Line 233  class ProjFrame(NonModalNonParentDialog) Line 318  class ProjFrame(NonModalNonParentDialog)
318                      projFile.Add(proj)                      projFile.Add(proj)
319    
320              try:              try:
321                  WriteProjFile(projFile)                  write_proj_file(projFile)
322              except IOError, (errno, errstr):              except IOError, (errno, errstr):
323                  self.__ShowError(dlg.GetPath(), errstr)                  self.__ShowError(dlg.GetPath(), errstr)
324    
# Line 268  class ProjFrame(NonModalNonParentDialog) Line 353  class ProjFrame(NonModalNonParentDialog)
353                  projfile.Remove(proj)                  projfile.Remove(proj)
354    
355          try:          try:
356              WriteProjFile(projfile)              write_proj_file(projfile)
357          except IOError, (errno, errstr):          except IOError, (errno, errstr):
358              self.__ShowError(projfile.GetFilename(), errstr)              self.__ShowError(projfile.GetFilename(), errstr)
359    
# Line 305  class ProjFrame(NonModalNonParentDialog) Line 390  class ProjFrame(NonModalNonParentDialog)
390          self.button_save.Enable(True)          self.button_save.Enable(True)
391          self.button_remove.Enable(True)          self.button_remove.Enable(True)
392    
393          self.panel_edit.Enable(True)          self.edit_box.Enable(True)
394    
395          for ctrl in [self.button_import,          for ctrl in [self.button_import,
396                       self.button_export,                       self.button_export,
# Line 314  class ProjFrame(NonModalNonParentDialog) Line 399  class ProjFrame(NonModalNonParentDialog)
399                       self.button_add,                       self.button_add,
400                       self.projchoice,                       self.projchoice,
401                       self.projname,                       self.projname,
402                       self.panel_edit]:                       self.edit_box]:
403              ctrl.Enable(True)              ctrl.Enable(True)
404    
405          if self.curProjPanel is not None:          if self.curProjPanel is not None:
# Line 353  class ProjFrame(NonModalNonParentDialog) Line 438  class ProjFrame(NonModalNonParentDialog)
438                  self.button_save.Enable(False)                  self.button_save.Enable(False)
439    
440          else:          else:
441              self.panel_edit.Enable(False)              self.edit_box.Enable(False)
442    
443      def __DoOnProjAvail(self):      def __DoOnProjAvail(self):
444    
# Line 366  class ProjFrame(NonModalNonParentDialog) Line 451  class ProjFrame(NonModalNonParentDialog)
451              if proj is None:              if proj is None:
452                  # user selected <None>                  # user selected <None>
453                  self.projname.Clear()                  self.projname.Clear()
454                                    self.projfilepath.SetLabel(_("Projection File: "))
455              else:              else:
456                
457                  if projfile is not None:                  if projfile is not None:
458                      self.projfilepath.SetLabel(projfile.GetFilename())                      self.projfilepath.SetLabel(_("Projection File: ") +
459                            os.path.basename(projfile.GetFilename()))
460                  else:                  else:
461                      # only None if the currently used projection is selected                      # only None if the currently used projection is selected
462                      self.projfilepath.SetLabel("")                      self.projfilepath.SetLabel(_("Projection File: "))
463    
464                  self.projname.SetValue(proj.GetName())                  self.projname.SetValue(proj.GetName())
465    
466                  myProjType = proj.GetParameter("proj")                  myProjType = proj.GetParameter("proj")
467                  i = 0                  i = 0
468                  for projType, name, clazz in self.projPanels:                  for projType, name, cls in self.projection_panel_defs:
469                      if myProjType == projType:                      if myProjType == projType:
470                            self.projchoice.Enable(True)
471                          self.projchoice.SetSelection(i)                          self.projchoice.SetSelection(i)
472                          self.__DoOnProjChoice()                          self.__DoOnProjChoice()
473    
# Line 391  class ProjFrame(NonModalNonParentDialog) Line 478  class ProjFrame(NonModalNonParentDialog)
478                          assert self.curProjPanel is not None                          assert self.curProjPanel is not None
479    
480                          self.curProjPanel.SetProjection(proj)                          self.curProjPanel.SetProjection(proj)
481                            break
482                      i += 1                      i += 1
483                    else:
484                        self.projchoice.Disable()
485                        self._show_proj_panel(UnknownProjPanel)
486    
487          self.__VerifyButtons()          self.__VerifyButtons()
488    
# Line 408  class ProjFrame(NonModalNonParentDialog) Line 499  class ProjFrame(NonModalNonParentDialog)
499          At the end of this method self.curProjPanel will not be None          At the end of this method self.curProjPanel will not be None
500          if there was a item selected.          if there was a item selected.
501          """          """
   
502          choice = self.projchoice          choice = self.projchoice
503    
504          sel = choice.GetSelection()          sel = choice.GetSelection()
505          if sel != -1:          if sel != -1:
506                proj_type = choice.GetClientData(sel)
507              clazz, obj = choice.GetClientData(sel)              for t, name, cls in self.projection_panel_defs:
508                    if t == proj_type:
509              if obj is None:                      self._show_proj_panel(cls)
510                  obj = clazz(self.panel_edit, self.receiver)                      break
511                  choice.SetClientData(sel, [clazz, obj])          # FIXME: what to do if sel == -1?
512    
513              if self.curProjPanel is not None:      def _show_proj_panel(self, panel_class):
514                  self.curProjPanel.Hide()          """Show the panel as the projection panel"""
515                  self.sizer_projctrls.Remove(self.curProjPanel)          if panel_class is UnknownProjPanel:
516                self.edit_box.Disable()
517              self.curProjPanel = obj              self.nbsizer.Activate(self.unknown_projection_panel)
518              self.curProjPanel.Show()              self.curProjPanel = self.unknown_projection_panel
519            else:
520              self.sizer_projctrls.Add(self.curProjPanel, 1,              self.edit_box.Enable(True)
521                  wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)              self.unknown_projection_panel.Hide()
522              self.sizer_projctrls.Layout()              for panel in self.projection_panels:
523              self.Layout()                  if panel.__class__ is panel_class:
524              self.topBox.SetSizeHints(self)                      self.nbsizer.Activate(panel)
525                        self.curProjPanel = panel
526    
527      def __SetProjection(self):      def __SetProjection(self):
528          """Set the receiver's projection."""          """Set the receiver's projection."""
# Line 469  class ProjFrame(NonModalNonParentDialog) Line 560  class ProjFrame(NonModalNonParentDialog)
560    
561          return None          return None
562    
563      def __FillAvailList(self, selectCurrent = False):      def __FillAvailList(self, selectCurrent = False, selectProj = None):
564          """Populate the list of available projections.          """Populate the list of available projections.
565                    
566          selectCurrent -- if True, select the projection used by          selectCurrent -- if True, select the projection used by
567                           the receiver, otherwise select nothing.                           the receiver, otherwise select nothing.
568            selectProj    -- if set, select the projection found under the
569                             specified name. This overwrites any other
570                             selection estimate.
571          """          """
572    
573          self.availprojs.Clear()          self.availprojs.Clear()
# Line 484  class ProjFrame(NonModalNonParentDialog) Line 578  class ProjFrame(NonModalNonParentDialog)
578          #          #
579          self.availprojs.Append("<None>", (None, None))          self.availprojs.Append("<None>", (None, None))
580    
581          projfile = GetSystemProjFiles()          projfile, warnings = get_system_proj_file()
582          projfile = projfile[0]          self.show_warnings(_("Warnings"), projfile.GetFilename(), warnings)
583          for proj in projfile.GetProjections():          for proj in projfile.GetProjections():
584              self.availprojs.Append(proj.GetName(), [proj, projfile])              self.availprojs.Append(proj.GetName(), [proj, projfile])
585          self.__sysProjFile = projfile          self.__sysProjFile = projfile
586    
587          projfile = GetUserProjFiles()          projfile, warnings = get_user_proj_file()
588          projfile = projfile[0]          self.show_warnings(_("Warnings"), projfile.GetFilename(), warnings)
589          for proj in projfile.GetProjections():          for proj in projfile.GetProjections():
590              self.availprojs.Append(proj.GetName(), [proj, projfile])              self.availprojs.Append(proj.GetName(), [proj, projfile])
591          self.__usrProjFile = projfile          self.__usrProjFile = projfile
592    
         for proj, name, clazz in self.projPanels:  
             self.projchoice.Append(name, [clazz, None])  
   
593          #          #
594          # We add the current projection to the list at last.          # We add the current projection to the list at last.
595          # Since the list is resorted immediately a following FindString()          # Since the list is resorted immediately a following FindString()
# Line 517  class ProjFrame(NonModalNonParentDialog) Line 608  class ProjFrame(NonModalNonParentDialog)
608                  self.availprojs.SetSelection(                  self.availprojs.SetSelection(
609                          self.availprojs.FindString("<None>")                          self.availprojs.FindString("<None>")
610                      )                      )
611                            if selectProj:
612                self.availprojs.SetSelection(
613      def __set_properties(self):                          self.availprojs.FindString(selectProj)
614                        )
         #self.availprojs.SetSelection(0)  
         self.projchoice.SetSelection(0)  
   
         self.__FillAvailList(selectCurrent = True)  
   
         self.projname.SetMaxLength(32)  
   
     def __do_layout(self):  
         # originally generated by wxGlade  
   
         self.topBox = wxBoxSizer(wxVERTICAL)  
         self.sizer_panel = wxBoxSizer(wxVERTICAL)  
         sizer_6 = wxBoxSizer(wxHORIZONTAL)  
         self.sizer_mainbttns = wxBoxSizer(wxHORIZONTAL)  
         self.sizer_mainctrls = wxBoxSizer(wxHORIZONTAL)  
         self.sizer_edit = wxStaticBoxSizer(wxStaticBox(self.panel_edit, -1, _("Edit")), wxHORIZONTAL)  
         sizer_11 = wxBoxSizer(wxVERTICAL)  
         self.sizer_projctrls = wxBoxSizer(wxVERTICAL)  
         sizer_14 = wxBoxSizer(wxHORIZONTAL)  
         sizer_13 = wxBoxSizer(wxHORIZONTAL)  
         sizer_15 = wxBoxSizer(wxVERTICAL)  
         sizer_15.Add(self.button_import, 0, wxALL, 4)  
         sizer_15.Add(self.button_export, 0, wxALL, 4)  
         sizer_15.Add(20, 20, 0, wxEXPAND, 0)  
         sizer_15.Add(self.button_remove, 0, wxALL|wxALIGN_BOTTOM, 4)  
   
         # list controls  
         grid_sizer_1 = wxFlexGridSizer(3, 2, 0, 0)  
         grid_sizer_1.Add(self.label_5, 0, wxLEFT|wxRIGHT|wxTOP, 4)  
         grid_sizer_1.Add(20, 20, 0, wxEXPAND, 0)  
         grid_sizer_1.Add(self.availprojs, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)  
         grid_sizer_1.Add(sizer_15, 0, wxALL|wxEXPAND, 4)  
         grid_sizer_1.Add(self.projfilepath, 0, wxALL|wxADJUST_MINSIZE, 4)  
         grid_sizer_1.AddGrowableRow(1)  
         grid_sizer_1.AddGrowableCol(0)  
   
         # edit controls  
         sizer_13.Add(self.label_2, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)  
         sizer_13.Add(self.projname, 1, wxALL, 4)  
         self.sizer_projctrls.Add(sizer_13, 0, wxEXPAND, 0)  
         sizer_14.Add(self.label_3, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)  
         sizer_14.Add(self.projchoice, 1, wxALL|wxALIGN_CENTER_VERTICAL, 4)  
         self.sizer_projctrls.Add(sizer_14, 0, wxEXPAND, 0)  
         self.sizer_edit.Add(self.sizer_projctrls, 1, wxEXPAND, 0)  
         sizer_11.Add(self.button_new, 0, wxALL, 4)  
         sizer_11.Add(self.button_add, 0, wxALL, 4)  
         sizer_11.Add(20, 20, 0, wxEXPAND, 0)  
         sizer_11.Add(self.button_save, 0, wxALL|wxALIGN_BOTTOM, 4)  
         self.sizer_edit.Add(sizer_11, 0, wxALL|wxEXPAND, 4)  
   
         sizer_6.Add(self.button_try, 0, wxRIGHT| wxEXPAND, 10)  
         sizer_6.Add(self.button_revert, 0, wxRIGHT| wxEXPAND, 10)  
         sizer_6.Add(self.button_ok, 0, wxRIGHT| wxEXPAND, 10)  
         sizer_6.Add(self.button_close, 0, wxRIGHT| wxEXPAND, 10)  
   
         self.panel_1.SetAutoLayout(1)  
         self.panel_1.SetSizer(grid_sizer_1)  
         grid_sizer_1.Fit(self.panel_1)  
         grid_sizer_1.SetSizeHints(self.panel_1)  
   
         self.panel_edit.SetAutoLayout(1)  
         self.panel_edit.SetSizer(self.sizer_edit)  
         self.sizer_edit.Fit(self.panel_edit)  
         self.sizer_edit.SetSizeHints(self.panel_edit)  
   
         self.sizer_mainctrls.Add(self.panel_1, 0,  
             wxALL|wxEXPAND|wxADJUST_MINSIZE, 0)  
         self.sizer_mainctrls.Add(self.panel_edit, 1,  
             wxALL|wxEXPAND|wxADJUST_MINSIZE, 0)  
   
         self.sizer_mainbttns.Add(sizer_6, 0,  
             wxALL|wxEXPAND|wxADJUST_MINSIZE, 10)  
   
         self.topBox.Add(self.sizer_mainctrls, 1, wxALL|wxEXPAND, 4)  
         self.topBox.Add(self.sizer_mainbttns, 0, wxALIGN_RIGHT|wxBOTTOM, 0)  
   
         self.SetAutoLayout(1)  
         self.SetSizer(self.topBox)  
         self.topBox.Fit(self)  
         self.topBox.SetSizeHints(self)  
         self.Layout()  
   
 # end of class ProjFrame  
615    
616    
617  class ProjPanel(wxPanel):  class ProjPanel(wxPanel):
# Line 672  ID_TMPANEL_FALSE_NORTH = 4004 Line 680  ID_TMPANEL_FALSE_NORTH = 4004
680  ID_TMPANEL_SCALE = 4005  ID_TMPANEL_SCALE = 4005
681    
682  class UnknownProjPanel(ProjPanel):  class UnknownProjPanel(ProjPanel):
683    
684        """Panel for unknown projection types"""
685    
686      def __init__(self, parent, receiver):      def __init__(self, parent, receiver):
687          ProjPanel.__init__(self, parent)          ProjPanel.__init__(self, parent)
688    
# Line 680  class UnknownProjPanel(ProjPanel): Line 691  class UnknownProjPanel(ProjPanel):
691      def _DoLayout(self):      def _DoLayout(self):
692          sizer = wxBoxSizer(wxVERTICAL)          sizer = wxBoxSizer(wxVERTICAL)
693    
694          sizer.Add(wxStaticText(self, -1,          sizer.Add(wxStaticText(self, -1,
695              _("Thuban does not know the parameters for the " +                                 _("Thuban does not know the parameters\n"
696                "current projection and cannot display a " +                                   "for the current projection and cannot\n"
697                "configuration panel.")))                                   "display a configuration panel.")))
698    
699          ProjPanel._DoLayout(self, sizer)          ProjPanel._DoLayout(self, sizer)
700    
# Line 712  class TMPanel(ProjPanel): Line 723  class TMPanel(ProjPanel):
723    
724      def _DoLayout(self):      def _DoLayout(self):
725    
726          sizer = wxFlexGridSizer(4, 4, 0, 0)          sizer = wxFlexGridSizer(4, 2, 0, 0)
727          sizer.Add(wxStaticText(self, -1, _("Latitude:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("Latitude:")), 0, wxALL, 4)
728          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)  
729          sizer.Add(wxStaticText(self, -1, _("Longitude:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("Longitude:")), 0, wxALL, 4)
730          sizer.Add(self.__longitude, 0, wxALL, 4)          sizer.Add(self.__longitude, 0, wxALL, 4)
731            sizer.Add(wxStaticText(self, -1, _("False Easting:")), 0, wxALL, 4)
732            sizer.Add(self.__falseEast, 0, wxALL, 4)
733          sizer.Add(wxStaticText(self, -1, _("False Northing:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("False Northing:")), 0, wxALL, 4)
734          sizer.Add(self.__falseNorth, 0, wxALL, 4)          sizer.Add(self.__falseNorth, 0, wxALL, 4)
735          sizer.Add(wxStaticText(self, -1, _("Scale Factor:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("Scale Factor:")), 0, wxALL, 4)
# Line 814  class UTMPanel(ProjPanel): Line 825  class UTMPanel(ProjPanel):
825          ProjPanel.Clear(self)          ProjPanel.Clear(self)
826    
827      def _OnPropose(self, event):      def _OnPropose(self, event):
828          UTMProposeZoneDialog          """Call the propose dialog.
829            If the receiver (e.g. the current map) has no bounding box,
830            inform the user accordingly.
831            """
832            bb = self.receiver.BoundingBox()
833            if bb is None:
834                dlg = wxMessageDialog(self,
835                        _("Can not propose: No bounding box found."),
836                        _("Projection: Propose UTM Zone"),
837                        wxOK | wxICON_INFORMATION)
838                dlg.CenterOnParent()
839                result = dlg.ShowModal()
840                dlg.Destroy()
841                return
842    
843          dlg = UTMProposeZoneDialog(self, self.receiver.BoundingBox())          dlg = UTMProposeZoneDialog(self, self.receiver.BoundingBox())
844          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
845              self.__zone.SetValue(dlg.GetProposedZone())              self.__zone.SetValue(dlg.GetProposedZone())
# Line 843  class LCCPanel(ProjPanel): Line 868  class LCCPanel(ProjPanel):
868          sizer.Add(wxStaticText(self, -1,          sizer.Add(wxStaticText(self, -1,
869              _("Latitude of second standard parallel:")))              _("Latitude of second standard parallel:")))
870          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)  
871          sizer.Add(wxStaticText(self, -1, _("Central Meridian:")))          sizer.Add(wxStaticText(self, -1, _("Central Meridian:")))
872          sizer.Add(self.__meridian, 0, wxALL, 4)          sizer.Add(self.__meridian, 0, wxALL, 4)
873            sizer.Add(wxStaticText(self, -1, _("Latitude of origin:")))
874            sizer.Add(self.__originLat, 0, wxALL, 4)
875          sizer.Add(wxStaticText(self, -1, _("False Easting:")))          sizer.Add(wxStaticText(self, -1, _("False Easting:")))
876          sizer.Add(self.__falseEast, 0, wxALL, 4)          sizer.Add(self.__falseEast, 0, wxALL, 4)
877          sizer.Add(wxStaticText(self, -1, _("False Northing:")))          sizer.Add(wxStaticText(self, -1, _("False Northing:")))
# Line 941  class GeoPanel(ProjPanel): Line 966  class GeoPanel(ProjPanel):
966  ID_UTM_PROPOSE_ZONE_DIALOG_TAKE   = 4001  ID_UTM_PROPOSE_ZONE_DIALOG_TAKE   = 4001
967  ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL = 4002  ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL = 4002
968  class UTMProposeZoneDialog(wxDialog):  class UTMProposeZoneDialog(wxDialog):
969                                                                                    
970      """Propose a sensible Zone considering the current map extent."""      """Propose a sensible Zone considering the current map extent."""
971                                                                                    
972      def __init__(self, parent, (x, y, x2, y2)):      def __init__(self, parent, (x, y, x2, y2)):
973          wxDialog.__init__(self, parent, -1, _("Projection: Propose UTM Zone"),          wxDialog.__init__(self, parent, -1, _("Projection: Propose UTM Zone"),
974                            wxDefaultPosition, wxSize(200, 100))                            wxDefaultPosition, wxSize(200, 100))
975          self.parent = parent          self.parent = parent
         #x, y, x2, y2 = elf.parent.parent.map_bounding_box  
976          x = x + 180          x = x + 180
977          x2 = x2 + 180          x2 = x2 + 180
978          center = (x2 - x) / 2 + x          center = (x2 - x) / 2 + x
979          self.proposedZone = int(center / 6 + 1)          self.proposedZone = int(center / 6 + 1)
980          self.dialogLayout()          self.dialogLayout()
981                                                                                    
982      def dialogLayout(self):      def dialogLayout(self):
983          topBox = wxBoxSizer(wxVERTICAL)          topBox = wxBoxSizer(wxVERTICAL)
984                                                                                    
985          textBox = wxBoxSizer(wxVERTICAL)          textBox = wxBoxSizer(wxVERTICAL)
986          textBox.Add(wxStaticText(self, -1, _("The current map extent center " +          textBox.Add(wxStaticText(self, -1, _("The current map extent center "
987                                             "lies in UTM Zone")),                                               "lies in UTM Zone")),
988                      0, wxALIGN_CENTER|wxALL, 4)                      0, wxALIGN_CENTER|wxALL, 4)
989          textBox.Add(wxStaticText(self, -1, str(self.proposedZone)),          textBox.Add(wxStaticText(self, -1, str(self.proposedZone)),
990                      0, wxALIGN_CENTER|wxALL, 4)                      0, wxALIGN_CENTER|wxALL, 4)
991                                                                                    
992          topBox.Add(textBox, 1, wxEXPAND|wxALL, 4)          topBox.Add(textBox, 1, wxEXPAND|wxALL, 4)
993                                                                                    
994          buttonBox = wxBoxSizer(wxHORIZONTAL)          buttonBox = wxBoxSizer(wxHORIZONTAL)
995          buttonBox.Add(wxButton(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE,          buttonBox.Add(wxButton(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE,
996                        _("Take")), 0, wxALL, 4)                        _("Take")), 0, wxALL, 4)
# Line 975  class UTMProposeZoneDialog(wxDialog): Line 999  class UTMProposeZoneDialog(wxDialog):
999          topBox.Add(buttonBox, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10)          topBox.Add(buttonBox, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10)
1000          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE, self.OnTake)          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE, self.OnTake)
1001          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL, self.OnCancel)          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL, self.OnCancel)
1002                                                                                    
1003          self.SetAutoLayout(True)          self.SetAutoLayout(True)
1004          self.SetSizer(topBox)          self.SetSizer(topBox)
1005          topBox.Fit(self)          topBox.Fit(self)
1006          topBox.SetSizeHints(self)          topBox.SetSizeHints(self)
1007                                                                                    
1008      def OnTake(self, event):      def OnTake(self, event):
1009          self.EndModal(wxID_OK)          self.EndModal(wxID_OK)
1010                                                                                    
1011      def OnCancel(self, event):      def OnCancel(self, event):
1012          self.EndModal(wxID_CANCEL)          self.EndModal(wxID_CANCEL)
1013    

Legend:
Removed from v.1058  
changed lines
  Added in v.1809

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26