/[thuban]/branches/WIP-pyshapelib-bramz/Thuban/UI/projdialog.py
ViewVC logotype

Diff of /branches/WIP-pyshapelib-bramz/Thuban/UI/projdialog.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1135 by frank, Thu Jun 5 15:05:21 2003 UTC revision 1858 by jan, Fri Oct 24 15:12:58 2003 UTC
# Line 2  Line 2 
2  # Authors:  # Authors:
3  # Jonathan Coles <[email protected]>  # Jonathan Coles <[email protected]>
4  # Frank Koormann <[email protected]>  # Frank Koormann <[email protected]>
5    # Jan-Oliver Wagner <[email protected]>
6  #  #
7  # This program is free software under the GPL (>=v2)  # This program is free software under the GPL (>=v2)
8  # Read the file COPYING coming with Thuban for details.  # Read the file COPYING coming with Thuban for details.
9                                                                                    
10  import os, sys, math  """Projection dialog"""
11    
12    __version__ = "$Revision$"
13    # $Source$
14    # $Id$
15    
16    import os
17  from wxPython.wx import *  from wxPython.wx import *
18    
19  from Thuban import _  from Thuban import _
20    
21  from Thuban.Model.proj import Projection, ProjFile  from Thuban.Model.proj import Projection, ProjFile
22    
23  from Thuban.Model.resource import GetUserProjFiles, GetSystemProjFiles, \  from Thuban.Model.resource import get_user_proj_file, get_system_proj_file, \
24                                    ReadProjFile, WriteProjFile                                    read_proj_file, write_proj_file
25  from Thuban.UI.dialogs import NonModalNonParentDialog  from Thuban.UI.dialogs import NonModalNonParentDialog
26    
27    from common import ThubanBeginBusyCursor, ThubanEndBusyCursor
28    from sizers import NotebookLikeSizer
29    from projlist import PROJ_SELECTION_CHANGED, ProjectionList
30    from common import ThubanBeginBusyCursor, ThubanEndBusyCursor
31    
32    
33    
 ID_PROJ_ADVANCED  = 4001  
34  ID_PROJ_PROJCHOICE = 4002  ID_PROJ_PROJCHOICE = 4002
35  ID_PROJ_ADDTOLIST    = 4003  ID_PROJ_ADDTOLIST    = 4003
36  ID_PROJ_NEW       = 4004  ID_PROJ_NEW       = 4004
# Line 42  class ProjFrame(NonModalNonParentDialog) Line 54  class ProjFrame(NonModalNonParentDialog)
54                          SetProjection(projection)                          SetProjection(projection)
55                          GetProjection()                          GetProjection()
56          """          """
57                    NonModalNonParentDialog.__init__(self, parent, name, title)
58    
59            self.projection_panel_defs = [
60                ("tmerc", _("Transverse Mercator"), TMPanel),
61                ("utm", _("Universal Transverse Mercator"), UTMPanel),
62                ("lcc", _("Lambert Conic Conformal"), LCCPanel),
63                ("latlong", _("Geographic"), GeoPanel)]
64          self.receiver = receiver          self.receiver = receiver
65          self.haveTried = False          self.haveTried = False
66          self.curProjPanel = None          self.curProjPanel = None
67            self.__usrProjFile = None
68            self.__sysProjFile = None
69    
70          self.projPanels = []          self.build_dialog()
71          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))  
72    
73          NonModalNonParentDialog.__init__(self, parent, name, title)          self.originalProjection = self.receiver.GetProjection()
         # originally generate by wxGlade  
         self.panel_1 = wxPanel(self, -1)  
         self.panel_edit = wxPanel(self, -1)  
         self.label_5 = wxStaticText(self.panel_1, -1,  
                         _("Available Projections:"))  
74    
75          # Projection List specific actions (Import/Export/Remove)          self.projection_list.SelectProjection(self.originalProjection)
76          self.button_import = wxButton(self.panel_1, ID_PROJ_IMPORT,          self.projection_list.SetFocus()
                                       _("Import..."))  
         self.button_export = wxButton(self.panel_1, ID_PROJ_EXPORT,  
                                       _("Export..."))  
         self.button_remove = wxButton(self.panel_1, ID_PROJ_REMOVE,  
                                       _("Remove"))  
   
         # The Projection List  
         self.availprojs = wxListBox(self.panel_1, ID_PROJ_AVAIL,  
                                     style=wxLB_EXTENDED|wxLB_SORT)  
         self.projfilepath = wxStaticText(self.panel_1, -1, "")  
77    
78          # Projection Specific Entries (Name/Projection)      def build_dialog(self):
79          self.label_2 = wxStaticText(self.panel_edit, -1, _("Name:"))          """Build the dialog's widgets and set the event handlers"""
80          self.projname = wxTextCtrl(self.panel_edit, ID_PROJ_PROJNAME, "")          self.topBox = top_box = wxBoxSizer(wxVERTICAL)
         self.label_3 = wxStaticText(self.panel_edit, -1, _("Projection:"))  
         self.projchoice = wxChoice(self.panel_edit, ID_PROJ_PROJCHOICE)  
81    
82          # Projection Specific actions (New/Save/Add)          main_box = wxBoxSizer(wxHORIZONTAL)
83          self.button_new = wxButton(self.panel_edit, ID_PROJ_NEW, _("New"))          top_box.Add(main_box, 1, wxALL|wxEXPAND)
         self.button_add = wxButton(self.panel_edit, ID_PROJ_ADDTOLIST,  
                                       _("Add to List"))  
         self.button_save = wxButton(self.panel_edit, ID_PROJ_SAVE,_("Update"))  
84    
85          # Main Action buttons (Try/Revert/OK/Close)          #
86          self.button_try = wxButton(self, wxID_APPLY, _("Try"))          #    The projection list and associated controls
87          self.button_revert = wxButton(self, ID_PROJ_REVERT,          #
88                                        _("Revert"))          vbox = wxBoxSizer(wxVERTICAL)
89          self.button_ok = wxButton(self, wxID_OK, _("OK"))          main_box.Add(vbox, 4, wxALL|wxEXPAND)
         self.button_ok.SetDefault()  
         self.button_close = wxButton(self, wxID_CANCEL,  
                                      _("Close"))  
