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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1504 by jonathan, Tue Jul 29 14:28:55 2003 UTC revision 2051 by frank, Wed Jan 21 17:09:15 2004 UTC
# Line 18  import os.path Line 18  import os.path
18  import traceback  import traceback
19    
20  from wxPython.wx import *  from wxPython.wx import *
 from wxPython.lib.dialogs import wxScrolledMessageDialog  
21    
22  from Thuban.Lib.connector import Publisher  from Thuban.Lib.connector import Publisher
23  from Thuban.Lib.fileutil import get_application_dir  from Thuban.Lib.fileutil import get_application_dir
# Line 26  from Thuban.Lib.fileutil import get_appl Line 25  from Thuban.Lib.fileutil import get_appl
25  from Thuban import _  from Thuban import _
26  from Thuban.Model.session import create_empty_session  from Thuban.Model.session import create_empty_session
27  from Thuban.Model.save import save_session  from Thuban.Model.save import save_session
28  from Thuban.Model.load import load_session  from Thuban.Model.load import load_session, LoadCancelled
29  from Thuban.Model.messages import MAPS_CHANGED  from Thuban.Model.messages import MAPS_CHANGED
30  from Thuban.Model.layer import RasterLayer  from Thuban.Model.layer import RasterLayer
31  import Thuban.Model.resource  import Thuban.Model.resource
# Line 34  import Thuban.Model.resource Line 33  import Thuban.Model.resource
33  import view  import view
34  import tree  import tree
35  import mainwindow  import mainwindow
36    import dbdialog
37    import exceptiondialog
38    
39  from messages import SESSION_REPLACED  from messages import SESSION_REPLACED
40    
# Line 49  class ThubanApplication(wxApp, Publisher Line 50  class ThubanApplication(wxApp, Publisher
50      """      """
51    
52      def OnInit(self):      def OnInit(self):
53          sys.excepthook = show_exception_dialog          sys.excepthook = self.ShowExceptionDialog
54          self.splash = self.splash_screen()          self.splash = self.splash_screen()
55          if self.splash is not None:          if self.splash is not None:
56              self.splash.Show()              self.splash.Show()
# Line 60  class ThubanApplication(wxApp, Publisher Line 61  class ThubanApplication(wxApp, Publisher
61              self.ShowMainWindow()              self.ShowMainWindow()
62          self.session = None          self.session = None
63          self.create_session()          self.create_session()
64            self.path={"data":".", "projection":"."}
65          return True          return True
66    
67      def OnExit(self):      def OnExit(self):
# Line 163  class ThubanApplication(wxApp, Publisher Line 165  class ThubanApplication(wxApp, Publisher
165              self.unsubscribe_session(oldsession)              self.unsubscribe_session(oldsession)
166              oldsession.Destroy()              oldsession.Destroy()
167    
168        def SetPath(self, group, filename):
169            """Store the application's default path for file dialogs extracted
170            from a given filename.
171            """
172            self.path[group] = os.path.dirname( filename )
173    
174        def Path(self, group):
175            """Return the application's default path for file dialogs."""
176            return self.path[group]
177    
178      def subscribe_session(self, session):      def subscribe_session(self, session):
179          """Subscribe to some of the sessions channels.          """Subscribe to some of the sessions channels.
180    
# Line 189  class ThubanApplication(wxApp, Publisher Line 201  class ThubanApplication(wxApp, Publisher
201          """          """
202          self.SetSession(create_empty_session())          self.SetSession(create_empty_session())
203    
204      def OpenSession(self, filename):      def OpenSession(self, filename, db_connection_callback = None):
205          """Open the session in the file named filename"""          """Open the session in the file named filename"""
206          # Make sure we deal with an absolute pathname. Otherwise we can          # Make sure we deal with an absolute pathname. Otherwise we can
207          # get problems when saving because the saving code expects an          # get problems when saving because the saving code expects an
208          # absolute directory name          # absolute directory name
209          filename = os.path.abspath(filename)          filename = os.path.abspath(filename)
210          session = load_session(filename)          if db_connection_callback is None:
211                db_connection_callback = self.run_db_param_dialog
212            try:
213                session = load_session(filename,
214                                   db_connection_callback=db_connection_callback)
215            except LoadCancelled:
216                return
217          session.SetFilename(filename)          session.SetFilename(filename)
218          session.UnsetModified()          session.UnsetModified()
219          self.SetSession(session)          self.SetSession(session)
# Line 204  class ThubanApplication(wxApp, Publisher Line 222  class ThubanApplication(wxApp, Publisher
222              for layer in map.Layers():              for layer in map.Layers():
223                  if isinstance(layer, RasterLayer) \                  if isinstance(layer, RasterLayer) \
224                      and not Thuban.Model.resource.has_gdal_support():                      and not Thuban.Model.resource.has_gdal_support():
225                      msg = _("The current session contains Image layers,\n" +                      msg = _("The current session contains Image layers,\n"
226                              "but the GDAL library is not available to " +                              "but the GDAL library is not available to "
227                              "draw them.")                              "draw them.")
228                      dlg = wx.wxMessageDialog(None,                      dlg = wx.wxMessageDialog(None,
229                                               msg,                                               msg,
230                                               _("Library not available"),                                               _("Library not available"),
231                                               wx.wxOK | wx.wxICON_INFORMATION)                                               wx.wxOK | wx.wxICON_INFORMATION)
232                      print msg                      print msg
# Line 216  class ThubanApplication(wxApp, Publisher Line 234  class ThubanApplication(wxApp, Publisher
234                      dlg.Destroy()                      dlg.Destroy()
235                      break                      break
236    
237        def run_db_param_dialog(self, parameters, message):
238            """Implementation of the db_connection_callback for loading sessions"""
239            dlg = dbdialog.DBDialog(None, _("DB Connection Parameters"),
240                                    parameters, message)
241            return dlg.RunDialog()
242    
243    
244      def SaveSession(self):      def SaveSession(self):
245          save_session(self.session, self.session.filename)          save_session(self.session, self.session.filename)
246    
247      def maps_changed(self, *args):      def maps_changed(self, *args):
248            """Subscribed to the session's MAPS_CHANGED messages.
249    
250            Set the toplevel window's map to the map in the session. This is
251            done by calling the window's SetMap method with the map as
252            argument. If the session doesn't have any maps None is used
253            instead.
254    
255            Currently Thuban can only really handle at most one map in a
256            sessions so the first map in the session's list of maps as
257            returned by the Maps method is used.
258            """
259          if self.session.HasMaps():          if self.session.HasMaps():
260              self.top.SetMap(self.session.Maps()[0])              self.top.SetMap(self.session.Maps()[0])
261          else:          else:
262              self.top.SetMap(None)              self.top.SetMap(None)
263    
264  in_exception_dialog = 0 # flag: are we already inside the exception dialog?      in_exception_dialog = 0 # flag: are we already inside the exception dialog?
   
 def show_exception_dialog(exc_type, exc_value, exc_traceback):  
     """Show a message box with information about an exception.  
   
     The parameters are the usual values describing an exception in  
     Python, the exception type, the value and the traceback.  
265    
266      This method can be used as a value for the sys.excepthook.      def ShowExceptionDialog(self, exc_type, exc_value, exc_traceback):
267      """          """Show a message box with information about an exception.
268      global in_exception_dialog      
269            The parameters are the usual values describing an exception in
270            Python, the exception type, the value and the traceback.
271        
272            This method can be used as a value for the sys.excepthook.
273            """
274    
275      if in_exception_dialog:          if self.in_exception_dialog:
276          return              return
277      in_exception_dialog = 1          self.in_exception_dialog = 1
278      while wxIsBusy():          while wxIsBusy():
279          wxEndBusyCursor() # reset the mouse cursor              wxEndBusyCursor() # reset the mouse cursor
280    
281      try:          try:
282          lines = traceback.format_exception(exc_type, exc_value,              lines = traceback.format_exception(exc_type, exc_value,
283                                             exc_traceback)                                              exc_traceback)
284          message = "An unhandled exception occurred:\n%s\n" % exc_value+\              message = _("An unhandled exception occurred:\n%s\n"
285                    "(please report to " \                          "(please report to"
286                    "http://thuban.intevation.org/bugtracker.html)"\                          " http://thuban.intevation.org/bugtracker.html)"
287                    "\n\n\n"+\                          "\n\n%s") % (exc_value, "".join(lines))
288                    "".join(lines)              print message
289          print message  
290                # We don't use an explicit parent here because this method might
291          # We don't use an explicit parent here because this method might              # be called in circumstances where the main window doesn't exist
292          # be called in circumstances where the main window doesn't exist              # anymore.
293          # anymore.              exceptiondialog.run_exception_dialog(None, message)
294          dlg = wxScrolledMessageDialog(None, message,  
295                                        "Thuban: Internal Error")          finally:
296          dlg.ShowModal()              self.in_exception_dialog = 0
297          dlg.Destroy()              # delete the last exception info that python keeps in
298                # sys.last_* because especially last_traceback keeps
299      finally:              # indirect references to all objects bound to local
300          in_exception_dialog = 0              # variables and this might prevent some object from being
301          # delete the last exception info that python keeps in              # collected early enough.
302          # sys.last_* because especially last_traceback keeps              sys.last_type = sys.last_value = sys.last_traceback = None
         # indirect references to all objects bound to local  
         # variables and this might prevent some object from being  
         # collected early enough.  
         sys.last_type = sys.last_value = sys.last_traceback = None  
303    

Legend:
Removed from v.1504  
changed lines
  Added in v.2051

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26