/[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 747 by jonathan, Fri Apr 25 11:02:08 2003 UTC revision 1795 by bh, Wed Oct 8 17:35:52 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_ADDTOLIST    = 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"))
         self.button_save = wxButton(self.panel_edit, ID_PROJ_SAVE,_("Save"))  
95          self.button_add = wxButton(self.panel_edit, ID_PROJ_ADDTOLIST,          self.button_add = wxButton(self.panel_edit, ID_PROJ_ADDTOLIST,
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 101  class ProjFrame(NonModalDialog): Line 136  class ProjFrame(NonModalDialog):
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])
192                      projfile.GetFilename() + "\n" + errstr,  
193                      _("Error"), wxOK | wxICON_ERROR).ShowModal()              self.__FillAvailList( selectProj = newproj.GetName())
             self.__FillAvailList()  
194    
195      def _OnAddToList(self, event):      def _OnAddToList(self, event):
196    
# Line 150  class ProjFrame(NonModalDialog): Line 198  class ProjFrame(NonModalDialog):
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)
204                      _("The following error occured:\n") +  
205                      self.__usrProjFile.GetFilename() + "\n" + errstr,              self.__FillAvailList( selectProj = proj.GetName())
                     _("Error"), wxOK | wxICON_ERROR).ShowModal()  
             self.__FillAvailList()  
206    
207      def _OnProjAvail(self, event):      def _OnProjAvail(self, event):
208          self.__DoOnProjAvail()          self.__DoOnProjAvail()
209    
210        def show_warnings(self, title, filename, warnings):
211            """Show the warnings (a list of strings) in a dialog
212    
213            If the list is empty no dialog will be shown.
214            """
215            if warnings:
216                text = (_('Warnings when reading "%s":\n\n%s')
217                        % (filename, "\n\n".join(warnings)))
218                self.parent.RunMessageBox(title, text)
219    
220      def _OnImport(self, event):      def _OnImport(self, event):
221    
222          dlg = wxFileDialog(self, _("Import"), style = wxOPEN)          dlg = wxFileDialog(self, _("Import"), style = wxOPEN)
# Line 169  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    
# Line 202  class ProjFrame(NonModalDialog): Line 256  class ProjFrame(NonModalDialog):
256                      projFile.Add(proj)                      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 240  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 258  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 271  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 284  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 293  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 311  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 325  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 336  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        def _show_proj_panel(self, panel):
453            """Show the panel as the projection panel"""
454            if self.curProjPanel is not None:
455                self.curProjPanel.Hide()
456                self.sizer_projctrls.Remove(self.curProjPanel)
457    
458              if self.curProjPanel is not None:          self.curProjPanel = panel
459                  self.curProjPanel.Hide()          self.curProjPanel.Show()
460                  self.sizer_projctrls.Remove(self.curProjPanel)  
461            self.sizer_projctrls.Add(self.curProjPanel, 1,
462              self.curProjPanel = obj              wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)
463              self.curProjPanel.Show()          self.sizer_projctrls.Layout()
464            self.Layout()
465              self.sizer_projctrls.Add(self.curProjPanel, 1,          self.topBox.SetSizeHints(self)
                 wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)  
             self.sizer_projctrls.Layout()  
             self.Layout()  
             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"
         if self.curProjPanel is not None:  
             proj = Projection(self.curProjPanel.GetParameters())  
             proj.SetName(self.projname.GetValue())  
485    
         return proj  
486    
487      def __FillAvailList(self, selectCurrent = False):          if len(sel) == 1:
488          self.availprojs.Clear()              proj = self.availprojs.GetClientData(sel[0])[CLIENT_PROJ]
489                if proj is None:
490                    # <None> is selected
491                    return None
492    
493          #          #
494          # We add the current projection to the list first so that          # self.curProjPanel should always contain the most
495          # we are sure that it's at index 0. That way we can          # relevant data for a projection
         # 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.  
