commit-gnue
[Top][All Lists]
Advanced

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

r5993 - in trunk/gnue-forms/src: . uidrivers/_base uidrivers/_base/widge


From: johannes
Subject: r5993 - in trunk/gnue-forms/src: . uidrivers/_base uidrivers/_base/widgets uidrivers/gtk2 uidrivers/gtk2/widgets uidrivers/gtk2/widgets/form
Date: Tue, 20 Jul 2004 08:58:55 -0500 (CDT)

Author: johannes
Date: 2004-07-20 08:58:53 -0500 (Tue, 20 Jul 2004)
New Revision: 5993

Added:
   trunk/gnue-forms/src/uidrivers/gtk2/about.py
Modified:
   trunk/gnue-forms/src/GFDisplayHandler.py
   trunk/gnue-forms/src/GFForm.py
   trunk/gnue-forms/src/GFInstance.py
   trunk/gnue-forms/src/uidrivers/_base/UIdriver.py
   trunk/gnue-forms/src/uidrivers/_base/widgets/_base.py
   trunk/gnue-forms/src/uidrivers/gtk2/MenuBar.py
   trunk/gnue-forms/src/uidrivers/gtk2/UIdriver.py
   trunk/gnue-forms/src/uidrivers/gtk2/common.py
   trunk/gnue-forms/src/uidrivers/gtk2/widgets/__init__.py
   trunk/gnue-forms/src/uidrivers/gtk2/widgets/_base.py
   trunk/gnue-forms/src/uidrivers/gtk2/widgets/box.py
   trunk/gnue-forms/src/uidrivers/gtk2/widgets/button.py
   trunk/gnue-forms/src/uidrivers/gtk2/widgets/component.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/image.py
   trunk/gnue-forms/src/uidrivers/gtk2/widgets/label.py
   trunk/gnue-forms/src/uidrivers/gtk2/widgets/page.py
   trunk/gnue-forms/src/uidrivers/gtk2/widgets/scrollbar.py
Log:
Started work on GTK2 driver for forms. Basic things should work.


Modified: trunk/gnue-forms/src/GFDisplayHandler.py
===================================================================
--- trunk/gnue-forms/src/GFDisplayHandler.py    2004-07-20 13:52:09 UTC (rev 
5992)
+++ trunk/gnue-forms/src/GFDisplayHandler.py    2004-07-20 13:58:53 UTC (rev 
5993)
@@ -89,6 +89,8 @@
 
 
   def generateRefreshEvent(self):
+    GDebug.printMesg (2, "generateRefreshEvent on %s '%s' %s" % \
+        (self, self.display, self.entry))
     # TODO: this should probably actually happen in UIwxpython!
     if (self.handleCR and type(self.display)=='str'):
       self.dispatchEvent(events.Event('updateEntryEditor',
@@ -261,8 +263,8 @@
 
     self.selection1 = event.start_pos
     self.selection2 = event.end_pos
-    self.cursor = event.position
-    self.delete(event)
+    self.cursor     = event.position
+    self.delete (event)
 
   # Delete backwards one character
   def backspace(self, event):
@@ -822,13 +824,13 @@
       self.display = self._buildDisplayHelper(self.value, False)
 
 
-  def replaceText(self, event):
+  def replaceText (self, event):
     if not self.editing:
       return
 
     self.selection1 = 0
-    self.selection2 = len(self.display)
-    self.addText(event)
+    self.selection2 = len (self.display)
+    self.addText (event)
 
 # TODO: Kills dropdown handling with keyboard on win32
 # TODO: needs more work :(

Modified: trunk/gnue-forms/src/GFForm.py
===================================================================
--- trunk/gnue-forms/src/GFForm.py      2004-07-20 13:52:09 UTC (rev 5992)
+++ trunk/gnue-forms/src/GFForm.py      2004-07-20 13:58:53 UTC (rev 5993)
@@ -42,6 +42,7 @@
 from gnue.common.datasources import ConnectionTriggerObj
 from gnue.forms.GFObjects import *
 from gnue.forms import GFParser
+from gnue.forms.uidrivers._base import UIdriver as BaseDriver
 
 
 # Defines which objects are "Tab Stops"
@@ -91,7 +92,7 @@
     #
     # Trigger support
     #
-    self._triggerns={}
+    self._triggerns = {}
     self._triggerGlobal = True # Put this object into the global namespace by 
it's name
 
     self._validTriggers = { 'ON-STARTUP':     'On-Startup',
@@ -131,6 +132,9 @@
                               
'showMessage':{'function':self.triggerShowMessageBox,
                                              'global': True,
                                              },
+                              'messageBox': {
+                                   'function': self.triggerMessageBox,
+                                   'global': True},
                               'commit':{'function':self.commit,
                                         'global': True,
                                         },
@@ -165,6 +169,7 @@
       'GUI:STATUSBAR:SUPPRESS': False,
     }
 
+    self.__updateTriggerNs ()
     self._in_trigger_lock = False
 
   #
@@ -310,8 +315,14 @@
 
     # cannot change focus to same entry
     if widget == self._currentEntry:
+      GDebug.printMesg (1, "Widget is current entry %s" % widget)
       return
 
+    cen = self._currentEntry is not None and self._currentEntry.name or '-'
+    win = widget is not None and widget.name or '-'
+    GDebug.printMesg (1, "Changing focus from %s (%s) to %s (%s)" % \
+        (self._currentEntry, cen, widget, win))
+
     try:
       if self._currentEntry:
 
@@ -321,7 +332,7 @@
             if len(str(val)) < self._currentEntry._field.minLength:
               message = _("Minimum required length %d" % 
self._currentEntry._field.minLength )
               # Piggybacking off the triggers message box code
-              self.triggerShowMessageBox(message)
+              self.triggerShowMessageBox (message)
               return
 
         event = events.Event('endEDITMODE',_form=self)
@@ -375,6 +386,9 @@
       if blockChange:
         self.refreshDisplay(self._currentBlock)
 
+      GDebug.printMesg (1, "Updating entries old: %s, new: %s" % \
+          (oldEntry, self._currentEntry))
+
       self.dispatchEvent('updateENTRY', oldEntry, _form=self)
       self.dispatchEvent('updateENTRY', self._currentEntry, _form=self)
 
@@ -395,7 +409,9 @@
         if pageChange:
           self._currentPage.processTrigger('Post-FocusIn', ignoreAbort=False)
 
+      GDebug.printMesg (1, "calling refreshUIEvents ()")
       self.refreshUIEvents()
+      GDebug.printMesg (1, "CurrentEntry is %s" % self._currentEntry)
 
     except AbortRequest, t:
       GDebug.printMesg(1, "Trigger Error!")
@@ -556,6 +572,7 @@
           if block.autoClear:
             block.processClear()
           else:
+            GDebug.printMesg (1, "switchRecord (0) from commit")
             block.switchRecord(0)
 
         self.dispatchEvent('cannotCOMMIT')
@@ -897,9 +914,29 @@
   #
   # display a standard message box
   #
-  def triggerShowMessageBox(self, msgtxt, caption='GNUe Message', 
title='Information'):
-    self._instance.displayMessageBox(msgtxt,caption,title)
+  def triggerShowMessageBox (self, msgtxt, caption='GNUe Message',
+      title='Information', kind = None, cancel = False):
+    return self._instance.displayMessageBox (msgtxt, kind, cancel, caption,
+                                             title)
 
+
+  # ---------------------------------------------------------------------------
+  # Show a message box using the given message
+  # ---------------------------------------------------------------------------
+
+  def triggerMessageBox (self, message, kind = None, title = None,
+      cancel = False):
+    """
+    This function brings up a message box of a given kind.
+    @param message: text to be displayed
+    @param kind: one of the MBOX_* constants defining the type of message box.
+        These constants are defined in uidrivers._base.UIdriver
+    @param cancel: Boolean flag indicating wether a cancel button will be
+        included or not.
+    @return: one of the RESPONSE_* constans from the base-UIdriver
+    """
+    return self._instance.displayMessageBox (message, kind, cancel, '', title)
+
   #
   # triggerSetFocus
   #
@@ -1059,3 +1096,17 @@
     self.processTrigger(name)
 
 
+  # ---------------------------------------------------------------------------
+  # Update the trigger namespace with some UI-driver constants
+  # ---------------------------------------------------------------------------
+
+  def __updateTriggerNs (self):
+    """
+    This function adds message-box-constants to the trigger namespace. Use the
+    MBOX_* constants to define the type of message box to be displayed. All
+    RESPONSE_* constants are the return values.
+    """
+    for k in ['MBOX_INFO', 'MBOX_WARNING', 'MBOX_ERROR', 'MBOX_QUESTION',
+              'RESPONSE_OK', 'RESPONSE_CLOSE', 'RESPONSE_CANCEL',
+              'RESPONSE_YES', 'RESPONSE_NO']:
+      self._triggerns [k] = getattr (BaseDriver, k)

Modified: trunk/gnue-forms/src/GFInstance.py
===================================================================
--- trunk/gnue-forms/src/GFInstance.py  2004-07-20 13:52:09 UTC (rev 5992)
+++ trunk/gnue-forms/src/GFInstance.py  2004-07-20 13:58:53 UTC (rev 5993)
@@ -40,6 +40,7 @@
 from gnue.forms.GFParser import loadFile
 from gnue.forms import VERSION
 from gnue.forms import GFKeyMapper
+from gnue.forms.uidrivers._base import UIdriver as BaseDriver
 from gnue.common.apps import GDebug
 from gnue.common.datasources import GDataObjects, GConnections
 from gnue.common import events
@@ -163,6 +164,8 @@
     GFKeyMapper.KeyMapper.loadUserKeyMap(mapping)
 
 
+
+
   def addDialogs(self):
     """
     Loads the base dialogs into memory.
@@ -321,7 +324,7 @@
   #  Builds a UI based upon a specific form and
   #  sets that form to active status
   #
-  def activateForm(self,formName='__main__',parameters={}, modal=0):
+  def activateForm (self, formName = '__main__', parameters = {}, modal = 0):
     form = self._formsDictionary[formName]
 
     if parameters != {}:
@@ -332,13 +335,12 @@
 
     form.processTrigger('On-Activation')
 
-    self._uiinstance.activateForm(formName,modal)
+    self._uiinstance.activateForm (formName, modal)
 
-    self.dispatchEvent('gotoENTRY',object=form._currentEntry,
-                       _form=form)
+    self.dispatchEvent ('gotoENTRY', object = form._currentEntry, _form = form)
 
-    form.refreshDisplay(form)
-    self.updateStatus(form)
+    form.refreshDisplay (form)
+    self.updateStatus (form)
 
   #
   # buildForm
@@ -477,7 +479,7 @@
       # then the proxied event should set this to the
       # message text
       if event.__errortext__:
-        self.displayMessageBox(event.__errortext__)
+        self.displayMessageBox (event.__errortext__, BaseDriver.MBOX_ERROR)
 
   def nextEntry(self, event):
     """
@@ -494,7 +496,7 @@
     if origEntry == event._form._currentEntry:
       message = event._form.nextEntry()
       if message:
-        self.displayMessageBox( message)
+        self.displayMessageBox (message)
         return
       self.dispatchEvent('gotoENTRY',object=event._form._currentEntry, 
_form=event._form)
     self.updateRecordStatus(event._form)
@@ -602,7 +604,7 @@
       return
     message = event._form.prevRecord()
     if message:
-      self.displayMessageBox(message)
+      self.displayMessageBox (message)
 
       return
     self._entryUpdated(event._form)
@@ -618,7 +620,7 @@
       return
     message = event._form.nextRecord()
     if message:
-      self.displayMessageBox(message)
+      self.displayMessageBox (message)
 
       return
     self._entryUpdated(event._form)
@@ -634,7 +636,7 @@
       return
     message = event._form.firstRecord()
     if message:
-      self.displayMessageBox(message)
+      self.displayMessageBox (message)
 
       return
     self._entryUpdated(event._form)
@@ -650,7 +652,7 @@
       return
     message = event._form.lastRecord()
     if message:
-      self.displayMessageBox(message)
+      self.displayMessageBox (message)
 
       return
     self._entryUpdated(event._form)
@@ -677,7 +679,7 @@
       message = event._form.jumpRecord(count)
 
     if message:
-      self.displayMessageBox(message)
+      self.displayMessageBox (message, BaseDriver.MBOX_ERROR)
 
       return
 
@@ -763,7 +765,8 @@
 
 
       if not event._form.isSaved():
-        self.displayMessageBox( _('Data not saved. Save changes or clear the 
form to proceed.'))
+        self.displayMessageBox (_("Data not saved. Save changes or clear "
+                           "the form to proceed."), BaseDriver.MBOX_ERROR)
         event._form.refreshUIEvents()
       else:
         event._form.processTrigger('On-Exit')
@@ -771,7 +774,7 @@
                            _('Current data is saved'),
                            _formName=event._form.name)
     except AbortRequest, t:
-      self.displayMessageBox(t)
+      self.displayMessageBox (t, BaseDriver.MBOX_WARNING)
       event._form.refreshUIEvents()
 
   #
@@ -809,30 +812,39 @@
   #
   # Displays the about dialog
   #
-  def executeAbout(self,event):
+  def executeAbout (self, event):
     parameters = {
       'appversion'  : VERSION,
-      'ui_driver'    : self._uiinstance.name,
+      'ui_driver'   : self._uiinstance.name,
       'name'        : event._form.title or "Unknown",
-      'formversion' : event._form.getOption('version') or "Unknown",
-      'author'      : event._form.getOption('author') or "Unknown",
-      'description' : event._form.getOption('description') or "Unknown",
-      }
-    self.activateForm('_about', parameters, modal=1)
+      'formversion' : event._form.getOption ('version') or "Unknown",
+      'author'      : event._form.getOption ('author') or "Unknown",
+      'description' : event._form.getOption ('description') or "Unknown",
+    }
 
+    if hasattr (self._uiinstance, 'aboutBox'):
+      self._uiinstance.aboutBox (parameters, event._form)
+    else:
+      self.activateForm('_about', parameters, modal=1)
 
+
   #
   # displayMessageBox
   #
   # Displays a generic message box
   #
-  def displayMessageBox(self, message='', caption='GNUe Message', 
title='Information'):
+  def displayMessageBox (self, message = '', kind = None, cancel = False,
+      caption = 'GNUe Message', title = 'Information'):
      parameters = {
-       'caption':caption,
-       'message':message,
-       'title':title
+       'caption': caption,
+       'message': message,
+       'title'  : title
        }
-     self.activateForm('_messageBox', parameters, modal=1)
+     if hasattr (self._uiinstance, 'messageBox'):
+       res = self._uiinstance.messageBox (message, kind, title, cancel)
+       return res
+     else:
+       self.activateForm ('_messageBox', parameters, modal = 1)
 
 
   #
@@ -845,7 +857,7 @@
     parameters = {
       'recordnumber': ''
       }
-    self.activateForm('_jumpto', parameters, modal=1)
+    self.activateForm ('_jumpto', parameters, modal = True)
 
     if not parameters.has_key('cancel'):
       if not event._form.endEditing():
@@ -858,7 +870,7 @@
         message = event._form.jumpRecord(count)
 
       if message:
-        self.displayMessageBox(message)
+        self.displayMessageBox (message)
 
         return
 
@@ -911,6 +923,8 @@
   # an event source
   #
   def changeFocus(self, event):
+    GDebug.printMesg (2, "GFInstance.ChangeFocus: %s" % event.data.name)
+
     if not event._form.endEditing():
       return False
     if event.data._type=='GFEntry' or event.data._type=='GFImage':
@@ -918,15 +932,18 @@
         return False
 
       newEntry = event.data
+      GDebug.printMesg (2, "Calling _form.changeFocus () on %s" % event._form)
       message = event._form.changeFocus(newEntry)
       if message:
-        self.displayMessageBox( message)
+        self.displayMessageBox (message)
         return False
 
       self.dispatchEvent('gotoENTRY',object=event._form._currentEntry, 
_form=event._form)
       self.updateRecordStatus(event._form)
       self.updateTip(event._form)
 
+    GDebug.printMesg (2, "Leaving GFInstance.ChangeFocus: %s" % \
+        event._form._currentEntry)
     return True
 
   #
@@ -939,7 +956,7 @@
     message = event._form.initQuery()
 
     if message:
-      self.displayMessageBox(message)
+      self.displayMessageBox (message)
 
       return
 
@@ -957,7 +974,7 @@
     message = event._form.cancelQuery()
 
     if message:
-      self.displayMessageBox(message)
+      self.displayMessageBox (message)
 
       return
 
@@ -975,7 +992,7 @@
     message = event._form.copyQuery()
 
     if message:
-      self.displayMessageBox(message)
+      self.displayMessageBox (message)
 
       return
 
@@ -991,7 +1008,7 @@
       return
     message = event._form.executeQuery()
     if message:
-      self.displayMessageBox(message)
+      self.displayMessageBox (message)
 
     self.dispatchEvent('gotoENTRY',object=event._form._currentEntry, 
_form=event._form)
     event._form.refreshDisplay(event._form._currentBlock)
@@ -1005,7 +1022,7 @@
       return
     message = event._form.commit()
     if message:
-      self.displayMessageBox(message)
+      self.displayMessageBox (message)
 
       return
     self._entryUpdated(event._form)

Modified: trunk/gnue-forms/src/uidrivers/_base/UIdriver.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/_base/UIdriver.py    2004-07-20 13:52:09 UTC 
(rev 5992)
+++ trunk/gnue-forms/src/uidrivers/_base/UIdriver.py    2004-07-20 13:58:53 UTC 
(rev 5993)
@@ -63,7 +63,17 @@
       except ImportError:
         return 'default'
 
+MBOX_INFO     = 0
+MBOX_WARNING  = 1
+MBOX_QUESTION = 2
+MBOX_ERROR    = 3
 
+RESPONSE_OK     = 0
+RESPONSE_CLOSE  = 1
+RESPONSE_CANCEL = 2
+RESPONSE_YES    = 3
+RESPONSE_NO     = 4
+
 #
 # GFUserInterfaceBase
 #
@@ -233,7 +243,7 @@
       # Add to the cross refernce
       #
       self._gfObjToUIWidget[object]=uiWidget
-      GDebug.printMesg(0, "OBJECT%s "% object)
+      GDebug.printMesg(0, "OBJECT %s: %s " % (object.name, object))
       GDebug.printMesg(0, "WIDGET %s " % uiWidget)
 
       #
@@ -345,10 +355,14 @@
       value = 
handler.getDisplayFiller(block._resultSet.getRecord(currentRecord- \
                               (index-count)).getField(field.field))
 
+      GDebug.printMesg (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)
 
     # Fill trailing spots
@@ -372,6 +386,8 @@
         else:
           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)
       count += 1
 
@@ -386,6 +402,8 @@
   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)
 

