/[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 1150 - (show annotations)
Wed Jun 11 10:45:49 2003 UTC (21 years, 8 months ago) by frank
Original Path: trunk/thuban/Thuban/UI/application.py
File MIME type: text/x-python
File size: 7055 byte(s)
(ThubanApplication.read_startup_files): Use get_application_dir.

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