commit-gnue
[Top][All Lists]
Advanced

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

gnue/forms/src GFDisplayHandler.py GFEvent.py G...


From: Jason Cater
Subject: gnue/forms/src GFDisplayHandler.py GFEvent.py G...
Date: Sun, 17 Feb 2002 01:25:33 -0500

CVSROOT:        /home/cvs
Module name:    gnue
Changes by:     Jason Cater <address@hidden>    02/02/17 01:25:32

Modified files:
        forms/src      : GFDisplayHandler.py GFEvent.py GFForm.py 
                         GFInstance.py GFKeyMapper.py UIbase.py 
                         UIwxpython.py 
        forms/src/GFObjects: GFBlock.py GFEntry.py 

Log message:
        new input/display methods

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/forms/src/GFDisplayHandler.py.diff?cvsroot=OldCVS&tr1=1.5&tr2=1.6&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/forms/src/GFEvent.py.diff?cvsroot=OldCVS&tr1=1.19&tr2=1.20&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/forms/src/GFForm.py.diff?cvsroot=OldCVS&tr1=1.149&tr2=1.150&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/forms/src/GFInstance.py.diff?cvsroot=OldCVS&tr1=1.29&tr2=1.30&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/forms/src/GFKeyMapper.py.diff?cvsroot=OldCVS&tr1=1.4&tr2=1.5&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/forms/src/UIbase.py.diff?cvsroot=OldCVS&tr1=1.55&tr2=1.56&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/forms/src/UIwxpython.py.diff?cvsroot=OldCVS&tr1=1.141&tr2=1.142&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/forms/src/GFObjects/GFBlock.py.diff?cvsroot=OldCVS&tr1=1.37&tr2=1.38&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/forms/src/GFObjects/GFEntry.py.diff?cvsroot=OldCVS&tr1=1.43&tr2=1.44&r1=text&r2=text

Patches:
Index: gnue/forms/src/GFDisplayHandler.py
diff -c gnue/forms/src/GFDisplayHandler.py:1.5 
gnue/forms/src/GFDisplayHandler.py:1.6
*** gnue/forms/src/GFDisplayHandler.py:1.5      Sat Feb 16 09:55:52 2002
--- gnue/forms/src/GFDisplayHandler.py  Sun Feb 17 01:25:32 2002
***************
*** 23,29 ****
  #
  # DESCRIPTION:
  #
- #
  # NOTES:
  #
  
--- 23,28 ----
***************
*** 31,36 ****
--- 30,36 ----
  
  from gnue.common.FormatMasks import DateMask, TextMask, NumberMask
  from gnue.common import GDebug, GConfig
+ from GFEvent import *
  
  
  #############################################################################
***************
*** 41,47 ****
  # You should be using one of the
  # other types based on this one.
  #
! class FieldDisplayHandler:
  
  
    #####################
--- 41,47 ----
  # You should be using one of the
  # other types based on this one.
  #
! class FieldDisplayHandler(GFEventAware):
  
  
    #####################
***************
*** 50,68 ****
    #
  
    def setValue(self, value):
      self.value = value
  
  
    def getValue(self):
  
!     if self.editing:
        self._buildValue()
  
      return self.value
  
  
    def getDisplay(self):
!     return "%s" % self.value
  
  
    #####################
--- 50,70 ----
    #
  
    def setValue(self, value):
+     self.modified = 0
      self.value = value
+     self._buildDisplay()
  
  
    def getValue(self):
  
!     if self.editing and self.modified:
        self._buildValue()
  
      return self.value
  
  
    def getDisplay(self):
!     return self.display
  
  
    #####################
***************
*** 70,96 ****
    # Editing methods
    #
  
!   def beginEdit(self, cursor=0):
      self.editing = 1
  
  
-   def endEdit(self):
      self.selection1 = None
-     self.editing = not self._buildValue()
-     return not self.editing
  
  
!   def keyPressed(self, event):
  
-     if selection1:
-       replaces = abs(selection2-selection1)
      else:
!       replaces = 0
  
-     if self._unicode:
-       pass
  
      event.__dropped__ = 1
  
  
  
--- 72,216 ----
    # Editing methods
    #
  
!   def beginEdit(self, event):
!     print "Editing"
      self.editing = 1
+     self.modified = 0
+ 
+     # TODO: Replace with formatter
+     if self.value == None:
+       self.work = ""
+     else:
+       self.work = str(self.value)
+ 
+     self._buildDisplay()
+     self.cursor = len(self.display)
+ 
+ 
+   def endEdit(self, event):
+     print "End Editing"
  
+     # If this event returns __error__, then
+     # the input was invalid and the entry is
+     # still in editing mode.  __errortext__
+     # will contain an appropriate error message.
+     #
+     # If no error, then event.modified is true
+     # if the field was modified and the event's
+     # result is the final entry value.
  
      self.selection1 = None
  
+     if self.modified:
+       if self._buildValue():
+         self.editing = 0
+         event.__results__ = self.value
+         event.modified = self.modified
+         self.entry.setValue(self.value)
+ 
+         self._buildDisplay()
+ 
+       else:
+         event.__error__ = 1
+         event.__errortext__ = "The entered value\n " \
+                             + " '%s'\n" % self.value \
+                             + "is not a valid entry."
+ 
+ 
+   def addText(self, event):
+ 
+     value = event.text
+ 
+ 
+     # Do some appropriate checks on the text
+     # TODO: This will be moved to the mask system!!
  
!     if self.entry._lowercase:
!       value = string.lower(event.text)
!     if self.entry._uppercase:
!       value = string.upper(event.text)
! 
!     if hasattr(self.entry,'max_length') and \
!        len(self.work) > self.entry.max_length + len(value):
!       return
! 
!     if ( self.entry._numeric and \
!          self.entry._block.mode == 'normal' ):
!       for char in value:
!         if not (char in string.digits or char in '.'):
!           return
! 
! 
! 
!     # To do overstrike, we'll fudge by first "highlighting"
!     # the character to replace, then use the selection logic.
! 
!     if  hasattr(event,'overstrike') and event.overstrike and \
!         self.selection1 == None:
!       self.selection1 = self.cursor
!       self.selection2 = self.selection1 + 1
! 
! 
!     if self.selection1 != None:
!       # If text is selected, then we will replace
! 
!       s1 = min(self.selection1, self.selection2)
!       s2 = max(self.selection1, self.selection2)
! 
!       self.work = self.work[:s1]  \
!                    + value        \
!                    + self.work[s2:]
! 
!       self.selection1 = None
!       self.cursor = s1 + len(value)
  
      else:
!       # Otherwise just graft the new text in place
! 
!       self.work = self.work[:self.cursor] \
!                    + value                \
!                    + self.work[self.cursor:]
! 
!       self.cursor += len(event.text)
  
  
      event.__dropped__ = 1
+     self.modified = 1
+     self._buildDisplay()
+ 
+ 
+   # Delete backwards one character
+   def backspace(self, event):
+ 
+     # If we have a "selection",
+     # then act like a "delete"
+     if self.selection1 != None:
+       self.delete(event)
+       return
+ 
+     precurs = self.cursor
+     self.moveCursorLeft(event)
+ 
+     if self.cursor != precurs:
+       event.overstrike = 1
+       event.text = ""
+       self.addText(event)
+ 
+ 
+   # Delete forward one character
+   def delete(self, event):
+     event.overstrike = 1
+     event.text = ""
+     self.addText(event)
+ 
+ 
+   # Used by combo boxes
+   # TODO: Should be re-examined
+   def replaceText(self, event):
+     self.value = event.data[1]
+     self.modified = 1
+ 
+     self._buildDisplay()
  
  
  
***************
*** 99,119 ****
    # Cursor movement
    #
  
!   def moveCursor(self, position):
!     self.selection1 = None
  
  
!   def moveCursorRelative(self, relative):
!     self.selection1 = None
  
  
-   def moveCursorToEnd(self):
-     self.selection1 = None
  
  
!   def moveCursorToBegin(self):
!     self.selection1 = None
!     self.moveCursor(0)
  
  
    #####################
--- 219,263 ----
    # Cursor movement
    #
  
!   def moveCursorRelative(self, relative):
!     pass
  
  
!   def moveCursor(self, event, selecting=0):
!     if not selecting:
!       self.selection1 = None
  
+     self.cursor = min(event.position, len(self.display))
  
  
+   def moveCursorLeft(self, event, selecting=0):
+     if not selecting:
+       self.selection1 = None
+ 
+     if self.cursor > 0:
+       self.cursor -= 1
+ 
+ 
+   def moveCursorRight(self, event, selecting=0):
+     if not selecting:
+       self.selection1 = None
+ 
+     if self.cursor < len(self.display):
+       self.cursor += 1
  
! 
!   def moveCursorToEnd(self, event, selecting=0):
!     if not selecting:
!       self.selection1 = None
! 
!     self.cursor = len(self.display)
! 
! 
!   def moveCursorToBegin(self, event, selecting=0):
!     if not selecting:
!       self.selection1 = None
! 
!     self.cursor = 0
  
  
    #####################
***************
*** 121,175 ****
    # Selection stuff
    #
  
    def setSelectionArea(self, cursor1, cursor2):
!     self.selection1 = cursor1
!     self.selection2 = cursor2
  
    def getSelectionArea(self):
      if self.selection1 == None:
        return None
      else:
!       return (self.selection1, self.selection2)
  
-   def moveSelectionCursor(self, relative):
-     pass
  
!   def clipboardCopy(self):
!     return self.value
  
!   def clipboardCut(self):
!     value = self.value
!     self.value = None
!     return value
  
  
!   def clipboardPaste(self, value):
!     pass
  
  
  
    #####################
    #
    # Internal methods
    #
! ## TEMPORARY "=None" !!!
!   def __init__(self, entry, formatter=None):
  
!     # Are we in "editing" mode, or display mode?
!     self.editing = 0
! 
!     self.entry = entry
  
      # Needs to be set by the child classes
      self.formatter = formatter
  
!     self._unicode = 0
  
  
    def _buildValue(self):
!     ##self.value = self.formatter.
      return 1
  
  
  
  
--- 265,420 ----
    # Selection stuff
    #
  
+   # Set the selection area
    def setSelectionArea(self, cursor1, cursor2):
!     self.selection1 = min(cursor1, cursor2)
!     self.selection2 = max(cursor1, cursor2)
! 
  
+   # Return the selected area as a tuple (or
+   # None if no selection)
    def getSelectionArea(self):
      if self.selection1 == None:
        return None
      else:
!       return ( min(self.selection1, self.selection2),
!                max(self.selection1, self.selection2) )
  
  
!   # Select the entire text of the entry and move
!   # the cursor to the end
!   def selectAll(self, event):
  