90    
91          self.__set_properties()          #label = wxStaticText(self, -1, _("Available Projections:"))
92          self.__do_layout()          #vbox.Add(label, 0, wxLEFT|wxRIGHT|wxTOP, 4)
93    
94          # wxGlade          hbox = wxBoxSizer(wxHORIZONTAL)
95            vbox.Add(hbox, 1, wxALL|wxEXPAND)
96            self.projection_list = ProjectionList(self, self.load_system_proj(),
97                                                  self.load_user_proj(),
98                                                  self.receiver.GetProjection())
99            hbox.Add(self.projection_list, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)
100            self.projection_list.Subscribe(PROJ_SELECTION_CHANGED,
101                                           self.proj_selection_changed)
102    
103            # Projection List specific actions (Import/Export/Remove)
104            buttons = wxBoxSizer(wxVERTICAL)
105            hbox.Add(buttons, 0, wxALL)
106            self.button_import = wxButton(self, ID_PROJ_IMPORT, _("Import..."))
107            EVT_BUTTON(self, ID_PROJ_IMPORT, self._OnImport)
108            buttons.Add(self.button_import, 1, wxALL|wxEXPAND, 4)
109            self.button_export = wxButton(self, ID_PROJ_EXPORT, _("Export..."))
110            EVT_BUTTON(self, ID_PROJ_EXPORT, self._OnExport)
111            buttons.Add(self.button_export, 1, wxALL|wxEXPAND, 4)
112            buttons.Add(20, 20, 0, wxEXPAND, 0)
113            self.button_remove = wxButton(self, ID_PROJ_REMOVE, _("Remove"))
114            EVT_BUTTON(self, ID_PROJ_REMOVE, self._OnRemove)
115            buttons.Add(self.button_remove, 1, wxALL|wxEXPAND, 4)
116    
117            # The file path
118            self.projfilepath = wxStaticText(self, -1, "")
119            vbox.Add(self.projfilepath, 0, wxALL|wxEXPAND)
120    
121            #
122            #   The projection editor part
123            #
124            self.edit_box = wxStaticBox(self, -1, _("Edit"))
125            sizer_edit = wxStaticBoxSizer(self.edit_box, wxHORIZONTAL)
126            main_box.Add(sizer_edit, 5, wxALL|wxEXPAND)
127    
128            # Projection Specific Entries (Name/Projection)
129            self.sizer_projctrls = wxBoxSizer(wxVERTICAL)
130            sizer_edit.Add(self.sizer_projctrls, 1, wxALL|wxEXPAND)
131    
132            hbox = wxBoxSizer(wxHORIZONTAL)
133            self.sizer_projctrls.Add(hbox, 0, wxALL|wxEXPAND)
134            label = wxStaticText(self, -1, _("Name:"))
135            hbox.Add(label, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)
136            self.projname = wxTextCtrl(self, ID_PROJ_PROJNAME, "")
137            EVT_TEXT(self, ID_PROJ_PROJNAME, self._OnProjName)
138            hbox.Add(self.projname, 1, wxALL|wxEXPAND, 4)
139    
140            hbox = wxBoxSizer(wxHORIZONTAL)
141            self.sizer_projctrls.Add(hbox, 0, wxALL|wxEXPAND)
142            label = wxStaticText(self, -1, _("Projection:"))
143            hbox.Add(label, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)
144            self.projchoice = wxChoice(self, ID_PROJ_PROJCHOICE)
145            self.projchoice.SetSelection(0)
146            EVT_CHOICE(self, ID_PROJ_PROJCHOICE, self._OnProjChoice)
147            hbox.Add(self.projchoice, 1, wxALL|wxEXPAND, 4)
148          # Fill the projection choice list.          # Fill the projection choice list.
149          for proj, name, clazz in self.projPanels:          self.nbsizer = NotebookLikeSizer()
150              self.projchoice.Append(name, [clazz, None])          self.sizer_projctrls.Add(self.nbsizer, 1,
151                                     wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)
152            self.projection_panels = []
153            self.projchoice.Append(_("<Unknown>"), "")
154            for proj_type, name, cls in self.projection_panel_defs:
155                self.projchoice.Append(name, proj_type)
156                panel = cls(self, self.receiver)
157                panel.Hide()
158                panel.projection_index = len(self.projection_panels)
159                panel.projection_type = proj_type
160                self.projection_panels.append(panel)
161                self.nbsizer.Add(panel)
162            self.unknown_projection_panel = UnknownProjPanel(self, self.receiver)
163            self.unknown_projection_panel.Hide()
164            self.nbsizer.Add(self.unknown_projection_panel)
165    
166          self.originalProjection = self.receiver.GetProjection()          # Projection Specific actions (New/Save/Add)
167            buttons = wxBoxSizer(wxVERTICAL)
168            sizer_edit.Add(buttons, 0, wxALL)
169            self.button_new = wxButton(self, ID_PROJ_NEW, _("New"))
170            EVT_BUTTON(self, ID_PROJ_NEW, self._OnNew)
171            buttons.Add(self.button_new, 0, wxEXPAND|wxALL, 4)
172            self.button_add = wxButton(self, ID_PROJ_ADDTOLIST, _("Add to List"))
173            EVT_BUTTON(self, ID_PROJ_ADDTOLIST, self._OnAddToList)
174            buttons.Add(self.button_add, 0, wxEXPAND|wxALL, 4)
175            buttons.Add(20, 20, 0, wxEXPAND, 0)
176            self.button_save = wxButton(self, ID_PROJ_SAVE,_("Update"))
177            EVT_BUTTON(self, ID_PROJ_SAVE, self._OnSave)
178            buttons.Add(self.button_save, 0, wxEXPAND|wxALL|wxALIGN_BOTTOM, 4)
179    
180          self.__DoOnProjAvail()          #
181          self.button_ok.SetFocus()          # Main Action buttons (Try/Revert/OK/Close)
182          self.availprojs.SetFocus()          #
183                    buttons = wxBoxSizer(wxHORIZONTAL)
184            top_box.Add(buttons, 0, wxALL|wxALIGN_RIGHT, 10)
185            self.button_try = wxButton(self, wxID_APPLY, _("Try"))
186          EVT_BUTTON(self, wxID_APPLY, self.OnApply)          EVT_BUTTON(self, wxID_APPLY, self.OnApply)
187            buttons.Add(self.button_try, 0, wxRIGHT, 10)
188            self.button_revert = wxButton(self, ID_PROJ_REVERT, _("Revert"))
189          EVT_BUTTON(self, ID_PROJ_REVERT, self._OnRevert)          EVT_BUTTON(self, ID_PROJ_REVERT, self._OnRevert)
190            buttons.Add(self.button_revert, 0, wxRIGHT, 10)
191            self.button_ok = wxButton(self, wxID_OK, _("OK"))
192          EVT_BUTTON(self, wxID_OK, self.OnOK)          EVT_BUTTON(self, wxID_OK, self.OnOK)
193            self.button_ok.SetDefault()
194            buttons.Add(self.button_ok, 0, wxRIGHT, 10)
195            self.button_close = wxButton(self, wxID_CANCEL, _("Close"))
196          EVT_BUTTON(self, wxID_CANCEL, self.OnCancel)          EVT_BUTTON(self, wxID_CANCEL, self.OnCancel)
197          EVT_CHOICE(self, ID_PROJ_PROJCHOICE, self._OnProjChoice)          buttons.Add(self.button_close, 0, wxRIGHT, 10)
         EVT_LISTBOX(self, ID_PROJ_AVAIL, self._OnProjAvail)  
         EVT_BUTTON(self, ID_PROJ_IMPORT, self._OnImport)  
         EVT_BUTTON(self, ID_PROJ_EXPORT, self._OnExport)  
         EVT_BUTTON(self, ID_PROJ_REMOVE, self._OnRemove)  
   
         EVT_BUTTON(self, ID_PROJ_NEW, self._OnNew)  
         EVT_BUTTON(self, ID_PROJ_SAVE, self._OnSave)  
         EVT_BUTTON(self, ID_PROJ_ADDTOLIST, self._OnAddToList)  
