commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

r6230 - in trunk/gnue-forms/src: . uidrivers/_base uidrivers/curses uidr


From: johannes
Subject: r6230 - in trunk/gnue-forms/src: . uidrivers/_base uidrivers/curses uidrivers/gtk2 uidrivers/gtk2/widgets uidrivers/gtk2/widgets/form uidrivers/win32 uidrivers/wx
Date: Mon, 30 Aug 2004 09:04:41 -0500 (CDT)

Author: johannes
Date: 2004-08-30 09:04:39 -0500 (Mon, 30 Aug 2004)
New Revision: 6230

Modified:
   trunk/gnue-forms/src/GFInstance.py
   trunk/gnue-forms/src/GFKeyMapper.py
   trunk/gnue-forms/src/uidrivers/_base/UIdriver.py
   trunk/gnue-forms/src/uidrivers/curses/UIdriver.py
   trunk/gnue-forms/src/uidrivers/gtk2/MenuBar.py
   trunk/gnue-forms/src/uidrivers/gtk2/ToolBar.py
   trunk/gnue-forms/src/uidrivers/gtk2/UIdriver.py
   trunk/gnue-forms/src/uidrivers/gtk2/common.py
   trunk/gnue-forms/src/uidrivers/gtk2/widgets/_base.py
   trunk/gnue-forms/src/uidrivers/gtk2/widgets/button.py
   trunk/gnue-forms/src/uidrivers/gtk2/widgets/entry.py
   trunk/gnue-forms/src/uidrivers/gtk2/widgets/form/widget.py
   trunk/gnue-forms/src/uidrivers/gtk2/widgets/form/wrappers.py
   trunk/gnue-forms/src/uidrivers/gtk2/widgets/scrollbar.py
   trunk/gnue-forms/src/uidrivers/win32/UIdriver.py
   trunk/gnue-forms/src/uidrivers/wx/UIdriver.py
Log:
*) Added showMessage () to base-driver delegating impl. to _showMessage ()
*) Added showException () to base-driver delegating impl. to _showExcpetion ()
*) GTK2-driver catches all exceptions within signal-handlers (thought as a 
reference implementation)


Modified: trunk/gnue-forms/src/GFInstance.py
===================================================================
--- trunk/gnue-forms/src/GFInstance.py  2004-08-30 12:37:51 UTC (rev 6229)
+++ trunk/gnue-forms/src/GFInstance.py  2004-08-30 14:04:39 UTC (rev 6230)
@@ -825,19 +825,9 @@
   #
   # Displays a generic message box
   #
-  def displayMessageBox (self, message = '', kind = 'Info',
-      cancel = False, caption = 'GNUe Message', title = None):
-     parameters = {
-       'caption': caption,
-       'message': message,
-       'title'  : title
-       }
-     if hasattr (self._uiinstance, 'messageBox'):
-       return self._uiinstance.messageBox (message, kind, title, cancel)
-     else:
-       if title is None:
-         parameters ['title'] = 'Information'
-       self.activateForm ('_messageBox', parameters, modal = 1)
+  def displayMessageBox (self, message = '', kind = 'Info', cancel = False,
+      caption = 'GNUe Message', title = None):
+    self._uiinstance.showMessage (message, kind, title, cancel)
 
 
   #

Modified: trunk/gnue-forms/src/GFKeyMapper.py
===================================================================
--- trunk/gnue-forms/src/GFKeyMapper.py 2004-08-30 12:37:51 UTC (rev 6229)
+++ trunk/gnue-forms/src/GFKeyMapper.py 2004-08-30 14:04:39 UTC (rev 6230)
@@ -32,7 +32,7 @@
 
 
 import string, sys
-from gnue.common.apps import GDebug
+from gnue.common.apps import errors
 
 
 class InvalidKeystrokeName(StandardError):
@@ -204,6 +204,8 @@
   #
   def getEvent(self, basekey, shift=False, ctrl=False, meta=False):
     try:
+      if ctrl and basekey == ord ('e'):
+        raise errors.SystemError, ('Foobar And The Gang')
       return self._translatedUserKeyMap[(basekey, shift, ctrl, meta)]
     except KeyError:
       return None

Modified: trunk/gnue-forms/src/uidrivers/_base/UIdriver.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/_base/UIdriver.py    2004-08-30 12:37:51 UTC 
(rev 6229)
+++ trunk/gnue-forms/src/uidrivers/_base/UIdriver.py    2004-08-30 14:04:39 UTC 
(rev 6230)
@@ -1,6 +1,9 @@
+# GNU Enterprise Forms - UI Driver - Base class for user interfaces
 #
-# This file is part of GNU Enterprise.
+# Copyright 2001-2004 Free Software Foundation
 #
+# This file is part of GNU Enterprise
+#
 # GNU Enterprise is free software; you can redistribute it
 # and/or modify it under the terms of the GNU General Public
 # License as published by the Free Software Foundation; either
@@ -16,30 +19,39 @@
 # write to the Free Software Foundation, Inc., 59 Temple Place
 # - Suite 330, Boston, MA 02111-1307, USA.
 #
-# Copyright 2000-2004 Free Software Foundation
-#
-# FILE:
-# UIbase.py
-#
-# DESCRIPTION:
-# A base class for UI modules.  This class is to be inherited by
-# specific UI drivers.
-#
-# NOTES:
-#
+# $Id$
+
 import sys, os, dircache
 
 from gnue.common import events
 from gnue.common.definitions.GObjects import *
 from gnue.common.definitions.GRootObj import GRootObj
 from gnue.common.utils.FileUtils import dyn_import
+from gnue.common.apps import errors
 
 from gnue.forms.GFForm import *
 
-def guessDefaultIconset():
+# =============================================================================
+# Exceptions
+# =============================================================================
+
+class ImplementationError (errors.SystemError):
+  def __init__ (self, drivername, method):
+    msg = u_("The UI-Driver %(name)s has no implementation of %(method)s") \
+          % {'name': drivername,
+             'method': method}
+    errors.SystemError.__init__ (self, msg)
+
+
+# -----------------------------------------------------------------------------
+# Guess a default iconset for the current environment
+# -----------------------------------------------------------------------------
+
+def guessDefaultIconset ():
   """
   Guess the default iconset to use in this environment
   """
+
   # TODO: This is *very* crude logic
   try:
     import mac
@@ -63,32 +75,29 @@
       except ImportError:
         return 'default'
 
-#
-# GFUserInterfaceBase
-#
-# Convience class to be inherited by other GFUserInterface's
-# Provides basic functionality.
-#
-class GFUserInterfaceBase(GRootObj,events.EventAware):
 
-  default_iconset = guessDefaultIconset()
 
-  def __init__(self, eventHandler, name="Undefined",
-               disableSplash=None, parentContainer=None):
+# =============================================================================
+# Base class for UI drivers
+# =============================================================================
 
-    ############################################################
-    #
-    # Things you do not adjust in the individual UI drivers
-    #
-    ############################################################
+class GFUserInterfaceBase (GRootObj, events.EventAware):
+
+  default_iconset = guessDefaultIconset ()
+
+  # ---------------------------------------------------------------------------
+  # Constructor
+  # ---------------------------------------------------------------------------
+
+  def __init__(self, eventHandler, name = "Undefined", disableSplash = None,
+               parentContainer = None):
+
     GRootObj.__init__(self, 'uiDriver', None, None)
 
+    self.name  = name
     self._type = 'UIDriver'
-    self.name = name
-
     self._disableSplash = disableSplash
 
-
     # Used when forms are embedded in navigator.
     # What parentContainer is depends on the
     # individual UIdriver and Navigator.
@@ -140,8 +149,9 @@
                                             # UIForm objects held in memory
     self._formNameToGFForm = {}             # Holds links the to the top level
                                             # UIForm objects held in memory
-    self._gfObjToUIWidget = {}              # dictionary of driver specific 
UIfoo
-                                            # widgets with the GFObj used as 
the key
+    self._gfObjToUIWidget = {}              # dictionary of driver specific 
+                                            # UIfoo widgets with the GFObj used
+                                            # as the key
 
     self._gfObjToToolkitWidgets = {}        # the GFObj to UI widget cross ref
 
@@ -156,28 +166,33 @@
     #
     self._supportedWidgets = {}
 
-    basedir  = os.path.dirname(sys.modules[self.__module__].__file__)
-    uiDriver = os.path.basename(basedir)
+    basedir  = os.path.dirname (sys.modules [self.__module__].__file__)
+    uiDriver = os.path.basename (basedir)
     basedir +='/widgets/'
-    for widgetName in dircache.listdir(basedir):
+    for widgetName in dircache.listdir (basedir):
       try:
-        if widgetName[0] != '_':
-          if os.path.isfile(basedir+widgetName) and 
os.path.splitext(widgetName)[1] == ".py":
+        if widgetName [0] != '_':
+          if os.path.isfile (basedir + widgetName) and \
+             os.path.splitext (widgetName) [1] == ".py":
             widgetName = os.path.splitext(widgetName)[0]
