/[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 964 by jonathan, Wed May 21 17:24:09 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    #
5    # This program is free software under the GPL (>=v2)
6    # Read the file COPYING coming with Thuban for details.
7                                                                                    
8    import os, sys, math
9  from wxPython.wx import *  from wxPython.wx import *
10    
11  from Thuban import _  from Thuban import _
12    
13  from Thuban.Model.proj import Projection  from Thuban.Model.proj import Projection, ProjFile
14    
15  from Thuban.Model.resource import GetUserProjFiles, GetSystemProjFiles  from Thuban.Model.resource import GetUserProjFiles, GetSystemProjFiles, \
16                                      ReadProjFile, WriteProjFile
17  from Thuban.UI.dialogs import NonModalDialog  from Thuban.UI.dialogs import NonModalDialog
18    
19    
20  ID_PROJ_ADVANCED  = 4001  ID_PROJ_ADVANCED  = 4001
21  ID_PROJ_PROJCHOICE = 4002  ID_PROJ_PROJCHOICE = 4002
22  ID_PROJ_SAVEAS    = 4003  ID_PROJ_ADDTOLIST    = 4003
23  ID_PROJ_NEW       = 4004  ID_PROJ_NEW       = 4004
 ID_PROJ_TRY       = 4005  
24  ID_PROJ_REVERT    = 4006  ID_PROJ_REVERT    = 4006
 ID_PROJ_OK        = 4007  
 ID_PROJ_CLOSE     = 4008  
25  ID_PROJ_AVAIL     = 4009  ID_PROJ_AVAIL     = 4009
26    ID_PROJ_SAVE      = 4010
27    ID_PROJ_IMPORT    = 4011
28    ID_PROJ_EXPORT    = 4012
29    ID_PROJ_REMOVE    = 4013
30    ID_PROJ_PROJNAME  = 4014
31    
32    CLIENT_PROJ = 0
33    CLIENT_PROJFILE = 1
34    
35  class ProjFrame(NonModalDialog):  class ProjFrame(NonModalDialog):
36    
37        def __init__(self, parent, name, title, receiver):
38            """Initialize the projection dialog.
39    
40      def __init__(self, parent, name, receiver, *args, **kwds):          receiver -- An object that implements the following methods:
41          #                          SetProjection(projection)
42          # Changes to the wxGlade generated code:                          GetProjection()
43          #   o   call NonModalDialog.__init__(self, parent, name, "")          """
44          #   o   remove default choices in combo box          
         #  
   
         self.editing = False  
45          self.receiver = receiver          self.receiver = receiver
46          self.originalProjection = -1          self.haveTried = False
47          self.curProjPanel = None          self.curProjPanel = None
48    
49          self.projPanels = []          self.projPanels = []
50          self.projPanels.append(          self.projPanels.append(
51              ("tmerc", _("Transverse Mercartor"), TMPanel))              ("tmerc", _("Transverse Mercator"), TMPanel))
52          self.projPanels.append(          self.projPanels.append(
53              ("utm", _("Universal Transverse Mercartor"), UTMPanel))              ("utm", _("Universal Transverse Mercator"), UTMPanel))
54          self.projPanels.append(          self.projPanels.append(
55              ("lcc", _("Lambert Conic Conformal"), LCCPanel))              ("lcc", _("Lambert Conic Conformal"), LCCPanel))
56          self.projPanels.append(          self.projPanels.append(
57              ("latlong", _("Geographic"), GeoPanel))              ("latlong", _("Geographic"), GeoPanel))
58    
59          # begin wxGlade: ProjFrame.__init__          NonModalDialog.__init__(self, parent, name, title)
60          #kwds["style"] = wxDEFAULT_FRAME_STYLE          # originally generate by wxGlade
         NonModalDialog.__init__(self, parent, name, "")  
61          self.panel_1 = wxPanel(self, -1)          self.panel_1 = wxPanel(self, -1)
62          self.label_5 = wxStaticText(self.panel_1, -1, _("Available Projections:"))          self.panel_edit = wxPanel(self, -1)
63          self.availprojs = wxListBox(self.panel_1, ID_PROJ_AVAIL, style=wxLB_SINGLE|wxLB_SORT)          self.panel_buttons = wxPanel(self, -1)
64          self.button_advanced = wxButton(self.panel_1, ID_PROJ_ADVANCED, _("Advanced >>"))          self.label_5 = wxStaticText(self.panel_1, -1,
65          self.label_2 = wxStaticText(self.panel_1, -1, _("Name:"))                          _("Available Projections:"))
66          self.projname = wxTextCtrl(self.panel_1, -1, "")          self.availprojs = wxListBox(self.panel_1, ID_PROJ_AVAIL,
67          self.label_3 = wxStaticText(self.panel_1, -1, _("Projection:"))                                      style=wxLB_EXTENDED|wxLB_SORT)
68          self.projchoice = wxChoice(self.panel_1, ID_PROJ_PROJCHOICE)          self.projfilepath = wxStaticText(self.panel_1, -1, "")
69          self.button_new = wxButton(self.panel_1, ID_PROJ_NEW, _("New"))          self.label_2 = wxStaticText(self.panel_edit, -1, _("Name:"))
70          self.button_saveas = wxButton(self.panel_1, ID_PROJ_SAVEAS, _("Save"))          self.projname = wxTextCtrl(self.panel_edit, ID_PROJ_PROJNAME, "")
71          self.button_try = wxButton(self.panel_1, ID_PROJ_TRY, _("Try"))          self.label_3 = wxStaticText(self.panel_edit, -1, _("Projection:"))
72          self.button_revert = wxButton(self.panel_1, ID_PROJ_REVERT, _("Revert"))          self.projchoice = wxChoice(self.panel_edit, ID_PROJ_PROJCHOICE)
73          self.button_ok = wxButton(self.panel_1, ID_PROJ_OK, _("OK"))          self.button_import = wxButton(self.panel_1, ID_PROJ_IMPORT,
74          self.button_close = wxButton(self.panel_1, ID_PROJ_CLOSE, _("Close"))                                        _("Import..."))
75            self.button_export = wxButton(self.panel_1, ID_PROJ_EXPORT,
76                                          _("Export..."))
77            self.button_remove = wxButton(self.panel_1, ID_PROJ_REMOVE, _("Remove"))
78            self.button_new = wxButton(self.panel_edit, ID_PROJ_NEW, _("New"))
79            self.button_save = wxButton(self.panel_edit, ID_PROJ_SAVE,_("Save"))
80            self.button_add = wxButton(self.panel_edit, ID_PROJ_ADDTOLIST,
81                                          _("Add to List"))
82            self.button_try = wxButton(self.panel_buttons, wxID_APPLY, _("Try"))
83            self.button_revert = wxButton(self.panel_buttons, ID_PROJ_REVERT,
84                                          _("Revert"))
85            self.button_ok = wxButton(self.panel_buttons, wxID_OK, _("OK"))
86            self.button_ok.SetDefault()
87            self.button_close = wxButton(self.panel_buttons, wxID_CANCEL,
88                                         _("Close"))
89    
90          self.__set_properties()          self.__set_properties()
91          self.__do_layout()          self.__do_layout()
92          # end wxGlade          # wxGlade
93    
94          self.sizer_edit.GetStaticBox().Show(False)          self.originalProjection = self.receiver.GetProjection()
         self.sizer_mainctrls.Show(self.sizer_edit, False)  
         self.topBox.Layout()  
95    
96          EVT_BUTTON(self, ID_PROJ_TRY, self._OnTry)          self.__DoOnProjAvail()
97            self.button_ok.SetFocus()
98            self.availprojs.SetFocus()
99            
100            EVT_BUTTON(self, wxID_APPLY, self.OnApply)
101          EVT_BUTTON(self, ID_PROJ_REVERT, self._OnRevert)          EVT_BUTTON(self, ID_PROJ_REVERT, self._OnRevert)
102          EVT_BUTTON(self, ID_PROJ_OK, self._OnOK)          EVT_BUTTON(self, wxID_OK, self.OnOK)
103          EVT_BUTTON(self, ID_PROJ_CLOSE, self._OnClose)          EVT_BUTTON(self, wxID_CANCEL, self.OnCancel)
         EVT_BUTTON(self, ID_PROJ_ADVANCED, self._OnAdvanced)  
104          EVT_CHOICE(self, ID_PROJ_PROJCHOICE, self._OnProjChoice)          EVT_CHOICE(self, ID_PROJ_PROJCHOICE, self._OnProjChoice)
105          EVT_LISTBOX(self, ID_PROJ_AVAIL, self._OnProjAvail)          EVT_LISTBOX(self, ID_PROJ_AVAIL, self._OnProjAvail)
106            EVT_BUTTON(self, ID_PROJ_IMPORT, self._OnImport)
107            EVT_BUTTON(self, ID_PROJ_EXPORT, self._OnExport)
108            EVT_BUTTON(self, ID_PROJ_REMOVE, self._OnRemove)
109    
110          EVT_BUTTON(self, ID_PROJ_NEW, self._OnNew)          EVT_BUTTON(self, ID_PROJ_NEW, self._OnNew)
111          EVT_BUTTON(self, ID_PROJ_SAVEAS, self._OnSave)          EVT_BUTTON(self, ID_PROJ_SAVE, self._OnSave)
112            EVT_BUTTON(self, ID_PROJ_ADDTOLIST, self._OnAddToList)
113    
114      def GetReceiver(self):          EVT_TEXT(self, ID_PROJ_PROJNAME, self._OnProjName)
         return self.receiver  
115    
     def _OnTry(self, event):  
         self.__SetProjection()  
116    
117      def _OnRevert(self, event):      def OnApply(self, event):
118          if self.originalProjection != -1:          self.__SetProjection()
119              self.receiver.SetProjection(self.originalProjection)          self.haveTried = True
120    
121      def _OnOK(self, event):      def OnOK(self, event):
122          self.__SetProjection()          self.__SetProjection()
123          self.Close()          self.Close()
124    
125      def _OnClose(self, event):      def OnCancel(self, event):
126            """Cancel just closes the dialog, but we call it cancel so we
127            can overload the functionality of wxDialog.
128            """
129          self.Close()          self.Close()
130    
131      def _OnAdvanced(self, event):      def _OnRevert(self, event):
132          self.sizer_edit.GetStaticBox().Show(True)          if self.haveTried:
133          self.sizer_mainctrls.Show(self.sizer_edit, True)              self.receiver.SetProjection(self.originalProjection)
134          self.topBox.Fit(self)              self.haveTried = False
         self.topBox.SetSizeHints(self)  
         self.topBox.Layout()  
135    
         self.editing = True  
136    
137          self.__DoOnProjAvail()      def _OnNew(self, event):
138    
139          self.button_advanced.Enable(False)          # clear all selections
140            sel = self.availprojs.GetSelections()
141            for index in sel:
142                self.availprojs.SetSelection(index, False)
143    
     def _OnNew(self, event):  
         print "_OnNew"  
         self.availprojs.SetSelection(-1)  
144          self.projname.Clear()          self.projname.Clear()
145    
146            # supply a projection panel if there wasn't one
147            if self.curProjPanel is None:
148                self.projchoice.SetSelection(0)
149                self.__DoOnProjChoice()
150    
151          self.curProjPanel.Clear()          self.curProjPanel.Clear()
152    
153      def _OnSave(self, event):      def _OnSave(self, event):
154          print "_OnSave"  
155            sel = self.availprojs.GetSelections()
156            assert len(sel) == 1,  "button shouldn't be enabled"
157    
158            proj, projfile = self.availprojs.GetClientData(sel[0])
159    
160            assert proj is not None and projfile is not None
161    
162            newproj = self.__GetProjection()
163    
164            if newproj is not None:
165                projfile.Replace(proj, newproj)
166                try:
167                    WriteProjFile(projfile)
168                except IOError, (errno, errstr):
169                    self.__ShowError(projfile.GetFilename(), errstr)
170                self.availprojs.SetClientData(sel[0], [newproj, projfile])
171    
172        def _OnAddToList(self, event):
173    
174            proj = self.__GetProjection()
175            if proj is not None:
176                self.__usrProjFile.Add(proj)
177                try:
178                    WriteProjFile(self.__usrProjFile)
179                except IOError, (errno, errstr):
180                    self.__ShowError(self.__userProjFile.GetFilename(), errstr)
181    
182                self.__FillAvailList()
183    
184      def _OnProjAvail(self, event):      def _OnProjAvail(self, event):
185          self.__DoOnProjAvail()          self.__DoOnProjAvail()
186    
187        def _OnImport(self, event):
188    
189            dlg = wxFileDialog(self, _("Import"), style = wxOPEN)
190    
191            if dlg.ShowModal() == wxID_OK:
192                path = dlg.GetPath()
193    
194                try:
195                    projFile = ReadProjFile(path)
196                    for proj in projFile.GetProjections():
197                        self.__usrProjFile.Add(proj)
198                    WriteProjFile(self.__usrProjFile)
199                except IOError, (errno, errstr):
200                    self.__ShowError(dlg.GetPath(), errstr)
201    
202                self.__FillAvailList()
203    
204            dlg.Destroy()
205    
206        def _OnExport(self, event):
207    
208            sel = self.availprojs.GetSelections()
209            assert len(sel) != 0, "button should be disabled"
210    
211            dlg = wxFileDialog(self, _("Export"),
212                            style = wxSAVE|wxOVERWRITE_PROMPT)
213    
214            if dlg.ShowModal() == wxID_OK:
215                path = dlg.GetPath()
216    
217                projFile = ProjFile(path)
218    
219                for i in sel:
220                    proj = self.availprojs.GetClientData(i)[CLIENT_PROJ]
221                    if proj is not None:
222                        projFile.Add(proj)
223    
224                try:
225                    WriteProjFile(projFile)
226                except IOError, (errno, errstr):
227                    self.__ShowError(dlg.GetPath(), errstr)
228    
229            dlg.Destroy()
230    
231        def _OnRemove(self, event):
232    
233            sel = self.availprojs.GetSelections()
234            assert len(sel) != 0, "button should be disabled!"
235    
236            #
237            # remove the items backwards so the indices don't change
238            #
239            sel = list(sel)
240            sel.sort()
241            sel.reverse()
242    
243            newselection = -1
244            if len(sel) == 1:
245                newselection = sel[0] - 1
246                if newselection < 0:
247                    newselection = 0
248    
249            for i in sel:
250                proj, projfile = self.availprojs.GetClientData(i)
251    
252                #
253                # this could be the case if they selected <None> or
254                # the currently used projection
255                #
256                if proj is not None and projfile is not None:
257                    projfile.Remove(proj)
258    
259            try:
260                WriteProjFile(projfile)
261            except IOError, (errno, errstr):
262                self.__ShowError(projfile.GetFilename(), errstr)
263    
264            self.__FillAvailList()
265    
266            #
267            # this *could* produce incorrect results if the .proj files
268            # change between the last list update and this selection
269            # because the list has been repopulated.
270            #
271            if newselection != -1 and self.availprojs.GetCount() > 0:
272                self.availprojs.SetSelection(newselection)
273    
274            self.__VerifyButtons()
275    
276        def _OnProjName(self, event):
277            self.__VerifyButtons()
278    
279        def __ShowError(self, filename, errstr):
280            wxMessageDialog(self,
281                _("The following error occured:\n") +
282                filename + "\n" + errstr,
283                _("Error"), wxOK | wxICON_ERROR).ShowModal()
284    
285        def __VerifyButtons(self):
286            """Enable or disable the appropriate buttons based on the
287            current state of the dialog.
288            """
289    
290            sel = self.availprojs.GetSelections()
291    
292            self.button_import.Enable(True)
293            self.button_export.Enable(True)
294            self.button_save.Enable(True)
295            self.button_remove.Enable(True)
296    
297            self.panel_edit.Enable(True)
298    
299            for ctrl in [self.button_import,
300                         self.button_export,
301                         self.button_remove,
302                         self.button_save,
303                         self.button_add,
304                         self.projchoice,
305                         self.projname,
306                         self.panel_edit]:
307                ctrl.Enable(True)
308    
309            if self.curProjPanel is not None:
310                self.curProjPanel.Enable(True)
311    
312            if len(sel) == 0:
313                self.button_import.Enable(True)
314                self.button_export.Enable(False)
315                self.button_remove.Enable(False)
316                self.button_save.Enable(False)
317    
318            elif len(sel) == 1:
319    
320                proj, projFile = self.availprojs.GetClientData(sel[0])
321    
322                self.button_save.Enable(len(self.projname.GetValue()) > 0)
323                self.button_add.Enable(len(self.projname.GetValue()) > 0)
324    
325                if proj is None:
326                    # <None> is selected
327                    for ctrl in [self.button_export,
328                                 self.button_remove,
329                                 self.button_save,
330                                 self.button_add,
331                                 self.projchoice,
332                                 self.projname]:
333                        ctrl.Enable(False)
334    
335                    if self.curProjPanel is not None:
336                        self.curProjPanel.Enable(False)
337    
338                elif proj is self.originalProjection:
339                    self.button_remove.Enable(False)
340    
341                if projFile is None:
342                    self.button_save.Enable(False)
343    
344            else:
345                self.panel_edit.Enable(False)
346    
347      def __DoOnProjAvail(self):      def __DoOnProjAvail(self):
         print "_OnProjAvail"  
348    
349          if not self.editing: return          sel = self.availprojs.GetSelections()
350            if len(sel) == 1:
351    
352                proj = self.availprojs.GetClientData(sel[0])[CLIENT_PROJ]
353                projfile = self.availprojs.GetClientData(sel[0])[CLIENT_PROJFILE]
354    
355                if proj is None:
356                    # user selected <None>
357                    self.projname.Clear()
358                    
359                else:
360                
361                    if projfile is not None:
362                        self.projfilepath.SetLabel(projfile.GetFilename())
363                    else:
364                        # only None if the currently used projection is selected
365                        self.projfilepath.SetLabel("")
366    
367                    self.projname.SetValue(proj.GetName())
368    
369                    myProjType = proj.GetParameter("proj")
370                    i = 0
371                    for projType, name, clazz in self.projPanels:
372                        if myProjType == projType:
373                            self.projchoice.SetSelection(i)
374                            self.__DoOnProjChoice()
375    
376                            #
377                            # self.curProjPanel should not be null
378                            # after a call to __DoOnProjChoice
379                            #
380                            assert self.curProjPanel is not None
381    
382          sel = self.availprojs.GetSelection()                          self.curProjPanel.SetProjection(proj)
383          if sel == -1: return                      i += 1
384    
385          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  
386    
387      def _OnProjChoice(self, event):      def _OnProjChoice(self, event):
388          self.__DoOnProjChoice()          self.__DoOnProjChoice()
389    
390      def __DoOnProjChoice(self):      def __DoOnProjChoice(self):
391          print "_OnProjChoice()"          """Create and layout a projection panel based on the selected
392          choice = self.projchoice          projection type.
393    
394          sel = choice.GetSelection()          This is necessary to have in seperate method since calls to
395          if sel == -1: return          wxChoice.SetSelection() do not trigger an event.
396    
397            At the end of this method self.curProjPanel will not be None
398            if there was a item selected.
399            """
400    
401          clazz, obj = choice.GetClientData(choice.GetSelection())          choice = self.projchoice
402    
403          if obj is None:          sel = choice.GetSelection()
404              obj = clazz(self)          if sel != -1:
             choice.SetClientData(sel, [clazz, obj])  
405    
406          if self.curProjPanel is not None:              clazz, obj = choice.GetClientData(sel)
             self.curProjPanel.Hide()  
             self.sizer_projctrls.Remove(self.curProjPanel)  
407    
408          self.curProjPanel = obj              if obj is None:
409          self.curProjPanel.Show()                  obj = clazz(self.panel_edit, self.receiver)
410                    choice.SetClientData(sel, [clazz, obj])
411    
412          print "++", self.topBox.GetSize(), self.GetSize()              if self.curProjPanel is not None:
413          print "!!", self.sizer_projctrls.GetSize(), \                  self.curProjPanel.Hide()
414                      self.sizer_edit.GetSize(), \                  self.sizer_projctrls.Remove(self.curProjPanel)
                     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)  