198    
         EVT_TEXT(self, ID_PROJ_PROJNAME, self._OnProjName)  
199    
200            #
201            # Automatic Layout
202            #
203            self.SetAutoLayout(1)
204            self.SetSizer(top_box)
205            top_box.Fit(self)
206            top_box.SetSizeHints(self)
207    
208        def OnClose(self, event):
209            self.projection_list.Unsubscribe(PROJ_SELECTION_CHANGED,
210                                             self.proj_selection_changed)
211            # Destroy the projection list explicitly so that it properly
212            # unsubscribes everything. It would be cleaner if the projection
213            # could do this by itself but wx doesn't always send destroy
214            # events for non-top-level widgets
215            self.projection_list.Destroy()
216            NonModalNonParentDialog.OnClose(self, event)
217    
218      def OnApply(self, event):      def OnApply(self, event):
219          self.__SetProjection()          self.__SetProjection()
# Line 149  class ProjFrame(NonModalNonParentDialog) Line 234  class ProjFrame(NonModalNonParentDialog)
234              self.receiver.SetProjection(self.originalProjection)              self.receiver.SetProjection(self.originalProjection)
235              self.haveTried = False              self.haveTried = False
236    
   
237      def _OnNew(self, event):      def _OnNew(self, event):
238    
239          # clear all selections          self.projection_list.ClearSelection()
         sel = self.availprojs.GetSelections()  
         for index in sel:  
             self.availprojs.SetSelection(index, False)  
   
240          self.projname.Clear()          self.projname.Clear()
241    
242          # supply a projection panel if there wasn't one          # supply a projection panel if there wasn't one
# Line 164  class ProjFrame(NonModalNonParentDialog) Line 244  class ProjFrame(NonModalNonParentDialog)
244              self.projchoice.SetSelection(0)              self.projchoice.SetSelection(0)
245              self.__DoOnProjChoice()              self.__DoOnProjChoice()
246    
247          self.curProjPanel.Clear()          if self.curProjPanel is not None:
248                self.curProjPanel.Clear()
249    
250      def _OnSave(self, event):      def _OnSave(self, event):
251    
252          sel = self.availprojs.GetSelections()          sel = self.projection_list.selected_projections()
253          assert len(sel) == 1,  "button shouldn't be enabled"          assert len(sel) == 1,  "button shouldn't be enabled"
254    
255          proj, projfile = self.availprojs.GetClientData(sel[0])          proj, projfile = sel[0]
256    
257          assert proj is not None and projfile is not None          assert proj is not None and projfile is not None
258    
259          newproj = self.__GetProjection()          newproj = self.__GetProjection()
260    
261          if newproj is not None:          if newproj is not None:
262                # FIXME: we should only allow this for the user proj file.
263              projfile.Replace(proj, newproj)              projfile.Replace(proj, newproj)
264              try:              self.write_proj_file(projfile)
265                  WriteProjFile(projfile)              self.projection_list.SelectProjection(newproj)
             except IOError, (errno, errstr):  
                 self.__ShowError(projfile.GetFilename(), errstr)  
             self.availprojs.SetClientData(sel[0], [newproj, projfile])  
   
             self.__FillAvailList( selectProj = newproj.GetName())  
266    
267      def _OnAddToList(self, event):      def _OnAddToList(self, event):
268    
269          proj = self.__GetProjection()          proj = self.__GetProjection()
270          if proj is not None:          if proj is not None:
271              self.__usrProjFile.Add(proj)              self.__usrProjFile.Add(proj)
272              try:              self.write_proj_file(self.__usrProjFile)
273                  WriteProjFile(self.__usrProjFile)              self.projection_list.SelectProjection(proj)
             except IOError, (errno, errstr):  
                 self.__ShowError(self.__userProjFile.GetFilename(), errstr)  
274    
275              self.__FillAvailList( selectProj = proj.GetName())      def show_warnings(self, title, filename, warnings):
276            """Show the warnings (a list of strings) in a dialog
277    
278      def _OnProjAvail(self, event):          If the list is empty no dialog will be shown.
279          self.__DoOnProjAvail()          """
280            if warnings:
281                text = (_('Warnings when reading "%s":\n\n%s')
282                        % (filename, "\n\n".join(warnings)))
283                self.parent.RunMessageBox(title, text)
284    
285      def _OnImport(self, event):      def _OnImport(self, event):
286            """Handler for the 'Import' button
287    
288            Ask the user for a filename, read the projections from that file
289            add them to the user ProjFile object and write the user file
290            back to disk.
291            """
292          dlg = wxFileDialog(self, _("Import"), style = wxOPEN)          dlg = wxFileDialog(self, _("Import"), style = wxOPEN)
293    
294          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
295              path = dlg.GetPath()              path = dlg.GetPath()
296    
297                ThubanBeginBusyCursor()
298              try:              try:
299                  projFile = ReadProjFile(path)                  try:
300                  for proj in projFile.GetProjections():                      projFile, warnings = read_proj_file(path)
301                      self.__usrProjFile.Add(proj)                  except IOError, (errno, errstr):
302                  WriteProjFile(self.__usrProjFile)                      self.__ShowError(dlg.GetPath(), errstr)
303              except IOError, (errno, errstr):                  else:
304                  self.__ShowError(dlg.GetPath(), errstr)                      self.show_warnings(_("Warnings"), path, warnings)
305                        for proj in projFile.GetProjections():
306              self.__FillAvailList()                          self.__usrProjFile.Add(proj)
307                        self.write_proj_file(self.__usrProjFile)
308                finally:
309                    ThubanEndBusyCursor()
310          dlg.Destroy()          dlg.Destroy()
311    
312      def _OnExport(self, event):      def _OnExport(self, event):
313            """Handler for the 'Export' button.
314    
315          sel = self.availprojs.GetSelections()          Ask the user for a filename and write the selected projections
316            to that file.
317            """
318            sel = self.projection_list.selected_projections()
319          assert len(sel) != 0, "button should be disabled"          assert len(sel) != 0, "button should be disabled"
320    
321          dlg = wxFileDialog(self, _("Export"),          dlg = wxFileDialog(self, _("Export"), style=wxSAVE|wxOVERWRITE_PROMPT)
                         style = wxSAVE|wxOVERWRITE_PROMPT)  
