commit-gnue
[Top][All Lists]
Advanced

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

gnue/forms samples/intro/intro.gfd src/GFClient...


From: James Thompson
Subject: gnue/forms samples/intro/intro.gfd src/GFClient...
Date: Mon, 10 Feb 2003 21:01:50 -0500

CVSROOT:        /cvsroot/gnue
Module name:    gnue
Changes by:     James Thompson <address@hidden> 03/02/10 21:01:49

Modified files:
        forms/samples/intro: intro.gfd 
        forms/src      : GFClient.py GFInstance.py 
        forms/src/uidrivers/_base: UIdriver.py 
        forms/src/uidrivers/wx: UIdriver.py common.py 
Added files:
        forms/src/uidrivers/_base/dialogs: _base.py 
        forms/src/uidrivers/_base/dialogs/about: __init__.py about.gfd 
        forms/src/uidrivers/_base/widgets: __init__.py _base.py 
        forms/src/uidrivers/wx/widgets: __init__.py box.py button.py 
                                        entry.py label.py page.py 
                                        scrollbar.py 
        forms/src/uidrivers/wx/widgets/form: __init__.py widget.py 
                                             wrappers.py 
Removed files:
        forms/src/uidrivers/_base: UIWidget.py 

Log message:
        start of new (hopefully) cleaner ui driver implementation
        start of working <dialog> support
        non-functional sample of how all hardcoded dialogs will be replaced
        with gfd files in the base ui driver
        NOTE: THIS BREAKS CVS FORMS AND DESIGNER
        NOTE: working cvs head at tag pre-jamest-ui-muckup

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/samples/intro/intro.gfd.diff?tr1=1.17&tr2=1.18&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/GFClient.py.diff?tr1=1.60&tr2=1.61&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/GFInstance.py.diff?tr1=1.81&tr2=1.82&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/_base/UIdriver.py.diff?tr1=1.85&tr2=1.86&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/_base/dialogs/_base.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/_base/dialogs/about/__init__.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/_base/dialogs/about/about.gfd?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/_base/widgets/__init__.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/_base/widgets/_base.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/wx/UIdriver.py.diff?tr1=1.229&tr2=1.230&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/wx/common.py.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/wx/widgets/__init__.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/wx/widgets/box.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/wx/widgets/button.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/wx/widgets/entry.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/wx/widgets/label.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/wx/widgets/page.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/wx/widgets/scrollbar.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/wx/widgets/form/__init__.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/wx/widgets/form/widget.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/forms/src/uidrivers/wx/widgets/form/wrappers.py?rev=1.1

Patches:
Index: gnue/forms/samples/intro/intro.gfd
diff -c gnue/forms/samples/intro/intro.gfd:1.17 
gnue/forms/samples/intro/intro.gfd:1.18
*** gnue/forms/samples/intro/intro.gfd:1.17     Thu Nov 28 01:07:59 2002
--- gnue/forms/samples/intro/intro.gfd  Mon Feb 10 21:01:48 2003
***************
*** 105,111 ****
        <field name="FortuneEntry"/>
      </block>
    </logic>
!   <layout xmlns:c="GNUe:Layout:Char" c:height="12" tabbed="top" c:width="40">
      <page name="Welcome">
        <label name="Label_1" text="Welcome to GNU Enterprise!" c:width="26"
               c:x="6" c:y="1"/>
--- 105,111 ----
        <field name="FortuneEntry"/>
      </block>
    </logic>
!   <layout xmlns:c="GNUe:Layout:Char" c:height="12" c:width="40" >
      <page name="Welcome">
        <label name="Label_1" text="Welcome to GNU Enterprise!" c:width="26"
               c:x="6" c:y="1"/>
Index: gnue/forms/src/GFClient.py
diff -c gnue/forms/src/GFClient.py:1.60 gnue/forms/src/GFClient.py:1.61
*** gnue/forms/src/GFClient.py:1.60     Wed Jan  1 19:45:47 2003
--- gnue/forms/src/GFClient.py  Mon Feb 10 21:01:48 2003
***************
*** 51,57 ****
    COMMAND_OPTIONS = [
        [ 'user_interface', 'u', 'interface', 1, None, 'type',
            _('The currently supported values for <type> are ') \
!           +'wx (GUI), gtk2, and curses' ],
        [ 'splash_screen','s','no-splash', 0, None, None,
            _('Disables the splash screen')]
        ]
--- 51,57 ----
    COMMAND_OPTIONS = [
        [ 'user_interface', 'u', 'interface', 1, None, 'type',
            _('The currently supported values for <type> are ') \
!           +'wx (GUI), gtk2, qt, and curses' ],
        [ 'splash_screen','s','no-splash', 0, None, None,
            _('Disables the splash screen')]
        ]
***************
*** 110,115 ****
--- 110,116 ----
  
      while 1:
        try:
+         print "gnue.forms.uidrivers.%s" % (self.ui_type)
          self._ui = dyn_import("gnue.forms.uidrivers.%s" % (self.ui_type))
          break
        except ImportError, err:
***************
*** 139,146 ****
                            disableSplash=self.disableSplash,
                            parameters=userParameters)
      
!     instance.addFormFromFile(formfile)
!       
      instance.activate()
  
  if __name__ == '__main__':
--- 140,146 ----
                            disableSplash=self.disableSplash,
                            parameters=userParameters)
      
!     instance.addFormFromFile(formfile)      
      instance.activate()
  
  if __name__ == '__main__':
