/[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 717 by jonathan, Wed Apr 23 08:59:57 2003 UTC revision 1858 by jan, Fri Oct 24 15:12:58 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
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  from Thuban.Model.proj import Projection, ProjFile
22    
23    from Thuban.Model.resource import get_user_proj_file, get_system_proj_file, \
24                                      read_proj_file, write_proj_file
25    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    
 from Thuban.Model.resource import GetUserProjFiles, GetSystemProjFiles  
 from Thuban.UI.dialogs import NonModalDialog  
33    
 ID_PROJ_ADVANCED  = 4001  
34  ID_PROJ_PROJCHOICE = 4002  ID_PROJ_PROJCHOICE = 4002
35  ID_PROJ_SAVEAS    = 4003  ID_PROJ_ADDTOLIST    = 4003
36  ID_PROJ_NEW       = 4004  ID_PROJ_NEW       = 4004
 ID_PROJ_TRY       = 4005  
37  ID_PROJ_REVERT    = 4006  ID_PROJ_REVERT    = 4006
 ID_PROJ_OK        = 4007  
 ID_PROJ_CLOSE     = 4008  
38  ID_PROJ_AVAIL     = 4009  ID_PROJ_AVAIL     = 4009
39    ID_PROJ_SAVE      = 4010
40    ID_PROJ_IMPORT    = 4011
41    ID_PROJ_EXPORT    = 4012
42    ID_PROJ_REMOVE    = 4013
43    ID_PROJ_PROJNAME  = 4014
44    
45    CLIENT_PROJ = 0
46    CLIENT_PROJFILE = 1
47    
48    class ProjFrame(NonModalNonParentDialog):
49    
50        def __init__(self, parent, name, title, receiver):
51            """Initialize the projection dialog.
52    
53            receiver -- An object that implements the following methods:
54                            SetProjection(projection)
55                            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
65            self.haveTried = False
66            self.curProjPanel = None
67            self.__usrProjFile = None
68            self.__sysProjFile = None
69    
70            self.build_dialog()
71            self.Layout()
72    
73            self.originalProjection = self.receiver.GetProjection()
74    
75            self.projection_list.SelectProjection(self.originalProjection)
76            self.projection_list.SetFocus()
77    
78  class ProjFrame(NonModalDialog):      def build_dialog(self):
79            """Build the dialog's widgets and set the event handlers"""
80            self.topBox = top_box = wxBoxSizer(wxVERTICAL)
81    
82            main_box = wxBoxSizer(wxHORIZONTAL)
83            top_box.Add(main_box, 1, wxALL|wxEXPAND)
84    
     def __init__(self, parent, name, receiver, *args, **kwds):  
85          #          #
86          # Changes to the wxGlade generated code:          #    The projection list and associated controls
         #   o   call NonModalDialog.__init__(self, parent, name, "")  
         #   o   remove default choices in combo box  
87          #          #
88            vbox = wxBoxSizer(wxVERTICAL)
89            main_box.Add(vbox, 4, wxALL|wxEXPAND)
90    
91          self.editing = False          #label = wxStaticText(self, -1, _("Available Projections:"))
92          self.receiver = receiver          #vbox.Add(label, 0, wxLEFT|wxRIGHT|wxTOP, 4)
         self.originalProjection = -1  
         self.curProjPanel = None  
93    
94          self.projPanels = []          hbox = wxBoxSizer(wxHORIZONTAL)
95          self.projPanels.append(          vbox.Add(hbox, 1, wxALL|wxEXPAND)
96              ("tmerc", _("Transverse Mercartor"), TMPanel))          self.projection_list = ProjectionList(self, self.load_system_proj(),
97          self.projPanels.append(                                                self.load_user_proj(),
98              ("utm", _("Universal Transverse Mercartor"), UTMPanel))                                                self.receiver.GetProjection())
99          self.projPanels.append(          hbox.Add(self.projection_list, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)
100              ("lcc", _("Lambert Conic Conformal"), LCCPanel))          self.projection_list.Subscribe(PROJ_SELECTION_CHANGED,
101          self.projPanels.append(                                         self.proj_selection_changed)
102              ("latlong", _("Geographic"), GeoPanel))  
103            # Projection List specific actions (Import/Export/Remove)
104          # begin wxGlade: ProjFrame.__init__          buttons = wxBoxSizer(wxVERTICAL)
105          #kwds["style"] = wxDEFAULT_FRAME_STYLE          hbox.Add(buttons, 0, wxALL)
106          NonModalDialog.__init__(self, parent, name, "")          self.button_import = wxButton(self, ID_PROJ_IMPORT, _("Import..."))
107          self.panel_1 = wxPanel(self, -1)          EVT_BUTTON(self, ID_PROJ_IMPORT, self._OnImport)
108          self.label_5 = wxStaticText(self.panel_1, -1, _("Available Projections:"))          buttons.Add(self.button_import, 1, wxALL|wxEXPAND, 4)
109          self.availprojs = wxListBox(self.panel_1, ID_PROJ_AVAIL, style=wxLB_SINGLE|wxLB_SORT)          self.button_export = wxButton(self, ID_PROJ_EXPORT, _("Export..."))
110          self.button_advanced = wxButton(self.panel_1, ID_PROJ_ADVANCED, _("Advanced >>"))          EVT_BUTTON(self, ID_PROJ_EXPORT, self._OnExport)
111          self.label_2 = wxStaticText(self.panel_1, -1, _("Name:"))          buttons.Add(self.button_export, 1, wxALL|wxEXPAND, 4)
112          self.projname = wxTextCtrl(self.panel_1, -1, "")          buttons.Add(20, 20, 0, wxEXPAND, 0)
113          self.label_3 = wxStaticText(self.panel_1, -1, _("Projection:"))          self.button_remove = wxButton(self, ID_PROJ_REMOVE, _("Remove"))
114          self.projchoice = wxChoice(self.panel_1, ID_PROJ_PROJCHOICE)          EVT_BUTTON(self, ID_PROJ_REMOVE, self._OnRemove)
115          self.button_new = wxButton(self.panel_1, ID_PROJ_NEW, _("New"))          buttons.Add(self.button_remove, 1, wxALL|wxEXPAND, 4)
116          self.button_saveas = wxButton(self.panel_1, ID_PROJ_SAVEAS, _("Save"))  
117          self.button_try = wxButton(self.panel_1, ID_PROJ_TRY, _("Try"))          # The file path
118          self.button_revert = wxButton(self.panel_1, ID_PROJ_REVERT, _("Revert"))          self.projfilepath = wxStaticText(self, -1, "")
119          self.button_ok = wxButton(self.panel_1, ID_PROJ_OK, _("OK"))          vbox.Add(self.projfilepath, 0, wxALL|wxEXPAND)
         self.button_close = wxButton(self.panel_1, ID_PROJ_CLOSE, _("Close"))  
   
         self.__set_properties()  
         self.__do_layout()  
         # end wxGlade  
   
         self.sizer_edit.GetStaticBox().Show(False)  
         self.sizer_mainctrls.Show(self.sizer_edit, False)  
         self.topBox.Layout()  
120    
121          EVT_BUTTON(self, ID_PROJ_TRY, self._OnTry)          #
122          EVT_BUTTON(self, ID_PROJ_REVERT, self._OnRevert)          #   The projection editor part
123          EVT_BUTTON(self, ID_PROJ_OK, self._OnOK)          #
124          EVT_BUTTON(self, ID_PROJ_CLOSE, self._OnClose)          self.edit_box = wxStaticBox(self, -1, _("Edit"))
125          EVT_BUTTON(self, ID_PROJ_ADVANCED, self._OnAdvanced)          sizer_edit = wxStaticBoxSizer(self.edit_box, wxHORIZONTAL)
126          EVT_CHOICE(self, ID_PROJ_PROJCHOICE, self._OnProjChoice)          main_box.Add(sizer_edit, 5, wxALL|wxEXPAND)
127          EVT_LISTBOX(self, ID_PROJ_AVAIL, self._OnProjAvail)  
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.
149            self.nbsizer = NotebookLikeSizer()
150            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            # 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)          EVT_BUTTON(self, ID_PROJ_NEW, self._OnNew)
171          EVT_BUTTON(self, ID_PROJ_SAVEAS, self._OnSave)          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      def GetReceiver(self):          #
181          return self.receiver          # Main Action buttons (Try/Revert/OK/Close)
182            #
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)
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)
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)
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)
197            buttons.Add(self.button_close, 0, wxRIGHT, 10)
198    
     def _OnTry(self, event):  
         self.__SetProjection()  