322    
323          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
324              path = dlg.GetPath()              proj_file = ProjFile(dlg.GetPath())
325                for proj, pf in sel:
             projFile = ProjFile(path)  
   
             for i in sel:  
                 proj = self.availprojs.GetClientData(i)[CLIENT_PROJ]  
326                  if proj is not None:                  if proj is not None:
327                      projFile.Add(proj)                      proj_file.Add(proj)
328                self.write_proj_file(proj_file)
             try:  
                 WriteProjFile(projFile)  
             except IOError, (errno, errstr):  
                 self.__ShowError(dlg.GetPath(), errstr)  
329    
330          dlg.Destroy()          dlg.Destroy()
331    
332      def _OnRemove(self, event):      def _OnRemove(self, event):
333            """Handler for the 'Remove' button
334    
335          sel = self.availprojs.GetSelections()          Remove any selected projection that came from the user's
336            ProjFile. If the user ProjFile was modified write it back to
337            disk.
338            """
339            sel = self.projection_list.selected_projections()
340          assert len(sel) != 0, "button should be disabled!"          assert len(sel) != 0, "button should be disabled!"
341    
342          #          modified = False
343          # remove the items backwards so the indices don't change          for proj, pf in sel:
344          #              if proj is not None and pf is self.__usrProjFile:
345          sel = list(sel)                  pf.Remove(proj)
346          sel.sort()                  modified = True
         sel.reverse()  
   
         newselection = -1  
         if len(sel) == 1:  
             newselection = sel[0] - 1  
             if newselection < 0:  
                 newselection = 0  
   
         for i in sel:  
             proj, projfile = self.availprojs.GetClientData(i)  
   
             #  
             # this could be the case if they selected <None> or  
             # the currently used projection  
             #  
             if proj is not None and projfile is not None:  
                 projfile.Remove(proj)  
   
         try:  
             WriteProjFile(projfile)  
         except IOError, (errno, errstr):  
             self.__ShowError(projfile.GetFilename(), errstr)  
   
         self.__FillAvailList()  
   
         #  
         # this *could* produce incorrect results if the .proj files  
         # change between the last list update and this selection  
         # because the list has been repopulated.  
         #  
         if newselection != -1 and self.availprojs.GetCount() > 0:  
             self.availprojs.SetSelection(newselection)  
347    
348          self.__VerifyButtons()          if modified:
349                self.write_proj_file(self.__usrProjFile)
350    
351      def _OnProjName(self, event):      def _OnProjName(self, event):
352          self.__VerifyButtons()          self.__VerifyButtons()
353    
354      def __ShowError(self, filename, errstr):      def __ShowError(self, filename, errstr):
355          wxMessageDialog(self,          wxMessageDialog(self,
356              _("The following error occured:\n") +              _("The following error occured:\n") +
357              filename + "\n" + errstr,              filename + "\n" + errstr,
358              _("Error"), wxOK | wxICON_ERROR).ShowModal()              _("Error"), wxOK | wxICON_ERROR).ShowModal()
359    
360      def __VerifyButtons(self):      def __VerifyButtons(self):
361          """Enable or disable the appropriate buttons based on the          """Update button sensitivity"""
         current state of the dialog.  
         """  
362    
363          sel = self.availprojs.GetSelections()          num_sel = self.projection_list.GetSelectedItemCount()
364    
365          self.button_import.Enable(True)          self.button_import.Enable(True)
366          self.button_export.Enable(True)          self.button_export.Enable(True)
367          self.button_save.Enable(True)          self.button_save.Enable(True)
368          self.button_remove.Enable(True)          self.button_remove.Enable(True)
369    
370          self.panel_edit.Enable(True)          self.edit_box.Enable(True)
371    
372          for ctrl in [self.button_import,          for ctrl in [self.button_import,
373                       self.button_export,                       self.button_export,
# Line 321  class ProjFrame(NonModalNonParentDialog) Line 376  class ProjFrame(NonModalNonParentDialog)
376                       self.button_add,                       self.button_add,
377                       self.projchoice,                       self.projchoice,
378                       self.projname,                       self.projname,
379                       self.panel_edit]:                       self.edit_box]:
380              ctrl.Enable(True)              ctrl.Enable(True)
381    
382          if self.curProjPanel is not None:          if self.curProjPanel is not None:
383              self.curProjPanel.Enable(True)              self.curProjPanel.Enable(True)
384    
385          if len(sel) == 0:          if num_sel == 0:
386              self.button_import.Enable(True)              self.button_import.Enable(True)
387              self.button_export.Enable(False)              self.button_export.Enable(False)
388              self.button_remove.Enable(False)              self.button_remove.Enable(False)
389              self.button_save.Enable(False)              self.button_save.Enable(False)
390    
391          elif len(sel) == 1:          elif num_sel == 1:
392    
393              proj, projFile = self.availprojs.GetClientData(sel[0])              selection = self.projection_list.selected_projections()
394                proj, projFile = selection[0]
395    
396              self.button_save.Enable(len(self.projname.GetValue()) > 0)              self.button_save.Enable(len(self.projname.GetValue()) > 0)
397              self.button_add.Enable(len(self.projname.GetValue()) > 0)              self.button_add.Enable(len(self.projname.GetValue()) > 0)
# Line 360  class ProjFrame(NonModalNonParentDialog) Line 416  class ProjFrame(NonModalNonParentDialog)
416                  self.button_save.Enable(False)                  self.button_save.Enable(False)
417    
418          else:          else:
419              self.panel_edit.Enable(False)              self.edit_box.Enable(False)
   
     def __DoOnProjAvail(self):  