Index: gnue/forms/src/GFInstance.py
diff -c gnue/forms/src/GFInstance.py:1.81 gnue/forms/src/GFInstance.py:1.82
*** gnue/forms/src/GFInstance.py:1.81   Thu Jan 30 21:29:22 2003
--- gnue/forms/src/GFInstance.py        Mon Feb 10 21:01:48 2003
***************
*** 163,185 ****
        self.manager.handleStartupError(_("Unable to open file\n\n     
%s")%mesg)
  
      #
!     # Add the main form into the dictionary
      #
!     self._formsDictionary['__main__'] = form
  
      #
!     # Extract the child <dialog>s from the main form tree
      #
!     self.reapSubforms(form)    
  
      #
      # Initialize all the forms
      #
      for dialog in self._formsDictionary.keys():
        object = self._formsDictionary[dialog]
        object.phaseInit()
  
!     self._form = form # TODO: temp hack to keep it working
      
    #
    # removes the subforms from the main tree before
--- 163,187 ----
        self.manager.handleStartupError(_("Unable to open file\n\n     
%s")%mesg)
  
      #
!     # Extract the child <dialog>s from the main form tree
      #
!     self.reapSubforms(form)
  
      #
!     # Add the main form into the dictionary
      #
!     self._formsDictionary['__main__'] = form
  
      #
      # Initialize all the forms
      #
      for dialog in self._formsDictionary.keys():
        object = self._formsDictionary[dialog]
+       print "GFInstance Initializing ", object
+       object.showTree()
        object.phaseInit()
  
!     #self._form = form # TODO: temp hack to keep it working
      
    #
    # removes the subforms from the main tree before
***************
*** 200,224 ****
    #
    def activate(self):
      #
!     # Construct the 
      self._uiinstance =  self._uimodule.GFUserInterface(self.eventController, 
self._disableSplash)
  
      #
      # Build the UIs for all the forms
      #
      for dialog in self._formsDictionary.keys():
        self.buildForm(dialog)
! 
! ##    for dialog in self._formsDictionary.keys():
! ##      print dialog
! ##      print self._uiinstance._uiDictionary[dialog]._formToUIWidget
! 
      #
      # Bring up the main form
      #
      self.activateForm('__main__')
-     # TODO : Hard coded test case for use w/ dialog.gfd
-     #self.activateForm('selector')
  
      self._uiinstance.mainLoop()
  
--- 202,222 ----
    #
    def activate(self):
      #
!     # Construct an instance of the UI driver 
      self._uiinstance =  self._uimodule.GFUserInterface(self.eventController, 
self._disableSplash)
+     self._uiinstance.initialize()
  
      #
      # Build the UIs for all the forms
      #
      for dialog in self._formsDictionary.keys():
+       print "Building form named ", dialog
        self.buildForm(dialog)
!     
      #
      # Bring up the main form
      #
      self.activateForm('__main__')
  
      self._uiinstance.mainLoop()
  
***************
*** 228,234 ****
    #
    def activateForm(self,formName='__main__'):
      self._form = self._formsDictionary[formName]
- ##    print "Current entry", self._form._currentEntry
  
      if not self._form._currentEntry:
        raise  _('There are no navigable widgets in this form.  Unable to 
display.')
--- 226,231 ----
***************
*** 249,254 ****
--- 246,252 ----
    #
    def buildForm(self,formName='__main__'):
      form = self._formsDictionary[formName]
+     print "I'm going to build form ", form
      
      try:
        self._uiinstance.buildForm(form, formName)
***************
*** 317,323 ****
      self.dispatchEvent('uiUPDATESTATUS',tip=tip, recordStatus=recordStatus,
                         insertMode=insertMode, currentRecord=currentRecord,
                         maxRecord=maxRecord, currentPage=currentPage,
!                        maxPage=maxPage)
  
    #
    #
--- 315,321 ----
      self.dispatchEvent('uiUPDATESTATUS',tip=tip, recordStatus=recordStatus,
                         insertMode=insertMode, currentRecord=currentRecord,
                         maxRecord=maxRecord, currentPage=currentPage,
!                        maxPage=maxPage, _form=self._form)
  
    #
    #
Index: gnue/forms/src/uidrivers/_base/UIdriver.py
diff -c gnue/forms/src/uidrivers/_base/UIdriver.py:1.85 
gnue/forms/src/uidrivers/_base/UIdriver.py:1.86
*** gnue/forms/src/uidrivers/_base/UIdriver.py:1.85     Wed Jan  1 19:45:48 2003
--- gnue/forms/src/uidrivers/_base/UIdriver.py  Mon Feb 10 21:01:49 2003
***************
*** 27,64 ****
  #
  # NOTES:
  #
! import sys
  
  from gnue.common import events
  from gnue.common.GObjects import *
  
  from gnue.forms.GFForm import *
  
- class UIForm:
-   def __init__(self):
-     self._form      = None                # The GObj based form tree
-     self._interface = None                # The widget tree constructed by 
buildUI 
-     self._formToUI = {}                   # the GFObj to UI widget cross ref
-     self._formToUIWidget = {}             # dictionary of driver specific 
UIfoo
-                                           # widgets with the GFObj used as 
the key
-     self._pageList = []                   # A list of page widgets created by 
the form
- 
  #
  # GFUserInterfaceBase
  #
  # Convience class to be inherited by other GFUserInterface's
  # Provides basic functionality.
  #
! class GFUserInterfaceBase(events.EventAware):
    def __init__(self, eventHandler):
      ############################################################
      #
      # Things you do not adjust in the individual UI drivers
      #
      ############################################################
!     events.EventAware.__init__(self, eventHandler)
      
!     # Configure event handling
      self.registerEventListeners( {
              'gotoENTRY'        : self.switchFocus,
              'updateENTRY'      : self.updateEntry,
--- 27,63 ----
  #
  # NOTES:
  #
! import sys, os, dircache
  
  from gnue.common import events
  from gnue.common.GObjects import *
+ from gnue.common.GRootObj import GRootObj
+ from gnue.common.FileUtils import dyn_import
  
  from gnue.forms.GFForm import *
  
  #
  # GFUserInterfaceBase
  #
  # Convience class to be inherited by other GFUserInterface's
  # Provides basic functionality.
  #
! class GFUserInterfaceBase(GRootObj,events.EventAware):
    def __init__(self, eventHandler):
+     
      ############################################################
      #
      # Things you do not adjust in the individual UI drivers
      #
      ############################################################
!     GRootObj.__init__(self, 'uiDriver', None, None)
!     self._type = 'UIDriver'
      
!     events.EventAware.__init__(self, eventHandler)
! 
!     #
!     # Incomming events
!     #
      self.registerEventListeners( {
              'gotoENTRY'        : self.switchFocus,
              'updateENTRY'      : self.updateEntry,
***************
*** 79,98 ****
              'getCLIPBOARD'     : self.getClipboardContents,
            })
  
!     # GFForm objects that can act as containers for other objects
!     self.containerWidgets= ['GFPage'] # , 'GFBox'] 
! 
! 
      # Mapping - internal record status : displayed on status bar
      self.statusValues = {'saved'     :'OK',   
                           'modified'  :'MOD',
                           'deleted'   :'DEL',
                           'query'     :'QRY',
                           }
      
      # Our local "clipboard"
      self.__clipboard = None
  
      ############################################################
      #
      # Things you may need to  adjust in the individual UI drivers
--- 78,135 ----
              'getCLIPBOARD'     : self.getClipboardContents,
            })
  
!     #
      # Mapping - internal record status : displayed on status bar
+     #
      self.statusValues = {'saved'     :'OK',   
                           'modified'  :'MOD',
                           'deleted'   :'DEL',
                           'query'     :'QRY',
                           }
      
+     #
+     # Multi-form support
+     #
+     self._formNameToUIForm = {}             # Holds links the to the top level
+                                             # UIForm objects held in memory
+     self._formNameToGFForm = {}             # Holds links the to the top level
+                                             # UIForm objects held in memory
+     self._gfObjToUIWidget = {}              # dictionary of driver specific 
UIfoo
+                                             # widgets with the GFObj used as 
the key
+ 
+     self._gfObjToToolkitWidgets = {}        # the GFObj to UI widget cross ref
+     
+ 
+     #
      # Our local "clipboard"
+     #
      self.__clipboard = None
  
+     #
+     # Import and register supported widgets in UI driver
+     #
+     self._supportedWidgets = {}
+     
+     basedir  = os.path.dirname(sys.modules[self.__module__].__file__)
+     uiDriver = os.path.basename(basedir)
+     basedir +='/widgets/'
+ 
+     for widgetName in dircache.listdir(basedir):
+       try:
+         if widgetName[0] != '_':
+           if os.path.isfile(basedir+widgetName) and 
os.path.splitext(widgetName)[1] == ".py":
+             widgetName = os.path.splitext(widgetName)[0]
+             print "FILE", widgetName
+             widget = dyn_import('gnue.forms.uidrivers.%s.widgets.%s' 
%(uiDriver,widgetName))  
+           elif os.path.isdir(basedir+widgetName):
+             print "DIR", widgetName
+             widget = dyn_import('gnue.forms.uidrivers.%s.widgets.%s' 
%(uiDriver,widgetName))
+           
+           self._supportedWidgets[widget.configuration['provides']]=widget
+       except ImportError, mesg:
+         GDebug.printMesg(2,"%s.widgets.%s doesn't appear to be a valid ui 
widget" % (uiDriver,widgetName))
+         GDebug.printMesg(5,' --> %s' % (mesg))
+ 
      ############################################################
      #
      # Things you may need to  adjust in the individual UI drivers
***************
*** 100,217 ****
      ############################################################
  
      #
-     # A mapping of GFForm string types to an individual driver's 
-     # UIWidgets derived classes.  This MUST be reset in each
-     # driver or hideous, vile things will invade your fridge
-     #
-     self._WIDGETS = { 'GFLabel'     : UIFailure,
-                       'GFBox'       : UIFailure,
-                       'GFPage'      : UIFailure,
-                       'GFForm'      : UIFailure,
-                       'GFEntry'     : UIFailure,
-                       'GFButton'    : UIFailure,
-                       'GFScrollBar' : UIFailure,
-                       }
-     #
      # Dialogs required by base
      #
-     # Same notes apply to this as to _WIDGETS above
      # TODO: Once <dialog> works we may be able to
      # do away with these
      # 
!     self._DIALOGS = {'about'       :UIFailure,
!                      'messageBox'  :UIFailure,
!                      }
! 
!     #
!     # Widgets that should be represented in the UI and 
!     # the constructor needed to build them.  The constructor
!     # can overriden in UI specific module if necessary.
!     #
!     self.widgetConstructorFunction = {
!       'GFBox'         : self._stdConstructor,
!       'GFButton'      : self._stdConstructor,
!       'GFEntry'       : self._stdConstructor,
!       'GFForm'        : self._stdConstructor,
!       'GFLabel'       : self._stdConstructor,
!       'GFScrollBar'   : self._stdConstructor,
!       'GFPage'        : self._stdConstructor,
!       }
  
  
!     #
!     # Multi-form support
!     #
!     self._uiDictionary = {}
! 
!     
!     self._formToUI = {}                   # the GFObj to UI widget cross ref
!     self._formToUIWidget = {}             # dictionary of driver specific 
UIfoo
!                                           # widgets with the GFObj used as 
the key
!     self._pageList = []                   # A list of page widgets created by 
the form
!     
!   #
!   # buildUI
!   #
!   # Creates the user interface from the form definition
!   # passed to the GFUserInterface instance.  Creates a
!   # form to UI cross reference used by the UI to match
!   # form objects to the UI counterparts
!   #
!   def _buildUI(self):
      try:
!       uiWidget = self.widgetConstructorFunction[self._currentObject[0]._type] 
()
!       uiWidget._form = self._form
!       widget = uiWidget.widgets
!       GDebug.printMesg(2, "Widget is %s" % widget)
! 
!       self._formToUIWidget[self._currentObject[0]]=uiWidget
! 
!       # If the widget list is not empty then do the following
!       # list would be empty on hidden fields
!       if not widget == []:
!         # Create a cross reference to the GFObject that created
!         # one or more UI widgets
          
!         self._formToUI[self._currentObject[0]] = widget
! 
!         # If the current object is a container then add the
!         # just created first created widget to it's widget list
!         if self._currentObject[0]._type in self.containerWidgets:
!           self.currentWidget.insert(0,widget[0])
  
!     except KeyError:
!       pass
! 
!     if self._currentObject[0]._children:
!      for child in self._currentObject[0]._children:
!         if isinstance(child, GObj):
!           self._currentObject.insert(0,child)
!           self._buildUI()
!           self._currentObject.pop(0)
! 
!     if self._currentObject[0]._type in self.containerWidgets:
!       self.currentWidget.pop(0)
! 
!   #
!   # _stdConstructor
!   #
!   # The default function that builds a specific widget
!   #
!   def _stdConstructor(self):
!     object = self._currentObject[0]
!     event = self._updateCreateEvent(events.Event('CreateUIWidget',None,
                     object=object,
!                    container=self.currentWidget[0],
                     textWidth=self.textWidth,
                     textHeight=self.textHeight,
                     widgetWidth=self.widgetWidth,
                     widgetHeight=self.widgetHeight,
                     interface=self,
                     initialize=1))
!     newWidget = self._WIDGETS[object._type](event)
!     return newWidget
  
  
  
    
#############################################################################
--- 137,208 ----
      ############################################################
  
      #
      # Dialogs required by base
      #
      # TODO: Once <dialog> works we may be able to
      # do away with these
      # 
!     self._DIALOGS = {}
  
  
!   def _buildUI(self,object, formName):
      try:
!       #
!       # Look up the parent GObj of the current obj
!       #
!       if object._type == "GFPage":
!         parent = object.findParentOfType(None)
!       else:
!         parent = object.getParent()
          
!       # fine the ui widget that corrosponds with that parent
!       uiParent = self
!       if parent:
!         try:
!           uiParent = self._gfObjToUIWidget[parent]
!         except KeyError:
!           pass
  
!       event = self._updateCreateEvent(events.Event('CreateUIWidget',None,
                     object=object,
!                    parent=uiParent,
!                    #container=self.currentWidget[0],
                     textWidth=self.textWidth,
                     textHeight=self.textHeight,
                     widgetWidth=self.widgetWidth,
                     widgetHeight=self.widgetHeight,
                     interface=self,
                     initialize=1))
!   
!       uiWidget = 
self._supportedWidgets[object._type].configuration['baseClass'](event)
!       uiWidget._form = self._form
  
+       #
+       # Add to the cross refernce
+       #
+       self._gfObjToUIWidget[object]=uiWidget
+ 
+       #
+       # If the current object is a GFForm then add it to the
+       # dictionary.
+       #
+       
+       if object._type == 'GFForm':
+         self._formNameToUIForm[formName] = uiWidget
+         self._formNameToGFForm[formName] = object
+ 
+       #
+       # GFObject to list of widget set specific widgets 
+       # associated with it
+       #
+       # Note: The list would be empty on hidden fields
+       if not uiWidget.widgets == []:
+         self._gfObjToToolkitWidgets[object] = uiWidget.widgets
+         
+       GDebug.printMesg(2, "Widget is %s" % uiWidget.widgets)
+ 
+     except KeyError:
+       pass
  
  
    
#############################################################################
***************
*** 229,263 ****
    # it handles the creatation of the user interface
    #
    def buildForm(self, form, formName):
!     currentForm = self._uiDictionary[formName] = UIForm()
!     
! #    self._formToUI = {}       
! #    self._formToUIWidget = {} 
!     self._pageList = []
      self._form = form
-     self._currentObject = [form]
      
      # Create the UI from the GFForm passed in
!     self._buildUI()
  
!     currentForm._formToUI = self._formToUI
!     currentForm._formToUIWidget = self._formToUIWidget
!     currentForm._pageList = self._pageList
!     currentForm._userInterface =  self._pageList[0]
!     currentForm._form = form
!     currentForm._currentWidget = self.currentWidget
  
!   def activateForm(self,formName):
  
-     form = self._uiDictionary[formName]
  
! #    self._formToUI =       form._formToUI
! #    self._formToUIWidget = form._formToUIWidget
!     self._pageList =       form._pageList
!     self.currentWidget =   form._currentWidget
!     self._form         =   form._form
!     
!     self._activateForm(form._form)
  
  
    
#############################################################################
--- 220,253 ----
    # it handles the creatation of the user interface
    #
    def buildForm(self, form, formName):
! 
      self._form = form
      
      # Create the UI from the GFForm passed in
!     print "I'm walking down ", form
!     form.walk(self._buildUI, formName=formName)
  
!     print self._gfObjToUIWidget.keys()
!     self._gfObjToUIWidget[form].phaseInit()
!     
!     #for key in self._gfObjToUIWidget.keys():
!     #  if key._type == 'GFForm' and key == form:
!     #    print "UIdriver initializing" ,self._gfObjToUIWidget[key]
!     #    self._gfObjToUIWidget[key].phaseInit()
  
!     self._formNameToUIForm[formName]._gfObjToToolkitWidgets = 
self._gfObjToToolkitWidgets
!     self._formNameToUIForm[formName]._gfObjToUIWidget = self._gfObjToUIWidget
!     self._formNameToUIForm[formName]._form = form
  
  
!   #
!   # activateForm
!   #
!   
!   def activateForm(self,formName):
! 
!     self._form = self._formNameToGFForm[formName]    
!     self._activateForm(self._form)
  
  
    
#############################################################################
***************
*** 277,283 ****
      object = event.object
      if object: # Some pages might not have any widgets that can be active
        index = object._visibleIndex
!       self._formToUIWidget[object].indexedFocus(index)
  
      self.dispatchEvent('beginEDITMODE', object, _form=object._form)
  
--- 267,273 ----
      object = event.object
      if object: # Some pages might not have any widgets that can be active
        index = object._visibleIndex
!       self._gfObjToUIWidget[object].indexedFocus(index)
  
      self.dispatchEvent('beginEDITMODE', object, _form=object._form)
  
***************
*** 301,311 ****
      for count in range(index):
        value = 
handler.getDisplayFiller(block._resultSet.getRecord(currentRecord- \
                                (index-count)).getField(field.field))
!       self._formToUIWidget[entry].setValue(value,count)
  
      # Fill current spot
      value = handler.getDisplayFiller(entry.getValue())
!     self._formToUIWidget[entry].setValue(value, index)
  
      # Fill trailing spots
      #
--- 291,301 ----
      for count in range(index):
        value = 
handler.getDisplayFiller(block._resultSet.getRecord(currentRecord- \
                                (index-count)).getField(field.field))
!       self._gfObjToUIWidget[entry].setValue(value,count)
  
      # Fill current spot
      value = handler.getDisplayFiller(entry.getValue())
!     self._gfObjToUIWidget[entry].setValue(value, index)
  
      # Fill trailing spots
      #
***************
*** 327,333 ****
          else:
            value = handler.getDisplayFiller(rec.getField(field.field))
  
!         self._formToUIWidget[entry].setValue(value, count, cr <= lastRow)
        count += 1
  
      handler.editing = prehandling
--- 317,323 ----
          else:
            value = handler.getDisplayFiller(rec.getField(field.field))
  
!         self._gfObjToUIWidget[entry].setValue(value, count, cr <= lastRow)
        count += 1
  
      handler.editing = prehandling
***************
*** 337,344 ****
    #
    def updateEntryEditor(self, event):
      index = event.object._visibleIndex
!     widget = self._formToUIWidget[event.object]
!     #print "lookups in",self._formToUIWidget
      widget.setValue(event.display, index)
      widget.setCursorPosition(event.cursor, index)
  
--- 327,333 ----
    #
    def updateEntryEditor(self, event):
      index = event.object._visibleIndex
!     widget = self._gfObjToUIWidget[event.object]
      widget.setValue(event.display, index)
      widget.setCursorPosition(event.cursor, index)
  
***************
*** 362,384 ****
      self.__clipboard = "%s" % event.text
  
    #
-   # updateStatusBar
-   #
-   # Calls the UIs function to update status
-   def updateStatusBar(self,event):
- 
-     #tip, recordStatus, insertMode, currentRecord, maxRecord, currentPage, 
maxPage =event.data
- 
-     status = None
-     if event.recordStatus != None:
-       status = self.statusValues[event.recordStatus]
- 
-     insertValue = None
-     if event.insertMode != None:
-       insertValue = event.insertMode and 'INS' or  'OVR'
-     self._setStatusBar(event.tip, status, insertValue, event.currentRecord, 
event.maxRecord, event.currentPage, event.maxPage)
- 
-   #
    # msgBox
    #
    def msgBox(self,event):
--- 351,356 ----
***************
*** 455,463 ****
    #
    # UIDrivers must implement the following features
  
-   #
-   # 
-   #
    def _activateForm(self):
      GDebug.printMesg(0, "Fatal UI driver error.  Required function not 
implemented")
      sys.exit(1)
--- 427,432 ----
***************
*** 466,509 ****
      GDebug.printMesg(0, "Fatal UI driver error.  Required function not 
implemented")
      sys.exit(1)
  
-   def gotoPage(self,event):
-     GDebug.printMesg(0, "Fatal UI driver error.  Required function not 
implemented")
-     sys.exit(1)
- 
  
- 
################################################################################
  #
! # Bogus class designed to force system failure if an individual ui driver
! # doesn't override GFUserInterfaceBase's _WIDGETS variable
  #
- 
################################################################################
- class UIFailure:
-   def __init__(self, event):
-     print "Fatal UI driver error.  _WIDGETS not properly setup in UI driver"
-     sys.exit(1)
-    
  
! # Creating base dictionary for language font encodings
! encodings = {
!              'iso8859-1':None,
!              'iso8859-2':None,
!              'iso8859-3':None,
!              'iso8859-4':None,
!              'iso8859-5':None,
!              'iso8859-6':None,
!              'iso8859-7':None,
!              'iso8859-8':None,
!              'iso8859-9':None,
!              'iso8859-10':None,
!              'iso8859-11':None,
!              'iso8859-12':None,
!              'iso8859-13':None,
!              'iso8859-14':None,
!              'iso8859-15':None,
!              'koi8':None,       # TODO: not sure about these
!            'koi8-r':None,
!              'cp1250':None,
!              'cp1251':None,
!              'cp1252':None
!             }
  
--- 435,467 ----
      GDebug.printMesg(0, "Fatal UI driver error.  Required function not 
implemented")
      sys.exit(1)
  
  
  #
! # newSkool
  #
  
!   #
!   # gotoPage
!   #
!   def gotoPage(self,event):
!     self._gfObjToUIWidget[event.data]._uiForm.gotoPage(event)
!     
! 
!   #
!   # updateStatusBar
!   #
!   # Calls the UIForm's _setStatusBar function to update status
!   #
!   def updateStatusBar(self,event):
!     status = None
!     if event.recordStatus != None:
!       status = self.statusValues[event.recordStatus]
! 
!     insertValue = None
!     if event.insertMode:
!       insertValue = event.insertMode and 'INS' or  'OVR'
!     # TODO:
!     self._gfObjToUIWidget[event._form]._uiForm._setStatusBar(event.tip, 
status, insertValue,
!                                                             
event.currentRecord, event.maxRecord,
!                                                             
event.currentPage, event.maxPage)
  
Index: gnue/forms/src/uidrivers/wx/UIdriver.py
diff -c gnue/forms/src/uidrivers/wx/UIdriver.py:1.229 
gnue/forms/src/uidrivers/wx/UIdriver.py:1.230
*** gnue/forms/src/uidrivers/wx/UIdriver.py:1.229       Mon Feb 10 05:15:58 2003
--- gnue/forms/src/uidrivers/wx/UIdriver.py     Mon Feb 10 21:01:49 2003
***************
*** 40,106 ****
  from gnue.forms import VERSION
  from gnue.forms.GFForm import *
  from gnue.forms.uidrivers._base.UIdriver import *
- from gnue.forms.uidrivers._base.UIWidget import *
  
  from gnue.forms.uidrivers.wx.GFwxApp import *
  from gnue.forms.uidrivers.wx.UIWXSplashScreen import *
! #from UIWidgets import *
  from common import *
  
  
  _PROMPTFORRECORD = None
! _charWidth = 0
! _charHeight = 0
! _IdToWxObj = {}
! _IdToGFObj = {}
! _IdToUIObj = {}
! 
! _disabledColour = wxLIGHT_GREY
! 
! 
! # Shortcut
! images_dir = GConfig.getInstalledBase('forms_images','common_images') + '/'
! 
! # Finishing creation of dictionary for language font encodings
! encodings = {
!       'iso8859-1': wxFONTENCODING_ISO8859_1,
!       'iso8859-2': wxFONTENCODING_ISO8859_2,
!       'iso8859-3': wxFONTENCODING_ISO8859_3,
!       'iso8859-4': wxFONTENCODING_ISO8859_4,
!       'iso8859-5': wxFONTENCODING_ISO8859_5,
!       'iso8859-6': wxFONTENCODING_ISO8859_6,
!       'iso8859-7': wxFONTENCODING_ISO8859_7,
!       'iso8859-8': wxFONTENCODING_ISO8859_8,
!       'iso8859-9': wxFONTENCODING_ISO8859_9,
!       'iso8859-10': wxFONTENCODING_ISO8859_10,
!       'iso8859-11': wxFONTENCODING_ISO8859_11,
!       'iso8859-12': wxFONTENCODING_ISO8859_12,
!       'iso8859-13': wxFONTENCODING_ISO8859_13,
!       'iso8859-14': wxFONTENCODING_ISO8859_14,
!       'iso8859-15': wxFONTENCODING_ISO8859_15,
!       'koi8': wxFONTENCODING_KOI8,
!       'koi8-r': wxFONTENCODING_KOI8,
!       'cp1250': wxFONTENCODING_CP1250,
!       'cp1251': wxFONTENCODING_CP1251,
!       'cp1252': wxFONTENCODING_CP1252
! }
! 
! # hack for wxPython 2.2 (2.3+ doesn't need this)
! def _eventObjTowxWindow(event):
!   eo = event.GetEventObject()
!   return wxPyTypeCast(eo, 'wxWindow')
! 
!       
! #
! # Little global helper routine to set font according to options
! #
! # TODO: Not completed
! #
! def initFont(widget, affectsLayout=1):
!   if int(gConfigForms('fixedWidthFont')):
!     widget.SetFont(wxFont(int(gConfigForms('pointSize')),wxMODERN,wxNORMAL,\
!       wxNORMAL,FALSE,'',encodings[gConfig('textEncoding')]))
! 
  #
  # GFUserInterface
  #
--- 40,63 ----
  from gnue.forms import VERSION
  from gnue.forms.GFForm import *
  from gnue.forms.uidrivers._base.UIdriver import *
  
  from gnue.forms.uidrivers.wx.GFwxApp import *
  from gnue.forms.uidrivers.wx.UIWXSplashScreen import *
! from gnue.forms.uidrivers.wx.widgets._base  import *
! from gnue.forms.uidrivers.wx.common import _eventObjTowxWindow
  from common import *
  
  
  _PROMPTFORRECORD = None
! def treeShow(object, uiDriver):
!   try: 
!     print "Object ",object, object.Show(1), object.GetParent(), 
uiDriver._IdToGFObj[object.GetId()]
!   except KeyError:
!     print "Object ",object, object.Show(1), object.GetParent(), 
"NONE!!!!!!!!!!!!!"
!     
!   for child in object.GetChildren():
!     treeShow(child, uiDriver)
!     
  #
  # GFUserInterface
  #
***************
*** 110,125 ****
  class GFUserInterface(GFUserInterfaceBase):
    def __init__(self, eventController, disableSplash = None):
      GFUserInterfaceBase.__init__(self,eventController)
      
      self._DIALOGS = {'about'       :UIAbout,
                       'messageBox'  :UIMessageBox,
                       }
  
!     # On only this driver these are defined outside the GFUserInterface
!     # class at the bottom of this file.  This is because GNUe Designer
!     # is written using wx and pulls these values from this driver
!     self._WIDGETS = WIDGETS
  
      ################################################################
      # WX Specifics
      ################################################################
--- 67,89 ----
  class GFUserInterface(GFUserInterfaceBase):
    def __init__(self, eventController, disableSplash = None):
      GFUserInterfaceBase.__init__(self,eventController)
+ 
+     self._disableSplash = disableSplash
      
      self._DIALOGS = {'about'       :UIAbout,
                       'messageBox'  :UIMessageBox,
                       }
+     # Shortcut
+     self.images_dir = 
GConfig.getInstalledBase('forms_images','common_images') + '/'
+ 
+     self._IdToWxObj = {}
+     self._IdToGFObj = {}
+     self._IdToUIObj = {}
  
!     self._disabledColour = wxLIGHT_GREY
  
+ 
+   def initialize(self):
      ################################################################
      # WX Specifics
      ################################################################
***************
*** 128,148 ****
      #
      # SplashScreen
      #
!     if not disableSplash:
        self.splash = UIWXSplashScreen()
  
-     self.wxSpecificInit(disableSplash)
- 
-   def wxSpecificInit(self, disableSplash):
      global _PROMPTFORRECORD
      _PROMPTFORRECORD = self.promptForRecordNumber
  
      #
!     # Create the main window
      #
!     self.mainWindow = wxFrame(NULL, -1, "", wxDefaultPosition)
!     initFont(self.mainWindow,1)
! 
      #
      # Find the max size of printable characters
      #  used to setup the grid
--- 92,109 ----
      #
      # SplashScreen
      #
!     if not self._disableSplash:
        self.splash = UIWXSplashScreen()
  
      global _PROMPTFORRECORD
      _PROMPTFORRECORD = self.promptForRecordNumber
  
      #
!     # Create a dummy window used to compute sizes 
      #
!     dummyWindow = wxFrame(NULL, -1, "", wxDefaultPosition)
!     initFont(dummyWindow,1)
!     
      #
      # Find the max size of printable characters
      #  used to setup the grid
***************
*** 150,330 ****
      maxWidth, maxHeight, maxDescent, maxLeading = [0,0,0,0]
      checkchars = string.printable
      for letter in checkchars:
!       width,height,descent,leading = self.mainWindow.GetFullTextExtent(letter)
        maxWidth = max(maxWidth,width)
        maxHeight = max(maxHeight,height)
        maxDescent = max(maxDescent,descent)
        maxLeading = max(maxLeading,leading)
  
!     global _charWidth, _charHeight
!     _charWidth        = int(maxWidth+maxLeading)  # Used by the mouse handler 
to compute char offset into widget
!     _charHeight       = int(maxHeight+maxDescent) #
!     self.textWidth    = _charWidth                # The pixel width of text 
inside a widget
!     self.textHeight   = _charHeight               # The pixel height of text 
inside a widget
!     self.widgetWidth  = _charWidth                # The pixel width of a 1 
char widget (for things like buttons)
!     self.widgetHeight = _charHeight + 3           # The pixel height of a 1 
char widget (for things like buttons)
! 
!     self.menu_sb_space=4 # the extra spaces needed by the menu, toolbar and 
statusbar
! 
!     self.statusBar = self.mainWindow.CreateStatusBar()
!     self.statusBar.SetFieldsCount(5)
!     self.statusBar.SetStatusWidths([-1,50,50,75,75])
!     initFont(self.statusBar,0)
! 
!     self._scrollWindow = self.mainWindow.panel = 
wxScrolledWindow(self.mainWindow,-1, 
wxDefaultPosition,self.mainWindow.GetClientSize())
  
-     setDisabledColour(self.mainWindow.GetBackgroundColour())
- 
-     self.currentWidget = [self._scrollWindow]
- 
-     EVT_CLOSE(self.mainWindow,self.closeTrap)
- 
-   def _activateForm(self, form):
      #
!     # Build Menu
      #
!     self.menu_sb_space = 0
!     if not form._features['GUI:MENUBAR:SUPPRESS']:
!       self.menu_sb_space += 2
! 
!       # This will be a dict of the form { 'requestROLLBACK': 1001 }
!       # where 1001 is the wxId associated with requestROLLBACK.
!       self.__eventMenuMapping = {}
! 
!       fileMenu = wxMenu()
!       self.__addMenuItem(fileMenu, _("&Save\tF6"),_('Save all changes to 
database.'),'requestCOMMIT', form=form)
!       self.__addMenuItem(fileMenu, _("&Clear Form\tF11"),_('Clear 
Form'),'requestROLLBACK', form=form)
!       fileMenu.AppendSeparator()
! 
!       self.__addMenuItem(fileMenu, _("&Print"),_('Perform print routine for 
this form.'),'requestPRINTOUT', form=form)
!       fileMenu.AppendSeparator()
! 
!       id = self.__addMenuItem(fileMenu, _("E&xit"),_('Leave the 
application.'), form=form)
!       EVT_MENU(self._wxapp, id,  self.menuExitEvent)
!       self.__eventMenuMapping['_exit_'] = id
! 
!       editMenu = wxMenu()
!       self.__addMenuItem(editMenu, _("C&ut"),_("Cut the selected 
text"),'requestCUT', form=form)
!       self.__addMenuItem(editMenu, _("&Copy"),_("Copy the selected text"), 
'requestCOPY', form=form)
!       self.__addMenuItem(editMenu, _("&Paste"),_("Paste 
text"),'requestPASTE', form=form)
! 
!       dataMenu = wxMenu()
!       self.__addMenuItem(dataMenu, _("&First Record\tCtrl+Up"),_('Navigate to 
first record in memory.'),'requestFIRSTRECORD', form=form)
!       self.__addMenuItem(dataMenu, _("&Previous Record\tUp"),_('Navigate to 
previous record in memory.'),'requestPREVRECORD', form=form)
!       self.__addMenuItem(dataMenu, _("&Next Record\tDown"),_('Navigate to 
next record in memory.'),'requestNEXTRECORD', form=form)
!       self.__addMenuItem(dataMenu, _("&Last Record\tCtrl+Down"),_('Navigate 
to last record in memory.'),'requestLASTRECORD', form=form)
!       id = self.__addMenuItem(dataMenu, _("&Jump to 
Record...\tF2"),_('Prompts for a record number to which the system should 
jump.'), form=form)
!       EVT_MENU(self._wxapp, id, _PROMPTFORRECORD)
!       self.__eventMenuMapping['_promptForRecord_'] = id
! 
!       self.__addMenuItem(dataMenu, _("N&ew Record\tF12"),_('Create a new 
record for data input.'),'requestNEWRECORD', form=form)
!       self.__addMenuItem(dataMenu, _("Mark Record for &Delete\tF5"),_('Mark 
record for removal at next commit.'),'requestMARKFORDELETE', form=form)
! 
!       dataMenu.AppendSeparator()
!       self.__addMenuItem(dataMenu, _("Next &Block\tPgDn"),_('Navigate to next 
data block.'),'requestNEXTBLOCK', form=form)
!       self.__addMenuItem(dataMenu, _("P&revious Block\tPgUp"),_('Navigate to 
previous data block.'),'requestPREVBLOCK', form=form)
! 
!       dataMenu.AppendSeparator()
!       self.__addMenuItem(dataMenu, _("&Enter Query\tF8"),_('Switch to input 
query mask mode.'),'requestENTERQUERY', form=form)
!       self.__addMenuItem(dataMenu, _("Execute &Query\tF9"), _('Execute query 
using current mask.'),'requestEXECQUERY', form=form)
! 
!       helpMenu = wxMenu()
!       self.__addMenuItem(helpMenu, _("&About..."), _('Display info about GNUe 
Forms.'),'requestABOUT', form=form)
! 
!       menuBar = wxMenuBar()
!       menuBar.Append( fileMenu, _("&File") )
!       menuBar.Append( editMenu, _("&Edit") )
!       menuBar.Append( dataMenu, _("&Data") )
!       menuBar.Append( helpMenu, _("&Help") )
  
-       self._menuBar = menuBar
-       self.mainWindow.SetMenuBar( self._menuBar );
  
-     #
-     # Build Toolbar
-     #
-     if not form._features['GUI:TOOLBAR:SUPPRESS']:
- 
-       self.menu_sb_space += 2
-       #
-       #  There has got to be better way to call events to ride off the 
EVT_MENU
-       #  Ok if i give buttons same id as menu's they share events
-       #  I dont know if this is horribly wrong or design
-       #
-       if sys.platform == 'win32':
-         mainToolBar = wxToolBar(self.mainWindow, -1)
-       else:
-         mainToolBar = wxToolBar(self.mainWindow,-1, 
style=wxTB_HORIZONTAL|wxTB_DOCKABLE)
- 
-       mainToolBar.SetToolBitmapSize(wxSize(24,24))
-       mainToolBar.AddSimpleTool(self.__eventMenuMapping['requestCOMMIT'], 
wxImage(images_dir+gConfigForms('tb_commit'), 
wxBITMAP_TYPE_PNG).ConvertToBitmap(), _("Save  Changes"), _('Save all changes 
to database.'))
-       mainToolBar.AddSimpleTool(self.__eventMenuMapping['requestNEWRECORD'], 
wxImage(images_dir+gConfigForms('tb_insert'), 
wxBITMAP_TYPE_PNG).ConvertToBitmap(), _("Insert Record"), _('Create a new 
record for data input.'))
-       
mainToolBar.AddSimpleTool(self.__eventMenuMapping['requestMARKFORDELETE'], 
wxImage(images_dir+gConfigForms('tb_delete'), 
wxBITMAP_TYPE_PNG).ConvertToBitmap(), _("Delete Record"), _('Mark record for 
removal at next commit.'))
-       mainToolBar.AddSeparator()
-       
mainToolBar.AddSimpleTool(self.__eventMenuMapping['requestFIRSTRECORD'], 
wxImage(images_dir+gConfigForms('tb_first'), 
wxBITMAP_TYPE_PNG).ConvertToBitmap(), _("First Record"),_('Navigate to first 
record in memory.'))
-       mainToolBar.AddSimpleTool(self.__eventMenuMapping['requestPREVRECORD'], 
wxImage(images_dir+gConfigForms('tb_previous'), 
wxBITMAP_TYPE_PNG).ConvertToBitmap(), _("Previous Record"),_('Navigate to 
previous record in memory.'))
-       mainToolBar.AddSimpleTool(self.__eventMenuMapping['requestNEXTRECORD'], 
wxImage(images_dir+gConfigForms('tb_next'), 
wxBITMAP_TYPE_PNG).ConvertToBitmap(), _("Next Record"),_('Navigate to next 
record in memory.'))
-       mainToolBar.AddSimpleTool(self.__eventMenuMapping['requestLASTRECORD'], 
wxImage(images_dir+gConfigForms('tb_last'), 
wxBITMAP_TYPE_PNG).ConvertToBitmap(), _("Last Record"),_('Navigate to last 
record in memory.'))
-       mainToolBar.AddSimpleTool(self.__eventMenuMapping['_promptForRecord_'], 
wxImage(images_dir+gConfigForms('tb_jump'), 
wxBITMAP_TYPE_PNG).ConvertToBitmap(), _("Jump to Record"),_('Navigate to user 
specified record in memory.'))
-       mainToolBar.AddSeparator()
-       mainToolBar.AddSimpleTool(self.__eventMenuMapping['requestENTERQUERY'], 
wxImage(images_dir+gConfigForms('tb_query_prep'), 
wxBITMAP_TYPE_PNG).ConvertToBitmap(), _("Prepare Query"), _('Switch to input 
query mask mode.'))
-       mainToolBar.AddSimpleTool(self.__eventMenuMapping['requestEXECQUERY'], 
wxImage(images_dir+gConfigForms('tb_query'), 
wxBITMAP_TYPE_PNG).ConvertToBitmap(), _("Execute Query"), _('Execute query 
using current mask.'))
-       mainToolBar.AddSeparator()
-       mainToolBar.AddSimpleTool(self.__eventMenuMapping['requestROLLBACK'], 
wxImage(images_dir+gConfigForms('tb_rollback'), 
wxBITMAP_TYPE_PNG).ConvertToBitmap(), _("Clear Form"), _('Clear Form'))
-       mainToolBar.AddSimpleTool(self.__eventMenuMapping['_exit_'], 
wxImage(images_dir+gConfigForms('tb_exit'), 
wxBITMAP_TYPE_PNG).ConvertToBitmap(), _("Exit Form"), _('Exit Form'))
- 
-       self._mainToolBar = mainToolBar
-       self.mainWindow.SetToolBar( mainToolBar );
-       self._mainToolBar.Realize()
- 
- 
-     #
-     # Size based upon the form definition
-     #
-     width = int(self._form._layout.Char__width)
-     height = int(self._form._layout.Char__height)
  
!     formSize = wxSize(width*self.widgetWidth,
!                       (height+self.menu_sb_space)*self.widgetHeight)
  
!     self.mainWindow.SetSize(formSize)
!     self.mainWindow.SetTitle(str(self._form.title))
  
!     if self._notebook: # Adjust sizes
!       self._notebook.SetClientSize(formSize)
! 
!       child = self._notebook.GetParent()
!       while child:
!         child.Fit()
!         child = child.GetParent()
! 
!     # This is the initial panel window setup during init
!     # not a wxPanel set per page right after this
!     tempx,tempy =  self.mainWindow.GetClientSizeTuple()
!     self._scrollWindow.SetScrollbars(1, 1, tempx, tempy)
! 
!     self.mainWindow.panel =  self._pageList[0]
!     self.mainWindow.panel.SetSize(self.mainWindow.GetClientSize())
!     self.mainWindow.panel.Raise()
! 
!     # Only one page at a time can be visible
!     self.visiblePage = self._pageList[0]
!     self.visiblePage.Show(TRUE)
!     #self.visiblePage.Raise()
!     #self._wxapp.SetTopWindow(self.mainWindow)
! 
!     # TODO: Scrollbar width adjustment?
!     tempx,tempy = self.mainWindow.GetSizeTuple()
!     mainWindowSize = wxSize(20+tempx, 20+tempy)
!     self.mainWindow.SetSize(mainWindowSize)
      
!     # Go ahead and display
!     self.mainWindow.CenterOnScreen()
!     self.mainWindow.Show(true)
      
!     # Ensure splashscreen is on top
!     #if hasattr(self,'splash') and self.splash:
!     #  self.splash.Raise()
  
    
#############################################################################
    #
--- 111,149 ----
      maxWidth, maxHeight, maxDescent, maxLeading = [0,0,0,0]
      checkchars = string.printable
      for letter in checkchars:
!       width,height,descent,leading = dummyWindow.GetFullTextExtent(letter)
        maxWidth = max(maxWidth,width)
        maxHeight = max(maxHeight,height)
        maxDescent = max(maxDescent,descent)
        maxLeading = max(maxLeading,leading)
  
!     self.textWidth    = int(maxWidth+maxLeading)  # The pixel width of text 
inside a widget
!     self.textHeight   = int(maxHeight+maxDescent) # The pixel height of text 
inside a widget
!     self.widgetWidth  = self.textWidth            # The pixel width of a 1 
char widget (for things like buttons)
!     self.widgetHeight = self.textHeight + 3       # The pixel height of a 1 
char widget (for things like buttons)
  
      #
!     # Close dummy window so app doesn't hang when all other windows closed
      #
!     dummyWindow.Close()
  
  
  
!   def _activateForm(self, form):
!     # Go ahead and display
  
!     # TODO : hack!!!!!!!!!!!!!!
!     for key in self._formNameToUIForm.keys():
!       if self._formNameToUIForm[key]._form == form:
!         break
  
!     self._formNameToUIForm[key].mainWindow.Raise()
!     self._formNameToUIForm[key].mainWindow.Show()
      
!     self._formNameToUIForm[key].show()
      
!     treeShow(self._formNameToUIForm[key].mainWindow, self)
! 
  
    
#############################################################################
    #
***************
*** 340,398 ****
    # Tells the application to close it's main window
    #
    def _exit(self):
!     self.mainWindow.Close(true)
! 
! 
!   #
!   # Internal helper function to add a menu item and an event
!   #
!   def __addMenuItem(self, menu, text, help, event=None, form=None):
!     id = wxNewId()
!     menu.Append(id, text, help)
!     if event:
!       EVT_MENU(self._wxapp, id,
!         lambda event, l=self, e=event, f=form: 
l.dispatchEvent(events.Event(e,_form=f)))
!       self.__eventMenuMapping[event] = id
!         
!     return id
! 
! 
!   #
!   # _setStatusBar
!   #
!   def _setStatusBar(self,tip, statusValue, insertValue, currentRecord, 
maxRecord, currentPage, maxPage):
!     if tip: self.statusBar.SetStatusText(str(tip),0)
! 
!     if statusValue:
!       self.statusBar.SetStatusText(statusValue,1)
! 
!     if insertValue:
!       self.statusBar.SetStatusText(insertValue,2)
! 
!     if currentRecord and  maxRecord:
!       self.statusBar.SetStatusText(string.strip("%s/%s" % 
(currentRecord,maxRecord)),3)
! 
!     if currentPage and  maxPage:
!       self.statusBar.SetStatusText(string.strip("%s/%s" % 
(currentPage,maxPage)),4)
! 
!     #
!     # Adjust the status fields to reflect width of text in them
!     #
!     # This is a hack
!     #
!     tipWidth = -1 # Fill whatever remains
!     statusWidth,unused = 
self.statusBar.GetTextExtent(self.statusBar.GetStatusText(1))
!     insertWidth,unused = 
self.statusBar.GetTextExtent(self.statusBar.GetStatusText(2))
!     recordWidth,unused = 
self.statusBar.GetTextExtent(self.statusBar.GetStatusText(3))
!     pageWidth,unused = 
self.statusBar.GetTextExtent(self.statusBar.GetStatusText(4))
! 
!     # Either double the width if it's set or default to 5
!     statusWidth = statusWidth and (statusWidth * 2) or 5
!     insertWidth = insertWidth and (insertWidth * 2) or 5
!     recordWidth = recordWidth and (recordWidth * 2) or 5
!     pageWidth   = pageWidth   and (pageWidth   * 2) or 5
! 
!     
self.statusBar.SetStatusWidths([tipWidth,statusWidth,insertWidth,recordWidth,pageWidth])
  
  
    # Can be used by UI drivers to add more attributes to the creation event.
--- 159,166 ----
    # Tells the application to close it's main window
    #
    def _exit(self):
!     #TODO
!     self._children[0].mainWindow.Close(true)
  
  
    # Can be used by UI drivers to add more attributes to the creation event.
***************
*** 419,444 ****
      self._wxapp.MainLoop() # simply call the wxApp's MainLoop method
  
    #
-   # gotoPage
-   #
-   # makes the requested page visible on the screen
-   #
-   def gotoPage(self, event):
-     if not self._notebook:
-       self.visiblePage.Show(FALSE)
-       self.visiblePage = self._formToUI[event.data][0]
-       # TODO: move the calculatoin out of here
-       
self.visiblePage.SetSize(wxSize(self._form._layout.Char__width*self.widgetWidth,
-                                       
(self._form._layout.Char__height+self.menu_sb_space)*self.widgetHeight))
-     else:
-       self.visiblePage = self._formToUI[event.data][0]
-       for count in range(self._notebook.GetPageCount()):
-         if self.visiblePage.GetId() == self._notebook.GetPage(count).GetId():
-           self._notebook.SetSelection(count)
-           break
-     self.visiblePage.Show(TRUE)
- 
-   #
    # formAlert
    #
    # Rings a bell and alters the statusbar to display
--- 187,192 ----
***************
*** 509,522 ****
    # Processes the events from the widget set
    #
  
-   #
-   # menuExitEvent
-   #
-   # Catches the Exit event from the menu and make sure it closes in such a 
way to
-   # trigger the closeTrap method
-   #
-   def menuExitEvent(self, event):
-     self.mainWindow.Close()
  
    #
    # promptForRecordNumber
--- 257,262 ----
***************
*** 527,536 ****
      dlg = wxTextEntryDialog(self.mainWindow, _('Enter record number to jump 
to'),
                                                          _('Which record?'))
  
-     form = 
_IdToGFObj[self.mainWindow.panel.GetId()].findParentOfType('GFForm')
-     
      if dlg.ShowModal() == wxID_OK:
!       action = self.dispatchEvent('requestRECORDNUMBER', dlg.GetValue(), 
_form=form)
      else:
        action = None
  
--- 267,274 ----
      dlg = wxTextEntryDialog(self.mainWindow, _('Enter record number to jump 
to'),
                                                          _('Which record?'))
  
      if dlg.ShowModal() == wxID_OK:
!       action = self.dispatchEvent('requestRECORDNUMBER', dlg.GetValue(), 
_form=self._form)
      else:
        action = None
  
***************
*** 545,929 ****
    # back an event closing the application
    #`
    def closeTrap(self,event):
-     form = 
_IdToGFObj[self.mainWindow.panel.GetId()].findParentOfType('GFForm')
-     
      if event.CanVeto():
!       self.dispatchEvent('requestEXIT',_form=form)
      else:
        object = _eventObjTowxWindow(event)
        object.Destroy()
        # wxExit() TODO: Try and work this into navigator or here if it still 
hangs
  
- #############################################################################
- #############################################################################
- #
- # UI Objects
- #
- # A set of standard UI objects that allow us to move more code into UIbase
- # These map generic functionality to the specific UI widget set in use by
- # this driver.
- #
- #############################################################################
- #############################################################################
- 
- #
- # UIHelper
- #
- # 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 wx driver
-   #
-   def _addToCrossRef(self, widget,gfobject, uiobject):
-     id = widget.GetId()
-     _IdToWxObj[id]=widget
-     _IdToGFObj[id]=gfobject
-     _IdToUIObj[id]=uiobject
-     widget.__origBackgroundColor = widget.GetBackgroundColour()
- 
-   def _deleteFromCrossRef(self, widget, object):
-     id = widget.GetId()
-     try:
-       del _IdToWxObj[id]
-       del _IdToGFObj[id]
-       del _IdToUIObj[id]
-     except:
-       pass
- 
-   #
-   # Override the base UIWidget functions
-   #
-   def showModal(self):
-     self.ShowModal()
- 
-   def destroy(self):
-     self.Destroy()
- 
-   def indexedFocus(self, index):
-     self.widgets[index].SetFocus()
- 
-   def setValue(self, value, index=0, enabled=1):
-     # These must be here or dropdown style controls
-     # will get events they shouldn't and break.
-     widget = self.widgets[index]
-     widget.SetEvtHandlerEnabled(FALSE)
- 
-     # Check if foreign key changed
-     object = _IdToGFObj[widget.GetId()]
-     try:
-       if object.style == "dropdown" and \
-           not object._field._allowedValues == widget._origAllowedValues:
-         try:
-           # Not in wx 2.2.x
-           widget.Freeze()
-         except AttributeError:
-           pass
-         widget._origAllowedValues = object._field._allowedValues
-         widget.Clear()
-         for value in object._field._allowedValuesDescr:
-           widget.Append(value)
-         try:
-           # Not in wx 2.2.x
-           widget.Thaw()
-         except AttributeError:
-           pass
-     except AttributeError:
-       pass
- 
-     widget.SetValue(value)
-     widget.Enable(enabled)
-     widget.SetEvtHandlerEnabled(TRUE)
-     if enabled:
-       widget.SetBackgroundColour(widget.__origBackgroundColor)
-     else:
-       widget.SetBackgroundColour(_disabledColour)
-     widget.Refresh()
- 
-   def setCursorPosition(self, position, index=0):
-     widget = self.widgets[index]
-     object = _IdToGFObj[widget.GetId()]
-     if object.style != 'dropdown':
-       try:
-         self.widgets[index].SetInsertionPoint(position)
-       except AttributeError:
-         pass  # For label-style entries
- 
-   def setSelectedArea(self, selection1, selection2, index=0):
-     try:
-       self.widgets[index].SetSelection(selection1, selection2)
-     except (AttributeError, TypeError):
-       pass  # For label-style & dropdown entries
- 
-   def createWidget(self, event, spacer):
-     newWidget = self._createWidget(event, spacer)
-     initFont(newWidget)
-     self._addToCrossRef(newWidget,event.object,self)
-     return newWidget
- 
-   def cleanup(self, object):
-     for widget in self.widgets[:]:
-       id = widget.GetId()
-       del _IdToWxObj[id]
-       del _IdToGFObj[id]
-       del _IdToUIObj[id]
-       self.widgets.pop(0)
-       self._deleteFromCrossRef(widget, object)
- 
- #
- # UILabel
- #
- # Widget set specific function that creates a single instance of a label
- #
- class UILabel(UIHelper):
-   alignmentStyle = { 'left'  : wxALIGN_LEFT|wxST_NO_AUTORESIZE,
-                      'center': wxALIGN_CENTRE|wxST_NO_AUTORESIZE,
-                      'right' : wxALIGN_RIGHT|wxST_NO_AUTORESIZE,
-                      }
- 
- 
-   def _createWidget(self, event, spacer):
-     object = event.object
-     style = self.alignmentStyle[object.alignment]
-     newWidget = wxStaticText(event.container, -1, str(object.text),
-                              wxPoint(object.Char__x*event.widgetWidth,
-                                      
(object.Char__y+spacer+(spacer*object._gap))*event.widgetHeight),
-                              wxSize(self.itemWidth,self.itemHeight), style)
-     return newWidget
- 
- #
- # UIBox
- #
- # Widget set specific function that creates a single instance of a border box
- #
- class UIBox(UIHelper):
-   def _createWidget(self, event, spacer):
- 
-     object = event.object
-     newWidget = wxStaticBox(event.container,-1,str(object.label),
-                        
wxPoint(object.Char__x*event.widgetWidth+(event.widgetWidth/2),
-                                
(object.Char__y+spacer+(spacer*object._gap))*event.widgetHeight+(event.widgetHeight/2)),
-                        wxSize((object.Char__width-1)*event.widgetWidth,
-                                (object.Char__height-1)*event.widgetHeight))
-     return newWidget
- 
- #
- # UIScrollBar
- #
- # Widget set specific function that creates a single instance of a scroll bar 
used
- # to navigate multiple records
- #
- class UIScrollBar(UIHelper):
-   def _createWidget(self, event, spacer):
-     object = event.object
-     newWidget =wxScrollBar(event.container,-1,
-                            
wxPoint(object.Char__x*event.widgetWidth,(object.Char__y+spacer)*event.widgetHeight),
-                            
wxSize(object.Char__width*event.widgetWidth,object.Char__height*event.widgetHeight),
-                            wxSB_VERTICAL)
-     return newWidget
- 
- #
- # UIButton
- #
- # Widget set specific function that creates a single instance of a button
- #
- class UIButton(UIHelper):
-   def _createWidget(self, event, spacer):
-     object = event.object
-     newWidget = wxButton(event.container,-1,str(object.label),
-                          
wxPoint(object.Char__x*event.widgetWidth,(object.Char__y+spacer)*event.widgetHeight),
-                          
wxSize(object.Char__width*event.widgetWidth,object.Char__height*event.widgetHeight)
-                          )
-     if event.initialize:
-       self._eventHandler = event.eventHandler
-       EVT_BUTTON(newWidget,newWidget.GetId(),self.buttonHandler)
-       _setDefaultEventHandlers(newWidget, event.eventHandler, 
event.initialize)
- 
-     return newWidget
- 
-   def buttonHandler(self,event):
-     if event.GetEventType() == wxEVT_COMMAND_BUTTON_CLICKED:
-       action = None
-       object = _eventObjTowxWindow(event)
- 
-       id = object.GetId()
-       gfObject     = _IdToGFObj[id]
-       action = events.Event('buttonActivated',gfObject)
-       self._eventHandler(action)
- 
- 
- #
- # 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
-     if event.interface._notebook:
-       newWidget = wxPanel(event.interface._notebook, 
-1,wxDefaultPosition,event.interface._notebook.GetClientSize())
-       event.interface._notebook.AddPage(newWidget,hasattr(object,'caption') 
and object.caption or object.name)
-       if sys.platform == 'win32':
-         newWidget.Show(0)
-       else:
-         newWidget.Show(1)
-     else:
-       newWidget = wxPanel(event.container, 
-1,wxDefaultPosition,event.container.GetSize())
-       newWidget.Show(0)
- 
-     _setDefaultEventHandlers(newWidget, event.eventHandler, event.initialize)
- 
-     event.interface._pageList.append(newWidget)
-     return newWidget
- 
- #
- # UIEntry
- #
- # Widget set specific function that creates a single instance of a data entry 
widget
- #
- class UIEntry(UIHelper):
-   def _createWidget(self, event, spacer):
-     object = event.object
- 
-     style = object.style
-     defaultPoint =  wxPoint(object.Char__x*event.widgetWidth,
-                             
(object.Char__y+spacer+(object._gap*spacer))*event.widgetHeight)
-     defaultSize  = wxSize(self.itemWidth,self.itemHeight+1)
- 
-     if style == 'dropdown':
-       if event.initialize:
-         choices = object._field.allowedValues()[1]
-       else:
-         choices = [""]
- 
-       newWidget = wxComboBox(event.container, -1, "",defaultPoint,
-                               wxSize(self.itemWidth,self.itemHeight),
-                              choices, wxCB_DROPDOWN,) # |wxWANTS_CHARS,)
-       if event.initialize:
-         newWidget._origAllowedValues = object._field._allowedValues
-         newWidget.SetValue("")
-         EVT_COMBOBOX(newWidget, newWidget.GetId(), self.comboHandler)
- 
- 
-     elif style == 'label':
-       newWidget = wxStaticText(event.container, -1, 
"",defaultPoint,defaultSize,
-                                wxST_NO_AUTORESIZE)
-       # To make the label consistent with the other entry styles...
-       newWidget.SetValue = newWidget.SetLabel
-       newWidget.GetValue = newWidget.GetLabel
- 
-     elif style == 'checkbox':
-       newWidget = wxCheckBox(event.container, -1, "",defaultPoint,
-                              wxSize(2*event.textWidth,event.textHeight),
-                              wxNO_BORDER)
-       if event.initialize:
-         newWidget.SetValue(0)
-         EVT_CHECKBOX(newWidget, newWidget.GetId(), self.checkboxHandler)
- 
-     else: # Normal text box
-       if event.initialize:
-         styles = wxTE_PROCESS_TAB
-         if hasattr(object,'Char__height') and object.Char__height > 1:
-           styles = styles|wxTE_MULTILINE
-         value = ""  ## object.getValue()
-       else:
-         styles = 0
-         value = ""
- 
-       newWidget = wxTextCtrl(event.container, -1, value, defaultPoint, 
defaultSize, styles)
-     self._eventHandler = event.eventHandler
-     _setDefaultEventHandlers(newWidget, event.eventHandler, event.initialize)
-     return newWidget
- 
-   def comboHandler(self, event):
-     action = None
-     if event.GetEventType() == wxEVT_COMMAND_COMBOBOX_SELECTED:
-       object = _eventObjTowxWindow(event)
-       id = object.GetId()
- 
-       selection = event.GetSelection()
- 
-       gfObject     = _IdToGFObj[id]
-       eventdata = [gfObject, event.GetString()]
-       action = events.Event('requestREPLACEVALUE',object=gfObject,
-                               index=selection, text=event.GetString(),
-                             _form=gfObject._form)
-     self._eventHandler(action)
- 
-   def checkboxHandler(self,event):
-     if event.GetEventType() == wxEVT_COMMAND_CHECKBOX_CLICKED:
-       object = _eventObjTowxWindow(event)
-       id = object.GetId()
-       
-       gfObject     = _IdToGFObj[id]
-       eventdata = [gfObject, event.GetString()]
-       action = events.Event('requestTOGGLECHKBOX', _form=gfObject._form)
-       self._eventHandler(action)
- 
- #
- # UIForm
- #
- # Widget set specific function that creates a single instance of a Form widget
- #
- class UIForm(UIHelper):
-   tabStyles = {'left':wxNB_LEFT,
-                'right':wxNB_RIGHT,
-                'bottom':wxNB_BOTTOM,
-                'top':0,
-                }
- 
-   def _createWidget(self, event, spacer):
-     object = event.object
-     self.__ui = event.ui
-     self.__ui.__notebookLoopTrap = 0
- 
-     if object._layout.tabbed:
-       tabstyle =self.tabStyles[object._layout.tabbed]
-       newWidget = wxNotebook(event.container,-1,wxPoint(10,10),
-                              
size=event.interface.mainWindow.panel.GetClientSize(),
-                              style=tabstyle)
-       newWidget.Show(TRUE)
- 
-       # Note: EVT_NOTEBOOK_PAGE_CHANGING does't return the selected page on 
win32
-       EVT_NOTEBOOK_PAGE_CHANGED(newWidget, newWidget.GetId(), 
self.notebookTabHandler)
- 
-       event.interface._notebook  = newWidget
-     else:
-       newWidget = wxPanel(event.interface.mainWindow.panel,-1, 
wxDefaultPosition)
-       event.interface._notebook = None
- 
-     if event.initialize:
-       EVT_CLOSE(event.interface.mainWindow,event.interface.closeTrap)
- 
-     self._eventHandler = event.eventHandler
-     return newWidget
- 
-   def notebookTabHandler(self,event):
-     if event.GetEventType() == wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED:
-       object = _IdToGFObj[_eventObjTowxWindow(event).GetId()]
-       
-       action = None
- 
-       if sys.platform == 'win32':
-         if self.__ui.__notebookLoopTrap == 1:
-           action = events.Event('requestPAGE',event.GetSelection(), 
_form=object)
-           self.__ui.__notebookLoopTrap = 0
-         else:
-           self.__ui.__notebookLoopTrap = 1
-       else:
-         if self.__ui.__notebookLoopTrap == 0:
-           action = events.Event('requestPAGE',event.GetSelection(), 
_form=object)
-         if WXVERSION < '2.3':
-             self.__ui.__notebookLoopTrap = 1
-         else:
-           self.__ui.__notebookLoopTrap = 0
- 
-     if action:
-       self._eventHandler(action)
-     event.Skip()
  #####################################################################
  ##
  ## Required Dialog box support
--- 283,295 ----
    # back an event closing the application
    #`
    def closeTrap(self,event):
      if event.CanVeto():
!       self.dispatchEvent('requestEXIT',_form=self._form)
      else:
        object = _eventObjTowxWindow(event)
        object.Destroy()
        # wxExit() TODO: Try and work this into navigator or here if it still 
hangs
  
  #####################################################################
  ##
  ## Required Dialog box support
***************
*** 957,1150 ****
    def __init__(self, interface, message, caption):
      message = lineWrap(message,60)
      wxMessageDialog.__init__(self, interface, message, caption, 
style=wxOK|wxICON_EXCLAMATION)
- 
- #####################################################################
- ##
- ## Keymapper Support
- ##
- #####################################################################
- from gnue.forms import GFKeyMapper
- from gnue.forms.GFKeyMapper import vk
- 
- # Translate from wx keystrokes to our virtual keystrokes
- wxKeyTranslations = {
-    vk.F1     : WXK_F1,        vk.F2        : WXK_F2,
-    vk.F3     : WXK_F3,        vk.F4        : WXK_F4,
-    vk.F5     : WXK_F5,        vk.F6        : WXK_F6,
-    vk.F7     : WXK_F7,        vk.F8        : WXK_F8,
-    vk.F9     : WXK_F9,        vk.F10       : WXK_F10,
-    vk.F11    : WXK_F11,       vk.F12       : WXK_F12,
-    vk.INSERT : WXK_INSERT,    vk.DELETE    : WXK_DELETE,
-    vk.HOME   : WXK_HOME,      vk.END       : WXK_END,
-    vk.PAGEUP : WXK_PRIOR,     vk.PAGEDOWN  : WXK_NEXT,
-    vk.UP     : WXK_UP,        vk.DOWN      : WXK_DOWN,
-    vk.LEFT   : WXK_LEFT,      vk.RIGHT     : WXK_RIGHT,
-    vk.TAB    : WXK_TAB,
-    vk.ENTER  : WXK_RETURN,    vk.BACKSPACE : WXK_BACK }
- 
- GFKeyMapper.KeyMapper.setUIKeyMap(wxKeyTranslations)
- 
- #####################################################################
- ##
- ## Basic Event Processing
- ##
- #####################################################################
- 
- def _setDefaultEventHandlers(newWidget, eventHandler, initialize):
-   if initialize:
-     # TODO: this should use one instance
-     newWidget.PushEventHandler(mouseEvtHandler(eventHandler))
-     newWidget.PushEventHandler(keyboardEvtHandler(eventHandler))
- 
- class uiBaseEvtHandler(wxEvtHandler):
-   def __init__(self,eventList,eventProcessor):
-     wxEvtHandler.__init__(self)
-     self._eventProcessor = eventProcessor
-     for eventType in eventList:
-       self.Connect(-1, -1, eventType,self._processEvent)
- 
-   def _processEvent(self,event):
-     GDebug.printMesg(0,"uiBaseEvtHandler _processEvent was called?!?")
- 
- #
- # mouseEvtHandler
- #
- # Traps most mouse events and translates them into
- # GNUe events passed back to the form
- #
- class mouseEvtHandler(uiBaseEvtHandler):
-   def __init__(self,eventProcessor):
-     eventList = [wxEVT_LEFT_DOWN]
-     uiBaseEvtHandler.__init__(self, eventList, eventProcessor)
- 
-   #
-   # The putzing about with the event timestamp is to
-   # allow us to process mouse click events twice. 
-   # The mouse handler is called before the cursor 
-   # position is updated so GetInsertionPoint returns 
-   # the position from the widget losing focus.
-   # setting the timestamp to zero is a flag to prevent
-   # infinate loops and allow us to avoid process that does 
-   # not need done twice.
- 
-   def _processEvent(self,event):
-     global _charWidth,_charHeight
-     object = _eventObjTowxWindow(event)
- 
-     id = object.GetId()
-     gfObject     = _IdToGFObj[id]
-     screenWidget = _IdToWxObj[id]
-     count        = _IdToUIObj[id].widgets.index(screenWidget)
- 
-     if event.GetTimestamp():
-       self._eventProcessor('requestFOCUS',gfObject,_form=_IdToUIObj[id]._form)
-       self._eventProcessor('requestJUMPRECORD',count - 
gfObject._visibleIndex,_form=_IdToUIObj[id]._form)
- 
-       if isinstance(screenWidget,wxTextCtrl):
-         event.SetTimestamp(0)
-         self.AddPendingEvent(event)
- 
-     else:
-       textObject= wxPyTypeCast(object, 'wxTextCtrl')
-       cursorPosition = textObject.GetInsertionPoint()
-       
self._eventProcessor('requestCURSORMOVE',position=cursorPosition,_form=_IdToUIObj[id]._form)
- 
-     event.Skip()
- 
- 
- #
- # keyboardEvtHandler
- #
- # Traps most keypress events and translates them into
- # GNUe events passed back to the form
- #
- # Note: wxEVT_KEY_DOWN event seems to only return uppercase chars so
- #       i don't trap it.
- #
- 
- class keyboardEvtHandler(uiBaseEvtHandler):
-   def __init__(self, eventProcessor):
-     eventList = [wxEVT_CHAR]
-     uiBaseEvtHandler.__init__(self, eventList, eventProcessor)
- 
-   def _processEvent(self,event):
-     action = None
-     # hack for swig shortcomming needed by wxPython 2.2.x (2.3 does not need 
this)
-     # compute the location of the character in the widget
-     object = _IdToGFObj[_eventObjTowxWindow(event).GetId()]
- 
-     keycode = event.KeyCode()
- 
-     #
-     # Sigh... a hack for using <enter> in multiline entries
-     #
-     if  keycode == 13 and \
-         not event.ShiftDown() and \
-         not event.ControlDown() and \
-         not event.AltDown() and \
-         int (gConfigForms('enterIsNewLine')) and \
-         (hasattr(object,'Char__height') and object.Char__height) > 1:
- 
-       command = 'NEWLINE'
- 
-     else:
- 
- 
-       #
-       # Get the event to process from the KeyMapper
-       #
-       command = GFKeyMapper.KeyMapper.getEvent(
-         keycode,
-         event.ShiftDown(),
-         event.ControlDown(),
-         event.AltDown())
- 
-     if command == 'JUMPRECORD':
-       global _PROMPTFORRECORD
-       action = _PROMPTFORRECORD()
- 
-     elif command == 'NEWLINE':
-       action = events.Event('requestKEYPRESS', '\n',
-                      text='\n',
-                      code=10)
- 
-     elif command:
-       action = events.Event('request%s' % command)
- 
-     elif object._type == 'GFButton':
-       action = events.Event('buttonActivated',object)
- 
-     elif object.style == 'checkbox' and object._type == 'GFEntry':
-       # <space> <=> <click>
-       if keycode == 32:
-           action = events.Event('requestTOGGLECHKBOX')
-       else:
-           # maybe some background error message here
-           pass
-     else:
-       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 
- 
-     if action:
-       # Add the object's _form to the outgoing event
-       # rather than every event in the function
-       action.__dict__.update({'_form':object._form})
-       self._eventProcessor(action)
- 
- 
- # Needed by Designer (AND FORMS! :)
- WIDGETS = {'GFLabel'     : UILabel,
-            'GFBox'       : UIBox,
-            'GFPage'      : UIPage,
-            'GFForm'      : UIForm,
-            'GFEntry'     : UIEntry,
-            'GFButton'    : UIButton,
-            'GFScrollBar' : UIScrollBar,
-                     }
--- 323,325 ----
Index: gnue/forms/src/uidrivers/wx/common.py
diff -c gnue/forms/src/uidrivers/wx/common.py:1.1 
gnue/forms/src/uidrivers/wx/common.py:1.2
*** gnue/forms/src/uidrivers/wx/common.py:1.1   Sat Dec 21 14:36:58 2002
--- gnue/forms/src/uidrivers/wx/common.py       Mon Feb 10 21:01:49 2003
***************
*** 1,7 ****
  from wxPython.wx import *
  
! _charWidth = 0
! _charHeight = 0
  
  disabledColour = 0 # wxLIGHT_GREY
  
--- 1,30 ----
+ import string
  from wxPython.wx import *
+ from gnue.common import events
  
! # Finishing creation of dictionary for language font encodings
! encodings = {
!     'iso8859-1': wxFONTENCODING_ISO8859_1,
!     'iso8859-2': wxFONTENCODING_ISO8859_2,
!     'iso8859-3': wxFONTENCODING_ISO8859_3,
!     'iso8859-4': wxFONTENCODING_ISO8859_4,
!     'iso8859-5': wxFONTENCODING_ISO8859_5,
!     'iso8859-6': wxFONTENCODING_ISO8859_6,
!     'iso8859-7': wxFONTENCODING_ISO8859_7,
!     'iso8859-8': wxFONTENCODING_ISO8859_8,
!     'iso8859-9': wxFONTENCODING_ISO8859_9,
!     'iso8859-10': wxFONTENCODING_ISO8859_10,
!     'iso8859-11': wxFONTENCODING_ISO8859_11,
!     'iso8859-12': wxFONTENCODING_ISO8859_12,
!     'iso8859-13': wxFONTENCODING_ISO8859_13,
!     'iso8859-14': wxFONTENCODING_ISO8859_14,
!     'iso8859-15': wxFONTENCODING_ISO8859_15,
!     'koi8': wxFONTENCODING_KOI8,
!     'koi8-r': wxFONTENCODING_KOI8,
!     'cp1250': wxFONTENCODING_CP1250,
!     'cp1251': wxFONTENCODING_CP1251,
!     'cp1252': wxFONTENCODING_CP1252
!     }
  
  disabledColour = 0 # wxLIGHT_GREY
  
***************
*** 12,14 ****
--- 35,239 ----
  def getDisabledColour():
      global disabledColour
      return disabledColour
+ 
+ 
+ # hack for wxPython 2.2 (2.3+ doesn't need this)
+ def _eventObjTowxWindow(event):
+     eo = event.GetEventObject()
+     return wxPyTypeCast(eo, 'wxWindow')
+     
+ 
+ #
+ # Little global helper routine to set font according to options
+ #
+ # TODO: Not completed
+ #
+ def initFont(widget, affectsLayout=1):
+     if int(gConfigForms('fixedWidthFont')):
+         
widget.SetFont(wxFont(int(gConfigForms('pointSize')),wxMODERN,wxNORMAL,\
+                               
wxNORMAL,FALSE,'',encodings[gConfig('textEncoding')]))
+             
+ 
+ #####################################################################
+ ##
+ ## Basic Event Processing
+ ##
+ #####################################################################
+ 
+ def _setDefaultEventHandlers(newWidget, eventHandler, initialize, uiDriver):
+     if initialize:
+         # TODO: this should use one instance
+         newWidget.PushEventHandler(mouseEvtHandler(eventHandler,uiDriver))
+         newWidget.PushEventHandler(keyboardEvtHandler(eventHandler,uiDriver))
+         
+ class uiBaseEvtHandler(wxEvtHandler):
+     def __init__(self,eventList,eventProcessor, uiDriver):
+         wxEvtHandler.__init__(self)
+         self._eventProcessor = eventProcessor
+         self._uiDriver = uiDriver
+         for eventType in eventList:
+             self.Connect(-1, -1, eventType,self._processEvent)
+         
+ 
+     def _processEvent(self,event):
+         GDebug.printMesg(0,"uiBaseEvtHandler _processEvent was called?!?")
+       
+ #
+ # mouseEvtHandler
+ #
+ # Traps most mouse events and translates them into
+ # GNUe events passed back to the form
+ #
+ class mouseEvtHandler(uiBaseEvtHandler):
+   def __init__(self,eventProcessor, uiDriver):
+     eventList = [wxEVT_LEFT_DOWN]
+     uiBaseEvtHandler.__init__(self, eventList, eventProcessor, uiDriver)
+ 
+   #
+   # The putzing about with the event timestamp is to
+   # allow us to process mouse click events twice. 
+   # The mouse handler is called before the cursor 
+   # position is updated so GetInsertionPoint returns 
+   # the position from the widget losing focus.
+   # setting the timestamp to zero is a flag to prevent
+   # infinate loops and allow us to avoid process that does 
+   # not need done twice.
+ 
+   def _processEvent(self,event):
+     object = _eventObjTowxWindow(event)
+ 
+     id = object.GetId()
+     gfObject     = self._uiDriver._IdToGFObj[id]
+     screenWidget = self._uiDriver._IdToWxObj[id]
+     count        = self._uiDriver._IdToUIObj[id].widgets.index(screenWidget)
+ 
+     if event.GetTimestamp():
+       self._eventProcessor('requestFOCUS',gfObject,_form=gfObject._form)
+       self._eventProcessor('requestJUMPRECORD',count - 
gfObject._visibleIndex,_form=gfObject._form)
+ 
+       if isinstance(screenWidget,wxTextCtrl):
+         event.SetTimestamp(0)
+         self.AddPendingEvent(event)
+ 
+     else:
+       textObject= wxPyTypeCast(object, 'wxTextCtrl')
+       cursorPosition = textObject.GetInsertionPoint()
+       
self._eventProcessor('requestCURSORMOVE',position=cursorPosition,_form=gfObject._form)
+ 
+     event.Skip()
+ 
+ 
+ #
+ # keyboardEvtHandler
+ #
+ # Traps most keypress events and translates them into
+ # GNUe events passed back to the form
+ #
+ # Note: wxEVT_KEY_DOWN event seems to only return uppercase chars so
+ #       i don't trap it.
+ #
+ 
+ class keyboardEvtHandler(uiBaseEvtHandler):
+   def __init__(self, eventProcessor, uiDriver):
+     eventList = [wxEVT_CHAR]
+     uiBaseEvtHandler.__init__(self, eventList, eventProcessor, uiDriver)
+ 
+   def _processEvent(self,event):
+     action = None
+     # hack for swig shortcomming needed by wxPython 2.2.x (2.3 does not need 
this)
+     # compute the location of the character in the widget
+     object = self._uiDriver._IdToGFObj[_eventObjTowxWindow(event).GetId()]
+ 
+     keycode = event.KeyCode()
+ 
+     #
+     # Sigh... a hack for using <enter> in multiline entries
+     #
+     if  keycode == 13 and \
+         not event.ShiftDown() and \
+         not event.ControlDown() and \
+         not event.AltDown() and \
+         int (gConfigForms('enterIsNewLine')) and \
+         (hasattr(object,'Char__height') and object.Char__height) > 1:
+ 
+       command = 'NEWLINE'
+ 
+     else:
+ 
+ 
+       #
+       # Get the event to process from the KeyMapper
+       #
+       command = GFKeyMapper.KeyMapper.getEvent(
+         keycode,
+         event.ShiftDown(),
+         event.ControlDown(),
+         event.AltDown())
+ 
+     if command == 'JUMPRECORD':
+       global _PROMPTFORRECORD
+       action = _PROMPTFORRECORD()
+ 
+     elif command == 'NEWLINE':
+       action = events.Event('requestKEYPRESS', '\n',
+                      text='\n',
+                      code=10)
+ 
+     elif command:
+       action = events.Event('request%s' % command)
+ 
+     elif object._type == 'GFButton':
+       action = events.Event('buttonActivated',object)
+ 
+     elif object.style == 'checkbox' and object._type == 'GFEntry':
+       # <space> <=> <click>
+       if keycode == 32:
+           action = events.Event('requestTOGGLECHKBOX')
+       else:
+           # maybe some background error message here
+           pass
+     else:
+       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 
+ 
+     if action:
+       # Add the object's _form to the outgoing event
+       # rather than every event in the function
+       action.__dict__.update({'_form':object._form})
+       self._eventProcessor(action)
+ 
+                                                               
+ #####################################################################
+ ##
+ ## Keymapper Support
+ ##
+ #####################################################################
+ from gnue.forms import GFKeyMapper
+ from gnue.forms.GFKeyMapper import vk
+ 
+ # Translate from wx keystrokes to our virtual keystrokes
+ wxKeyTranslations = {
+     vk.F1     : WXK_F1,        vk.F2        : WXK_F2,
+     vk.F3     : WXK_F3,        vk.F4        : WXK_F4,
+     vk.F5     : WXK_F5,        vk.F6        : WXK_F6,
+     vk.F7     : WXK_F7,        vk.F8        : WXK_F8,
+     vk.F9     : WXK_F9,        vk.F10       : WXK_F10,
+     vk.F11    : WXK_F11,       vk.F12       : WXK_F12,
+     vk.INSERT : WXK_INSERT,    vk.DELETE    : WXK_DELETE,
+     vk.HOME   : WXK_HOME,      vk.END       : WXK_END,
+     vk.PAGEUP : WXK_PRIOR,     vk.PAGEDOWN  : WXK_NEXT,
+     vk.UP     : WXK_UP,        vk.DOWN      : WXK_DOWN,
+     vk.LEFT   : WXK_LEFT,      vk.RIGHT     : WXK_RIGHT,
+     vk.TAB    : WXK_TAB,
+     vk.ENTER  : WXK_RETURN,    vk.BACKSPACE : WXK_BACK }
+ 
+ GFKeyMapper.KeyMapper.setUIKeyMap(wxKeyTranslations)
+ 
+       




reply via email to

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