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

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26