/[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 699 - (show annotations)
Thu Apr 17 15:20:14 2003 UTC (21 years, 10 months ago) by bh
Original Path: trunk/thuban/Thuban/UI/application.py
File MIME type: text/x-python
File size: 6912 byte(s)
(ThubanApplication.MainLoop): Removed.
In wxPython 2.4 there's no need to extend MainLoop anymore since
wxPython itself makes sure OnExit is called.

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