496          #          #
497          proj = self.receiver.GetProjection()          if self.curProjPanel is not None:
498          if proj is not None:              return Projection(self.curProjPanel.GetParameters(),
499              self.availprojs.Append(_("%s (current)") % proj.GetName(),                                self.projname.GetValue())
500                                     [proj, None])  
501              if selectCurrent:          return None
502                  self.availprojs.SetSelection(0)  
503                  self.availprojs.SetFirstItem(0)      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    
513            self.availprojs.Clear()
514    
515          #          #
516          # the list can never be empty. there will always be          # the list can never be empty. there will always be
# Line 409  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                self.availprojs.Append(proj.GetName(), [proj, projfile])
525            self.__sysProjFile = projfile
526    
527            projfile, warnings = get_user_proj_file()
528            self.show_warnings(_("Warnings"), projfile.GetFilename(), warnings)
529            for proj in projfile.GetProjections():
530                self.availprojs.Append(proj.GetName(), [proj, projfile])
531            self.__usrProjFile = projfile
532    
533          projfile = GetSystemProjFiles()          #
534          if len(projfile) > 0:          # We add the current projection to the list at last.
535              projfile = projfile[0]          # Since the list is resorted immediately a following FindString()
536              for proj in projfile.GetProjections():          # determines the index correctly.
537                  self.availprojs.Append(proj.GetName(), [proj, projfile])          #
538              self.__sysProjFile = projfile          proj = self.receiver.GetProjection()
539            if proj is not None:
540          projfile = GetUserProjFiles()              proj_item = _("%s (current)") % proj.GetName()
541          if len(projfile) > 0:              self.availprojs.Append(proj_item, [proj, None])
542              projfile = projfile[0]              if selectCurrent:
543              for proj in projfile.GetProjections():                  self.availprojs.SetSelection(
544                  self.availprojs.Append(proj.GetName(), [proj, projfile])                          self.availprojs.FindString(proj_item)
545              self.__usrProjFile = projfile                      )
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):
559    
560          self.SetTitle(_("Projections"))          #self.availprojs.SetSelection(0)
         self.availprojs.SetSelection(0)  
561          self.projchoice.SetSelection(0)          self.projchoice.SetSelection(0)
562    
563          self.__FillAvailList(selectCurrent = True)          self.__FillAvailList(selectCurrent = True)
564    
         self.projname.SetMaxLength(32)  
   