199    
200      def _OnRevert(self, event):          #
201          if self.originalProjection != -1:          # Automatic Layout
202              self.receiver.SetProjection(self.originalProjection)          #
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):
219            self.__SetProjection()
220            self.haveTried = True
221    
222      def _OnOK(self, event):      def OnOK(self, event):
223          self.__SetProjection()          self.__SetProjection()
224          self.Close()          self.Close()
225    
226      def _OnClose(self, event):      def OnCancel(self, event):
227            """Cancel just closes the dialog, but we call it cancel so we
228            can overload the functionality of wxDialog.
229            """
230          self.Close()          self.Close()
231    
232      def _OnAdvanced(self, event):      def _OnRevert(self, event):
233          self.sizer_edit.GetStaticBox().Show(True)          if self.haveTried:
234          self.sizer_mainctrls.Show(self.sizer_edit, True)              self.receiver.SetProjection(self.originalProjection)
235          self.topBox.Fit(self)              self.haveTried = False
         self.topBox.SetSizeHints(self)  
         self.topBox.Layout()  
236    
237          self.editing = True      def _OnNew(self, event):
238    
239          self.__DoOnProjAvail()          self.projection_list.ClearSelection()
240            self.projname.Clear()
241    
242          self.button_advanced.Enable(False)          # supply a projection panel if there wasn't one
243            if self.curProjPanel is None:
244                self.projchoice.SetSelection(0)
245                self.__DoOnProjChoice()
246    
247      def _OnNew(self, event):          if self.curProjPanel is not None:
248          print "_OnNew"              self.curProjPanel.Clear()
         self.availprojs.SetSelection(-1)  
         self.projname.Clear()  
         self.curProjPanel.Clear()  