!     self.selection1 = 0
!     self.moveCursorToEnd(event,1)
!     self.selection2 = self.cursor
  
  
!   # Move the selection cursor to the left one unit
!   def selectLeft(self, event):
! 
!     if self.selection1 == None:
!       self.selection1 = self.cursor
! 
!     self.moveCursorLeft(event, 1)
!     self.selection2 = self.cursor
! 
! 
!   # Move the selection cursor to the right one unit
!   def selectRight(self, event):
! 
!     if self.selection1 == None:
!       self.selection1 = self.cursor
! 
!     self.moveCursorRight(event,1)
!     self.selection2 = self.cursor
! 
! 
!   # Select to the beginning of the entry
!   def selectToBegin(self, event):
! 
!     if self.selection1 == None:
!       self.selection1 = self.cursor
! 
!     self.moveCursorToBegin(event,1)
!     self.selection2 = self.cursor
! 
! 
!   # Select to the beginning of the entry
!   def selectToEnd(self, event):
! 
!     if self.selection1 == None:
!       self.selection1 = self.cursor
! 
!     self.moveCursorToEnd(event,1)
!     self.selection2 = self.cursor
! 
! 
!   # Copy to the clipboard
!   def clipboardCopy(self, event):
!     print "Copy"
!     if self.selection1 != None:
!       sel1, sel2 = self.getSelectionArea()
!       print self.display[sel1:sel2]
!       self.dispatchEvent(GFEvent('setClipboard',
!                text=self.display[sel1:sel2]))
! 
!     event.refreshDisplay = 0
! 
! 
!   def clipboardCut(self, event):
!     print "Cut"
!     self.clipboardCopy(event)
!     edevent = GFEvent("requestKEYPRESS", text="")
!     self.processEvent(edevent)
! 
  
+   def clipboardPaste(self, event):
+     print "Paste"
+     event.text = self.dispatchEvent(GFEvent('getClipboard'))
+     if event.text != None:
+       self.addText(event)
  
  
    #####################
    #
    # Internal methods
    #
!   def __init__(self, entry, eventHandler, formatter=None):
!     GFEventAware.__init__(self, eventHandler)
  
!     self.entry = entry        # Our entry
!     self.editing = 0          # In editing mode??
!     self.modified = 0         # Have we been modified??
!     self.value = None         # The latest db-compat value
!     self.work = ""            # Our working value
!     self.display = ""         # The latest display-formatted value
!     self.selection1 = None    # Start of highlight
!     self.selection2 = None    # End of highlight
!     self.cursor = 0           # Cursor position
  
      # Needs to be set by the child classes
      self.formatter = formatter
  
!     self.subevents = GFEventController()
!     self.subevents.registerEventListeners( {
! 
!                  # "Entry" events
!                  'requestKEYPRESS'     : self.addText,
!                  'requestREPLACEVALUE' : self.replaceText,
!                  'requestCURSORLEFT'   : self.moveCursorLeft,
!                  'requestCURSORRIGHT'  : self.moveCursorRight,
!                  'requestCURSOREND'    : self.moveCursorToEnd,
!                  'requestCURSORHOME'   : self.moveCursorToBegin,
!                  'requestCURSORMOVE'   : self.moveCursor,
!                  'requestBACKSPACE'    : self.backspace,
!                  'requestDELETE'       : self.delete,
!                  'beginEDITMODE'       : self.beginEdit,
!                  'endEDITMODE'         : self.endEdit,
! 
!                  # Selection/clipboard events
!                  'requestSELECTALL'    : self.selectAll,
!                  'requestSELECTTOHOME' : self.selectToBegin,
!                  'requestSELECTTOEND'  : self.selectToEnd,
!                  'requestSELECTLEFT'   : self.selectLeft,
!                  'requestSELECTRIGHT'  : self.selectRight,
!                  'requestCOPY'         : self.clipboardCopy,
!                  'requestCUT'          : self.clipboardCut,
!                  'requestPASTE'        : self.clipboardPaste,
!         })
  
  
    def _buildValue(self):
!     self.value = self.work
      return 1
  
+   def _buildDisplay(self):
+     if self.editing:
+       self.display = self.work
+     else:
+       self.display = str(self.value)
+ 
+ 
  
  
  
***************
*** 180,188 ****
  #
  #
  class TextDisplayHandler(FieldDisplayHandler):
!   def __init__(self, entry, displayMask, inputMask, formatMask):
!     FieldDisplayHandler.__init__(entry, DateMask.DateMask(displayMask,
!                                      inputMask, formatMask))
  
  
  
--- 425,434 ----
  #
  #
  class TextDisplayHandler(FieldDisplayHandler):
!   def __init__(self, entry, eventHandler, displayMask, inputMask, formatMask):
! ##    FieldDisplayHandler.__init__(self, entry, eventHandler,
! ##            TextMask.TextMask(displayMask, inputMask, formatMask))
!     FieldDisplayHandler.__init__(self, entry, eventHandler, None)
  
  
  
***************
*** 191,199 ****
  # Handler for Numeric types
  #
  class NumberDisplayHandler(FieldDisplayHandler):
!   def __init__(self, entry, displayMask, inputMask):
!     FieldDisplayHandler.__init__(entry, DateMask.DateMask(displayMask,
!                                      inputMask, displayMask))
  
  
  
--- 437,453 ----
  # Handler for Numeric types
  #
  class NumberDisplayHandler(FieldDisplayHandler):
!   def __init__(self, entry, eventHandler, displayMask, inputMask):
! ##    FieldDisplayHandler.__init__(self, entry, eventHandler,
! ##            DateMask.DateMask(displayMask, inputMask, displayMask))
!     FieldDisplayHandler.__init__(self, entry, eventHandler, None)
! 
!   def _buildValue(self):
!     try:
!       self.value = float(self.work)
!       return 1
!     except ValueError:
!       return 0
  
  
  
***************
*** 204,211 ****
  #
  class DateDisplayHandler(FieldDisplayHandler):
    def __init__(self, entry, displayMask, inputMask):
!     FieldDisplayHandler.__init__(entry, DateMask.DateMask(displayMask,
!                                      inputMask, displayMask))
  
  
  
--- 458,466 ----
  #
  class DateDisplayHandler(FieldDisplayHandler):
    def __init__(self, entry, displayMask, inputMask):
! ##    FieldDisplayHandler.__init__(self, entry, eventHandler,
! ##            DateMask.DateMask(displayMask, inputMask, displayMask))
!     FieldDisplayHandler.__init__(self, entry, eventHandler, None)
  
  
  
***************
*** 228,235 ****
    trueValue = GConfig.get("checkboxTrue","Y")
    falseValue = GConfig.get("checkboxFalse","N")
  
!   trueValues = ('Y','y','T','t','1','x','X', trueValue)
!   falseValues = ('N','n','f','F','0', falseValue)
  
    def setValue(self, value):
      # Force to 0 or 1
--- 483,499 ----
    trueValue = GConfig.get("checkboxTrue","Y")
    falseValue = GConfig.get("checkboxFalse","N")
  
!   trueValues =  ('Y','y','T','t','1','x','X', trueValue)
!   falseValues = ('N','n','F','f','0','', ' ', falseValue)
! 
!   def __init__(self, *args, **params):
! 
!     FieldDisplayHandler.__init__(self, *args, **params)
! 
!     # My events...
!     self.subevents.registerEventListeners( {
!            'requestTOGGLECHKBOX' : self.toggle  } )
! 
  
    def setValue(self, value):
      # Force to 0 or 1
***************
*** 240,252 ****
      else:
        self.value = value and 1 or 0
  
!   def getValue(self):
!     if self.value:
        return self.trueValue
      else:
        return self.falseValue
  
    def getDisplay(self):
!     return self.value
  
  
--- 504,536 ----
      else:
        self.value = value and 1 or 0
  
!     self.modified = 0
!     self._buildDisplay()
! 
! 
!   def _buildValue(self):
!     if int(self.work):
        return self.trueValue
      else:
        return self.falseValue
  
+ 
+   def _buildDisplay(self):
+ 
+     if self.editing:
+       self.display = self.work
+     else:
+       if self.value == None:
+         self.value = ""
+       else:
+         self.display = str(self.value)
+ 
+ 
    def getDisplay(self):
!     return self.display
! 
! 
!   def toggle(self, event):
!     self.setValue(event.data[1])
  
  
Index: gnue/forms/src/GFEvent.py
diff -c gnue/forms/src/GFEvent.py:1.19 gnue/forms/src/GFEvent.py:1.20
*** gnue/forms/src/GFEvent.py:1.19      Fri Feb 15 22:57:55 2002
--- gnue/forms/src/GFEvent.py   Sun Feb 17 01:25:32 2002
***************
*** 49,54 ****
--- 49,55 ----
      self.__result__ = None
      self.__dropped__ = 0
      self.__error__ = 0
+     self.__errortext__ = ""
  
  
    def getResult(self):
Index: gnue/forms/src/GFForm.py
diff -c gnue/forms/src/GFForm.py:1.149 gnue/forms/src/GFForm.py:1.150
*** gnue/forms/src/GFForm.py:1.149      Sat Feb 16 19:46:32 2002
--- gnue/forms/src/GFForm.py    Sun Feb 17 01:25:32 2002
***************
*** 85,93 ****
      self._triggerFunctions = {'setFocus':{'function':self.triggerSetFocus,
                                            'global': 1,
                                            },
- #                              'execute':{'function':self.executeCommand,
- #                                          'global': 1,
- #                                          },
                                }
  
  
--- 85,90 ----
***************
*** 124,130 ****
  
      # Initialize our events system
      GFEventAware.__init__(self, self._app.eventController)
!     
  
      # TODO: Look at moving this into GParser
      # Import all needed objects
--- 121,127 ----
  
      # Initialize our events system
      GFEventAware.__init__(self, self._app.eventController)
! 
  
      # TODO: Look at moving this into GParser
      # Import all needed objects
***************
*** 185,203 ****
        object.name = string.lower(object.name)
        self._datasourceDictionary[object.name]=object
  
-   def setFocus(self,object):
-     if object.getObjectType() == 'GFBlock' and self._currentBlock == None:
-         self._currentBlock = object
  
!     elif object.getObjectType() == 'GFPage' and self._currentPage == None:
!         self._currentPage = object
  
!     elif object.getObjectType() in TabStops and \
!          self._currentEntry == None and \
!          not object.readonly and \
!          not object.hidden:
!       self._currentEntry = object
!       self._app.dispatchEvent(GFEvent('updateENTRY', self._currentEntry))
  
  
    def initImportedObjects(self, object):
--- 182,282 ----
        object.name = string.lower(object.name)
        self._datasourceDictionary[object.name]=object
  
  
!   #
!   # Find focus
!   #
!   # Find the next focusable item given
!   # an item of type Page, Block, or Entry
!   #
!   def findFocus(self, object):
!     entry = None
  
