/[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 797 by jonathan, Wed Apr 30 17:01:48 2003 UTC revision 1819 by bh, Mon Oct 13 15:55:43 2003 UTC
# Line 1  Line 1 
1  # Copyright (c) 2003 by Intevation GmbH  # Copyright (c) 2003 by Intevation GmbH
2  # Authors:  # Authors:
3  # Jonathan Coles <[email protected]>  # Jonathan Coles <[email protected]>
4    # Frank Koormann <[email protected]>
5    # Jan-Oliver Wagner <[email protected]>
6  #  #
7  # This program is free software under the GPL (>=v2)  # This program is free software under the GPL (>=v2)
8  # Read the file COPYING coming with Thuban for details.  # Read the file COPYING coming with Thuban for details.
9                                                                                    
10  import os, sys, math  """Projection dialog"""
11    
12    __version__ = "$Revision$"
13    # $Source$
14    # $Id$
15    
16    import os
17  from wxPython.wx import *  from wxPython.wx import *
18    
19  from Thuban import _  from Thuban import _
20    
21  from Thuban.Model.proj import Projection, ProjFile  from Thuban.Model.proj import Projection, ProjFile
22    
23  from Thuban.Model.resource import GetUserProjFiles, GetSystemProjFiles, \  from Thuban.Model.resource import get_user_proj_file, get_system_proj_file, \
24                                    ReadProjFile, WriteProjFile                                    read_proj_file, write_proj_file
25  from Thuban.UI.dialogs import NonModalDialog  from Thuban.UI.dialogs import NonModalNonParentDialog
26    
27    from sizers import NotebookLikeSizer
28    
29  ID_PROJ_ADVANCED  = 4001  ID_PROJ_ADVANCED  = 4001
30  ID_PROJ_PROJCHOICE = 4002  ID_PROJ_PROJCHOICE = 4002
31  ID_PROJ_ADDTOLIST    = 4003  ID_PROJ_ADDTOLIST    = 4003
32  ID_PROJ_NEW       = 4004  ID_PROJ_NEW       = 4004
 ID_PROJ_TRY       = 4005  
33  ID_PROJ_REVERT    = 4006  ID_PROJ_REVERT    = 4006
 ID_PROJ_OK        = 4007  
 ID_PROJ_CLOSE     = 4008  
34  ID_PROJ_AVAIL     = 4009  ID_PROJ_AVAIL     = 4009
35  ID_PROJ_SAVE      = 4010  ID_PROJ_SAVE      = 4010
36  ID_PROJ_IMPORT    = 4011  ID_PROJ_IMPORT    = 4011
# Line 35  ID_PROJ_PROJNAME  = 4014 Line 41  ID_PROJ_PROJNAME  = 4014
41  CLIENT_PROJ = 0  CLIENT_PROJ = 0
42  CLIENT_PROJFILE = 1  CLIENT_PROJFILE = 1
43    
44  class ProjFrame(NonModalDialog):  class ProjFrame(NonModalNonParentDialog):
45    
46      def __init__(self, parent, name, title, receiver):      def __init__(self, parent, name, title, receiver):
47          """Initialize the projection dialog.          """Initialize the projection dialog.
# Line 44  class ProjFrame(NonModalDialog): Line 50  class ProjFrame(NonModalDialog):
50                          SetProjection(projection)                          SetProjection(projection)
51                          GetProjection()                          GetProjection()
52          """          """
53                    NonModalNonParentDialog.__init__(self, parent, name, title)
54    
55            self.projection_panel_defs = [
56                ("tmerc", _("Transverse Mercator"), TMPanel),
57                ("utm", _("Universal Transverse Mercator"), UTMPanel),
58                ("lcc", _("Lambert Conic Conformal"), LCCPanel),
59                ("latlong", _("Geographic"), GeoPanel)]
60          self.receiver = receiver          self.receiver = receiver
61          self.haveTried = False          self.haveTried = False
62          self.curProjPanel = None          self.curProjPanel = None
63    
64          self.projPanels = []          self.build_dialog()
65          self.projPanels.append(          self.Layout()
             ("tmerc", _("Transverse Mercator"), TMPanel))  
         self.projPanels.append(  
             ("utm", _("Universal Transverse Mercator"), UTMPanel))  
         self.projPanels.append(  
             ("lcc", _("Lambert Conic Conformal"), LCCPanel))  
         self.projPanels.append(  
             ("latlong", _("Geographic"), GeoPanel))  
   
         NonModalDialog.__init__(self, parent, name, title)  
         # originally generate by wxGlade  
         self.panel_1 = wxPanel(self, -1)  
         self.panel_edit = wxPanel(self, -1)  
         self.panel_buttons = wxPanel(self, -1)  
         self.label_5 = wxStaticText(self.panel_1, -1, _("Available Projections:"))  
         self.availprojs = wxListBox(self.panel_1, ID_PROJ_AVAIL, style=wxLB_EXTENDED|wxLB_SORT)  
         self.projfilepath = wxStaticText(self.panel_1, -1, "")  
         self.label_2 = wxStaticText(self.panel_edit, -1, _("Name:"))  
         self.projname = wxTextCtrl(self.panel_edit, ID_PROJ_PROJNAME, "")  
         self.label_3 = wxStaticText(self.panel_edit, -1, _("Projection:"))  
         self.projchoice = wxChoice(self.panel_edit, ID_PROJ_PROJCHOICE)  
         self.button_import = wxButton(self.panel_1, ID_PROJ_IMPORT, _("Import..."))  
         self.button_export = wxButton(self.panel_1, ID_PROJ_EXPORT, _("Export..."))  
         self.button_remove = wxButton(self.panel_1, ID_PROJ_REMOVE, _("Remove"))  
         self.button_new = wxButton(self.panel_edit, ID_PROJ_NEW, _("New"))  
         self.button_save = wxButton(self.panel_edit, ID_PROJ_SAVE,_("Save"))  
         self.button_add = wxButton(self.panel_edit, ID_PROJ_ADDTOLIST,  
                                       _("Add to List"))  
         self.button_try = wxButton(self.panel_buttons, ID_PROJ_TRY, _("Try"))  
         self.button_revert = wxButton(self.panel_buttons, ID_PROJ_REVERT, _("Revert"))  
         self.button_ok = wxButton(self.panel_buttons, ID_PROJ_OK, _("OK"))  
         self.button_close = wxButton(self.panel_buttons, ID_PROJ_CLOSE, _("Close"))  
   
         self.__set_properties()  
         self.__do_layout()  
         # wxGlade  
66    
67          self.originalProjection = self.receiver.GetProjection()          self.originalProjection = self.receiver.GetProjection()
68    
69          self.__DoOnProjAvail()          self.__DoOnProjAvail()
70                    self.button_ok.SetFocus()
71          EVT_BUTTON(self, ID_PROJ_TRY, self._OnTry)          self.availprojs.SetFocus()
72          EVT_BUTTON(self, ID_PROJ_REVERT, self._OnRevert)  
73          EVT_BUTTON(self, ID_PROJ_OK, self._OnOK)      def build_dialog(self):
74          EVT_BUTTON(self, ID_PROJ_CLOSE, self._OnClose)          """Build the dialog's widgets and set the event handlers"""
75          EVT_CHOICE(self, ID_PROJ_PROJCHOICE, self._OnProjChoice)          self.topBox = top_box = wxBoxSizer(wxVERTICAL)
76    
77            main_box = wxBoxSizer(wxHORIZONTAL)
78            top_box.Add(main_box, 1, wxALL|wxEXPAND)
79    
80            #
81            #    The projection list and associated controls
82            #
83            vbox = wxBoxSizer(wxVERTICAL)
84            main_box.Add(vbox, 0, wxALL|wxEXPAND)
85    
86            label = wxStaticText(self, -1, _("Available Projections:"))
87            vbox.Add(label, 0, wxLEFT|wxRIGHT|wxTOP, 4)
88    
89            hbox = wxBoxSizer(wxHORIZONTAL)
90            vbox.Add(hbox, 1, wxALL|wxEXPAND)
91            self.availprojs = wxListBox(self, ID_PROJ_AVAIL,
92                                        style=wxLB_EXTENDED|wxLB_SORT)
93          EVT_LISTBOX(self, ID_PROJ_AVAIL, self._OnProjAvail)          EVT_LISTBOX(self, ID_PROJ_AVAIL, self._OnProjAvail)
94            hbox.Add(self.availprojs, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)
95            self.__FillAvailList(selectCurrent = True)
96    
97            # Projection List specific actions (Import/Export/Remove)
98            buttons = wxBoxSizer(wxVERTICAL)
99            hbox.Add(buttons, 0, wxALL)
100            self.button_import = wxButton(self, ID_PROJ_IMPORT, _("Import..."))
101          EVT_BUTTON(self, ID_PROJ_IMPORT, self._OnImport)          EVT_BUTTON(self, ID_PROJ_IMPORT, self._OnImport)
102            buttons.Add(self.button_import, 1, wxALL|wxEXPAND, 4)
103            self.button_export = wxButton(self, ID_PROJ_EXPORT, _("Export..."))
104          EVT_BUTTON(self, ID_PROJ_EXPORT, self._OnExport)          EVT_BUTTON(self, ID_PROJ_EXPORT, self._OnExport)
105            buttons.Add(self.button_export, 1, wxALL|wxEXPAND, 4)
106            buttons.Add(20, 20, 0, wxEXPAND, 0)
107            self.button_remove = wxButton(self, ID_PROJ_REMOVE, _("Remove"))
108          EVT_BUTTON(self, ID_PROJ_REMOVE, self._OnRemove)          EVT_BUTTON(self, ID_PROJ_REMOVE, self._OnRemove)
109            buttons.Add(self.button_remove, 1, wxALL|wxEXPAND, 4)
110    
111            # The file path
112            self.projfilepath = wxStaticText(self, -1, "")
113            vbox.Add(self.projfilepath, 0, wxALL|wxEXPAND)
114    
115            #
116            #   The projection editor part
117            #
118            self.edit_box = wxStaticBox(self, -1, _("Edit"))
119            sizer_edit = wxStaticBoxSizer(self.edit_box, wxHORIZONTAL)
120            main_box.Add(sizer_edit, 1, wxALL|wxEXPAND)
121    
122            # Projection Specific Entries (Name/Projection)
123            self.sizer_projctrls = wxBoxSizer(wxVERTICAL)
124            sizer_edit.Add(self.sizer_projctrls, 1, wxALL|wxEXPAND)
125    
126            hbox = wxBoxSizer(wxHORIZONTAL)
127            self.sizer_projctrls.Add(hbox, 0, wxALL|wxEXPAND)
128            label = wxStaticText(self, -1, _("Name:"))
129            hbox.Add(label, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)
130            self.projname = wxTextCtrl(self, ID_PROJ_PROJNAME, "")
131            EVT_TEXT(self, ID_PROJ_PROJNAME, self._OnProjName)
132            hbox.Add(self.projname, 1, wxALL|wxEXPAND, 4)
133    
134            hbox = wxBoxSizer(wxHORIZONTAL)
135            self.sizer_projctrls.Add(hbox, 0, wxALL|wxEXPAND)
136            label = wxStaticText(self, -1, _("Projection:"))
137            hbox.Add(label, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)
138            self.projchoice = wxChoice(self, ID_PROJ_PROJCHOICE)
139            self.projchoice.SetSelection(0)
140            EVT_CHOICE(self, ID_PROJ_PROJCHOICE, self._OnProjChoice)
141            hbox.Add(self.projchoice, 1, wxALL|wxEXPAND, 4)
142            # Fill the projection choice list.
143            self.nbsizer = NotebookLikeSizer()
144            self.sizer_projctrls.Add(self.nbsizer, 1,
145                                     wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)
146            self.projection_panels = []
147            for proj_type, name, cls in self.projection_panel_defs:
148                self.projchoice.Append(name, proj_type)
149                panel = cls(self, self.receiver)
150                panel.Hide()
151                panel.projection_index = len(self.projection_panels)
152                panel.projection_type = proj_type
153                self.projection_panels.append(panel)
154                self.nbsizer.Add(panel)
155            self.unknown_projection_panel = UnknownProjPanel(self, self.receiver)
156            self.unknown_projection_panel.Hide()
157            self.nbsizer.Add(self.unknown_projection_panel)
158    
159            # Projection Specific actions (New/Save/Add)
160            buttons = wxBoxSizer(wxVERTICAL)
161            sizer_edit.Add(buttons, 0, wxALL)
162            self.button_new = wxButton(self, ID_PROJ_NEW, _("New"))
163          EVT_BUTTON(self, ID_PROJ_NEW, self._OnNew)          EVT_BUTTON(self, ID_PROJ_NEW, self._OnNew)
164          EVT_BUTTON(self, ID_PROJ_SAVE, self._OnSave)          buttons.Add(self.button_new, 0, wxEXPAND|wxALL, 4)
165            self.button_add = wxButton(self, ID_PROJ_ADDTOLIST, _("Add to List"))
166          EVT_BUTTON(self, ID_PROJ_ADDTOLIST, self._OnAddToList)          EVT_BUTTON(self, ID_PROJ_ADDTOLIST, self._OnAddToList)
167            buttons.Add(self.button_add, 0, wxEXPAND|wxALL, 4)
168            buttons.Add(20, 20, 0, wxEXPAND, 0)
169            self.button_save = wxButton(self, ID_PROJ_SAVE,_("Update"))
170            EVT_BUTTON(self, ID_PROJ_SAVE, self._OnSave)
171            buttons.Add(self.button_save, 0, wxEXPAND|wxALL|wxALIGN_BOTTOM, 4)
172    
173          EVT_TEXT(self, ID_PROJ_PROJNAME, self._OnProjName)          #
174            # Main Action buttons (Try/Revert/OK/Close)
175            #
176            buttons = wxBoxSizer(wxHORIZONTAL)
177            top_box.Add(buttons, 0, wxALL|wxALIGN_RIGHT, 10)
178            self.button_try = wxButton(self, wxID_APPLY, _("Try"))
179            EVT_BUTTON(self, wxID_APPLY, self.OnApply)
180            buttons.Add(self.button_try, 0, wxRIGHT, 10)
181            self.button_revert = wxButton(self, ID_PROJ_REVERT, _("Revert"))
182            EVT_BUTTON(self, ID_PROJ_REVERT, self._OnRevert)
183            buttons.Add(self.button_revert, 0, wxRIGHT, 10)
184            self.button_ok = wxButton(self, wxID_OK, _("OK"))
185            EVT_BUTTON(self, wxID_OK, self.OnOK)
186            self.button_ok.SetDefault()
187            buttons.Add(self.button_ok, 0, wxRIGHT, 10)
188            self.button_close = wxButton(self, wxID_CANCEL, _("Close"))
189            EVT_BUTTON(self, wxID_CANCEL, self.OnCancel)
190            buttons.Add(self.button_close, 0, wxRIGHT, 10)
191    
192    
193            #
194            # Automatic Layout
195            #
196            self.SetAutoLayout(1)
197            self.SetSizer(top_box)
198            top_box.Fit(self)
199            top_box.SetSizeHints(self)
200    
201      def _OnTry(self, event):      def OnApply(self, event):
202          self.__SetProjection()          self.__SetProjection()
203          self.haveTried = True          self.haveTried = True
204    
205      def _OnRevert(self, event):      def OnOK(self, event):
         if self.haveTried:  
             self.receiver.SetProjection(self.originalProjection)  
             self.haveTried = False  
   
     def _OnOK(self, event):  
206          self.__SetProjection()          self.__SetProjection()
207          self.Close()          self.Close()
208    
209      def _OnClose(self, event):      def OnCancel(self, event):
210            """Cancel just closes the dialog, but we call it cancel so we
211            can overload the functionality of wxDialog.
212            """
213          self.Close()          self.Close()
214    
215        def _OnRevert(self, event):
216            if self.haveTried:
217                self.receiver.SetProjection(self.originalProjection)
218                self.haveTried = False
219    
220      def _OnNew(self, event):      def _OnNew(self, event):
221    
222          # clear all selections          # clear all selections
# Line 153  class ProjFrame(NonModalDialog): Line 247  class ProjFrame(NonModalDialog):
247          if newproj is not None:          if newproj is not None:
248              projfile.Replace(proj, newproj)              projfile.Replace(proj, newproj)
249              try:              try:
250                  WriteProjFile(projfile)                  write_proj_file(projfile)
251              except IOError, (errno, errstr):              except IOError, (errno, errstr):
252                  self.__ShowError(projfile.GetFilename(), errstr)                  self.__ShowError(projfile.GetFilename(), errstr)
253              self.availprojs.SetClientData(sel[0], [newproj, projfile])              self.availprojs.SetClientData(sel[0], [newproj, projfile])
254    
255                self.__FillAvailList( selectProj = newproj.Label())
256    
257      def _OnAddToList(self, event):      def _OnAddToList(self, event):
258    
259          proj = self.__GetProjection()          proj = self.__GetProjection()
260          if proj is not None:          if proj is not None:
261              self.__usrProjFile.Add(proj)              self.__usrProjFile.Add(proj)
262              try:              try:
263                  WriteProjFile(self.__usrProjFile)                  write_proj_file(self.__usrProjFile)
264              except IOError, (errno, errstr):              except IOError, (errno, errstr):
265                  self.__ShowError(self.__userProjFile.GetFilename(), errstr)                  self.__ShowError(self.__userProjFile.GetFilename(), errstr)
266    
267              self.__FillAvailList()              self.__FillAvailList( selectProj = proj.Label())
268    
269      def _OnProjAvail(self, event):      def _OnProjAvail(self, event):
270          self.__DoOnProjAvail()          self.__DoOnProjAvail()
271    
272        def show_warnings(self, title, filename, warnings):
273            """Show the warnings (a list of strings) in a dialog
274    
275            If the list is empty no dialog will be shown.
276            """
277            if warnings:
278                text = (_('Warnings when reading "%s":\n\n%s')
279                        % (filename, "\n\n".join(warnings)))
280                self.parent.RunMessageBox(title, text)
281    
282      def _OnImport(self, event):      def _OnImport(self, event):
283    
284          dlg = wxFileDialog(self, _("Import"), style = wxOPEN)          dlg = wxFileDialog(self, _("Import"), style = wxOPEN)
# Line 181  class ProjFrame(NonModalDialog): Line 287  class ProjFrame(NonModalDialog):
287              path = dlg.GetPath()              path = dlg.GetPath()
288    
289              try:              try:
290                  projFile = ReadProjFile(path)                  projFile, warnings = read_proj_file(path)
291                    self.show_warnings(_("Warnings"), path, warnings)
292                  for proj in projFile.GetProjections():                  for proj in projFile.GetProjections():
293                      self.__usrProjFile.Add(proj)                      self.__usrProjFile.Add(proj)
294                  WriteProjFile(self.__usrProjFile)                  write_proj_file(self.__usrProjFile)
295              except IOError, (errno, errstr):              except IOError, (errno, errstr):
296                  self.__ShowError(dlg.GetPath(), errstr)                  self.__ShowError(dlg.GetPath(), errstr)
297    
# Line 211  class ProjFrame(NonModalDialog): Line 318  class ProjFrame(NonModalDialog):
318                      projFile.Add(proj)                      projFile.Add(proj)
319    
320              try:              try:
321                  WriteProjFile(projFile)                  write_proj_file(projFile)
322              except IOError, (errno, errstr):              except IOError, (errno, errstr):
323                  self.__ShowError(dlg.GetPath(), errstr)                  self.__ShowError(dlg.GetPath(), errstr)
324    
# Line 246  class ProjFrame(NonModalDialog): Line 353  class ProjFrame(NonModalDialog):
353                  projfile.Remove(proj)                  projfile.Remove(proj)
354    
355          try:          try:
356              WriteProjFile(projfile)              write_proj_file(projfile)
357          except IOError, (errno, errstr):          except IOError, (errno, errstr):
358              self.__ShowError(projfile.GetFilename(), errstr)              self.__ShowError(projfile.GetFilename(), errstr)
359    
# Line 283  class ProjFrame(NonModalDialog): Line 390  class ProjFrame(NonModalDialog):
390          self.button_save.Enable(True)          self.button_save.Enable(True)
391          self.button_remove.Enable(True)          self.button_remove.Enable(True)
392    
393          self.panel_edit.Enable(True)          self.edit_box.Enable(True)
394    
395          for ctrl in [self.button_import,          for ctrl in [self.button_import,
396                       self.button_export,                       self.button_export,
# Line 292  class ProjFrame(NonModalDialog): Line 399  class ProjFrame(NonModalDialog):
399                       self.button_add,                       self.button_add,
400                       self.projchoice,                       self.projchoice,
401                       self.projname,                       self.projname,
402                       self.panel_edit]:                       self.edit_box]:
403              ctrl.Enable(True)              ctrl.Enable(True)
404    
405          if self.curProjPanel is not None:          if self.curProjPanel is not None:
# Line 302  class ProjFrame(NonModalDialog): Line 409  class ProjFrame(NonModalDialog):
409              self.button_import.Enable(True)              self.button_import.Enable(True)
410              self.button_export.Enable(False)              self.button_export.Enable(False)
411              self.button_remove.Enable(False)              self.button_remove.Enable(False)
412                self.button_save.Enable(False)
413    
414          elif len(sel) == 1:          elif len(sel) == 1:
415    
# Line 330  class ProjFrame(NonModalDialog): Line 438  class ProjFrame(NonModalDialog):
438                  self.button_save.Enable(False)                  self.button_save.Enable(False)
439    
440          else:          else:
441              self.panel_edit.Enable(False)              self.edit_box.Enable(False)
442    
443      def __DoOnProjAvail(self):      def __DoOnProjAvail(self):
444    
# Line 343  class ProjFrame(NonModalDialog): Line 451  class ProjFrame(NonModalDialog):
451              if proj is None:              if proj is None:
452                  # user selected <None>                  # user selected <None>
453                  self.projname.Clear()                  self.projname.Clear()
454                                    self.projfilepath.SetLabel(_("Projection File: "))
455              else:              else:
456                
457                  if projfile is not None:                  if projfile is not None:
458                      self.projfilepath.SetLabel(projfile.GetFilename())                      self.projfilepath.SetLabel(_("Projection File: ") +
459                            os.path.basename(projfile.GetFilename()))
460                  else:                  else:
461                      # only None if the currently used projection is selected                      # only None if the currently used projection is selected
462                      self.projfilepath.SetLabel("")                      self.projfilepath.SetLabel(_("Projection File: "))
463    
464                  self.projname.SetValue(proj.GetName())                  self.projname.SetValue(proj.Label())
465    
466                  myProjType = proj.GetParameter("proj")                  myProjType = proj.GetParameter("proj")
467                  i = 0                  i = 0
468                  for projType, name, clazz in self.projPanels:                  for projType, name, cls in self.projection_panel_defs:
469                      if myProjType == projType:                      if myProjType == projType:
470                            self.projchoice.Enable(True)
471                          self.projchoice.SetSelection(i)                          self.projchoice.SetSelection(i)
472                          self.__DoOnProjChoice()                          self.__DoOnProjChoice()
473    
# Line 368  class ProjFrame(NonModalDialog): Line 478  class ProjFrame(NonModalDialog):
478                          assert self.curProjPanel is not None                          assert self.curProjPanel is not None
479    
480                          self.curProjPanel.SetProjection(proj)                          self.curProjPanel.SetProjection(proj)
481                            break
482                      i += 1                      i += 1
483                    else:
484                        self.projchoice.Disable()
485                        self._show_proj_panel(UnknownProjPanel)
486    
487          self.__VerifyButtons()          self.__VerifyButtons()
488    
# Line 385  class ProjFrame(NonModalDialog): Line 499  class ProjFrame(NonModalDialog):
499          At the end of this method self.curProjPanel will not be None          At the end of this method self.curProjPanel will not be None
500          if there was a item selected.          if there was a item selected.
501          """          """
   
502          choice = self.projchoice          choice = self.projchoice
503    
504          sel = choice.GetSelection()          sel = choice.GetSelection()
505          if sel != -1:          if sel != -1:
506                proj_type = choice.GetClientData(sel)
507              clazz, obj = choice.GetClientData(sel)              for t, name, cls in self.projection_panel_defs:
508                    if t == proj_type:
509              if obj is None:                      self._show_proj_panel(cls)
510                  obj = clazz(self.panel_edit, self.receiver)                      break
511                  choice.SetClientData(sel, [clazz, obj])          # FIXME: what to do if sel == -1?
512    
513              if self.curProjPanel is not None:      def _show_proj_panel(self, panel_class):
514                  self.curProjPanel.Hide()          """Show the panel as the projection panel"""
515                  self.sizer_projctrls.Remove(self.curProjPanel)          if panel_class is UnknownProjPanel:
516                self.edit_box.Disable()
517              self.curProjPanel = obj              self.nbsizer.Activate(self.unknown_projection_panel)
518              self.curProjPanel.Show()              self.curProjPanel = self.unknown_projection_panel
519            else:
520              self.sizer_projctrls.Add(self.curProjPanel, 1,              self.edit_box.Enable(True)
521                  wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)              self.unknown_projection_panel.Hide()
522              self.sizer_projctrls.Layout()              for panel in self.projection_panels:
523              self.Layout()                  if panel.__class__ is panel_class:
524              self.topBox.SetSizeHints(self)                      self.nbsizer.Activate(panel)
525                        self.curProjPanel = panel
526    
527      def __SetProjection(self):      def __SetProjection(self):
528          """Set the receiver's projection."""          """Set the receiver's projection."""
# Line 446  class ProjFrame(NonModalDialog): Line 560  class ProjFrame(NonModalDialog):
560    
561          return None          return None
562    
563      def __FillAvailList(self, selectCurrent = False):      def __FillAvailList(self, selectCurrent = False, selectProj = None):
564          """Populate the list of available projections.          """Populate the list of available projections.
565                    
566          selectCurrent -- if True, select the projection used by          selectCurrent -- if True, select the projection used by
567                           the receiver, otherwise select nothing.                           the receiver, otherwise select nothing.
568            selectProj    -- if set, select the projection found under the
569                             specified name. This overwrites any other
570                             selection estimate.
571          """          """
572    
573          self.availprojs.Clear()          self.availprojs.Clear()
574    
575          #          #
         # We add the current projection to the list first so that  
         # we are sure that it's at index 0. That way we can  
         # set the selection with confidence. The problem is the  
         # the list is automatically sorted when an item is appended  
         # and the index of where it was inserted is not returned.  
         #  
         proj = self.receiver.GetProjection()  
         if proj is not None:  
             self.availprojs.Append(_("%s (current)") % proj.GetName(),  
                                    [proj, None])  
             if selectCurrent:  
                 self.availprojs.SetSelection(0)  
                 self.availprojs.SetFirstItem(0)  
   
         #  
576          # the list can never be empty. there will always be          # the list can never be empty. there will always be
577          # at least this one item          # at least this one item
578          #          #
579          self.availprojs.Append("<None>", (None, None))          self.availprojs.Append("<None>", (None, None))
580    
581          # proj is only None when <None> should be selected          projfile, warnings = get_system_proj_file()
582          if proj is None and selectCurrent:          self.show_warnings(_("Warnings"), projfile.GetFilename(), warnings)
             self.availprojs.SetSelection(0)  
             self.availprojs.SetFirstItem(0)  
   
         projfile = GetSystemProjFiles()  
         projfile = projfile[0]  
583          for proj in projfile.GetProjections():          for proj in projfile.GetProjections():
584              self.availprojs.Append(proj.GetName(), [proj, projfile])              self.availprojs.Append(proj.Label(), [proj, projfile])
585          self.__sysProjFile = projfile          self.__sysProjFile = projfile
586    
587          projfile = GetUserProjFiles()          projfile, warnings = get_user_proj_file()
588          projfile = projfile[0]          self.show_warnings(_("Warnings"), projfile.GetFilename(), warnings)
589          for proj in projfile.GetProjections():          for proj in projfile.GetProjections():
590              self.availprojs.Append(proj.GetName(), [proj, projfile])              self.availprojs.Append(proj.Label(), [proj, projfile])
591          self.__usrProjFile = projfile          self.__usrProjFile = projfile
592    
593          for proj, name, clazz in self.projPanels:          #
594              self.projchoice.Append(name, [clazz, None])          # We add the current projection to the list at last.
595            # Since the list is resorted immediately a following FindString()
596      def __set_properties(self):          # determines the index correctly.
597            #
598          #self.availprojs.SetSelection(0)          proj = self.receiver.GetProjection()
599          self.projchoice.SetSelection(0)          if proj is not None:
600                proj_item = _("%s (current)") % proj.Label()
601          self.__FillAvailList(selectCurrent = True)              self.availprojs.Append(proj_item, [proj, None])
602                if selectCurrent:
603          self.projname.SetMaxLength(32)                  self.availprojs.SetSelection(
604                            self.availprojs.FindString(proj_item)
605      def __do_layout(self):                      )
606          # originally generated by wxGlade          else:
607                if selectCurrent:
608          self.topBox = wxBoxSizer(wxVERTICAL)                  self.availprojs.SetSelection(
609          self.sizer_panel = wxBoxSizer(wxVERTICAL)                          self.availprojs.FindString("<None>")
610          sizer_6 = wxBoxSizer(wxHORIZONTAL)                      )
611          self.sizer_mainctrls = wxBoxSizer(wxHORIZONTAL)          if selectProj:
612          self.sizer_edit = wxStaticBoxSizer(wxStaticBox(self.panel_edit, -1, _("Edit")), wxHORIZONTAL)              self.availprojs.SetSelection(
613          sizer_11 = wxBoxSizer(wxVERTICAL)                          self.availprojs.FindString(selectProj)
614          self.sizer_projctrls = wxBoxSizer(wxVERTICAL)                      )
         sizer_14 = wxBoxSizer(wxHORIZONTAL)  
         sizer_13 = wxBoxSizer(wxHORIZONTAL)  
         sizer_15 = wxBoxSizer(wxVERTICAL)  
         sizer_15.Add(self.button_import, 0, wxALL, 4)  
         sizer_15.Add(self.button_export, 0, wxALL, 4)  
         sizer_15.Add(20, 20, 0, wxEXPAND, 0)  
         sizer_15.Add(self.button_remove, 0, wxALL|wxALIGN_BOTTOM, 4)  
   
         # list controls  
         grid_sizer_1 = wxFlexGridSizer(3, 2, 0, 0)  
         grid_sizer_1.Add(self.label_5, 0, wxLEFT|wxRIGHT|wxTOP, 4)  
         grid_sizer_1.Add(20, 20, 0, wxEXPAND, 0)  
         grid_sizer_1.Add(self.availprojs, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)  
         grid_sizer_1.Add(sizer_15, 0, wxALL|wxEXPAND, 4)  
         grid_sizer_1.Add(self.projfilepath, 0, wxALL|wxADJUST_MINSIZE, 4)  
         grid_sizer_1.AddGrowableRow(1)  
         grid_sizer_1.AddGrowableCol(0)  
   
         # edit controls  
         sizer_13.Add(self.label_2, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)  
         sizer_13.Add(self.projname, 1, wxALL, 4)  
         self.sizer_projctrls.Add(sizer_13, 0, wxEXPAND, 0)  
         sizer_14.Add(self.label_3, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)  
         sizer_14.Add(self.projchoice, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)  
         self.sizer_projctrls.Add(sizer_14, 0, wxEXPAND, 0)  
         self.sizer_edit.Add(self.sizer_projctrls, 1, wxEXPAND, 0)  
         sizer_11.Add(self.button_new, 0, wxALL|wxEXPAND, 4)  
         sizer_11.Add(self.button_save, 0, wxALL|wxEXPAND, 4)  
         sizer_11.Add(self.button_add, 0, wxALL|wxEXPAND, 4)  
         self.sizer_edit.Add(sizer_11, 0, wxALL|wxEXPAND, 4)  
   
         sizer_6.Add(20, 20, 1, wxEXPAND, 0)  
         sizer_6.Add(self.button_try, 0, wxALL, 4)  
         sizer_6.Add(20, 20, 1, 0, 0)  
         sizer_6.Add(self.button_revert, 0, wxALL, 4)  
         sizer_6.Add(20, 20, 1, 0, 0)  
         sizer_6.Add(self.button_ok, 0, wxALL, 4)  
         sizer_6.Add(20, 20, 1, 0, 0)  
         sizer_6.Add(self.button_close, 0, wxALL, 4)  
         sizer_6.Add(20, 20, 1, wxEXPAND, 0)  
   
         self.panel_1.SetAutoLayout(1)  
         self.panel_1.SetSizer(grid_sizer_1)  
         grid_sizer_1.Fit(self.panel_1)  
         grid_sizer_1.SetSizeHints(self.panel_1)  
   
         self.panel_edit.SetAutoLayout(1)  
         self.panel_edit.SetSizer(self.sizer_edit)  
         self.sizer_edit.Fit(self.panel_edit)  
         self.sizer_edit.SetSizeHints(self.panel_edit)  
   
         self.panel_buttons.SetAutoLayout(1)  
         self.panel_buttons.SetSizer(sizer_6)  
         sizer_6.Fit(self.panel_buttons)  
         sizer_6.SetSizeHints(self.panel_buttons)  
   
         self.sizer_mainctrls.Add(self.panel_1, 0,  
             wxALL|wxEXPAND|wxADJUST_MINSIZE, 0)  
         self.sizer_mainctrls.Add(self.panel_edit, 1,  
             wxALL|wxEXPAND|wxADJUST_MINSIZE, 0)  
   
         self.topBox.Add(self.sizer_mainctrls, 1, wxALL|wxEXPAND, 4)  
         self.topBox.Add(self.panel_buttons, 0, wxEXPAND, 0)  
   
         self.SetAutoLayout(1)  
         self.SetSizer(self.topBox)  
         self.topBox.Fit(self)  
         self.topBox.SetSizeHints(self)  
         self.Layout()  
   
 # end of class ProjFrame  
615    
616    
617  class ProjPanel(wxPanel):  class ProjPanel(wxPanel):
# Line 595  class ProjPanel(wxPanel): Line 621  class ProjPanel(wxPanel):
621          wxPanel.__init__(self, parent, -1)          wxPanel.__init__(self, parent, -1)
622    
623          self.__ellps = wxChoice(self, -1)          self.__ellps = wxChoice(self, -1)
624          self.ellpsData = [("bessel", _("Bessel 1841")),          self.ellpsData = [("airy"  , _("Airy")),
625                              ("bessel", _("Bessel 1841")),
626                            ("clrk66", _("Clarke 1866")),                            ("clrk66", _("Clarke 1866")),
627                            ("clrk80", _("Clarke 1880")),                            ("clrk80", _("Clarke 1880")),
628                            ("GRS80" , _("GRS 1980 (IUGG, 1980)")),                            ("GRS80" , _("GRS 1980 (IUGG, 1980)")),
# Line 611  class ProjPanel(wxPanel): Line 638  class ProjPanel(wxPanel):
638    
639          panelSizer = wxBoxSizer(wxVERTICAL)          panelSizer = wxBoxSizer(wxVERTICAL)
640    
         if childPanel is not None:  
             panelSizer.Add(childPanel, 0, wxEXPAND, 0)  
               
641          sizer = wxBoxSizer(wxHORIZONTAL)          sizer = wxBoxSizer(wxHORIZONTAL)
642          sizer.Add(wxStaticText(self, -1, _("Ellipsoid:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("Ellipsoid:")), 0,
643          sizer.Add(self.__ellps, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)                                      wxALL|wxALIGN_CENTER_VERTICAL, 4)
644            sizer.Add(self.__ellps, 1, wxALL|wxALIGN_CENTER_VERTICAL, 4)
645          panelSizer.Add(sizer, 0, wxALL|wxEXPAND, 4)          panelSizer.Add(sizer, 0, wxALL|wxEXPAND, 4)
646    
647            if childPanel is not None:
648                panelSizer.Add(childPanel, 0, wxEXPAND, 0)
649                
650          self.SetAutoLayout(1)          self.SetAutoLayout(1)
651          self.SetSizer(panelSizer)          self.SetSizer(panelSizer)
652          panelSizer.Fit(self)          panelSizer.Fit(self)
# Line 652  ID_TMPANEL_FALSE_NORTH = 4004 Line 680  ID_TMPANEL_FALSE_NORTH = 4004
680  ID_TMPANEL_SCALE = 4005  ID_TMPANEL_SCALE = 4005
681    
682  class UnknownProjPanel(ProjPanel):  class UnknownProjPanel(ProjPanel):
683    
684        """Panel for unknown projection types"""
685    
686      def __init__(self, parent, receiver):      def __init__(self, parent, receiver):
687          ProjPanel.__init__(self, parent)          ProjPanel.__init__(self, parent)
688    
# Line 660  class UnknownProjPanel(ProjPanel): Line 691  class UnknownProjPanel(ProjPanel):
691      def _DoLayout(self):      def _DoLayout(self):
692          sizer = wxBoxSizer(wxVERTICAL)          sizer = wxBoxSizer(wxVERTICAL)
693    
694          sizer.Add(wxStaticText(self, -1,          sizer.Add(wxStaticText(self, -1,
695              _("Thuban does not know the parameters for the " +                                 _("Thuban does not know the parameters\n"
696                "current projection and cannot display a " +                                   "for the current projection and cannot\n"
697                "configuration panel.")))                                   "display a configuration panel.")))
698    
699          ProjPanel._DoLayout(self, sizer)          ProjPanel._DoLayout(self, sizer)
700    
# Line 684  class TMPanel(ProjPanel): Line 715  class TMPanel(ProjPanel):
715    
716          self.__latitude = wxTextCtrl(self, ID_TMPANEL_LAT)          self.__latitude = wxTextCtrl(self, ID_TMPANEL_LAT)
717          self.__longitude = wxTextCtrl(self, ID_TMPANEL_LONG)          self.__longitude = wxTextCtrl(self, ID_TMPANEL_LONG)
718            self.__scale = wxTextCtrl(self, ID_TMPANEL_SCALE)
719          self.__falseEast = wxTextCtrl(self, ID_TMPANEL_FASLE_EAST)          self.__falseEast = wxTextCtrl(self, ID_TMPANEL_FASLE_EAST)
720          self.__falseNorth = wxTextCtrl(self, ID_TMPANEL_FALSE_NORTH)          self.__falseNorth = wxTextCtrl(self, ID_TMPANEL_FALSE_NORTH)
         self.__scale = wxTextCtrl(self, ID_TMPANEL_SCALE)  
721    
722          self._DoLayout()          self._DoLayout()
723    
724      def _DoLayout(self):      def _DoLayout(self):
725    
726          sizer = wxFlexGridSizer(4, 4, 0, 0)          sizer = wxFlexGridSizer(4, 2, 0, 0)
727          sizer.Add(wxStaticText(self, -1, _("Latitude:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("Latitude:")), 0, wxALL, 4)
728          sizer.Add(self.__latitude, 0, wxALL, 4)          sizer.Add(self.__latitude, 0, wxALL, 4)
         sizer.Add(wxStaticText(self, -1, _("False Easting:")), 0, wxALL, 4)  
         sizer.Add(self.__falseEast, 0, wxALL, 4)  
729          sizer.Add(wxStaticText(self, -1, _("Longitude:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("Longitude:")), 0, wxALL, 4)
730          sizer.Add(self.__longitude, 0, wxALL, 4)          sizer.Add(self.__longitude, 0, wxALL, 4)
731            sizer.Add(wxStaticText(self, -1, _("False Easting:")), 0, wxALL, 4)
732            sizer.Add(self.__falseEast, 0, wxALL, 4)
733          sizer.Add(wxStaticText(self, -1, _("False Northing:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("False Northing:")), 0, wxALL, 4)
734          sizer.Add(self.__falseNorth, 0, wxALL, 4)          sizer.Add(self.__falseNorth, 0, wxALL, 4)
735          sizer.Add(wxStaticText(self, -1, _("Scale Factor:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("Scale Factor:")), 0, wxALL, 4)
# Line 752  class UTMPanel(ProjPanel): Line 783  class UTMPanel(ProjPanel):
783          self.receiver = receiver          self.receiver = receiver
784    
785          self.__zone = wxSpinCtrl(self, ID_UTMPANEL_ZONE, "1", min=1, max=60)          self.__zone = wxSpinCtrl(self, ID_UTMPANEL_ZONE, "1", min=1, max=60)
786            self.__propButton = wxButton(self, ID_UTMPANEL_PROP, _("Propose"))
787          self.__south = wxCheckBox(self, ID_UTMPANEL_SOUTH,          self.__south = wxCheckBox(self, ID_UTMPANEL_SOUTH,
788                                    _("Southern Hemisphere"))                                    _("Southern Hemisphere"))
         self.__propButton = wxButton(self, ID_UTMPANEL_PROP, _("Propose"))  
789    
790          self._DoLayout()          self._DoLayout()
791    
# Line 794  class UTMPanel(ProjPanel): Line 825  class UTMPanel(ProjPanel):
825          ProjPanel.Clear(self)          ProjPanel.Clear(self)
826    
827      def _OnPropose(self, event):      def _OnPropose(self, event):
828          UTMProposeZoneDialog          """Call the propose dialog.
829            If the receiver (e.g. the current map) has no bounding box,
830            inform the user accordingly.
831            """
832            bb = self.receiver.BoundingBox()
833            if bb is None:
834                dlg = wxMessageDialog(self,
835                        _("Can not propose: No bounding box found."),
836                        _("Projection: Propose UTM Zone"),
837                        wxOK | wxICON_INFORMATION)
838                dlg.CenterOnParent()
839                result = dlg.ShowModal()
840                dlg.Destroy()
841                return
842    
843          dlg = UTMProposeZoneDialog(self, self.receiver.BoundingBox())          dlg = UTMProposeZoneDialog(self, self.receiver.BoundingBox())
844          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
845              self.__zone.SetValue(dlg.GetProposedZone())              self.__zone.SetValue(dlg.GetProposedZone())
# Line 823  class LCCPanel(ProjPanel): Line 868  class LCCPanel(ProjPanel):
868          sizer.Add(wxStaticText(self, -1,          sizer.Add(wxStaticText(self, -1,
869              _("Latitude of second standard parallel:")))              _("Latitude of second standard parallel:")))
870          sizer.Add(self.__sspLatitude, 0, wxALL, 4)          sizer.Add(self.__sspLatitude, 0, wxALL, 4)
         sizer.Add(wxStaticText(self, -1, _("Latitude of origin:")))  
         sizer.Add(self.__originLat, 0, wxALL, 4)  
871          sizer.Add(wxStaticText(self, -1, _("Central Meridian:")))          sizer.Add(wxStaticText(self, -1, _("Central Meridian:")))
872          sizer.Add(self.__meridian, 0, wxALL, 4)          sizer.Add(self.__meridian, 0, wxALL, 4)
873            sizer.Add(wxStaticText(self, -1, _("Latitude of origin:")))
874            sizer.Add(self.__originLat, 0, wxALL, 4)
875          sizer.Add(wxStaticText(self, -1, _("False Easting:")))          sizer.Add(wxStaticText(self, -1, _("False Easting:")))
876          sizer.Add(self.__falseEast, 0, wxALL, 4)          sizer.Add(self.__falseEast, 0, wxALL, 4)
877          sizer.Add(wxStaticText(self, -1, _("False Northing:")))          sizer.Add(wxStaticText(self, -1, _("False Northing:")))
# Line 875  class GeoPanel(ProjPanel): Line 920  class GeoPanel(ProjPanel):
920      def __init__(self, parent, receiver):      def __init__(self, parent, receiver):
921          ProjPanel.__init__(self, parent)          ProjPanel.__init__(self, parent)
922    
923          self.__choices = [(_("Radians"), "1"),          self.__choices = [(_("Degrees"), "0.017453"),
924                            (_("Degrees"), "0.017453")]                            (_("Radians"), "1")]
925    
926          self.__scale = wxChoice(self, -1)          self.__scale = wxChoice(self, -1)
927          for choice, value in self.__choices:          for choice, value in self.__choices:
# Line 910  class GeoPanel(ProjPanel): Line 955  class GeoPanel(ProjPanel):
955          sizer = wxBoxSizer(wxHORIZONTAL)          sizer = wxBoxSizer(wxHORIZONTAL)
956    
957          sizer.Add(wxStaticText(self, -1, _("Source Data is in: ")),          sizer.Add(wxStaticText(self, -1, _("Source Data is in: ")),
958                    0, wxALL, 4)                    0, wxALL|wxALIGN_CENTER_VERTICAL, 4)
959          sizer.Add(self.__scale, 1, wxEXPAND|wxALL, 4)          sizer.Add(self.__scale, 1, wxEXPAND|wxALL, 4)
960    
961          self.__scale.SetSelection(0)          self.__scale.SetSelection(0)
# Line 921  class GeoPanel(ProjPanel): Line 966  class GeoPanel(ProjPanel):
966  ID_UTM_PROPOSE_ZONE_DIALOG_TAKE   = 4001  ID_UTM_PROPOSE_ZONE_DIALOG_TAKE   = 4001
967  ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL = 4002  ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL = 4002
968  class UTMProposeZoneDialog(wxDialog):  class UTMProposeZoneDialog(wxDialog):
969                                                                                    
970      """Propose a sensible Zone considering the current map extent."""      """Propose a sensible Zone considering the current map extent."""
971                                                                                    
972      def __init__(self, parent, (x, y, x2, y2)):      def __init__(self, parent, (x, y, x2, y2)):
973          wxDialog.__init__(self, parent, -1, _("Projection: Propose UTM Zone"),          wxDialog.__init__(self, parent, -1, _("Projection: Propose UTM Zone"),
974                            wxDefaultPosition, wxSize(200, 100))                            wxDefaultPosition, wxSize(200, 100))
975          self.parent = parent          self.parent = parent
         #x, y, x2, y2 = elf.parent.parent.map_bounding_box  
976          x = x + 180          x = x + 180
977          x2 = x2 + 180          x2 = x2 + 180
978          center = (x2 - x) / 2 + x          center = (x2 - x) / 2 + x
979          self.proposedZone = int(center / 6 + 1)          self.proposedZone = int(center / 6 + 1)
980          self.dialogLayout()          self.dialogLayout()
981                                                                                    
982      def dialogLayout(self):      def dialogLayout(self):
983          topBox = wxBoxSizer(wxVERTICAL)          topBox = wxBoxSizer(wxVERTICAL)
984                                                                                    
985          textBox = wxBoxSizer(wxVERTICAL)          textBox = wxBoxSizer(wxVERTICAL)
986          textBox.Add(wxStaticText(self, -1, _("The current map extent center " +          textBox.Add(wxStaticText(self, -1, _("The current map extent center "
987                                             "lies in UTM Zone")),                                               "lies in UTM Zone")),
988                      0, wxALIGN_CENTER|wxALL, 4)                      0, wxALIGN_CENTER|wxALL, 4)
989          textBox.Add(wxStaticText(self, -1, str(self.proposedZone)),          textBox.Add(wxStaticText(self, -1, str(self.proposedZone)),
990                      0, wxALIGN_CENTER|wxALL, 4)                      0, wxALIGN_CENTER|wxALL, 4)
991                                                                                    
992          topBox.Add(textBox, 1, wxEXPAND|wxALL, 4)          topBox.Add(textBox, 1, wxEXPAND|wxALL, 4)
993                                                                                    
994          buttonBox = wxBoxSizer(wxHORIZONTAL)          buttonBox = wxBoxSizer(wxHORIZONTAL)
995          buttonBox.Add(wxButton(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE,          buttonBox.Add(wxButton(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE,
996                        _("Take")), 0, wxALL, 4)                        _("Take")), 0, wxALL, 4)
# Line 955  class UTMProposeZoneDialog(wxDialog): Line 999  class UTMProposeZoneDialog(wxDialog):
999          topBox.Add(buttonBox, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10)          topBox.Add(buttonBox, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10)
1000          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE, self.OnTake)          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE, self.OnTake)
1001          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL, self.OnCancel)          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL, self.OnCancel)
1002                                                                                    
1003          self.SetAutoLayout(True)          self.SetAutoLayout(True)
1004          self.SetSizer(topBox)          self.SetSizer(topBox)
1005          topBox.Fit(self)          topBox.Fit(self)
1006          topBox.SetSizeHints(self)          topBox.SetSizeHints(self)
1007                                                                                    
1008      def OnTake(self, event):      def OnTake(self, event):
1009          self.EndModal(wxID_OK)          self.EndModal(wxID_OK)
1010                                                                                    
1011      def OnCancel(self, event):      def OnCancel(self, event):
1012          self.EndModal(wxID_CANCEL)          self.EndModal(wxID_CANCEL)
1013    

Legend:
Removed from v.797  
changed lines
  Added in v.1819

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26