565      def __do_layout(self):      def __do_layout(self):
566          # originally generated by wxGlade          # originally generated by wxGlade
567    
568          self.topBox = wxBoxSizer(wxVERTICAL)          self.topBox = wxBoxSizer(wxVERTICAL)
569          self.sizer_panel = wxBoxSizer(wxVERTICAL)          self.sizer_panel = wxBoxSizer(wxVERTICAL)
570          sizer_6 = wxBoxSizer(wxHORIZONTAL)          sizer_6 = wxBoxSizer(wxHORIZONTAL)
571            self.sizer_mainbttns = wxBoxSizer(wxHORIZONTAL)
572          self.sizer_mainctrls = wxBoxSizer(wxHORIZONTAL)          self.sizer_mainctrls = wxBoxSizer(wxHORIZONTAL)
573          self.sizer_edit = wxStaticBoxSizer(wxStaticBox(self.panel_edit, -1, _("Edit")), wxHORIZONTAL)          self.sizer_edit = wxStaticBoxSizer(wxStaticBox(self.panel_edit, -1, _("Edit")), wxHORIZONTAL)
574          sizer_11 = wxBoxSizer(wxVERTICAL)          sizer_11 = wxBoxSizer(wxVERTICAL)
# Line 463  class ProjFrame(NonModalDialog): Line 587  class ProjFrame(NonModalDialog):
587          grid_sizer_1.Add(20, 20, 0, wxEXPAND, 0)          grid_sizer_1.Add(20, 20, 0, wxEXPAND, 0)
588          grid_sizer_1.Add(self.availprojs, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)          grid_sizer_1.Add(self.availprojs, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)
589          grid_sizer_1.Add(sizer_15, 0, wxALL|wxEXPAND, 4)          grid_sizer_1.Add(sizer_15, 0, wxALL|wxEXPAND, 4)
590          grid_sizer_1.Add(self.projfilepath, 0, wxALL|wxADJUST_MINSIZE, 4)          grid_sizer_1.Add(self.projfilepath, 0, wxEXPAND|wxALL|wxADJUST_MINSIZE, 4)
591          grid_sizer_1.AddGrowableRow(1)          grid_sizer_1.AddGrowableRow(1)
592          grid_sizer_1.AddGrowableCol(0)          grid_sizer_1.AddGrowableCol(0)
593    
# Line 472  class ProjFrame(NonModalDialog): Line 596  class ProjFrame(NonModalDialog):
596          sizer_13.Add(self.projname, 1, wxALL, 4)          sizer_13.Add(self.projname, 1, wxALL, 4)
597          self.sizer_projctrls.Add(sizer_13, 0, wxEXPAND, 0)          self.sizer_projctrls.Add(sizer_13, 0, wxEXPAND, 0)
598          sizer_14.Add(self.label_3, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)          sizer_14.Add(self.label_3, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)
599          sizer_14.Add(self.projchoice, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)          sizer_14.Add(self.projchoice, 1, wxALL|wxALIGN_CENTER_VERTICAL, 4)
600          self.sizer_projctrls.Add(sizer_14, 0, wxEXPAND, 0)          self.sizer_projctrls.Add(sizer_14, 0, wxEXPAND, 0)
601          self.sizer_edit.Add(self.sizer_projctrls, 1, wxEXPAND, 0)          self.sizer_edit.Add(self.sizer_projctrls, 1, wxEXPAND, 0)
602          sizer_11.Add(self.button_new, 0, wxALL|wxEXPAND, 4)          sizer_11.Add(self.button_new, 0, wxEXPAND|wxALL, 4)
603          sizer_11.Add(self.button_save, 0, wxALL|wxEXPAND, 4)          sizer_11.Add(self.button_add, 0, wxEXPAND|wxALL, 4)
604          sizer_11.Add(self.button_add, 0, wxALL|wxEXPAND, 4)          sizer_11.Add(20, 20, 0, wxEXPAND, 0)
605            sizer_11.Add(self.button_save, 0, wxEXPAND|wxALL|wxALIGN_BOTTOM, 4)
606          self.sizer_edit.Add(sizer_11, 0, wxALL|wxEXPAND, 4)          self.sizer_edit.Add(sizer_11, 0, wxALL|wxEXPAND, 4)
607    
608          sizer_6.Add(20, 20, 1, wxEXPAND, 0)          sizer_6.Add(self.button_try, 0, wxRIGHT| wxEXPAND, 10)
609          sizer_6.Add(self.button_try, 0, wxALL, 4)          sizer_6.Add(self.button_revert, 0, wxRIGHT| wxEXPAND, 10)
610          sizer_6.Add(20, 20, 1, 0, 0)          sizer_6.Add(self.button_ok, 0, wxRIGHT| wxEXPAND, 10)
611          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)  
612    
613          self.panel_1.SetAutoLayout(1)          self.panel_1.SetAutoLayout(1)
614          self.panel_1.SetSizer(grid_sizer_1)          self.panel_1.SetSizer(grid_sizer_1)
# Line 500  class ProjFrame(NonModalDialog): Line 620  class ProjFrame(NonModalDialog):
620          self.sizer_edit.Fit(self.panel_edit)          self.sizer_edit.Fit(self.panel_edit)
621          self.sizer_edit.SetSizeHints(self.panel_edit)          self.sizer_edit.SetSizeHints(self.panel_edit)
622    
         self.panel_buttons.SetAutoLayout(1)  
         self.panel_buttons.SetSizer(sizer_6)  
         sizer_6.Fit(self.panel_buttons)  
         sizer_6.SetSizeHints(self.panel_buttons)  
   
