/[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 734 by bh, Thu Apr 24 19:14:16 2003 UTC revision 1789 by bh, Wed Oct 8 13:10:45 2003 UTC
# Line 1  Line 1 
1  #!/usr/bin/env python  # Copyright (c) 2003 by Intevation GmbH
2  # generated by wxGlade 0.2.1 on Thu Apr 17 11:51:39 2003  # Authors:
3    # 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)
8    # Read the file COPYING coming with Thuban for details.
9    
10    """Projection dialog"""
11    
12    __version__ = "$Revision$"
13    # $Source$
14    # $Id$
15    
16  import os, sys  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
29  ID_PROJ_PROJCHOICE = 4002  ID_PROJ_PROJCHOICE = 4002
30  ID_PROJ_SAVEAS    = 4003  ID_PROJ_ADDTOLIST    = 4003
31  ID_PROJ_NEW       = 4004  ID_PROJ_NEW       = 4004
 ID_PROJ_TRY       = 4005  
32  ID_PROJ_REVERT    = 4006  ID_PROJ_REVERT    = 4006
 ID_PROJ_OK        = 4007  
 ID_PROJ_CLOSE     = 4008  
33  ID_PROJ_AVAIL     = 4009  ID_PROJ_AVAIL     = 4009
34  ID_PROJ_SAVE      = 4010  ID_PROJ_SAVE      = 4010
35  ID_PROJ_IMPORT    = 4011  ID_PROJ_IMPORT    = 4011
# Line 31  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, receiver, *args, **kwds):      def __init__(self, parent, name, title, receiver):
46          """Initialize the projection dialog.          """Initialize the projection dialog.
47    
48          receiver -- An object that implements the following methods:          receiver -- An object that implements the following methods:
# Line 42  class ProjFrame(NonModalDialog): Line 51  class ProjFrame(NonModalDialog):
51          """          """
52                    
53          self.receiver = receiver          self.receiver = receiver
54          self.originalProjection = -1          self.haveTried = False
55          self.curProjPanel = None          self.curProjPanel = None
56    
57          self.projPanels = []          self.projPanels = []
# Line 55  class ProjFrame(NonModalDialog): Line 64  class ProjFrame(NonModalDialog):
64          self.projPanels.append(          self.projPanels.append(
65              ("latlong", _("Geographic"), GeoPanel))              ("latlong", _("Geographic"), GeoPanel))
66    
67          NonModalDialog.__init__(self, parent, name, "")          NonModalNonParentDialog.__init__(self, parent, name, title)
68          # originally generate by wxGlade          # originally generate by wxGlade
69          self.panel_1 = wxPanel(self, -1)          self.panel_1 = wxPanel(self, -1)
70          self.panel_edit = wxPanel(self, -1)          self.panel_edit = wxPanel(self, -1)
71          self.panel_buttons = wxPanel(self, -1)          self.label_5 = wxStaticText(self.panel_1, -1,
72          self.label_5 = wxStaticText(self.panel_1, -1, _("Available Projections:"))                          _("Available Projections:"))
73          self.availprojs = wxListBox(self.panel_1, ID_PROJ_AVAIL, style=wxLB_EXTENDED |wxLB_SORT)  
74            # Projection List specific actions (Import/Export/Remove)
75            self.button_import = wxButton(self.panel_1, ID_PROJ_IMPORT,
76                                          _("Import..."))
77            self.button_export = wxButton(self.panel_1, ID_PROJ_EXPORT,
78                                          _("Export..."))
79            self.button_remove = wxButton(self.panel_1, ID_PROJ_REMOVE,
80                                          _("Remove"))
81    
82            # The Projection List
83            self.availprojs = wxListBox(self.panel_1, ID_PROJ_AVAIL,
84                                        style=wxLB_EXTENDED|wxLB_SORT)
85          self.projfilepath = wxStaticText(self.panel_1, -1, "")          self.projfilepath = wxStaticText(self.panel_1, -1, "")
86    
87            # Projection Specific Entries (Name/Projection)
88          self.label_2 = wxStaticText(self.panel_edit, -1, _("Name:"))          self.label_2 = wxStaticText(self.panel_edit, -1, _("Name:"))
89          self.projname = wxTextCtrl(self.panel_edit, ID_PROJ_PROJNAME, "")          self.projname = wxTextCtrl(self.panel_edit, ID_PROJ_PROJNAME, "")
90          self.label_3 = wxStaticText(self.panel_edit, -1, _("Projection:"))          self.label_3 = wxStaticText(self.panel_edit, -1, _("Projection:"))
91          self.projchoice = wxChoice(self.panel_edit, ID_PROJ_PROJCHOICE)          self.projchoice = wxChoice(self.panel_edit, ID_PROJ_PROJCHOICE)
92          self.button_import = wxButton(self.panel_1, ID_PROJ_IMPORT, _("Import..."))  
93          self.button_export = wxButton(self.panel_1, ID_PROJ_EXPORT, _("Export..."))          # Projection Specific actions (New/Save/Add)
         self.button_remove = wxButton(self.panel_1, ID_PROJ_REMOVE, _("Remove"))  
94          self.button_new = wxButton(self.panel_edit, ID_PROJ_NEW, _("New"))          self.button_new = wxButton(self.panel_edit, ID_PROJ_NEW, _("New"))
95          self.button_save = wxButton(self.panel_edit, ID_PROJ_SAVE,_("Save"))          self.button_add = wxButton(self.panel_edit, ID_PROJ_ADDTOLIST,
         self.button_add = wxButton(self.panel_edit, ID_PROJ_SAVEAS,  
96                                        _("Add to List"))                                        _("Add to List"))
97          self.button_try = wxButton(self.panel_buttons, ID_PROJ_TRY, _("Try"))          self.button_save = wxButton(self.panel_edit, ID_PROJ_SAVE,_("Update"))
98          self.button_revert = wxButton(self.panel_buttons, ID_PROJ_REVERT, _("Revert"))  
99          self.button_ok = wxButton(self.panel_buttons, ID_PROJ_OK, _("OK"))          # Main Action buttons (Try/Revert/OK/Close)
100          self.button_close = wxButton(self.panel_buttons, ID_PROJ_CLOSE, _("Close"))          self.button_try = wxButton(self, wxID_APPLY, _("Try"))
101            self.button_revert = wxButton(self, ID_PROJ_REVERT,
102                                          _("Revert"))
103            self.button_ok = wxButton(self, wxID_OK, _("OK"))
104            self.button_ok.SetDefault()
105            self.button_close = wxButton(self, wxID_CANCEL,
106                                         _("Close"))
107    
108          self.__set_properties()          self.__set_properties()
109          self.__do_layout()          self.__do_layout()
110    
111          # wxGlade          # wxGlade
112    
113            # Fill the projection choice list.
114            for proj, name, clazz in self.projPanels:
115                self.projchoice.Append(name, [clazz, None])
116    
117            self.originalProjection = self.receiver.GetProjection()
118    
119          self.__DoOnProjAvail()          self.__DoOnProjAvail()
120            self.button_ok.SetFocus()
121            self.availprojs.SetFocus()
122                    
123          EVT_BUTTON(self, ID_PROJ_TRY, self._OnTry)          EVT_BUTTON(self, wxID_APPLY, self.OnApply)
124          EVT_BUTTON(self, ID_PROJ_REVERT, self._OnRevert)          EVT_BUTTON(self, ID_PROJ_REVERT, self._OnRevert)
125          EVT_BUTTON(self, ID_PROJ_OK, self._OnOK)          EVT_BUTTON(self, wxID_OK, self.OnOK)
126          EVT_BUTTON(self, ID_PROJ_CLOSE, self._OnClose)          EVT_BUTTON(self, wxID_CANCEL, self.OnCancel)
127          EVT_CHOICE(self, ID_PROJ_PROJCHOICE, self._OnProjChoice)          EVT_CHOICE(self, ID_PROJ_PROJCHOICE, self._OnProjChoice)
128          EVT_LISTBOX(self, ID_PROJ_AVAIL, self._OnProjAvail)          EVT_LISTBOX(self, ID_PROJ_AVAIL, self._OnProjAvail)
129          EVT_BUTTON(self, ID_PROJ_IMPORT, self._OnImport)          EVT_BUTTON(self, ID_PROJ_IMPORT, self._OnImport)
# Line 97  class ProjFrame(NonModalDialog): Line 132  class ProjFrame(NonModalDialog):
132    
133          EVT_BUTTON(self, ID_PROJ_NEW, self._OnNew)          EVT_BUTTON(self, ID_PROJ_NEW, self._OnNew)
134          EVT_BUTTON(self, ID_PROJ_SAVE, self._OnSave)          EVT_BUTTON(self, ID_PROJ_SAVE, self._OnSave)
135          EVT_BUTTON(self, ID_PROJ_SAVEAS, self._OnSaveAs)          EVT_BUTTON(self, ID_PROJ_ADDTOLIST, self._OnAddToList)
136    
137          EVT_TEXT(self, ID_PROJ_PROJNAME, self._OnProjName)          EVT_TEXT(self, ID_PROJ_PROJNAME, self._OnProjName)
138    
139      def GetReceiver(self):      def OnApply(self, event):
         return self.receiver  
   
     def _OnTry(self, event):  
140          self.__SetProjection()          self.__SetProjection()
141            self.haveTried = True
142    
143      def _OnRevert(self, event):      def OnOK(self, event):
         if self.originalProjection != -1:  
             self.receiver.SetProjection(self.originalProjection)  
   
     def _OnOK(self, event):  
144          self.__SetProjection()          self.__SetProjection()
145          self.Close()          self.Close()
146    
147      def _OnClose(self, event):      def OnCancel(self, event):
148            """Cancel just closes the dialog, but we call it cancel so we
149            can overload the functionality of wxDialog.
150            """
151          self.Close()          self.Close()
152    
153        def _OnRevert(self, event):
154            if self.haveTried:
155                self.receiver.SetProjection(self.originalProjection)
156                self.haveTried = False
157    
158      def _OnNew(self, event):      def _OnNew(self, event):
159          self.__DoOnNew()  
160            # clear all selections
161            sel = self.availprojs.GetSelections()
162            for index in sel:
163                self.availprojs.SetSelection(index, False)
164    
165            self.projname.Clear()
166    
167            # supply a projection panel if there wasn't one
168            if self.curProjPanel is None:
169                self.projchoice.SetSelection(0)
170                self.__DoOnProjChoice()
171    
172            self.curProjPanel.Clear()
173    
174      def _OnSave(self, event):      def _OnSave(self, event):
175    
# Line 133  class ProjFrame(NonModalDialog): Line 183  class ProjFrame(NonModalDialog):
183          newproj = self.__GetProjection()          newproj = self.__GetProjection()
184    
185          if newproj is not None:          if newproj is not None:
186              projfile.Remove(proj)              projfile.Replace(proj, newproj)
             projfile.Add(newproj)  
187              try:              try:
188                  WriteProjFile(projfile)                  write_proj_file(projfile)
189              except IOError, (errno, errstr):              except IOError, (errno, errstr):
190                  wxMessageDialog(self,                  self.__ShowError(projfile.GetFilename(), errstr)
191                      _("The following error occured:\n") +              self.availprojs.SetClientData(sel[0], [newproj, projfile])
                     projfile.GetFileName() + "\n" + errstr,  
                     _("Error"), wxOK | wxICON_ERROR).ShowModal()  
             self.__FillAvailList()  
192    
193      def _OnSaveAs(self, event):              self.__FillAvailList( selectProj = newproj.GetName())
194    
195        def _OnAddToList(self, event):
196    
197          proj = self.__GetProjection()          proj = self.__GetProjection()
198          if proj is not None:          if proj is not None:
199              self.__usrProjFile.Add(proj)              self.__usrProjFile.Add(proj)
200              try:              try:
201                  WriteProjFile(self.__usrProjFile)                  write_proj_file(self.__usrProjFile)
202              except IOError, (errno, errstr):              except IOError, (errno, errstr):
203                  wxMessageDialog(self,                  self.__ShowError(self.__userProjFile.GetFilename(), errstr)
                     _("The following error occured:\n") +  
                     self.__usrProjFile.GetFileName() + "\n" + errstr,  
                     _("Error"), wxOK | wxICON_ERROR).ShowModal()  
             self.__FillAvailList()  
204    
205          return              self.__FillAvailList( selectProj = proj.GetName())
206    
207          """Save the projection somewhere.      def _OnProjAvail(self, event):
208            self.__DoOnProjAvail()
209    
210          There are three important cases to consider.      def show_warnings(self, title, filename, warnings):
211              1. the file already exists and the user wants to overwrite it.          """Show the warnings (a list of strings) in a dialog
             2. the file already exists and the user wants to append the  
                current projection to the end of the file  
             3. the file doesn't exist and the user wants to create it  
212    
213          The list of available projections is then updated.          If the list is empty no dialog will be shown.
214          """          """
215            if warnings:
216          proj = Projection(self.curProjPanel.GetParameters())              text = (_('Warnings when reading "%s":\n\n%s')
217          if self.projname.GetValue() != "":                      % (filename, "\n\n".join(warnings)))
218              proj.SetName(self.projname.GetValue())              self.parent.RunMessageBox(title, text)
   
         dlg = wxFileDialog(self, _("Save As"), style = wxSAVE)  
         if dlg.ShowModal() == wxID_OK:  
             path = dlg.GetPath()  
   
             if os.access(path, os.F_OK):  
                 # file already exists.  
                 if os.access(path, os.W_OK | os.R_OK):  
                   
                     # is it a .proj file?  
                     try:  
                         projFile = ReadProjFile(path)  
                     except:  
                         # obviously not.  
                         dlg = wxMessageDialog(self,  
                             path + _(" already exists. Overwrite?"),  
                             "",  
                             wxYES | wxNO)  
   
                         if dlg.ShowModal() == wxID_YES:  
                             projFile = ProjFile(path)  
                         else:  
                             return # returning early  
                     else:  
                         # ask the user to overwrite or append  
                         dlg = wxMessageDialog(self,  
                             _("The selected projection file already exists.\n"+  
                               "The current projection can be added to the " +  
                               "file, or it can completely replace the " +  
                               "selected file.\n\nShould the current " +  
                               "projection be added to the file?"),  
                             _("Question"),  
                             wxYES | wxNO | wxICON_QUESTION)  
   
                         if dlg.ShowModal() == wxID_NO:  
                             projFile = ProjFile(path)  
                 else:  
                     # can't access the file  
                     dlg = wxMessageDialog(self,  
                         _("Couldn't access ") + path,  
                         "",  
                         wxOK | wxICON | wxICON_EXCLAMATION)  
                     return  
   
             else:  
                 # file doesn't exist. make a new one.  
                 projFile = ProjFile(path)  
                   
             #  
             # if we get this far we have a valid projFile and  
             # can just write the file  
             #  
             projFile.Add(proj)  
             try:  
                 WriteProjFile(projFile)  
                 self.__FillAvailList()  
             except IOError, (errno, errstr):  
                 wxMessageDialog(self,  
                     _("The following error occured:\n") +  
                     dlg.GetPath() + "\n" + errstr,  
                     _("Error"), wxOK | wxICON_ERROR).ShowModal()  
         dlg.Destroy()  
   
     def _OnProjAvail(self, event):  
         self.__DoOnProjAvail()  
219    
220      def _OnImport(self, event):      def _OnImport(self, event):
221    
# Line 248  class ProjFrame(NonModalDialog): Line 225  class ProjFrame(NonModalDialog):
225              path = dlg.GetPath()              path = dlg.GetPath()
226    
227              try:              try:
228                  projFile = ReadProjFile(path)                  projFile, warnings = read_proj_file(path)
229                    self.show_warnings(_("Warnings"), path, warnings)
230                  for proj in projFile.GetProjections():                  for proj in projFile.GetProjections():
231                      self.__usrProjFile.Add(proj)                      self.__usrProjFile.Add(proj)
232                  WriteProjFile(self.__usrProjFile)                  write_proj_file(self.__usrProjFile)
233              except IOError, (errno, errstr):              except IOError, (errno, errstr):
234                  wxMessageDialog(self,                  self.__ShowError(dlg.GetPath(), errstr)
                     _("The following error occured:\n") +  
                     dlg.GetPath() + "\n" + errstr,  
                     _("Error"), wxOK | wxICON_ERROR).ShowModal()  
235    
236              self.__FillAvailList()              self.__FillAvailList()
237    
238          dlg.Destroy()          dlg.Destroy()
239    
240      def _OnExport(self, event):      def _OnExport(self, event):
         proj = self.__GetProjection()  
241    
242          if proj is None: return          sel = self.availprojs.GetSelections()
243            assert len(sel) != 0, "button should be disabled"
244    
245          dlg = wxFileDialog(self, _("Export"),          dlg = wxFileDialog(self, _("Export"),
246                             style = wxSAVE|wxOVERWRITE_PROMPT)                          style = wxSAVE|wxOVERWRITE_PROMPT)
247    
248          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
249              path = dlg.GetPath()              path = dlg.GetPath()
250    
251              projFile = ProjFile(path)              projFile = ProjFile(path)
252              projFile.Add(proj)  
253                for i in sel:
254                    proj = self.availprojs.GetClientData(i)[CLIENT_PROJ]
255                    if proj is not None:
256                        projFile.Add(proj)
257    
258              try:              try:
259                  WriteProjFile(projFile)                  write_proj_file(projFile)
260              except IOError, (errno, errstr):              except IOError, (errno, errstr):
261                  wxMessageDialog(self,                  self.__ShowError(dlg.GetPath(), errstr)
                     _("The following error occured:\n") +  
                     dlg.GetPath() + "\n" + errstr,  
                     _("Error"), wxOK | wxICON_ERROR).ShowModal()  
262    
263          dlg.Destroy()          dlg.Destroy()
264    
# Line 314  class ProjFrame(NonModalDialog): Line 291  class ProjFrame(NonModalDialog):
291                  projfile.Remove(proj)                  projfile.Remove(proj)
292    
293          try:          try:
294              WriteProjFile(projfile)              write_proj_file(projfile)
295          except IOError, (errno, errstr):          except IOError, (errno, errstr):
296              wxMessageDialog(self,              self.__ShowError(projfile.GetFilename(), errstr)
                 _("The following error occured:\n") +  
                 projfile.GetFileName() + "\n" + errstr,  
                 _("Error"), wxOK | wxICON_ERROR).ShowModal()  
   
297    
298          self.__FillAvailList()          self.__FillAvailList()
299    
# Line 332  class ProjFrame(NonModalDialog): Line 305  class ProjFrame(NonModalDialog):
305          if newselection != -1 and self.availprojs.GetCount() > 0:          if newselection != -1 and self.availprojs.GetCount() > 0:
306              self.availprojs.SetSelection(newselection)              self.availprojs.SetSelection(newselection)
307    
308            self.__VerifyButtons()
309    
310      def _OnProjName(self, event):      def _OnProjName(self, event):
311          self.__VerifyButtons()          self.__VerifyButtons()
312    
313        def __ShowError(self, filename, errstr):
314            wxMessageDialog(self,
315                _("The following error occured:\n") +
316                filename + "\n" + errstr,
317                _("Error"), wxOK | wxICON_ERROR).ShowModal()
318    
319      def __VerifyButtons(self):      def __VerifyButtons(self):
320            """Enable or disable the appropriate buttons based on the
321            current state of the dialog.
322            """
323    
324          sel = self.availprojs.GetSelections()          sel = self.availprojs.GetSelections()
325    
326          self.button_import.Enable(True)          self.button_import.Enable(True)
# Line 345  class ProjFrame(NonModalDialog): Line 330  class ProjFrame(NonModalDialog):
330    
331          self.panel_edit.Enable(True)          self.panel_edit.Enable(True)
332    
333            for ctrl in [self.button_import,
334                         self.button_export,
335                         self.button_remove,
336                         self.button_save,
337                         self.button_add,
338                         self.projchoice,
339                         self.projname,
340                         self.panel_edit]:
341                ctrl.Enable(True)
342    
343            if self.curProjPanel is not None:
344                self.curProjPanel.Enable(True)
345    
346          if len(sel) == 0:          if len(sel) == 0:
347              self.button_import.Enable(True)              self.button_import.Enable(True)
348              self.button_export.Enable(False)              self.button_export.Enable(False)
349              self.button_remove.Enable(False)              self.button_remove.Enable(False)
350                self.button_save.Enable(False)
351    
352          elif len(sel) == 1:          elif len(sel) == 1:
353    
# Line 358  class ProjFrame(NonModalDialog): Line 357  class ProjFrame(NonModalDialog):
357              self.button_add.Enable(len(self.projname.GetValue()) > 0)              self.button_add.Enable(len(self.projname.GetValue()) > 0)
358    
359              if proj is None:              if proj is None:
360                  self.button_export.Enable(False)                  # <None> is selected
361                    for ctrl in [self.button_export,
362                                 self.button_remove,
363                                 self.button_save,
364                                 self.button_add,
365                                 self.projchoice,
366                                 self.projname]:
367                        ctrl.Enable(False)
368    
369                    if self.curProjPanel is not None:
370                        self.curProjPanel.Enable(False)
371    
372                elif proj is self.originalProjection:
373                  self.button_remove.Enable(False)                  self.button_remove.Enable(False)
374    
375              if projFile is None:              if projFile is None:
# Line 367  class ProjFrame(NonModalDialog): Line 378  class ProjFrame(NonModalDialog):
378          else:          else:
379              self.panel_edit.Enable(False)              self.panel_edit.Enable(False)
380    
     def __DoOnNew(self):  
         sel = self.availprojs.GetSelections()  
         if len(sel) != 0:  
             self.availprojs.SetSelection(sel, False)  
         self.projname.Clear()  
         self.curProjPanel.Clear()  
   
381      def __DoOnProjAvail(self):      def __DoOnProjAvail(self):
382    
383          sel = self.availprojs.GetSelections()          sel = self.availprojs.GetSelections()
# Line 385  class ProjFrame(NonModalDialog): Line 389  class ProjFrame(NonModalDialog):
389              if proj is None:              if proj is None:
390                  # user selected <None>                  # user selected <None>
391                  self.projname.Clear()                  self.projname.Clear()
392                    self.projfilepath.SetLabel(_("Projection File: "))
393              else:              else:
394                            
395                  if projfile is not None:                  if projfile is not None:
396                      self.projfilepath.SetLabel(projfile.GetFileName())                      self.projfilepath.SetLabel(_("Projection File: ") +
397                            os.path.basename(projfile.GetFilename()))
398                  else:                  else:
399                      # only None if the currently used projection is selected                      # only None if the currently used projection is selected
400                      self.projfilepath.SetLabel("")                      self.projfilepath.SetLabel(_("Projection File: "))
401    
402                  self.projname.SetValue(proj.GetName())                  self.projname.SetValue(proj.GetName())
403    
# Line 399  class ProjFrame(NonModalDialog): Line 405  class ProjFrame(NonModalDialog):
405                  i = 0                  i = 0
406                  for projType, name, clazz in self.projPanels:                  for projType, name, clazz in self.projPanels:
407                      if myProjType == projType:                      if myProjType == projType:
408                            self.projchoice.Enable(True)
409                          self.projchoice.SetSelection(i)                          self.projchoice.SetSelection(i)
410                          self.__DoOnProjChoice()                          self.__DoOnProjChoice()
411    
412                            #
413                            # self.curProjPanel should not be null
414                            # after a call to __DoOnProjChoice
415                            #
416                            assert self.curProjPanel is not None
417    
418                          self.curProjPanel.SetProjection(proj)                          self.curProjPanel.SetProjection(proj)
419                            break
420                      i += 1                      i += 1
421                    else:
422                        self.projchoice.Disable()
423                        self._show_proj_panel(UnknownProjPanel(self.panel_edit,
424                                                               self.receiver))
425    
426          self.__VerifyButtons()          self.__VerifyButtons()
427    
# Line 410  class ProjFrame(NonModalDialog): Line 429  class ProjFrame(NonModalDialog):
429          self.__DoOnProjChoice()          self.__DoOnProjChoice()
430    
431      def __DoOnProjChoice(self):      def __DoOnProjChoice(self):
432            """Create and layout a projection panel based on the selected
433            projection type.
434    
435            This is necessary to have in seperate method since calls to
436            wxChoice.SetSelection() do not trigger an event.
437    
438            At the end of this method self.curProjPanel will not be None
439            if there was a item selected.
440            """
441    
442          choice = self.projchoice          choice = self.projchoice
443    
444          sel = choice.GetSelection()          sel = choice.GetSelection()
445          if sel != -1:          if sel != -1:
   
446              clazz, obj = choice.GetClientData(sel)              clazz, obj = choice.GetClientData(sel)
   
447              if obj is None:              if obj is None:
448                  obj = clazz(self.panel_edit, self.receiver)                  obj = clazz(self.panel_edit, self.receiver)
449                  choice.SetClientData(sel, [clazz, obj])                  choice.SetClientData(sel, [clazz, obj])
450                self._show_proj_panel(obj)
451    
452              if self.curProjPanel is not None:      def _show_proj_panel(self, panel):
453                  self.curProjPanel.Hide()          """Show the panel as the projection panel"""
454                  self.sizer_projctrls.Remove(self.curProjPanel)          if self.curProjPanel is not None:
455                self.curProjPanel.Hide()
456              self.curProjPanel = obj              self.sizer_projctrls.Remove(self.curProjPanel)
457              self.curProjPanel.Show()  
458            self.curProjPanel = panel
459              self.sizer_projctrls.Add(self.curProjPanel, 1,          self.curProjPanel.Show()
460                  wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)  
461              self.sizer_projctrls.Layout()          self.sizer_projctrls.Add(self.curProjPanel, 1,
462              self.Layout()              wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)
463              self.topBox.SetSizeHints(self)          self.sizer_projctrls.Layout()
464            self.Layout()
465            self.topBox.SetSizeHints(self)
466    
467      def __SetProjection(self):      def __SetProjection(self):
468            """Set the receiver's projection."""
469    
470          #          #
471          # save the original projection only once in case          # save the original projection only once in case
472          # we try to apply several different projections          # we try to apply several different projections
473          #          #
         if self.originalProjection == -1:  
             self.originalProjection = self.receiver.GetProjection()  
   
474          self.receiver.SetProjection(self.__GetProjection())          self.receiver.SetProjection(self.__GetProjection())
475    
476      def __GetProjection(self):      def __GetProjection(self):
477          """Return the packaged projection.          """Return a suitable Projection object based on the current
478            state of the dialog box selections.
479    
480          Could be None.          Could be None.
481          """          """
482    
483          proj = None          sel = self.availprojs.GetSelections()
484            assert len(sel) < 2, "button should be disabled"
485    
486    
487            if len(sel) == 1:
488                proj = self.availprojs.GetClientData(sel[0])[CLIENT_PROJ]
489                if proj is None:
490                    # <None> is selected
491                    return None
492    
493            #
494            # self.curProjPanel should always contain the most
495            # relevant data for a projection
496            #
497          if self.curProjPanel is not None:          if self.curProjPanel is not None:
498              proj = Projection(self.curProjPanel.GetParameters())              return Projection(self.curProjPanel.GetParameters(),
499              proj.SetName(self.projname.GetValue())                                self.projname.GetValue())
500    
501          return proj          return None
502    
503        def __FillAvailList(self, selectCurrent = False, selectProj = None):
504            """Populate the list of available projections.
505            
506            selectCurrent -- if True, select the projection used by
507                             the receiver, otherwise select nothing.
508            selectProj    -- if set, select the projection found under the
509                             specified name. This overwrites any other
510                             selection estimate.
511            """
512    
     def __FillAvailList(self):  
513          self.availprojs.Clear()          self.availprojs.Clear()
514    
515          #          #
# Line 468  class ProjFrame(NonModalDialog): Line 518  class ProjFrame(NonModalDialog):
518          #          #
519          self.availprojs.Append("<None>", (None, None))          self.availprojs.Append("<None>", (None, None))
520    
521          self.__sysProjFile = None          projfile, warnings = get_system_proj_file()
522          self.__usrProjFile = None          self.show_warnings(_("Warnings"), projfile.GetFilename(), warnings)
523            for proj in projfile.GetProjections():
524          projfile = GetSystemProjFiles()              self.availprojs.Append(proj.GetName(), [proj, projfile])
525          if len(projfile) > 0:          self.__sysProjFile = projfile
526              projfile = projfile[0]  
527              for proj in projfile.GetProjections():          projfile, warnings = get_user_proj_file()
528                  self.availprojs.Append(proj.GetName(), [proj, projfile])          self.show_warnings(_("Warnings"), projfile.GetFilename(), warnings)
529              self.__sysProjFile = projfile          for proj in projfile.GetProjections():
530                self.availprojs.Append(proj.GetName(), [proj, projfile])
531          projfile = GetUserProjFiles()          self.__usrProjFile = projfile
         if len(projfile) > 0:  
             projfile = projfile[0]  
             for proj in projfile.GetProjections():  
                 self.availprojs.Append(proj.GetName(), [proj, projfile])  
             self.__usrProjFile = projfile  
   
 #       projfiles = GetSystemProjFiles()  
 #       for projfile in projfiles:  
 #           for proj in projfile.GetProjections():  
 #               self.availprojs.Append(proj.GetName(), [proj, projfile])  
 #       self.__sysProjFiles = projfiles  
   
 #       projfiles = GetUserProjFiles()  
 #       for projfile in projfiles:  
 #           for proj in projfile.GetProjections():  
 #               self.availprojs.Append(proj.GetName(), [proj, projfile])  
 #       self.__usrProjFiles = projfiles  
532    
533            #
534            # We add the current projection to the list at last.
535            # Since the list is resorted immediately a following FindString()
536            # determines the index correctly.
537            #
538          proj = self.receiver.GetProjection()          proj = self.receiver.GetProjection()
539          if proj is not None:          if proj is not None:
540              self.availprojs.Append(proj.GetName() + _(" (current)"),              proj_item = _("%s (current)") % proj.GetName()
541                                     [proj, None])              self.availprojs.Append(proj_item, [proj, None])
542                if selectCurrent:
543                    self.availprojs.SetSelection(
544                            self.availprojs.FindString(proj_item)
545                        )
546            else:
547                if selectCurrent:
548                    self.availprojs.SetSelection(
549                            self.availprojs.FindString("<None>")
550                        )
551            if selectProj:
552                self.availprojs.SetSelection(
553                            self.availprojs.FindString(selectProj)
554                        )
555    
556          for proj, name, clazz in self.projPanels:                  
             self.projchoice.Append(name, [clazz, None])  
557    
558      def __set_properties(self):      def __set_properties(self):
         self.__FillAvailList()  
559    
560          # begin wxGlade: ProjFrame.__set_properties          #self.availprojs.SetSelection(0)
         self.SetTitle(_("Projections"))  
         self.availprojs.SetSelection(0)  
561          self.projchoice.SetSelection(0)          self.projchoice.SetSelection(0)
562          # end wxGlade  
563            self.__FillAvailList(selectCurrent = True)
564    
565          self.projname.SetMaxLength(32)          self.projname.SetMaxLength(32)
566    
# Line 522  class ProjFrame(NonModalDialog): Line 570  class ProjFrame(NonModalDialog):
570          self.topBox = wxBoxSizer(wxVERTICAL)          self.topBox = wxBoxSizer(wxVERTICAL)
571          self.sizer_panel = wxBoxSizer(wxVERTICAL)          self.sizer_panel = wxBoxSizer(wxVERTICAL)
572          sizer_6 = wxBoxSizer(wxHORIZONTAL)          sizer_6 = wxBoxSizer(wxHORIZONTAL)
573            self.sizer_mainbttns = wxBoxSizer(wxHORIZONTAL)
574          self.sizer_mainctrls = wxBoxSizer(wxHORIZONTAL)          self.sizer_mainctrls = wxBoxSizer(wxHORIZONTAL)
575          self.sizer_edit = wxStaticBoxSizer(wxStaticBox(self.panel_edit, -1, _("Edit")), wxHORIZONTAL)          self.sizer_edit = wxStaticBoxSizer(wxStaticBox(self.panel_edit, -1, _("Edit")), wxHORIZONTAL)
576          sizer_11 = wxBoxSizer(wxVERTICAL)          sizer_11 = wxBoxSizer(wxVERTICAL)
# Line 540  class ProjFrame(NonModalDialog): Line 589  class ProjFrame(NonModalDialog):
589          grid_sizer_1.Add(20, 20, 0, wxEXPAND, 0)          grid_sizer_1.Add(20, 20, 0, wxEXPAND, 0)
590          grid_sizer_1.Add(self.availprojs, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)          grid_sizer_1.Add(self.availprojs, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)
591          grid_sizer_1.Add(sizer_15, 0, wxALL|wxEXPAND, 4)          grid_sizer_1.Add(sizer_15, 0, wxALL|wxEXPAND, 4)
592          grid_sizer_1.Add(self.projfilepath, 0, wxALL|wxADJUST_MINSIZE, 4)          grid_sizer_1.Add(self.projfilepath, 0, wxEXPAND|wxALL|wxADJUST_MINSIZE, 4)
593          grid_sizer_1.AddGrowableRow(1)          grid_sizer_1.AddGrowableRow(1)
594          grid_sizer_1.AddGrowableCol(0)          grid_sizer_1.AddGrowableCol(0)
595    
# Line 549  class ProjFrame(NonModalDialog): Line 598  class ProjFrame(NonModalDialog):
598          sizer_13.Add(self.projname, 1, wxALL, 4)          sizer_13.Add(self.projname, 1, wxALL, 4)
599          self.sizer_projctrls.Add(sizer_13, 0, wxEXPAND, 0)          self.sizer_projctrls.Add(sizer_13, 0, wxEXPAND, 0)
600          sizer_14.Add(self.label_3, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)          sizer_14.Add(self.label_3, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)
601          sizer_14.Add(self.projchoice, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)          sizer_14.Add(self.projchoice, 1, wxALL|wxALIGN_CENTER_VERTICAL, 4)
602          self.sizer_projctrls.Add(sizer_14, 0, wxEXPAND, 0)          self.sizer_projctrls.Add(sizer_14, 0, wxEXPAND, 0)
603          self.sizer_edit.Add(self.sizer_projctrls, 1, wxEXPAND, 0)          self.sizer_edit.Add(self.sizer_projctrls, 1, wxEXPAND, 0)
604          sizer_11.Add(self.button_new, 0, wxALL|wxEXPAND, 4)          sizer_11.Add(self.button_new, 0, wxEXPAND|wxALL, 4)
605          sizer_11.Add(self.button_save, 0, wxALL|wxEXPAND, 4)          sizer_11.Add(self.button_add, 0, wxEXPAND|wxALL, 4)
606          sizer_11.Add(self.button_add, 0, wxALL|wxEXPAND, 4)          sizer_11.Add(20, 20, 0, wxEXPAND, 0)
607            sizer_11.Add(self.button_save, 0, wxEXPAND|wxALL|wxALIGN_BOTTOM, 4)
608          self.sizer_edit.Add(sizer_11, 0, wxALL|wxEXPAND, 4)          self.sizer_edit.Add(sizer_11, 0, wxALL|wxEXPAND, 4)
609    
610          sizer_6.Add(20, 20, 1, wxEXPAND, 0)          sizer_6.Add(self.button_try, 0, wxRIGHT| wxEXPAND, 10)
611          sizer_6.Add(self.button_try, 0, wxALL, 4)          sizer_6.Add(self.button_revert, 0, wxRIGHT| wxEXPAND, 10)
612          sizer_6.Add(20, 20, 1, 0, 0)          sizer_6.Add(self.button_ok, 0, wxRIGHT| wxEXPAND, 10)
613          sizer_6.Add(self.button_revert, 0, wxALL, 4)          sizer_6.Add(self.button_close, 0, wxRIGHT| wxEXPAND, 10)
         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)  