249    
250      def _OnSave(self, event):      def _OnSave(self, event):
         print "_OnSave"  
   
     def _OnProjAvail(self, event):  
         self.__DoOnProjAvail()  
251    
252      def __DoOnProjAvail(self):          sel = self.projection_list.selected_projections()
253          print "_OnProjAvail"          assert len(sel) == 1,  "button shouldn't be enabled"
254    
255          if not self.editing: return          proj, projfile = sel[0]
256    
257          sel = self.availprojs.GetSelection()          assert proj is not None and projfile is not None
         if sel == -1: return  
258    
259          proj = self.availprojs.GetClientData(sel)          newproj = self.__GetProjection()
         assert proj != None  
260    
261          self.projname.SetValue(proj.GetName())          if newproj is not None:
262                # FIXME: we should only allow this for the user proj file.
263                projfile.Replace(proj, newproj)
264                self.write_proj_file(projfile)
265                self.projection_list.SelectProjection(newproj)
266    
267          myProjType = proj.GetParameter("proj")      def _OnAddToList(self, event):
         i = 0  
         for projType, name, clazz in self.projPanels:  
             if myProjType == projType:  
                 self.projchoice.SetSelection(i)  
                 self.__DoOnProjChoice()  
                 self.curProjPanel.SetProjection(proj)  
             i += 1  
268    
269      def _OnProjChoice(self, event):          proj = self.__GetProjection()
270          self.__DoOnProjChoice()          if proj is not None:
271                self.__usrProjFile.Add(proj)
272                self.write_proj_file(self.__usrProjFile)
273                self.projection_list.SelectProjection(proj)
274    
275        def show_warnings(self, title, filename, warnings):
276            """Show the warnings (a list of strings) in a dialog
277    
278            If the list is empty no dialog will be shown.
279            """
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):
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)
293    
294      def __DoOnProjChoice(self):          if dlg.ShowModal() == wxID_OK:
295          print "_OnProjChoice()"              path = dlg.GetPath()
         choice = self.projchoice  