420    
421          sel = self.availprojs.GetSelections()      def proj_selection_changed(self, projs):
422          if len(sel) == 1:          """Subscribed to the projection_list's PROJ_SELECTION_CHANGED message
   
             proj = self.availprojs.GetClientData(sel[0])[CLIENT_PROJ]  
             projfile = self.availprojs.GetClientData(sel[0])[CLIENT_PROJFILE]  
423    
424            Update the dialog to reflect the new selection.
425            """
426            if len(projs) == 0:
427                self.projfilepath.SetLabel(_("No Projections selected"))
428            elif len(projs) == 1:
429                proj, projfile = projs[0]
430              if proj is None:              if proj is None:
431                  # user selected <None>                  # user selected <None>
432                  self.projname.Clear()                  self.projname.Clear()
433                                    self.projfilepath.SetLabel("")
434              else:              else:
               
435                  if projfile is not None:                  if projfile is not None:
436                      self.projfilepath.SetLabel(projfile.GetFilename())                      filename = os.path.basename(projfile.GetFilename())
437                        self.projfilepath.SetLabel(_("Source of Projection: %s")
438                                                   % filename)
439                  else:                  else:
440                      # only None if the currently used projection is selected                      # only None if the currently used projection is selected
441                      self.projfilepath.SetLabel("")                      self.projfilepath.SetLabel("")
442    
443                  self.projname.SetValue(proj.GetName())                  self.projname.SetValue(proj.Label())
444    
445                  myProjType = proj.GetParameter("proj")                  myProjType = proj.GetParameter("proj")
446                  i = 0                  i = 0
447                  for projType, name, clazz in self.projPanels:                  for projType, name, cls in self.projection_panel_defs:
448                      if myProjType == projType:                      if myProjType == projType:
449                          self.projchoice.SetSelection(i)                          self.projchoice.Enable(True)
450                            self.projchoice.SetSelection(i + 1)
451                          self.__DoOnProjChoice()                          self.__DoOnProjChoice()
452    
453                          #                          #
# Line 398  class ProjFrame(NonModalNonParentDialog) Line 457  class ProjFrame(NonModalNonParentDialog)
457                          assert self.curProjPanel is not None                          assert self.curProjPanel is not None
458    
459                          self.curProjPanel.SetProjection(proj)                          self.curProjPanel.SetProjection(proj)
460                            break
461                      i += 1                      i += 1
462                    else:
463                        self.projchoice.Select(0)
464                        self.projchoice.Disable()
465                        self._show_proj_panel(UnknownProjPanel)
466                        assert self.curProjPanel is not None
467                        self.curProjPanel.SetProjection(proj)
468            else:
469                self.projfilepath.SetLabel(_("Multiple Projections selected"))
470    
471          self.__VerifyButtons()          self.__VerifyButtons()
472    
# Line 415  class ProjFrame(NonModalNonParentDialog) Line 483  class ProjFrame(NonModalNonParentDialog)
483          At the end of this method self.curProjPanel will not be None          At the end of this method self.curProjPanel will not be None
484          if there was a item selected.          if there was a item selected.
485          """          """
   
486          choice = self.projchoice          choice = self.projchoice
487    
488          sel = choice.GetSelection()          sel = choice.GetSelection()
489          if sel != -1:          if sel != -1:
490                proj_type = choice.GetClientData(sel)
491              clazz, obj = choice.GetClientData(sel)              for t, name, cls in self.projection_panel_defs:
492                    if t == proj_type:
493              if obj is None:                      self._show_proj_panel(cls)
494                  obj = clazz(self.panel_edit, self.receiver)                      break
495                  choice.SetClientData(sel, [clazz, obj])          # FIXME: what to do if sel == -1?
496    
497              if self.curProjPanel is not None:      def _show_proj_panel(self, panel_class):
498                  self.curProjPanel.Hide()          """Show the panel as the projection panel"""
499                  self.sizer_projctrls.Remove(self.curProjPanel)          if panel_class is UnknownProjPanel:
500                self.edit_box.Disable()
501              self.curProjPanel = obj              self.nbsizer.Activate(self.unknown_projection_panel)
502              self.curProjPanel.Show()              self.curProjPanel = self.unknown_projection_panel
503            else:
504              self.sizer_projctrls.Add(self.curProjPanel, 1,              self.edit_box.Enable(True)
505                  wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)              self.unknown_projection_panel.Hide()
506              self.sizer_projctrls.Layout()              for panel in self.projection_panels:
507              self.Layout()                  if panel.__class__ is panel_class:
508              self.topBox.SetSizeHints(self)                      self.nbsizer.Activate(panel)
509                        self.curProjPanel = panel
510    
511      def __SetProjection(self):      def __SetProjection(self):
512          """Set the receiver's projection."""          """Set the receiver's projection."""
# Line 456  class ProjFrame(NonModalNonParentDialog) Line 524  class ProjFrame(NonModalNonParentDialog)
524          Could be None.          Could be None.
525          """          """
526    
527          sel = self.availprojs.GetSelections()          assert self.projection_list.GetSelectedItemCount() < 2, \
528          assert len(sel) < 2, "button should be disabled"                 "button should be disabled"
   
529    
530            sel = self.projection_list.selected_projections()
531          if len(sel) == 1:          if len(sel) == 1:
532              proj = self.availprojs.GetClientData(sel[0])[CLIENT_PROJ]              if sel[0][0] is None:
             if proj is None:  
533                  # <None> is selected                  # <None> is selected
534                  return None                  return None
535    
536          #          # self.curProjPanel should always contain the most relevant data
537          # self.curProjPanel should always contain the most          # for a projection
         # relevant data for a projection  
         #  
