/[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 1135 by frank, Thu Jun 5 15:05:21 2003 UTC revision 1806 by bh, Fri Oct 10 10:36:34 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    
# Line 42  class ProjFrame(NonModalNonParentDialog) Line 49  class ProjFrame(NonModalNonParentDialog)
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()
65              ("tmerc", _("Transverse Mercator"), TMPanel))  
66          self.projPanels.append(          self.originalProjection = self.receiver.GetProjection()
             ("utm", _("Universal Transverse Mercator"), UTMPanel))  
         self.projPanels.append(  
             ("lcc", _("Lambert Conic Conformal"), LCCPanel))  
         self.projPanels.append(  
             ("latlong", _("Geographic"), GeoPanel))  
67    
68          NonModalNonParentDialog.__init__(self, parent, name, title)          self.__DoOnProjAvail()
69          # originally generate by wxGlade          self.button_ok.SetFocus()
70          self.panel_1 = wxPanel(self, -1)          self.availprojs.SetFocus()
         self.panel_edit = wxPanel(self, -1)  
         self.label_5 = wxStaticText(self.panel_1, -1,  
                         _("Available Projections:"))  
71    
72          # Projection List specific actions (Import/Export/Remove)      def build_dialog(self):
73          self.button_import = wxButton(self.panel_1, ID_PROJ_IMPORT,          """Build the dialog's widgets and set the event handlers"""
74                                        _("Import..."))          self.topBox = top_box = wxBoxSizer(wxVERTICAL)
         self.button_export = wxButton(self.panel_1, ID_PROJ_EXPORT,  
                                       _("Export..."))  
         self.button_remove = wxButton(self.panel_1, ID_PROJ_REMOVE,  
                                       _("Remove"))  
75    
76          # The Projection List          main_box = wxBoxSizer(wxHORIZONTAL)
77          self.availprojs = wxListBox(self.panel_1, ID_PROJ_AVAIL,          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)                                      style=wxLB_EXTENDED|wxLB_SORT)
92          self.projfilepath = wxStaticText(self.panel_1, -1, "")          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 Specific Entries (Name/Projection)          # Projection List specific actions (Import/Export/Remove)
97          self.label_2 = wxStaticText(self.panel_edit, -1, _("Name:"))          buttons = wxBoxSizer(wxVERTICAL)
98          self.projname = wxTextCtrl(self.panel_edit, ID_PROJ_PROJNAME, "")          hbox.Add(buttons, 0, wxALL)
99          self.label_3 = wxStaticText(self.panel_edit, -1, _("Projection:"))          self.button_import = wxButton(self, ID_PROJ_IMPORT, _("Import..."))
100          self.projchoice = wxChoice(self.panel_edit, ID_PROJ_PROJCHOICE)          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)
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)
108            buttons.Add(self.button_remove, 1, wxALL|wxEXPAND, 4)
109    
110          # Projection Specific actions (New/Save/Add)          # The file path
111          self.button_new = wxButton(self.panel_edit, ID_PROJ_NEW, _("New"))          self.projfilepath = wxStaticText(self, -1, "")
112          self.button_add = wxButton(self.panel_edit, ID_PROJ_ADDTOLIST,          vbox.Add(self.projfilepath, 0, wxALL|wxEXPAND)
                                       _("Add to List"))  
         self.button_save = wxButton(self.panel_edit, ID_PROJ_SAVE,_("Update"))  
113    
114          # Main Action buttons (Try/Revert/OK/Close)          #
115          self.button_try = wxButton(self, wxID_APPLY, _("Try"))          #   The projection editor part
116          self.button_revert = wxButton(self, ID_PROJ_REVERT,          #
117                                        _("Revert"))          self.edit_box = wxStaticBox(self, -1, _("Edit"))
118          self.button_ok = wxButton(self, wxID_OK, _("OK"))          sizer_edit = wxStaticBoxSizer(self.edit_box, wxHORIZONTAL)
119          self.button_ok.SetDefault()          main_box.Add(sizer_edit, 1, wxALL|wxEXPAND)
         self.button_close = wxButton(self, wxID_CANCEL,  
                                      _("Close"))  