!     if object._type == 'GFEntry':
!       return object
!     else:
!       for child in object._children:
!         entry = self.findFocus(child)
!         if entry:
!           break
! 
!   #
!   # findAndChangeFocus
!   #
!   # Runs findFocus and then runs
!   # changeFocus with that value.
!   #
!   def findAndChangeFocus(self, object):
!     entry = self.findFocus(object)
!     if entry:
!       self.changeFocus(entry)
! 
! 
!   #
!   # changeFocus
!   #
!   # changes to the requested entry object requested by
!   # an event source
!   #
!   def changeFocus(self, widget, fireFocusTriggers=1):
! 
!     message = None
! 
!     try:
! 
!       if self._currentEntry:
!         event = GFEvent('endEditMode', None)
!         self._app.dispatchEvent(event)
!         if event.__error__:
!           return 1
! 
!       fieldChange = widget != self._currentEntry
!       blockChange = widget._block != self._currentBlock
!       pageChange = widget._block._page != self._currentPage
! 
!       if fireFocusTriggers:
!         try:
!           if fieldChange:
!             self._currentEntry.processTrigger('Pre-FocusOut')
!           if blockChange:
!             self._currentBlock.processTrigger('Pre-FocusOut')
!           if pageChange:
!             self._currentPage.processTrigger('Pre-FocusOut')
!             self._currentPage.processTrigger('Post-FocusOut')
!           if blockChange:
!             self._currentBlock.processTrigger('Post-FocusOut')
!           if fieldChange:
!             self._currentEntry.processTrigger('Post-FocusOut')
!         except AttributeError:
!           pass
! 
!       oldPage  = self._currentPage
!       oldBlock = self._currentBlock
!       oldEntry = self._currentEntry
! 
!       self._currentEntry = widget
!       self._currentBlock = self._currentEntry._block
!       self._currentPage = self._currentBlock._page
! 
!       self.dispatchEvent(GFEvent('updateENTRY', oldEntry))
!       self.dispatchEvent(GFEvent('updateENTRY', self._currentEntry))
! 
!       if fireFocusTriggers:
!         if pageChange:
!           self._currentPage.processTrigger('Pre-FocusIn')
!         if blockChange:
!           self._currentBlock.processTrigger('Pre-FocusIn')
!         if fieldChange:
!           self._currentEntry.processTrigger('Pre-FocusIn')
!           self._currentEntry.processTrigger('Post-FocusIn')
!         if blockChange:
!           self._currentBlock.processTrigger('Post-FocusIn')
!         if pageChange:
!           self._currentPage.processTrigger('Post-FocusIn')
! 
!     except TriggerError, t:
!       message = self.TriggerErrorFunc(t)
!     return message
  
  
    def initImportedObjects(self, object):
***************
*** 345,350 ****
--- 424,430 ----
  
    def commit(self):
      self._app.dispatchEvent(GFEvent('beginWAIT',None));
+ 
      message = None
  
      try:
***************
*** 420,650 ****
      GDebug.printMesg(0,  trigMsg)
      return trigMsg
  
-   #
-   # changeFocus
-   #
-   # changes to the requested entry object requested by
-   # an event source
-   #
-   def changeFocus(self, widget, fireFocusTriggers=1):
-     message = None
-     try:
-       if fireFocusTriggers:
-         self._currentEntry.processTrigger('Pre-FocusOut')
-         self._currentEntry.processTrigger('Post-FocusOut')
- 
-         widget.processTrigger('Pre-FocusIn')
-       oldEntry = self._currentEntry
-       
-       self._currentEntry = widget
-       self._currentBlock = self._currentEntry._block
- 
-       self._app.dispatchEvent(GFEvent('updateENTRY', oldEntry))
- 
-       if fireFocusTriggers:
-         widget.processTrigger('Post-FocusIn')
-     except TriggerError, t:
-       message = self.TriggerErrorFunc(t)
-     return message
- 
-   #
-   # moveCursor
-   #
-   # called whenever an event source has requested that the
-   # current input (cursor) position in current entry object be
-   # moved to a new location
-   #
-   def moveCursor(self, position):
- 
-     # If an input mask handler is being used, we
-     # need to use its logic to move the cursor.
- 
-     if not self._currentEntry._maskHandler:
- 
-       # use default logic
- 
-       if position == 'end':
-         self._currentEntry._cursorPosition = \
-           len(self._currentEntry.getDisplay(hasFocus=1))
-       elif position == 'home':
-         self._currentEntry._cursorPosition = 0
-       elif position == 'left' and self._currentEntry._cursorPosition > 0:
-         self._currentEntry._cursorPosition -= 1
-       elif ( position == 'right' ) and \
-            ( self._currentEntry._cursorPosition < \
-              len(self._currentEntry.getDisplay(hasFocus=1)) ):
-         self._currentEntry._cursorPosition += 1
- 
-     else:
- 
-       # use mask handler's logic
- 
-       if position == 'end':
-         self._currentEntry._cursorPosition = \
-            self._currentEntry._maskHandler.moveCursorToEnd()
-       elif position == 'home':
-         self._currentEntry._cursorPosition = \
-            self._currentEntry._maskHandler.moveCursorToBegin()
-       elif position == 'left':
-         self._currentEntry._cursorPosition = \
-            self._currentEntry._maskHandler.moveCursorRelative(-1)
-       elif position == 'right':
-         self._currentEntry._cursorPosition = \
-            self._currentEntry._maskHandler.moveCursorRelative(1)
- 
- 
-   def replaceValue(self,object, value):
-     replacement = ""
-     validValues = object.allowedValues()
-     for key in validValues.keys():
-       if validValues[key] == value:
-         replacement = key
-         break
-     GDebug.printMesg(2,"(%s, %s)"%(object,value))
-     GDebug.printMesg(2,"Replacing with %s"% replacement)
-     self._currentEntry.processTrigger('pre-change')
-     object.setValue(replacement)
-     self._currentEntry.processTrigger('post-change')
- 
-     # Hack!
-     self.dispatchEvent(GFEvent('updateDETAILBLOCK',self._currentBlock))
- 
-   #
-   # keyPress
-   #
-   # Called whenever an event source has requested that a
-   # charater be inserted into current entry object
-   #
-   def keyPress(self, value):
-     modified = 0
- 
-     if (self._currentEntry != None):
-         currentvalue = self._currentEntry.getValue()
-         if ord(value) == 13:
-           if self._currentEntry.height > 1: value = '\n';
-           else:
-            self._app.nextEntry(None)
-            #self._app.dispatchEvent(GFEvent('requestNEXTENTRY'))
-            return modified
- 
-         if hasattr(self._currentEntry,'foreign_key_description') and 
hasattr(self._currentEntry,'style') and (self._currentEntry.style=='dropdown'):
-           value= self._currentEntry.findClosestValue(value)
-           if not value: return modified
- 
-           self._currentEntry.processTrigger('pre-change')
-           self._currentEntry.setValue(value)
-           self._currentEntry.processTrigger('post-change')
-           modified = 1
-           return modified
- 
-         if self._currentEntry._lowercase:
-           value = string.lower(value)
-         if self._currentEntry._uppercase:
-           value = string.upper(value)
-         if hasattr(self._currentEntry,'max_length'):
-           if len(currentvalue) >= int(self._currentEntry.max_length):
-             return modified
- 
-         if ( self._currentEntry._numeric and \
-              self._currentBlock.mode == 'normal' ):
-           if not (value in string.digits or value in '.'):
-             return modified
- 
- 
- 
-         # If an input mask handler is being
-         # used, we need to use its logic.
- 
-         if not self._currentEntry._maskHandler:
- 
-           # use default logic
- 
-           currentvalue = currentvalue[:self._currentEntry._cursorPosition] \
-                        + value \
-                        + currentvalue[self._currentEntry._cursorPosition \
-                                       + (not self._insertMode):]
- 
-           self._currentEntry._cursorPosition += 1
- 
-         else:
- 
-           # use mask handler's logic
- 
-           currentvalue, display, cursor = \
-              self._currentEntry._maskHandler.addText(
-               currentvalue,
-               value,
-               self._currentEntry._cursorPosition,
-               not self._insertMode,
-               '_' )
- 
-           print "New value: %s" % currentvalue
- 
-           self._currentEntry._cursorPosition = cursor
- 
- 
-         # Set the field's value, performing pre-/post-change triggers
-         self._currentEntry.processTrigger('pre-change')
-         self._currentEntry.setValue(currentvalue)
-         self._currentEntry.processTrigger('post-change')
-         modified = 1
- 
-     return modified
- 
- 
-   #
-   # removeCharacter
-   #
-   # Called whenever an event source has requested that a
-   # charater be removed from the current entry object
-   #
-   def removeCharacter(self, action):
- 
- 
-     # For a backspace, we will fudge by simply
-     # moving the cursor left one position and
-     # performing a "delete".
-     #
-     # If an input mask handler is being used, we
-     # need to use its logic to move the cursor.
- 
-     if not self._currentEntry._maskHandler:
-       if action == 'backspace':
-         if self._currentEntry._cursorPosition > 0:
-           self._currentEntry._cursorPosition -= 1
-         else:
-           # Cannot backspace if we are at pos 0
-           return 0
- 
-       newvalue = self._currentEntry.getValue()
-       newvalue = newvalue[:self._currentEntry._cursorPosition] \
-                + newvalue[self._currentEntry._cursorPosition+1:]
- 
-     else:
- 
-       if action == 'backspace':
-         newPos = self._currentEntry._maskHandler.moveCursorRelative(-1)
-         if self._currentEntry._cursorPosition != newPos:
-           self._currentEntry._cursorPosition = newPos
-         else:
-           # Cannot backspace if we are at pos 0
-           return 0
- 
-       newvalue = self._currentEntry._maskHandler.processEdit(
-             self._currentEntry.getValue(),
-             "",
-             self._currentEntry._maskHandler.cursorToIndex(
-                             self._currentEntry._cursorPosition),
-             1)
- 
- 
- 
-     self._currentEntry.processTrigger('pre-change')
-     self._currentEntry.setValue(newvalue)
-     self._currentEntry.processTrigger('post-change')
- 
-     return 1
  
  
    #
    # fireTrigger
--- 500,704 ----
      GDebug.printMesg(0,  trigMsg)
      return trigMsg
  
  