538          if self.curProjPanel is not None:          if self.curProjPanel is not None:
539              return Projection(self.curProjPanel.GetParameters(),              return Projection(self.curProjPanel.GetParameters(),
540                                self.projname.GetValue())                                self.projname.GetValue())
541    
542          return None          return None
543    
544      def __FillAvailList(self, selectCurrent = False, selectProj = None):      def load_user_proj(self):
545          """Populate the list of available projections.          ThubanBeginBusyCursor()
546                    try:
547          selectCurrent -- if True, select the projection used by              if self.__usrProjFile is None:
548                           the receiver, otherwise select nothing.                  projfile, warnings = get_user_proj_file()
549          selectProj    -- if set, select the projection found under the                  self.show_warnings(_("Warnings"), projfile.GetFilename(),
550                           specified name. This overwrites any other                                     warnings)
551                           selection estimate.                  self.__usrProjFile = projfile
552          """              return self.__usrProjFile
553            finally:
554          self.availprojs.Clear()              ThubanEndBusyCursor()
   
         #  
         # the list can never be empty. there will always be  
         # at least this one item  
         #  
         self.availprojs.Append("<None>", (None, None))  
   
         projfile = GetSystemProjFiles()  
         projfile = projfile[0]  
         for proj in projfile.GetProjections():  
             self.availprojs.Append(proj.GetName(), [proj, projfile])  
         self.__sysProjFile = projfile  
   
         projfile = GetUserProjFiles()  
         projfile = projfile[0]  
         for proj in projfile.GetProjections():  
             self.availprojs.Append(proj.GetName(), [proj, projfile])  
         self.__usrProjFile = projfile  
   
         #  
         # We add the current projection to the list at last.  
         # Since the list is resorted immediately a following FindString()  
         # determines the index correctly.  
         #  
         proj = self.receiver.GetProjection()  
         if proj is not None:  
             proj_item = _("%s (current)") % proj.GetName()  
             self.availprojs.Append(proj_item, [proj, None])  
             if selectCurrent:  
                 self.availprojs.SetSelection(  
                         self.availprojs.FindString(proj_item)  
                     )  
         else:  
             if selectCurrent:  
                 self.availprojs.SetSelection(  
                         self.availprojs.FindString("<None>")  
                     )  
         if selectProj:  
             self.availprojs.SetSelection(  
                         self.availprojs.FindString(selectProj)  
                     )  
   
                   
   
     def __set_properties(self):  
   
         #self.availprojs.SetSelection(0)  
         self.projchoice.SetSelection(0)  
   
         self.__FillAvailList(selectCurrent = True)  
   
         self.projname.SetMaxLength(32)  
   
     def __do_layout(self):  
         # originally generated by wxGlade  
   
         self.topBox = wxBoxSizer(wxVERTICAL)  
         self.sizer_panel = wxBoxSizer(wxVERTICAL)  
         sizer_6 = wxBoxSizer(wxHORIZONTAL)  
         self.sizer_mainbttns = wxBoxSizer(wxHORIZONTAL)  
         self.sizer_mainctrls = wxBoxSizer(wxHORIZONTAL)  
         self.sizer_edit = wxStaticBoxSizer(wxStaticBox(self.panel_edit, -1, _("Edit")), wxHORIZONTAL)  
         sizer_11 = wxBoxSizer(wxVERTICAL)  
         self.sizer_projctrls = wxBoxSizer(wxVERTICAL)  
         sizer_14 = wxBoxSizer(wxHORIZONTAL)  
         sizer_13 = wxBoxSizer(wxHORIZONTAL)  
         sizer_15 = wxBoxSizer(wxVERTICAL)  
         sizer_15.Add(self.button_import, 0, wxALL, 4)  
         sizer_15.Add(self.button_export, 0, wxALL, 4)  
         sizer_15.Add(20, 20, 0, wxEXPAND, 0)  
         sizer_15.Add(self.button_remove, 0, wxALL|wxALIGN_BOTTOM, 4)  
   
         # list controls  
         grid_sizer_1 = wxFlexGridSizer(3, 2, 0, 0)  
         grid_sizer_1.Add(self.label_5, 0, wxLEFT|wxRIGHT|wxTOP, 4)  
         grid_sizer_1.Add(20, 20, 0, wxEXPAND, 0)  
         grid_sizer_1.Add(self.availprojs, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)  
         grid_sizer_1.Add(sizer_15, 0, wxALL|wxEXPAND, 4)  
         grid_sizer_1.Add(self.projfilepath, 0, wxALL|wxADJUST_MINSIZE, 4)  
         grid_sizer_1.AddGrowableRow(1)  
         grid_sizer_1.AddGrowableCol(0)  
   
         # edit controls  
         sizer_13.Add(self.label_2, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)  
         sizer_13.Add(self.projname, 1, wxALL, 4)  
         self.sizer_projctrls.Add(sizer_13, 0, wxEXPAND, 0)  
         sizer_14.Add(self.label_3, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)  
         sizer_14.Add(self.projchoice, 1, wxALL|wxALIGN_CENTER_VERTICAL, 4)  
         self.sizer_projctrls.Add(sizer_14, 0, wxEXPAND, 0)  
         self.sizer_edit.Add(self.sizer_projctrls, 1, wxEXPAND, 0)  
         sizer_11.Add(self.button_new, 0, wxALL, 4)  
         sizer_11.Add(self.button_add, 0, wxALL, 4)  
         sizer_11.Add(20, 20, 0, wxEXPAND, 0)  
         sizer_11.Add(self.button_save, 0, wxALL|wxALIGN_BOTTOM, 4)  
         self.sizer_edit.Add(sizer_11, 0, wxALL|wxEXPAND, 4)  
   
         sizer_6.Add(self.button_try, 0, wxRIGHT| wxEXPAND, 10)  
         sizer_6.Add(self.button_revert, 0, wxRIGHT| wxEXPAND, 10)  
         sizer_6.Add(self.button_ok, 0, wxRIGHT| wxEXPAND, 10)  
         sizer_6.Add(self.button_close, 0, wxRIGHT| wxEXPAND, 10)  
   
         self.panel_1.SetAutoLayout(1)  
         self.panel_1.SetSizer(grid_sizer_1)  
         grid_sizer_1.Fit(self.panel_1)  
         grid_sizer_1.SetSizeHints(self.panel_1)  
   
         self.panel_edit.SetAutoLayout(1)  
         self.panel_edit.SetSizer(self.sizer_edit)  
         self.sizer_edit.Fit(self.panel_edit)  
         self.sizer_edit.SetSizeHints(self.panel_edit)  
   
         self.sizer_mainctrls.Add(self.panel_1, 0,  
             wxALL|wxEXPAND|wxADJUST_MINSIZE, 0)  
         self.sizer_mainctrls.Add(self.panel_edit, 1,  
             wxALL|wxEXPAND|wxADJUST_MINSIZE, 0)  