296    
297          sel = choice.GetSelection()              ThubanBeginBusyCursor()
298          if sel == -1: return              try:
299                    try:
300                        projFile, warnings = read_proj_file(path)
301                    except IOError, (errno, errstr):
302                        self.__ShowError(dlg.GetPath(), errstr)
303                    else:
304                        self.show_warnings(_("Warnings"), path, warnings)
305                        for proj in projFile.GetProjections():
306                            self.__usrProjFile.Add(proj)
307                        self.write_proj_file(self.__usrProjFile)
308                finally:
309                    ThubanEndBusyCursor()
310            dlg.Destroy()
311    
312        def _OnExport(self, event):
313            """Handler for the 'Export' button.
314    
315            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"
320    
321          clazz, obj = choice.GetClientData(choice.GetSelection())          dlg = wxFileDialog(self, _("Export"), style=wxSAVE|wxOVERWRITE_PROMPT)
322    
323          if obj is None:          if dlg.ShowModal() == wxID_OK:
324              obj = clazz(self)              proj_file = ProjFile(dlg.GetPath())
325              choice.SetClientData(sel, [clazz, obj])              for proj, pf in sel:
326                    if proj is not None:
327                        proj_file.Add(proj)
328                self.write_proj_file(proj_file)
329    
330            dlg.Destroy()
331    
332        def _OnRemove(self, event):
333            """Handler for the 'Remove' button
334    
335            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!"
341    
342            modified = False
343            for proj, pf in sel:
344                if proj is not None and pf is self.__usrProjFile:
345                    pf.Remove(proj)
346                    modified = True
347    
348            if modified:
349                self.write_proj_file(self.__usrProjFile)
350    
351        def _OnProjName(self, event):
352            self.__VerifyButtons()
353    
354        def __ShowError(self, filename, errstr):
355            wxMessageDialog(self,
356                _("The following error occured:\n") +
357                filename + "\n" + errstr,
358                _("Error"), wxOK | wxICON_ERROR).ShowModal()
359    
360        def __VerifyButtons(self):
361            """Update button sensitivity"""
362    
363            num_sel = self.projection_list.GetSelectedItemCount()
364    
365            self.button_import.Enable(True)
366            self.button_export.Enable(True)
367            self.button_save.Enable(True)
368            self.button_remove.Enable(True)
369    
370            self.edit_box.Enable(True)
371    
372            for ctrl in [self.button_import,
373                         self.button_export,
374                         self.button_remove,
375                         self.button_save,
376                         self.button_add,
377                         self.projchoice,
378                         self.projname,
379                         self.edit_box]:
380                ctrl.Enable(True)
381    
382          if self.curProjPanel is not None:          if self.curProjPanel is not None:
383              self.curProjPanel.Hide()              self.curProjPanel.Enable(True)
384              self.sizer_projctrls.Remove(self.curProjPanel)  
385            if num_sel == 0:
386                self.button_import.Enable(True)
387                self.button_export.Enable(False)
388                self.button_remove.Enable(False)
389                self.button_save.Enable(False)
390    
391            elif num_sel == 1:
392    
393                selection = self.projection_list.selected_projections()
394                proj, projFile = selection[0]
395    
396                self.button_save.Enable(len(self.projname.GetValue()) > 0)
397                self.button_add.Enable(len(self.projname.GetValue()) > 0)
398    
399                if proj is None:
400                    # <None> is selected
401                    for ctrl in [self.button_export,
402                                 self.button_remove,
403                                 self.button_save,
404                                 self.button_add,
405                                 self.projchoice,
406                                 self.projname]:
407                        ctrl.Enable(False)
408    
409                    if self.curProjPanel is not None:
410                        self.curProjPanel.Enable(False)
411    
412                elif proj is self.originalProjection:
413                    self.button_remove.Enable(False)
414    
415                if projFile is None:
416                    self.button_save.Enable(False)
417    
418            else:
419                self.edit_box.Enable(False)
420    
421        def proj_selection_changed(self, projs):
422            """Subscribed to the projection_list's PROJ_SELECTION_CHANGED message
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:
431                    # user selected <None>
432                    self.projname.Clear()
433                    self.projfilepath.SetLabel("")
434                else:
435                    if projfile is not None:
436                        filename = os.path.basename(projfile.GetFilename())
437                        self.projfilepath.SetLabel(_("Source of Projection: %s")
438                                                   % filename)
439                    else:
440                        # only None if the currently used projection is selected
441                        self.projfilepath.SetLabel("")
442    
443                    self.projname.SetValue(proj.Label())
444    
445                    myProjType = proj.GetParameter("proj")
446                    i = 0
447                    for projType, name, cls in self.projection_panel_defs:
448                        if myProjType == projType:
449                            self.projchoice.Enable(True)
450                            self.projchoice.SetSelection(i + 1)
451                            self.__DoOnProjChoice()
452    
453                            #
454                            # self.curProjPanel should not be null
455                            # after a call to __DoOnProjChoice
456                            #
457                            assert self.curProjPanel is not None
458    
459                            self.curProjPanel.SetProjection(proj)
460                            break
461                        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()
472    
473        def _OnProjChoice(self, event):
474            self.__DoOnProjChoice()
475    
476          self.curProjPanel = obj      def __DoOnProjChoice(self):
477          self.curProjPanel.Show()          """Create and layout a projection panel based on the selected
478            projection type.
479    
480          print "++", self.topBox.GetSize(), self.GetSize()          This is necessary to have in seperate method since calls to
481          print "!!", self.sizer_projctrls.GetSize(), \          wxChoice.SetSelection() do not trigger an event.
                     self.sizer_edit.GetSize(), \  
                     self.sizer_mainctrls.GetSize(), \  
                     self.sizer_panel.GetSize()  
         self.sizer_projctrls.Add(self.curProjPanel, 1, wxALL|wxEXPAND, 3)  
         #print "$$", self.sizer_projctrls.GetSize()  
 #       self.topBox.Fit(self)  
 #       self.topBox.SetSizeHints(self)  
 #       self.topBox.Layout()  
   
         self.sizer_panel.SetSizeHints(self.panel_1)  
         w, h = self.sizer_panel.GetSize()  
         self.topBox.SetDimension(0, 0, w, h)  
   
         #self.sizer_panel.Fit(self.panel_1)  
         self.topBox.Fit(self)  
         #self.SetAutoLayout(1)  
         self.topBox.SetSizeHints(self)  
         self.SetSize(self.topBox.GetSize())  
         print "!!", self.sizer_projctrls.GetSize(), \  
                     self.sizer_edit.GetSize(), \  
                     self.sizer_mainctrls.GetSize(), \  
                     self.sizer_panel.GetSize()  
         print "--", self.topBox.GetSize(), self.GetSize()  