+ ##  #
+ ##  # moveCursor
+ ##  #
+ ##  # called whenever an event source has requested that the
+ ##  # current input (cursor) position in current entry object be
+ ##  # moved to a new location
+ ##  #
+ ##  def moveCursor(self, position):
+ ##
+ ##    # If an input mask handler is being used, we
+ ##    # need to use its logic to move the cursor.
+ ##
+ ##    if not self._currentEntry._maskHandler:
+ ##
+ ##      # use default logic
+ ##
+ ##      if position == 'end':
+ ##        self._currentEntry._cursorPosition = \
+ ##          len(self._currentEntry.getDisplay(hasFocus=1))
+ ##      elif position == 'home':
+ ##        self._currentEntry._cursorPosition = 0
+ ##      elif position == 'left' and self._currentEntry._cursorPosition > 0:
+ ##        self._currentEntry._cursorPosition -= 1
+ ##      elif ( position == 'right' ) and \
+ ##           ( self._currentEntry._cursorPosition < \
+ ##             len(self._currentEntry.getDisplay(hasFocus=1)) ):
+ ##        self._currentEntry._cursorPosition += 1
+ ##
+ ##    else:
+ ##
+ ##      # use mask handler's logic
+ ##
+ ##      if position == 'end':
+ ##        self._currentEntry._cursorPosition = \
+ ##           self._currentEntry._maskHandler.moveCursorToEnd()
+ ##      elif position == 'home':
+ ##        self._currentEntry._cursorPosition = \
+ ##           self._currentEntry._maskHandler.moveCursorToBegin()
+ ##      elif position == 'left':
+ ##        self._currentEntry._cursorPosition = \
+ ##           self._currentEntry._maskHandler.moveCursorRelative(-1)
+ ##      elif position == 'right':
+ ##        self._currentEntry._cursorPosition = \
+ ##           self._currentEntry._maskHandler.moveCursorRelative(1)
+ ##
+ ##
+ ##  def replaceValue(self,object, value):
+ ##    replacement = ""
+ ##    validValues = object.allowedValues()
+ ##    for key in validValues.keys():
+ ##      if validValues[key] == value:
+ ##        replacement = key
+ ##        break
+ ##    GDebug.printMesg(2,"(%s, %s)"%(object,value))
+ ##    GDebug.printMesg(2,"Replacing with %s"% replacement)
+ ##    self._currentEntry.processTrigger('pre-change')
+ ##    object.setValue(replacement)
+ ##    self._currentEntry.processTrigger('post-change')
+ ##
+ ##    # Hack!
+ ##    self.dispatchEvent(GFEvent('updateDETAILBLOCK',self._currentBlock))
+ ##
+ ##  #
+ ##  # keyPress
+ ##  #
+ ##  # Called whenever an event source has requested that a
+ ##  # charater be inserted into current entry object
+ ##  #
+ ##  def keyPress(self, value):
+ ##    modified = 0
+ ##
+ ##    if (self._currentEntry != None):
+ ##        currentvalue = self._currentEntry.getValue()
+ ##        if ord(value) == 13:
+ ##          if self._currentEntry.height > 1: value = '\n';
+ ##          else:
+ ##           self._app.nextEntry(None)
+ ##           #self._app.dispatchEvent(GFEvent('requestNEXTENTRY'))
+ ##           return modified
+ ##
+ ##        if hasattr(self._currentEntry,'foreign_key_description') and 
hasattr(self._currentEntry,'style') and (self._currentEntry.style=='dropdown'):
+ ##          value= self._currentEntry.findClosestValue(value)
+ ##          if not value: return modified
+ ##
+ ##          self._currentEntry.processTrigger('pre-change')
+ ##          self._currentEntry.setValue(value)
+ ##          self._currentEntry.processTrigger('post-change')
+ ##          modified = 1
+ ##          return modified
+ ##
+ ##        if self._currentEntry._lowercase:
+ ##          value = string.lower(value)
+ ##        if self._currentEntry._uppercase:
+ ##          value = string.upper(value)
+ ##        if hasattr(self._currentEntry,'max_length'):
+ ##          if len(currentvalue) >= int(self._currentEntry.max_length):
+ ##            return modified
+ ##
+ ##        if ( self._currentEntry._numeric and \
+ ##             self._currentBlock.mode == 'normal' ):
+ ##          if not (value in string.digits or value in '.'):
+ ##            return modified
+ ##
+ ##
+ ##
+ ##        # If an input mask handler is being
+ ##        # used, we need to use its logic.
+ ##
+ ##        if not self._currentEntry._maskHandler:
+ ##
+ ##          # use default logic
+ ##
+ ##          currentvalue = currentvalue[:self._currentEntry._cursorPosition] \
+ ##                       + value \
+ ##                       + currentvalue[self._currentEntry._cursorPosition \
+ ##                                      + (not self._insertMode):]
+ ##
+ ##          self._currentEntry._cursorPosition += 1
+ ##
+ ##        else:
+ ##
+ ##          # use mask handler's logic
+ ##
+ ##          currentvalue, display, cursor = \
+ ##             self._currentEntry._maskHandler.addText(
+ ##              currentvalue,
+ ##              value,
+ ##              self._currentEntry._cursorPosition,
+ ##              not self._insertMode,
+ ##              '_' )
+ ##
+ ##          print "New value: %s" % currentvalue
+ ##
+ ##          self._currentEntry._cursorPosition = cursor
+ ##
+ ##
+ ##        # Set the field's value, performing pre-/post-change triggers
+ ##        self._currentEntry.processTrigger('pre-change')
+ ##        self._currentEntry.setValue(currentvalue)
+ ##        self._currentEntry.processTrigger('post-change')
+ ##        modified = 1
+ ##
+ ##    return modified
+ ##
+ ##
+ ##  #
+ ##  # removeCharacter
+ ##  #
+ ##  # Called whenever an event source has requested that a
+ ##  # charater be removed from the current entry object
+ ##  #
+ ##  def removeCharacter(self, action):
+ ##
+ ##
+ ##    # For a backspace, we will fudge by simply
+ ##    # moving the cursor left one position and
+ ##    # performing a "delete".
+ ##    #
+ ##    # If an input mask handler is being used, we
+ ##    # need to use its logic to move the cursor.
+ ##
+ ##    if not self._currentEntry._maskHandler:
+ ##      if action == 'backspace':
+ ##        if self._currentEntry._cursorPosition > 0:
+ ##          self._currentEntry._cursorPosition -= 1
+ ##        else:
+ ##          # Cannot backspace if we are at pos 0
+ ##          return 0
+ ##
+ ##      newvalue = self._currentEntry.getValue()
+ ##      newvalue = newvalue[:self._currentEntry._cursorPosition] \
+ ##               + newvalue[self._currentEntry._cursorPosition+1:]
+ ##
+ ##    else:
+ ##
+ ##      if action == 'backspace':
+ ##        newPos = self._currentEntry._maskHandler.moveCursorRelative(-1)
+ ##        if self._currentEntry._cursorPosition != newPos:
+ ##          self._currentEntry._cursorPosition = newPos
+ ##        else:
+ ##          # Cannot backspace if we are at pos 0
+ ##          return 0
+ ##
+ ##      newvalue = self._currentEntry._maskHandler.processEdit(
+ ##            self._currentEntry.getValue(),
+ ##            "",
+ ##            self._currentEntry._maskHandler.cursorToIndex(
+ ##                            self._currentEntry._cursorPosition),
+ ##            1)
+ ##
+ ##
+ ##
+ ##    self._currentEntry.processTrigger('pre-change')
+ ##    self._currentEntry.setValue(newvalue)
+ ##    self._currentEntry.processTrigger('post-change')
+ ##
+ ##    return 1
+ ##
  
    #
    # fireTrigger
***************
*** 717,722 ****
--- 771,777 ----
      nextEntry = None
      lastEntry = self._currentEntry
      if not self._currentEntry.verifyValue(): return