415    
416          #self.sizer_panel.Fit(self.panel_1)              self.curProjPanel = obj
417          self.topBox.Fit(self)              self.curProjPanel.Show()
         #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()  
418    
419                                self.sizer_projctrls.Add(self.curProjPanel, 1,
420                    wxALL|wxEXPAND|wxADJUST_MINSIZE, 3)
421                self.sizer_projctrls.Layout()
422                self.Layout()
423                self.topBox.SetSizeHints(self)
424    
425      def __SetProjection(self):      def __SetProjection(self):
426            """Set the receiver's projection."""
427    
428          #          #
429          # save the original projection only once in case          # save the original projection only once in case
430          # we try to apply several different projections          # we try to apply several different projections
431          #          #
432          if self.originalProjection == -1:          self.receiver.SetProjection(self.__GetProjection())
             self.originalProjection = self.receiver.GetProjection()  
433    
434          sel = self.availprojs.GetSelection()      def __GetProjection(self):
435          proj = -1          """Return a suitable Projection object based on the current
436            state of the dialog box selections.
437    
438          if self.editing:          Could be None.
439              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)  
440    
441            sel = self.availprojs.GetSelections()
442            assert len(sel) < 2, "button should be disabled"
443    
     def __set_properties(self):  
         self.availprojs.Append("<None>", None)  
444    
445          projfiles = GetSystemProjFiles()          if len(sel) == 1:
446          for projfile in projfiles:              proj = self.availprojs.GetClientData(sel[0])[CLIENT_PROJ]
447              for proj in projfile.GetProjections():              if proj is None:
448                  self.availprojs.Append(proj.GetName(), proj)                  # <None> is selected
449                    return None
450          projfiles = GetUserProjFiles()  
451          for projfile in projfiles:          #
452              for proj in projfile.GetProjections():          # self.curProjPanel should always contain the most
453                  self.availprojs.Append(proj.GetName(), proj)          # relevant data for a projection
454            #
455            if self.curProjPanel is not None:
456                return Projection(self.curProjPanel.GetParameters(),
457                                  self.projname.GetValue())
458    
459            return None
460    
461        def __FillAvailList(self, selectCurrent = False):
462            """Populate the list of available projections.
463            
464            selectCurrent -- if True, select the projection used by
465                             the receiver, otherwise select nothing.
466            """
467    
468            self.availprojs.Clear()
469    
470            #
471            # We add the current projection to the list first so that
472            # we are sure that it's at index 0. That way we can
473            # set the selection with confidence. The problem is the
474            # the list is automatically sorted when an item is appended
475            # and the index of where it was inserted is not returned.
476            #
477          proj = self.receiver.GetProjection()          proj = self.receiver.GetProjection()
478          if proj is not None:          if proj is not None:
479              self.availprojs.Append("## " + proj.GetName() + " ##", proj)              self.availprojs.Append(_("%s (current)") % proj.GetName(),
480                                       [proj, None])
481                if selectCurrent:
482                    self.availprojs.SetSelection(0)
483                    self.availprojs.SetFirstItem(0)
484    
485            #
486            # the list can never be empty. there will always be
487            # at least this one item
488            #
489            self.availprojs.Append("<None>", (None, None))
490    
491            # proj is only None when <None> should be selected
492            if proj is None and selectCurrent:
493                self.availprojs.SetSelection(0)
494                self.availprojs.SetFirstItem(0)
495    
496            projfile = GetSystemProjFiles()
497            projfile = projfile[0]
498            for proj in projfile.GetProjections():
499                self.availprojs.Append(proj.GetName(), [proj, projfile])
500            self.__sysProjFile = projfile
501    
502            projfile = GetUserProjFiles()
503            projfile = projfile[0]
504            for proj in projfile.GetProjections():
505                self.availprojs.Append(proj.GetName(), [proj, projfile])
506            self.__usrProjFile = projfile
507    
508          for proj, name, clazz in self.projPanels:          for proj, name, clazz in self.projPanels:
509              self.projchoice.Append(name, [clazz, None])              self.projchoice.Append(name, [clazz, None])
510    
511          # begin wxGlade: ProjFrame.__set_properties      def __set_properties(self):
512          self.SetTitle(_("Projections"))  
513          self.availprojs.SetSelection(0)          #self.availprojs.SetSelection(0)
514          self.projchoice.SetSelection(0)          self.projchoice.SetSelection(0)
515          # end wxGlade  
516            self.__FillAvailList(selectCurrent = True)
517    
518            self.projname.SetMaxLength(32)
519    
520      def __do_layout(self):      def __do_layout(self):
521          # begin wxGlade: ProjFrame.__do_layout          # originally generated by wxGlade
522    
523          self.topBox = wxBoxSizer(wxVERTICAL)          self.topBox = wxBoxSizer(wxVERTICAL)
524          self.sizer_panel = wxBoxSizer(wxVERTICAL)          self.sizer_panel = wxBoxSizer(wxVERTICAL)
525          sizer_6 = wxBoxSizer(wxHORIZONTAL)          sizer_6 = wxBoxSizer(wxHORIZONTAL)
526          self.sizer_mainctrls = wxBoxSizer(wxHORIZONTAL)          self.sizer_mainctrls = wxBoxSizer(wxHORIZONTAL)
527          self.sizer_edit = wxStaticBoxSizer(wxStaticBox(self.panel_1, -1, _("Edit")), wxHORIZONTAL)          self.sizer_edit = wxStaticBoxSizer(wxStaticBox(self.panel_edit, -1, _("Edit")), wxHORIZONTAL)
528          sizer_11 = wxBoxSizer(wxVERTICAL)          sizer_11 = wxBoxSizer(wxVERTICAL)
529          self.sizer_projctrls = wxBoxSizer(wxVERTICAL)          self.sizer_projctrls = wxBoxSizer(wxVERTICAL)
530          sizer_14 = wxBoxSizer(wxHORIZONTAL)          sizer_14 = wxBoxSizer(wxHORIZONTAL)
531          sizer_13 = wxBoxSizer(wxHORIZONTAL)          sizer_13 = wxBoxSizer(wxHORIZONTAL)
532          grid_sizer_1 = wxFlexGridSizer(2, 2, 0, 0)          sizer_15 = wxBoxSizer(wxVERTICAL)
533            sizer_15.Add(self.button_import, 0, wxALL, 4)
534            sizer_15.Add(self.button_export, 0, wxALL, 4)
535            sizer_15.Add(20, 20, 0, wxEXPAND, 0)
536            sizer_15.Add(self.button_remove, 0, wxALL|wxALIGN_BOTTOM, 4)
537    
538            # list controls
539            grid_sizer_1 = wxFlexGridSizer(3, 2, 0, 0)
540          grid_sizer_1.Add(self.label_5, 0, wxLEFT|wxRIGHT|wxTOP, 4)          grid_sizer_1.Add(self.label_5, 0, wxLEFT|wxRIGHT|wxTOP, 4)
541          grid_sizer_1.Add(20, 20, 0, wxEXPAND, 0)          grid_sizer_1.Add(20, 20, 0, wxEXPAND, 0)
542          grid_sizer_1.Add(self.availprojs, 1, wxALL|wxEXPAND, 4)          grid_sizer_1.Add(self.availprojs, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)
543          grid_sizer_1.Add(self.button_advanced, 0, wxALL, 4)          grid_sizer_1.Add(sizer_15, 0, wxALL|wxEXPAND, 4)
544            grid_sizer_1.Add(self.projfilepath, 0, wxALL|wxADJUST_MINSIZE, 4)
545          grid_sizer_1.AddGrowableRow(1)          grid_sizer_1.AddGrowableRow(1)
546          grid_sizer_1.AddGrowableCol(0)          grid_sizer_1.AddGrowableCol(0)
547          self.sizer_mainctrls.Add(grid_sizer_1, 1, wxEXPAND, 0)  
548            # edit controls
549          sizer_13.Add(self.label_2, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)          sizer_13.Add(self.label_2, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)
550          sizer_13.Add(self.projname, 1, wxALL, 4)          sizer_13.Add(self.projname, 1, wxALL, 4)
551          self.sizer_projctrls.Add(sizer_13, 0, wxEXPAND, 0)          self.sizer_projctrls.Add(sizer_13, 0, wxEXPAND, 0)
552          sizer_14.Add(self.label_3, 0, wxALL|wxALIGN_CENTER_VERTICAL, 4)          sizer_14.Add(self.label_3, 0, wxALL, 4)
553          sizer_14.Add(self.projchoice, 1, wxALL|wxEXPAND, 4)          sizer_14.Add(self.projchoice, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)
554          self.sizer_projctrls.Add(sizer_14, 0, wxEXPAND, 0)          self.sizer_projctrls.Add(sizer_14, 0, wxEXPAND, 0)
555          self.sizer_edit.Add(self.sizer_projctrls, 1, wxEXPAND, 0)          self.sizer_edit.Add(self.sizer_projctrls, 1, wxEXPAND, 0)
556          sizer_11.Add(self.button_new, 0, wxALL|wxEXPAND, 4)          sizer_11.Add(self.button_new, 0, wxALL|wxEXPAND, 4)
557          sizer_11.Add(self.button_saveas, 0, wxALL|wxEXPAND, 4)          sizer_11.Add(self.button_save, 0, wxALL|wxEXPAND, 4)
558            sizer_11.Add(self.button_add, 0, wxALL|wxEXPAND, 4)
559          self.sizer_edit.Add(sizer_11, 0, wxALL|wxEXPAND, 4)          self.sizer_edit.Add(sizer_11, 0, wxALL|wxEXPAND, 4)
560          self.sizer_mainctrls.Add(self.sizer_edit, 0, wxALL|wxEXPAND, 4)  
         self.sizer_panel.Add(self.sizer_mainctrls, 1, wxEXPAND, 0)  
561          sizer_6.Add(20, 20, 1, wxEXPAND, 0)          sizer_6.Add(20, 20, 1, wxEXPAND, 0)
562          sizer_6.Add(self.button_try, 0, wxALL, 4)          sizer_6.Add(self.button_try, 0, wxALL, 4)
563          sizer_6.Add(20, 20, 1, 0, 0)          sizer_6.Add(20, 20, 1, 0, 0)
# Line 288  class ProjFrame(NonModalDialog): Line 567  class ProjFrame(NonModalDialog):
567          sizer_6.Add(20, 20, 1, 0, 0)          sizer_6.Add(20, 20, 1, 0, 0)
568          sizer_6.Add(self.button_close, 0, wxALL, 4)          sizer_6.Add(self.button_close, 0, wxALL, 4)
569          sizer_6.Add(20, 20, 1, wxEXPAND, 0)          sizer_6.Add(20, 20, 1, wxEXPAND, 0)
570          self.sizer_panel.Add(sizer_6, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 0)  
571          self.panel_1.SetAutoLayout(1)          self.panel_1.SetAutoLayout(1)
572          self.panel_1.SetSizer(self.sizer_panel)          self.panel_1.SetSizer(grid_sizer_1)
573          self.sizer_panel.Fit(self.panel_1)          grid_sizer_1.Fit(self.panel_1)
574          self.sizer_panel.SetSizeHints(self.panel_1)          grid_sizer_1.SetSizeHints(self.panel_1)
575          self.topBox.Add(self.panel_1, 1, wxEXPAND, 0)  
576            self.panel_edit.SetAutoLayout(1)
577            self.panel_edit.SetSizer(self.sizer_edit)
578            self.sizer_edit.Fit(self.panel_edit)
579            self.sizer_edit.SetSizeHints(self.panel_edit)
580    
581            self.panel_buttons.SetAutoLayout(1)
582            self.panel_buttons.SetSizer(sizer_6)
583            sizer_6.Fit(self.panel_buttons)
584            sizer_6.SetSizeHints(self.panel_buttons)
585    
586            self.sizer_mainctrls.Add(self.panel_1, 0,
587                wxALL|wxEXPAND|wxADJUST_MINSIZE, 0)
588            self.sizer_mainctrls.Add(self.panel_edit, 1,
589                wxALL|wxEXPAND|wxADJUST_MINSIZE, 0)
590    
591            self.topBox.Add(self.sizer_mainctrls, 1, wxALL|wxEXPAND, 4)
592            self.topBox.Add(self.panel_buttons, 0, wxEXPAND, 0)
593    
594          self.SetAutoLayout(1)          self.SetAutoLayout(1)
595          self.SetSizer(self.topBox)          self.SetSizer(self.topBox)
596          self.topBox.Fit(self)          self.topBox.Fit(self)
597          self.topBox.SetSizeHints(self)          self.topBox.SetSizeHints(self)
598          self.Layout()          self.Layout()
         # end wxGlade  
599    
600  # end of class ProjFrame  # end of class ProjFrame
601    
# Line 311  class ProjPanel(wxPanel): Line 607  class ProjPanel(wxPanel):
607          wxPanel.__init__(self, parent, -1)          wxPanel.__init__(self, parent, -1)
608    
609          self.__ellps = wxChoice(self, -1)          self.__ellps = wxChoice(self, -1)
610          self.ellpsData = [("bessel", _("Bessel 1841")),          self.ellpsData = [("airy"  , _("Airy")),
611                              ("bessel", _("Bessel 1841")),
612                            ("clrk66", _("Clarke 1866")),                            ("clrk66", _("Clarke 1866")),
613                            ("clrk80", _("Clarke 1880")),                            ("clrk80", _("Clarke 1880")),
614                            ("GRS80" , _("GRS 1980 (IUGG, 1980)")),                            ("GRS80" , _("GRS 1980 (IUGG, 1980)")),
# Line 328  class ProjPanel(wxPanel): Line 625  class ProjPanel(wxPanel):
625          panelSizer = wxBoxSizer(wxVERTICAL)          panelSizer = wxBoxSizer(wxVERTICAL)
626    
627          if childPanel is not None:          if childPanel is not None:
628              panelSizer.Add(childPanel, 0, wxALL|wxEXPAND, 4)              panelSizer.Add(childPanel, 0, wxEXPAND, 0)
629                            
630          sizer = wxBoxSizer(wxHORIZONTAL)          sizer = wxBoxSizer(wxHORIZONTAL)
631          sizer.Add(wxStaticText(self, -1, _("Ellipsoid:")), 0, wxALL, 4)          sizer.Add(wxStaticText(self, -1, _("Ellipsoid:")), 0, wxALL, 4)
632          sizer.Add(self.__ellps, 1, wxALL|wxEXPAND, 4)          sizer.Add(self.__ellps, 1, wxALL|wxEXPAND|wxADJUST_MINSIZE, 4)
633          panelSizer.Add(sizer, 0, wxALL|wxEXPAND, 4)          panelSizer.Add(sizer, 0, wxALL|wxEXPAND, 4)
634    
635          self.SetAutoLayout(1)          self.SetAutoLayout(1)
# Line 357  class ProjPanel(wxPanel): Line 654  class ProjPanel(wxPanel):
654          self.__ellps.SetSelection(0)          self.__ellps.SetSelection(0)
655    
656      def GetParameters(self):      def GetParameters(self):
         print "asdfsdf"  
657          return ["ellps=" + self.__ellps.GetClientData(          return ["ellps=" + self.__ellps.GetClientData(
658                                          self.__ellps.GetSelection())]                                          self.__ellps.GetSelection())]
659    
# Line 369  ID_TMPANEL_FALSE_NORTH = 4004 Line 665  ID_TMPANEL_FALSE_NORTH = 4004
665  ID_TMPANEL_SCALE = 4005  ID_TMPANEL_SCALE = 4005
666    
667  class UnknownProjPanel(ProjPanel):  class UnknownProjPanel(ProjPanel):
668      def __init__(self, parent):      def __init__(self, parent, receiver):
669          ProjPanel.__init__(self, parent)          ProjPanel.__init__(self, parent)
670    
671          self._DoLayout()          self._DoLayout()
# Line 394  class UnknownProjPanel(ProjPanel): Line 690  class UnknownProjPanel(ProjPanel):
690          return None          return None
691    
692  class TMPanel(ProjPanel):  class TMPanel(ProjPanel):
693      """Projection panel for Transverse Mercartor."""      """Projection panel for Transverse Mercator."""
694    
695      def __init__(self, parent):      def __init__(self, parent, receiver):
696          ProjPanel.__init__(self, parent)          ProjPanel.__init__(self, parent)
697    
698          self.__latitude = wxTextCtrl(self, ID_TMPANEL_LAT)          self.__latitude = wxTextCtrl(self, ID_TMPANEL_LAT)
# Line 424  class TMPanel(ProjPanel): Line 720  class TMPanel(ProjPanel):
720          ProjPanel._DoLayout(self, sizer)          ProjPanel._DoLayout(self, sizer)
721    
722      def GetProjName(self):      def GetProjName(self):
723          return _("Transverse Mercartor")          return _("Transverse Mercator")
724    
725      def SetProjection(self, proj):      def SetProjection(self, proj):
726          ProjPanel.SetProjection(self, proj)          ProjPanel.SetProjection(self, proj)
# Line 438  class TMPanel(ProjPanel): Line 734  class TMPanel(ProjPanel):
734          ProjPanel.SetProjection(self, proj)          ProjPanel.SetProjection(self, proj)
735    
736      def GetParameters(self):      def GetParameters(self):
         print "** asdfsdf"  
737          params = ["proj=tmerc",          params = ["proj=tmerc",
738                    "lat_0=" + self.__latitude.GetValue(),                    "lat_0=" + self.__latitude.GetValue(),
739                    "lon_0=" + self.__longitude.GetValue(),                    "lon_0=" + self.__longitude.GetValue(),
# Line 462  ID_UTMPANEL_SOUTH = 4002 Line 757  ID_UTMPANEL_SOUTH = 4002
757  ID_UTMPANEL_PROP = 4003  ID_UTMPANEL_PROP = 4003
758    
759  class UTMPanel(ProjPanel):  class UTMPanel(ProjPanel):
760      """Projection Panel for Universal Transverse Mercartor."""      """Projection Panel for Universal Transverse Mercator."""
761    
762      def __init__(self, parent):      def __init__(self, parent, receiver):
763          ProjPanel.__init__(self, parent)          ProjPanel.__init__(self, parent)
764    
765          self.parent = parent          self.receiver = receiver
766    
767          self.__zone = wxSpinCtrl(self, ID_UTMPANEL_ZONE, "1", min=1, max=60)          self.__zone = wxSpinCtrl(self, ID_UTMPANEL_ZONE, "1", min=1, max=60)
768            self.__propButton = wxButton(self, ID_UTMPANEL_PROP, _("Propose"))
769          self.__south = wxCheckBox(self, ID_UTMPANEL_SOUTH,          self.__south = wxCheckBox(self, ID_UTMPANEL_SOUTH,
770                                    _("Southern Hemisphere"))                                    _("Southern Hemisphere"))
         self.__propButton = wxButton(self, ID_UTMPANEL_PROP, _("Propose"))  
771    
772          self._DoLayout()          self._DoLayout()
773    
# Line 491  class UTMPanel(ProjPanel): Line 786  class UTMPanel(ProjPanel):
786          ProjPanel._DoLayout(self, sizer)          ProjPanel._DoLayout(self, sizer)
787    
788      def GetProjName(self):      def GetProjName(self):
789          return _("Universal Transverse Mercartor")          return _("Universal Transverse Mercator")
790    
791      def SetProjection(self, proj):      def SetProjection(self, proj):
792          self.__zone.SetValue(int(proj.GetParameter("zone")))          self.__zone.SetValue(int(proj.GetParameter("zone")))
# Line 499  class UTMPanel(ProjPanel): Line 794  class UTMPanel(ProjPanel):
794          ProjPanel.SetProjection(self, proj)          ProjPanel.SetProjection(self, proj)
795    
796      def GetParameters(self):      def GetParameters(self):
         print "** asdfsdf"  
797          params = ["proj=utm", "zone=" + str(self.__zone.GetValue())]          params = ["proj=utm", "zone=" + str(self.__zone.GetValue())]
798          if self.__south.IsChecked():          if self.__south.IsChecked():
799              params.append("south")              params.append("south")
# Line 514  class UTMPanel(ProjPanel): Line 808  class UTMPanel(ProjPanel):
808    
809      def _OnPropose(self, event):      def _OnPropose(self, event):
810          UTMProposeZoneDialog          UTMProposeZoneDialog
811          dlg = UTMProposeZoneDialog(self, self.parent.GetReceiver().BoundingBox())          dlg = UTMProposeZoneDialog(self, self.receiver.BoundingBox())
812          if dlg.ShowModal() == wxID_OK:          if dlg.ShowModal() == wxID_OK:
813              self.__zone.SetValue(dlg.GetProposedZone())              self.__zone.SetValue(dlg.GetProposedZone())
814    
815  class LCCPanel(ProjPanel):  class LCCPanel(ProjPanel):
816      """Projection Panel for Lambert Conic Conformal."""      """Projection Panel for Lambert Conic Conformal."""
817    
818      def __init__(self, parent):      def __init__(self, parent, receiver):
819          ProjPanel.__init__(self, parent)          ProjPanel.__init__(self, parent)
820                    
821          self.__fspLatitude = wxTextCtrl(self, -1)          self.__fspLatitude = wxTextCtrl(self, -1)
# Line 591  class LCCPanel(ProjPanel): Line 885  class LCCPanel(ProjPanel):
885  class GeoPanel(ProjPanel):  class GeoPanel(ProjPanel):
886      """Projection Panel for a Geographic Projection."""      """Projection Panel for a Geographic Projection."""
887    
888      def __init__(self, parent):      def __init__(self, parent, receiver):
889          ProjPanel.__init__(self, parent)          ProjPanel.__init__(self, parent)
890          ProjPanel._DoLayout(self, None)  
891            self.__choices = [(_("Degrees"), "0.017453"),
892                              (_("Radians"), "1")]
893    
894            self.__scale = wxChoice(self, -1)
895            for choice, value in self.__choices:
896                self.__scale.Append(choice, value)
897    
898            self._DoLayout()
899    
900      def GetProjName(self):      def GetProjName(self):
901          return _("Geographic")          return _("Geographic")
902                    
903      def SetProjection(self, proj):      def SetProjection(self, proj):
904            value = proj.GetParameter("to_meter")
905            for i in range(len(self.__choices)):
906                choice, data = self.__choices[i]
907                if value == data:
908                    self.__scale.SetSelection(i)
909          ProjPanel.SetProjection(self, proj)          ProjPanel.SetProjection(self, proj)
910    
911      def GetParameters(self):      def GetParameters(self):
912          params = ["proj=latlong"]          params = ["proj=latlong",
913                      "to_meter=%s" % self.__scale.GetClientData(
914                                      self.__scale.GetSelection())]
915    
916          params.extend(ProjPanel.GetParameters(self))          params.extend(ProjPanel.GetParameters(self))
917          return params          return params
918    
919      def Clear(self):      def Clear(self):
920          ProjPanel.Clear(self)          ProjPanel.Clear(self)
921    
922        def _DoLayout(self):
923            sizer = wxBoxSizer(wxHORIZONTAL)
924    
925            sizer.Add(wxStaticText(self, -1, _("Source Data is in: ")),
926                      0, wxALL, 4)
927            sizer.Add(self.__scale, 1, wxEXPAND|wxALL, 4)
928    
929            self.__scale.SetSelection(0)
930    
931            ProjPanel._DoLayout(self, sizer)
932    
933    
934  ID_UTM_PROPOSE_ZONE_DIALOG_TAKE   = 4001  ID_UTM_PROPOSE_ZONE_DIALOG_TAKE   = 4001
935  ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL = 4002  ID_UTM_PROPOSE_ZONE_DIALOG_CANCEL = 4002

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26