482    
483                            At the end of this method self.curProjPanel will not be None
484            if there was a item selected.
485            """
486            choice = self.projchoice
487    
488            sel = choice.GetSelection()
489            if sel != -1:
490                proj_type = choice.GetClientData(sel)
491                for t, name, cls in self.projection_panel_defs:
492                    if t == proj_type:
493                        self._show_proj_panel(cls)
494                        break
495            # FIXME: what to do if sel == -1?
496    
497        def _show_proj_panel(self, panel_class):
498            """Show the panel as the projection panel"""
499            if panel_class is UnknownProjPanel:
500                self.edit_box.Disable()
501                self.nbsizer.Activate(self.unknown_projection_panel)
502                self.curProjPanel = self.unknown_projection_panel
503            else:
504                self.edit_box.Enable(True)
505                self.unknown_projection_panel.Hide()
506                for panel in self.projection_panels:
507                    if panel.__class__ is panel_class:
508                        self.nbsizer.Activate(panel)
509                        self.curProjPanel = panel
510    
511      def __SetProjection(self):      def __SetProjection(self):
512            """Set the receiver's projection."""
513    
514          #          #
515          # save the original projection only once in case          # save the original projection only once in case
516          # we try to apply several different projections          # we try to apply several different projections
517          #          #
518          if self.originalProjection == -1:          self.receiver.SetProjection(self.__GetProjection())
             self.originalProjection = self.receiver.GetProjection()  
   
         sel = self.availprojs.GetSelection()  
         proj = -1  
   
         if self.editing:  
             if self.curProjPanel is not None:  
                 proj = Projection(self.curProjPanel.GetParameters())  
         elif sel != -1:  
             proj = self.availprojs.GetClientData(sel)  
   
         if proj != -1:  
             if proj is not None:  
                 print proj.GetAllParameters()  
             self.receiver.SetProjection(proj)  
   
   
     def __set_properties(self):  
         self.availprojs.Append("<None>", None)  
   
         projfiles = GetSystemProjFiles()  
         for projfile in projfiles:  
             for proj in projfile.GetProjections():  
                 self.availprojs.Append(proj.GetName(), proj)  
   
         projfiles = GetUserProjFiles()  
         for projfile in projfiles:  
             for proj in projfile.GetProjections():  
                 self.availprojs.Append(proj.GetName(), proj)  
519    
520          proj = self.receiver.GetProjection()      def __GetProjection(self):
521          if proj is not None:          """Return a suitable Projection object based on the current
522              self.availprojs.Append("## " + proj.GetName() + " ##", proj)          state of the dialog box selections.
523    
524            Could be None.
525            """
526    
527            assert self.projection_list.GetSelectedItemCount() < 2, \
528                   "button should be disabled"
529    
530            sel = self.projection_list.selected_projections()
531            if len(sel) == 1:
532                if sel[0][0] is None:
533                    # <None> is selected
534                    return None
535    
536          for proj, name, clazz in self.projPanels:          # self.curProjPanel should always contain the most relevant data
537              self.projchoice.Append(name, [clazz, None])          # for a projection
538            if self.curProjPanel is not None:
539                return Projection(self.curProjPanel.GetParameters(),
540                                  self.projname.GetValue())
541    
542          # begin wxGlade: ProjFrame.__set_properties          return None
         self.SetTitle(_("Projections"))  
         self.availprojs.SetSelection(0)  
         self.projchoice.SetSelection(0)  
         # end wxGlade  