120    
121          self.__set_properties()          # Projection Specific Entries (Name/Projection)
122          self.__do_layout()          self.sizer_projctrls = wxBoxSizer(wxVERTICAL)
123            sizer_edit.Add(self.sizer_projctrls, 1, wxALL|wxEXPAND)
124    
125          # wxGlade          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.          # Fill the projection choice list.
142          for proj, name, clazz in self.projPanels:          for proj, name, clazz in self.projection_panels:
143              self.projchoice.Append(name, [clazz, None])              self.projchoice.Append(name, [clazz, None])
144    
145          self.originalProjection = self.receiver.GetProjection()          # 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)
150            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)
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          self.__DoOnProjAvail()          #
160          self.button_ok.SetFocus()          # Main Action buttons (Try/Revert/OK/Close)
161          self.availprojs.SetFocus()          #
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)          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)          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)          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)          EVT_BUTTON(self, wxID_CANCEL, self.OnCancel)
176          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)  
177    
         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)  
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()
# Line 149  class ProjFrame(NonModalNonParentDialog) Line 203  class ProjFrame(NonModalNonParentDialog)
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 180  class ProjFrame(NonModalNonParentDialog) Line 233  class ProjFrame(NonModalNonParentDialog)
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])
# Line 193  class ProjFrame(NonModalNonParentDialog) Line 246  class ProjFrame(NonModalNonParentDialog)
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    
# Line 202  class ProjFrame(NonModalNonParentDialog) Line 255  class ProjFrame(NonModalNonParentDialog)
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 210  class ProjFrame(NonModalNonParentDialog) Line 273  class ProjFrame(NonModalNonParentDialog)
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 240  class ProjFrame(NonModalNonParentDialog) Line 304  class ProjFrame(NonModalNonParentDialog)
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 275  class ProjFrame(NonModalNonParentDialog) Line 339  class ProjFrame(NonModalNonParentDialog)
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 312  class ProjFrame(NonModalNonParentDialog) Line 376  class ProjFrame(NonModalNonParentDialog)
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 321  class ProjFrame(NonModalNonParentDialog) Line 385  class ProjFrame(NonModalNonParentDialog)
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 360  class ProjFrame(NonModalNonParentDialog) Line 424  class ProjFrame(NonModalNonParentDialog)
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 373  class ProjFrame(NonModalNonParentDialog) Line 437  class ProjFrame(NonModalNonParentDialog)
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 398  class ProjFrame(NonModalNonParentDialog) Line 464  class ProjFrame(NonModalNonParentDialog)
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 415  class ProjFrame(NonModalNonParentDialog) Line 486  class ProjFrame(NonModalNonParentDialog)
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        def _show_proj_panel(self, panel):
500            """Show the panel as the projection panel"""
501            if self.curProjPanel is not None:
502                self.curProjPanel.Hide()
503                self.sizer_projctrls.Remove(self.curProjPanel)
504    
505            self.curProjPanel = panel
506            self.curProjPanel.Show()
507    
508              if self.curProjPanel is not None:          self.sizer_projctrls.Add(self.curProjPanel, 1,
509                  self.curProjPanel.Hide()              wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)
510                  self.sizer_projctrls.Remove(self.curProjPanel)          self.sizer_projctrls.Layout()
511            self.Layout()
512              self.curProjPanel = obj          self.topBox.SetSizeHints(self)
             self.curProjPanel.Show()  
   
             self.sizer_projctrls.Add(self.curProjPanel, 1,  
                 wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)  
             self.sizer_projctrls.Layout()  
             self.Layout()  
             self.topBox.SetSizeHints(self)  
513    
514      def __SetProjection(self):      def __SetProjection(self):
515          """Set the receiver's projection."""          """Set the receiver's projection."""
# Line 494  class ProjFrame(NonModalNonParentDialog) Line 565  class ProjFrame(NonModalNonParentDialog)
565          #          #
566          self.availprojs.Append("<None>", (None, None))          self.availprojs.Append("<None>", (None, None))
567    
568          projfile = GetSystemProjFiles()          projfile, warnings = get_system_proj_file()
569          projfile = projfile[0]          self.show_warnings(_("Warnings"), projfile.GetFilename(), warnings)
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
# Line 529  class ProjFrame(NonModalNonParentDialog) Line 600  class ProjFrame(NonModalNonParentDialog)
600                          self.availprojs.FindString(selectProj)                          self.availprojs.FindString(selectProj)
601                      )                      )
602    
                   
   
     def __set_properties(self):  
   
         #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  
   
603    
604  class ProjPanel(wxPanel):  class ProjPanel(wxPanel):
605      """Base class for all projection panels."""      """Base class for all projection panels."""
# Line 684  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 692  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 826  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 953  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 987  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.1135  
changed lines
  Added in v.1806

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26