614    
615          self.panel_1.SetAutoLayout(1)          self.panel_1.SetAutoLayout(1)
616          self.panel_1.SetSizer(grid_sizer_1)          self.panel_1.SetSizer(grid_sizer_1)
# Line 577  class ProjFrame(NonModalDialog): Line 622  class ProjFrame(NonModalDialog):
622          self.sizer_edit.Fit(self.panel_edit)          self.sizer_edit.Fit(self.panel_edit)
623          self.sizer_edit.SetSizeHints(self.panel_edit)          self.sizer_edit.SetSizeHints(self.panel_edit)
624    
         self.panel_buttons.SetAutoLayout(1)  
         self.panel_buttons.SetSizer(sizer_6)  
         sizer_6.Fit(self.panel_buttons)  
         sizer_6.SetSizeHints(self.panel_buttons)  
   
625          self.sizer_mainctrls.Add(self.panel_1, 0,          self.sizer_mainctrls.Add(self.panel_1, 0,
626              wxALL|wxEXPAND|wxADJUST_MINSIZE, 0)              wxALL|wxEXPAND|wxADJUST_MINSIZE, 0)
627          self.sizer_mainctrls.Add(self.panel_edit, 1,          self.sizer_mainctrls.Add(self.panel_edit, 1,
628              wxALL|wxEXPAND|wxADJUST_MINSIZE, 0)              wxALL|wxEXPAND|wxADJUST_MINSIZE, 0)
629    
630            self.sizer_mainbttns.Add(sizer_6, 0,
631                wxALL|wxEXPAND|wxADJUST_MINSIZE, 10)
632    
633          self.topBox.Add(self.sizer_mainctrls, 1, wxALL|wxEXPAND, 4)          self.topBox.Add(self.sizer_mainctrls, 1, wxALL|wxEXPAND, 4)
634          self.topBox.Add(self.panel_buttons, 0, wxEXPAND, 0)          self.topBox.Add(self.sizer_mainbttns, 0, wxALIGN_RIGHT|wxBOTTOM, 0)
635    
636          self.SetAutoLayout(1)          self.SetAutoLayout(1)
637          self.SetSizer(self.topBox)          self.SetSizer(self.topBox)
# Line 606  class ProjPanel(wxPanel): Line 649  class ProjPanel(wxPanel):
649          wxPanel.__init__(self, parent, -1)          wxPanel.__init__(self, parent, -1)
650    
651          self.__ellps = wxChoice(self, -1)          self.__ellps = wxChoice(self, -1)
652          self.ellpsData = [("bessel", _("Bessel 1841")),          self.ellpsData = [("airy"  , _("Airy")),
653                              ("bessel", _("Bessel 1841")),
654                            ("clrk66", _("Clarke 1866")),                            ("clrk66", _("Clarke 1866")),
655                            ("clrk80", _("Clarke 1880")),                            ("clrk80", _("Clarke 1880")),
656                            ("GRS80" , _("GRS 1980 (IUGG, 1980)")),                            ("GRS80" , _("GRS 1980 (IUGG, 1980)")),
# Line 622  class ProjPanel(wxPanel): Line 666  class ProjPanel(wxPanel):
666    
667          panelSizer = wxBoxSizer(wxVERTICAL)          panelSizer = wxBoxSizer(wxVERTICAL)
668    
         if childPanel is not None:  
             panelSizer.Add(childPanel, 0, wxALL|wxEXPAND, 4)  
               
669          sizer = wxBoxSizer(wxHORIZONTAL)          sizer = wxBoxSizer(wxHORIZONTAL)
670          sizer.Add(wxStaticText(self, -1, _("Ellipsoid:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("Ellipsoid:")), 0,
671          sizer.Add(self.__ellps, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)                                      wxALL|wxALIGN_CENTER_VERTICAL, 4)
672            sizer.Add(self.__ellps, 1, wxALL|wxALIGN_CENTER_VERTICAL, 4)
673          panelSizer.Add(sizer, 0, wxALL|wxEXPAND, 4)          panelSizer.Add(sizer, 0, wxALL|wxEXPAND, 4)
674    
675            if childPanel is not None:
676                panelSizer.Add(childPanel, 0, wxEXPAND, 0)
677                
678          self.SetAutoLayout(1)          self.SetAutoLayout(1)
679          self.SetSizer(panelSizer)          self.SetSizer(panelSizer)
680          panelSizer.Fit(self)          panelSizer.Fit(self)
# Line 663  ID_TMPANEL_FALSE_NORTH = 4004 Line 708  ID_TMPANEL_FALSE_NORTH = 4004
708  ID_TMPANEL_SCALE = 4005  ID_TMPANEL_SCALE = 4005
709    
710  class UnknownProjPanel(ProjPanel):  class UnknownProjPanel(ProjPanel):
711    
712        """Panel for unknown projection types"""
713    
714      def __init__(self, parent, receiver):      def __init__(self, parent, receiver):
715          ProjPanel.__init__(self, parent)          ProjPanel.__init__(self, parent)
716    
# Line 671  class UnknownProjPanel(ProjPanel): Line 719  class UnknownProjPanel(ProjPanel):
719      def _DoLayout(self):      def _DoLayout(self):
720          sizer = wxBoxSizer(wxVERTICAL)          sizer = wxBoxSizer(wxVERTICAL)
721    
722          sizer.Add(wxStaticText(self, -1,          sizer.Add(wxStaticText(self, -1,
723              _("Thuban does not know the parameters for the " +                                 _("Thuban does not know the parameters for the"
724                "current projection and cannot display a " +                                   " current projection\n"
725                "configuration panel.")))                                   "and cannot display a configuration panel.")))
726    
727          ProjPanel._DoLayout(self, sizer)          ProjPanel._DoLayout(self, sizer)
728    
# Line 695  class TMPanel(ProjPanel): Line 743  class TMPanel(ProjPanel):
743    
744          self.__latitude = wxTextCtrl(self, ID_TMPANEL_LAT)          self.__latitude = wxTextCtrl(self, ID_TMPANEL_LAT)
745          self.__longitude = wxTextCtrl(self, ID_TMPANEL_LONG)          self.__longitude = wxTextCtrl(self, ID_TMPANEL_LONG)
746            self.__scale = wxTextCtrl(self, ID_TMPANEL_SCALE)
747          self.__falseEast = wxTextCtrl(self, ID_TMPANEL_FASLE_EAST)          self.__falseEast = wxTextCtrl(self, ID_TMPANEL_FASLE_EAST)
748          self.__falseNorth = wxTextCtrl(self, ID_TMPANEL_FALSE_NORTH)          self.__falseNorth = wxTextCtrl(self, ID_TMPANEL_FALSE_NORTH)
         self.__scale = wxTextCtrl(self, ID_TMPANEL_SCALE)  
749    
750          self._DoLayout()          self._DoLayout()
751    
# Line 763  class UTMPanel(ProjPanel): Line 811  class UTMPanel(ProjPanel):
811          self.receiver = receiver          self.receiver = receiver
812    
813          self.__zone = wxSpinCtrl(self, ID_UTMPANEL_ZONE, "1", min=1, max=60)          self.__zone = wxSpinCtrl(self, ID_UTMPANEL_ZONE, "1", min=1, max=60)
814            self.__propButton = wxButton(self, ID_UTMPANEL_PROP, _("Propose"))
815          self.__south = wxCheckBox(self, ID_UTMPANEL_SOUTH,          self.__south = wxCheckBox(self, ID_UTMPANEL_SOUTH,
816                                    _("Southern Hemisphere"))                                    _("Southern Hemisphere"))
         self.__propButton = wxButton(self, ID_UTMPANEL_PROP, _("Propose"))  
817    
818          self._DoLayout()          self._DoLayout()
819    
# Line 805  class UTMPanel(ProjPanel): Line 853  class UTMPanel(ProjPanel):
853          ProjPanel.Clear(self)          ProjPanel.Clear(self)
854    
855      def _OnPropose(self, event):      def _OnPropose(self, event):
856          UTMProposeZoneDialog          """Call the propose dialog.
857            If the receiver (e.g. the current map) has no bounding box,
858            inform the user accordingly.
859            """
860            bb = self.receiver.BoundingBox()
861            if bb is None:
862                dlg = wxMessageDialog(self,
863                        _("Can not propose: No bounding box found."),
864                        _("Projection: Propose UTM Zone"),
865                        wxOK | wxICON_INFORMATION)
866                dlg.CenterOnParent()
867                result = dlg.ShowModal()
868                dlg.Destroy()
869                return
870    
871          dlg = UTMProposeZoneDialog(self, self.receiver.BoundingBox())          dlg = UTMProposeZoneDialog(self, self.receiver.BoundingBox())
872          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
873              self.__zone.SetValue(dlg.GetProposedZone())              self.__zone.SetValue(dlg.GetProposedZone())
# Line 834  class LCCPanel(ProjPanel): Line 896  class LCCPanel(ProjPanel):
896          sizer.Add(wxStaticText(self, -1,          sizer.Add(wxStaticText(self, -1,
897              _("Latitude of second standard parallel:")))              _("Latitude of second standard parallel:")))
898          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)  
899          sizer.Add(wxStaticText(self, -1, _("Central Meridian:")))          sizer.Add(wxStaticText(self, -1, _("Central Meridian:")))
900          sizer.Add(self.__meridian, 0, wxALL, 4)          sizer.Add(self.__meridian, 0, wxALL, 4)
901            sizer.Add(wxStaticText(self, -1, _("Latitude of origin:")))
902            sizer.Add(self.__originLat, 0, wxALL, 4)
903          sizer.Add(wxStaticText(self, -1, _("False Easting:")))          sizer.Add(wxStaticText(self, -1, _("False Easting:")))
904          sizer.Add(self.__falseEast, 0, wxALL, 4)          sizer.Add(self.__falseEast, 0, wxALL, 4)
905          sizer.Add(wxStaticText(self, -1, _("False Northing:")))          sizer.Add(wxStaticText(self, -1, _("False Northing:")))
# Line 885  class GeoPanel(ProjPanel): Line 947  class GeoPanel(ProjPanel):
947    
948      def __init__(self, parent, receiver):      def __init__(self, parent, receiver):
949          ProjPanel.__init__(self, parent)          ProjPanel.__init__(self, parent)
950          ProjPanel._DoLayout(self, None)  
951            self.__choices = [(_("Degrees"), "0.017453"),
952                              (_("Radians"), "1")]
953    
954            self.__scale = wxChoice(self, -1)
955            for choice, value in self.__choices:
956                self.__scale.Append(choice, value)
957    
958            self._DoLayout()
959    
960      def GetProjName(self):      def GetProjName(self):
961          return _("Geographic")          return _("Geographic")
962                    
963      def SetProjection(self, proj):      def SetProjection(self, proj):
964            value = proj.GetParameter("to_meter")
965            for i in range(len(self.__choices)):
966                choice, data = self.__choices[i]
967                if value == data:
968                    self.__scale.SetSelection(i)
969          ProjPanel.SetProjection(self, proj)          ProjPanel.SetProjection(self, proj)
970    
971      def GetParameters(self):      def GetParameters(self):
972          params = ["proj=latlong"]          params = ["proj=latlong",
973                      "to_meter=%s" % self.__scale.GetClientData(
974                                      self.__scale.GetSelection())]
975    
976          params.extend(ProjPanel.GetParameters(self))          params.extend(ProjPanel.GetParameters(self))
977          return params          return params
978    
979      def Clear(self):      def Clear(self):
980          ProjPanel.Clear(self)          ProjPanel.Clear(self)
981    
982        def _DoLayout(self):
983            sizer = wxBoxSizer(wxHORIZONTAL)
984    
985            sizer.Add(wxStaticText(self, -1, _("Source Data is in: ")),
986                      0, wxALL|wxALIGN_CENTER_VERTICAL, 4)
987            sizer.Add(self.__scale, 1, wxEXPAND|wxALL, 4)
988    
989            self.__scale.SetSelection(0)
990    
991            ProjPanel._DoLayout(self, sizer)
992    
993    
994  ID_UTM_PROPOSE_ZONE_DIALOG_TAKE   = 4001  ID_UTM_PROPOSE_ZONE_DIALOG_TAKE   = 4001
995  ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL = 4002  ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL = 4002
996  class UTMProposeZoneDialog(wxDialog):  class UTMProposeZoneDialog(wxDialog):
997                                                                                    
998      """Propose a sensible Zone considering the current map extent."""      """Propose a sensible Zone considering the current map extent."""
999                                                                                    
1000      def __init__(self, parent, (x, y, x2, y2)):      def __init__(self, parent, (x, y, x2, y2)):
1001          wxDialog.__init__(self, parent, -1, _("Projection: Propose UTM Zone"),          wxDialog.__init__(self, parent, -1, _("Projection: Propose UTM Zone"),
1002                            wxDefaultPosition, wxSize(200, 100))                            wxDefaultPosition, wxSize(200, 100))
1003          self.parent = parent          self.parent = parent
         #x, y, x2, y2 = elf.parent.parent.map_bounding_box  
1004          x = x + 180          x = x + 180
1005          x2 = x2 + 180          x2 = x2 + 180
1006          center = (x2 - x) / 2 + x          center = (x2 - x) / 2 + x
1007          self.proposedZone = int(center / 6 + 1)          self.proposedZone = int(center / 6 + 1)
1008          self.dialogLayout()          self.dialogLayout()
1009                                                                                    
1010      def dialogLayout(self):      def dialogLayout(self):
1011          topBox = wxBoxSizer(wxVERTICAL)          topBox = wxBoxSizer(wxVERTICAL)
1012                                                                                    
1013          textBox = wxBoxSizer(wxVERTICAL)          textBox = wxBoxSizer(wxVERTICAL)
1014          textBox.Add(wxStaticText(self, -1, _("The current map extent center " +          textBox.Add(wxStaticText(self, -1, _("The current map extent center "
1015                                             "lies in UTM Zone")),                                               "lies in UTM Zone")),
1016                      0, wxALIGN_CENTER|wxALL, 4)                      0, wxALIGN_CENTER|wxALL, 4)
1017          textBox.Add(wxStaticText(self, -1, str(self.proposedZone)),          textBox.Add(wxStaticText(self, -1, str(self.proposedZone)),
1018                      0, wxALIGN_CENTER|wxALL, 4)                      0, wxALIGN_CENTER|wxALL, 4)
1019                                                                                    
1020          topBox.Add(textBox, 1, wxEXPAND|wxALL, 4)          topBox.Add(textBox, 1, wxEXPAND|wxALL, 4)
1021                                                                                    
1022          buttonBox = wxBoxSizer(wxHORIZONTAL)          buttonBox = wxBoxSizer(wxHORIZONTAL)
1023          buttonBox.Add(wxButton(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE,          buttonBox.Add(wxButton(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE,
1024                        _("Take")), 0, wxALL, 4)                        _("Take")), 0, wxALL, 4)
# Line 939  class UTMProposeZoneDialog(wxDialog): Line 1027  class UTMProposeZoneDialog(wxDialog):
1027          topBox.Add(buttonBox, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10)          topBox.Add(buttonBox, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10)
1028          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE, self.OnTake)          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE, self.OnTake)
1029          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL, self.OnCancel)          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL, self.OnCancel)
1030                                                                                    
1031          self.SetAutoLayout(True)          self.SetAutoLayout(True)
1032          self.SetSizer(topBox)          self.SetSizer(topBox)
1033          topBox.Fit(self)          topBox.Fit(self)
1034          topBox.SetSizeHints(self)          topBox.SetSizeHints(self)
1035                                                                                    
1036      def OnTake(self, event):      def OnTake(self, event):
1037          self.EndModal(wxID_OK)          self.EndModal(wxID_OK)
1038                                                                                    
1039      def OnCancel(self, event):      def OnCancel(self, event):
1040          self.EndModal(wxID_CANCEL)          self.EndModal(wxID_CANCEL)
1041    

Legend:
Removed from v.734  
changed lines
  Added in v.1789

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26