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

Contents of /branches/WIP-pyshapelib-bramz/Thuban/UI/application.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1162 - (show annotations)
Thu Jun 12 12:41:16 2003 UTC (21 years, 8 months ago) by jonathan
Original Path: trunk/thuban/Thuban/UI/application.py
File MIME type: text/x-python
File size: 7898 byte(s)
(ThubanApplication.OpenSession):
        Display a message box if the gdal library is not available, but
        only if there are any layers that would use it. Addresses RTbug #1877.

1 # Copyright (C) 2001, 2002, 2003 by Intevation GmbH
2 # Authors:
3 # Jan-Oliver Wagner <[email protected]>
4 # Bernhard Herzog <[email protected]>
5 #
6 # This program is free software under the GPL (>=v2)
7 # Read the file COPYING coming with Thuban for details.
8
9 """
10 Thuban's application object.
11 """
12
13 __version__ = "$Revision$"
14
15 import sys, os
16 import os.path
17
18 import traceback
19
20 from wxPython.wx import *
21
22 from Thuban.Lib.connector import Publisher
23 from Thuban.Lib.fileutil import get_application_dir
24
25 from Thuban import _
26 from Thuban.Model.session import create_empty_session
27 from Thuban.Model.save import save_session
28 from Thuban.Model.load import load_session
29 from Thuban.Model.messages import MAPS_CHANGED
30 from Thuban.Model.layer import RasterLayer
31 import Thuban.Model.resource
32
33 import view
34 import tree
35 import mainwindow
36
37 from messages import SESSION_REPLACED
38
39
40
41 class ThubanApplication(wxApp, Publisher):
42
43 """
44 Thuban's application class.
45
46 All wxWindows programs have to have an instance of an application
47 class derived from wxApp. In Thuban the application class holds
48 references to the main window and the session.
49 """
50
51 def OnInit(self):
52 self.splash = self.splash_screen()
53 if self.splash is not None:
54 self.splash.Show()
55 self.read_startup_files()
56 self.top = self.CreateMainWindow()
57 self.SetTopWindow(self.top)
58 if self.splash is None:
59 self.ShowMainWindow()
60 self.session = None
61 self.create_session()
62 return True
63
64 def OnExit(self):
65 """Clean up code.
66
67 Extend this in derived classes if needed.
68 """
69 self.session.Destroy()
70 self.session = None
71 Publisher.Destroy(self)
72
73 def read_startup_files(self):
74 """Read the startup files."""
75 # for now the startup file is ~/.thuban/thubanstart.py
76 dir = get_application_dir()
77 if os.path.isdir(dir):
78 sys.path.append(dir)
79 try:
80 import thubanstart
81 except ImportError:
82 tb = sys.exc_info()[2]
83 try:
84 if tb.tb_next is not None:
85 # The ImportError exception was raised from
86 # inside the thubanstart module.
87 sys.stderr.write(_("Cannot import the thubanstart"
88 " module\n"))
89 traceback.print_exc(None, sys.stderr)
90 else:
91 # There's no thubanstart module.
92 sys.stderr.write(_("No thubanstart module available\n"))
93 finally:
94 # make sure we delete the traceback object,
95 # otherwise there's be circular references involving
96 # the current stack frame
97 del tb
98 except:
99 sys.stderr.write(_("Cannot import the thubanstart module\n"))
100 traceback.print_exc(None, sys.stderr)
101 else:
102 # There's no .thuban directory
103 sys.stderr.write(_("No ~/.thuban directory\n"))
104
105 def splash_screen(self):
106 """Create and return a splash screen.
107
108 This method is called by OnInit to determine whether the
109 application should have a splashscreen. If the application
110 should display a splash screen override this method in a derived
111 class and have it create and return the wxSplashScreen instance.
112 The implementation of this method in the derived class should
113 also arranged for ShowMainWindow to be called.
114
115 The default implementation simply returns None so that no splash
116 screen is shown and ShowMainWindow will be called automatically.
117 """
118 return None
119
120 def ShowMainWindow(self):
121 """Show the main window
122
123 Normally this method is automatically called by OnInit to show
124 the main window. However, if the splash_screen method has
125 returned a splashscreen it is expected that the derived class
126 also arranges for ShowMainWindow to be called at the appropriate
127 time.
128 """
129 self.top.Show(True)
130
131 def CreateMainWindow(self):
132 """Create and return the main window for the application.
133
134 Override this in subclasses to instantiate the Thuban mainwindow
135 with different parameters or to use a different class for the
136 main window.
137 """
138 msg = (_("This is the wxPython-based Graphical User Interface"
139 " for exploring geographic data"))
140 return mainwindow.MainWindow(NULL, -1, "Thuban", self, None,
141 initial_message = msg,
142 size = (600, 400))
143
144 def Session(self):
145 """Return the application's session object"""
146 return self.session
147
148 def SetSession(self, session):
149 """Make session the new session.
150
151 Issue SESSION_REPLACED after self.session has become the new
152 session. After the session has been assigned call
153 self.subscribe_session() with the new session and
154 self.unsubscribe_session with the old one.
155 """
156 oldsession = self.session
157 self.session = session
158 self.subscribe_session(self.session)
159 self.issue(SESSION_REPLACED)
160 self.maps_changed()
161 if oldsession is not None:
162 self.unsubscribe_session(oldsession)
163 oldsession.Destroy()
164
165 def subscribe_session(self, session):
166 """Subscribe to some of the sessions channels.
167
168 Extend this method in derived classes if you need additional
169 channels.
170 """
171 session.Subscribe(MAPS_CHANGED, self.maps_changed)
172
173 def unsubscribe_session(self, session):
174 """Unsubscribe from the sessions channels.
175
176 Extend this method in derived classes if you subscribed to
177 additional channels in subscribe_session().
178 """
179 session.Unsubscribe(MAPS_CHANGED, self.maps_changed)
180
181 def create_session(self):
182 """Create a default session.
183
184 Override this method in derived classes to instantiate the
185 session differently or to use a different session class. Don't
186 subscribe to channels here yet. Do that in the
187 subscribe_session() method.
188 """
189 self.SetSession(create_empty_session())
190
191 def OpenSession(self, filename):
192 """Open the session in the file named filename"""
193 # Make sure we deal with an absolute pathname. Otherwise we can
194 # get problems when saving because the saving code expects an
195 # absolute directory name
196 filename = os.path.abspath(filename)
197 session = load_session(filename)
198 session.SetFilename(filename)
199 session.UnsetModified()
200 self.SetSession(session)
201
202 for map in session.Maps():
203 for layer in map.Layers():
204 if isinstance(layer, RasterLayer) \
205 and not Thuban.Model.resource.has_gdal_support():
206 msg = _("The current session contains Image layers,\n" +
207 "but the GDAL library is not available to " +
208 "draw them.")
209 dlg = wx.wxMessageDialog(None,
210 msg,
211 _("Library not available"),
212 wx.wxOK | wx.wxICON_INFORMATION)
213 print msg
214 dlg.ShowModal()
215 dlg.Destroy()
216 break
217
218 def SaveSession(self):
219 save_session(self.session, self.session.filename)
220
221 def maps_changed(self, *args):
222 if self.session.HasMaps():
223 self.top.SetMap(self.session.Maps()[0])
224 else:
225 self.top.SetMap(None)

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26