+ 
      for object in self._currentEntry._parent._children:
        if object.getObjectType() in TabStops and \
           not object.hidden and (not object.readonly or \
***************
*** 732,737 ****
--- 787,793 ----
            break
  
          nextEntry = object
+ 
      try:
        self._currentEntry.processTrigger('Pre-FocusOut')
        nextEntry.processTrigger('Pre-FocusIn')
***************
*** 761,798 ****
    # focus change to the next data entry block
    #
    def nextBlock(self):
-     nextBlock = self._blockList[0]
-     keepNext = 0
-     for object in self._blockList:
-       if object == self._currentBlock:
-         keepNext = 1
-         continue
  
-       if keepNext == 1:
-         nextBlock = object
-         break
      try:
!       self._currentBlock.processTrigger('Pre-FocusOut')
!       self._currentBlock.processTrigger('Post-FocusOut')
!       nextBlock.processTrigger('Pre-FocusIn')
!       self._currentBlock = nextBlock
!       nextBlock.processTrigger('Post-FocusIn')
!     except TriggerError, t:
!       print "Got to the exception handler!"
!       self.TriggerErrorFunc(t)
  
!     # reset current entry
!     prevEntry = self._currentEntry
!     self._currentEntry = None
!     self._app.dispatchEvent(GFEvent('updateENTRY', prevEntry))
! 
!     self._currentBlock.walk(self.setFocus)
! 
!     # set current page
!     pageWidget = self._currentBlock
!     while pageWidget.getObjectType() != 'GFPage':
!       pageWidget = pageWidget._parent
!     self._currentPage = pageWidget
  
    #
    # previousBlock
--- 817,829 ----
    # focus change to the next data entry block
    #
    def nextBlock(self):
  
      try:
!       nextBlock = self._blockList[self._blockList.index(self._currentBlock)+1]
!     except IndexError:
!       nextBlock = self._blockList[0]
  
!     self.findAndChangeFocus(nextBlock)
  
    #
    # previousBlock
***************
*** 801,842 ****
    # focus change to the next data entry block
    #
    def previousBlock(self):
-     nextBlock = self._blockList[-1]
-     for object in self._blockList:
-       if object == self._currentBlock:
-         break
  
-       nextBlock = object
      try:
!       self._currentBlock.processTrigger('Pre-FocusOut')
!       self._currentBlock.processTrigger('Post-FocusOut')
!       nextBlock.processTrigger('Pre-FocusIn')
!       self._currentBlock = nextBlock
!       nextBlock.processTrigger('Post-FocusIn')
!     except TriggerError, t:
!       print "Got to the exception handler!"
!       self.TriggerErrorFunc(t)
! 
!     # reset current entry
!     prevEntry = self._currentEntry
!     self._currentEntry = None
!     self._app.dispatchEvent(GFEvent('updateENTRY', prevEntry))
! 
!     self._currentBlock.walk(self.setFocus)
! 
!     # set current page
!     pageWidget = self._currentBlock
!     while pageWidget.getObjectType() != 'GFPage':
!       pageWidget = pageWidget._parent
!     self._currentPage = pageWidget
  
    def gotoPage(self, index):
      for object in self._blockList:
        pageWidget = object
        while pageWidget.getObjectType() != 'GFPage':
          pageWidget = pageWidget._parent
!         
!       if self._pageList[index] == pageWidget: 
          self._currentPage = self._pageList[index]
          self._currentBlock = object
          break
--- 832,857 ----
    # focus change to the next data entry block
    #
    def previousBlock(self):
  
      try:
!       nextBlock = self._blockList[self._blockList.index(self._currentBlock)-1]
!     except IndexError:
!       nextBlock = self._blockList[-1]
! 
!     self.findAndChangeFocus(nextBlock)
! 
!   def endEditing(self):
!     event = GFEvent('endEditMode',None)
!     self.dispatchEvent(event)
!     return not event.__error__
  
    def gotoPage(self, index):
      for object in self._blockList:
        pageWidget = object
        while pageWidget.getObjectType() != 'GFPage':
          pageWidget = pageWidget._parent
! 
!       if self._pageList[index] == pageWidget:
          self._currentPage = self._pageList[index]
          self._currentBlock = object
          break
Index: gnue/forms/src/GFInstance.py
diff -c gnue/forms/src/GFInstance.py:1.29 gnue/forms/src/GFInstance.py:1.30
*** gnue/forms/src/GFInstance.py:1.29   Sun Feb 17 01:08:46 2002
--- gnue/forms/src/GFInstance.py        Sun Feb 17 01:25:32 2002
***************
*** 58,64 ****
      #self._uimodule = ui.GFUserInterface
      self._uimodule = ui
      self._disableSplash = disableSplash
!     # Incomming events
      self.registerEventListeners( {
                             # Focus-related events
                             'requestNEXTENTRY'    : self.nextEntry,
--- 58,65 ----
      #self._uimodule = ui.GFUserInterface
      self._uimodule = ui
      self._disableSplash = disableSplash
! 
!     # Incoming events
      self.registerEventListeners( {
                             # Focus-related events
                             'requestNEXTENTRY'    : self.nextEntry,
***************
*** 70,114 ****
                             'requestRECORDNUMBER' : self.jumpToRecord,
                             'requestJUMPRECORD'   : self.jumpRecords,
                             'requestPAGE'         : self.gotoPage,
- 
-                            # Proxied "Entry" events
-                            'requestKEYPRESS'     : self.keyPress,
-                            'requestREPLACEVALUE' : self.replaceValue,
-                            'requestCURSORLEFT'   : self.cursorMove,
-                            'requestCURSORRIGHT'  : self.cursorMove,
-                            'requestCURSOREND'    : self.cursorMove,
-                            'requestCURSORHOME'   : self.cursorMove,
-                            'requestBACKSPACE'    : self.removeCharacter,
-                            'requestDELETE'       : self.removeCharacter,
                             'requestFOCUS'        : self.changeFocus,
                             'requestMODETOGGLE'   : self.toggleInsertMode,
  
!                            # Selection/clipboard events
!                            'requestSELECTALL'    : None, # TODO
!                            'requestSELECTTOHOME' : None, # TODO
!                            'requestSELECTTOEND'  : None, # TODO
!                            'requestSELECTLEFT'   : None, # TODO
!                            'requestSELECTRIGHT'  : None, # TODO
!                            'requestCOPY'         : None, # TODO
!                            'requestCUT'          : None, # TODO
!                            'requestPASTE'        : None, # TODO
  
!                            # Data set manipulation
!                            'requestNEWRECORD'     : self.newRecord,
!                            'requestMARKFORDELETE' : self.deleteRecord,
!                            'requestCOMMIT'     : self.executeCommit,
!                            'requestPRINTOUT'   : self.executePrintout,
!                            'requestROLLBACK'   : self.executeRollback,
!                            'requestENTERQUERY' : self.requestQuery,
!                            'requestEXECQUERY'  : self.executeQuery,
! 
!                            # High-level forms stuff
!                            'requestEXIT'       : self.executeExit,
!                            'requestABOUT'      : self.executeAbout,
!                            'fireTRIGGER'       : self.fireTrigger,
  
-                            'requestTOGGLECHKBOX'  : self.toggleCheckBox,
-                            } )
  
    #
    # Associate a form object with this instance
--- 71,119 ----
                             'requestRECORDNUMBER' : self.jumpToRecord,
                             'requestJUMPRECORD'   : self.jumpRecords,
                             'requestPAGE'         : self.gotoPage,
                             'requestFOCUS'        : self.changeFocus,
+ 
+                            # Data set manipulation
+                            'requestNEWRECORD'    : self.newRecord,
+                            'requestMARKFORDELETE': self.deleteRecord,
+                            'requestCOMMIT'       : self.executeCommit,
+                            'requestPRINTOUT'     : self.executePrintout,
+                            'requestROLLBACK'     : self.executeRollback,
+                            'requestENTERQUERY'   : self.requestQuery,
+                            'requestEXECQUERY'    : self.executeQuery,
+ 
+                            # Miscellaneous stuff
+                            'requestEXIT'         : self.executeExit,
+                            'requestABOUT'        : self.executeAbout,
                             'requestMODETOGGLE'   : self.toggleInsertMode,
+                            'fireTRIGGER'         : self.fireTrigger,
  
!                            # "Entry" events (proxied)
!                            'requestKEYPRESS'     : self.proxyEntryEvent,
!                            'requestREPLACEVALUE' : self.proxyEntryEvent,
!                            'requestCURSORMOVE'   : self.proxyEntryEvent,
!                            'requestCURSORLEFT'   : self.proxyEntryEvent,
!                            'requestCURSORRIGHT'  : self.proxyEntryEvent,
!                            'requestCURSOREND'    : self.proxyEntryEvent,
!                            'requestCURSORHOME'   : self.proxyEntryEvent,
!                            'requestBACKSPACE'    : self.proxyEntryEvent,
!                            'requestDELETE'       : self.proxyEntryEvent,
!                            'requestTOGGLECHKBOX' : self.proxyEntryEvent,
!                            'beginEDITMODE'       : self.proxyEntryEvent,
!                            'endEDITMODE'         : self.proxyEntryEvent,
! 
!                            # Selection/clipboard events (proxied)
!                            'requestSELECTALL'    : self.proxyEntryEvent,
!                            'requestSELECTTOHOME' : self.proxyEntryEvent,
!                            'requestSELECTTOEND'  : self.proxyEntryEvent,
!                            'requestSELECTLEFT'   : self.proxyEntryEvent,
!                            'requestSELECTRIGHT'  : self.proxyEntryEvent,
!                            'requestCOPY'         : self.proxyEntryEvent,
!                            'requestCUT'          : self.proxyEntryEvent,
!                            'requestPASTE'        : self.proxyEntryEvent,
  
!                      } )
  
  
    #
    # Associate a form object with this instance
***************
*** 129,140 ****
--- 134,187 ----
      return self.manager
  
    #
+   # proxyEntryEvent
+   #
+   # This serves as a proxy for any entry-level events.
+   # Since we don't want all entries listening for all
+   # events (only the *current* entry), we will capture
+   # any relevant events here and pass on to the entry.
+   #
+   def proxyEntryEvent(self, event):
+ 
+     if self._form._currentEntry != None:
+ 
+       handler = self._form._currentEntry._displayHandler
+ 
+       # If the display will need to be refreshed,
+       # then the proxied event should set this to 1
+       event.refreshDisplay = 1
+ 
+       # Pass off the event to the current entry's event handler
+       handler.subevents.dispatchEvent(event)
+ 
+       # Refresh entry display if appropriate
+       if event.refreshDisplay:
+         print "Refreshing!!"
+         handler = self._form._currentEntry._displayHandler
+         self.dispatchEvent(GFEvent('updateEntryEditor',
+            object = self._form._currentEntry,
+            display=handler.display,
+            cursor=handler.cursor,
+            selection=handler.getSelectionArea(),
+          ))
+ 
+       # If the entry needs an error message displayed,
+       # then the proxied event should set this to the
+       # message text
+       if event.__errortext__:
+         messageBox = GFMsgBox(self, event.__errortext__)
+         messageBox.show()
+ 
+ 
+   #
    # nextEntry
    #
    # Called whenever an event source has requested that the
    # focus change to the next data entry object
    #
    def nextEntry(self, event):
+     if not self._form.endEditing():
+       return
      message = self._form.nextEntry()
      if message:
        messageBox = GFMsgBox(self, message)
***************
*** 151,156 ****
--- 198,205 ----
    # focus change to the next data entry object
    #
    def previousEntry(self, event):
+     if not self._form.endEditing():
+       return
      self._form.previousEntry()
      
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
      self.updateRecordStatus()
***************
*** 163,172 ****
    # focus change to the next data entry block
    #
    def nextBlock(self,event):
      self._form.nextBlock()
      self.dispatchEvent(GFEvent('gotoPAGE',self._form._currentPage));
      
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
!     
      self.updateStatus()
  
    #
--- 212,223 ----
    # focus change to the next data entry block
    #
    def nextBlock(self,event):
+     if not self._form.endEditing():
+       return
      self._form.nextBlock()
      self.dispatchEvent(GFEvent('gotoPAGE',self._form._currentPage));
      
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
! 
      self.updateStatus()
  
    #
***************
*** 176,181 ****
--- 227,234 ----
    # focus change to the next data entry block
    #
    def previousBlock(self, event):
+     if not self._form.endEditing():
+       return
      self._form.previousBlock()
      self.dispatchEvent(GFEvent('gotoPAGE',self._form._currentPage));
      
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
***************
*** 187,197 ****
    # Called to make the form jump to a specific page
    #
    def gotoPage(self,event):
      self._form.gotoPage(event.data)
      self.dispatchEvent(GFEvent('gotoPAGE',self._form._currentPage));
      
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
      self.updateStatus()
!     
    #
    # previousRecord
    #
--- 240,252 ----
    # Called to make the form jump to a specific page
    #
    def gotoPage(self,event):
+     if not self._form.endEditing():
+       return
      self._form.gotoPage(event.data)
      self.dispatchEvent(GFEvent('gotoPAGE',self._form._currentPage));
      
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
      self.updateStatus()
! 
    #
    # previousRecord
    #
***************
*** 199,204 ****
--- 254,261 ----
    # form advance to the next record in memory
    #
    def prevRecord(self, event):
+     if not self._form.endEditing():
+       return
      message = self._form.prevRecord()
      if message:
        messageBox = GFMsgBox(self,message)
***************
*** 207,213 ****
      
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
      self.updateRecordCounter()
      self.updateRecordStatus()
!                 
    #
    # nextRecord
    #
--- 264,270 ----
      
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
      self.updateRecordCounter()
      self.updateRecordStatus()
! 
    #
    # nextRecord
    #
***************
*** 215,220 ****
--- 272,279 ----
    # form advance to the next record in memory
    #
    def nextRecord(self, event):
+     if not self._form.endEditing():
+       return
      message = self._form.nextRecord()
      if message:
        messageBox = GFMsgBox(self,message)
***************
*** 231,236 ****
--- 290,297 ----
    # form move a specific record
    #
    def jumpToRecord(self,event):
+     if not self._form.endEditing():
+       return
      try:
        count = abs(int(event.data))-1
      except ValueError:
***************
*** 250,267 ****
  
  
    def jumpRecords(self,event):
      count = event.data
      for jumps in range(abs(count)):
        if count > 0:
          self._form.nextRecord()
        if count < 0:
          self._form.prevRecord()
!         
      
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
      self.updateRecordCounter()
      self.updateRecordStatus()
!                                      
!       
    def executeExit(self, event):
      if not self._form.isSaved():
        message = GFMsgBox(self, GConfig.get('_msgNOTSAVED'))
--- 311,330 ----
  
  
    def jumpRecords(self,event):
+     if not self._form.endEditing():
+       return
      count = event.data
      for jumps in range(abs(count)):
        if count > 0:
          self._form.nextRecord()
        if count < 0:
          self._form.prevRecord()
! 
      
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
      self.updateRecordCounter()
      self.updateRecordStatus()
! 
! 
    def executeExit(self, event):
      if not self._form.isSaved():
        message = GFMsgBox(self, GConfig.get('_msgNOTSAVED'))
***************
*** 269,275 ****
      else:
        # If above loop didn't cause function to return then exit
        self.dispatchEvent(GFEvent('exitApplication','Current data is saved'))
!                                               
      return
  
    #
--- 332,338 ----
      else:
        # If above loop didn't cause function to return then exit
        self.dispatchEvent(GFEvent('exitApplication','Current data is saved'))
! 
      return
  
    #
***************
*** 286,302 ****
        self._form.deleteRecord()
        self.updateRecordStatus()
  
!                           
    #
    # newRecord
    #
    # Tells the form to create a new record
    #
    def newRecord(self, event):
      if self._form.readonly:
        self.dispatchEvent(GFEvent('formALERT','Form is readonly'))
      elif self._form._currentBlock.restrictInsert:
!       self.dispatchEvent(GFEvent('formALERT','Block does not allow insert')); 
     
      else:
        self._form.newRecord()
        
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
--- 349,367 ----
        self._form.deleteRecord()
        self.updateRecordStatus()
  
! 
    #
    # newRecord
    #
    # Tells the form to create a new record
    #
    def newRecord(self, event):
+     if not self._form.endEditing():
+       return
      if self._form.readonly:
        self.dispatchEvent(GFEvent('formALERT','Form is readonly'))
      elif self._form._currentBlock.restrictInsert:
!       self.dispatchEvent(GFEvent('formALERT','Block does not allow insert'));
      else:
        self._form.newRecord()
        
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
***************
*** 317,323 ****
      author = self._form.getOption('author') or "Unknown"
      description = self._form.getOption('description') or "Unknown"
      
self.dispatchEvent(GFEvent('uiABOUT',[version,name,formversion,author,description]))
!     
    #
    # toggleInsertMode(self):
    #
--- 382,388 ----
      author = self._form.getOption('author') or "Unknown"
      description = self._form.getOption('description') or "Unknown"
      
self.dispatchEvent(GFEvent('uiABOUT',[version,name,formversion,author,description]))
! 
    #
    # toggleInsertMode(self):
    #
***************
*** 336,344 ****
      if self._form._triggerDictionary.has_key('process-printout'):
        self._form.fireTrigger('process-printout')
      else:
!       # TODO: should probably do something else as a default if trigger not 
available 
        # TODO: like a screen print
        pass
    #
    # executeRollback
    #
--- 401,410 ----
      if self._form._triggerDictionary.has_key('process-printout'):
        self._form.fireTrigger('process-printout')
      else:
!       # TODO: should probably do something else as a default if trigger not 
available
        # TODO: like a screen print
        pass
+ 
    #
    # executeRollback
    #
***************
*** 350,381 ****
      self.updateRecordStatus()
      self.updateRecordCounter()
  
!   #
!   # cursorMove
!   #
!   # called whenever an event source has requested that the
!   # current input (cursor) position in current entry object be
!   # moved to a new location
!   #
!   def cursorMove(self, event):
!     eventType = event.getEvent()
!     if eventType == 'requestCURSOREND':
!       self._form.moveCursor('end')
!     elif eventType == 'requestCURSORHOME':
!       self._form.moveCursor('home')
!     elif eventType == 'requestCURSORLEFT':
!       self._form.moveCursor('left')
!     elif eventType == 'requestCURSORRIGHT':
!       self._form.moveCursor('right')
  
-     self.dispatchEvent(GFEvent('updateENTRY',self._form._currentEntry));
-         
    #
    # Routines to update parts of the UI's status bar
    #
    def updateInsertMode(self):
      
self.dispatchEvent(GFEvent('uiUPDATESTATUS',[None,None,self._form._insertMode,None,None,None,None]))
!     
    def updateRecordCounter(self):
      
self.dispatchEvent(GFEvent('uiUPDATESTATUS',[None,None,None,self._form._currentBlock._currentRecord+1,self._form._currentBlock._recordCount,None,None]))
  
--- 416,447 ----
      self.updateRecordStatus()
      self.updateRecordCounter()
  
! ##  #
! ##  # cursorMove
! ##  #
! ##  # called whenever an event source has requested that the
! ##  # current input (cursor) position in current entry object be
! ##  # moved to a new location
! ##  #
! ##  def cursorMove(self, event):
! ##    eventType = event.getEvent()
! ##    if eventType == 'requestCURSOREND':
! ##      self._form.moveCursor('end')
! ##    elif eventType == 'requestCURSORHOME':
! ##      self._form.moveCursor('home')
! ##    elif eventType == 'requestCURSORLEFT':
! ##      self._form.moveCursor('left')
! ##    elif eventType == 'requestCURSORRIGHT':
! ##      self._form.moveCursor('right')
! ##
! ##    self.dispatchEvent(GFEvent('updateENTRY',self._form._currentEntry));
  
    #
    # Routines to update parts of the UI's status bar
    #
    def updateInsertMode(self):
      
self.dispatchEvent(GFEvent('uiUPDATESTATUS',[None,None,self._form._insertMode,None,None,None,None]))
! 
    def updateRecordCounter(self):
      
self.dispatchEvent(GFEvent('uiUPDATESTATUS',[None,None,None,self._form._currentBlock._currentRecord+1,self._form._currentBlock._recordCount,None,None]))
  
***************
*** 416,460 ****
      self.updateRecordStatus()
      self.updatePageCounter()
  
!   #
!   # keyPress
!   #
!   # Called whenever an event source has requested that a
!   # charater be inserted into current entry object
!   #
!   def keyPress(self, event):
!     GDebug.printMesg(10, "Keypress event %s"%event.data)
!     if (self._form._currentEntry != None):
!       if (self._form._currentEntry.readonly and not 
self._form._currentBlock.mode=='query'):
!         self.dispatchEvent(GFEvent('formALERT','Field is readonly'))
!       elif self._form._currentEntry.editOnNull and \
!            len(self._form._currentEntry.getValue()) > 0 and \
!            not self._form._currentBlock._resultSet.current.isPending():
!         self.dispatchEvent(GFEvent('formALERT','Field cannot be modified 
after entry'));
!       else:
!         if self._form.keyPress(event.data):
!           self.dispatchEvent(GFEvent('updateENTRY',self._form._currentEntry));
!           self.updateRecordStatus()
! 
!   #
!   # removeCharacter
!   #
!   # Called whenever an event source has requested that a
!   # charater be removed from the current entry object
!   #
!   def removeCharacter(self, event):
!     if not self._form._currentEntry.readonly or 
self._form._currentBlock.mode=='query':
!       if event.getEvent() == 'requestBACKSPACE':
!         action = 'backspace'
!       else:
!         action = 'delete'
! 
!       if self._form.removeCharacter(action):
!         self.dispatchEvent(GFEvent('updateENTRY',self._form._currentEntry));
!         self.updateRecordStatus()
!         self.updateRecordStatus()
!     else:
!       self.dispatchEvent(GFEvent('formALERT','Field is readonly'))
  
    #
    # changeFocus
--- 482,526 ----
      self.updateRecordStatus()
      self.updatePageCounter()
  
! ##  #
! ##  # keyPress
! ##  #
! ##  # Called whenever an event source has requested that a
! ##  # charater be inserted into current entry object
! ##  #
! ##  def keyPress(self, event):
! ##    GDebug.printMesg(10, "Keypress event %s"%event.data)
! ##    if (self._form._currentEntry != None):
! ##      if (self._form._currentEntry.readonly and not 
self._form._currentBlock.mode=='query'):
! ##        self.dispatchEvent(GFEvent('formALERT','Field is readonly'))
! ##      elif self._form._currentEntry.editOnNull and \
! ##           len(self._form._currentEntry.getValue()) > 0 and \
! ##           not self._form._currentBlock._resultSet.current.isPending():
! ##        self.dispatchEvent(GFEvent('formALERT','Field cannot be modified 
after entry'));
! ##      else:
! ##        if self._form.keyPress(event.data):
! ##          
self.dispatchEvent(GFEvent('updateENTRY',self._form._currentEntry));
! ##          self.updateRecordStatus()
! ##
! ##  #
! ##  # removeCharacter
! ##  #
! ##  # Called whenever an event source has requested that a
! ##  # charater be removed from the current entry object
! ##  #
! ##  def removeCharacter(self, event):
! ##    if not self._form._currentEntry.readonly or 
self._form._currentBlock.mode=='query':
! ##      if event.getEvent() == 'requestBACKSPACE':
! ##        action = 'backspace'
! ##      else:
! ##        action = 'delete'
! ##
! ##      if self._form.removeCharacter(action):
! ##        self.dispatchEvent(GFEvent('updateENTRY',self._form._currentEntry));
! ##        self.updateRecordStatus()
! ##        self.updateRecordStatus()
! ##    else:
! ##      self.dispatchEvent(GFEvent('formALERT','Field is readonly'))
  
    #
    # changeFocus
***************
*** 508,522 ****
        messageBox.show()
      self.updateRecordStatus()
      self.updateRecordCounter()
! 
!   def replaceValue(self,event):
!     replacement = ""
!     object = event.data[0]
!     value = event.data[1]
!     self._form.replaceValue(object,value)
! 
!     # Hack!
!     self.dispatchEvent(GFEvent('updateDETAILBLOCK',self._form._currentBlock))
  
    #
    # fireTrigger
--- 574,588 ----
        messageBox.show()
      self.updateRecordStatus()
      self.updateRecordCounter()
! ##
! ##  def replaceValue(self,event):
! ##    replacement = ""
! ##    object = event.data[0]
! ##    value = event.data[1]
! ##    self._form.replaceValue(object,value)
! ##
! ##    # Hack!
! ##    
self.dispatchEvent(GFEvent('updateDETAILBLOCK',self._form._currentBlock))
  
    #
    # fireTrigger
***************
*** 525,534 ****
      self._form.fireTrigger(event.data)
  
  
!   def toggleCheckBox(self, event):
!     object = event.data[0]
!     value = event.data[1]
!     object.setValue(value)
  
    #
    #  Activate this puppy...
--- 591,600 ----
      self._form.fireTrigger(event.data)
  
  
! ##  def toggleCheckBox(self, event):
! ##    object = event.data[0]
! ##    value = event.data[1]
! ##    object.setValue(value)
  
    #
    #  Activate this puppy...
Index: gnue/forms/src/GFKeyMapper.py
diff -c gnue/forms/src/GFKeyMapper.py:1.4 gnue/forms/src/GFKeyMapper.py:1.5
*** gnue/forms/src/GFKeyMapper.py:1.4   Thu Jan 31 00:47:24 2002
--- gnue/forms/src/GFKeyMapper.py       Sun Feb 17 01:25:32 2002
***************
*** 269,274 ****
--- 269,278 ----
        (vk.RIGHT,    0, 0, 0) : 'CURSORRIGHT',
        (vk.END,      0, 0, 0) : 'CURSOREND',
        (vk.HOME,     0, 0, 0) : 'CURSORHOME',
+       (vk.LEFT,     1, 0, 0) : 'SELECTLEFT',
+       (vk.RIGHT,    1, 0, 0) : 'SELECTRIGHT',
+       (vk.END,      1, 0, 0) : 'SELECTTOEND',
+       (vk.HOME,     1, 0, 0) : 'SELECTTOHOME',
        (vk.BACKSPACE,0, 0, 0) : 'BACKSPACE',
        (vk.INSERT,   0, 0, 0) : 'MODETOGGLE',
        (vk.DELETE,   0, 0, 0) : 'DELETE',
Index: gnue/forms/src/GFObjects/GFBlock.py
diff -c gnue/forms/src/GFObjects/GFBlock.py:1.37 
gnue/forms/src/GFObjects/GFBlock.py:1.38
*** gnue/forms/src/GFObjects/GFBlock.py:1.37    Fri Feb 15 22:57:55 2002
--- gnue/forms/src/GFObjects/GFBlock.py Sun Feb 17 01:25:32 2002
***************
*** 126,131 ****
--- 126,132 ----
  
    def initialize(self):
      self._form = self.findParentOfType('GFForm')
+     self._page = self.findParentOfType('GFPage')
  
      # Initialize our events system
      GFEventAware.__init__(self, self._form._app.eventController)
Index: gnue/forms/src/GFObjects/GFEntry.py
diff -c gnue/forms/src/GFObjects/GFEntry.py:1.43 
gnue/forms/src/GFObjects/GFEntry.py:1.44
*** gnue/forms/src/GFObjects/GFEntry.py:1.43    Fri Feb 15 23:10:32 2002
--- gnue/forms/src/GFObjects/GFEntry.py Sun Feb 17 01:25:32 2002
***************
*** 115,120 ****
--- 115,121 ----
  
      return GFValue._buildObject(self)
  
+     
    def initialize(self):
      if self.typecast == 'number':
        self._numeric = 1
***************
*** 124,129 ****
--- 125,134 ----
      elif self.case == 'lower':
        self._lowercase = 1
  
+     self._formatmask = ""
+     self._inputmask = ""
+     self._displaymask = ""
+ 
      if hasattr(self,'formatmask') and len(self.formatmask):
        self._formatmask = self.formatmask
        self._inputmask = self.formatmask
***************
*** 168,189 ****
        default = None
  
  
! ##    # Create an appropriate display handler
! ##    if self.style == 'checkbox':
! ##      self.displayHandler = GFDisplayHandler.CheckboxDisplayHandler(self,
! ##               self._maskHandler)
! ##    elif self.style == 'dropdown':
! ##      self.displayHandler = GFDisplayHandler.DropdownDisplayHandler(self,
! ##               self._maskHandler)
! ##    elif self.typecast == 'text':
! ##      self.displayHandler = GFDisplayHandler.TextDisplayHandler(self,
! ##               self._inputmask, self._displaymask, self._formatmask)
! ##    elif self.typecast == 'number':
! ##      self.displayHandler = GFDisplayHandler.NumberDisplayHandler(self,
! ##               self._inputmask, self._displaymask)
! ##    elif self.typecast == 'date':
! ##      self.displayHandler = GFDisplayHandler.DateDisplayHandler(self,
! ##               self._inputmask, self._displaymask)
  
  
  
--- 173,196 ----
        default = None
  
  
!     # Create an appropriate display handler
!     if self.style == 'checkbox':
!       self._displayHandler = GFDisplayHandler.CheckboxDisplayHandler(self,
!                self._block._form._app.eventController, self._maskHandler)
!     elif self.style == 'dropdown':
!       self._displayHandler = GFDisplayHandler.DropdownDisplayHandler(self,
!                self._block._form._app.eventController, self._maskHandler)
!     elif self.typecast == 'text':
!       self._displayHandler = GFDisplayHandler.TextDisplayHandler(self,
!                self._block._form._app.eventController,
!                self._inputmask, self._displaymask, self._formatmask)
!     elif self.typecast == 'number':
!       self._displayHandler = GFDisplayHandler.NumberDisplayHandler(self,
!                self._block._form._app.eventHandler,
!                self._inputmask, self._displaymask)
!     elif self.typecast == 'date':
!       self._displayHandler = GFDisplayHandler.DateDisplayHandler(self,
!                self._block._form._app.eventController, self._inputmask, 
self._displaymask)
  
  
  
***************
*** 274,280 ****
        self.allowedValues()
        
      # If empty skip test
!     # TODO: number type is blowing this function up but I'm not 
      # TODO: sure if jcater wanted to keep data in it's backend
      # TODO: type while in the recordSets
      value = 1
--- 281,287 ----
        self.allowedValues()
        
      # If empty skip test
!     # TODO: number type is blowing this function up but I'm not
      # TODO: sure if jcater wanted to keep data in it's backend
      # TODO: type while in the recordSets
      value = 1
***************
*** 293,299 ****
        rs = 
self._block._form._datasourceDictionary[datasourceName]._currentResultSet
   
        more = rs.firstRecord()
!       while more: 
          if 
string.lower(rs.current.getField(self.foreign_key_description)[:len(value)]) == 
string.lower(value):
            newvalue = rs.current.getField(fieldName)
            if newvalue == self._oldval: continue
--- 300,306 ----
        rs = 
self._block._form._datasourceDictionary[datasourceName]._currentResultSet
   
        more = rs.firstRecord()
!       while more:
          if 
string.lower(rs.current.getField(self.foreign_key_description)[:len(value)]) == 
string.lower(value):
            newvalue = rs.current.getField(fieldName)
            if newvalue == self._oldval: continue
Index: gnue/forms/src/UIbase.py
diff -c gnue/forms/src/UIbase.py:1.55 gnue/forms/src/UIbase.py:1.56
*** gnue/forms/src/UIbase.py:1.55       Sun Feb 17 01:08:46 2002
--- gnue/forms/src/UIbase.py    Sun Feb 17 01:25:32 2002
***************
*** 55,74 ****
      # Events I monitor...
      #
      self.registerEventListeners( {
!             'gotoENTRY'       : self.switchFocus,
!             'updateENTRY'     : self.updateEntry,
!             'gotoPAGE'        : self.gotoPage,
!             'formALERT'       : self.formAlert,
!             'beginWAIT'       : self.beginWait,
!             'endWAIT'         : self.endWait,
!             'uiUPDATESTATUS'  : self.updateStatusBar,
!             'uiABOUT'         : self.aboutBox,
!             'exitApplication' : self.exitApplication,
!             'msgBoxUI'        : self.msgBox,
  
              # Clipboard contents
!             'setCLIPBOARD'    : self.setClipboardContents,
!             'getCLIPBOARD'    : self.getClipboardContents,
            })
  
      # Our local "clipboard"
--- 55,75 ----
      # Events I monitor...
      #
      self.registerEventListeners( {
!             'gotoENTRY'        : self.switchFocus,
!             'updateENTRY'      : self.updateEntry,
!             'updateEntryEditor': self.updateEntryEditor,
!             'gotoPAGE'         : self.gotoPage,
!             'formALERT'        : self.formAlert,
!             'beginWAIT'        : self.beginWait,
!             'endWAIT'          : self.endWait,
!             'uiUPDATESTATUS'   : self.updateStatusBar,
!             'uiABOUT'          : self.aboutBox,
!             'exitApplication'  : self.exitApplication,
!             'msgBoxUI'         : self.msgBox,
  
              # Clipboard contents
!             'setCLIPBOARD'     : self.setClipboardContents,
!             'getCLIPBOARD'     : self.getClipboardContents,
            })
  
      # Our local "clipboard"
***************
*** 92,113 ****
                                            # widgets with the GFObj used as 
the key
  
      self.containerWidgets= ['GFPage']     # GFForm objects that contain others
!     
      self._pageList = []                   # A list of page widgets created by 
the form
!     
      self.keyEvents = {}                   # Keyboard events from the widget 
set the
                                            # UI is expected to respond to
!                                           
      # A dictionary of functions used by buildUI to build the widgets.  Can 
override in
      # UI specific module if necessary.
      self.widgetConstructorFunction = {
!       'GFBox'         : self.stdHandler,          
        'GFButton'      : self.stdHandler,
        'GFEntry'       : self.stdHandler,
        'GFForm'        : self.stdHandler,
!       'GFLabel'       : self.stdHandler,       
!       'GFScrollBar'   : self.stdHandler,    
!       'GFPage'        : self.stdHandler,     
        }
  
    def stdHandler(self):
--- 93,114 ----
                                            # widgets with the GFObj used as 
the key
  
      self.containerWidgets= ['GFPage']     # GFForm objects that contain others
! 
      self._pageList = []                   # A list of page widgets created by 
the form
! 
      self.keyEvents = {}                   # Keyboard events from the widget 
set the
                                            # UI is expected to respond to
! 
      # A dictionary of functions used by buildUI to build the widgets.  Can 
override in
      # UI specific module if necessary.
      self.widgetConstructorFunction = {
!       'GFBox'         : self.stdHandler,
        'GFButton'      : self.stdHandler,
        'GFEntry'       : self.stdHandler,
        'GFForm'        : self.stdHandler,
!       'GFLabel'       : self.stdHandler,
!       'GFScrollBar'   : self.stdHandler,
!       'GFPage'        : self.stdHandler,
        }
  
    def stdHandler(self):
***************
*** 186,194 ****
    # clipboard.
    #
    def getClipboardContents(self, event):
!     event.SetResult(self.__clipboard)
  
    def setClipboardContents(self, event):
      self.__clipboard = "%s" % event.text
  
  
--- 187,197 ----
    # clipboard.
    #
    def getClipboardContents(self, event):
!     print "Getting clipboard '%s'" % self.__clipboard
!     event.__result__ = "%s" % self.__clipboard
  
    def setClipboardContents(self, event):
+     print "Setting clipboard '%s'" % event.text
      self.__clipboard = "%s" % event.text
  
  
***************
*** 238,243 ****
--- 241,248 ----
        index = formObject._visibleIndex
        self._formToUIWidget[formObject].indexedFocus(index)
  
+     self.dispatchEvent(GFEvent('beginEditMode', formObject))
+ 
  
    #
    # aboutBox
***************
*** 267,318 ****
      dialog.Destroy()
  
    #
    # updateEntry
    #
    def updateEntry(self,event):
      if event.data.hidden:
        return
-     index = event.data._visibleIndex
  
!     block = event.data._block
      form = block._form
      currentRecord = block._resultSet.getRecordNumber()
  
!     if hasattr(event.data, 'style'):
!       style = event.data.style
      else:
        style = 'text'
  
      # Fill the prior spots
      if block.mode != 'query':
        for count in range(index):
!         value = 
block._resultSet.getRecord(currentRecord-(index-count)).getField(event.data.field)
  
!         if event.data._maskHandler:
!           value = event.data._maskHandler.getFormattedOutput(value)
  
!         if value == None: value = ""
!         value = str(value) # Done to remove unicode types which wxpython 
doesn't like
!         if style == 'dropdown':
!           value = event.data.allowedValues()[value]
!         elif style == 'checkbox':
!           value = value in (1,'1','T','t','TRUE','true')
!         self._formToUIWidget[event.data].setValue(value,count)
  
      # fill currently indexed spot
!     if style == 'dropdown':
!       value = event.data.allowedValues()["%s" % event.data.getValue()]
!     else:
!       value = event.data.getDisplay( hasFocus= event.data == 
form._currentEntry )
!     value = str(value) # Done to remove unicode types which wxpython doesn't 
like
! 
!     if style == 'checkbox':
!       value = event.data.getValue()
!       value = value in (1,'1','T','t','TRUE','true')
!       self._formToUIWidget[event.data].setValue(value, index)
!     else:
!       self._formToUIWidget[event.data].setValue(value, index)
!       
self._formToUIWidget[event.data].setCursorPosition(event.data._cursorPosition, 
index)
  
      # Fill trailing spots
      #
--- 272,350 ----
      dialog.Destroy()
  
    #
+   # updateEntryEditor
+   #
+   def updateEntryEditor(self, event):
+     print "Refreshing!!2"
+ 
+     index = event.object._visibleIndex
+ 
+     print event.display
+     widget = self._formToUIWidget[event.object]
+     widget.setValue(event.display, index)
+     widget.setCursorPosition(event.cursor, index)
+ 
+     if event.selection != None:
+       selection1, selection2 = event.selection
+       widget.setSelectedArea(selection1, selection2, index)
+ 
+ 
+   #
    # updateEntry
    #
    def updateEntry(self,event):
+ 
      if event.data.hidden:
        return
  
!     entry = event.data
!     handler = entry._displayHandler
! 
!     index = entry._visibleIndex
! 
!     block = entry._block
      form = block._form
      currentRecord = block._resultSet.getRecordNumber()
  
!     if hasattr(entry, 'style'):
!       style = entry.style
      else:
        style = 'text'
  
      # Fill the prior spots
      if block.mode != 'query':
        for count in range(index):
!         handler.setValue(block._resultSet.getRecord(currentRecord- \
!                                 (index-count)).getField(entry.field))
  
!         value = handler.getDisplay()
  
! ##        if value == None: value = ""
! ##        value = str(value) # Done to remove unicode types which wxpython 
doesn't like
! ## ??????
!        ## if style == 'dropdown':
!        ##   value = entry.allowedValues()[value]
! ## ??????
! ##        elif style == 'checkbox':
! ##          value = value in (1,'1','T','t','TRUE','true')
!         self._formToUIWidget[entry].setValue(value,count)
  
      # fill currently indexed spot
! ##    if style == 'dropdown':
! ##      value = entry.allowedValues()["%s" % entry.getValue()]
! ##    else:
! ##      value = handler.getDisplay()
! ##    value = str(value) # Done to remove unicode types which wxpython 
doesn't like
! ##
! ##    if style == 'checkbox':
! ##      value = entry.getValue()
! ##      value = value in (1,'1','T','t','TRUE','true')
! ##      self._formToUIWidget[entry].setValue(value, index)
! ##    else:
!       handler.setValue(entry.getValue())
!       value = handler.getDisplay()
!       self._formToUIWidget[entry].setValue(value, index)
! ##    self._formToUIWidget[entry].setCursorPosition(0, index)
  
      # Fill trailing spots
      #
***************
*** 320,347 ****
      # you do not want to just add 1 to count
      # as the formulas would then be off
      count = index
!     while count < int(event.data._rows):
        if count != index:
          rec = block._resultSet.getRecord(currentRecord+(count-index))
          if rec == None:
            if style == 'checkbox':
              value = int(0)
            else:
              value = ""
          else:
  
!           value = rec.getField(event.data.field)
! 
!           if event.data._maskHandler:
!             value = event.data._maskHandler.getFormattedOutput(value)
! 
!           if value == None: value = ""
!           value = str(value) # Done to remove unicode types which wxpython 
doesn't like
!           if style == 'dropdown':
!             value = event.data.allowedValues()[value]
!           elif style == 'checkbox':
!             value = value in (1,'1','T','t','TRUE','true') # sets to 1 or 0
!         self._formToUIWidget[event.data].setValue(value, count)
        count += 1
  
  
--- 352,378 ----
      # you do not want to just add 1 to count
      # as the formulas would then be off
      count = index
!     while count < int(entry._rows):
        if count != index:
          rec = block._resultSet.getRecord(currentRecord+(count-index))
+ 
          if rec == None:
            if style == 'checkbox':
              value = int(0)
            else:
              value = ""
          else:
+           handler.setValue(rec.getField(entry.field))
+           value = handler.getDisplay()
  
! ##
! ##          if value == None: value = ""
! ##          value = str(value) # Done to remove unicode types which wxpython 
doesn't like
! ##          if style == 'dropdown':
! ##            value = event.data.allowedValues()[value]
! ##          elif style == 'checkbox':
! ##            value = value in (1,'1','T','t','TRUE','true') # sets to 1 or 0
!         self._formToUIWidget[entry].setValue(value, count)
        count += 1
  
  
Index: gnue/forms/src/UIwxpython.py
diff -c gnue/forms/src/UIwxpython.py:1.141 gnue/forms/src/UIwxpython.py:1.142
*** gnue/forms/src/UIwxpython.py:1.141  Sun Feb 17 01:19:29 2002
--- gnue/forms/src/UIwxpython.py        Sun Feb 17 01:25:32 2002
***************
*** 213,218 ****
--- 213,226 ----
      fileMenu.Append( 101, "E&xit",GConfig.get('msg_exit'))
      EVT_MENU(self._wxapp, 101,  self.menuExitEvent)
  
+     editMenu = wxMenu()
+     editMenu.Append(401, "Cut","Copy the selected text")
+     EVT_MENU(self._wxapp, 401, lambda event, l=self: 
l.dispatchEvent(GFEvent('requestCUT')))
+     editMenu.Append(402, "Copy","Copy the selected text")
+     EVT_MENU(self._wxapp, 402, lambda event, l=self: 
l.dispatchEvent(GFEvent('requestCOPY')))
+     editMenu.Append(403, "Paste","Copy the selected text")
+     EVT_MENU(self._wxapp, 403, lambda event, l=self: 
l.dispatchEvent(GFEvent('requestPASTE')))
+ 
      dataMenu = wxMenu()
      dataMenu.Append( 201, "Next Record             
(Up)",GConfig.get('msg_next'))
      EVT_MENU(self._wxapp, 201, lambda event, l=self: 
l.dispatchEvent(GFEvent('requestNEXTRECORD')))
***************
*** 241,246 ****
--- 249,255 ----
  
      menuBar = wxMenuBar()
      menuBar.Append( fileMenu, "&File" )
+     menuBar.Append( editMenu, "&Edit" )
      menuBar.Append( dataMenu, "&Data" )
      menuBar.Append( helpMenu, "&Help" )
  
***************
*** 348,354 ****
  
      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
      #
--- 357,363 ----
  
      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
      #
***************
*** 499,505 ****
        self.widgets[index].SetInsertionPoint(position)
      except AttributeError:
        pass  # For label-style entries
!     
    def _addToCrossRef(self, widget,gfobject, uiobject):
      id = widget.GetId()
      _IdToWxObj[id]=widget
--- 508,520 ----
        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:
!       pass  # For label-style entries
! 
    def _addToCrossRef(self, widget,gfobject, uiobject):
      id = widget.GetId()
      _IdToWxObj[id]=widget
***************
*** 508,519 ****
  
    def createWidget(self, object, container, textWidth, textHeight,
                     widgetWidth, widgetHeight, interface, spacer,initialize=1):
!     
      newWidget = self._createWidget(object, container, textWidth, textHeight,
                                     widgetWidth, widgetHeight, interface, 
spacer,initialize)
      initFont(newWidget)
      self._addToCrossRef(newWidget,object,self)
      return newWidget
  #
  # UILabel
  #
--- 523,535 ----
  
    def createWidget(self, object, container, textWidth, textHeight,
                     widgetWidth, widgetHeight, interface, spacer,initialize=1):
! 
      newWidget = self._createWidget(object, container, textWidth, textHeight,
                                     widgetWidth, widgetHeight, interface, 
spacer,initialize)
      initFont(newWidget)
      self._addToCrossRef(newWidget,object,self)
      return newWidget
+ 
  #
  # UILabel
  #
***************
*** 651,657 ****
        # To make the label consistent with the other entry styles...
        newWidget.SetValue = newWidget.SetLabel
        newWidget.GetValue = newWidget.GetLabel
!       
      elif style == 'checkbox':
        newWidget = wxCheckBox(container, -1, "",defaultPoint,
                               
wxSize(int(2)*int(textWidth),int(1)*int(textHeight)),
--- 667,673 ----
        # To make the label consistent with the other entry styles...
        newWidget.SetValue = newWidget.SetLabel
        newWidget.GetValue = newWidget.GetLabel
! 
      elif style == 'checkbox':
        newWidget = wxCheckBox(container, -1, "",defaultPoint,
                               
wxSize(int(2)*int(textWidth),int(1)*int(textHeight)),
***************
*** 705,711 ****
        #  self.dispatchEvent(action)
  
  
!                             
  #
  # UIForm
  #
--- 721,727 ----
        #  self.dispatchEvent(action)
  
  
! 
  #
  # UIForm
  #
***************
*** 729,740 ****
        EVT_NOTEBOOK_PAGE_CHANGING(newWidget, newWidget.GetId(), 
self.notebookTabHandler)
  
        _NOTEBOOK  = newWidget
!     else:                      
        newWidget = wxPanel(interface.mainWindow.panel,-1, wxDefaultPosition)
!       
!     if initialize: 
        EVT_CLOSE(interface.mainWindow,interface.closeTrap)
!       
      return newWidget
  
    def notebookTabHandler(self,event):
--- 745,756 ----
        EVT_NOTEBOOK_PAGE_CHANGING(newWidget, newWidget.GetId(), 
self.notebookTabHandler)
  
        _NOTEBOOK  = newWidget
!     else:
        newWidget = wxPanel(interface.mainWindow.panel,-1, wxDefaultPosition)
! 
!     if initialize:
        EVT_CLOSE(interface.mainWindow,interface.closeTrap)
! 
      return newWidget
  
    def notebookTabHandler(self,event):
***************
*** 742,753 ****
        print "HOO"
        action = None
        global _LOOPTRAP
!       
        if _LOOPTRAP == 0:
          action = GFEvent('requestPAGE',event.GetSelection())
  
        _LOOPTRAP = not _LOOPTRAP # flip the value
!       
      if action:
        _EVENTPROCESSOR(action)
  
--- 758,769 ----
        print "HOO"
        action = None
        global _LOOPTRAP
! 
        if _LOOPTRAP == 0:
          action = GFEvent('requestPAGE',event.GetSelection())
  
        _LOOPTRAP = not _LOOPTRAP # flip the value
! 
      if action:
        _EVENTPROCESSOR(action)
  
***************
*** 860,866 ****
      self._eventProcessor(GFEvent('requestCURSORMOVE',position=cursorPosition))
  
      event.Skip()
!         
  class keyboardEvtHandler(uiBaseEvtHandler):
    def __init__(self, eventProcessor):
      eventList = [wxEVT_CHAR,wxEVT_KEY_DOWN]
--- 876,882 ----
      self._eventProcessor(GFEvent('requestCURSORMOVE',position=cursorPosition))
  
      event.Skip()
! 
  class keyboardEvtHandler(uiBaseEvtHandler):
    def __init__(self, eventProcessor):
      eventList = [wxEVT_CHAR,wxEVT_KEY_DOWN]
***************
*** 960,966 ****
        loginButton = wxButton(self.dlg,19998,'Login')
        cancelButton = wxButton(self.dlg,19999,'Cancel')
  
!       EVT_BUTTON(self.dlg, 19998, self.loginButtonEventTrap)                
        EVT_BUTTON(self.dlg, 19999, self.loginCancelEventTrap)                
        dlgWidth = max(dlgWidth, loginButton.GetSize().GetWidth() + 
                              cancelButton.GetSize().GetWidth() + 6) + 20
--- 976,982 ----
        loginButton = wxButton(self.dlg,19998,'Login')
        cancelButton = wxButton(self.dlg,19999,'Cancel')
  
!       EVT_BUTTON(self.dlg, 19998, self.loginButtonEventTrap)
        EVT_BUTTON(self.dlg, 19999, self.loginCancelEventTrap)                
        dlgWidth = max(dlgWidth, loginButton.GetSize().GetWidth() + 
                              cancelButton.GetSize().GetWidth() + 6) + 20
***************
*** 1007,1013 ****
                                              
cancelButton.GetSize().GetHeight())))
  
        self.loginButton = loginButton
!   
        self.dlg.SetSize(wxSize(dlgWidth, dlgHeight))
  
  
--- 1023,1029 ----
                                              
cancelButton.GetSize().GetHeight())))
  
        self.loginButton = loginButton
! 
        self.dlg.SetSize(wxSize(dlgWidth, dlgHeight))
  
  



reply via email to

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