Modified: trunk/gnue-forms/src/uidrivers/_base/widgets/_base.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/_base/widgets/_base.py       2004-07-20 
13:52:09 UTC (rev 5992)
+++ trunk/gnue-forms/src/uidrivers/_base/widgets/_base.py       2004-07-20 
13:58:53 UTC (rev 5993)
@@ -102,7 +102,10 @@
         newWidget = self.createWidget(self._creationEvent, spacer)
         self.widgets.append(newWidget)
 
+      GDebug.printMesg (1, "WIDGETS.APPEND: %s, %s (%s)" % \
+            (self._gfObject.name, self, self.widgets))
 
+
   #
   # The following functions should be overridden by the widgets
   # in the ui driver.

Modified: trunk/gnue-forms/src/uidrivers/gtk2/MenuBar.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/MenuBar.py      2004-07-20 13:52:09 UTC 
(rev 5992)
+++ trunk/gnue-forms/src/uidrivers/gtk2/MenuBar.py      2004-07-20 13:58:53 UTC 
(rev 5993)
@@ -35,13 +35,14 @@
 
   # Create the menu
   def init(self):
-    self.menu = menu = gtk.MenuBar()
-    self.container.content_table.attach(menu,
+    self.menu = gtk.MenuBar()
+    self.container.content_table.attach(self.menu,
                                      # X direction           Y direction
                                        0, 1,                      0, 1,
                                        gtk.EXPAND | gtk.FILL,     0,
                                        0,                         0)
-    return menu
+    self.menu.show ()
+    return self.menu
 
   def correctLabel(self,label):
     # TODO: remove decode step, when gettext translations are send

Modified: trunk/gnue-forms/src/uidrivers/gtk2/UIdriver.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/UIdriver.py     2004-07-20 13:52:09 UTC 
(rev 5992)
+++ trunk/gnue-forms/src/uidrivers/gtk2/UIdriver.py     2004-07-20 13:58:53 UTC 
(rev 5993)
@@ -47,92 +47,97 @@
     raise ImportError
 
 except ImportError:
-  raise Exceptions.DriverNotSupported, _("The GNUe-Forms GTK driver requires 
PyGTK and GTK 2.x.")
+  raise Exceptions.DriverNotSupported, \
+      _("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
-from gnue.common.utils.TextUtils import lineWrap
 
 
 from gnue.forms.GFForm import *
 
+from gnue.forms.uidrivers._base import UIdriver as BaseDriver
 from gnue.forms.uidrivers._commonGuiToolkit import UIdriver as commonToolkit
 
 from gnue.forms.uidrivers.gtk2.GFApp import *
 from gnue.forms.uidrivers.gtk2.SplashScreen import *
 from gnue.forms.uidrivers.gtk2.widgets._base  import *
-from gnue.forms.uidrivers.gtk2.common import PANGO_SCALE
+from gnue.forms.uidrivers.gtk2 import about
 
 
-#
-# GFUserInterface
-#
-# The public interface to the User Interface
-# All UIs must provide this class
-#
-class GFUserInterface(commonToolkit.GFUserInterface):
+# =============================================================================
+# This class implements a User Interface for GTK2
+# =============================================================================
 
+class GFUserInterface (commonToolkit.GFUserInterface):
+
   _WidgetToGFObj = {}
   _WidgetToUIObj = {}
 
-  def initialize(self):
+  _MBOX_KIND = {BaseDriver.MBOX_INFO    : {'type'   : gtk.MESSAGE_INFO,
+                                           'buttons': gtk.BUTTONS_CLOSE},
+                BaseDriver.MBOX_WARNING : {'type'   : gtk.MESSAGE_WARNING,
+                                           'buttons': gtk.BUTTONS_CLOSE},
+                BaseDriver.MBOX_QUESTION: {'type'   : gtk.MESSAGE_QUESTION,
+                                           'buttons': gtk.BUTTONS_YES_NO},
+                BaseDriver.MBOX_ERROR   : {'type'   : gtk.MESSAGE_ERROR,
+                                           'buttons': gtk.BUTTONS_CLOSE}}
 
-    # self._disabledColour = gtk.gdk.color_parse("light_grey")
+  _RESPONSE = {gtk.RESPONSE_OK    : BaseDriver.RESPONSE_OK,
+               gtk.RESPONSE_CLOSE : BaseDriver.RESPONSE_CLOSE,
+               gtk.RESPONSE_CANCEL: BaseDriver.RESPONSE_CANCEL,
+               gtk.RESPONSE_YES   : BaseDriver.RESPONSE_YES,
+               gtk.RESPONSE_NO    : BaseDriver.RESPONSE_NO}
 
-    ################################################################
-    # GTK Specifics
-    ################################################################
+  # ---------------------------------------------------------------------------
+  # Initialize user interface
+  # ---------------------------------------------------------------------------
 
-    self.app = getApp()
+  def initialize (self):
 
-    #
-    # SplashScreen
-    #
+    self.app = getApp ()
+
     if not self._disableSplash:
-      self.splash = UISplashScreen()
-      self.splash.Show()
-      gtk.timeout_add(1500,lambda splash: splash.destroy(),self.splash)
+      self.splash = UISplashScreen ()
+      self.splash.Show ()
+      gtk.timeout_add (1500, lambda splash: splash.destroy (), self.splash)
 
     #
     # Set default form font
     #
 
-    if gConfigForms('fixedWidthFont'):
-      fontname = 'monospace %s' % gConfigForms('pointSize')
+    if gConfigForms ('fixedWidthFont'):
+      fontname = 'monospace %s' % gConfigForms ('pointSize')
     else:
-      fontname = 'bitstream vera %s' % gConfigForms('pointSize')
+      fontname = 'bitstream vera %s' % gConfigForms ('pointSize')
 
-    self.mono_font = pango.FontDescription(fontname)
+    self.mono_font = pango.FontDescription (fontname)
 
     #
     # Create a dummy window used to compute sizes
     #
-    dummyWindow = gtk.Window()
-    dummyWindow.modify_font(self.mono_font)
+    l = gtk.Label ('')
+    try:
+      l.modify_font (self.mono_font)
+      c = l.get_pango_context ()
+      m = c.get_metrics (self.mono_font, \
+          pango.pango_language_from_string ('english'))
 
-    p_c=dummyWindow.get_pango_context()
-    p_m=p_c.get_metrics(self.mono_font,
-                        pango.pango_language_from_string('english'))
+      self.textWidth  = pango.PIXELS (m.get_approximate_char_width ())
+      self.textHeight = pango.PIXELS (m.get_ascent () + m.get_descent ())
+      self.textHeight = int (self.textHeight * 1.3)
 
-    # The pixel width of text inside a widget
-    self.textWidth    = int (p_m.get_approximate_char_width() / PANGO_SCALE)
+      GDebug.printMesg (1, "%s x %s" % (self.textWidth, self.textHeight))
 
-    # The pixel height of text inside a widget
-    self.textHeight   = int (( p_m.get_ascent() + p_m.get_descent()) \
-                             / PANGO_SCALE * 1.3)
+    finally:
+      l.destroy ()
 
-    # The pixel width of a 1 char widget (for things like buttons)
+
     self.widgetWidth  = self.textWidth
-
-    # The pixel height of a 1 char widget (for things like buttons)
     self.widgetHeight = self.textHeight + 3
 
-    #
-    # Close dummy window so app doesn't hang when all other windows closed
-    #
-    dummyWindow.destroy()
 
 
   #############################################################################
@@ -143,24 +148,24 @@
   # widget set.
   #
 
-  #
-  # _exit
-  #
+  # ---------------------------------------------------------------------------
   # Tells the application to close it's main window
-  #
-  def _exit(self,formName):
-    exitApp = 1
+  # ---------------------------------------------------------------------------
+
+  def _exit (self, formName):
+
+    exitApp = True
     for child in self._children:
       if child._form.name == formName:
-        child.mainWindow.hide()
-        child._visible=0
+        child.mainWindow.hide ()
+        child._visible = False
 
       exitApp = exitApp and not child._visible
 
     if exitApp:
       for child in self._children:
-        child.mainWindow.destroy()
-      self.app.quit()
+        child.mainWindow.destroy ()
+      self.app.quit ()
 
   def _beep(self):
     pass
@@ -192,69 +197,106 @@
     ui = self._gfObjToUIWidget[event._form]
     ui.statusBar1.push(ui.statusBar1.get_context_id("tip"),unicode(event.data))
 
-  #
-  # 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)
-  #
+
+  # ---------------------------------------------------------------------------
+  # Change the cursor into the watch
+  # ---------------------------------------------------------------------------
+
   def beginWait (self, event):
-    # TODO: get _form.mainwindow from event
-    #cursor = gtk.cursor_new(GDK.WATCH)
-    #gdkwin = b.get_window()
-    #gdkwin.set_cursor(watch)
-    GDebug.printMesg(2, "i am in beginWait")
+    ui = self._gfObjToUIWidget [event._form]
+    if ui.mainWindow.window is not None:
+      ui.mainWindow.window.set_cursor (gtk.gdk.Cursor (gtk.gdk.WATCH))
 
-  #
+
+  # ---------------------------------------------------------------------------
   # Called whenever forms leaves a "wait" state
-  #
+  # ---------------------------------------------------------------------------
+
   def endWait (self, event):
-    # self.cursor= gtk.gdk.Cursor(gtk.gdk.MOUSE)
-    GDebug.printMesg(2, "i am in endWait")
+    ui = self._gfObjToUIWidget [event._form]
+    if ui.mainWindow.window is not None:
+      ui.mainWindow.window.set_cursor (gtk.gdk.Cursor (gtk.gdk.LEFT_PTR))
 
 
-  #
-  # Clipboard routines
-  #
-  # If a particular UI has a system-wide clipboard,
-  # these methods should be overridden to use that
-  # clipboard.
-  #
+  # ---------------------------------------------------------------------------
+  # Get some text from the clipboard
+  # ---------------------------------------------------------------------------
+
   def getClipboardContents(self, event):
-    return
-    if wxTheClipboard.Open():
-      data = wxTextDataObject()
-      success = wxTheClipboard.GetData(data)
-      wxTheClipboard.Close()
-    else:
-      success = 0
-      GDebug.printMesg(5,'Unable to open clipboard for read')
+    print "retrieving from clip"
+    try:
+      ui = self._gfObjToUIWidget [event._form]
+      disp = ui.mainWindow.get_screen ().get_display ()
+      clip = gtk.Clipboard (disp, 'CLIPBOARD')
 
-    if success:
-      value = data.GetText()
-    else:
-      GDebug.printMesg(5,'Unable to obtain clipboard contents. Defaulting to 
Empty.')
-      value = None
+      data = clip.wait_for_text ()
+      print "data:", data
 
-    GDebug.printMesg(5, "Getting clipboard value '%s'" % value)
-    event.__result__ = value
+    except:
+      print "sorry ..."
+      data = None
 
+    event.__result__ = data
 
+
+  # ---------------------------------------------------------------------------
+  # Set some text into the clipboard
+  # ---------------------------------------------------------------------------
+
   def setClipboardContents(self, event):
-    return
-    GDebug.printMesg(5,"Setting clipboard '%s'" % event.text)
+    print "Set to clip:", event.text
+    ui = self._gfObjToUIWidget [event._form]
+    if ui.mainWindow.get_screen () is not None:
+      text = "%s" % event.text
+      disp = ui.mainWindow.get_screen ().get_display ()
+      clip = gtk.Clipboard (disp, 'CLIPBOARD')
+      clip.set_text (text.encode ('utf-8'), -1)
+      print "... text sent"
 
-    if wxTheClipboard.Open():
-      value = wxTheClipboard.SetData(wxTextDataObject(event.text))
-      GDebug.printMesg(10,"Set Clipboard Status: %s" % value)
-      wxTheClipboard.Close()
 
-    else:
-      GDebug.printMesg(5,'Unable to open clipboard for write')
 
-  def setTitle(self, event):
-    ui = self._gfObjToUIWidget[event._form]
+  # ---------------------------------------------------------------------------
+  # Set the forms title
+  # ---------------------------------------------------------------------------
+
+  def setTitle (self, event):
+    ui = self._gfObjToUIWidget [event._form]
+
     try:
-      ui.mainWindow.set_title(event.title)
+      ui.mainWindow.set_title (event.title)
     except AttributeError:
       pass
-      
-    
+
+  # ---------------------------------------------------------------------------
+  # create a modal message box
+  # ---------------------------------------------------------------------------
+
+  def messageBox (self, message, kind, title = None, cancel = False):
+    """
+    """
+    mbRec = self._MBOX_KIND.get (kind, self._MBOX_KIND [BaseDriver.MBOX_INFO])
+
+    dialog = gtk.MessageDialog (parent = None, flags = gtk.DIALOG_MODAL,
+        type = mbRec ['type'], buttons = mbRec ['buttons'],
+        message_format = message)
+
+    if title is not None and len (title):
+      dialog.set_title (title.encode ('utf-8'))
+    cButtons = [gtk.BUTTONS_CANCEL, gtk.BUTTONS_OK_CANCEL]
+    if cancel and not mbRec ['buttons'] in cButtons:
+      dialog.add_button (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
+
+    res = dialog.run ()
+    dialog.destroy ()
+
+    return self._RESPONSE [res]
+
+
+  # ---------------------------------------------------------------------------
+  # Display an about box
+  # ---------------------------------------------------------------------------
+
+  def aboutBox (self, params, form):
+    dialog = about.AboutBox (params, form)
+    dialog.run ()
+    dialog.destroy ()

Added: trunk/gnue-forms/src/uidrivers/gtk2/about.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/about.py        2004-07-20 13:52:09 UTC 
(rev 5992)
+++ trunk/gnue-forms/src/uidrivers/gtk2/about.py        2004-07-20 13:58:53 UTC 
(rev 5993)
@@ -0,0 +1,108 @@
+#
+# This file is part of GNU Enterprise CD Database.
+#
+# 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
+# version 2, or (at your option) any later version.
+#
+# GNU Enterprise is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with program; see the file COPYING. If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place
+# - Suite 330, Boston, MA 02111-1307, USA.
+#
+# Copyright 2001-2004 Free Software Foundation
+#
+# $Id: $
+
+import gtk
+
+from gnue.common.apps import GDebug
+
+# =============================================================================
+# Class implementing an about box for GTK2
+# =============================================================================
+
+class AboutBox (gtk.Dialog):
+
+  # ---------------------------------------------------------------------------
+  # Constructor
+  # ---------------------------------------------------------------------------
+
+  def __init__ (self, params, form):
+    title = params.get ('name', 'Unknown')
+    gtk.Dialog.__init__ (self, title, None, gtk.DIALOG_MODAL,
+                         (gtk.STOCK_OK, gtk.RESPONSE_OK))
+    self.set_border_width (5)
+    self.vbox.set_spacing (8)
+
+    box = gtk.Frame (" GNUe Forms ")
+    tbl = gtk.Table (2, 2)
+    tbl.set_border_width (8)
+    tbl.set_col_spacings (8)
+
+    self._newLabel (_("Version:"), tbl, 0, 1, 0, 1)
+    self._newLabel (_("Driver:"), tbl, 0, 1, 1, 2)
+    self._newLabel (params ['appversion'], tbl, 1, 2, 0, 1)
+    self._newLabel (params ['ui_driver'], tbl, 1, 2, 1, 2)
+
+    box.add (tbl)
+    tbl.show ()
+
+    self.vbox.pack_start (box)
+    box.show ()
+
+    box = gtk.Frame (_(" Form Information "))
+    tbl = gtk.Table (4, 2)
+    tbl.set_border_width (8)
+    tbl.set_col_spacings (8)
+
+    self._newLabel (_("Name:"),        tbl, 0, 1, 0, 1)
+    self._newLabel (_("Version:"),     tbl, 0, 1, 1, 2)
+    self._newLabel (_("Author:"),      tbl, 0, 1, 2, 3)
+    self._newLabel (_("Description:"), tbl, 0, 1, 3, 4)
+
+    self._newLabel (params ['name'],        tbl, 1, 2, 0, 1)
+    self._newLabel (params ['formversion'], tbl, 1, 2, 1, 2)
+    self._newLabel (params ['author'],      tbl, 1, 2, 2, 3)
+    l = self._newLabel (params ['description'], tbl, 1, 2, 3, 4)
+    l.set_line_wrap (True)
+
+    box.add (tbl)
+    tbl.show ()
+
+    self.vbox.pack_start (box)
+    box.show ()
+
+
+  # ---------------------------------------------------------------------------
+  # Create a new left- and top-aligned label and attach it to a given table
+  # ---------------------------------------------------------------------------
+
+  def _newLabel (self, text, table, left, right, top, bottom):
+    result = gtk.Label (text.encode ('utf-8'))
+    result.set_alignment (0, 0)
+    table.attach (result, left, right, top, bottom)
+    result.show ()
+    return result
+
+if __name__ == '__main__':
+  parameters = {
+    'appversion'  : 'app-version',
+    'ui_driver'   : 'ui-driver-name',
+    'name'        : "form-name",
+    'formversion' : "form-version",
+    'author'      : "form-author",
+    'description' : "this is a description to the form. it "
+                    "could be a much "
+                    "longer text than one would excpet."
+  }
+
+  x = AboutBox (parameters, None)
+  x.run ()
+  x.destroy ()


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

Modified: trunk/gnue-forms/src/uidrivers/gtk2/common.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/common.py       2004-07-20 13:52:09 UTC 
(rev 5992)
+++ trunk/gnue-forms/src/uidrivers/gtk2/common.py       2004-07-20 13:58:53 UTC 
(rev 5993)
@@ -18,194 +18,98 @@
 #
 # Copyright 2000-2004 Free Software Foundation
 #
-# FILE:
-# gtk2/common.py
-#
-# DESCRIPTION:
-# A part of the gtk2 based user interface driver for GNUe forms.
-#
-# NOTES:
-#
-# TODO:
-#  * add global accelerator maps
-#  * cleanup event stuff
+# $Id: $
 
+import gtk
 
-import string
-import gtk,pango
 from gnue.common import events
+from gnue.common.apps import GDebug
    
-PANGO_SCALE = 1024 # where can I get that definition from?            
 
-#####################################################################
-##
-## Basic Event Processing
-##
-#####################################################################
+# -----------------------------------------------------------------------------
+# Set all default event handlers for GTK widgets
+# -----------------------------------------------------------------------------
 
-def _setDefaultEventHandlers(newWidget, eventHandler, initialize, uiDriver):
-    if initialize:
-        # Just care for keypresses which get not handled
-        newWidget.connect_after("key-press-event", _keyPressHandler,\
-                              uiDriver, eventHandler)
+def _setDefaultEventHandlers (newWidget, eventHandler, initialize, uiDriver):
+  if initialize:
+    newWidget.connect ("key-press-event", _keyPressHandler, uiDriver,
+                             eventHandler)
+    GDebug.printMesg (1, "Added key-press-event to %s" % newWidget)
 
-        #OLD: Mouse event stuff
-        #newWidget.connect("button-press-event", _buttonPressHandler,\
-        #                  uiDriver, eventHandler)
-        return
 
+# -----------------------------------------------------------------------------
+# Key press handler
+# -----------------------------------------------------------------------------
 
+def _keyPressHandler (widget, event, uiDriver, eventHandler):
+  GDebug.printMesg (2, "Common-keypress: %s %s" % (event.type, event.keyval))
 
-#
-# keyboardEvtHandler
-#
-# Traps most keypress events and translates them into
-# GNUe events passed back to the form
-#
+  if event.type != gtk.gdk.KEY_PRESS:
+    return False
 
-# should be replaced by accelerators ONLY
+  action  = None
+  keycode = event.keyval
 
-def _keyPressHandler(widget, event, uiDriver, eventHandler):
-    # just care for keypresses
-    if event.type!=gtk.gdk.KEY_PRESS:
-        return
-    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 and gtk.gdk.SHIFT_MASK
-    isLock = event.state and gtk.gdk.LOCK_MASK
-    isCtrl = event.state and gtk.gdk.CONTROL_MASK
-    isMod1 = event.state and gtk.gdk.MOD1_MASK
+  if keycode == gtk.keysyms.ISO_Left_Tab:
+    GDebug.printMesg (3, "Mapping Shit-Tab to Tab")
+    keycode = gtk.keysyms.Tab
 
-    try:
-        object = uiDriver._WidgetToGFObj[widget]
-    except:
-        return
+  if not uiDriver._WidgetToGFObj.has_key (widget):
+    return False
 
-    #
-    # Sigh... a hack for using <enter> in multiline entries
-    #
-    if  keycode == gtk.keysyms.Return and \
-        not event.state and \
-        not isinstance(widget,gtk.TextView) and \
-        int (gConfigForms('enterIsNewLine')) and \
-        (hasattr(object,'Char__height') and object.Char__height) > 1:
+  gfObject = uiDriver._WidgetToGFObj [widget]
 
-      command = 'NEWLINE'
+  #
+  # Sigh... a hack for using <enter> in multiline entries
+  #
+  if  keycode == gtk.keysyms.Return and \
+      not event.state and \
+      not isinstance (widget, gtk.TextView) and \
+      int (gConfigForms ('enterIsNewLine')) and \
+      (hasattr (gfObject, 'Char__height') and gfObject.Char__height) > 1:
 
-    else:
+    command = 'NEWLINE'
 
+  else:
+    # 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 == 'JUMPRECORD':
-      global _PROMPTFORRECORD
-      action = _PROMPTFORRECORD()
+  if command == 'JUMPRECORD':
+    global _PROMPTFORRECORD
+    action = _PROMPTFORRECORD ()
 
-    elif command == 'NEWLINE':
-      action = events.Event('requestKEYPRESS', '\n',
-                     text='\n',
-                     code=10)
+  elif command == 'NEWLINE':
+    action = events.Event ('requestKEYPRESS', '\n', text='\n', code=10)
 
-    elif command:
-      action = events.Event('request%s' % command)
+  elif command:
+    action = events.Event ('request%s' % command)
 
-    elif object._type == 'GFButton':
-      action = events.Event('buttonActivated',object)
+  elif gfObject._type == 'GFButton':
+    action = events.Event ('buttonActivated', gfObject)
 
-    elif object.style == 'checkbox' and object._type == 'GFEntry':
-      # <space> <=> <click>
-      if keycode == gtk.keysyms.Space:
-          action = events.Event('requestTOGGLECHKBOX')
-      else:
-          # maybe some background error message here
-          pass
-##     elif not event.state: # no special modifier keys pressed
-##       try:
-##         char = chr(keycode)
-##         if char in string.printable or char == "\n" or \
-##            128 <= keycode <= 255:
-##           action = events.Event('requestKEYPRESS', char,
-##                          text=char,
-##                          code=keycode)
-##       except ValueError:
-##         pass 
-      
+  elif gfObject.style == 'checkbox' and gfObject._type == 'GFEntry':
+    # <space> <=> <click>
+    if keycode == gtk.keysyms.Space:
+      action = events.Event ('requestTOGGLECHKBOX')
+    else:
+      pass
 
-#   print "'%s'" % command
-##     if command in ('CURSORLEFT', 'CURSORRIGHT','NEXTRECORD', 'PREVRECORD',
-##                    'BACKSPACE','DELETE','SELECTLEFT','SELECTRIGHT') and \
-##                     isinstance(widget,gtk.Entry):
-##         print 'stopped'
-##         action=0
+  if action is not None:
+    # Add the gfObject's _form to the outgoing event
+    # rather than every event in the function
+    GDebug.printMesg (3, "Calling %s" % action.__event__)
+    action.__dict__.update ({'_form': gfObject._form})
+    eventHandler (action)
+    return True
 
-    if action:
-      # Add the object's _form to the outgoing event
-      # rather than every event in the function
-      action.__dict__.update({'_form':object._form})
-      eventHandler(action)
-      return gtk.TRUE       
-               
-#
-# mouseEvtHandler
-#
-# Traps most mouse events and translates them into
-# GNUe events passed back to the form
-#
-    
-def _buttonPressHandler(widget, event, uiDriver, eventHandler):
-    if (event.type!=gtk.gdk.BUTTON_PRESS and \
-        event.type!=gtk.gdk._2BUTTON_PRESS):
-        return
-    action = None
 
-    isShift = event.state and gtk.gdk.SHIFT_MASK
-    isLock = event.state and gtk.gdk.LOCK_MASK
-    isCtrl = event.state and gtk.gdk.CONTROL_MASK
-    isMod1 = event.state and gtk.gdk.MOD1_MASK
 
-    try:
-        object = uiDriver._WidgetToGFObj[widget]
-    except:
-        object = uiDriver._WidgetToGFObj[widget._parent]
-
-    #
-    #  Focus
-    #
-    if event.button==1:
-        if isinstance(widget,gtk.Entry):
-            pangoLayout = widget.get_layout()
-            (offset_x,offset_y) = widget.get_layout_offsets()
-            (cursor_x,cursor_y) = pangoLayout.xy_to_index((event.x-offset_x) \
-                                                          *PANGO_SCALE,
-                                                          (event.y-offset_y)\
-                                                          *PANGO_SCALE)
-            # print '%s,%s -> %s' % (event.x,event.y,cursor_x)
-            eventHandler('requestFOCUS',object,_form=object._form)
-            eventHandler('requestCURSORMOVE',position=cursor_x+1,\
-                         _form=object._form)
-            return gtk.TRUE
-        
-        if isinstance(widget,gtk.TextView):
-            (cursor_x,cursor_y) = 
widget.window_to_buffer_coords(gtk.TEXT_WINDOW_WIDGET,
-                                                                 event.x,
-                                                                 event.y)
-            iter = widget.get_iter_at_location(cursor_x,cursor_y)
-            cursor_ofs = iter.get_offset()
-            # print '%s,%s -> %s' % (event.x,event.y,cursor_ofs)
-            eventHandler('requestFOCUS',object,_form=object._form)
-            eventHandler('requestCURSORMOVE',position=cursor_ofs, \
-                         _form=object._form)
-            return gtk.TRUE
-
-                                                             
 #####################################################################
 ##
 ## Keymapper Support
@@ -219,21 +123,18 @@
 
 # Translate from wx keystrokes to our virtual keystrokes
 gtkKeyTranslations = {
-   vk.F1     :gtk.keysyms.F1,        vk.F2        :gtk.keysyms.F2,
-   vk.F3     :gtk.keysyms.F3,        vk.F4        :gtk.keysyms.F4,
-   vk.F5     :gtk.keysyms.F5,        vk.F6        :gtk.keysyms.F6,
-   vk.F7     :gtk.keysyms.F7,        vk.F8        :gtk.keysyms.F8,
-   vk.F9     :gtk.keysyms.F9,        vk.F10       :gtk.keysyms.F10,
-   vk.F11    :gtk.keysyms.F11,       vk.F12       :gtk.keysyms.F12,
-   vk.INSERT :gtk.keysyms.Insert,    vk.DELETE    :gtk.keysyms.Delete,
-   vk.HOME   :gtk.keysyms.Home,      vk.END       :gtk.keysyms.End,
-   vk.PAGEUP :gtk.keysyms.Prior,     vk.PAGEDOWN  :gtk.keysyms.Next,
-   vk.UP     :gtk.keysyms.Up,        vk.DOWN      :gtk.keysyms.Down,
-   vk.LEFT   :gtk.keysyms.Left,      vk.RIGHT     :gtk.keysyms.Right,
-   vk.TAB    :gtk.keysyms.Tab,
-   vk.ENTER  :gtk.keysyms.Return,    vk.BACKSPACE :gtk.keysyms.BackSpace }
+   vk.F1     : gtk.keysyms.F1,        vk.F2        : gtk.keysyms.F2,
+   vk.F3     : gtk.keysyms.F3,        vk.F4        : gtk.keysyms.F4,
+   vk.F5     : gtk.keysyms.F5,        vk.F6        : gtk.keysyms.F6,
+   vk.F7     : gtk.keysyms.F7,        vk.F8        : gtk.keysyms.F8,
+   vk.F9     : gtk.keysyms.F9,        vk.F10       : gtk.keysyms.F10,
+   vk.F11    : gtk.keysyms.F11,       vk.F12       : gtk.keysyms.F12,
+   vk.INSERT : gtk.keysyms.Insert,    vk.DELETE    : gtk.keysyms.Delete,
+   vk.HOME   : gtk.keysyms.Home,      vk.END       : gtk.keysyms.End,
+   vk.PAGEUP : gtk.keysyms.Prior,     vk.PAGEDOWN  : gtk.keysyms.Next,
+   vk.UP     : gtk.keysyms.Up,        vk.DOWN      : gtk.keysyms.Down,
+   vk.LEFT   : gtk.keysyms.Left,      vk.RIGHT     : gtk.keysyms.Right,
+   vk.TAB    : gtk.keysyms.Tab,
+   vk.ENTER  : gtk.keysyms.Return,    vk.BACKSPACE : gtk.keysyms.BackSpace }
 
-GFKeyMapper.KeyMapper.setUIKeyMap(gtkKeyTranslations)
-
-
-      
+GFKeyMapper.KeyMapper.setUIKeyMap (gtkKeyTranslations)


Property changes on: trunk/gnue-forms/src/uidrivers/gtk2/widgets/__init__.py
___________________________________________________________________
Name: svn:keywords
   + +Id

Modified: trunk/gnue-forms/src/uidrivers/gtk2/widgets/_base.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/widgets/_base.py        2004-07-20 
13:52:09 UTC (rev 5992)
+++ trunk/gnue-forms/src/uidrivers/gtk2/widgets/_base.py        2004-07-20 
13:58:53 UTC (rev 5993)
@@ -18,14 +18,7 @@
 #
 # Copyright 2000-2004 Free Software Foundation
 #
-# FILE:
-# gtk2/widgets/_base.py
-#
-# DESCRIPTION:
-# Part of a gtk2 based user interface driver for GNUe forms: Base Widget
-#
-# NOTES:
-#
+# $Id: $
 
 import gtk
 
@@ -34,6 +27,7 @@
 from gnue.forms.GFForm import *
 from gnue.forms.uidrivers._base.widgets._base import UIWidget
 from gnue.forms.uidrivers.gtk2.common import _setDefaultEventHandlers
+from gnue.common.apps import GDebug
 
 
 #############################################################################
@@ -54,188 +48,259 @@
 # Provides a UI widget set of std functions to reduce the number of functions
 # require in each UIclass listed below.
 #
-class UIHelper(UIWidget):
-  #
-  # Functions limited to the gtk2 driver
-  #
-  def _addToCrossRef(self, widget,gfobject, uiobject):
-    self._uiDriver._WidgetToGFObj[widget]=gfobject
-    self._uiDriver._WidgetToUIObj[widget]=uiobject
 
-  def _deleteFromCrossRef(self, widget, object):
+
+# =============================================================================
+# This class implements the common behaviour of GTK2 widgets
+# =============================================================================
+
+class UIHelper (UIWidget):
+
+  # ---------------------------------------------------------------------------
+  # Create a new GTK widget
+  # ---------------------------------------------------------------------------
+
+  def createWidget (self, event, spacer):
+    """
+    This function creates a new GTK widget and adds it to the cross reference
+    table.
+    """
+    gfObject           = event.object
+    self._eventHandler = event.eventHandler
+
+    if hasattr (gfObject, 'Char__y'):
+      posY = gfObject.Char__y
+      gap  = hasattr (gfObject._gap, '_gap') and gfObject._gap + 1 or 1
+      self.itemY = (posY + spacer * gap) * event.widgetHeight
+
+    newWidget = self._createWidget (event, spacer)
+    if event.initialize:
+      self._addToCrossRef (newWidget, gfObject, self)
+      
+    return newWidget
+
+
+  # ---------------------------------------------------------------------------
+  # Add a widget to the cross reference tables
+  # ---------------------------------------------------------------------------
+
+  def _addToCrossRef (self, widget, gfobject, uiobject):
+    self._uiDriver._WidgetToGFObj [widget] = gfobject
+    self._uiDriver._WidgetToUIObj [widget] = uiobject
+
+
+  # ---------------------------------------------------------------------------
+  # Remove a widget from the cross reference tables
+  # ---------------------------------------------------------------------------
+
+  def _deleteFromCrossRef (self, widget, object):
     try:
-      del self._uiDriver._WidgetToGFObj[widget]
-      del self._uiDriver._WidgetToUIObj[widget]
+      del self._uiDriver._WidgetToGFObj [widget]
+      del self._uiDriver._WidgetToUIObj [widget]
+
     except:
       pass
 
-  def _addDefaultEventHandler(self,widget,eventHandler,uiDriver):
-    widget._focus_sig_handler = widget.connect("focus-in-event",
-                                               self._focusInHandler,\
-                                               uiDriver,
-                                               eventHandler)
-    # add key press handlers from ../common.py
-    _setDefaultEventHandlers(widget, eventHandler, 1, uiDriver)
 
+  # ---------------------------------------------------------------------------
+  # Add all default event handler to the widget
+  # ---------------------------------------------------------------------------
 
-  #
-  # Override the base UIWidget functions
-  #
-  def show(self):
+  def _addDefaultEventHandler (self, widget):
+    _setDefaultEventHandlers (widget, self._eventHandler, True, self._uiDriver)
+
+
+
+  # ---------------------------------------------------------------------------
+  # Add a focus-in handler to a widget
+  # ---------------------------------------------------------------------------
+
+  def _addFocusHandler (self, widget, lookupWidget = None):
+    """
+    This function connects a handler to the widget's focus-in-event signal
+    passing an optional lookup widget to it. A lookup widget will be used for
+    retrieving the GFObject from the lookup table. If no lookup widget is given
+    the mandatory widget will be used for lookups.
+    """
+
+    if lookupWidget is None:
+      lookupWidget = widget
+    GDebug.printMesg (2, "ADD FOCUSHANDLER %s (%s)" % (widget, lookupWidget))
+    widget._focusHandler = widget.connect ('focus-in-event',
+                                           self.__focusInHandler, lookupWidget)
+
+
+
+  # ---------------------------------------------------------------------------
+  # Handle focus signals from widgets
+  # ---------------------------------------------------------------------------
+
+  def __focusInHandler (self, widget, event, lookupWidget):
+    """
+    This function handles 'focus-in-event' signals by creating an immediate
+    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))
+    
+    gfObject = self._uiDriver._WidgetToGFObj [lookupWidget]
+    _formRef = gfObject._form
+
+    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)
+      self._eventHandler (action)
+
+    return gtk.FALSE
+
+
+  # ---------------------------------------------------------------------------
+  # Show all ui-widgets managed by this object
+  # ---------------------------------------------------------------------------
+
+  def show (self):
+    """
+    This function calls the show () on all gtk-widgets managed by this
+    instance. This is needed if a row-count greater than 0 is given.
+    """
     for widget in self.widgets:
-      widget.show()
+      widget.show ()
 
-  def hide(self):
+
+  # ---------------------------------------------------------------------------
+  # Hide all ui-widgets managed by this object
+  # ---------------------------------------------------------------------------
+
+  def hide (self):
+    """
+    This function calls the show () on all gtk-widgets managed by this
+    instance. This is needed if a row-count greater than 0 is given.
+    """
     for widget in self.widgets:
-      widget.hide()
+      widget.hide ()
           
-  def showModal(self):
-    print "showModal not implemented for gtk2 driver"
-    for widget in self.widgets:      
-      pass
 
-  def destroy(self):
-    print "destroy not implemented for gtk2 driver"
-    for widget in self.widgets:
-      pass
+  def showModal (self):
+    GDebug.printMesg (1, "showModal not implemented for gtk2 driver")
+
+  def destroy (self):
+    GDebug.printMesg (1, "destroy not implemented for gtk2 driver")
         
-  def indexedFocus(self, index):
-    widget = self.widgets[index]
 
-    if widget.get_name()=='GtkCombo':
-      widget=widget.entry
+  # ---------------------------------------------------------------------------
+  # Set the focus to a given widget
+  # ---------------------------------------------------------------------------
 
-    # Block focus events
-    try:
-      widget.handler_block(widget._focus_sig_handler)
-    except:
-      pass
-    
-    #focus
-    widget.grab_focus()
+  def indexedFocus (self, index):
+    """
+    This function set's the focus to the gtk-widget specified by index. If the
+    widget has a focusHandler it will be blocked and unblocked to prevent a
+    recursion.
+    """
+    widget = self.widgets [index]
+    GDebug.printMesg (1, "indexedFocus: %s [%s]" % (widget, index))
 
-    # unblock focus events
-    try:
-      widget.handler_unblock(widget._focus_sig_handler)
-    except:
-      pass
+    item    = isinstance (widget, gtk.Combo) and widget.entry or widget
+    handler = hasattr (item, '_focusHandler') and item._focusHandler or None
 
+    self.__blockHandler (item, '_focusHandler')
 
-  def setValue(self, value, index=0, enabled=1):
-    widget = self.widgets[index]
+    GDebug.printMesg (3, "Grab focus to %s for %s" % (item, widget))
+    item.grab_focus ()
+
+    self.__blockHandler (item, '_focusHandler', True)
+
+
+
+  # ---------------------------------------------------------------------------
+  # Set the value of a widget
+  # ---------------------------------------------------------------------------
+
+  def setValue (self, value, index = 0, enabled = True):
+    """
+    This function sets the value of a widget and optionally enables or disables
+    the widget.
+    """
+    widget = self.widgets [index]
+    GDebug.printMesg (1, "setValue %s [%s] %s" % (repr (value), index, widget))
     
     # fix for 0.5.1 (Unicode is not internal encoding)
-    if widget.get_name()!='GtkCheckButton' and type(value)!=UnicodeType:
-      value = unicode(value, gConfigForms('textEncoding'))
+    if not isinstance (widget, gtk.CheckButton) and type (value) != 
UnicodeType:
+      GDebug.printMesg (3, "converting %s to unicode using %s" % \
+          (repr (value), gConfigForms ('textEncoding')))
+      value = unicode (value, gConfigForms ('textEncoding'))
+
     
-    if widget.get_name()=='GtkCombo':
-
-      object = self._uiDriver._WidgetToGFObj[widget]
+    if isinstance (widget, gtk.Combo):
+      gfObject = self._uiDriver._WidgetToGFObj [widget]
       
-      # Check if list of allowed value (~= foreign keys, ~= dropdown content) 
changed
-      if object.style == "dropdown" and \
-             not object._field._allowedValues == widget._origAllowedValues:
+      # Check if list of allowed value (~= foreign keys, ~= dropdown content) 
+      # changed
+      if gfObject.style == "dropdown" and \
+         not gfObject._field._allowedValues == widget._origAllowedValues:
+        widget._origAllowedValues = gfObject._field._allowedValues
+        widget.set_popdown_strings (gfObject._field._allowedValuesDescr)
         
-        widget._origAllowedValues = object._field._allowedValues
-        widget.set_popdown_strings(object._field._allowedValuesDescr)
-        
-      # set the value
-      widget.entry.set_text(value)
+      widget.entry.set_text (value)
       
-    elif widget.get_name()=='GtkCheckButton':
-      try:
-        widget.handler_block(widget._clicked_handler)
-      except:
-        pass
-      widget.set_active(value)
-      try:
-        widget.handler_unblock(widget._clicked_handler)
-      except:
-        pass
-      
-    elif widget.get_name()=='MultiLineEdit':
-      widget.set_text(value)
-      
+    elif isinstance (widget, gtk.CheckButton):
+      self.__blockHandler (widget, '_clickedHandler')
+      widget.set_active (value)
+      self.__blockHandler (widget, '_clickedHandler', True)
+
     else:
-      try:
-        widget.handler_block(widget._insert_handler)
-        widget.handler_block(widget._delete_handler)
-      except:
-        pass
-      # print "set to '%s'" % value
-      widget.set_text(value)
-      try:
-        widget.handler_unblock(widget._insert_handler)
-        widget.handler_unblock(widget._delete_handler)
-      except:
-        pass      
+      item = isinstance (widget, gtk.TextView) and widget.get_buffer () or \
+          widget
 
+      self.__blockHandler (item, '_insert_handler')
+      self.__blockHandler (item, '_delete_handler')
+
+      item.set_text (value)
+
+      self.__blockHandler (item, '_insert_handler', True)
+      self.__blockHandler (item, '_delete_handler', True)
+
+
     if enabled:
-      widget.set_sensitive(1)
+      widget.set_sensitive (1)
     else:
-      widget.set_sensitive(0)
+      widget.set_sensitive (0)
 
-  def setCursorPosition(self, position, index=0):
-    try:
-      self.widgets[index].set_position(position)
-    except AttributeError:
-      pass  # For label-style entries
 
+
+  def setCursorPosition (self, position, index = 0):
+    if hasattr (self.widgets [index], 'set_position'):
+      self.widgets [index].set_position (position)
+
+
+
+
   def setSelectedArea(self, selection1, selection2, index=0):
     try:
-      self.widgets[index].select_region(selection1, selection2)      
+      self.widgets[index].select_region(selection1, selection2)
     except (AttributeError, TypeError):
       pass  # For label-style & dropdown entries
 
 
-  def createWidget(self, event, spacer):
-    newWidget = self._createWidget(event, spacer)
-    try:
-      newWidget.modify_font(self._uiDriver.mono_font)
-    except:
-      pass
-    if event.initialize: 
-      self._addToCrossRef(newWidget,event.object,self)
-      
-    return newWidget
 
-  def cleanup(self, object):
-    for widget in self.widgets[:]:
-      try:
-        del self._uiDriver._WidgetToGFObj[widget]
-        del self._uiDriver._WidgetToUIObj[widget]
-      except KeyError:
-        pass
-      self.widgets.pop(0)
-      self._deleteFromCrossRef(widget, object)
+  # ---------------------------------------------------------------------------
+  # Block or unblock a given event handler of a widget
+  # ---------------------------------------------------------------------------
 
+  def __blockHandler (self, widget, handlerName, unblock = False):
+    """
+    This function blocks or unblocks an event handler of a widget it is
+    assigned.
+    """
+    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" % \
+          (['Block', 'Unblock'] [unblock], handlerName, handler, widget))
+      method (handler)
 
-  ###########################################################
-  #
-  #  Internal Event Handler
-  #
-  #
-
-  def _focusInHandler(self, widget, event, uiDriver, eventHandler):
-    #print "focus in: widget",widget
-    try:
-      object = uiDriver._WidgetToGFObj[widget]
-    except:
-      try:
-        #  for the entry in a dropdown widget
-        object = uiDriver._WidgetToGFObj[widget.get_parent()]
-      except:
-        # for the gtk.TextView widget in a MultiLineEdit Object
-        object = uiDriver._WidgetToGFObj[widget._parent]
-        
-      
-    action = events.Event('requestFOCUS',object,_form=object._form)
-    # TODO: fix VETO
-    # widget.emit_stop_by_name('focus-in-event')
-    gtk.idle_add(eventHandler,action)
-    # return gtk.TRUE
-
-
-  def _focusOutHandler(self,widget, event, uiDriver, eventHandler):
-    print "focus out: widget",widget
-    # return gtk.TRUE # can make gtk.application segfault


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

Modified: trunk/gnue-forms/src/uidrivers/gtk2/widgets/box.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/widgets/box.py  2004-07-20 13:52:09 UTC 
(rev 5992)
+++ trunk/gnue-forms/src/uidrivers/gtk2/widgets/box.py  2004-07-20 13:58:53 UTC 
(rev 5993)
@@ -18,45 +18,45 @@
 #
 # Copyright 2000-2004 Free Software Foundation
 #
-# FILE:
-# gtk2/widgets/box.py
-#
-# DESCRIPTION:
-# A wxPython based user interface driver for GNUe forms.
-#
-# NOTES:
-#
+# $Id: $
+
 import gtk
+
 from gnue.forms.uidrivers.gtk2.widgets._base import UIHelper
 
-#
-# UIBox
-#
-# Widget set specific function that creates a single instance of a border box
-#
-class UIBox(UIHelper):
+# =============================================================================
+# Create a border box widget
+# =============================================================================
+
+class UIBox (UIHelper):
     
-  def _createWidget(self, event, spacer):
-    object = event.object
+  # ---------------------------------------------------------------------------
+  # Create the GTK widget
+  # ---------------------------------------------------------------------------
+
+  def _createWidget (self, event, spacer):
+    gfObject = event.object
+    text     = None
+    if hasattr (gfObject, 'label') and len (gfObject.label):
+      text = " %s " % gfObject.label.encode ('utf-8')
     
-    newWidget = gtk.Frame()
-    newWidget.set_size_request(int(self.itemWidth - (1 * event.widgetWidth)),
-                               int(self.itemHeight - (0.5 * 
event.widgetHeight)))
-    
-    newWidget.set_label(object.label)
-    newWidget.get_label_widget().modify_font(self._uiDriver.mono_font)
+    half = int (event.widgetHeight / 2)
 
-    event.container.put(newWidget,
-                        int((object.Char__x+0.5) * event.widgetWidth),
-                        int((object.Char__y + spacer + 0.5) * 
event.widgetHeight))
+    newWidget = gtk.Frame (text)
+    newWidget.set_size_request (self.itemWidth, self.itemHeight - half)
+    event.container.put (newWidget, self.itemX, self.itemY + half)
+    newWidget.show ()
+
     return newWidget
 
-#
+
+# -----------------------------------------------------------------------------
 # Configuration data 
-#
+# -----------------------------------------------------------------------------
+
 configuration = {
-    'baseClass'  : UIBox,
-    'provides'   : 'GFBox',
-    'container'  : 0,
-    }
+  'baseClass'  : UIBox,
+  'provides'   : 'GFBox',
+  'container'  : 0,
+}
 


Property changes on: trunk/gnue-forms/src/uidrivers/gtk2/widgets/box.py
___________________________________________________________________
Name: svn:keywords
   + +Id

Modified: trunk/gnue-forms/src/uidrivers/gtk2/widgets/button.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/widgets/button.py       2004-07-20 
13:52:09 UTC (rev 5992)
+++ trunk/gnue-forms/src/uidrivers/gtk2/widgets/button.py       2004-07-20 
13:58:53 UTC (rev 5993)
@@ -18,53 +18,61 @@
 #
 # Copyright 2000-2004 Free Software Foundation
 #
-# FILE:
-# gtk2/widgets/button.py
-#
-# DESCRIPTION:
-# A part of a gtk2 based user interface driver for GNUe forms: Button Widget
-#
-# NOTES:
-#
+# $Id: $
+
 import gtk
 
 from gnue.common import events
+from gnue.common.apps import GDebug
 from gnue.forms.uidrivers.gtk2.widgets._base import UIHelper
 
-#
-# UIButton
-#
-# Widget set specific function that creates a single instance of a button
-#
-class UIButton(UIHelper):
-  def _createWidget(self, event, spacer):
+# =============================================================================
+# This class wraps an UI layer around a gtk.Button widget
+# =============================================================================
+
+class UIButton (UIHelper):
+
+  # ---------------------------------------------------------------------------
+  # Create a gtk widget
+  # ---------------------------------------------------------------------------
+
+  def _createWidget (self, event, spacer):
     object = event.object
 
-    newWidget = gtk.Button(str(object.label))
-    newWidget.set_size_request(self.itemWidth, self.itemHeight)
-    newWidget.get_child().modify_font(self._uiDriver.mono_font)
+    text = "%s" % object.label
+    newWidget = gtk.Button (text.encode ('utf-8'))
+    newWidget.modify_font (self._uiDriver.mono_font)
+    newWidget.set_size_request (self.itemWidth, self.itemHeight)
 
-    event.container.put(newWidget, object.Char__x * event.widgetWidth,
-                        (object.Char__y + spacer) * event.widgetHeight)
-
     if event.initialize:
-      self._eventHandler = event.eventHandler
-      newWidget.connect('clicked', self.buttonHandler, newWidget)
-      self._addDefaultEventHandler(newWidget, event.eventHandler, \
-                                   self._uiDriver)
+      newWidget.connect ('clicked', self.buttonHandler)
+      self._addDefaultEventHandler (newWidget)
+      self._addFocusHandler (newWidget)
 
+    event.container.put (newWidget, self.itemX, self.itemY)
+    newWidget.show ()
+
     return newWidget
 
-  def buttonHandler(self,event,widget):
-    action = None
-    gfObject  = self._uiDriver._WidgetToGFObj[widget]
-    action = events.Event('buttonActivated',gfObject)
-    self._eventHandler(action)
-    return gtk.TRUE
 
+  # ---------------------------------------------------------------------------
+  # Handle button click signals
+  # ---------------------------------------------------------------------------
 
+  def buttonHandler (self, widget):
+    gfObject = self._uiDriver._WidgetToGFObj [widget]
+
+    GDebug.printMesg (1, "buttonActivated on %s" % gfObject)
+    action = events.Event ('buttonActivated', gfObject)
+    self._eventHandler (action)
+
+
+# -----------------------------------------------------------------------------
+# Configuration data
+# -----------------------------------------------------------------------------
+
 configuration = {
-    'baseClass'  : UIButton,
-    'provides'   : 'GFButton',
-    'container'  : 0,
-    }
+  'baseClass'  : UIButton,
+  'provides'   : 'GFButton',
+  'container'  : 0,
+}


Property changes on: trunk/gnue-forms/src/uidrivers/gtk2/widgets/button.py
___________________________________________________________________
Name: svn:keywords
   + +Id


Property changes on: trunk/gnue-forms/src/uidrivers/gtk2/widgets/component.py
___________________________________________________________________
Name: svn:keywords
   + +Id

Modified: trunk/gnue-forms/src/uidrivers/gtk2/widgets/entry.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/widgets/entry.py        2004-07-20 
13:52:09 UTC (rev 5992)
+++ trunk/gnue-forms/src/uidrivers/gtk2/widgets/entry.py        2004-07-20 
13:58:53 UTC (rev 5993)
@@ -18,358 +18,425 @@
 #
 # Copyright 2000-2004 Free Software Foundation
 #
-# FILE:
-# gtk2/widgets/entry.py
-#
-# DESCRIPTION:
-# A part of the gtk2 based user interface driver for GNUe forms.
-#
-# NOTES:
-#
-# TODO:
-#  * fix "selection" for gtk.entry
-#  * fix position to byteindex conversion (UTF-8)
-#       Update: working for Unicode Strings, i.e. when using Unicode as
-#               internal data representation has to be unicode, which is
-#               postponed for > ver. 0.5.1
-#
+# $Id: $
 
 import gtk
+
 from gnue.common import events
 from gnue.forms.uidrivers.gtk2.widgets._base import UIHelper
 from gnue.common.apps import GDebug
 
-#
-# UIEntry
-#
-# Widget set specific function that creates a single instance of a data entry 
widget
-#
-class UIEntry(UIHelper):
-  def _createWidget(self, event, spacer):
+
+# =============================================================================
+# This class implements the UI layer for entry widgets
+# =============================================================================
+
+class UIEntry (UIHelper):
+
+  def _createWidget (self, event, spacer):
     object = event.object
-    style = object.style
+    style  = object.style
 
     if style == 'dropdown':
-      if event.initialize:
-        self.choices = object._field.allowedValues()[1]
+      newWidget = self.__createDropDown (object, event)
+
+    elif style == 'label':
+      newWidget = self.__createLabel (object, event)
+
+    elif style == 'checkbox':
+      newWidget = self.__createCheckbox (object, event)
+
+    else:
+      if hasattr (object, 'Char__height') and object.Char__height > 1:
+        newWidget = self.__createTextView (object, event)
+
       else:
-        self.choices = [""]
+        newWidget = self.__createEntry (object, event)
 
-      # should we add this to the wx driver as well?
-      self.choices.sort()
+    event.container.show_all()
+    return newWidget
 
-      newWidget = gtk.Combo()
-      newWidget.set_popdown_strings(self.choices)
 
-      newWidget.set_size_request(self.itemWidth, self.itemHeight)
-      event.container.put(newWidget, object.Char__x * event.widgetWidth,
-                          (object.Char__y + spacer + (object._gap * spacer)) \
-                          * event.widgetHeight)
+  # ---------------------------------------------------------------------------
+  # Create a dropdown widget
+  # ---------------------------------------------------------------------------
 
-      newWidget.list.connect('select-child', self.comboHandler, newWidget)
+  def __createDropDown (self, gfObject, event):
+    if event.initialize:
+      (self.reverse, self.choices) = gfObject._field.allowedValues ()
+    else:
+      (self.reverse, self.choices) = ({}, [""])
 
-      if event.initialize:
-        newWidget._origAllowedValues = object._field._allowedValues
-        self._addDefaultEventHandler(newWidget.entry, event.eventHandler, \
-                                     self._uiDriver)
-        self._addDefaultEventHandler(newWidget.list,  event.eventHandler, \
-                                     self._uiDriver)
+    self.choices.sort ()
 
+    newWidget = gtk.Combo ()
+    newWidget.entry.modify_font (self._uiDriver.mono_font)
+    newWidget.set_popdown_strings (self.choices)
 
-    elif style == 'label':
-      newWidget = gtk.Label("")
-      newWidget.set_size_request(self.itemWidth, self.itemHeight + 1)
-      event.container.put(newWidget, object.Char__x * event.widgetWidth,
-                          (object.Char__y + spacer + (object._gap * spacer))\
-                          * event.widgetHeight)
+    # values must match an entry in the list, but empty values are ok too
+    newWidget.set_value_in_list (True, True)
+    # Enter does NOT open the popup list
+    newWidget.disable_activate ()
 
-    elif style == 'checkbox':
-      newWidget = gtk.CheckButton(object.label)
-      newWidget.set_size_request(self.itemWidth, event.textHeight)
-      event.container.put(newWidget, object.Char__x * event.widgetWidth,
-        (object.Char__y + spacer + (object._gap * spacer)) * 
event.widgetHeight)
-      newWidget._clicked_handler = newWidget.connect('clicked', 
self.checkboxHandler, newWidget)
-      if event.initialize:
-        self._addDefaultEventHandler(newWidget, event.eventHandler,\
-                                     self._uiDriver)
+    newWidget.set_size_request (self.itemWidth, self.itemHeight + 1)
+    event.container.put (newWidget, self.itemX, self.itemY)
+    newWidget.show ()
 
-    else:
-      value=""
-      if hasattr(object,'Char__height') and object.Char__height>1:
-        newWidget = MultiLineEdit(value, event.eventHandler,self._uiDriver)
-        viewport = newWidget.viewport
-      else:
-        newWidget=viewport=gtk.Entry()
-        newWidget._insert_handler = newWidget.connect('insert-text', \
-                                                      self.insertTextHandler,\
-                                                      event.eventHandler, \
-                                                      self._uiDriver)
+    if event.initialize:
+      newWidget._origAllowedValues = gfObject._field._allowedValues
+      self._addDefaultEventHandler (newWidget)
+      self._addFocusHandler (newWidget.entry, newWidget)
+      newWidget.list.connect ('select-child', self.comboHandler, newWidget)
+      newWidget._keypressHandler = newWidget.entry.connect ('key-press-event',
+                                               self.comboEntryKeyPress)
 
-        newWidget._delete_handler = newWidget.connect('delete-text',\
-                                                      self.deleteTextHandler,\
-                                                      event.eventHandler,\
-                                                      self._uiDriver)
+    return newWidget
 
-      viewport.set_size_request(self.itemWidth, self.itemHeight+1)
-      event.container.put(viewport, object.Char__x * event.widgetWidth,
-                          (object.Char__y + spacer + (object._gap * spacer))\
-                          * event.widgetHeight)
-      if event.initialize:
-        self._addDefaultEventHandler(newWidget, event.eventHandler,\
-                                     self._uiDriver)
 
-    self._eventHandler = event.eventHandler
-    event.container.show_all()
+  # ---------------------------------------------------------------------------
+  # Create a label widget
+  # ---------------------------------------------------------------------------
+
+  def __createLabel (self, gfObject, event):
+    newWidget = gtk.Label ("")
+    newWidget.modify_font (self._uiDriver.mono_font)
+    event.container.put (newWidget, self.itemX, self.itemY)
+    newWidget.show ()
+
     return newWidget
 
 
-  def setCursorPosition(self, position, index=0):
-    widget=self.widgets[index]
-    if isinstance(widget,gtk.Entry) or isinstance(widget,MultiLineEdit):
-      widget.set_position(position)
-    else:
-      print _("Wrong Place to execute set CursorPosition (%s,%s), widget is a 
%s") % (position,index,widget)
+  # ---------------------------------------------------------------------------
+  # Create a checkbox widget
+  # ---------------------------------------------------------------------------
 
-  def setSelectedArea(self, selection1, selection2, index=0):
-    widget=self.widgets[index]
-    if isinstance(widget,gtk.Entry):
-      widget.select_region(selection1, selection2)
-    elif  isinstance(widget,gtk.TextView):
-      widget.get_buffer().select_region(position)
+  def __createCheckbox (self, gfObject, event):
+    label = len (gfObject.label) and gfObject.label or None
+    newWidget = gtk.CheckButton (label)
+    newWidget.modify_font (self._uiDriver.mono_font)
+    event.container.put (newWidget, self.itemX, self.itemY)
+    newWidget.show ()
 
-  ###########################################################
-  #
-  #  Internal Event Handler
-  #
-  #
+    newWidget._clickedHandler = newWidget.connect ('toggled',
+                                                   self.checkboxHandler)
+    if event.initialize:
+      self._addDefaultEventHandler (newWidget)
+      self._addFocusHandler (newWidget)
 
-  #
-  #  eventHandler for gtk.Entry, interrupts default insertText procedure and
-  #  passes the text to the normal displayhandler
-  #
+    return newWidget
 
-  def 
insertTextHandler(self,widget,newtext,length,position,eventHandler,uiDriver):
-    #print "insert '%s' at %s" % (newtext,widget.get_position())
-    if isinstance(widget,gtk.TextBuffer):
-      object=uiDriver._WidgetToGFObj[widget._textview]
-      object._displayHandler.cursor = widget.get_insert()
 
-    else:
-      object=uiDriver._WidgetToGFObj[widget]
-      object._displayHandler.cursor = widget.get_position()
-    # HACK: set the cursor position for display handler
-    #       this should be passed with the event
+  # ---------------------------------------------------------------------------
+  # Create a text view widget
+  # ---------------------------------------------------------------------------
 
-    # Compatibility layer for 0.5.1
-    #text = unicode(newtext,'utf-8')
-    text = unicode(newtext,'utf-8').encode(gConfigForms('textEncoding'))
+  def __createTextView (self, gfObject, event):
 
-    action = events.Event('requestKEYPRESS', text, text=text,
-                          code=0, _form=object._form)
+    newWidget = gtk.TextView ()
+    newWidget.modify_font (self._uiDriver.mono_font)
+    newWidget.set_wrap_mode (gtk.WRAP_CHAR)
 
-    # don't process event further
-    widget.emit_stop_by_name('insert-text')
+    if gfObject.readonly:
+      newWidget.set_editable (False)
 
-    gtk.idle_add(eventHandler,action)  # our eventHandler will be called later
+    viewport  = gtk.ScrolledWindow ()
+    viewport.add_with_viewport (newWidget)
+    viewport.set_policy (gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+    viewport.set_size_request (self.itemWidth, self.itemHeight + 1)
 
-  #
-  #  eventHandler for gtk.Entry, interrupts default deleteText procedure,
-  #  passes event to displayhandler in two parts (1. selection, 2. delete)
-  #
+    tBuffer = newWidget.get_buffer ()
+    tBuffer._insert_handler = tBuffer.connect ('insert-text',
+                                               self.insertBufferHandler,
+                                               newWidget)
 
-  def deleteTextHandler(self,widget,start_pos,end_pos,eventHandler,uiDriver):
-    #print "delete (%s..%s)" % (start_pos,end_pos)
-    object=uiDriver._WidgetToGFObj[widget]
+    tBuffer._delete_handler = tBuffer.connect ('delete-range',
+                                               self.deleteBufferHandler,
+                                               newWidget)
 
-    # HACK:
-    # it should be possible to possible to pass the area to be deleted
-    # with the gnue internal event.
-    #object._displayHandler.selection1=start_pos
-    #object._displayHandler.selection2=end_pos
-    #object._displayHandler.cursor = widget.get_position()
-    #action = events.Event('requestDELETE',
-    try:
-      CursorPos = widget.get_position()
-    except:
-      CursorPos = widget.get_insert()
+    newWidget._keypressHandler = newWidget.connect ('key-press-event',
+                                               self.textViewKeyPress)
 
-    action = events.Event('requestDELETERANGE',
-                          start_pos=start_pos,
-                          end_pos=end_pos,
-                          position=CursorPos,
-                          _form=object._form)
+    if event.initialize:
+      self._addFocusHandler (newWidget)
+      self._addDefaultEventHandler (newWidget)
 
-    widget.emit_stop_by_name('delete-text')
-    gtk.idle_add(eventHandler,action)
+    event.container.put (viewport, self.itemX, self.itemY)
+    newWidget.show ()
 
-  #
-  #  eventHandler for gtk.Combo,  no interruption, etc.
-  #
+    return newWidget
 
-  def comboHandler(self, combo_list, list_child, combo):
-    selection = combo_list.child_position(list_child)
-    selected_text = self.choices[selection]
 
-    gfObject     = self._uiDriver._WidgetToGFObj[combo]
-    eventdata = [gfObject, selected_text]
-    action = events.Event('requestREPLACEVALUE',object=gfObject,
-                          index=selection, text=selected_text,
-                          _form=gfObject._form)
 
-    # TODO: allow veto
-    self._eventHandler(action)
+  # ---------------------------------------------------------------------------
+  # Create a new text entry widget
+  # ---------------------------------------------------------------------------
 
-    return gtk.TRUE
+  def __createEntry (self, gfObject, event):
 
-  #
-  #  eventHandler for gtk.CheckBox,  no interruption, etc.
-  #
+    maxLen = hasattr (gfObject, 'maxLength') and gfObject.maxLength or 0
 
-  def checkboxHandler(self,event,widget):
-    buttonStatus=widget.get_active()
-    GDebug.printMesg(1, "buttonStatus: " + str(buttonStatus))
-    gfObject     = self._uiDriver._WidgetToGFObj[widget]
-    eventdata = [gfObject, buttonStatus]
-    action = events.Event('requestTOGGLECHKBOX', _form=gfObject._form)
-    # don't process event further
-    widget.emit_stop_by_name('clicked') # FIXME: won't accept veto
-    widget.emit_stop_by_name('released') # FIXME: won't accept veto
+    newWidget = gtk.Entry (maxLen)
+    newWidget.modify_font (self._uiDriver.mono_font)
+    newWidget.set_size_request (self.itemWidth, self.itemHeight + 1)
 
-    #gtk.idle_add(self._eventHandler,action)  # our eventHandler will be 
called later
-    return gtk.TRUE
+    newWidget._insert_handler = newWidget.connect ('insert-text',
+                                                   self.insertTextHandler)
 
+    newWidget._delete_handler = newWidget.connect ('delete-text',
+                                                   self.deleteTextHandler)
+    if event.initialize:
+      self._addFocusHandler (newWidget)
+      self._addDefaultEventHandler (newWidget)
 
-# TODO: Add support for READONLY edits with: set_editable
+    event.container.put (newWidget, self.itemX, self.itemY)
+    newWidget.show ()
 
-class MultiLineEdit:
-  def __init__(self,value,eventHandler,uiDriver):
-    self.textTagTable=gtk.TextTagTable()
-    self.textBuffer=gtk.TextBuffer(self.textTagTable)
-    self.baseWidget=gtk.TextView()
-    self.baseWidget.set_buffer(self.textBuffer)
-    self.baseWidget.set_wrap_mode(gtk.WRAP_CHAR)
-    self.baseWidget._parent=self
-    self.textBuffer.set_text(value)
-    self.viewport=gtk.ScrolledWindow()
-    self.viewport.add_with_viewport(self.baseWidget)
-    self.viewport.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+    return newWidget
 
-    self.insert_handler = self.textBuffer.connect('insert-text', \
-                                             self.insertTextHandler,\
-                                             eventHandler, \
-                                             uiDriver)
 
-    self.delete_handler = self.textBuffer.connect('delete-range',\
-                                             self.deleteTextHandler,\
-                                             eventHandler,\
-                                             uiDriver)
+  # ---------------------------------------------------------------------------
+  # Set the cursor position in a widget to position
+  # -------------------------------------------------------------------------
 
-    self.mv_cur_handler = self.baseWidget.connect('move-cursor',\
-                                             self.moveCursorHandler,\
-                                             eventHandler,\
-                                             uiDriver)
+  def setCursorPosition (self, position, index = 0):
+    widget = self.widgets [index]
+    GDebug.printMesg (1, "setCursorPosition to %s in %s [%s]" % \
+        (position, self, index))
 
-  # Return own name to let other objects identify this obj.
-  def get_name(self):
-    return 'MultiLineEdit'
+    if isinstance (widget, gtk.Entry):
+      if len (widget.get_text ()):
+        widget.set_position (position)
 
-  def set_position(self,position):
-    try:
-      self.baseWidget.handler_block(self.mv_cur_handler)
-    except:
-      pass
-    pos_iter = self.textBuffer.get_iter_at_offset(position)
-    self.textBuffer.place_cursor(pos_iter)
-    print position
-    # take care that the cursor is visible
-    cur_mark = self.textBuffer.get_insert()
-    self.baseWidget.scroll_mark_onscreen(cur_mark)
-    #print "SCROLLED TO ", cur_mark
-    try:
-      self.baseWidget.handler_unblock(self.mv_cur_handler)
-    except:
-      pass
+    elif isinstance (widget, gtk.TextView):
+      tBuffer = widget.get_buffer ()
+      tBuffer.place_cursor (tBuffer.get_iter_at_offset (position))
+      widget.set_cursor_visible (True)
+      widget.scroll_mark_onscreen (tBuffer.get_insert ())
 
-  def set_text(self,value):
-    try:
-      self.textBuffer.handler_block(self.insert_handler)
-      self.textBuffer.handler_block(self.delete_handler)
-    except:
-      pass
-    self.textBuffer.set_text(value)
-    #print "settext"
-    try:
-      self.textBuffer.handler_unblock(self.insert_handler)
-      self.textBuffer.handler_unblock(self.delete_handler)
-    except:
-      pass
 
-  # pass through function calls
-  def __getattr__(self, attr):
-    #print "doing %s" % attr
-    if self.baseWidget and attr[1] != '_' and hasattr(self.baseWidget,attr):
-      return getattr(self.baseWidget,attr)
-    else:
-      raise AttributeError, attr
+  # ---------------------------------------------------------------------------
+  # set the selected area
+  # ---------------------------------------------------------------------------
 
+  def setSelectedArea (self, selection1, selection2, index = 0):
+    GDebug.printMesg (1, "Set Selected Area %s/%s in %s [%s]" % \
+        (selection1, selection2, self, index))
 
-  def 
insertTextHandler(self,widget,textiter,newtext,position,eventHandler,uiDriver):
-    #print "insertText %s " % newtext
-    object=uiDriver._WidgetToGFObj[self]
-#    object._displayHandler.cursor = widget.get_insert()
-    object._displayHandler.cursor = textiter.get_offset()
+    widget = self.widgets [index]
 
+    if isinstance (widget, gtk.Entry):
+      widget.select_region (selection1, selection2)
+
+    elif isinstance (widget, gtk.TextView):
+      tBuffer = widget.get_buffer ()
+      selbound = tBuffer.get_selection_bound ()
+      insert   = tBuffer.get_insert ()
+      left  = min (selection1, selection2)
+      right = max (selection1, selection2)
+
+      tBuffer.move_mark (insert, tBuffer.get_iter_at_offset (left))
+      tBuffer.move_mark (selbound, tBuffer.get_iter_at_offset (right))
+
+
+  # ---------------------------------------------------------------------------
+  # insert text into gtk.Entry widgets
+  # ---------------------------------------------------------------------------
+
+  def insertTextHandler (self, widget, newtext, length, pos):
+
+    GDebug.printMesg (1, "insert gtk.Entry () '%s' at %d (%s) into %s" % \
+        (newtext, widget.get_position (), pos, widget))
+
+    gfObject = self._uiDriver._WidgetToGFObj [widget]
+
     # Compatibility layer for 0.5.1
-    #text = unicode(newtext,'utf-8')
-    text = unicode(newtext,'utf-8').encode(gConfigForms('textEncoding'))
+    text = unicode (newtext, 'utf-8').encode (gConfigForms ('textEncoding'))
 
-    action = events.Event('requestKEYPRESS', text, text=text,
-                          code=0, _form=object._form)
+    action = events.Event ('requestINSERTAT', text, text = text,
+                           position = widget.get_position (),
+                           _form = gfObject._form)
 
-    # don't process event further
-    widget.emit_stop_by_name('insert-text')
+    widget.stop_emission ('insert-text')
+    gtk.idle_add (self._eventHandler, action)
 
-    gtk.idle_add(eventHandler,action)  # our eventHandler will be called later
 
+  # ---------------------------------------------------------------------------
+  # delete a portion of text from a gtk.Entry () widget
+  # ---------------------------------------------------------------------------
 
-  def deleteTextHandler(self,widget,start_pos,end_pos,eventHandler,uiDriver):
-    #print "delete (%s..%s)" % (start_pos.get_offset(),end_pos.get_offset())
+  def deleteTextHandler (self, widget, start_pos, end_pos):
+    gfObject = self._uiDriver._WidgetToGFObj [widget]
+    GDebug.printMesg (1, "Delete %s to %s in %s" % (start_pos, end_pos, 
widget))
 
-    object=uiDriver._WidgetToGFObj[self]
+    action = events.Event ('requestDELETERANGE',
+                            start_pos = start_pos,
+                            end_pos   = end_pos,
+                            position  = widget.get_position (),
+                            _form     = gfObject._form)
 
-    cursor_iter = widget.get_iter_at_mark(widget.get_insert())
+    widget.stop_emission ('delete-text')
+    self._eventHandler (action)
 
 
-    action = events.Event('requestDELETERANGE',
-                          start_pos=start_pos.get_offset(),
-                          end_pos=end_pos.get_offset(),
-                          position=cursor_iter.get_offset(),
-                          _form=object._form)
+  # ---------------------------------------------------------------------------
+  # Handle text inserts in a text view widget (textBuffer)
+  # ---------------------------------------------------------------------------
 
-    widget.emit_stop_by_name('delete-range')
-    gtk.idle_add(eventHandler,action)
+  def insertBufferHandler (self, tBuffer, iterator, newtext, length, widget):
 
-  def moveCursorHandler(self,widget,arg1,arg2,arg3,eventHandler,uiDriver):
-    print "move Cursor (%s,%s,%s)" % (arg1,arg2,arg3)
-    #arg1: movement type (1 = horizontal, 3 = vertikal)
-    #arg2: offset: +/- relative movement
-    object=uiDriver._WidgetToGFObj[self]
+    GDebug.printMesg (1, "gtk.TextBuffer insert '%s' at %s" % \
+        (newtext, iterator.get_offset ()))
 
-    return
-    cursor_iter = widget.get_iter_at_mark(widget.get_insert())
+    gfObject = self._uiDriver._WidgetToGFObj [widget]
+    text = unicode (newtext, 'utf-8').encode (gConfigForms ('textEncoding'))
 
+    action = events.Event ('requestINSERTAT', text, text = text,
+                           position = iterator.get_offset (),
+                           _form = gfObject._form)
 
-    action = events.Event('requestDELETERANGE',
-                          start_pos=start_pos.get_offset(),
-                          end_pos=end_pos.get_offset(),
-                          position=cursor_iter.get_offset(),
-                          _form=object._form)
+    tBuffer.stop_emission ('insert-text')
+    self._eventHandler (action)
 
-    widget.emit_stop_by_name('delete-range')
-    gtk.idle_add(eventHandler,action)
 
 
+  # ---------------------------------------------------------------------------
+  # Handle deletes in a textView widget
+  # ---------------------------------------------------------------------------
 
+  def deleteBufferHandler (self, tBuffer, start, end, widget):
+    GDebug.printMesg (1, "gtk.TextBuffer delete %s to %s in %s" \
+        % (start.get_offset (), end.get_offset (), widget))
+
+    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)
+
+    tBuffer.stop_emission ('delete-range')
+    self._eventHandler (action)
+
+
+  # ---------------------------------------------------------------------------
+  # Handle the tab-key in a textView widget to move the focus
+  # ---------------------------------------------------------------------------
+
+  def textViewKeyPress (self, widget, event):
+    """
+    This handler reacts on up and down keys. While not in the first or last row
+    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 ()
+
+      if currLine != lastLine:
+        tBuffer.place_cursor (tBuffer.get_iter_at_line (currLine + 1))
+      else:
+        widget.get_toplevel ().child_focus (gtk.DIR_TAB_FORWARD)
+
+      return gtk.TRUE
+
+    elif event.keyval == gtk.keysyms.Up:
+      tBuffer = widget.get_buffer ()
+      currLine = tBuffer.get_iter_at_mark (tBuffer.get_insert ()).get_line ()
+
+      if currLine > 0:
+        tBuffer.place_cursor (tBuffer.get_iter_at_line (currLine - 1))
+
+      else:
+        widget.get_toplevel ().child_focus (gtk.DIR_TAB_BACKWARD)
+
+      return gtk.TRUE
+
+    # Key not handled, leave it up to the common handler
+    return gtk.FALSE
+
+
+  # ---------------------------------------------------------------------------
+  # Handle selection event in combo boxes
+  # ---------------------------------------------------------------------------
+
+  def comboHandler (self, comboList, listChild, combo):
+    """
+    This function handles a 'select-child' signal of a combo box list. If the
+    newly selected item differs from the corresponding GFObject's value a
+    'requestREPLACEVALUE' will be fired.
+    """
+    GDebug.printMesg (2, "Selected %s in %s" % (listChild, combo))
+
+    selection     = comboList.child_position (listChild)
+    selected_text = self.choices [selection]
+
+    gfObject      = self._uiDriver._WidgetToGFObj [combo]
+    compare       = self.reverse.get (gfObject.getValue (), None)
+    
+    GDebug.printMesg (1, "Selection is %s in %s" % (selected_text, gfObject))
+    GDebug.printMesg (1, "Old %s vs %s" % (repr (compare), selected_text))
+      
+    comboList.stop_emission ('select-child')
+
+    if compare is None or compare != selected_text:
+      action = events.Event ('requestREPLACEVALUE', object = gfObject,
+                            index = selection, text = selected_text,
+                            _form = gfObject._form)
+
+      self._eventHandler (action)
+
+    return gtk.TRUE
+
+
+  # ---------------------------------------------------------------------------
+  # Handle special keypress signals in gtk.Combo.Entry widgets
+  # ---------------------------------------------------------------------------
+
+  def comboEntryKeyPress (self, widget, event):
+    """
+    This handler traps the enter key in the entry widget of a combo box and
+    fires a 'requestNEXTENTRY' event. All other keys are passed through.
+    """
+    gfObject  = self._uiDriver._WidgetToGFObj [widget.get_parent ()]
+
+    if event.keyval == gtk.keysyms.Return:
+      action = events.Event ('requestNEXTENTRY', _form = gfObject._form)
+      self._eventHandler (action)
+      return gtk.TRUE
+
+    return gtk.FALSE
+
+
+  # ---------------------------------------------------------------------------
+  # Handle the toggled event on a checkbox
+  # ---------------------------------------------------------------------------
+
+  def checkboxHandler (self, widget):
+    """
+    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)
+
+    widget.stop_emission ('toggled')
+
+    self._eventHandler (action)
+    return gtk.TRUE
+
+
+# -----------------------------------------------------------------------------
+# Base configuration data
+# -----------------------------------------------------------------------------
+
 configuration = {
     'baseClass'  : UIEntry,
     'provides'   : 'GFEntry',


Property changes on: trunk/gnue-forms/src/uidrivers/gtk2/widgets/entry.py
___________________________________________________________________
Name: svn:keywords
   + +Id

Modified: trunk/gnue-forms/src/uidrivers/gtk2/widgets/form/widget.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/widgets/form/widget.py  2004-07-20 
13:52:09 UTC (rev 5992)
+++ trunk/gnue-forms/src/uidrivers/gtk2/widgets/form/widget.py  2004-07-20 
13:58:53 UTC (rev 5993)
@@ -18,153 +18,144 @@
 #
 # Copyright 2000-2004 Free Software Foundation
 #
-# FILE:
-# gtk2/widgets/form/widget.py
-#
-# DESCRIPTION:
-# A part of the gtk2 based user interface driver for GNUe forms.
-#
-# NOTES:
-#
+# $Id: $
+
+import gtk
 import string
+import wrappers
 
-import gtk
 from gnue.common import events
-from gnue.forms.uidrivers.gtk2.common import *
+from gnue.common.apps import GDebug
 from gnue.forms.uidrivers.gtk2.widgets._base import UIHelper
-
-import wrappers
-
 from gnue.forms.uidrivers.gtk2.MenuBar import MenuBar
 from gnue.forms.uidrivers.gtk2.ToolBar import ToolBar
 
-#
-# UIForm
-#
-# Widget set specific function that creates a single instance of a Form widget
-#
-class UIForm(UIHelper):
+
+# =============================================================================
+# This class creates a single instance of a form widget
+# =============================================================================
+
+class UIForm (UIHelper):
   
-  def __init__(self, event):
-    self._uiPageList=[]
-    self.statusBar = None
-    UIHelper.__init__(self, event)
+  # ---------------------------------------------------------------------------
+  # Constructor
+  # ---------------------------------------------------------------------------
 
+  def __init__ (self, event):
+    self._uiPageList = []
+    self.statusBar   = None
+
+    UIHelper.__init__ (self, event)
+
   
-  def _createWidget(self, event, spacer):
+  # ---------------------------------------------------------------------------
+  # GTK-Widget creation
+  # ---------------------------------------------------------------------------
 
-    object = event.object
+  def _createWidget (self, event, spacer):
 
-    #
-    # Size based upon the form definition
-    #
+    gfObject = event.object
+
     self.menu_sb_space = 0
 
-    formWidth = int(self._form._layout.Char__width)
-    formHeight = int(self._form._layout.Char__height)
-    self._visibleSize = (formWidth*self._uiDriver.widgetWidth,
-                      formHeight*self._uiDriver.widgetHeight)
+    formWidth  = int (self._form._layout.Char__width)
+    formHeight = int (self._form._layout.Char__height)
+
+    self._visibleSize = (formWidth  * self._uiDriver.widgetWidth,
+                         formHeight * self._uiDriver.widgetHeight)
     
-    self._formSize = formSize = (formWidth*self._uiDriver.widgetWidth,
-                                 (formHeight+self.menu_sb_space)\
-                                 *self._uiDriver.widgetHeight)
+    self._formSize = formSize = (formWidth * self._uiDriver.widgetWidth,
+               (formHeight + self.menu_sb_space) * self._uiDriver.widgetHeight)
 
-
     # The main frame of this form
     if self._form.style != 'dialog':
-      self.mainWindow = gtk.Window()
-      self.mainWindow.set_resizable(gtk.TRUE)
-      self.content_table = gtk.Table(4, 1, gtk.FALSE)
-      self.mainWindow.add(self.content_table)    
+      self.mainWindow = gtk.Window ()
+      self.mainWindow.set_resizable (gtk.TRUE)
+      self.content_table = gtk.Table (4, 1, gtk.FALSE)
+      self.mainWindow.add (self.content_table)
 
-      self.containerFrame = gtk.Frame()
-      self.content_table.attach(self.containerFrame,
+      self.containerFrame = gtk.Frame ()
+      self.content_table.attach (self.containerFrame,
                  # X direction           Y direction
                  0, 1,                   2, 3,
                  gtk.EXPAND | gtk.FILL,  gtk.EXPAND | gtk.FILL,
                  0,                      0)
-      self.createStatusBar()
+      self.containerFrame.show ()
+      self.createStatusBar ()
       
 
-    else:      
-      self.mainWindow = gtk.Window()
-      self.mainWindow.set_resizable(gtk.TRUE)
-      self.containerFrame = gtk.Frame()
-      self.mainWindow.add(self.containerFrame)
-      borderwidth=15
-      # use e.get_allocation() to compute default window sizes
-      self.mainWindow.set_default_size(formWidth*self._uiDriver.widgetWidth +\
-                                       borderwidth,\
-                                       formHeight*self._uiDriver.widgetHeight+\
-                                       borderwidth)
-      
+    else:
+      self.mainWindow = gtk.Dialog (flags = gtk.DIALOG_NO_SEPARATOR |
+          gtk.DIALOG_DESTROY_WITH_PARENT)
+      self.mainWindow.set_resizable (gtk.TRUE)
+      self.mainWindow.action_area.set_size_request (-1, 0)
+      self.containerFrame = gtk.Frame ()
+
+      wx = (formWidth  + 1) * self._uiDriver.widgetWidth
+      wy = (formHeight + 1) * self._uiDriver.widgetHeight
+
+      self.containerFrame.set_size_request (wx, wy)
+
+      self.mainWindow.vbox.pack_start (self.containerFrame)
+      self.containerFrame.show ()
+
           
-    self.mainWindow.connect('delete_event', self.windowExitEvent)
-    self.mainWindow.set_title(str(self._form.title))
-    # TODO: add icon for window
-    # self.mainWindow.set_icon(...)
+    self.mainWindow.connect ('delete_event', self.windowExitEvent)
 
-    # The window in which pages will be rendered 
-    if object._layout.tabbed != 'none':
-      self._wrapper = wrappers.TabbedWrapper(self)
+    title = "%s" % self._form.title
+    self.mainWindow.set_title (title.encode ('utf-8'))
+
+    if gfObject._layout.tabbed != 'none':
+      self._wrapper = wrappers.TabbedWrapper (self)
     else:
-      self._wrapper = wrappers.PlainWrapper(self)
+      self._wrapper = wrappers.PlainWrapper (self)
 
     newWidget = self._wrapper.pane
     self._containerToolkitWidget = newWidget
     
     # Add the menu
-    if not self._form._features['GUI:MENUBAR:SUPPRESS']:
-      MenuBar(self._uiDriver, self, self._form)
+    if not self._form._features ['GUI:MENUBAR:SUPPRESS']:
+      MenuBar (self._uiDriver, self, self._form)
     
     # and the Toolbar
     if not self._form._features['GUI:TOOLBAR:SUPPRESS']:
-      ToolBar(self._uiDriver, self, self._form)
+      ToolBar (self._uiDriver, self, self._form)
      
 
-    # compute default window size
-    #
-    #paneSize=self.containerFrame.get_allocation()
-    #winSize=self.mainWindow.get_allocation()
-    #offsetX=winSize.width-paneSize.width
-    #offsetY=winSize.height-paneSize.height
-    #print "Size %s,%s" % (offsetX,offsetY)
-    #(w,h)=self.containerFrame.get_size_request()
-    #print 'size: %s,%s' %(w,h)
-    #(w,h)=self.mainWindow.get_size_request()
-    #print 'size: %s,%s' %(w,h)
-      
     self._eventHandler = event.eventHandler
-    self._wrapper.finalize()
+    self._wrapper.finalize ()
     self._visible = 0
 
     return newWidget
 
 
-  def createStatusBar(self):
-    self.statusBar1 = gtk.Statusbar()
-    self.statusBar2 = gtk.Statusbar()
-    self.statusBar3 = gtk.Statusbar()
-    self.statusBar4 = gtk.Statusbar()
-    self.statusBar5 = gtk.Statusbar()
+  # ---------------------------------------------------------------------------
+  # Create the status bar
+  # ---------------------------------------------------------------------------
 
-    self.statusBar1.set_has_resize_grip(gtk.FALSE)
-    self.statusBar2.set_has_resize_grip(gtk.FALSE)
-    self.statusBar3.set_has_resize_grip(gtk.FALSE)
-    self.statusBar4.set_has_resize_grip(gtk.FALSE)
-    self.statusBar5.set_has_resize_grip(gtk.TRUE)
+  def createStatusBar (self):
+    self.statusBar1 = gtk.Statusbar ()
+    self.statusBar2 = gtk.Statusbar ()
+    self.statusBar3 = gtk.Statusbar ()
+    self.statusBar4 = gtk.Statusbar ()
+    self.statusBar5 = gtk.Statusbar ()
 
-    status_bar_table=gtk.HBox(2)
-    status_bar_table.set_homogeneous(gtk.FALSE)
-    status_bar_table.pack_start(self.statusBar1,gtk.TRUE,gtk.TRUE,0)
+    self.statusBar1.set_has_resize_grip (False)
+    self.statusBar2.set_has_resize_grip (False)
+    self.statusBar3.set_has_resize_grip (False)
+    self.statusBar4.set_has_resize_grip (False)
+    self.statusBar5.set_has_resize_grip (False)
+
+    status_bar_table = gtk.HBox (False)
+    status_bar_table.pack_start (self.statusBar1)
     
-    status_bar_table2=gtk.HBox(4)
-    status_bar_table2.pack_start(self.statusBar2,gtk.TRUE,gtk.TRUE,0)
-    status_bar_table2.pack_start(self.statusBar3,gtk.TRUE,gtk.TRUE,0)
-    status_bar_table2.pack_start(self.statusBar4,gtk.TRUE,gtk.TRUE,0)
-    status_bar_table2.pack_start(self.statusBar5,gtk.TRUE,gtk.TRUE,0)
+    status_bar_table2 = gtk.HBox(False)
+    status_bar_table2.pack_start (self.statusBar2)
+    status_bar_table2.pack_start (self.statusBar3)
+    status_bar_table2.pack_start (self.statusBar4)
+    status_bar_table2.pack_start (self.statusBar5)
 
-    status_bar_table.pack_start(status_bar_table2,gtk.TRUE,gtk.TRUE,0)
+    status_bar_table.pack_start (status_bar_table2)
 
     self.content_table.attach(status_bar_table,
                  # X direction           Y direction
@@ -172,75 +163,89 @@
                  gtk.EXPAND | gtk.FILL,  0,
                  0,                      0)
                                                 
-  #
-  # gotoPage
-  #
+  # ---------------------------------------------------------------------------
   # Makes the requested page visible while hiding the others
-  #
-  def gotoPage(self,event):
-    
self._wrapper.setPage(self._uiDriver._gfObjToUIWidget[event.data].widgets[0])
+  # ---------------------------------------------------------------------------
+
+  def gotoPage (self, event):
+    pageObj = self._uiDriver._gfObjToUIWidget [event.data].widgets [0]
+    GDebug.printMesg (1, "gotoPAGE: %s %s" % (event.data, pageObj))
+    self._wrapper.setPage (pageObj)
           
                      
-  #
-  # _setStatusBar
-  #
-  def _setStatusBar(self,tip, statusValue, insertValue, currentRecord,\
+  # ---------------------------------------------------------------------------
+  # set values in the corresponding status bars
+  # ---------------------------------------------------------------------------
+
+  def _setStatusBar (self, tip, statusValue, insertValue, currentRecord,
                     maxRecord, currentPage, maxPage):
     
-    if not hasattr(self,'statusBar1'):
+    if not hasattr (self, 'statusBar1'):
       return
     
-    if tip != None:
-      self.statusBar1.push(self.statusBar1.get_context_id("tip"),str(tip))
+    if tip is not None:
+      text = "%s" % tip
+      context = self.statusBar1.get_context_id ('tip')
+      self.statusBar1.push (context, text.encode ('utf-8'))
 
     if statusValue:
-      context_id=self.statusBar2.get_context_id("statusValue")
-      self.statusBar2.push(context_id,statusValue)
+      context = self.statusBar2.get_context_id ('statusValue')
+      self.statusBar2.push (context, statusValue.encode ('utf-8'))
       
     if insertValue:
-      context_id=self.statusBar3.get_context_id("insertValue")
-      self.statusBar3.push(context_id,insertValue)
+      context = self.statusBar3.get_context_id ('insertValue')
+      self.statusBar3.push (context, insertValue.encode ('utf-8'))
 
-    if currentRecord and  maxRecord:
-      context_id=self.statusBar4.get_context_id("currentRecord_and_maxRecord")
-      messg=string.strip("%s/%s" %(currentRecord,maxRecord))
-      self.statusBar4.push(context_id,messg)
+    if currentRecord and maxRecord:
+      context = self.statusBar4.get_context_id ('currentRecord_and_maxRecord')
+      text    = string.strip ("%s/%s" % (currentRecord, maxRecord))
+      self.statusBar4.push (context, text)
 
-    if currentPage and  maxPage:
-      context_id=self.statusBar5.get_context_id("currentPage_and_maxPage")
-      messg=string.strip("%s/%s"%(currentPage,maxPage))
-      self.statusBar5.push(context_id,messg)
+    if currentPage and maxPage:
+      context = self.statusBar5.get_context_id ('currentPage_and_maxPage')
+      text    = string.strip ("%s/%s" % (currentPage, maxPage))
+      self.statusBar5.push (context, text)
 
 
-  def show(self):
-    self.containerFrame.show()
-    self.mainWindow.show_all()
+  # ---------------------------------------------------------------------------
+  # show the current form non-modal
+  # ---------------------------------------------------------------------------
+
+  def show (self):
+    self.containerFrame.show ()
+    self.mainWindow.show_all ()
     self._visible = 1
+    if self._form.style == 'dialog':
+      self.mainWindow.run ()
 
-  def hide(self):
-    self.containerFrame.hide()
-    self.mainWindow.hide()
-    self.mainWindow.set_modal(gtk.FALSE)
+
+  # ---------------------------------------------------------------------------
+  # Hide the current form
+  # ---------------------------------------------------------------------------
+
+  def hide (self):
+    self.containerFrame.hide ()
+    self.mainWindow.hide ()
+    self.mainWindow.set_modal (False)
     self._visible = 0
     
-  def showModal(self):
-    self.mainWindow.show_all()
-    self.mainWindow.set_modal(gtk.TRUE)
+
+  # ---------------------------------------------------------------------------
+  # Show the current form modal
+  # ---------------------------------------------------------------------------
+
+  def showModal (self):
+    self.mainWindow.show_all ()
+    self.mainWindow.set_modal (True)
     self._visible = 1
+    if self._form.style == 'dialog':
+      self.mainWindow.run ()
     
-  #############################################################################
-  #
-  # Internal Event Processors
-  #
-  # Processes the events from the widget set
-  #
 
-  #
-  # windowExitEvent
-  #
-  # Catches the Exit event from the menu and request exit (similar to the 
closeTrap method of wx uidrv.)
-  #
-  def windowExitEvent(self,*args):
-   self._uiDriver.dispatchEvent('requestEXIT',_form=self._form)
-   return gtk.TRUE
+  # ---------------------------------------------------------------------------
+  # Catch the exit event from the menu and request exit
+  # ---------------------------------------------------------------------------
 
+  def windowExitEvent (self, widget, event):
+    self._uiDriver.dispatchEvent ('requestEXIT', _form = self._form)
+    return True


Property changes on: trunk/gnue-forms/src/uidrivers/gtk2/widgets/form/widget.py
___________________________________________________________________
Name: svn:keywords
   + +Id

Modified: trunk/gnue-forms/src/uidrivers/gtk2/widgets/form/wrappers.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/widgets/form/wrappers.py        
2004-07-20 13:52:09 UTC (rev 5992)
+++ trunk/gnue-forms/src/uidrivers/gtk2/widgets/form/wrappers.py        
2004-07-20 13:58:53 UTC (rev 5993)
@@ -18,149 +18,207 @@
 #
 # Copyright 2000-2004 Free Software Foundation
 #
-# FILE:
-# gtk2/widgets/forms/wrappers.py
-#
-# DESCRIPTION:
-# A part of the gtk2 based user interface driver for GNUe forms.
-#
-# NOTES:
-#
-import string, sys
+# $Id: $
+
 import gtk
+
 from gnue.common import events
 from gnue.common.apps import GDebug
 
-from gnue.forms.uidrivers.gtk2.common import *
+# =============================================================================
+# Constants
+# =============================================================================
 
-class ScrollableWrapper(gtk.ScrolledWindow):
+_tabStyles = {'left'  : gtk.POS_LEFT,
+              'right' : gtk.POS_RIGHT,
+              'bottom': gtk.POS_BOTTOM,
+              'top'   : gtk.POS_TOP}
+
+# =============================================================================
+# Base class for scrollable pages
+# =============================================================================
+
+class ScrollableWrapper (gtk.ScrolledWindow):
+
+  # ---------------------------------------------------------------------------
+  # Constructor
+  # ---------------------------------------------------------------------------
+
   def __init__(self, uiform):
- 
     self.uiform = uiform
-    self.frame = frame = uiform.containerFrame
-    self.form = form = uiform._form
+    self.form   = uiform._form
+    self.frame  = uiform.containerFrame
     self.margin = 2
-    gtk.ScrolledWindow.__init__(self)
-    self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-    #self.set_border_width(self.margin)
-    self.frame.add(self)
+    gtk.ScrolledWindow.__init__ (self)
+    self.set_policy (gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+    self.frame.add (self)
 
-    formWidth = int(form._layout.Char__width)
-    formHeight = int(form._layout.Char__height)
-    self.layoutXSize = formWidth*uiform._uiDriver.widgetWidth
-    self.layoutYSize = formHeight*uiform._uiDriver.widgetHeight
+    formWidth        = int (self.form._layout.Char__width)
+    formHeight       = int (self.form._layout.Char__height)
+
+    self.layoutXSize = formWidth  * uiform._uiDriver.widgetWidth
+    self.layoutYSize = formHeight * uiform._uiDriver.widgetHeight
     
-    self._fitted = 0
+    self._fitted   = 0
     self._pageList = []
 
-  def finalize(self):
+  # ---------------------------------------------------------------------------
+  # Final actions on a wrapper
+  # ---------------------------------------------------------------------------
+
+  def finalize (self):
     pass
 
-#
-# Notebook pages
-#
-class TabbedWrapper(gtk.Notebook):
-  def __init__(self, uiform):
-#    ScrollableWrapper.__init__(self, *args, **parms)
+# =============================================================================
+# Single page forms
+# =============================================================================
+
+class PlainWrapper (ScrollableWrapper):
+
+  # ---------------------------------------------------------------------------
+  # Constructor
+  # ---------------------------------------------------------------------------
+
+  def __init__ (self, *args, **parms):
+    ScrollableWrapper.__init__ (self, *args, **parms)
+    self.pane = gtk.Fixed ()
+    self.add_with_viewport (self.pane)
+    self.set_size_request (self.layoutXSize, self.layoutYSize)
+    
+  # ---------------------------------------------------------------------------
+  # Finalize the wrapper
+  # ---------------------------------------------------------------------------
+
+  def finalize (self):
+    self.pane.set_size_request (self.layoutXSize, self.layoutYSize)
+
+
+  # ---------------------------------------------------------------------------
+  # Create a new page
+  # ---------------------------------------------------------------------------
+
+  def createPage (self, gfObject):
+    newWidget = gtk.Fixed ()
+    self.pane.add (newWidget)
+
+    # Only show first page
+    if len (self._pageList) < 1:
+      newWidget.show_all ()
+      
+    self._pageList.append (newWidget)
+    return newWidget
+
+  
+  # ---------------------------------------------------------------------------
+  # Activate a given page
+  # ---------------------------------------------------------------------------
+
+  def setPage (self, page):
+    for p in self._pageList:
+      if p != page:
+        p.show_all ()
+      else:
+        p.hide ()
+
+
+# =============================================================================
+# This class implements paged forms using a gtk.Notebook as baseclass
+# =============================================================================
+
+class TabbedWrapper (gtk.Notebook):
+
+  # ---------------------------------------------------------------------------
+  # Constructor
+  # ---------------------------------------------------------------------------
+
+  def __init__ (self, uiform):
     self.uiform = uiform
-    self.frame = frame = uiform.containerFrame
-    self.pane = self
+    self.frame  = frame = uiform.containerFrame
+    self.pane   = self
     self.margin = 2
-    gtk.Notebook.__init__(self)
+    gtk.Notebook.__init__ (self)
+
     try:
-      tabstyle  = _tabStyles[self.form._layout.tabbed]
-      self.set_tab_pos(tabstyle)
+      tabstyle  = _tabStyles [self.form._layout.tabbed]
+      self.set_tab_pos (tabstyle)
+
     except:
       pass
-    self.set_scrollable(gtk.TRUE)
-    # The signal "select-page" doesn't work with 
-    # self.connect('select-page', self.notebookTabHandler)
-    self.connect('switch-page', self.notebookTabHandler)
 
-    self.frame.add(self)
+    self.set_scrollable (True)
+    self._switchHandler = self.connect ('switch-page', self.notebookTabHandler)
 
-    self.form = form = uiform._form
-    formWidth = int(form._layout.Char__width)
-    formHeight = int(form._layout.Char__height)
-    self.layoutXSize = formWidth*uiform._uiDriver.widgetWidth
-    self.layoutYSize = formHeight*uiform._uiDriver.widgetHeight
+    self.frame.add (self)
 
-    self._oldpage=0
+    self.form  = form = uiform._form
+    formWidth  = int (form._layout.Char__width)
+    formHeight = int (form._layout.Char__height)
+
+    # Since we have additional tabs, we stretch the formheight
+    self.layoutXSize = formWidth  * uiform._uiDriver.widgetWidth
+    self.layoutYSize = int ((formHeight + 1.5) * uiform._uiDriver.widgetHeight)
+
+    self._oldpage  = 0
     self._pageList = []
 
     self.__notebookLoopTrap = 0
 
-  def createPage(self, object):
 
-    swin = gtk.ScrolledWindow()
-    newWidget = gtk.Fixed()    
-    tab_label=gtk.Label(object.name)
+  # ---------------------------------------------------------------------------
+  # Create a new page and append it to the notebook
+  # ---------------------------------------------------------------------------
 
-    swin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-    swin.add_with_viewport(newWidget)
-    self.append_page(swin, tab_label)
+  def createPage (self, gfObject):
 
-    self._pageList.append(newWidget)
-    # newWidget.set_size_request(self.layoutXSize,self.layoutYSize)
+    GDebug.printMesg (3, "createPage %s for %s" % (self, gfObject))
+    newWidget = gtk.Fixed ()
+    swin = gtk.ScrolledWindow ()
 
+    swin.set_policy (gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+    swin.add_with_viewport (newWidget)
+    if hasattr (gfObject, 'caption'):
+      text = "%s" % gfObject.caption
+    else:
+      text = "%s" % gfObject.name
+    self.append_page (swin, gtk.Label (text.encode ('utf-8')))
+
+    self._pageList.append (newWidget)
+    newWidget.show ()
+
     return newWidget
 
-  def finalize(self):
-    self.pane.set_size_request(self.layoutXSize,self.layoutYSize)
-    
 
-  def notebookTabHandler(self,notebook,notebookpage,page_number):
-    if self._oldpage!=page_number:
-      
-      action = events.Event('requestPAGE',page_number, _form=self.form)
-      self.uiform._eventHandler(action)
+  # ---------------------------------------------------------------------------
+  # Finalize the widget
+  # ---------------------------------------------------------------------------
 
-      notebook.emit_stop_by_name('switch-page')
+  def finalize (self):
+    self.pane.set_size_request (self.layoutXSize, self.layoutYSize)
+    
 
-  def setPage(self, page):
-    # get Scroll Window for page
-    swin=page.get_parent().get_parent()
-    page_number=self.page_num(swin)
-    self._oldpage=page_number
-    self.set_current_page(page_number)
+  # ---------------------------------------------------------------------------
+  # Transform a switch-page signal into a requestPAGE event
+  # ---------------------------------------------------------------------------
 
+  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)
 
+      notebook.stop_emission ('switch-page')
 
-#
-# Single pages
-#
-class PlainWrapper(ScrollableWrapper):
-  def __init__(self, *args, **parms):
-    ScrollableWrapper.__init__(self, *args, **parms)
-    self.pane = gtk.Fixed()
-    self.add_with_viewport(self.pane)
-    self.set_size_request(self.layoutXSize,self.layoutYSize)
-    
-  def finalize(self):
-    self.pane.set_size_request(self.layoutXSize,self.layoutYSize)
 
-  def createPage(self, object):
-    newWidget = gtk.Fixed()
-    self.pane.add(newWidget)
+  # ---------------------------------------------------------------------------
+  # Activate a given page in the notebook
+  # ---------------------------------------------------------------------------
 
-    # Only show first page
-    if len(self._pageList)<1:
-      newWidget.show_all()
-      
-    self._pageList.append(newWidget)
-    return newWidget
-  
-  def setPage(self, page):    
-    for p in self._pageList:
-      if p != page:
-        p.show_all()
-      else:
-        p.hide()
+  def setPage (self, page):
+    GDebug.printMesg (3, "SET-PAGE %s to %s" % (self, page))
 
-        
-_tabStyles = {'left':gtk.POS_LEFT,
-              'right':gtk.POS_RIGHT,
-              'bottom':gtk.POS_BOTTOM,
-              'top':gtk.POS_TOP,
-              }
+    swin = page.get_parent ().get_parent ()
+    pageNum = self.page_num (swin)
+    self._oldpage = pageNum
+    self.set_current_page (pageNum)
 


Property changes on: 
trunk/gnue-forms/src/uidrivers/gtk2/widgets/form/wrappers.py
___________________________________________________________________
Name: svn:keywords
   + +Id


Property changes on: trunk/gnue-forms/src/uidrivers/gtk2/widgets/image.py
___________________________________________________________________
Name: svn:keywords
   + +Id

Modified: trunk/gnue-forms/src/uidrivers/gtk2/widgets/label.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/widgets/label.py        2004-07-20 
13:52:09 UTC (rev 5992)
+++ trunk/gnue-forms/src/uidrivers/gtk2/widgets/label.py        2004-07-20 
13:58:53 UTC (rev 5993)
@@ -18,44 +18,56 @@
 #
 # Copyright 2000-2004 Free Software Foundation
 #
-# FILE:
-# UIwxpython.py
-#
-# DESCRIPTION:
-# A wxPython based user interface driver for GNUe forms.
-#
-# NOTES:
-#
+# $Id: $
+
 import gtk
 
 from gnue.forms.uidrivers.gtk2.widgets._base import UIHelper
 
 
-_alignmentStyle = { 'left'  : gtk.JUSTIFY_LEFT,
-                    'center': gtk.JUSTIFY_CENTER,
-                    'right' : gtk.JUSTIFY_RIGHT,
-                    'fill'  : gtk.JUSTIFY_FILL
-                    }
+# TODO: fix proper alignment. Aligment doesn't work at the moment, because the
+# label haven't a width set (using set_size_request ()). Calling this function
+# results in a strange positioning behaviour of the label ??? Currently all
+# labels are 'left-aligned'
+_alignmentStyle = {
+  'left'  : gtk.JUSTIFY_LEFT,
+  'center': gtk.JUSTIFY_CENTER,
+  'right' : gtk.JUSTIFY_RIGHT,
+  'fill'  : gtk.JUSTIFY_FILL
+}
 
-#
-# UILabel
-#
-# Widget set specific function that creates a single instance of a label
-#
-class UILabel(UIHelper):
+# =============================================================================
+# This class provides GTK widgets for labels
+# =============================================================================
 
-  def _createWidget(self, event, spacer):
-    object = event.object
-    newWidget = gtk.Label(str(object.text))
-    newWidget.set_size_request(self.itemWidth, self.itemHeight)
-    event.container.put(newWidget, object.Char__x * event.widgetWidth,
-                        (object.Char__y + spacer + (spacer * object._gap))\
-                        * event.widgetHeight)
-    newWidget.set_justify(_alignmentStyle[object.alignment])
+class UILabel (UIHelper):
+
+  # ---------------------------------------------------------------------------
+  # Create a GTK widget
+  # ---------------------------------------------------------------------------
+
+  def _createWidget (self, event, spacer):
+    gfObject = event.object
+
+    text = "%s" % gfObject.text
+
+    newWidget = gtk.Label (text.encode ('utf-8'))
+    newWidget.modify_font (self._uiDriver.mono_font)
+
+    newWidget.set_justify (_alignmentStyle [gfObject.alignment])
+
+    event.container.put (newWidget, self.itemX, self.itemY)
+    newWidget.show ()
+
     return newWidget
 
+
+# -----------------------------------------------------------------------------
+# Configuration data
+# -----------------------------------------------------------------------------
+
 configuration = {
-    'baseClass'  : UILabel,
-    'provides'   : 'GFLabel',
-    'container'  : 0,
-    }
+  'baseClass'  : UILabel,
+  'provides'   : 'GFLabel',
+  'container'  : 0,
+}


Property changes on: trunk/gnue-forms/src/uidrivers/gtk2/widgets/label.py
___________________________________________________________________
Name: svn:keywords
   + +Id

Modified: trunk/gnue-forms/src/uidrivers/gtk2/widgets/page.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/widgets/page.py 2004-07-20 13:52:09 UTC 
(rev 5992)
+++ trunk/gnue-forms/src/uidrivers/gtk2/widgets/page.py 2004-07-20 13:58:53 UTC 
(rev 5993)
@@ -18,40 +18,34 @@
 #
 # Copyright 2000-2004 Free Software Foundation
 #
-# FILE:
-# gtk2/widgets/page.py
-#
-# DESCRIPTION:
-# A part of the gtk2 based user interface driver for GNUe forms.
-#
-# NOTES:
-#
+# $Id: $
+
 import gtk
 
-from gnue.forms.uidrivers.gtk2.common import _setDefaultEventHandlers
-
 from gnue.forms.uidrivers.gtk2.widgets._base import UIHelper
 
 
-#
-# UIPage
-#
-# Widget set specific function that creates a single instance of a page
-#
-# Note: The event trap for changing notebook pages is attached to the UIForm
-#
-class UIPage(UIHelper):
-  def _createWidget(self, event, spacer):
-    object = event.object
-    newWidget = self._uiForm._wrapper.createPage(object)  
+# =============================================================================
+# This class implements notebook pages
+# =============================================================================
 
-    # _setDefaultEventHandlers(newWidget, event.eventHandler, 
event.initialize, self._uiDriver)
+class UIPage (UIHelper):
 
-    # event.interface._pageList.append(newWidget)
+  # ---------------------------------------------------------------------------
+  # create a new page
+  # ---------------------------------------------------------------------------
+
+  def _createWidget (self, event, spacer):
+    gfObject  = event.object
+    newWidget = self._uiForm._wrapper.createPage (gfObject)
     self._containerToolkitWidget = newWidget
     return newWidget
     
 
+# -----------------------------------------------------------------------------
+# Base configuration
+# -----------------------------------------------------------------------------
+
 configuration = {
     'baseClass'  : UIPage,
     'provides'   : 'GFPage',


Property changes on: trunk/gnue-forms/src/uidrivers/gtk2/widgets/page.py
___________________________________________________________________
Name: svn:keywords
   + +Id


Property changes on: trunk/gnue-forms/src/uidrivers/gtk2/widgets/scrollbar.py
___________________________________________________________________
Name: svn:keywords
   + +Id





reply via email to

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