555    
556          self.sizer_mainbttns.Add(sizer_6, 0,      def load_system_proj(self):
557              wxALL|wxEXPAND|wxADJUST_MINSIZE, 10)          ThubanBeginBusyCursor()
558            try:
559                if self.__sysProjFile is None:
560                    projfile, warnings = get_system_proj_file()
561                    self.show_warnings(_("Warnings"), projfile.GetFilename(),
562                                       warnings)
563                    self.__sysProjFile = projfile
564                return self.__sysProjFile
565            finally:
566                ThubanEndBusyCursor()
567    
568          self.topBox.Add(self.sizer_mainctrls, 1, wxALL|wxEXPAND, 4)      def write_proj_file(self, proj_file):
569          self.topBox.Add(self.sizer_mainbttns, 0, wxALIGN_RIGHT|wxBOTTOM, 0)          """Write the ProjFile object proj_file back to its file
570    
571          self.SetAutoLayout(1)          Show a busy cursor while writing and if an error occurs show a
572          self.SetSizer(self.topBox)          dialog with the error message.
573          self.topBox.Fit(self)          """
574          self.topBox.SetSizeHints(self)          try:
575          self.Layout()              ThubanBeginBusyCursor()
576                try:
577                    write_proj_file(proj_file)
578                finally:
579                    ThubanEndBusyCursor()
580            except IOError, (errno, errstr):
581                self.__ShowError(proj_file.GetFilename(), errstr)
582    
 # end of class ProjFrame  