543    
544      def __do_layout(self):      def load_user_proj(self):
545          # begin wxGlade: ProjFrame.__do_layout          ThubanBeginBusyCursor()
546          self.topBox = wxBoxSizer(wxVERTICAL)          try:
547          self.sizer_panel = wxBoxSizer(wxVERTICAL)              if self.__usrProjFile is None:
548          sizer_6 = wxBoxSizer(wxHORIZONTAL)                  projfile, warnings = get_user_proj_file()
549          self.sizer_mainctrls = wxBoxSizer(wxHORIZONTAL)                  self.show_warnings(_("Warnings"), projfile.GetFilename(),
550          self.sizer_edit = wxStaticBoxSizer(wxStaticBox(self.panel_1, -1, _("Edit")), wxHORIZONTAL)                                     warnings)
551          sizer_11 = wxBoxSizer(wxVERTICAL)                  self.__usrProjFile = projfile
552          self.sizer_projctrls = wxBoxSizer(wxVERTICAL)              return self.__usrProjFile
553          sizer_14 = wxBoxSizer(wxHORIZONTAL)          finally:
554          sizer_13 = wxBoxSizer(wxHORIZONTAL)              ThubanEndBusyCursor()
555          grid_sizer_1 = wxFlexGridSizer(2, 2, 0, 0)  
556          grid_sizer_1.Add(self.label_5, 0, wxLEFT|wxRIGHT|wxTOP, 4)      def load_system_proj(self):
557          grid_sizer_1.Add(20, 20, 0, wxEXPAND, 0)          ThubanBeginBusyCursor()
558          grid_sizer_1.Add(self.availprojs, 1, wxALL|wxEXPAND, 4)          try:
559          grid_sizer_1.Add(self.button_advanced, 0, wxALL, 4)              if self.__sysProjFile is None:
560          grid_sizer_1.AddGrowableRow(1)                  projfile, warnings = get_system_proj_file()
561          grid_sizer_1.AddGrowableCol(0)                  self.show_warnings(_("Warnings"), projfile.GetFilename(),
562          self.sizer_mainctrls.Add(grid_sizer_1, 1, wxEXPAND, 0)                                     warnings)
563          sizer_13.Add(self.label_2, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)                  self.__sysProjFile = projfile
564          sizer_13.Add(self.projname, 1, wxALL, 4)              return self.__sysProjFile
565          self.sizer_projctrls.Add(sizer_13, 0, wxEXPAND, 0)          finally:
566          sizer_14.Add(self.label_3, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)              ThubanEndBusyCursor()
567          sizer_14.Add(self.projchoice, 1, wxALL|wxEXPAND, 4)  
568          self.sizer_projctrls.Add(sizer_14, 0, wxEXPAND, 0)      def write_proj_file(self, proj_file):
569          self.sizer_edit.Add(self.sizer_projctrls, 1, wxEXPAND, 0)          """Write the ProjFile object proj_file back to its file
570          sizer_11.Add(self.button_new, 0, wxALL|wxEXPAND, 4)  
571          sizer_11.Add(self.button_saveas, 0, wxALL|wxEXPAND, 4)          Show a busy cursor while writing and if an error occurs show a
572          self.sizer_edit.Add(sizer_11, 0, wxALL|wxEXPAND, 4)          dialog with the error message.
573          self.sizer_mainctrls.Add(self.sizer_edit, 0, wxALL|wxEXPAND, 4)          """
574          self.sizer_panel.Add(self.sizer_mainctrls, 1, wxEXPAND, 0)          try:
575          sizer_6.Add(20, 20, 1, wxEXPAND, 0)              ThubanBeginBusyCursor()
576          sizer_6.Add(self.button_try, 0, wxALL, 4)              try:
577          sizer_6.Add(20, 20, 1, 0, 0)                  write_proj_file(proj_file)
578          sizer_6.Add(self.button_revert, 0, wxALL, 4)              finally:
579          sizer_6.Add(20, 20, 1, 0, 0)                  ThubanEndBusyCursor()
580          sizer_6.Add(self.button_ok, 0, wxALL, 4)          except IOError, (errno, errstr):
581          sizer_6.Add(20, 20, 1, 0, 0)              self.__ShowError(proj_file.GetFilename(), errstr)
         sizer_6.Add(self.button_close, 0, wxALL, 4)  
         sizer_6.Add(20, 20, 1, wxEXPAND, 0)  
         self.sizer_panel.Add(sizer_6, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 0)  
         self.panel_1.SetAutoLayout(1)  
         self.panel_1.SetSizer(self.sizer_panel)  
         self.sizer_panel.Fit(self.panel_1)  
         self.sizer_panel.SetSizeHints(self.panel_1)  
         self.topBox.Add(self.panel_1, 1, wxEXPAND, 0)  
         self.SetAutoLayout(1)  
         self.SetSizer(self.topBox)  
         self.topBox.Fit(self)  
         self.topBox.SetSizeHints(self)  
         self.Layout()  
         # end wxGlade  
582    
 # end of class ProjFrame  
