[Top][All Lists]
[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')
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- r6230 - in trunk/gnue-forms/src: . uidrivers/_base uidrivers/curses uidrivers/gtk2 uidrivers/gtk2/widgets uidrivers/gtk2/widgets/form uidrivers/win32 uidrivers/wx,
johannes <=