583    
584    
585  class ProjPanel(wxPanel):  class ProjPanel(wxPanel):
# Line 625  class ProjPanel(wxPanel): Line 589  class ProjPanel(wxPanel):
589          wxPanel.__init__(self, parent, -1)          wxPanel.__init__(self, parent, -1)
590    
591          self.__ellps = wxChoice(self, -1)          self.__ellps = wxChoice(self, -1)
592          self.ellpsData = [("airy"  , _("Airy")),          self.ellpsData = [("", _("<Unknown>")),
593                              ("airy"  , _("Airy")),
594                            ("bessel", _("Bessel 1841")),                            ("bessel", _("Bessel 1841")),
595                            ("clrk66", _("Clarke 1866")),                            ("clrk66", _("Clarke 1866")),
596                            ("clrk80", _("Clarke 1880")),                            ("clrk80", _("Clarke 1880")),
597                            ("GRS80" , _("GRS 1980 (IUGG, 1980)")),                            ("GRS80" , _("GRS 1980 (IUGG, 1980)")),
598                            ("intl"  , _("International 1909 (Hayford)")),                            ("intl"  , _("International 1909 (Hayford)")),
# Line 673  class ProjPanel(wxPanel): Line 638  class ProjPanel(wxPanel):
638          self.__ellps.SetSelection(0)          self.__ellps.SetSelection(0)
639    
640      def GetParameters(self):      def GetParameters(self):
641          return ["ellps=" + self.__ellps.GetClientData(          ellps = self.__ellps.GetSelection()
642                                          self.__ellps.GetSelection())]          if ellps > 0:
643                return ["ellps=" + self.__ellps.GetClientData(ellps)]
644            return []
645    
646    
647  ID_TMPANEL_LAT = 4001  ID_TMPANEL_LAT = 4001
# Line 684  ID_TMPANEL_FALSE_NORTH = 4004 Line 651  ID_TMPANEL_FALSE_NORTH = 4004
651  ID_TMPANEL_SCALE = 4005  ID_TMPANEL_SCALE = 4005
652    
653  class UnknownProjPanel(ProjPanel):  class UnknownProjPanel(ProjPanel):
654    
655        """Panel for unknown projection types"""
656    
657      def __init__(self, parent, receiver):      def __init__(self, parent, receiver):
658          ProjPanel.__init__(self, parent)          ProjPanel.__init__(self, parent)
659    
660            self.__text = _("Thuban does not know the parameters\n"
661                            "for the current projection and cannot\n"
662                            "display a configuration panel.\n\n"
663                            "The unidentified set of parameters is:\n\n")
664    
665            self.__textbox = wxTextCtrl(self, -1, self.__text, size=(100,200),
666                                style=wxTE_READONLY|wxTE_MULTILINE|wxTE_LINEWRAP)
667          self._DoLayout()          self._DoLayout()
668    
669      def _DoLayout(self):      def _DoLayout(self):
670          sizer = wxBoxSizer(wxVERTICAL)          sizer = wxBoxSizer(wxVERTICAL)
671    
672          sizer.Add(wxStaticText(self, -1,          sizer.Add(self.__textbox, 0, wxALL|wxEXPAND, 4)
             _("Thuban does not know the parameters for the " +  
               "current projection and cannot display a " +  
               "configuration panel.")))  
673    
674          ProjPanel._DoLayout(self, sizer)          ProjPanel._DoLayout(self, sizer)
675    
# Line 703  class UnknownProjPanel(ProjPanel): Line 677  class UnknownProjPanel(ProjPanel):
677          return "Unknown"          return "Unknown"
678    
679      def SetProjection(self, proj):      def SetProjection(self, proj):
680          pass          """Append the available parameters to the info text."""
681            text = self.__text
682            for param in proj.GetAllParameters():
683                text = text + '%s\n' % param
684            self.__textbox.SetValue(text)
685    
686      def GetParameters(self):      def GetParameters(self):
687          return None          return None
# Line 716  class TMPanel(ProjPanel): Line 694  class TMPanel(ProjPanel):
694    
695          self.__latitude = wxTextCtrl(self, ID_TMPANEL_LAT)          self.__latitude = wxTextCtrl(self, ID_TMPANEL_LAT)
696          self.__longitude = wxTextCtrl(self, ID_TMPANEL_LONG)          self.__longitude = wxTextCtrl(self, ID_TMPANEL_LONG)
         self.__scale = wxTextCtrl(self, ID_TMPANEL_SCALE)  
697          self.__falseEast = wxTextCtrl(self, ID_TMPANEL_FASLE_EAST)          self.__falseEast = wxTextCtrl(self, ID_TMPANEL_FASLE_EAST)
698          self.__falseNorth = wxTextCtrl(self, ID_TMPANEL_FALSE_NORTH)          self.__falseNorth = wxTextCtrl(self, ID_TMPANEL_FALSE_NORTH)
699            self.__scale = wxTextCtrl(self, ID_TMPANEL_SCALE)
700    
701          self._DoLayout()          self._DoLayout()
702    
703      def _DoLayout(self):      def _DoLayout(self):
704    
705          sizer = wxFlexGridSizer(4, 4, 0, 0)          sizer = wxFlexGridSizer(4, 2, 0, 0)
706          sizer.Add(wxStaticText(self, -1, _("Latitude:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("Latitude:")), 0, wxALL, 4)
707          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)  
708          sizer.Add(wxStaticText(self, -1, _("Longitude:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("Longitude:")), 0, wxALL, 4)
709          sizer.Add(self.__longitude, 0, wxALL, 4)          sizer.Add(self.__longitude, 0, wxALL, 4)
710            sizer.Add(wxStaticText(self, -1, _("False Easting:")), 0, wxALL, 4)
711            sizer.Add(self.__falseEast, 0, wxALL, 4)
712          sizer.Add(wxStaticText(self, -1, _("False Northing:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("False Northing:")), 0, wxALL, 4)
713          sizer.Add(self.__falseNorth, 0, wxALL, 4)          sizer.Add(self.__falseNorth, 0, wxALL, 4)
714          sizer.Add(wxStaticText(self, -1, _("Scale Factor:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("Scale Factor:")), 0, wxALL, 4)
# Line 826  class UTMPanel(ProjPanel): Line 804  class UTMPanel(ProjPanel):
804          ProjPanel.Clear(self)          ProjPanel.Clear(self)
805    
806      def _OnPropose(self, event):      def _OnPropose(self, event):
807          UTMProposeZoneDialog          """Call the propose dialog.
808            If the receiver (e.g. the current map) has no bounding box,
809            inform the user accordingly.
810            """
811            bb = self.receiver.BoundingBox()
812            if bb is None:
813                dlg = wxMessageDialog(self,
814                        _("Can not propose: No bounding box found."),
815                        _("Projection: Propose UTM Zone"),
816                        wxOK | wxICON_INFORMATION)
817                dlg.CenterOnParent()
818                result = dlg.ShowModal()
819                dlg.Destroy()
820                return
821    
822          dlg = UTMProposeZoneDialog(self, self.receiver.BoundingBox())          dlg = UTMProposeZoneDialog(self, self.receiver.BoundingBox())
823          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
824              self.__zone.SetValue(dlg.GetProposedZone())              self.__zone.SetValue(dlg.GetProposedZone())
# Line 839  class LCCPanel(ProjPanel): Line 831  class LCCPanel(ProjPanel):
831                    
832          self.__fspLatitude = wxTextCtrl(self, -1)          self.__fspLatitude = wxTextCtrl(self, -1)
833          self.__sspLatitude = wxTextCtrl(self, -1)          self.__sspLatitude = wxTextCtrl(self, -1)
         self.__originLat   = wxTextCtrl(self, -1)  
834          self.__meridian    = wxTextCtrl(self, -1)          self.__meridian    = wxTextCtrl(self, -1)
835            self.__originLat   = wxTextCtrl(self, -1)
836          self.__falseEast   = wxTextCtrl(self, -1)          self.__falseEast   = wxTextCtrl(self, -1)
837          self.__falseNorth  = wxTextCtrl(self, -1)          self.__falseNorth  = wxTextCtrl(self, -1)
838    
# Line 953  class GeoPanel(ProjPanel): Line 945  class GeoPanel(ProjPanel):
945  ID_UTM_PROPOSE_ZONE_DIALOG_TAKE   = 4001  ID_UTM_PROPOSE_ZONE_DIALOG_TAKE   = 4001
946  ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL = 4002  ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL = 4002
947  class UTMProposeZoneDialog(wxDialog):  class UTMProposeZoneDialog(wxDialog):
948                                                                                    
949      """Propose a sensible Zone considering the current map extent."""      """Propose a sensible Zone considering the current map extent."""
950                                                                                    
951      def __init__(self, parent, (x, y, x2, y2)):      def __init__(self, parent, (x, y, x2, y2)):
952          wxDialog.__init__(self, parent, -1, _("Projection: Propose UTM Zone"),          wxDialog.__init__(self, parent, -1, _("Projection: Propose UTM Zone"),
953                            wxDefaultPosition, wxSize(200, 100))                            wxDefaultPosition, wxSize(200, 100))
954          self.parent = parent          self.parent = parent
         #x, y, x2, y2 = elf.parent.parent.map_bounding_box  
955          x = x + 180          x = x + 180
956          x2 = x2 + 180          x2 = x2 + 180
957          center = (x2 - x) / 2 + x          center = (x2 - x) / 2 + x
958          self.proposedZone = int(center / 6 + 1)          self.proposedZone = int(center / 6 + 1)
959          self.dialogLayout()          self.dialogLayout()
960                                                                                    
961      def dialogLayout(self):      def dialogLayout(self):
962          topBox = wxBoxSizer(wxVERTICAL)          topBox = wxBoxSizer(wxVERTICAL)
963                                                                                    
964          textBox = wxBoxSizer(wxVERTICAL)          textBox = wxBoxSizer(wxVERTICAL)
965          textBox.Add(wxStaticText(self, -1, _("The current map extent center " +          textBox.Add(wxStaticText(self, -1, _("The current map extent center "
966                                             "lies in UTM Zone")),                                               "lies in UTM Zone")),
967                      0, wxALIGN_CENTER|wxALL, 4)                      0, wxALIGN_CENTER|wxALL, 4)
968          textBox.Add(wxStaticText(self, -1, str(self.proposedZone)),          textBox.Add(wxStaticText(self, -1, str(self.proposedZone)),
969                      0, wxALIGN_CENTER|wxALL, 4)                      0, wxALIGN_CENTER|wxALL, 4)
970                                                                                    
971          topBox.Add(textBox, 1, wxEXPAND|wxALL, 4)          topBox.Add(textBox, 1, wxEXPAND|wxALL, 4)
972                                                                                    
973          buttonBox = wxBoxSizer(wxHORIZONTAL)          buttonBox = wxBoxSizer(wxHORIZONTAL)
974          buttonBox.Add(wxButton(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE,          buttonBox.Add(wxButton(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE,
975                        _("Take")), 0, wxALL, 4)                        _("Take")), 0, wxALL, 4)
# Line 987  class UTMProposeZoneDialog(wxDialog): Line 978  class UTMProposeZoneDialog(wxDialog):
978          topBox.Add(buttonBox, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10)          topBox.Add(buttonBox, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10)
979          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE, self.OnTake)          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_TAKE, self.OnTake)
980          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL, self.OnCancel)          EVT_BUTTON(self, ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL, self.OnCancel)
981                                                                                    
982          self.SetAutoLayout(True)          self.SetAutoLayout(True)
983          self.SetSizer(topBox)          self.SetSizer(topBox)
984          topBox.Fit(self)          topBox.Fit(self)
985          topBox.SetSizeHints(self)          topBox.SetSizeHints(self)
986                                                                                    
987      def OnTake(self, event):      def OnTake(self, event):
988          self.EndModal(wxID_OK)          self.EndModal(wxID_OK)
989                                                                                    
990      def OnCancel(self, event):      def OnCancel(self, event):
991          self.EndModal(wxID_CANCEL)          self.EndModal(wxID_CANCEL)
992    

Legend:
Removed from v.1135  
changed lines
  Added in v.1858

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26