623          self.sizer_mainctrls.Add(self.panel_1, 0,          self.sizer_mainctrls.Add(self.panel_1, 0,
624              wxALL|wxEXPAND|wxADJUST_MINSIZE, 0)              wxALL|wxEXPAND|wxADJUST_MINSIZE, 0)
625          self.sizer_mainctrls.Add(self.panel_edit, 1,          self.sizer_mainctrls.Add(self.panel_edit, 1,
626              wxALL|wxEXPAND|wxADJUST_MINSIZE, 0)              wxALL|wxEXPAND|wxADJUST_MINSIZE, 0)
627    
628            self.sizer_mainbttns.Add(sizer_6, 0,
629                wxALL|wxEXPAND|wxADJUST_MINSIZE, 10)
630    
631          self.topBox.Add(self.sizer_mainctrls, 1, wxALL|wxEXPAND, 4)          self.topBox.Add(self.sizer_mainctrls, 1, wxALL|wxEXPAND, 4)
632          self.topBox.Add(self.panel_buttons, 0, wxEXPAND, 0)          self.topBox.Add(self.sizer_mainbttns, 0, wxALIGN_RIGHT|wxBOTTOM, 0)
633    
634          self.SetAutoLayout(1)          self.SetAutoLayout(1)
635          self.SetSizer(self.topBox)          self.SetSizer(self.topBox)
# Line 529  class ProjPanel(wxPanel): Line 647  class ProjPanel(wxPanel):
647          wxPanel.__init__(self, parent, -1)          wxPanel.__init__(self, parent, -1)
648    
649          self.__ellps = wxChoice(self, -1)          self.__ellps = wxChoice(self, -1)
650          self.ellpsData = [("bessel", _("Bessel 1841")),          self.ellpsData = [("airy"  , _("Airy")),
651                              ("bessel", _("Bessel 1841")),
652                            ("clrk66", _("Clarke 1866")),                            ("clrk66", _("Clarke 1866")),
653                            ("clrk80", _("Clarke 1880")),                            ("clrk80", _("Clarke 1880")),
654                            ("GRS80" , _("GRS 1980 (IUGG, 1980)")),                            ("GRS80" , _("GRS 1980 (IUGG, 1980)")),
# Line 545  class ProjPanel(wxPanel): Line 664  class ProjPanel(wxPanel):
664    
665          panelSizer = wxBoxSizer(wxVERTICAL)          panelSizer = wxBoxSizer(wxVERTICAL)
666    
         if childPanel is not None:  
             panelSizer.Add(childPanel, 0, wxALL|wxEXPAND, 4)  
               
667          sizer = wxBoxSizer(wxHORIZONTAL)          sizer = wxBoxSizer(wxHORIZONTAL)
668          sizer.Add(wxStaticText(self, -1, _("Ellipsoid:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("Ellipsoid:")), 0,
669          sizer.Add(self.__ellps, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)                                      wxALL|wxALIGN_CENTER_VERTICAL, 4)
670            sizer.Add(self.__ellps, 1, wxALL|wxALIGN_CENTER_VERTICAL, 4)
671          panelSizer.Add(sizer, 0, wxALL|wxEXPAND, 4)          panelSizer.Add(sizer, 0, wxALL|wxEXPAND, 4)
672    
673            if childPanel is not None:
674                panelSizer.Add(childPanel, 0, wxEXPAND, 0)
675                
676          self.SetAutoLayout(1)          self.SetAutoLayout(1)
677          self.SetSizer(panelSizer)          self.SetSizer(panelSizer)
678          panelSizer.Fit(self)          panelSizer.Fit(self)
# Line 586  ID_TMPANEL_FALSE_NORTH = 4004 Line 706  ID_TMPANEL_FALSE_NORTH = 4004
706  ID_TMPANEL_SCALE = 4005  ID_TMPANEL_SCALE = 4005
707    
708  class UnknownProjPanel(ProjPanel):  class UnknownProjPanel(ProjPanel):
709    
710        """Panel for unknown projection types"""
711    
712      def __init__(self, parent, receiver):      def __init__(self, parent, receiver):
713          ProjPanel.__init__(self, parent)          ProjPanel.__init__(self, parent)
714    
# Line 594  class UnknownProjPanel(ProjPanel): Line 717  class UnknownProjPanel(ProjPanel):
717      def _DoLayout(self):      def _DoLayout(self):
718          sizer = wxBoxSizer(wxVERTICAL)          sizer = wxBoxSizer(wxVERTICAL)
719    
720          sizer.Add(wxStaticText(self, -1,          sizer.Add(wxStaticText(self, -1,
721              _("Thuban does not know the parameters for the " +                                 _("Thuban does not know the parameters for the"
722                "current projection and cannot display a " +                                   " current projection\n"
723                "configuration panel.")))                                   "and cannot display a configuration panel.")))
724    
725          ProjPanel._DoLayout(self, sizer)          ProjPanel._DoLayout(self, sizer)
726    
# Line 618  class TMPanel(ProjPanel): Line 741  class TMPanel(ProjPanel):
741    
742          self.__latitude = wxTextCtrl(self, ID_TMPANEL_LAT)          self.__latitude = wxTextCtrl(self, ID_TMPANEL_LAT)
743          self.__longitude = wxTextCtrl(self, ID_TMPANEL_LONG)          self.__longitude = wxTextCtrl(self, ID_TMPANEL_LONG)
744            self.__scale = wxTextCtrl(self, ID_TMPANEL_SCALE)
745          self.__falseEast = wxTextCtrl(self, ID_TMPANEL_FASLE_EAST)          self.__falseEast = wxTextCtrl(self, ID_TMPANEL_FASLE_EAST)
746          self.__falseNorth = wxTextCtrl(self, ID_TMPANEL_FALSE_NORTH)          self.__falseNorth = wxTextCtrl(self, ID_TMPANEL_FALSE_NORTH)
         self.__scale = wxTextCtrl(self, ID_TMPANEL_SCALE)  
747    
748          self._DoLayout()          self._DoLayout()
749    
# Line 686  class UTMPanel(ProjPanel): Line 809  class UTMPanel(ProjPanel):
809          self.receiver = receiver          self.receiver = receiver
810    
811          self.__zone = wxSpinCtrl(self, ID_UTMPANEL_ZONE, "1", min=1, max=60)          self.__zone = wxSpinCtrl(self, ID_UTMPANEL_ZONE, "1", min=1, max=60)
812            self.__propButton = wxButton(self, ID_UTMPANEL_PROP, _("Propose"))
813          self.__south = wxCheckBox(self, ID_UTMPANEL_SOUTH,          self.__south = wxCheckBox(self, ID_UTMPANEL_SOUTH,
814                                    _("Southern Hemisphere"))                                    _("Southern Hemisphere"))
         self.__propButton = wxButton(self, ID_UTMPANEL_PROP, _("Propose"))  
815    
816          self._DoLayout()          self._DoLayout()
817    
# Line 728  class UTMPanel(ProjPanel): Line 851  class UTMPanel(ProjPanel):
851          ProjPanel.Clear(self)          ProjPanel.Clear(self)
852    
853      def _OnPropose(self, event):      def _OnPropose(self, event):
854          UTMProposeZoneDialog          """Call the propose dialog.
855            If the receiver (e.g. the current map) has no bounding box,
856            inform the user accordingly.
857            """
858            bb = self.receiver.BoundingBox()
859            if bb is None:
860                dlg = wxMessageDialog(self,
861                        _("Can not propose: No bounding box found."),
862                        _("Projection: Propose UTM Zone"),
863                        wxOK | wxICON_INFORMATION)
864                dlg.CenterOnParent()
865                result = dlg.ShowModal()
866                dlg.Destroy()
867                return
868    
869          dlg = UTMProposeZoneDialog(self, self.receiver.BoundingBox())          dlg = UTMProposeZoneDialog(self, self.receiver.BoundingBox())
870          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
871              self.__zone.SetValue(dlg.GetProposedZone())              self.__zone.SetValue(dlg.GetProposedZone())
# Line 757  class LCCPanel(ProjPanel): Line 894  class LCCPanel(ProjPanel):
894          sizer.Add(wxStaticText(self, -1,          sizer.Add(wxStaticText(self, -1,
895              _("Latitude of second standard parallel:")))              _("Latitude of second standard parallel:")))
896          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)  
897          sizer.Add(wxStaticText(self, -1, _("Central Meridian:")))          sizer.Add(wxStaticText(self, -1, _("Central Meridian:")))
898          sizer.Add(self.__meridian, 0, wxALL, 4)          sizer.Add(self.__meridian, 0, wxALL, 4)
899            sizer.Add(wxStaticText(self, -1, _("Latitude of origin:")))
900            sizer.Add(self.__originLat, 0, wxALL, 4)
901          sizer.Add(wxStaticText(self, -1, _("False Easting:")))          sizer.Add(wxStaticText(self, -1, _("False Easting:")))
902          sizer.Add(self.__falseEast, 0, wxALL, 4)          sizer.Add(self.__falseEast, 0, wxALL, 4)
903          sizer.Add(wxStaticText(self, -1, _("False Northing:")))          sizer.Add(wxStaticText(self, -1, _("False Northing:")))
# Line 808  class GeoPanel(ProjPanel): Line 945  class GeoPanel(ProjPanel):
945    
946      def __init__(self, parent, receiver):      def __init__(self, parent, receiver):
947          ProjPanel.__init__(self, parent)          ProjPanel.__init__(self, parent)
948          ProjPanel._DoLayout(self, None)  
949            self.__choices = [(_("Degrees"), "0.017453"),
950                              (_("Radians"), "1")]
951    
952            self.__scale = wxChoice(self, -1)
953            for choice, value in self.__choices:
954                self.__scale.Append(choice, value)
955    
956            self._DoLayout()
957    
958      def GetProjName(self):      def GetProjName(self):
959          return _("Geographic")          return _("Geographic")
960                    
961      def SetProjection(self, proj):      def SetProjection(self, proj):
962            value = proj.GetParameter("to_meter")
963            for i in range(len(self.__choices)):
964                choice, data = self.__choices[i]
965                if value == data:
966                    self.__scale.SetSelection(i)
967          ProjPanel.SetProjection(self, proj)          ProjPanel.SetProjection(self, proj)
968    
969      def GetParameters(self):      def GetParameters(self):
970          params = ["proj=latlong"]          params = ["proj=latlong",
971                      "to_meter=%s" % self.__scale.GetClientData(
972                                      self.__scale.GetSelection())]
973    
974          params.extend(ProjPanel.GetParameters(self))          params.extend(ProjPanel.GetParameters(self))
975          return params          return params
976    
977      def Clear(self):      def Clear(self):
978          ProjPanel.Clear(self)          ProjPanel.Clear(self)
979    
980        def _DoLayout(self):
981            sizer = wxBoxSizer(wxHORIZONTAL)
982    
983            sizer.Add(wxStaticText(self, -1, _("Source Data is in: ")),
984                      0, wxALL|wxALIGN_CENTER_VERTICAL, 4)
985            sizer.Add(self.__scale, 1, wxEXPAND|wxALL, 4)
986    
987            self.__scale.SetSelection(0)
988    
989            ProjPanel._DoLayout(self, sizer)
990    
991    
992  ID_UTM_PROPOSE_ZONE_DIALOG_TAKE   = 4001  ID_UTM_PROPOSE_ZONE_DIALOG_TAKE   = 4001
993  ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL = 4002  ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL = 4002
994  class UTMProposeZoneDialog(wxDialog):  class UTMProposeZoneDialog(wxDialog):
995                                                                                    
996      """Propose a sensible Zone considering the current map extent."""      """Propose a sensible Zone considering the current map extent."""
997                                                                                    
998      def __init__(self, parent, (x, y, x2, y2)):      def __init__(self, parent, (x, y, x2, y2)):
999          wxDialog.__init__(self, parent, -1, _("Projection: Propose UTM Zone"),          wxDialog.__init__(self, parent, -1, _("Projection: Propose UTM Zone"),
1000                            wxDefaultPosition, wxSize(200, 100))                            wxDefaultPosition, wxSize(200, 100))
1001          self.parent = parent          self.parent = parent
         #x, y, x2, y2 = elf.parent.parent.map_bounding_box  
1002          x = x + 180          x = x + 180
1003          x2 = x2 + 180          x2 = x2 + 180
1004          center = (x2 - x) / 2 + x          center = (x2 - x) / 2 + x
1005          self.proposedZone = int(center / 6 + 1)          self.proposedZone = int(center / 6 + 1)
1006          self.dialogLayout()          self.dialogLayout()
1007                                                                                    
1008      def dialogLayout(self):      def dialogLayout(self):
1009          topBox = wxBoxSizer(wxVERTICAL)          topBox = wxBoxSizer(wxVERTICAL)
1010                                                                                    
1011          textBox = wxBoxSizer(wxVERTICAL)          textBox = wxBoxSizer(wxVERTICAL)
1012          textBox.Add(wxStaticText(self, -1, _("The current map extent center " +          textBox.Add(wxStaticText(self, -1, _("The current map extent center "
1013                                             "lies in UTM Zone")),                                               "lies in UTM Zone")),
1014                      0, wxALIGN_CENTER|wxALL, 4)                      0, wxALIGN_CENTER|wxALL, 4)
1015          textBox.Add(wxStaticText(self, -1, str(self.proposedZone)),          textBox.Add(wxStaticText(self, -1, str(self.proposedZone)),
1016                      0, wxALIGN_CENTER|wxALL, 4)                      0, wxALIGN_CENTER|wxALL, 4)
1017                                                                                    
1018          topBox.Add(textBox, 1, wxEXPAND|wxALL, 4)          topBox.Add(textBox, 1, wxEXPAND|wxALL, 4)
1019                                                                                    
1020          buttonBox = wxBoxSizer(wxHORIZONTAL)          buttonBox = wxBoxSizer(wxHORIZONTAL)
1021          buttonBox.Add(wxButton(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE,          buttonBox.Add(wxButton(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE,
1022                        _("Take")), 0, wxALL, 4)                        _("Take")), 0, wxALL, 4)
# Line 862  class UTMProposeZoneDialog(wxDialog): Line 1025  class UTMProposeZoneDialog(wxDialog):
1025          topBox.Add(buttonBox, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10)          topBox.Add(buttonBox, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10)
1026          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE, self.OnTake)          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE, self.OnTake)
1027          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL, self.OnCancel)          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL, self.OnCancel)
1028                                                                                    
1029          self.SetAutoLayout(True)          self.SetAutoLayout(True)
1030          self.SetSizer(topBox)          self.SetSizer(topBox)
1031          topBox.Fit(self)          topBox.Fit(self)
1032          topBox.SetSizeHints(self)          topBox.SetSizeHints(self)
1033                                                                                    
1034      def OnTake(self, event):      def OnTake(self, event):
1035          self.EndModal(wxID_OK)          self.EndModal(wxID_OK)
1036                                                                                    
1037      def OnCancel(self, event):      def OnCancel(self, event):
1038          self.EndModal(wxID_CANCEL)          self.EndModal(wxID_CANCEL)
1039    

Legend:
Removed from v.747  
changed lines
  Added in v.1795

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26