-            widget = dyn_import('gnue.forms.uidrivers.%s.widgets.%s' 
%(uiDriver,widgetName))
-          elif os.path.isdir(basedir+widgetName):
-            widget = dyn_import('gnue.forms.uidrivers.%s.widgets.%s' 
%(uiDriver,widgetName))
+            widget = dyn_import ('gnue.forms.uidrivers.%s.widgets.%s' \
+                                 % (uiDriver, widgetName))
+          elif os.path.isdir (basedir + widgetName):
+            widget = dyn_import ('gnue.forms.uidrivers.%s.widgets.%s' \
+                                 % (uiDriver, widgetName))
           else:
             raise ImportError, "How the fsck did I get here?"
 
           try:
-            self._supportedWidgets[widget.configuration['provides']]=widget
-          except Exception,mesg:
+            self._supportedWidgets [widget.configuration ['provides']] = widget
+
+          except Exception, mesg:
             raise ImportError, mesg
 
       except ImportError, mesg:
-        GDebug.printMesg(2,"%s.widgets.%s doesn't appear to be a valid ui 
widget" % (uiDriver,widgetName))
-        GDebug.printMesg(5,' --> %s' % (mesg))
+        gDebug (2, "%s.widgets.%s doesn't appear to be a valid ui widget" \
+                   % (uiDriver, widgetName))
+        gDebug (5, ' --> %s' % mesg)
 
     self._uiFocusWidget = None
 
@@ -196,44 +211,45 @@
     self._DIALOGS = {}
 
 
-  def _buildUI(self,object, formName):
+  # ---------------------------------------------------------------------------
+  # Build the user interface
+  # ---------------------------------------------------------------------------
+
+  def _buildUI (self, object, formName):
+
     try:
       #
       # Look up the parent GObj of the current obj
       #
       if object._type == "GFPage":
-        parent = object.findParentOfType(None)
+        parent = object.findParentOfType (None)
       else:
-        parent = object.getParent()
+        parent = object.getParent ()
 
       # find the ui widget that corrosponds with that parent
       uiParent = self
-      if parent:
-        try:
-          uiParent = self._gfObjToUIWidget[parent]
-        except KeyError:
-          pass
+      if parent and self._gfObjToUIWidget.has_key (parent):
+        uiParent = self._gfObjToUIWidget [parent]
 
-      event = self._updateCreateEvent(events.Event('CreateUIWidget',None,
-                   object=object,
-                   parent=uiParent,
-                   #container=self.currentWidget[0],
-                   textWidth=self.textWidth,
-                   textHeight=self.textHeight,
-                   widgetWidth=self.widgetWidth,
-                   widgetHeight=self.widgetHeight,
-                   interface=self,
-                   initialize=1))
+      event = self._updateCreateEvent (events.Event ('CreateUIWidget', None,
+                   object       = object,
+                   parent       = uiParent,
+                   #container   = self.currentWidget[0],
+                   textWidth    = self.textWidth,
+                   textHeight   = self.textHeight,
+                   widgetWidth  = self.widgetWidth,
+                   widgetHeight = self.widgetHeight,
+                   interface    = self,
+                   initialize   = 1))
 
-      uiWidget = 
self._supportedWidgets[object._type].configuration['baseClass'](event)
+      supported = self._supportedWidgets [object._type]
+      uiWidget  = supported.configuration ['baseClass'] (event)
       uiWidget._form = self._form
 
       #
       # Add to the cross refernce
       #
-      self._gfObjToUIWidget[object]=uiWidget
-      GDebug.printMesg(0, "OBJECT %s: %s " % (object.name, object))
-      GDebug.printMesg(0, "WIDGET %s " % uiWidget)
+      self._gfObjToUIWidget [object] = uiWidget
 
       #
       # If the current object is a GFForm then add it to the
@@ -241,8 +257,8 @@
       #
 
       if object._type == 'GFForm':
-        self._formNameToUIForm[formName] = uiWidget
-        self._formNameToGFForm[formName] = object
+        self._formNameToUIForm [formName] = uiWidget
+        self._formNameToGFForm [formName] = object
 
       #
       # GFObject to list of widget set specific widgets
@@ -250,9 +266,9 @@
       #
       # Note: The list would be empty on hidden fields
       if not uiWidget.widgets == []:
-        self._gfObjToToolkitWidgets[object] = uiWidget.widgets
+        self._gfObjToToolkitWidgets [object] = uiWidget.widgets
 
-      GDebug.printMesg(2, "Widget is %s" % uiWidget.widgets)
+      gDebug (2, "Widget is %s" % uiWidget.widgets)
 
     except KeyError:
       pass
@@ -266,37 +282,38 @@
   #
   #
 
-  #
-  # buildForm
-  #
-  # when passed a GObj tree constructed from a .gfd file
-  # it handles the creatation of the user interface
-  #
-  def buildForm(self, form, formName):
 
+  # ---------------------------------------------------------------------------
+  # Build a form from a GObj tree
+  # ---------------------------------------------------------------------------
+
+  def buildForm (self, form, formName):
+
     self._form = form
 
     # Create the UI from the GFForm passed in
-    form.walk(self._buildUI, formName=formName)
+    form.walk (self._buildUI, formName = formName)
 
-    self._gfObjToUIWidget[form].phaseInit()
+    self._gfObjToUIWidget [form].phaseInit ()
 
-    self._formNameToUIForm[formName]._gfObjToToolkitWidgets = 
self._gfObjToToolkitWidgets
-    self._formNameToUIForm[formName]._gfObjToUIWidget = self._gfObjToUIWidget
-    self._formNameToUIForm[formName]._form = form
+    self._formNameToUIForm [formName]._gfObjToToolkitWidgets = \
+        self._gfObjToToolkitWidgets
+    self._formNameToUIForm [formName]._gfObjToUIWidget = self._gfObjToUIWidget
+    self._formNameToUIForm [formName]._form = form
 
 
-  #
-  # activateForm
-  #
+  # ---------------------------------------------------------------------------
+  # Activate a form
+  # ---------------------------------------------------------------------------
 
-  def activateForm(self,formName, modal=0):
+  def activateForm (self, formName, modal = 0):
 
     self._form = self._formNameToGFForm[formName]
     self._UIform = self._formNameToUIForm[formName]
     self._activateForm(self._UIform, modal)
 
 
+
   #############################################################################
   #
   # EVENT FUNCTIONS
@@ -305,114 +322,115 @@
   # execute the actions.  These events come from the forms back end.
   #
 
-  #
-  # switchFocus
-  #
+
+  # ---------------------------------------------------------------------------
   # Moves the focus to a specific UI widget
-  #
-  def switchFocus(self, event):
+  # ---------------------------------------------------------------------------
+
+  def switchFocus (self, event):
+
     object = event.object
     if object: # Some pages might not have any widgets that can be active
       if self._uiFocusWidget:
-        self._uiFocusWidget.loseFocus()
-      self._uiFocusWidget = self._gfObjToUIWidget[object]
+        self._uiFocusWidget.loseFocus ()
+      self._uiFocusWidget = self._gfObjToUIWidget [object]
       self._uiFocusIndex = object._visibleIndex
-      self._uiFocusWidget.indexedFocus(object._visibleIndex)
-      self.dispatchEvent('beginEDITMODE', object, _form=object._form)
+      self._uiFocusWidget.indexedFocus (object._visibleIndex)
+      self.dispatchEvent ('beginEDITMODE', object, _form = object._form)
 
-  #
-  # updateEntry
-  #
-  # Updates all visible toolkit widgets
-  # tied to a specific GFObject
-  #
-  def updateEntry(self,event):
+
+  # ---------------------------------------------------------------------------
+  # Update all visible toolkit widgets tied to a specific GFObject
+  # ---------------------------------------------------------------------------
+
+  def updateEntry (self, event):
+
     if event.data.hidden or event.data._type == 'GFButton':
       return
 
-    entry = event.data
-    field = entry._field
+    entry   = event.data
+    field   = entry._field
     handler = entry._displayHandler
-    prehandling = handler.editing
+    prehandling     = handler.editing
     handler.editing = 0
     index = entry._visibleIndex
     block = entry._block
-    currentRecord = block._resultSet.getRecordNumber()
+    currentRecord = block._resultSet.getRecordNumber ()
 
     # Fill the prior spots
-    for count in range(index):
-      value = 
handler.getDisplayFiller(block._resultSet.getRecord(currentRecord- \
-                              (index-count)).getField(field.field))
+    for count in range (index):
+      record = block._resultSet.getRecord (currentRecord - (index - count))
+      value  = handler.getDisplayFiller (record.getField (field.field))
 
-      GDebug.printMesg (2, "UPD-ENTRY %s prior: '%s' (%s)" % \
-          (entry, value, count))
-      self._gfObjToUIWidget[entry].setValue(value,count)
+      gDebug (2, "UPD-ENTRY %s prior: '%s' (%s)" % (entry, value, count))
+      self._gfObjToUIWidget [entry].setValue (value, count)
 
     # Fill current spot
-    value = handler.getDisplayFiller(entry.getValue())
-    GDebug.printMesg (2, "UPD-ENTRY %s current: '%s' (%s)" % \
-          (entry, value, index))
-    self._gfObjToUIWidget[entry].setValue(value, index)
+    value = handler.getDisplayFiller (entry.getValue ())
+    gDebug (2, "UPD-ENTRY %s current: '%s' (%s)" % (entry, value, index))
+    self._gfObjToUIWidget [entry].setValue (value, index)
 
     # Fill trailing spots
     #
-    # You must skip the matching index but
-    # you do not want to just add 1 to count
-    # as the formulas would then be off
+    # You must skip the matching index but you do not want to just add 1 to
+    # count as the formulas would then be off
     count = index
 
-    lastRow = block._resultSet.getRecordCount()
-    while count < int(entry._rows):
+    lastRow = block._resultSet.getRecordCount ()
+    while count < int (entry._rows):
       if count != index:
-        cr = currentRecord+(count-index)
-        rec = block._resultSet.getRecord(cr)
+        cr  = currentRecord + (count - index)
+        rec = block._resultSet.getRecord (cr)
 
-        if rec == None:
+        if rec is None:
           # Blank the displayed widget
-          value = handler.getDisplayFiller(None)
+          value = handler.getDisplayFiller (None)
           # Don't ask... but it's needed
           lastRow -= 1
         else:
-          value = handler.getDisplayFiller(rec.getField(field.field))
+          value = handler.getDisplayFiller (rec.getField (field.field))
 
-        GDebug.printMesg (2, "UPD-ENTRY %s trail: '%s' (%s)" % \
-            (entry, value, count))
-        self._gfObjToUIWidget[entry].setValue(value, count, cr <= lastRow)
+        gDebug (2, "UPD-ENTRY %s trail: '%s' (%s)" % (entry, value, count))
+        self._gfObjToUIWidget [entry].setValue (value, count, cr <= lastRow)
+
       count += 1
 
     handler.editing = prehandling
 
-  #
-  # updateEntryEditor
-  #
-  # updates the displayed value and sets
-  # the cursor position for a specific GFObject
-  #
-  def updateEntryEditor(self, event):
-    index = event.object._visibleIndex
-    widget = self._gfObjToUIWidget[event.object]
-    GDebug.printMesg (2, "UPD-ENTRY-EDIT %s '%s' %s" % \
-        (event.object, event.display, index))
-    widget.setValue(event.display, index)
-    widget.setCursorPosition(event.cursor, index)
+  # ---------------------------------------------------------------------------
+  # Update the displayed value and set the cursor position for a GFObject
+  # ---------------------------------------------------------------------------
 
+  def updateEntryEditor (self, event):
+
+    index  = event.object._visibleIndex
+    widget = self._gfObjToUIWidget [event.object]
+    gDebug (2, "UPD-ENTRY-ED %s '%s' %s" % (event.object, event.display, 
index))
+    widget.setValue (event.display, index)
+    widget.setCursorPosition (event.cursor, index)
+
     if event.selection != None:
       selection1, selection2 = event.selection
-      widget.setSelectedArea(selection1, selection2, index)
+      widget.setSelectedArea (selection1, selection2, index)
 
-  #
-  # Clipboard routines
-  #
-  # If a particular UI has a system-wide clipboard,
-  # these methods should be overridden to use that
-  # clipboard.
-  #
-  def getClipboardContents(self, event):
-    GDebug.printMesg(5, "Getting clipboard '%s'" % self.__clipboard)
+
+  # ---------------------------------------------------------------------------
+  # Get the clipboard contents
+  # ---------------------------------------------------------------------------
+
+  def getClipboardContents (self, event):
+
+    gDebug (5, "Getting clipboard '%s'" % self.__clipboard)
     event.__result__ = "%s" % self.__clipboard
 
-  def setClipboardContents(self, event):
-    GDebug.printMesg(5, "Setting clipboard '%s'" % event.text)
+
+  # ---------------------------------------------------------------------------
+  # Set the clipboard contents
+  # ---------------------------------------------------------------------------
+
+  def setClipboardContents (self, event):
+
+    gDebug (5, "Setting clipboard '%s'" % event.text)
     self.__clipboard = "%s" % event.text
 
 
@@ -423,96 +441,191 @@
   # UIDrivers can override the following functions
   #
 
-  #
-  # beginWait
-  # Called whenever forms goes into a "wait" state in which user cannot
-  # interact with interface (e.g., while waiting for a query or a commit)
-  #
+
+  # ---------------------------------------------------------------------------
+  # Enter wait state
+  # ---------------------------------------------------------------------------
+
   def beginWait (self, event):
+    """
+    Called whenever forms goes into a "wait" state in which user cannot
+    interact with interface (e.g., while waiting for a query or a commit)
+    """
     pass
 
-  #
-  # endWait
-  #
-  # Called whenever forms leaves a "wait" state
-  #
+
+  # ---------------------------------------------------------------------------
+  # Leave wait state
+  # ---------------------------------------------------------------------------
+
   def endWait (self, event):
+    """
+    Called whenever forms leaves a wait state
+    """
     pass
 
-  # exitApplication
-  #
+
+  # ---------------------------------------------------------------------------
   # Form has told the application to close so call the UIs private exit routine
-  #
-  def exitApplication(self,event):
-    self._exit(event._formName)
+  # ---------------------------------------------------------------------------
 
-  #
-  # _updateCreateEvent
-  #
-  # Can be used by UI drivers to add more attributes to the event that
-  # creates a widget.  Called by the _stdConstructor during the building of 
the UI
-  #
+  def exitApplication (self, event):
+    self._exit (event._formName)
+
+
+  # ---------------------------------------------------------------------------
+  # Update the widget creation event
+  # ---------------------------------------------------------------------------
+
   def _updateCreateEvent(self, event):
+    """
+    Can be used by UI drivers to add more attributes to the event that creates
+    a widget. Called by the _stdConstructor during the building of the UI
+    """
     return event
 
-  #
-  # printout
-  #
-  # Perform the default printout/"screen print" function for
-  # this uidriver
-  #
+
+  # ---------------------------------------------------------------------------
+  # Perform the default printout function
+  # ---------------------------------------------------------------------------
+
   def printout(self, event):
+    """
+    Perform the default printout/"screen print" function for this uidriver
+    """
     pass
 
-  #############################################################################
-  #
-  # Required Functions
-  #
-  # UIDrivers must implement the following features
 
-  def _activateForm (self, form, modal):
-    GDebug.printMesg(0, "Fatal UI driver error.  Required function not 
implemented")
-    sys.exit(1)
+  # ---------------------------------------------------------------------------
+  # Show the last exception
+  # ---------------------------------------------------------------------------
 
-  def _exit(self):
-    GDebug.printMesg(0, "Fatal UI driver error.  Required function not 
implemented")
-    sys.exit(1)
+  def showException (self):
+    """
+    This function shows the last exception raised. Exceptions of the user group
+    are delegated to the showMessage-function.
+    """
+    (group, name, message, detail) = errors.getException ()
+    if group == 'user':
+      self.showMessage (message, kind = 'Error', title = _("GNUe Message"))
+    else:
+      self._showException (group, name, message, detail)
 
+  # ---------------------------------------------------------------------------
+  # Show a message of a given kind
+  # ---------------------------------------------------------------------------
 
-#
-# newSkool
-#
+  def showMessage (self, message, kind = 'Info', title = None, cancel = False):
+    """
+    This function calls the UI driver's implementation of the _showMessage
+    method. See _showMessage () for a detailed doc.
+    """
+    self._showMessage (message, kind, title, cancel)
 
-  #
+
+  # ---------------------------------------------------------------------------
   # gotoPage
-  #
-  def gotoPage(self,event):
+  # ---------------------------------------------------------------------------
+
+  def gotoPage (self, event):
+
     uiForm = self._gfObjToUIWidget [event._form]._uiForm
     uiPage = self._gfObjToUIWidget [event.data]
     uiForm.gotoPage (uiPage)
 
 
-  #
-  # updateStatusBar
-  #
+  # ---------------------------------------------------------------------------
   # Calls the UIForm's _setStatusBar function to update status
-  #
-  def updateStatusBar(self,event):
+  # ---------------------------------------------------------------------------
+
+  def updateStatusBar (self, event):
+
     status = None
     if event.recordStatus != None:
-      status = self.statusValues[event.recordStatus]
+      status = self.statusValues [event.recordStatus]
 
     insertValue = None
     if event.insertMode:
-      insertValue = event.insertMode and 'INS' or  'OVR'
-    # TODO:
-    self._gfObjToUIWidget[event._form]._uiForm._setStatusBar(event.tip, 
status, insertValue,
-                                                            
event.currentRecord, event.maxRecord,
-                                                            event.currentPage, 
event.maxPage)
+      insertValue = event.insertMode and 'INS' or 'OVR'
 
-  def setTitle(self, event):
+    self._gfObjToUIWidget [event._form]._uiForm._setStatusBar (event.tip,
+                                                           status,
+                                                           insertValue,
+                                                           event.currentRecord,
+                                                           event.maxRecord,
+                                                           event.currentPage,
+                                                           event.maxPage)
+
+
+
+  #############################################################################
+  #
+  # Required Functions
+  #
+  # UIDrivers must implement the following features
+
+
+  # ---------------------------------------------------------------------------
+  # Activate a form
+  # ---------------------------------------------------------------------------
+
+  def _activateForm (self, form, modal):
+
+    raise ImplementationError, (self.name, '_activateForm')
+
+
+  # ---------------------------------------------------------------------------
+  # Exit the application
+  # ---------------------------------------------------------------------------
+
+  def _exit(self):
+
+    raise ImplementationError, (self.name, '_exit')
+
+
+  # ---------------------------------------------------------------------------
+  # Set the form's displayed title
+  # ---------------------------------------------------------------------------
+
+  def setTitle (self, event):
     """
     set the form's displayed title
     """
     pass
 
+
+  # ---------------------------------------------------------------------------
+  # Abstract: make sure a descendant of this class has a _showException method
+  # ---------------------------------------------------------------------------
+
+  def _showException (self, group, name, message, detail):
+    """
+    This function must be overriden by a descendant UI driver class. It get's
+    called for all exceptions except UserErrors. It's purpose is to display
+    an exception. 
+    @param group: Group of the exception like 'system', 'admin', 'application'
+    @param name: Name of the exception, i.e. 'KeyError', 'FoobarError', ...
+    @param message: Message of the exception
+    @param detail: Detail of the exception, i.e. a traceback
+    """
+    raise ImplementationError, (self.name, '_showException')
+
+
+  # ---------------------------------------------------------------------------
+  # Implementation of showMessage ()
+  # ---------------------------------------------------------------------------
+  
+  def _showMessage (self, message, kind = 'Info', title = None, cancel = 
False):
+    """
+    This function must be implemented by a UI driver class and shows a messages
+    of a given kind.
+
+    @param message: the text of the message
+    @param kind: type of the message. Valid types are 'Info', 'Warning',
+        'Question', 'Error'
+    @param title: title of the message
+    @param cancel: If True something like a cancel button should be available
+    @return: True if the Ok-, Close-, or Yes-button was pressed, False if the
+        No-button was pressed or None if the Cancel-button was pressed.
+    """
+    raise ImplementationError, (self.name, '_showMessage')


Property changes on: trunk/gnue-forms/src/uidrivers/_base/UIdriver.py
___________________________________________________________________
Name: svn:keywords
   + Id

Modified: trunk/gnue-forms/src/uidrivers/curses/UIdriver.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/curses/UIdriver.py   2004-08-30 12:37:51 UTC 
(rev 6229)
+++ trunk/gnue-forms/src/uidrivers/curses/UIdriver.py   2004-08-30 14:04:39 UTC 
(rev 6230)
@@ -220,7 +220,7 @@
   # Show a message
   # ---------------------------------------------------------------------------
 
-  def messageBox (self, message, kind, title, cancel):
+  def _showMessage (self, message, kind, title, cancel):
 
     return self.__currentForm.showMessage (message, kind, cancel)
 

Modified: trunk/gnue-forms/src/uidrivers/gtk2/MenuBar.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/MenuBar.py      2004-08-30 12:37:51 UTC 
(rev 6229)
+++ trunk/gnue-forms/src/uidrivers/gtk2/MenuBar.py      2004-08-30 14:04:39 UTC 
(rev 6230)
@@ -116,8 +116,13 @@
   # ---------------------------------------------------------------------------
 
   def _menuHandler (self, menuItem, userAction):
-    event = "request%s" % userAction.event
-    self.driver.dispatchEvent (event, _form = self.form)
+
+    try:
+      event = "request%s" % userAction.event
+      self.driver.dispatchEvent (event, _form = self.form)
+
+    except:
+      self.driver.showException ()
     
 
   # ---------------------------------------------------------------------------
@@ -125,18 +130,27 @@
   # ---------------------------------------------------------------------------
 
   def _selectHandler (self, menuItem, userAction):
-    self.container._setStatusBar (userAction.description, None, None, None,
-                                  None, None, None)
 
+    try:
+      self.container._setStatusBar (userAction.description, None, None, None,
+                                    None, None, None)
+    except:
+      self.driver.showException ()
 
+
   # ---------------------------------------------------------------------------
   # Clear the tooltip in the statusbar if a menu item get's deselected
   # ---------------------------------------------------------------------------
 
   def _deselectHandler (self, menuItem, userAction):
-    self.container._setStatusBar ('', None, None, None, None, None, None)
 
+    try:
+      self.container._setStatusBar ('', None, None, None, None, None, None)
 
+    except:
+      self.driver.showException ()
+
+
   # ---------------------------------------------------------------------------
   # Add a separator
   # ---------------------------------------------------------------------------

Modified: trunk/gnue-forms/src/uidrivers/gtk2/ToolBar.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/ToolBar.py      2004-08-30 12:37:51 UTC 
(rev 6229)
+++ trunk/gnue-forms/src/uidrivers/gtk2/ToolBar.py      2004-08-30 14:04:39 UTC 
(rev 6230)
@@ -23,7 +23,7 @@
 
 import gtk
 
-from gnue.common.apps import GDebug, i18n
+from gnue.common.apps import i18n
 from gnue.forms.uidrivers._commonGuiToolkit.ToolBar import ToolBar as Base
   
 # =============================================================================
@@ -62,7 +62,7 @@
 
   def addAction (self, name, userAction):
 
-    GDebug.printMesg (1, "TOOL: add action %s, %s" % \
+    gDebug (1, "TOOL: add action %s, %s" % \
         (repr (name), repr (userAction.description)))
 
     label   = name
@@ -91,22 +91,32 @@
   # ---------------------------------------------------------------------------
 
   def _toggleEvent (self, button, userAction):
-    if button.get_active ():
-      event = 'request%s' % userAction.event
-    else:
-      event = 'request%s' % userAction.canToggle
 
-    self.driver.dispatchEvent (event, _form = self.form)
+    try:
+      if button.get_active ():
+        event = 'request%s' % userAction.event
+      else:
+        event = 'request%s' % userAction.canToggle
 
+      self.driver.dispatchEvent (event, _form = self.form)
 
+    except:
+      self.driver.showException ()
+
+
   # ---------------------------------------------------------------------------
   # Event handler for toolbar buttons
   # ---------------------------------------------------------------------------
 
   def _buttonPress (self, button, userAction):
-    event = 'request%s' % userAction.event
-    self.driver.dispatchEvent (event, _form = self.form)
 
+    try:
+      event = 'request%s' % userAction.event
+      self.driver.dispatchEvent (event, _form = self.form)
+
+    except:
+      self.driver.showException ()
+
         
   # ---------------------------------------------------------------------------
   # Add a separator

Modified: trunk/gnue-forms/src/uidrivers/gtk2/UIdriver.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/UIdriver.py     2004-08-30 12:37:51 UTC 
(rev 6229)
+++ trunk/gnue-forms/src/uidrivers/gtk2/UIdriver.py     2004-08-30 14:04:39 UTC 
(rev 6230)
@@ -51,7 +51,6 @@
       _("The GNUe-Forms GTK driver requires PyGTK and GTK 2.x.")
 
 from gnue.common import events
-from gnue.common.apps import GDebug
 from gnue.common.apps import GConfig
 
 
@@ -91,17 +90,16 @@
 
 
   # ---------------------------------------------------------------------------
-  #
+  # Constructor
   # ---------------------------------------------------------------------------
   
   def __init__ (self, *args, **params):
     commonToolkit.GFUserInterface.__init__ (self, *args, **params)
 
-    gDebug (1, "Creating clipboard instance")
+    self.name = "GTK2"
+
     self._display   = gtk.gdk.display_manager_get ().get_default_display ()
-    gDebug (2, "Display   is %s" % self._display)
     self._clipboard = gtk.Clipboard(self._display, "CLIPBOARD")
-    gDebug (2, "Clipboard is %s" % self._clipboard)
 
     
 
@@ -212,43 +210,51 @@
   # ---------------------------------------------------------------------------
 
   def getClipboardContents (self, event):
-    gDebug (1, "Retrieving clipboard contents")
+    try:
+      gDebug (1, "Retrieving clipboard contents")
 
-    widget = self._UIform.mainWindow.get_focus ()
-    if isinstance (widget, gtk.TextView):
-      gDebug (1, "Clipboard is %s" % self._clipboard)
+      widget = self._UIform.mainWindow.get_focus ()
+      if isinstance (widget, gtk.TextView):
+        gDebug (1, "Clipboard is %s" % self._clipboard)
 
-      tBuffer = widget.get_buffer ()
-      pos = tBuffer.get_iter_at_mark (tBuffer.get_insert ())
-      tBuffer.paste_clipboard (self._clipboard, pos, widget.get_editable())
+        tBuffer = widget.get_buffer ()
+        pos = tBuffer.get_iter_at_mark (tBuffer.get_insert ())
+        tBuffer.paste_clipboard (self._clipboard, pos, widget.get_editable())
 
 
-    elif hasattr (widget, 'paste_clipboard'):
-      gDebug (3, "calling %s.paste_clipboard" % widget)
-      widget.paste_clipboard ()
+      elif hasattr (widget, 'paste_clipboard'):
+        gDebug (3, "calling %s.paste_clipboard" % widget)
+        widget.paste_clipboard ()
 
-    event.__result__ = None
+      event.__result__ = None
 
+    except:
+      self.showException ()
 
+
   # ---------------------------------------------------------------------------
   # Set some text into the clipboard
   # ---------------------------------------------------------------------------
 
   def setClipboardContents (self, event):
-    gDebug (1, "Setting clipboard contents")
+    try:
+      gDebug (1, "Setting clipboard contents")
 
-    widget = self._UIform.mainWindow.get_focus ()
-    if isinstance (widget, gtk.TextView):
-      tBuffer = widget.get_buffer ()
-      tBuffer.copy_clipboard (self._clipboard)
+      widget = self._UIform.mainWindow.get_focus ()
+      if isinstance (widget, gtk.TextView):
+        tBuffer = widget.get_buffer ()
+        tBuffer.copy_clipboard (self._clipboard)
 
-    if hasattr (widget, 'copy_clipboard'):
-      gDebug (3, "calling %s.copy_clipboard ()" % widget)
-      widget.copy_clipboard ()
+      if hasattr (widget, 'copy_clipboard'):
+        gDebug (3, "calling %s.copy_clipboard ()" % widget)
+        widget.copy_clipboard ()
 
+    except:
+      self.showException ()
 
 
 
+
   # ---------------------------------------------------------------------------
   # Set the forms title
   # ---------------------------------------------------------------------------
@@ -265,7 +271,7 @@
   # create a modal message box
   # ---------------------------------------------------------------------------
 
-  def messageBox (self, message, kind = 'Info', title = None, cancel = False):
+  def _showMessage (self, message, kind = 'Info', title = None, cancel = 
False):
     """
     This function creates a message box of a given kind and returns True, False
     or None depending on the button pressed.
@@ -316,6 +322,18 @@
       return aValue
 
 
+  # ---------------------------------------------------------------------------
+  # Show an exception dialog
+  # ---------------------------------------------------------------------------
+
+  def _showException (self, group, name, message, detail):
+    dialog = ExceptionDisplay (group, name, message, detail)
+    try:
+      dialog.run ()
+    finally:
+      dialog.destroy ()
+
+
 # -----------------------------------------------------------------------------
 # Get font metrics and font description for a given font 
 # -----------------------------------------------------------------------------
@@ -327,11 +345,10 @@
 
   try:
     if fontName is not None:
-      fontDesc = pango.FontDescription (fontName)
+      label.modify_font (pango.FontDescription (fontName))
 
     context  = label.get_pango_context ()
-    if fontName is None:
-      fontDesc = context.get_font_description ()
+    fontDesc = context.get_font_description ()
     metrics  = context.get_metrics (fontDesc)
 
     width  = pango.PIXELS (metrics.get_approximate_char_width ())
@@ -346,7 +363,100 @@
   return (width, height, fontDesc)
 
 
+
 # =============================================================================
+# This class implements a dialog for displaying exceptions
+# =============================================================================
+
+class ExceptionDisplay (gtk.Dialog):
+
+  _TITLE = {'system'     : _("GNUe Internal System Error"),
+            'admin'      : _("GNUe Unexpected Error"),
+            'application': _("GNUe Application Error")}
+
+  _FORMAT = {
+     'system': u_("An unexpected internal error has occured:\n%s.\n"
+                  "This means you have found a bug in GNU Enterprise. "
+                  "Please report it to address@hidden"),
+     'admin': u_("An unexpected error has occured:\n%s.\n"
+                 "Please contact your system administrator."),
+     'application': u_("An unexpected error has occured:\n%s.\n"
+                       "Please contact your system administrator.")}
+
+  # ---------------------------------------------------------------------------
+  # Constructor
+  # ---------------------------------------------------------------------------
+
+  def __init__ (self, group, name, message, detail):
+
+    gtk.Dialog.__init__ (self, self._TITLE.get (group, _('Error')), None,
+                       gtk.DIALOG_MODAL, (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
+
+    self.set_border_width (5)
+
+    button = gtk.Button (_('>> Detail'))
+    button.connect ('clicked', self.__toggleDetail)
+    self.action_area.pack_start (button)
+    button.show ()
+
+    hbox = gtk.HBox (spacing = 16)
+
+    image = gtk.Image ()
+    image.set_from_stock (gtk.STOCK_DIALOG_ERROR, gtk.ICON_SIZE_DIALOG)
+    image.set_alignment (0, 0)
+    hbox.pack_start (image)
+    image.show ()
+
+    vbox = gtk.VBox (spacing = 16)
+
+    label = gtk.Label (self._FORMAT.get (group, "%s") % message)
+    label.set_line_wrap (True)
+    label.set_alignment (0, 0)
+    vbox.pack_start (label)
+    label.show ()
+
+    textView = gtk.TextView ()
+    textView.get_buffer ().set_text (detail)
+    textView.set_pixels_above_lines (2)
+    textView.set_left_margin (2)
+    # Just set the textview to 'readonly' so using clipboard still works
+    textView.set_editable (False)
+    textView.modify_font (pango.FontDescription ('monospace'))
+
+    self.detailView = gtk.ScrolledWindow ()
+    self.detailView.add_with_viewport (textView)
+    self.detailView.set_policy (gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+    (w, h) = _getFontMetrics ('monospace') [:2]
+    self.detailView.set_size_request (w * 80, h * 10)
+    textView.show ()
+    vbox.pack_start (self.detailView)
+
+    hbox.pack_start (vbox)
+    vbox.show ()
+
+    self.vbox.pack_start (hbox, padding = 8)
+    hbox.show ()
+
+    self._showsDetail  = False
+    self._originalSize = self.get_size ()
+
+
+  # ---------------------------------------------------------------------------
+  # toggle visibility of the detail display
+  # ---------------------------------------------------------------------------
+
+  def __toggleDetail (self, button):
+    if self._showsDetail:
+      self.detailView.hide_all ()
+      button.set_label (_(">> Details"))
+      self.resize (*self._originalSize)
+    else:
+      self.detailView.show_all ()
+      button.set_label (_("<< Details"))
+  
+    self._showsDetail = not self._showsDetail
+
+# =============================================================================
 # Get the current default application font and it's metrics
 # =============================================================================
 

Modified: trunk/gnue-forms/src/uidrivers/gtk2/common.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/common.py       2004-08-30 12:37:51 UTC 
(rev 6229)
+++ trunk/gnue-forms/src/uidrivers/gtk2/common.py       2004-08-30 14:04:39 UTC 
(rev 6230)
@@ -45,43 +45,47 @@
 # -----------------------------------------------------------------------------
 
 def _keyPressHandler (widget, event, uiDriver, eventHandler, lookup):
-  gDebug (2, "Common-keypress: %s %s" % (event.type, event.keyval))
+  try:
+    gDebug (2, "Common-keypress: %s %s" % (event.type, event.keyval))
 
-  if event.type != gtk.gdk.KEY_PRESS:
-    return False
+    if event.type != gtk.gdk.KEY_PRESS:
+      return False
 
-  action  = None
-  keycode = event.keyval
+    action  = None
+    keycode = event.keyval
 
-  isShift = event.state & gtk.gdk.SHIFT_MASK   > 0
-  isLock  = event.state & gtk.gdk.LOCK_MASK    > 0
-  isCtrl  = event.state & gtk.gdk.CONTROL_MASK > 0
-  isMod1  = event.state & gtk.gdk.MOD1_MASK    > 0
+    isShift = event.state & gtk.gdk.SHIFT_MASK   > 0
+    isLock  = event.state & gtk.gdk.LOCK_MASK    > 0
+    isCtrl  = event.state & gtk.gdk.CONTROL_MASK > 0
+    isMod1  = event.state & gtk.gdk.MOD1_MASK    > 0
 
-  if keycode == gtk.keysyms.ISO_Left_Tab:
-    gDebug (3, "Mapping Shit-Tab to Tab")
-    keycode = gtk.keysyms.Tab
+    if keycode == gtk.keysyms.ISO_Left_Tab:
+      gDebug (3, "Mapping Shit-Tab to Tab")
+      keycode = gtk.keysyms.Tab
 
-  if not uiDriver._WidgetToGFObj.has_key (lookup):
-    gDebug (2, "can't find widget %s" % lookup)
-    return False
+    if not uiDriver._WidgetToGFObj.has_key (lookup):
+      gDebug (2, "can't find widget %s" % lookup)
+      return False
 
-  gfObject = uiDriver._WidgetToGFObj [lookup]
+    gfObject = uiDriver._WidgetToGFObj [lookup]
+  
+    # Get the event to process from the KeyMapper
+    command = GFKeyMapper.KeyMapper.getEvent (keycode, isShift, isCtrl, isMod1)
 
-  # Get the event to process from the KeyMapper
-  command = GFKeyMapper.KeyMapper.getEvent (keycode, isShift, isCtrl, isMod1)
+    if command:
+      action = events.Event ('request%s' % command)
 
-  if command:
-    action = events.Event ('request%s' % command)
+      # Add the gfObject's _form to the outgoing event
+      # rather than every event in the function
+      gDebug (3, "Calling %s" % action.__event__)
+      action.__dict__.update ({'_form': gfObject._form})
+      eventHandler (action)
+      return True
+    else:
+      gDebug (3, "Key dropped!")
 
-    # Add the gfObject's _form to the outgoing event
-    # rather than every event in the function
-    gDebug (3, "Calling %s" % action.__event__)
-    action.__dict__.update ({'_form': gfObject._form})
-    eventHandler (action)
-    return True
-  else:
-    gDebug (3, "Key dropped!")
+  except:
+    uiDriver.showException ()
 
 
 

Modified: trunk/gnue-forms/src/uidrivers/gtk2/widgets/_base.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/widgets/_base.py        2004-08-30 
12:37:51 UTC (rev 6229)
+++ trunk/gnue-forms/src/uidrivers/gtk2/widgets/_base.py        2004-08-30 
14:04:39 UTC (rev 6230)
@@ -25,7 +25,7 @@
 import types
 
 from gnue.common import events
-from gnue.common.apps import GDebug, i18n
+from gnue.common.apps import i18n
 from gnue.forms.GFForm import *
 from gnue.forms.uidrivers._base.widgets._base import UIWidget
 from gnue.forms.uidrivers.gtk2.common import _setDefaultEventHandlers
@@ -110,7 +110,7 @@
 
     if lookupWidget is None:
       lookupWidget = widget
-    GDebug.printMesg (2, "ADD FOCUSHANDLER %s (%s)" % (widget, lookupWidget))
+    gDebug (2, "ADD FOCUSHANDLER %s (%s)" % (widget, lookupWidget))
     method = after and widget.connect_after or widget.connect
     widget._focusHandler = method ('focus-in-event', self.__focusInHandler,
                                    lookupWidget)
@@ -126,25 +126,28 @@
     call to 'requestFOCUS'. If the focused widget needs a jump to another
     record an additional 'requestJUMPRECORD' event will be fired.
     """
-
-    GDebug.printMesg (2, "FOCUS-IN-EVENT: %s for %s" % (widget, lookupWidget))
+    try:
+      gDebug (2, "FOCUS-IN-EVENT: %s for %s" % (widget, lookupWidget))
     
-    gfObject = self._uiDriver._WidgetToGFObj [lookupWidget]
-    _formRef = gfObject._form
+      gfObject = self._uiDriver._WidgetToGFObj [lookupWidget]
+      _formRef = gfObject._form
 
-    if _formRef._currentEntry == gfObject:
-      gDebug (1, "SKIPPING since we already have the focus!")
-      return gtk.FALSE
+      if _formRef._currentEntry == gfObject:
+        gDebug (1, "SKIPPING since we already have the focus!")
+        return gtk.FALSE
 
-    action = events.Event ('requestFOCUS', gfObject, _form = _formRef)
-    self._eventHandler (action)
-
-    adjust = self.widgets.index (lookupWidget) - gfObject._visibleIndex
-    if adjust:
-      GDebug.printMesg (1, "Adjusting record to %s" % adjust)
-      action = events.Event ('requestJUMPRECORD', adjust, _form = _formRef)
+      action = events.Event ('requestFOCUS', gfObject, _form = _formRef)
       self._eventHandler (action)
 
+      adjust = self.widgets.index (lookupWidget) - gfObject._visibleIndex
+      if adjust:
+        gDebug (1, "Adjusting record to %s" % adjust)
+        action = events.Event ('requestJUMPRECORD', adjust, _form = _formRef)
+        self._eventHandler (action)
+
+    except:
+      self._uiDriver.showException ()
+
     return gtk.FALSE
 
 
@@ -175,10 +178,10 @@
           
 
   def showModal (self):
-    GDebug.printMesg (1, "showModal not implemented for gtk2 driver")
+    gDebug (1, "showModal not implemented for gtk2 driver")
 
   def destroy (self):
-    GDebug.printMesg (1, "destroy not implemented for gtk2 driver")
+    gDebug (1, "destroy not implemented for gtk2 driver")
         
 
   # ---------------------------------------------------------------------------
@@ -192,13 +195,13 @@
     recursion.
     """
     widget = self.widgets [index]
-    GDebug.printMesg (1, "indexedFocus: %s [%s]" % (widget, index))
+    gDebug (1, "indexedFocus: %s [%s]" % (widget, index))
 
     item    = isinstance (widget, gtk.Combo) and widget.entry or widget
 
     self._blockHandler (item, '_focusHandler')
 
-    GDebug.printMesg (3, "Grab focus to %s for %s" % (item, widget))
+    gDebug (3, "Grab focus to %s for %s" % (item, widget))
     item.grab_focus ()
 
     # To avoid the automatic select-all in a combo box, we explicitly set the
@@ -235,11 +238,11 @@
     the widget.
     """
     widget = self.widgets [index]
-    GDebug.printMesg (1, "setValue %s [%s] %s" % (repr (value), index, widget))
+    gDebug (1, "setValue %s [%s] %s" % (repr (value), index, widget))
     
     if not isinstance (widget, gtk.CheckButton) and \
         type (value) != types.UnicodeType:
-      GDebug.printMesg (3, "converting %s to unicode using %s" % \
+      gDebug (3, "converting %s to unicode using %s" % \
           (repr (value), gConfigForms ('textEncoding')))
       value = unicode (value, gConfigForms ('textEncoding'))
 
@@ -327,7 +330,7 @@
     method = unblock and widget.handler_unblock or widget.handler_block
     if hasattr (widget, handlerName):
       handler = getattr (widget, handlerName)
-      GDebug.printMesg (2, "%s '%s' (%s) for %s" % \
+      gDebug (2, "%s '%s' (%s) for %s" % \
           (['Block', 'Unblock'] [unblock], handlerName, handler, widget))
       method (handler)
 

Modified: trunk/gnue-forms/src/uidrivers/gtk2/widgets/button.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/widgets/button.py       2004-08-30 
12:37:51 UTC (rev 6229)
+++ trunk/gnue-forms/src/uidrivers/gtk2/widgets/button.py       2004-08-30 
14:04:39 UTC (rev 6230)
@@ -60,13 +60,17 @@
   # ---------------------------------------------------------------------------
 
   def buttonHandler (self, widget):
-    gfObject = self._uiDriver._WidgetToGFObj [widget]
+    try:
+      gfObject = self._uiDriver._WidgetToGFObj [widget]
 
-    GDebug.printMesg (1, "buttonActivated on %s" % gfObject)
-    action = events.Event ('buttonActivated', gfObject)
-    self._eventHandler (action)
+      GDebug.printMesg (1, "buttonActivated on %s" % gfObject)
+      action = events.Event ('buttonActivated', gfObject)
+      self._eventHandler (action)
 
+    except:
+      self._uiDriver.showException ()
 
+
 # -----------------------------------------------------------------------------
 # Configuration data
 # -----------------------------------------------------------------------------

Modified: trunk/gnue-forms/src/uidrivers/gtk2/widgets/entry.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/widgets/entry.py        2004-08-30 
12:37:51 UTC (rev 6229)
+++ trunk/gnue-forms/src/uidrivers/gtk2/widgets/entry.py        2004-08-30 
14:04:39 UTC (rev 6230)
@@ -259,77 +259,93 @@
 
   def insertTextHandler (self, widget, newtext, length, pos, gfObject):
 
-    gDebug (1, "insert gtk.Entry () '%s' at %d (%s) into %s" % \
-        (newtext, widget.get_position (), pos, widget))
+    try:
+      gDebug (1, "insert gtk.Entry () '%s' at %d (%s) into %s" % \
+          (newtext, widget.get_position (), pos, widget))
 
-    text   = unicode (newtext, 'utf-8')
-    action = events.Event ('requestKEYPRESS', text = text,
-                           _form = gfObject._form)
+      text   = unicode (newtext, 'utf-8')
+      action = events.Event ('requestKEYPRESS', text = text,
+                             _form = gfObject._form)
 
-    widget.stop_emission ('insert-text')
-    gtk.idle_add (self._eventHandler, action)
-    # self._eventHandler (action)
+      widget.stop_emission ('insert-text')
+      gtk.idle_add (self._eventHandler, action)
 
+    except:
+      self._uiDriver.showException ()
 
+
   # ---------------------------------------------------------------------------
   # delete a portion of text from a gtk.Entry () widget
   # ---------------------------------------------------------------------------
 
   def deleteTextHandler (self, widget, start_pos, end_pos, gfObject):
-    gDebug (1, "Delete %s to %s in %s" % (start_pos, end_pos, widget))
+    try:
+      gDebug (1, "Delete %s to %s in %s" % (start_pos, end_pos, widget))
 
-    action = events.Event ('requestDELETERANGE',
-                            start_pos = start_pos,
-                            end_pos   = end_pos,
-                            position  = widget.get_position (),
-                            _form     = gfObject._form)
+      action = events.Event ('requestDELETERANGE',
+                              start_pos = start_pos,
+                              end_pos   = end_pos,
+                              position  = widget.get_position (),
+                              _form     = gfObject._form)
 
-    widget.stop_emission ('delete-text')
-    self._eventHandler (action)
+      widget.stop_emission ('delete-text')
+      self._eventHandler (action)
 
+    except:
+      self._uiDriver.showException ()
 
+
   # ---------------------------------------------------------------------------
   # Handle text inserts in a text view widget (textBuffer)
   # ---------------------------------------------------------------------------
 
   def insertBufferHandler (self, tBuffer, iterator, newtext, length, widget):
 
-    gDebug (1, "gtk.TextBuffer insert '%s' at %s" % \
-        (newtext, iterator.get_offset ()))
+    try:
+      gDebug (1, "gtk.TextBuffer insert '%s' at %s" % \
+          (newtext, iterator.get_offset ()))
 
-    gfObject = self._uiDriver._WidgetToGFObj [widget]
-    text = unicode (newtext, 'utf-8')
+      gfObject = self._uiDriver._WidgetToGFObj [widget]
+      text = unicode (newtext, 'utf-8')
 
-    action = events.Event ('requestINSERTAT', text, text = text,
-                           position = iterator.get_offset (),
-                           _form = gfObject._form)
+      action = events.Event ('requestINSERTAT', text, text = text,
+                             position = iterator.get_offset (),
+                             _form = gfObject._form)
 
-    tBuffer.stop_emission ('insert-text')
-    self._eventHandler (action)
+      tBuffer.stop_emission ('insert-text')
+      self._eventHandler (action)
 
+    except:
+      self._uiDriver.showException ()
 
 
+
   # ---------------------------------------------------------------------------
   # Handle deletes in a textView widget
   # ---------------------------------------------------------------------------
 
   def deleteBufferHandler (self, tBuffer, start, end, widget):
-    gDebug (1, "gtk.TextBuffer delete %s to %s in %s" \
-        % (start.get_offset (), end.get_offset (), widget))
 
-    gfObject = self._uiDriver._WidgetToGFObj [widget]
+    try:
+      gDebug (1, "gtk.TextBuffer delete %s to %s in %s" \
+          % (start.get_offset (), end.get_offset (), widget))
 
-    action = events.Event ('requestDELETERANGE',
-                            start_pos = start.get_offset (),
-                            end_pos   = end.get_offset (),
-                            position  = tBuffer.get_iter_at_mark ( \
+      gfObject = self._uiDriver._WidgetToGFObj [widget]
+
+      action = events.Event ('requestDELETERANGE',
+                              start_pos = start.get_offset (),
+                              end_pos   = end.get_offset (),
+                              position  = tBuffer.get_iter_at_mark ( \
                                           tBuffer.get_insert ()).get_offset (),
-                            _form     = gfObject._form)
+                              _form     = gfObject._form)
 
-    tBuffer.stop_emission ('delete-range')
-    self._eventHandler (action)
+      tBuffer.stop_emission ('delete-range')
+      self._eventHandler (action)
 
+    except:
+      self._uiDriver.showException ()
 
+
   # ---------------------------------------------------------------------------
   # Handle the tab-key in a textView widget to move the focus
   # ---------------------------------------------------------------------------
@@ -340,31 +356,36 @@
     both keys move the cursor in the text view widget. Up- and down-keys in the
     first or last row moves the focus out of the widget.
     """
-    if event.keyval == gtk.keysyms.Down:
-      tBuffer = widget.get_buffer ()
 
-      currLine = tBuffer.get_iter_at_mark (tBuffer.get_insert ()).get_line ()
-      lastLine = tBuffer.get_end_iter ().get_line ()
+    try:
+      if event.keyval == gtk.keysyms.Down:
+        tBuffer = widget.get_buffer ()
 
-      if currLine != lastLine:
-        tBuffer.place_cursor (tBuffer.get_iter_at_line (currLine + 1))
-      else:
-        widget.get_toplevel ().child_focus (gtk.DIR_TAB_FORWARD)
+        currLine = tBuffer.get_iter_at_mark (tBuffer.get_insert ()).get_line ()
+        lastLine = tBuffer.get_end_iter ().get_line ()
 
-      return gtk.TRUE
+        if currLine != lastLine:
+          tBuffer.place_cursor (tBuffer.get_iter_at_line (currLine + 1))
+        else:
+          widget.get_toplevel ().child_focus (gtk.DIR_TAB_FORWARD)
 
-    elif event.keyval == gtk.keysyms.Up:
-      tBuffer = widget.get_buffer ()
-      currLine = tBuffer.get_iter_at_mark (tBuffer.get_insert ()).get_line ()
+        return gtk.TRUE
 
-      if currLine > 0:
-        tBuffer.place_cursor (tBuffer.get_iter_at_line (currLine - 1))
+      elif event.keyval == gtk.keysyms.Up:
+        tBuffer = widget.get_buffer ()
+        currLine = tBuffer.get_iter_at_mark (tBuffer.get_insert ()).get_line ()
 
-      else:
-        widget.get_toplevel ().child_focus (gtk.DIR_TAB_BACKWARD)
+        if currLine > 0:
+          tBuffer.place_cursor (tBuffer.get_iter_at_line (currLine - 1))
 
-      return gtk.TRUE
+        else:
+          widget.get_toplevel ().child_focus (gtk.DIR_TAB_BACKWARD)
 
+        return gtk.TRUE
+
+    except:
+      self._uiDriver.showException ()
+
     # Key not handled, leave it up to the common handler
     return gtk.FALSE
 
@@ -378,19 +399,28 @@
     This function fires a 'requestTOGGLECHECKBOX' event if the state of a
     checkbutton widget changes.
     """
-    buttonStatus = widget.get_active ()
 
-    gfObject  = self._uiDriver._WidgetToGFObj [widget]
-    eventdata = [gfObject, buttonStatus]
-    action = events.Event ('requestTOGGLECHKBOX', data = eventdata,
-                           _form = gfObject._form)
+    try:
+      buttonStatus = widget.get_active ()
 
-    widget.stop_emission ('toggled')
+      gfObject  = self._uiDriver._WidgetToGFObj [widget]
+      eventdata = [gfObject, buttonStatus]
+      action = events.Event ('requestTOGGLECHKBOX', data = eventdata,
+                             _form = gfObject._form)
 
-    self._eventHandler (action)
-    return gtk.TRUE
+      widget.stop_emission ('toggled')
 
+      self._eventHandler (action)
 
+      return gtk.TRUE
+
+    except:
+      self._uiDriver.showException ()
+
+    return False
+
+
+
   # ---------------------------------------------------------------------------
   # Update the list of allowed values on a Combo widget if neccessary
   # ---------------------------------------------------------------------------
@@ -482,29 +512,38 @@
   # ---------------------------------------------------------------------------
 
   def _selectionChanged (self, treeSelection, gfObject):
-    (model, tIter) = treeSelection.get_selected ()
-    desc = model.get_value (tIter, 1)
-    fRef = gfObject._form
 
-    action = events.Event ('requestFOCUS', gfObject, _form = fRef)
-    self._eventHandler (action)
+    try:
+      (model, tIter) = treeSelection.get_selected ()
+      desc = model.get_value (tIter, 1)
+      fRef = gfObject._form
 
-    action = events.Event ('requestREPLACEVALUE', text = desc, _form = fRef)
-    self._eventHandler (action)
+      action = events.Event ('requestFOCUS', gfObject, _form = fRef)
+      self._eventHandler (action)
 
+      action = events.Event ('requestREPLACEVALUE', text = desc, _form = fRef)
+      self._eventHandler (action)
 
+    except:
+      self._uiDriver.showException ()
+
   # ---------------------------------------------------------------------------
   # Move ui-focus to the corresponding tree view if a slider gets changed
   # ---------------------------------------------------------------------------
 
   def _focusOnScroll (self, adjustment, treeView):
-    gDebug (3, "grabing focus to %s on adjustment-change %s" % (treeView,
-      adjustment))
-    self._blockHandler (treeView, '_focusHandler')
-    treeView.grab_focus ()
-    self._blockHandler (treeView, '_focusHandler', True)
 
+    try:
+      gDebug (3, "grabing focus to %s on adjustment-change %s" % (treeView,
+        adjustment))
+      self._blockHandler (treeView, '_focusHandler')
+      treeView.grab_focus ()
+      self._blockHandler (treeView, '_focusHandler', True)
 
+    except:
+      self._uiDriver.showException ()
+
+
   # ---------------------------------------------------------------------------
   # Handle the release of a mouse button
   # ---------------------------------------------------------------------------
@@ -515,28 +554,33 @@
     widget has a selection requestSELECTWITHMOUSE otherwise requestCURSORMOVE
     will be fired.
     """
-    if isinstance (widget, gtk.TextView):
-      tBuffer = widget.get_buffer ()
-      cPos = tBuffer.get_iter_at_mark (tBuffer.get_insert ()).get_offset ()
-      bMarks = tBuffer.get_selection_bounds ()
-      if len (bMarks):
-        bounds = [it.get_offset () for it in bMarks]
-      else:
-        bounds = []
 
-    elif isinstance (widget, gtk.Entry):
-      cPos   = widget.get_position ()
-      bounds = widget.get_selection_bounds ()
+    try:
+      if isinstance (widget, gtk.TextView):
+        tBuffer = widget.get_buffer ()
+        cPos = tBuffer.get_iter_at_mark (tBuffer.get_insert ()).get_offset ()
+        bMarks = tBuffer.get_selection_bounds ()
+        if len (bMarks):
+          bounds = [it.get_offset () for it in bMarks]
+        else:
+          bounds = []
 
-    gDebug (1, "Button-Release: %s (%s) %s %s" % (widget, self._gfObject.name,
+      elif isinstance (widget, gtk.Entry):
+        cPos   = widget.get_position ()
+        bounds = widget.get_selection_bounds ()
+
+      gDebug (1, "Button-Release: %s (%s) %s %s" % (widget, 
self._gfObject.name,
                                                   cPos, bounds))
-    if len (bounds):
-      self._request ('SELECTWITHMOUSE', position1 = bounds [0],
-                     position2 = bounds [1], cursor = cPos)
-    else:
-      self._request ('CURSORMOVE', position = cPos)
+      if len (bounds):
+        self._request ('SELECTWITHMOUSE', position1 = bounds [0],
+                       position2 = bounds [1], cursor = cPos)
+      else:
+        self._request ('CURSORMOVE', position = cPos)
 
+    except:
+      self._uiDriver.showException ()
 
+
 # -----------------------------------------------------------------------------
 # Base configuration data
 # -----------------------------------------------------------------------------

Modified: trunk/gnue-forms/src/uidrivers/gtk2/widgets/form/widget.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/widgets/form/widget.py  2004-08-30 
12:37:51 UTC (rev 6229)
+++ trunk/gnue-forms/src/uidrivers/gtk2/widgets/form/widget.py  2004-08-30 
14:04:39 UTC (rev 6230)
@@ -247,5 +247,11 @@
   # ---------------------------------------------------------------------------
 
   def windowExitEvent (self, widget, event):
-    self._uiDriver.dispatchEvent ('requestEXIT', _form = self._form)
+
+    try:
+      self._uiDriver.dispatchEvent ('requestEXIT', _form = self._form)
+
+    except:
+      self._uiDriver.showException ()
+
     return True

Modified: trunk/gnue-forms/src/uidrivers/gtk2/widgets/form/wrappers.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/widgets/form/wrappers.py        
2004-08-30 12:37:51 UTC (rev 6229)
+++ trunk/gnue-forms/src/uidrivers/gtk2/widgets/form/wrappers.py        
2004-08-30 14:04:39 UTC (rev 6230)
@@ -24,7 +24,6 @@
 import gtk
 
 from gnue.common import events
-from gnue.common.apps import GDebug
 
 # =============================================================================
 # Constants
@@ -178,7 +177,7 @@
 
   def createPage (self, gfObject):
 
-    GDebug.printMesg (3, "createPage %s for %s" % (self, gfObject))
+    gDebug (3, "createPage %s for %s" % (self, gfObject))
     newWidget = gtk.Fixed ()
     swin = gtk.ScrolledWindow ()
 
@@ -209,21 +208,25 @@
   # ---------------------------------------------------------------------------
 
   def notebookTabHandler (self, notebook, notebookpage, pageNr):
-    GDebug.printMesg (3, "switch-page %s %s %s" % \
-        (pageNr, self._oldpage, notebook))
-    if self._oldpage != pageNr:
-      action = events.Event ('requestPAGE', pageNr, _form = self.form)
-      self.uiform._eventHandler (action)
+    try:
+      gDebug (3, "switch-page %s %s %s" % (pageNr, self._oldpage, notebook))
 
-      notebook.stop_emission ('switch-page')
+      if self._oldpage != pageNr:
+        action = events.Event ('requestPAGE', pageNr, _form = self.form)
+        self.uiform._eventHandler (action)
 
+        notebook.stop_emission ('switch-page')
 
+    except:
+      self.uiform._uiDriver.showException ()
+
+
   # ---------------------------------------------------------------------------
   # Activate a given page in the notebook
   # ---------------------------------------------------------------------------
 
   def setPage (self, page):
-    GDebug.printMesg (3, "SET-PAGE %s to %s" % (self, page))
+    gDebug (3, "SET-PAGE %s to %s" % (self, page))
 
     swin = page.get_parent ().get_parent ()
     pageNum = self.page_num (swin)

Modified: trunk/gnue-forms/src/uidrivers/gtk2/widgets/scrollbar.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/widgets/scrollbar.py    2004-08-30 
12:37:51 UTC (rev 6229)
+++ trunk/gnue-forms/src/uidrivers/gtk2/widgets/scrollbar.py    2004-08-30 
14:04:39 UTC (rev 6230)
@@ -61,11 +61,17 @@
   # ---------------------------------------------------------------------------
 
   def _scrollHandler (self, adjustment, gfObject):
-    gDebug (1, "Adjust to %s" % (int (adjustment.value)))
-    action = events.Event ('requestRECORDNUMBER', int (adjustment.value),
-                           _form = gfObject._form)
-    adjustment.stop_emission ('value-changed')
-    gtk.idle_add (self._eventHandler, action)
+
+    try:
+      gDebug (1, "Adjust to %s" % (int (adjustment.value)))
+      action = events.Event ('requestRECORDNUMBER', int (adjustment.value),
+                             _form = gfObject._form)
+      adjustment.stop_emission ('value-changed')
+      gtk.idle_add (self._eventHandler, action)
+
+    except:
+      self._uiDriver.showException ()
+
     return True
 
 

Modified: trunk/gnue-forms/src/uidrivers/win32/UIdriver.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/win32/UIdriver.py    2004-08-30 12:37:51 UTC 
(rev 6229)
+++ trunk/gnue-forms/src/uidrivers/win32/UIdriver.py    2004-08-30 14:04:39 UTC 
(rev 6230)
@@ -326,8 +326,8 @@
     except AttributeError:
       pass
 
-
-  def messageBox (self, message, kind = 'Info', title = None, cancel = False):
+
+  def _showMessage (self, message, kind = 'Info', title = None, cancel = 
False):
     """
     This function creates a message box of a given kind and returns True, False
     or None depending on the button pressed.
@@ -359,3 +359,6 @@
     res = win32gui.MessageBox(0, message, title, flags)
 
     return self._RESPONSE [res]
+
+  def _showException (self, group, name, message, detail):
+    self.showMessage (detail, kind = 'Error')

Modified: trunk/gnue-forms/src/uidrivers/wx/UIdriver.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/wx/UIdriver.py       2004-08-30 12:37:51 UTC 
(rev 6229)
+++ trunk/gnue-forms/src/uidrivers/wx/UIdriver.py       2004-08-30 14:04:39 UTC 
(rev 6230)
@@ -64,6 +64,20 @@
 #
 class GFUserInterface(commonToolkit.GFUserInterface):
 
+  _MBOX_KIND = {'Info'    : {'style': wxICON_INFORMATION | wxOK,
+                             'title': _("Information")},
+                'Warning' : {'style': wxICON_EXCLAMATION | wxOK,
+                             'title': _("Warning")},
+                'Question': {'style': wxICON_QUESTION    | wxYES_NO,
+                             'title': _("Question")},
+                'Error'   : {'style': wxICON_ERROR       | wxOK,
+                             'title': _("Error")}}
+
+  _RESPONSE = {wxID_OK    : True,
+               wxID_YES   : True,
+               wxID_NO    : False,
+               wxID_CANCEL: None}
+
   def initialize(self):
 
     ################################################################
@@ -256,3 +270,36 @@
       object = _eventObjTowxWindow(event)
       object.Destroy()
       # wxExit() TODO: Try and work this into navigator or here if it still 
hangs
+
+
+  # ---------------------------------------------------------------------------
+  # Show a message dialog
+  # ---------------------------------------------------------------------------
+
+  def _showMessage (self, message, kind = 'Info', title = None, cancel = 
False):
+
+    style = self._MBOX_KIND [kind]['style']
+    if cancel:
+      style |= wxCANCEL
+
+    if title is None:
+      title = self._MBOX_KIND [kind]['title']
+
+    dialog = wxMessageDialog (None, message, title, style)
+    try:
+      result = dialog.ShowModal ()
+      return self._RESPONSE [result]
+
+    finally:
+      dialog.Destroy ()
+
+
+  # ---------------------------------------------------------------------------
+  # Show an exception
+  # TODO: please implement a better dialog box, i.e. add a button for
+  #       detail-display and so on
+  # ---------------------------------------------------------------------------
+
+  def _showException (self, group, name, message, detail):
+
+    self._showMessage (detail, 'Error')





reply via email to

[Prev in Thread] Current Thread [Next in Thread]