583    
584    
585  class ProjPanel(wxPanel):  class ProjPanel(wxPanel):
# Line 311  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 = [("bessel", _("Bessel 1841")),          self.ellpsData = [("", _("<Unknown>")),
593                            ("clrk66", _("Clarke 1866")),                            ("airy"  , _("Airy")),
594                              ("bessel", _("Bessel 1841")),
595                              ("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 327  class ProjPanel(wxPanel): Line 607  class ProjPanel(wxPanel):
607    
608          panelSizer = wxBoxSizer(wxVERTICAL)          panelSizer = wxBoxSizer(wxVERTICAL)
609    
         if childPanel is not None:  
             panelSizer.Add(childPanel, 0, wxALL|wxEXPAND, 4)  
               
610          sizer = wxBoxSizer(wxHORIZONTAL)          sizer = wxBoxSizer(wxHORIZONTAL)
611          sizer.Add(wxStaticText(self, -1, _("Ellipsoid:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("Ellipsoid:")), 0,
612          sizer.Add(self.__ellps, 1, wxALL|wxEXPAND, 4)                                      wxALL|wxALIGN_CENTER_VERTICAL, 4)
613            sizer.Add(self.__ellps, 1, wxALL|wxALIGN_CENTER_VERTICAL, 4)
614          panelSizer.Add(sizer, 0, wxALL|wxEXPAND, 4)          panelSizer.Add(sizer, 0, wxALL|wxEXPAND, 4)
615    
616            if childPanel is not None:
617                panelSizer.Add(childPanel, 0, wxEXPAND, 0)
618                
619          self.SetAutoLayout(1)          self.SetAutoLayout(1)
620          self.SetSizer(panelSizer)          self.SetSizer(panelSizer)
621          panelSizer.Fit(self)          panelSizer.Fit(self)
# Line 357  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          print "asdfsdf"          ellps = self.__ellps.GetSelection()
642          return ["ellps=" + self.__ellps.GetClientData(          if ellps > 0:
643                                          self.__ellps.GetSelection())]              return ["ellps=" + self.__ellps.GetClientData(ellps)]
644            return []
645    
646    
647  ID_TMPANEL_LAT = 4001  ID_TMPANEL_LAT = 4001
# Line 369  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      def __init__(self, parent):  
655        """Panel for unknown projection types"""
656    
657        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 388  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
688    
689  class TMPanel(ProjPanel):  class TMPanel(ProjPanel):
690      """Projection panel for Transverse Mercartor."""      """Projection panel for Transverse Mercator."""
691    
692      def __init__(self, parent):      def __init__(self, parent, receiver):
693          ProjPanel.__init__(self, parent)          ProjPanel.__init__(self, parent)
694    
695          self.__latitude = wxTextCtrl(self, ID_TMPANEL_LAT)          self.__latitude = wxTextCtrl(self, ID_TMPANEL_LAT)
# Line 409  class TMPanel(ProjPanel): Line 702  class TMPanel(ProjPanel):
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 424  class TMPanel(ProjPanel): Line 717  class TMPanel(ProjPanel):
717          ProjPanel._DoLayout(self, sizer)          ProjPanel._DoLayout(self, sizer)
718    
719      def GetProjName(self):      def GetProjName(self):
720          return _("Transverse Mercartor")          return _("Transverse Mercator")
721    
722      def SetProjection(self, proj):      def SetProjection(self, proj):
723          ProjPanel.SetProjection(self, proj)          ProjPanel.SetProjection(self, proj)
# Line 438  class TMPanel(ProjPanel): Line 731  class TMPanel(ProjPanel):
731          ProjPanel.SetProjection(self, proj)          ProjPanel.SetProjection(self, proj)
732    
733      def GetParameters(self):      def GetParameters(self):
         print "** asdfsdf"  
734          params = ["proj=tmerc",          params = ["proj=tmerc",
735                    "lat_0=" + self.__latitude.GetValue(),                    "lat_0=" + self.__latitude.GetValue(),
736                    "lon_0=" + self.__longitude.GetValue(),                    "lon_0=" + self.__longitude.GetValue(),
# Line 462  ID_UTMPANEL_SOUTH = 4002 Line 754  ID_UTMPANEL_SOUTH = 4002
754  ID_UTMPANEL_PROP = 4003  ID_UTMPANEL_PROP = 4003
755    
756  class UTMPanel(ProjPanel):  class UTMPanel(ProjPanel):
757      """Projection Panel for Universal Transverse Mercartor."""      """Projection Panel for Universal Transverse Mercator."""
758    
759      def __init__(self, parent):      def __init__(self, parent, receiver):
760          ProjPanel.__init__(self, parent)          ProjPanel.__init__(self, parent)
761    
762          self.parent = parent          self.receiver = receiver
763    
764          self.__zone = wxSpinCtrl(self, ID_UTMPANEL_ZONE, "1", min=1, max=60)          self.__zone = wxSpinCtrl(self, ID_UTMPANEL_ZONE, "1", min=1, max=60)
765            self.__propButton = wxButton(self, ID_UTMPANEL_PROP, _("Propose"))
766          self.__south = wxCheckBox(self, ID_UTMPANEL_SOUTH,          self.__south = wxCheckBox(self, ID_UTMPANEL_SOUTH,
767                                    _("Southern Hemisphere"))                                    _("Southern Hemisphere"))
         self.__propButton = wxButton(self, ID_UTMPANEL_PROP, _("Propose"))  
768    
769          self._DoLayout()          self._DoLayout()
770    
# Line 491  class UTMPanel(ProjPanel): Line 783  class UTMPanel(ProjPanel):
783          ProjPanel._DoLayout(self, sizer)          ProjPanel._DoLayout(self, sizer)
784    
785      def GetProjName(self):      def GetProjName(self):
786          return _("Universal Transverse Mercartor")          return _("Universal Transverse Mercator")
787    
788      def SetProjection(self, proj):      def SetProjection(self, proj):
789          self.__zone.SetValue(int(proj.GetParameter("zone")))          self.__zone.SetValue(int(proj.GetParameter("zone")))
# Line 499  class UTMPanel(ProjPanel): Line 791  class UTMPanel(ProjPanel):
791          ProjPanel.SetProjection(self, proj)          ProjPanel.SetProjection(self, proj)
792    
793      def GetParameters(self):      def GetParameters(self):
         print "** asdfsdf"  
794          params = ["proj=utm", "zone=" + str(self.__zone.GetValue())]          params = ["proj=utm", "zone=" + str(self.__zone.GetValue())]
795          if self.__south.IsChecked():          if self.__south.IsChecked():
796              params.append("south")              params.append("south")
# Line 513  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          dlg = UTMProposeZoneDialog(self, self.parent.GetReceiver().BoundingBox())          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())
823          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
824              self.__zone.SetValue(dlg.GetProposedZone())              self.__zone.SetValue(dlg.GetProposedZone())
825    
826  class LCCPanel(ProjPanel):  class LCCPanel(ProjPanel):
827      """Projection Panel for Lambert Conic Conformal."""      """Projection Panel for Lambert Conic Conformal."""
828    
829      def __init__(self, parent):      def __init__(self, parent, receiver):
830          ProjPanel.__init__(self, parent)          ProjPanel.__init__(self, parent)
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 542  class LCCPanel(ProjPanel): Line 847  class LCCPanel(ProjPanel):
847          sizer.Add(wxStaticText(self, -1,          sizer.Add(wxStaticText(self, -1,
848              _("Latitude of second standard parallel:")))              _("Latitude of second standard parallel:")))
849          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)  
850          sizer.Add(wxStaticText(self, -1, _("Central Meridian:")))          sizer.Add(wxStaticText(self, -1, _("Central Meridian:")))
851          sizer.Add(self.__meridian, 0, wxALL, 4)          sizer.Add(self.__meridian, 0, wxALL, 4)
852            sizer.Add(wxStaticText(self, -1, _("Latitude of origin:")))
853            sizer.Add(self.__originLat, 0, wxALL, 4)
854          sizer.Add(wxStaticText(self, -1, _("False Easting:")))          sizer.Add(wxStaticText(self, -1, _("False Easting:")))
855          sizer.Add(self.__falseEast, 0, wxALL, 4)          sizer.Add(self.__falseEast, 0, wxALL, 4)
856          sizer.Add(wxStaticText(self, -1, _("False Northing:")))          sizer.Add(wxStaticText(self, -1, _("False Northing:")))
# Line 591  class LCCPanel(ProjPanel): Line 896  class LCCPanel(ProjPanel):
896  class GeoPanel(ProjPanel):  class GeoPanel(ProjPanel):
897      """Projection Panel for a Geographic Projection."""      """Projection Panel for a Geographic Projection."""
898    
899      def __init__(self, parent):      def __init__(self, parent, receiver):
900          ProjPanel.__init__(self, parent)          ProjPanel.__init__(self, parent)
901          ProjPanel._DoLayout(self, None)  
902            self.__choices = [(_("Degrees"), "0.017453"),
903                              (_("Radians"), "1")]
904    
905            self.__scale = wxChoice(self, -1)
906            for choice, value in self.__choices:
907                self.__scale.Append(choice, value)
908    
909            self._DoLayout()
910    
911      def GetProjName(self):      def GetProjName(self):
912          return _("Geographic")          return _("Geographic")
913                    
914      def SetProjection(self, proj):      def SetProjection(self, proj):
915            value = proj.GetParameter("to_meter")
916            for i in range(len(self.__choices)):
917                choice, data = self.__choices[i]
918                if value == data:
919                    self.__scale.SetSelection(i)
920          ProjPanel.SetProjection(self, proj)          ProjPanel.SetProjection(self, proj)
921    
922      def GetParameters(self):      def GetParameters(self):
923          params = ["proj=latlong"]          params = ["proj=latlong",
924                      "to_meter=%s" % self.__scale.GetClientData(
925                                      self.__scale.GetSelection())]
926    
927          params.extend(ProjPanel.GetParameters(self))          params.extend(ProjPanel.GetParameters(self))
928          return params          return params
929    
930      def Clear(self):      def Clear(self):
931          ProjPanel.Clear(self)          ProjPanel.Clear(self)
932    
933        def _DoLayout(self):
934            sizer = wxBoxSizer(wxHORIZONTAL)
935    
936            sizer.Add(wxStaticText(self, -1, _("Source Data is in: ")),
937                      0, wxALL|wxALIGN_CENTER_VERTICAL, 4)
938            sizer.Add(self.__scale, 1, wxEXPAND|wxALL, 4)
939    
940            self.__scale.SetSelection(0)
941    
942            ProjPanel._DoLayout(self, sizer)
943    
944    
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 647  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.717  
changed lines
  Added in v.1858

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26