commit-gnue
[Top][All Lists]
Advanced

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

[gnue] r7862 - in trunk/gnue-forms/src: . GFObjects input input/displayH


From: jamest
Subject: [gnue] r7862 - in trunk/gnue-forms/src: . GFObjects input input/displayHandlers
Date: Sat, 13 Aug 2005 15:40:32 -0500 (CDT)

Author: jamest
Date: 2005-08-13 15:40:30 -0500 (Sat, 13 Aug 2005)
New Revision: 7862

Added:
   trunk/gnue-forms/src/input/
   trunk/gnue-forms/src/input/__init__.py
   trunk/gnue-forms/src/input/displayHandlers/
   trunk/gnue-forms/src/input/displayHandlers/Base.py
   trunk/gnue-forms/src/input/displayHandlers/Checkbox.py
   trunk/gnue-forms/src/input/displayHandlers/Component.py
   trunk/gnue-forms/src/input/displayHandlers/Cursor.py
   trunk/gnue-forms/src/input/displayHandlers/DateTime.py
   trunk/gnue-forms/src/input/displayHandlers/Dropdown.py
   trunk/gnue-forms/src/input/displayHandlers/Image.py
   trunk/gnue-forms/src/input/displayHandlers/Listbox.py
   trunk/gnue-forms/src/input/displayHandlers/Numeric.py
   trunk/gnue-forms/src/input/displayHandlers/Password.py
   trunk/gnue-forms/src/input/displayHandlers/Text.py
   trunk/gnue-forms/src/input/displayHandlers/__init__.py
Removed:
   trunk/gnue-forms/src/GFDisplayHandler.py
Modified:
   trunk/gnue-forms/src/GFObjects/GFComponent.py
   trunk/gnue-forms/src/GFObjects/GFEntry.py
   trunk/gnue-forms/src/GFObjects/GFImage.py
   trunk/gnue-forms/src/GFObjects/GFTree.py
Log:
initial move from GFDisplayHandler to forms.input.displayHanders.*
remove use of string module from display handlers
docstrings


Deleted: trunk/gnue-forms/src/GFDisplayHandler.py
===================================================================
--- trunk/gnue-forms/src/GFDisplayHandler.py    2005-08-13 18:00:25 UTC (rev 
7861)
+++ trunk/gnue-forms/src/GFDisplayHandler.py    2005-08-13 20:40:30 UTC (rev 
7862)
@@ -1,1211 +0,0 @@
-
-# This file is part of GNU Enterprise.
-#
-# GNU Enterprise is free software; you can redistribute it
-# and/or modify it under the terms of the GNU General Public
-# License as published by the Free Software Foundation; either
-# version 2, or (at your option) any later version.
-#
-# GNU Enterprise is distributed in the hope that it will be
-# useful, but WITHOUT ANY WARRANTY; without even the implied
-# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-# PURPOSE. See the GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public
-# License along with program; see the file COPYING. If not,
-# write to the Free Software Foundation, Inc., 59 Temple Place
-# - Suite 330, Boston, MA 02111-1307, USA.
-#
-# Copyright 2002-2005 Free Software Foundation
-#
-# FILE:
-# GFDisplayHandler.py
-#
-# DESCRIPTION:
-"""
-DisplayHandler classes for Forms input validation
-"""
-# NOTES:
-#
-
-import sys, string, time, types
-
-from gnue.common.utils.FileUtils import openResource
-from gnue.common.formatting import DateMask, TextMask, NumberMask
-from gnue.common.apps import GDebug
-from gnue.common import events
-
-try:
-  import Image
-except ImportError:
-  Image = None
-
-try:
-  from mx.DateTime import DateTime, mktime
-except ImportError:
-  print """
-   This GNUe tool requires mxDateTime to be installed
-
-   You can find the mxDateTime at
-
-   http://www.lemburg.com/files/python/mxDateTime.html
-
-"""
-  import sys
-  sys.exit()
-
-#############################################################################
-#
-# Base handler
-#
-# Do not use this handler directly.
-# You should be using one of the
-# other types based on this one.
-#
-class FieldDisplayHandler(events.EventAware):
-
-
-  #####################
-  #
-  # General methods
-  #
-
-  def setValue(self, value):
-    self.modified = False
-    self.value = value
-    self._buildDisplay()
-
-
-  def getValue(self):
-    return self.value
-
-
-##   def getDisplay(self):
-##     return self.display
-
-
-  def getDisplayFiller(self, value):
-    return self._buildDisplayHelper(value, False)
-
-
-  def generateRefreshEvent(self):
-    gDebug (5, "generateRefreshEvent on %s '%s' %s" % \
-        (self, self.display, self.entry))
-    # TODO: this should probably actually happen in UIwxpython!
-    if (self.handleCR and type(self.display)=='str'):
-      self.dispatchEvent(events.Event('updateEntryEditor',
-           object = self.field,
-           display=self.display, # string.replace(self.display,'\n','\r\n'),
-           cursor=self.cursor + 
len(string.split(self.display[:self.cursor+1],'\n'))-1,
-           selection=self.getSelectionArea(),
-         ))
-    else:
-      self.dispatchEvent(events.Event('updateEntryEditor',
-           object = self.entry,
-           display=self.display,
-           cursor=self.cursor,
-           selection=self.getSelectionArea(),
-         ))
-
-  def isPending(self):
-    return self.editing and self.modified
-
-  #####################
-  #
-  # Editing methods
-  #
-
-  #
-  # beginEdit
-  # called when a widget first gets focus
-  #
-  def beginEdit(self, event):
-    """
-    Called when a widget first gets focus.
-    """
-    self.editing = self.field.isEditable(event._form.getCurrentMode())
-    self.modified = False
-
-    # TODO: Replace with formatter
-    self.setValue(self.field.getValue())
-    self.work = self._buildDisplayHelper(self.value, False)
-    self._buildDisplay()
-
-    self.cursor = len(self.display)
-    # Ensure cursor is properly placed.
-    self.generateRefreshEvent()
-
-  #
-  # endEdit
-  # called when a widget loses focus or
-  # when enter is hit
-  #
-  def endEdit(self, event):
-    """
-    Called when a widget loses focus or when ENTER is hit.
-    """
-    if not self.editing:
-      return
-
-    if not self._loadedAllowedValues:
-      self.field.allowedValues()
-      self._loadedAllowedValues = True
-
-
-    # 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():
-        if self.field._allowedValues and \
-           not self.field._allowedValues.has_key("%s" % self.value):
-          self.work = ""
-          event.__error__ = True
-          event.__errortext__ = u_("Invalid value '%s' for field") % self.value
-          return
-
-        self.editing = False
-        event.__results__ = self.value
-        event.modified = self.modified
-        self.field.setValue(self.value)
-
-        self._buildDisplay()
-
-      else:
-        self.dispatchEvent(events.Event('formALERT',
-          u_("Invalid input: '%s'") % self.work,_form=event._form))
-    else:
-      self.editing = False
-
-
-  def addText(self, event):
-
-    if not self.editing:
-      return
-
-    value = event.text
-
-    # Do some appropriate checks on the text
-    # TODO: This will be moved to the mask system!!
-
-    if self.field._lowercase:
-      value = string.lower(event.text)
-    if self.field._uppercase:
-      value = string.upper(event.text)
-
-    if hasattr(self.field,'maxLength') and \
-       len(self.work)  + len(value) > self.field.maxLength:
-      return
-
-    if ( self.field._numeric and \
-         self.field._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(value)
-
-
-    event.__dropped__ = True
-    event.refreshDisplay = True
-    self.modified = True
-    self._buildDisplay()
-
-    # Update the field. This means PRE-CHANGE and POST-CHANGE will get fired
-    # now. For now, only do this here if we are a lookup.
-    if hasattr(self.field, 'fk_source'):
-      self._buildValue()
-      self.field.setValue(self.value)
-
-  # Insert text at defined position
-  def insertTextAt(self, event):
-    if not self.editing:
-      return
-
-    # set cursor position
-    self.cursor = event.position
-
-    # add the event text
-    self.addText(event)
-
-  # Delete Text Range
-  def deleteRange(self, event):
-    if not self.editing:
-      return
-
-    self.selection1 = event.start_pos
-    self.selection2 = event.end_pos
-    self.cursor     = event.position
-    self.delete (event)
-
-  # Handle <Enter> key for multiline entries
-  def __handleENTER(self, event):
-    if gConfigForms('EnterIsNewLine') and \
-       hasattr(self.entry, 'Char__height') and \
-       self.entry.Char__height > 1:
-      event.text = '\n'
-      self.addText(event)
-      event.drop()
-
-  # Delete backwards one character
-  def backspace(self, event):
-    if not self.editing:
-      return
-
-
-    # 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 = True
-      event.text = ""
-
-      self.addText(event)
-
-  # Delete forward one character
-  def delete(self, event):
-    if not self.editing:
-      return
-
-    event.overstrike = True
-    event.text = ""
-
-    self.addText(event)
-
-
-  #####################
-  #
-  # Cursor movement
-  #
-
-  def moveCursorRelative(self, relative):
-    pass
-
-
-  def moveCursor(self, event, selecting=False):
-    if not selecting:
-      self.selection1 = None
-
-    self.cursor = min(event.position, len(self.display))
-    event.refreshDisplay = True
-
-
-  def moveCursorLeft(self, event, selecting=False):
-    if not selecting:
-      self.selection1 = None
-
-    if self.cursor > 0:
-      self.cursor -= 1
-      event.refreshDisplay = True
-
-  def moveCursorRight(self, event, selecting=False):
-    if not selecting:
-      self.selection1 = None
-
-    if self.cursor < len(self.display):
-      self.cursor += 1
-      event.refreshDisplay = True
-
-  def moveCursorToEnd(self, event, selecting=False):
-    if not selecting:
-      self.selection1 = None
-
-    self.cursor = len(self.display)
-    event.refreshDisplay = True
-
-
-  def moveCursorToBegin(self, event, selecting=False):
-    if not selecting:
-      self.selection1 = None
-
-    self.cursor = 0
-    event.refreshDisplay = True
-
-
-  #####################
-  #
-  # 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 text with mouse and move the cursor
-  def selectWithMouse(self, event):
-
-    self.selection1 = event.position1
-    self.selection2 = event.position2
-    if self.cursor == self.selection2:
-      event.position = self.selection1
-    else:
-      event.position = self.selection2
-    self.moveCursor(event, True)
-
-
-  # Select the entire text of the entry and move
-  # the cursor to the end
-  def selectAll (self, event):
-
-    self.selection1 = 0
-    self.moveCursorToEnd (event, True)
-    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, True)
-    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, True)
-    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, True)
-    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, True)
-    self.selection2 = self.cursor
-
-
-  # Copy to the clipboard
-  def clipboardCopy(self, event):
-
-    if self.selection1 != None:
-      sel1, sel2 = self.getSelectionArea ()
-      self.dispatchEvent (events.Event ('setCLIPBOARD',
-               text = self.display [sel1:sel2]))
-
-    event.refreshDisplay = False
-
-
-  def clipboardCut(self, event):
-    if not self.editing:
-      return self.clipboardCopy(event)
-
-    self.clipboardCopy(event)
-    edevent = events.Event("requestKEYPRESS", text="", _form=event._form)
-    self.dispatchEvent(edevent)
-
-
-  def clipboardPaste(self, event):
-    if not self.editing:
-      return
-
-    event.text = self.dispatchEvent(events.Event('getCLIPBOARD'))
-    if event.text != None:
-      self.addText(event)
-
-
-  #####################
-  #
-  # Internal methods
-  #
-  def __init__(self, entry, eventHandler, subEventHandler, formatter=None):
-    events.EventAware.__init__(self, eventHandler)
-
-    self.entry = entry            # Our entry
-    self.field = entry._field
-    self.editing = False          # In editing mode??
-    self.modified = False         # 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
-    self._loadedAllowedValues = False # the allowed values already been loaded
-    self.subEventHandler = subEventHandler
-
-    # TODO: replace w/an event that asks the
-    # TODO: UIdriver if this should happen!
-    self.handleCR = sys.platform == "win32"
-
-    # Needs to be set by the child classes
-    self.formatter = formatter
-
-    self.subEventHandler.registerEventListeners( {
-
-                 # "Entry" events
-                 'requestKEYPRESS'     : self.addText,
-                 'requestENTER'        : self.__handleENTER,
-                 '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
-                 'requestSELECTWITHMOUSE' : self.selectWithMouse,
-                 'requestSELECTALL'    : self.selectAll,
-                 'requestSELECTTOHOME' : self.selectToBegin,
-                 'requestSELECTTOEND'  : self.selectToEnd,
-                 'requestSELECTLEFT'   : self.selectLeft,
-                 'requestSELECTRIGHT'  : self.selectRight,
-                 'requestCOPY'         : self.clipboardCopy,
-                 'requestCUT'          : self.clipboardCut,
-                 'requestPASTE'        : self.clipboardPaste,
-
-                 # Request for direct buffer manipulation
-                 'requestINSERTAT'     : self.insertTextAt,
-                 'requestDELETERANGE'  : self.deleteRange,
-        })
-
-
-  def _buildValue(self):
-    if self.field._allowedValues:
-      if self.work == "":
-        self.value = '' # None
-      else:
-        if self.field._allowedValuesReverse.has_key (self.display):
-          self.value = self.field._allowedValuesReverse [self.display]
-        else:
-          self.value = None
-          return False
-    else:
-      self.value = self.work
-    return True
-
-
-  def _buildDisplayHelper(self, value, editing):
-    if self.field._allowedValues:
-      if editing:
-        val = value.lower ()
-
-        for disp in self.field._allowedValuesDescr:
-          if disp [:len (val)].lower () == val:
-            revVal = self.field._allowedValuesReverse [disp]
-            return self.field._allowedValues [revVal]
-
-        return value
-
-      if self.field._allowedValues.has_key ("%s" % value):
-        return self.field._allowedValues ["%s" % value]
-      else:
-        return ""
-
-    else:
-      if value == None:
-        return ""
-      else:
-        return "%s" % value
-
-  def _buildDisplay(self):
-    if self.editing:
-      self.display = self._buildDisplayHelper(self.work, True)
-    else:
-      self.display = self._buildDisplayHelper(self.value, False)
-
-
-
-#############################################################################
-#
-#
-#
-class TextDisplayHandler(FieldDisplayHandler):
-  def __init__(self, entry, eventHandler, subEventHandler, displayMask,
-               inputMask):
-##    FieldDisplayHandler.__init__(self, entry, eventHandler,
-##            TextMask.TextMask(displayMask, inputMask, formatMask))
-    FieldDisplayHandler.__init__(self, entry, eventHandler, subEventHandler,
-                                 None)
-
-
-#############################################################################
-#
-#
-#
-class PasswordDisplayHandler(TextDisplayHandler):
-  def __init__(self, entry, eventHandler, subEventHandler, displayMask,
-               inputMask):
-##    FieldDisplayHandler.__init__(self, entry, eventHandler,
-##            TextMask.TextMask(displayMask, inputMask, formatMask))
-    FieldDisplayHandler.__init__(self, entry, eventHandler, subEventHandler,
-                                 None)
-
-  #
-  # beginEdit
-  # called when a widget first gets focus
-  #
-  def beginEdit(self, event):
-    """
-    Called when a widget first gets focus.
-    """
-    self.editing = self.field.isEditable(event._form.getCurrentMode())
-    self.modified = False
-
-    # TODO: Replace with formatter
-    self.setValue(self.field.getValue())
-    self.work = self.value
-    self._buildDisplay()
-
-    self.cursor = len(self.display)
-    # Ensure cursor is properly placed.
-    self.generateRefreshEvent()
-
-
-  def _buildDisplayHelper(self, value, editing):
-    if value == None:
-      return ""
-    else:
-      return "*" * len(str(value))
-
-  # These are no-no's for password-type fields
-  def clipboardCopy(self, event):
-    pass
-
-  def clipboardCut(self, event):
-    pass
-
-
-#############################################################################
-#
-# Handler for Numeric types
-#
-class NumberDisplayHandler(FieldDisplayHandler):
-  def __init__(self, entry, eventHandler, subEventHandler, displayMask,
-               inputMask):
-##    FieldDisplayHandler.__init__(self, entry, eventHandler,
-##            DateMask.DateMask(displayMask, inputMask, displayMask))
-    FieldDisplayHandler.__init__(self, entry, eventHandler, subEventHandler,
-                                 None)
-
-
-  def setValue(self, value):
-    if value in (None,""):
-      value = None
-    else:
-      value = value
-
-    return FieldDisplayHandler.setValue(self, value)
-
-
-  # TODO: Replace with format mask
-  def _buildDisplayHelper(self, val, editing):
-    try:
-      if val in (None,""):
-        return ""
-    except TypeError:
-      pass
-
-    if editing and type(val) == types.StringType:
-      return val
-
-#     if float(val) == val:
-#    try:
-    value = val
-    try:
-        if int(value) == value:
-          value = "%d" % value
-        else:
-          value = "%s" % value
-    except OverflowError:
-        value = "%s" % value
-    except ValueError:
-        value = "%s" % value
-#     else:
-#       value = "%s" % val
-#     if not editing:
-#       # Comma-fy (Temporary!)
-#       if value[:1] == '-':
-#         minus = "-"
-#         value = value[1:]
-#       else:
-#         minus = ""
-#
-#       try:
-#         whole, decimal = string.split(value,'.')
-#         value = ".%s" % decimal
-#       except ValueError:
-#         whole = value
-#         value = ""
-#
-#       while len(whole) > 3:
-#         value = ",%s%s" % (whole[-3:], value)
-#         whole = whole[:-3]
-#
-#       value = minus + whole + value
-
-    return value
-
-
-  def _buildValue(self):
-    if not len(self.work):
-      self.value = None
-      return True
-
-    try:
-      dummy = float(self.work)
-      self.value = self.work
-      return True
-    except ValueError:
-      return False
-
-
-
-
-#############################################################################
-#
-# Handler for Date types
-#
-class DateDisplayHandler(FieldDisplayHandler):
-  def __init__(self, entry, eventHandler, subEventHandler, displayMask,
-               inputMask):
-##    FieldDisplayHandler.__init__(self, entry, eventHandler,
-##            DateMask.DateMask(displayMask, inputMask, displayMask))
-    FieldDisplayHandler.__init__(self, entry, eventHandler, subEventHandler,
-                                 None)
-    self.__displayMask = displayMask
-    self.__inputMask = inputMask
-
-
-  def setValue(self, value):
-    return FieldDisplayHandler.setValue(self, value)
-
-
-  # TODO: Replace with format mask
-  def _buildDisplayHelper(self, value, editing):
-    if editing:
-      if self.__inputMask:
-        format = self.__inputMask
-      else:
-        format = "%m/%d/%Y"
-    else:
-      if self.__displayMask:
-        format = self.__displayMask
-      else:
-        format = "%m/%d/%y"
-
-##    print "format=%s, value=%s, type=%s" % (format, value, type(value))
-    if value in (None,""):
-      return ""
-    try:
-      return value.strftime (str (format))
-    except AttributeError:
-      return str(value)
-
-
-  def _buildValue(self):
-
-    if not len(self.work):
-      self.value = None
-      return 1
-
-    # TODO: Replace with format mask
-    if self.__inputMask:
-      try:
-        # mx.DateTime.strptime is not available under windows
-        self.value = mktime (time.strptime (self.work, self.__inputMask))
-      except:
-        return 0
-      return 1
-    try:
-      value = string.replace(string.replace(self.work,'.','/'),'-','/')
-
-      # Support for quick entry like '123102' for '12/31/02'
-      if len(value) in (6,8) and string.find(value,'/') == -1:
-        month = value[:2]
-        day = value[2:4]
-        year = value[4:]
-      else:
-        month, day, year = string.split(value,'/')
-
-      year = int(year)
-      if year < 100:
-        if year > 50:
-          year = year + 1900
-        else:
-          year = year + 2000
-
-      self.value = DateTime(year, int(month), int(day))
-
-      return 1
-    except:
-      return 0
-
-
-
-#############################################################################
-#
-# Handler for dropdowns
-#
-class DropdownDisplayHandler(FieldDisplayHandler):
-
-  def __init__(self, *args, **params):
-
-    FieldDisplayHandler.__init__(self, *args, **params)
-
-    # My events...
-    self.subEventHandler.registerEventListeners( {
-           'requestREPLACEVALUE' : self.replaceText,
-           'requestCOMBODROPPED' : self.beginEdit } )
-
-
-  def beginEdit(self, event):
-
-    if self.editing == True and self.modified == False:
-      return
-
-    if not self._loadedAllowedValues and not 
hasattr(self.field,'_allowedValues'):
-      self.field.allowedValues()
-      self._loadedAllowedValues = True
-
-    self.editing = self.field.isEditable(event._form.getCurrentMode())
-    self.modified = False
-
-    # TODO: Replace with formatter
-    self.setValue(self.field.getValue())
-
-    if self.value == None:
-      self.work = ""
-    else:
-      try:
-        self.work = self.field._allowedValues ["%s" % self.value]
-      except KeyError:
-        self.work = ""
-        event.__error__ = True
-        event.__errortext__ = u_("Invalid value '%s' for keyed pull-down "
-                                 "field") % self.value
-
-    self._buildDisplay()
-
-    self.cursor = len(self.display)
-
-
-
-  # TODO: Replace with format mask
-  def _buildDisplayHelper(self, value, editing):
-    if value in (None,""):
-      return ""
-
-    if editing:
-      val = string.lower(value)
-      for disp in self.field._allowedValuesDescr:
-        if string.lower(disp[:len(val)]) == val:
-          display = 
self.field._allowedValues[self.field._allowedValuesReverse[disp]]
-          return display
-      return value
-
-    if self.field._allowedValues.has_key ("%s" % value):
-      return self.field._allowedValues ["%s" % value]
-    else:
-      return ""
-
-  def _buildDisplay(self):
-    if self.editing:
-      self.display = self._buildDisplayHelper(self.work, True)
-      if self.cursor > len(self.work):
-        self.work = self.display
-    else:
-      self.display = self._buildDisplayHelper(self.value, False)
-
-
-  def replaceText (self, event):
-    if not self.editing:
-      return
-
-    self.selection1 = 0
-    self.selection2 = len (self.display)
-    self.addText (event)
-
-# TODO: Kills dropdown handling with keyboard on win32
-# TODO: needs more work :(
-#    self.endEdit(event) # Hack: allows dropdowns to change field
-                        # value immediately (causes post-change
-                        # on the field to fire).
-                        # I don't think it'll hurt anything.
-                        # if it does then we'll need to pull
-                        # the logic from FieldDisplayHandler.endEdit
-                        # and add here.  - jamest
-
-
-
-#############################################################################
-#
-# Handler for Listbox types
-#
-class ListboxDisplayHandler(FieldDisplayHandler):
-
-  def __init__(self, *args, **params):
-
-    FieldDisplayHandler.__init__(self, *args, **params)
-
-    # My events...
-    self.subEventHandler.registerEventListeners( {
-           'requestREPLACEVALUE' : self.replaceText } )
-
-
-  def beginEdit(self, event):
-    if self.editing == True and self.modified == False:
-      return
-
-    if not self._loadedAllowedValues and not 
hasattr(self.field,'_allowedValues'):
-      self.field.allowedValues()
-      self._loadedAllowedValues = True
-
-    self.editing = True
-    self.modified = False
-
-    # TODO: Replace with formatter
-    self.setValue(self.field.getValue())
-
-    if self.value == None:
-      self.work = ""
-    else:
-      try:
-        self.work = self.field._allowedValues ["%s" % self.value]
-      except KeyError:
-        self.work = ""
-        event.__error__ = True
-        event.__errortext__ = u_("Invalid value '%s' for keyed pull-down "
-                                 "field") % self.value
-
-    self._buildDisplay()
-
-    self.cursor = len(self.display)
-
-  # TODO: Replace with format mask
-  def _buildDisplayHelper(self, value, editing):
-    if value in (None,""):
-      return ""
-
-    if editing:
-      val = string.lower(value)
-      for disp in self.field._allowedValuesDescr:
-        if string.lower(disp[:len(val)]) == val:
-          display = 
self.field._allowedValues[self.field._allowedValuesReverse[disp]]
-          return display
-      return value
-
-    if self.field._allowedValues.has_key ("%s" % value):
-      return self.field._allowedValues ["%s" % value]
-    else:
-      return ""
-
-  def _buildDisplay(self):
-    if self.editing:
-      self.display = self._buildDisplayHelper(self.work, True)
-      if self.cursor > len(self.work):
-        self.work = self.display
-    else:
-      self.display = self._buildDisplayHelper(self.value, False)
-
-
-  def replaceText(self, event):
-    self.selection1 = 0
-    self.selection2 = len(self.display)
-    self.addText(event)
-
-
-
-#############################################################################
-#
-# Handler for Checkbox types
-#
-class CheckboxDisplayHandler(FieldDisplayHandler):
-
-  def __init__(self, *args, **params):
-
-    self.trueValue = gConfigForms("checkboxTrue")
-    self.falseValue = gConfigForms("checkboxFalse")
-
-    self.trueValues =  ('Y','y','T','t','1','x','X', self.trueValue)
-    self.falseValues = ('N','n','F','f','0','', ' ', self.falseValue)
-
-    FieldDisplayHandler.__init__(self, *args, **params)
-
-    # My events...
-    self.subEventHandler.registerEventListeners( {
-           'requestTOGGLECHKBOX' : self.handleToggleChkbox} )
-
-
-  def setValue(self, value):
-    # Force to 0 or 1
-    self.value = self._sanitizeValue(value)
-
-    self.modified = False
-    self._buildDisplay()
-
-
-  def _sanitizeValue(self, value):
-    if ("%s" % value)[:1] in self.trueValues:
-      return True
-    elif ("%s" % value)[:1] in self.falseValues:
-      return False
-    else:
-      return value and True or False
-
-  def _buildValue(self):
-    self.value = self.work
-    return True
-
-
-  # TODO: Replace with format mask
-  def _buildDisplayHelper(self, value, editing):
-    return self._sanitizeValue(value)
-
-
-  # Helpers for user events:
-
-  # Set checkbox to boolean value
-  def __set (self, value):
-    if value != self.work:
-      self.work = value
-      self.modified = True
-      self._buildDisplay ()
-
-  # Toggle value of checkbox
-  def __toggle (self):
-    self.work = not self.work
-    self.modified = True
-    self._buildDisplay ()
-
-
-  # Handle requestTOGGLECHKBOX event
-  def handleToggleChkbox (self, event):
-    if not self.editing:
-      return
-    if event.data == None:
-      self.__toggle ()
-    else:
-      self.__set (self._sanitizeValue (event.data [1]))
-    event.refreshDisplay = True
-
-
-  def beginEdit(self, event):
-
-    self.editing = self.field.isEditable(event._form.getCurrentMode())
-    self.modified = False
-
-    self.setValue(self.field.getValue())
-
-    self.work = self.value
-
-    self._buildDisplay()
-
-    self.cursor = 0
-
-
-  # Correctly handle requestKEYPRESS event
-  def addText(self, event):
-    if event.text == ' ':
-      self.__toggle ()
-    elif event.text in ['0', '-']:      # TODO: add "Y" for current language
-      self.__set (False)
-    elif event.text in ['1', '+']:      # TODO: add "N" for current language
-      self.__set (True)
-    event.refreshDisplay = True
-    return
-
-  # Delete backwards one character
-  def backspace(self, event):
-    return
-
-  # Delete forward one character
-  def delete(self, event):
-    return
-
-  def moveCursorRelative(self, relative):
-    return
-
-
-  def moveCursor(self, event, selecting=False):
-    return
-
-
-  def moveCursorLeft(self, event, selecting=False):
-    return
-
-
-  def moveCursorRight(self, event, selecting=False):
-    return
-
-
-  def moveCursorToEnd(self, event, selecting=False):
-    return
-
-
-  def moveCursorToBegin(self, event, selecting=False):
-    return
-
-
-  #####################
-  #
-  # Selection stuff
-  #
-
-  # Set the selection area
-  def setSelectionArea(self, cursor1, cursor2):
-    return
-
-
-  # Return the selected area as a tuple (or
-  # None if no selection)
-  def getSelectionArea(self):
-    return
-
-
-  # Select the entire text of the entry and move
-  # the cursor to the end
-  def selectAll(self, event):
-    return
-
-
-  # Move the selection cursor to the left one unit
-  def selectLeft(self, event):
-    return
-
-
-  # Move the selection cursor to the right one unit
-  def selectRight(self, event):
-    return
-
-
-  # Select to the beginning of the entry
-  def selectToBegin(self, event):
-    return
-
-
-  # Select to the beginning of the entry
-  def selectToEnd(self, event):
-    return
-
-
-  # Copy to the clipboard
-  def clipboardCopy(self, event):
-    return self.work
-
-
-  def clipboardCut(self, event):
-    return self.work
-
-
-  def clipboardPaste(self, event):
-    if not self.editing:
-      return
-
-    event.text = self.dispatchEvent(events.Event('getClipboard'))
-    if event.text != None:
-      self.work = self._sanitizeValue(event.data)
-      self.modified = True
-      self._buildDisplay()
-
-
-
-#############################################################################
-#
-# ImageDiplayHandler
-#
-class ImageDisplayHandler(FieldDisplayHandler):
-  def __init__(self, entry, eventHandler, subEventHandler):
-    if not Image:
-      raise "Form contains a <image> and image support not loaded"
-    FieldDisplayHandler.__init__(self, entry, eventHandler, subEventHandler,
-                                 None)
-
-  def _buildDisplayHelper(self, value, editing):
-    if string.lower(self.entry.type) == 'url':
-      try:
-        # TODO: PIL doesn't like our openResource
-        #im = Image.open(openResource(value))
-        im = Image.open(value)
-      except IOError:
-        im = Image.new("RGB",(1,1,))
-
-    return im
-
-
-#############################################################################
-#
-# ComponentDiplayHandler
-#
-class ComponentDisplayHandler(FieldDisplayHandler):
-  def __init__(self, entry, eventHandler, subEventHandler):
-    FieldDisplayHandler.__init__(self, entry, eventHandler, subEventHandler,
-                                 None)
-
-  def _buildDisplayHelper(self, value, editing):
-    if string.lower(self.entry.type) == 'url':
-      return value

Modified: trunk/gnue-forms/src/GFObjects/GFComponent.py
===================================================================
--- trunk/gnue-forms/src/GFObjects/GFComponent.py       2005-08-13 18:00:25 UTC 
(rev 7861)
+++ trunk/gnue-forms/src/GFObjects/GFComponent.py       2005-08-13 20:40:30 UTC 
(rev 7862)
@@ -32,7 +32,7 @@
 
 from gnue.common import events
 from GFValue import GFValue
-from gnue.forms import GFDisplayHandler
+from gnue.forms.input import displayHandlers
 
 #
 #GFComponent
@@ -89,7 +89,7 @@
 
     self._navigable = False # self.navigable
                                         
-    self._displayHandler = GFDisplayHandler.ComponentDisplayHandler(self,
+    self._displayHandler = displayHandlers.Component(self,
                               self._form._instance.eventController,
                               self.subEventHandler)
 

Modified: trunk/gnue-forms/src/GFObjects/GFEntry.py
===================================================================
--- trunk/gnue-forms/src/GFObjects/GFEntry.py   2005-08-13 18:00:25 UTC (rev 
7861)
+++ trunk/gnue-forms/src/GFObjects/GFEntry.py   2005-08-13 20:40:30 UTC (rev 
7862)
@@ -28,7 +28,7 @@
 # NOTES:
 #
 
-from gnue.forms import GFDisplayHandler
+from gnue.forms.input import displayHandlers
 from GFTabStop import GFTabStop
 import string
 
@@ -126,28 +126,29 @@
     # TODO: Conversion: I'm torn... does this go here or in GFField??
     # Create an appropriate display handler
     if self.style == 'checkbox':
-      self._displayHandler = GFDisplayHandler.CheckboxDisplayHandler(self,
+      self._displayHandler = displayHandlers.Checkbox(self,
                self._form._instance.eventController, self.subEventHandler)
     elif self.style == 'dropdown':
-      self._displayHandler = GFDisplayHandler.DropdownDisplayHandler(self,
+      self._displayHandler = displayHandlers.Dropdown(self,
                self._form._instance.eventController, self.subEventHandler)
     elif self.style == 'listbox':
-      self._displayHandler = GFDisplayHandler.ListboxDisplayHandler(self,
+      self._displayHandler = displayHandlers.Listbox(self,
                self._form._instance.eventController, self.subEventHandler)
     elif self.style == 'password':
-      self._displayHandler = GFDisplayHandler.PasswordDisplayHandler(self,
+      self._displayHandler = displayHandlers.Password(self,
                self._form._instance.eventController, self.subEventHandler,
                self._displaymask, self._inputmask)
     elif self._field.typecast == 'number':
-      self._displayHandler = GFDisplayHandler.NumberDisplayHandler(self,
+      self._displayHandler = displayHandlers.Numeric(self,
                self._form._instance.eventController, self.subEventHandler,
                self._displaymask, self._inputmask)
     elif self._field.typecast == 'date':
-      self._displayHandler = GFDisplayHandler.DateDisplayHandler(self,
+      print "It's a date then"
+      self._displayHandler = displayHandlers.DateTime(self,
                self._form._instance.eventController, self.subEventHandler,
                self._displaymask, self._inputmask)
     else:
-      self._displayHandler = GFDisplayHandler.TextDisplayHandler(self,
+      self._displayHandler = displayHandlers.Text(self,
                self._form._instance.eventController, self.subEventHandler,
                self._displaymask, self._inputmask)
 

Modified: trunk/gnue-forms/src/GFObjects/GFImage.py
===================================================================
--- trunk/gnue-forms/src/GFObjects/GFImage.py   2005-08-13 18:00:25 UTC (rev 
7861)
+++ trunk/gnue-forms/src/GFObjects/GFImage.py   2005-08-13 20:40:30 UTC (rev 
7862)
@@ -34,7 +34,7 @@
 
 from GFTabStop import GFTabStop
 from GFTabStop import GFTabStop
-from gnue.forms import GFDisplayHandler
+from gnue.forms.input import displayHandlers 
 #
 #GFLabel
 #
@@ -91,8 +91,8 @@
 
     self._navigable = False # self.navigable
 
-    self._displayHandler = GFDisplayHandler.ImageDisplayHandler(self,
-                              self._form._instance.eventController,
+    self._displayHandler = displayHandlers.Image(self,
+                              self._form._instance.eventController,
                               self.subEventHandler)
 
   # TODO: Conversion:  Does this belong here or not?

Modified: trunk/gnue-forms/src/GFObjects/GFTree.py
===================================================================
--- trunk/gnue-forms/src/GFObjects/GFTree.py    2005-08-13 18:00:25 UTC (rev 
7861)
+++ trunk/gnue-forms/src/GFObjects/GFTree.py    2005-08-13 20:40:30 UTC (rev 
7862)
@@ -32,7 +32,6 @@
 from GFValue import GFValue
 from GFObj import GFObj
 from gnue.common import events
-from gnue.forms import GFDisplayHandler
 from GFBlock import GFBlock
 import string
 import copy

Added: trunk/gnue-forms/src/input/__init__.py
===================================================================

Copied: trunk/gnue-forms/src/input/displayHandlers/Base.py (from rev 7823, 
trunk/gnue-forms/src/GFDisplayHandler.py)
===================================================================
--- trunk/gnue-forms/src/GFDisplayHandler.py    2005-08-10 15:05:21 UTC (rev 
7823)
+++ trunk/gnue-forms/src/input/displayHandlers/Base.py  2005-08-13 20:40:30 UTC 
(rev 7862)
@@ -0,0 +1,182 @@
+
+# This file is part of GNU Enterprise.
+#
+# GNU Enterprise is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2, or (at your option) any later version.
+#
+# GNU Enterprise is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with program; see the file COPYING. If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place
+# - Suite 330, Boston, MA 02111-1307, USA.
+#
+# Copyright 2002-2005 Free Software Foundation
+#
+# FILE:
+# GFDisplayHandler.py
+#
+# $Id$
+"""
+DisplayHandler classes for Forms input validation
+"""
+__revision__ = "$Id$"
+
+from gnue.common import events
+
+class Base(events.EventAware):
+  """
+  The base display handler.
+  
+  This display handler is not to be used directly.  Other
+  display handlers inherit from this one.  At this point
+  Base is completely empty and all classes inherit from 
+  BaseCursor.  Functions will be moved from BaseCursor to 
+  Base at some point
+  """
+
+  # ===========================================================================
+  # Cursor movement functions
+  # ===========================================================================
+
+  def _moveCursor(self, event, selecting=False):
+    """
+    Moves the cursor to the specified position optionally selecting the text.
+    
+    Not supported by base.  Use BaseCursor.
+    """
+    gDebug (5, "Entry %s: _moveCursor not supported." % self.entry.name )
+    return
+
+  def _moveCursorLeft(self, event, selecting=False):
+    """
+    Moves the cursor to the left optionally selecting the text.
+    
+    Not supported by base.  Use BaseCursor.
+    """
+    gDebug (5, "Entry %s: _moveCursorLeft not supported." % self.entry.name )
+    return
+
+  def _moveCursorRight(self, event, selecting=False):
+    """
+    Moves the cursor to the right optionally selecting the text.
+    
+    Not supported by base.  Use BaseCursor.
+    """
+    gDebug (5, "Entry %s: _moveCursorRight not supported." % self.entry.name )
+    return
+
+  def _moveCursorToEnd(self, event, selecting=False):
+    """
+    Moves the cursor to the end optionally selecting the text.
+    
+    Not supported by base.  Use BaseCursor.
+    """
+    gDebug (5, "Entry %s: _moveCursorToEnd not supported." % self.entry.name )
+    return
+
+  def _moveCursorToBegin(self, event, selecting=False):
+    """
+    Moves the cursor to the beginning optionally selecting the text.
+    
+    Not supported by base.  Use BaseCursor.
+    """
+    gDebug (5, "Entry %s: _moveCursosToBegin not supported." % self.entry.name 
)
+    return
+
+  def backspace(self, event):
+    """
+    Delete backward one character
+    
+    Not supported by base.  Use BaseCursor.
+    """
+    gDebug (5, "Entry %s: backspace not supported." % self.entry.name )
+    return
+
+  # Delete forward one character
+  def delete(self, event):
+    """
+    Delete forward one character
+    
+    Not supported by base.  Use BaseCursor.
+    """
+    gDebug (5, "Entry %s: delete not supported." % self.entry.name )
+    return
+
+  # ---------------------------------------------------------------------------
+  # Selection Support
+  # ---------------------------------------------------------------------------
+  
+  def setSelectionArea(self, cursor1, cursor2):
+    """
+    Set the selection area
+    
+    Not supported by base.  Use BaseCursor.
+    """
+    gDebug (5, "Entry %s: setSelectionArea not supported." % self.entry.name )
+    return
+
+
+  def getSelectionArea(self):
+    """
+    Return the selected area as a tuple (or None if no selection)
+    
+    Not supported by base.  Use BaseCursor.
+    """
+    gDebug (5, "Entry %s: getSelectionArea not supported." % self.entry.name )
+    return
+
+
+  def selectAll(self, event):
+    """
+    Select the entire text of the entry and move the cursor to the end
+    
+    Not supported by base.  Use BaseCursor.
+    """
+    gDebug (5, "Entry %s: selectAll not supported." % self.entry.name )
+    return
+
+  def selectLeft(self, event):
+    """
+    Move the selection cursor to the left one unit
+    
+    Not supported by base.  Use BaseCursor.
+    """
+    gDebug (5, "Entry %s: selectLeft not supported." % self.entry.name )
+    return
+
+
+  def selectRight(self, event):
+    """
+    Move the selection cursor to the right one unit
+    
+    Not supported by base.  Use BaseCursor.
+    """
+    gDebug (5, "Entry %s: selectRight not supported." % self.entry.name )
+    return
+
+
+  def selectToBegin(self, event):
+    """
+    Select to the beginning of the entry
+    
+    Not supported by base.  Use BaseCursor.
+    """
+    gDebug (5, "Entry %s: selectToBegin not supported." % self.entry.name )
+    return
+
+
+  def selectToEnd(self, event):
+    """
+    Select to the beginning of the entry
+    
+    Not supported by base.  Use BaseCursor.
+    """
+    gDebug (5, "Entry %s: selectToEnd not supported." % self.entry.name )
+    return
+

Copied: trunk/gnue-forms/src/input/displayHandlers/Checkbox.py (from rev 7823, 
trunk/gnue-forms/src/GFDisplayHandler.py)
===================================================================
--- trunk/gnue-forms/src/GFDisplayHandler.py    2005-08-10 15:05:21 UTC (rev 
7823)
+++ trunk/gnue-forms/src/input/displayHandlers/Checkbox.py      2005-08-13 
20:40:30 UTC (rev 7862)
@@ -0,0 +1,149 @@
+
+# This file is part of GNU Enterprise.
+#
+# GNU Enterprise is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2, or (at your option) any later version.
+#
+# GNU Enterprise is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with program; see the file COPYING. If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place
+# - Suite 330, Boston, MA 02111-1307, USA.
+#
+# Copyright 2002-2005 Free Software Foundation
+#
+# FILE:
+# GFDisplayHandler.py
+#
+# $Id$
+"""
+DisplayHandler classes for Forms input validation
+"""
+__revision__ = "$Id$"
+
+from gnue.forms.input.displayHandlers.Cursor import BaseCursor
+
+#############################################################################
+#
+# Handler for Checkbox types
+#
+class Checkbox(BaseCursor):
+
+  def __init__(self, *args, **params):
+
+    self.trueValue = gConfigForms("checkboxTrue")
+    self.falseValue = gConfigForms("checkboxFalse")
+
+    self.trueValues =  ('Y', 'y', 'T', 't', '1', 'x', 'X', self.trueValue)
+    self.falseValues = ('N', 'n', 'F', 'f', '0', '', ' ', self.falseValue)
+
+    BaseCursor.__init__(self, *args, **params)
+
+    # My events...
+    self.subEventHandler.registerEventListeners( {
+           'requestTOGGLECHKBOX' : self.handleToggleChkbox} )
+
+
+  def setValue(self, value):
+    # Force to 0 or 1
+    self.value = self._sanitizeValue(value)
+
+    self.modified = False
+    self._buildDisplay()
+
+
+  def _sanitizeValue(self, value):
+    if ("%s" % value)[:1] in self.trueValues:
+      return True
+    elif ("%s" % value)[:1] in self.falseValues:
+      return False
+    else:
+      return value and True or False
+
+  def _buildValue(self):
+    self.value = self.work
+    return True
+
+
+  # TODO: Replace with format mask
+  def _buildDisplayHelper(self, value, editing):
+    return self._sanitizeValue(value)
+
+
+  # Helpers for user events:
+
+  # Set checkbox to boolean value
+  def __set (self, value):
+    if value != self.work:
+      self.work = value
+      self.modified = True
+      self._buildDisplay ()
+
+  # Toggle value of checkbox
+  def __toggle (self):
+    self.work = not self.work
+    self.modified = True
+    self._buildDisplay ()
+
+
+  # Handle requestTOGGLECHKBOX event
+  def handleToggleChkbox (self, event):
+    if not self.editing:
+      return
+    if event.data == None:
+      self.__toggle ()
+    else:
+      self.__set (self._sanitizeValue (event.data [1]))
+    event.refreshDisplay = True
+
+
+  def _beginEdit(self, event):
+
+    self.editing = self.field.isEditable(event._form.getCurrentMode())
+    self.modified = False
+
+    self.setValue(self.field.getValue())
+
+    self.work = self.value
+
+    self._buildDisplay()
+
+    self.cursor = 0
+
+
+  # Correctly handle requestKEYPRESS event
+  def _addText(self, event):
+    if event.text == ' ':
+      self.__toggle ()
+    elif event.text in ['0', '-']:      # TODO: add "Y" for current language
+      self.__set (False)
+    elif event.text in ['1', '+']:      # TODO: add "N" for current language
+      self.__set (True)
+    event.refreshDisplay = True
+    return
+
+
+  # Copy to the clipboard
+  def _clipboardCopy(self, event):
+    return self.work
+
+
+  def _clipboardCut(self, event):
+    return self.work
+
+
+  def clipboardPaste(self, event):
+    if not self.editing:
+      return
+
+    event.text = self.dispatchEvent(events.Event('getClipboard'))
+    if event.text != None:
+      self.work = self._sanitizeValue(event.data)
+      self.modified = True
+      self._buildDisplay()
\ No newline at end of file

Copied: trunk/gnue-forms/src/input/displayHandlers/Component.py (from rev 7823, 
trunk/gnue-forms/src/GFDisplayHandler.py)
===================================================================
--- trunk/gnue-forms/src/GFDisplayHandler.py    2005-08-10 15:05:21 UTC (rev 
7823)
+++ trunk/gnue-forms/src/input/displayHandlers/Component.py     2005-08-13 
20:40:30 UTC (rev 7862)
@@ -0,0 +1,39 @@
+# This file is part of GNU Enterprise.
+#
+# GNU Enterprise is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2, or (at your option) any later version.
+#
+# GNU Enterprise is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with program; see the file COPYING. If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place
+# - Suite 330, Boston, MA 02111-1307, USA.
+#
+# Copyright 2002-2005 Free Software Foundation
+#
+# FILE:
+# GFDisplayHandler.py
+#
+# $Id$
+"""
+DisplayHandler classes for Forms input validation
+"""
+__revision__ = "$Id$"
+
+
+from gnue.forms.input.displayHandlers.Cursor import BaseCursor
+
+class Component(BaseCursor):
+  def __init__(self, entry, eventHandler, subEventHandler):
+    BaseCursor.__init__(self, entry, eventHandler, subEventHandler,
+                                 None)
+
+  def _buildDisplayHelper(self, value, editing):
+    if self.entry.type.lower() == 'url':
+      return value

Copied: trunk/gnue-forms/src/input/displayHandlers/Cursor.py (from rev 7823, 
trunk/gnue-forms/src/GFDisplayHandler.py)
===================================================================
--- trunk/gnue-forms/src/GFDisplayHandler.py    2005-08-10 15:05:21 UTC (rev 
7823)
+++ trunk/gnue-forms/src/input/displayHandlers/Cursor.py        2005-08-13 
20:40:30 UTC (rev 7862)
@@ -0,0 +1,724 @@
+
+# This file is part of GNU Enterprise.
+#
+# GNU Enterprise is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2, or (at your option) any later version.
+#
+# GNU Enterprise is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with program; see the file COPYING. If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place
+# - Suite 330, Boston, MA 02111-1307, USA.
+#
+# Copyright 2002-2005 Free Software Foundation
+#
+# FILE:
+# GFDisplayHandler.py
+#
+# $Id$
+"""
+DisplayHandler classes for Forms input validation
+"""
+__revision__ = "$Id$"
+
+import sys
+#from gnue.forms.input.displayHandlers import Base
+from gnue.common import events
+
+# TODO: When Base is used inherit from that instead
+class BaseCursor(events.EventAware):
+  """
+  The base display handler.
+  
+  This display handler is not to be used directly.  Other
+  display handlers inherit from this one.
+  """
+
+  def __init__(self, entry, eventHandler, subEventHandler, formatter=None):
+    """
+    Class initializer
+
+    @param entry
+    @param eventHandler
+    @param subEventHandler
+    @param formatter
+    """
+    events.EventAware.__init__(self, eventHandler)
+    
+    self.entry = entry            # The GFEntry that this instance will support
+    self.field = entry._field     # The GFField associated with that GFEntry
+    self.editing = False          # Is handler in edit mode
+    self.modified = False         # 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
+    self._loadedAllowedValues = False # Have allowed values been loaded
+    self.subEventHandler = subEventHandler
+
+    # TODO: replace w/an event that asks the
+    # TODO: UIdriver if this should happen!
+    self.handleCR = sys.platform == "win32"
+
+    # Needs to be set by the child classes
+    self.formatter = formatter
+
+    self.subEventHandler.registerEventListeners( {
+    
+                 # "Entry" events
+                 'requestKEYPRESS'     : self._addText,
+                 'requestENTER'        : self.__handleENTER,
+                 '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
+                 'requestSELECTWITHMOUSE' : self._selectWithMouse,
+                 'requestSELECTALL'    : self._selectAll,
+                 'requestSELECTTOHOME' : self._selectToBegin,
+                 'requestSELECTTOEND'  : self._selectToEnd,
+                 'requestSELECTLEFT'   : self._selectLeft,
+                 'requestSELECTRIGHT'  : self._selectRight,
+                 'requestCOPY'         : self._clipboardCopy,
+                 'requestCUT'          : self._clipboardCut,
+                 'requestPASTE'        : self._clipboardPaste,
+
+                 # Request for direct buffer manipulation
+                 'requestINSERTAT'     : self._insertTextAt,
+                 'requestDELETERANGE'  : self._deleteRange,
+        })
+  
+  #####################
+  #
+  # General methods
+  #
+
+  def setValue(self, value):
+    """
+    Sets the stored db-compatible value and marks the handler as not modified.
+    
+    @param value: The new value 
+    """
+    self.modified = False
+    self.value = value
+    self._buildDisplay()
+
+
+  def getValue(self):
+    """
+    Gets the stored db-compatible value from the handler
+    """
+    return self.value
+
+  def getDisplayFiller(self, value):
+    """
+    Returns the value as it should be displayed in the entry.
+    
+    @param value: The value to be formatted for display
+    """
+    return self._buildDisplayHelper(value, False)
+
+  def generateRefreshEvent(self):
+    """
+    Function to emit an event that will cause forms
+    to update the UI.
+    """
+    gDebug (5, "generateRefreshEvent on %s '%s' %s" % \
+        (self, self.display, self.entry))
+    
+    # TODO: this should probably actually happen in UIwxpython!
+    if (self.handleCR and type(self.display)=='str'):
+      self.dispatchEvent(events.Event('updateEntryEditor',
+           object = self.field,
+           display=self.display,
+           cursor=self.cursor + 
len(self.display[:self.cursor+1].split('\n'))-1,
+           selection=self.getSelectionArea(),
+         ))
+    else:
+      self.dispatchEvent(events.Event('updateEntryEditor',
+           object = self.entry,
+           display=self.display,
+           cursor=self.cursor,
+           selection=self.getSelectionArea(),
+         ))
+
+  def __beep(self):
+    """
+    Generates an event requesting that the UI beep.
+    """
+    #TODO: Beep not working atm.
+    self.dispatchEvent(events.Event('formBEEP'))
+
+  def isPending(self):
+    """
+    Return True if the display handler is in edit mode and has modified text
+    """
+    return self.editing and self.modified
+
+  #####################
+  #
+  # Editing methods
+  #
+
+  def _beginEdit(self, event):
+    """
+    Notifies the handler that it will be doing edits.
+    
+    Called when a widget first gets focus. It places the display handler into
+    edit mode, syncs the current value with the GFField associated with this
+    display handler, and creates the string to display in the form.
+    """
+    self.editing = self.field.isEditable(event._form.getCurrentMode())
+    self.modified = False
+
+    # TODO: Replace with formatter
+    self.setValue(self.field.getValue())
+    self.work = self._buildDisplayHelper(self.value, False)
+    self._buildDisplay()
+
+    self.cursor = len(self.display)
+    # Ensure cursor is properly placed.
+    self.generateRefreshEvent()
+
+  def _endEdit(self, event):
+    """
+    Called when a widget loses focus or when ENTER is hit.
+    """
+    if not self.editing:
+      return
+
+    if not self._loadedAllowedValues:
+      self.field.allowedValues()
+      self._loadedAllowedValues = True
+
+
+    # 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():
+        if self.field._allowedValues and \
+           not self.field._allowedValues.has_key("%s" % self.value):
+          self.work = ""
+          event.__error__ = True
+          event.__errortext__ = u_("Invalid value '%s' for field") % self.value
+          return
+
+        self.editing = False
+        event.__results__ = self.value
+        event.modified = self.modified
+        self.field.setValue(self.value)
+
+        self._buildDisplay()
+
+      else:
+        self.dispatchEvent(events.Event('formALERT',
+          u_("Invalid input: '%s'") % self.work,_form=event._form))
+    else:
+      self.editing = False
+
+
+  def _addText(self, event):
+    """
+    Handles the adding of new text 
+    """
+    
+    # Skip if this display handler isn't the one currently being edited
+    if not self.editing:
+      gDebug(5, 
+        "Entry %s: Received request to add text but isn't in edit mode" % 
+        self.entry.name )
+      return
+
+    # Get the text to be added forcing to specific case if necessary
+    if self.field._lowercase:
+      value = event.text.lower()
+    elif self.field._uppercase:
+      value = event.text.upper()
+    else:
+      value = event.text
+    
+    # -------------------------------------------------------------------------
+    # Validate the input
+    # TODO: This will be moved to the mask system!!
+    # -------------------------------------------------------------------------
+    if hasattr(self.field,'maxLength') and \
+       len(self.work)  + len(value) > self.field.maxLength:
+      # TODO: Should we beep?
+      self.__beep()
+      gDebug (6, "Entry %s: Max length reached"  % self.entry.name )
+      return
+
+    if ( self.field._numeric and \
+         self.field._block.mode == 'normal' ):
+      for char in value:
+        if not (char.isdigit() or char in '.-') :
+          # TODO: Should we beep?
+          gDebug (6, "Entry %s: Invalid numeric input" % self.entry.name)
+          return
+
+    # -------------------------------------------------------------------------
+    # Insert the text
+    # -------------------------------------------------------------------------
+    # To do overstrike, we'll fudge by first "highlighting"
+    # the character to replace, then use the selection logic.
+
+    if  getattr(event, 'overstrike', False) and self.selection1 is None:
+      self.selection1 = self.cursor
+      self.selection2 = self.selection1 + 1
+        
+    if self.selection1 is not None:
+      # If text is selected, then we will replace
+
+      minSelectionPos = min(self.selection1, self.selection2)
+      maxSelectionPos = max(self.selection1, self.selection2)
+
+      self.work = self.work[:minSelectionPos]  \
+                   + value        \
+                   + self.work[maxSelectionPos:]
+
+      self.selection1 = None
+      self.cursor = minSelectionPos + 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(value)
+
+
+    event.__dropped__ = True
+    event.refreshDisplay = True
+    self.modified = True
+    self._buildDisplay()
+
+    # Update the field. This means PRE-CHANGE and POST-CHANGE will get fired
+    # now. For now, only do this here if we are a lookup.
+    if hasattr(self.field, 'fk_source'):
+      self._buildValue()
+      self.field.setValue(self.value)
+
+  def _insertTextAt(self, event):
+    """
+    Insert text at specified position
+    """
+    if not self.editing:
+      gDebug(5, 
+        "Entry %s: Received request to insert text but not in edit mode" % 
+        self.entry.name )
+      return
+
+    # set cursor position
+    self.cursor = event.position
+
+    # add the event text
+    self._addText(event)
+
+  def _deleteRange(self, event):
+    """
+    Deletes the requested range of test from the entry
+    
+    @param event: The GFEvent making the request
+    """
+    if not self.editing:
+      gDebug(5, 
+        "Entry %s: Received request to delete text but not in edit mode" % 
+        self.entry.name )
+      return
+
+    self.selection1 = event.start_pos
+    self.selection2 = event.end_pos
+    self.cursor     = event.position
+    self._delete (event)
+
+  def __handleENTER(self, event):
+    """
+    Private function to handle enter key presses in an multiline entry.
+    
+    @param event: The GFEvent making the request
+    """
+    if gConfigForms('EnterIsNewLine') and \
+       hasattr(self.entry, 'Char__height') and \
+       self.entry.Char__height > 1:
+      event.text = '\n'
+      self._addText(event)
+      event.drop()
+
+  # ===========================================================================
+  # Cursor movement functions
+  # ===========================================================================
+
+  def _backspace(self, event):
+    """
+    Delete backwards one character
+    
+    @param event: The GFEvent making the request
+    """
+    if not self.editing:
+      gDebug(5, 
+        "Entry %s: Received request to backspace but not in edit mode" % 
+        self.entry.name )
+      return
+
+
+    # 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 = True
+      event.text = ""
+
+      self._addText(event)
+
+  def _delete(self, event):
+    """
+    Delete forward one character
+    
+    @param event: The GFEvent making the request
+    """
+    if not self.editing:
+      gDebug(5, 
+        "Entry %s: Received request to delete text but not in edit mode" % 
+        self.entry.name )
+      return
+
+    event.overstrike = True
+    event.text = ""
+
+    self._addText(event)
+
+  def _moveCursor(self, event, selecting=False):
+    """
+    Moves the cursor to the specified position optionally selecting the text.
+    
+    @param event: The GFEvent making the request
+    @param selecting: Boolean indicating if text should be selected 
+                      as part of the cursor move
+    """
+    if not selecting:
+      self.selection1 = None
+
+    self.cursor = min(event.position, len(self.display))
+    event.refreshDisplay = True
+
+
+  def _moveCursorLeft(self, event, selecting=False):
+    """
+    Moves the cursor to the left optionally selecting the text.
+    
+    @param event: The GFEvent making the request
+    @param selecting: Boolean indicating if text should be selected 
+                      as part of the cursor move
+    """
+    if not selecting:
+      self.selection1 = None
+
+    if self.cursor > 0:
+      self.cursor -= 1
+      event.refreshDisplay = True
+
+  def _moveCursorRight(self, event, selecting=False):
+    """
+    Moves the cursor to the right optionally selecting the text.
+    
+    @param event: The GFEvent making the request
+    @param selecting: Boolean indicating if text should be selected 
+                      as part of the cursor move
+    """    
+    if not selecting:
+      self.selection1 = None
+
+    if self.cursor < len(self.display):
+      self.cursor += 1
+      event.refreshDisplay = True
+
+  def _moveCursorToEnd(self, event, selecting=False):
+    """
+    Moves the cursor to the end optionally selecting the text.
+    
+    @param event: The GFEvent making the request
+    @param selecting: Boolean indicating if text should be selected 
+                      as part of the cursor move
+    """
+    if not selecting:
+      self.selection1 = None
+
+    self.cursor = len(self.display)
+    event.refreshDisplay = True
+
+
+  def _moveCursorToBegin(self, event, selecting=False):
+    """
+    Moves the cursor to the beginning optionally selecting the text.
+    
+    @param event: The GFEvent making the request
+    @param selecting: Boolean indicating if text should be selected 
+                      as part of the cursor move
+    """
+    if not selecting:
+      self.selection1 = None
+
+    self.cursor = 0
+    event.refreshDisplay = True
+
+
+  # ---------------------------------------------------------------------------
+  # Selection Support
+  # ---------------------------------------------------------------------------
+
+  def setSelectionArea(self, cursor1, cursor2):
+    """
+    Set the selection area
+    
+    Starting and ending position can be passed in an any order.
+    
+    @param cursor1: A starting or ending position for the selection 
+    @param cursor2: A starting or ending position for the selection
+    """
+    self.selection1 = min(cursor1, cursor2)
+    self.selection2 = max(cursor1, cursor2)
+
+  def getSelectionArea(self):
+    """
+    Return the selected area
+    
+    @return: The selected area as a tuple or None if no selection
+    """
+    if self.selection1 == None:
+      return None
+    else:
+      return ( min(self.selection1, self.selection2),
+               max(self.selection1, self.selection2) )
+
+
+  def _selectWithMouse(self, event):
+    """
+    Select an area of text based upon the mouse
+        
+    @param event: The GFEvent making the request
+    """
+    self.selection1 = event.position1
+    self.selection2 = event.position2
+    if self.cursor == self.selection2:
+      event.position = self.selection1
+    else:
+      event.position = self.selection2
+    self._moveCursor(event, True)
+
+
+  def _selectAll (self, event):
+    """
+    Select the entire text of the entry and move the cursor to the end
+        
+    @param event: The GFEvent making the request    
+    """
+    self.selection1 = 0
+    self._moveCursorToEnd (event, True)
+    self.selection2 = self.cursor
+
+
+  def _selectLeft(self, event):
+    """
+    Move the selection cursor to the left one unit
+        
+    @param event: The GFEvent making the request
+    """
+    if self.selection1 == None:
+      self.selection1 = self.cursor
+
+    self._moveCursorLeft(event, True)
+    self.selection2 = self.cursor
+
+
+  def _selectRight(self, event):
+    """
+    Move the selection cursor to the right one unit
+        
+    @param event: The GFEvent making the request
+    """ 
+    if self.selection1 == None:
+      self.selection1 = self.cursor
+
+    self._moveCursorRight(event, True)
+    self.selection2 = self.cursor
+
+
+  
+  def _selectToBegin(self, event):
+    """
+    Select from the current curson position to the beginning of the entry
+        
+    @param event: The GFEvent making the request
+    """
+    if self.selection1 == None:
+      self.selection1 = self.cursor
+
+    self._moveCursorToBegin(event, True)
+    self.selection2 = self.cursor
+
+
+  
+  def _selectToEnd(self, event):
+    """
+    Select from the current curson position to the end of the entry
+        
+    @param event: The GFEvent making the request
+    """
+
+    if self.selection1 == None:
+      self.selection1 = self.cursor
+
+    self._moveCursorToEnd(event, True)
+    self.selection2 = self.cursor
+
+  # ---------------------------------------------------------------------------
+  # Clipboard Support
+  # ---------------------------------------------------------------------------
+
+  # Copy to the clipboard
+  def _clipboardCopy(self, event):
+    """
+    Copy the current selection to the clipboard
+        
+    @param event: The GFEvent making the request
+    """
+    if self.selection1 != None:
+      sel1, sel2 = self.getSelectionArea ()
+      self.dispatchEvent (events.Event ('setCLIPBOARD',
+               text = self.display [sel1:sel2]))
+
+    event.refreshDisplay = False
+
+
+  def _clipboardCut(self, event):
+    """
+    Cut the current selection and place in the clipboard
+    
+    @param event: The GFEvent making the request    """
+    if not self.editing:
+      return self._clipboardCopy(event)
+
+    self._clipboardCopy(event)
+    edevent = events.Event("requestKEYPRESS", text="", _form=event._form)
+    self.dispatchEvent(edevent)
+
+
+  def _clipboardPaste(self, event):
+    """
+    Paste the current contents of the clipboard into the entry
+    
+    @param event: The GFEvent making the request
+    """
+    
+    if not self.editing:
+      return
+
+    event.text = self.dispatchEvent(events.Event('getCLIPBOARD'))
+    if event.text != None:
+      self._addText(event)
+
+  # --------------------------------------------------------------------------
+  # Internal methods
+  # --------------------------------------------------------------------------
+
+  def _buildValue(self):
+    """
+    Private function that builds the db compatible value from 
+    the currently working value.
+    """
+    if self.field._allowedValues:
+      if self.work == "":
+        self.value = '' # None
+      else:
+        if self.field._allowedValuesReverse.has_key (self.display):
+          self.value = self.field._allowedValuesReverse [self.display]
+        else:
+          self.value = None
+          return False
+    else:
+      self.value = self.work
+    return True
+
+
+  def _buildDisplayHelper(self, value, editing):
+    """
+    Builds a string that represents what should be 
+    displayed for the field.
+    
+    An entry can have two different displayable values.  The value
+    to be displayed when the entry isn't the one currently being 
+    edited.  And the value that is displayed while the entry is being 
+    edited.  An example of this would be entries displaying date
+    information
+    
+    @param value: The raw value to be displayed
+    @param editing: If true the format the display string as if it
+                    were to be edited.
+    """
+    if self.field._allowedValues:
+      # TODO: Verify this comment
+      # The field associated with this field is most likely
+      # a dropdown and so only valid dropdown values should be displayed
+      if editing:
+        val = value.lower ()
+        
+        for disp in self.field._allowedValuesDescr:
+          if disp [:len (val)].lower () == val:
+            revVal = self.field._allowedValuesReverse [disp]
+            return self.field._allowedValues [revVal]
+
+        return value
+
+      if self.field._allowedValues.has_key ("%s" % value):
+        return self.field._allowedValues ["%s" % value]
+      else:
+        return ""
+
+    else:
+      if value == None:
+        return ""
+      else:
+        return "%s" % value
+
+  def _buildDisplay(self):
+    """
+    Private function that rebuilds the display string.
+    
+    A wrapper function that calls the private _buildDisplayHelper 
+    with the appropriate arguments for the mode the display handler is 
+    currently in.  (Edit mode or not edit mode :)
+    """
+    if self.editing:
+      self.display = self._buildDisplayHelper(self.work, True)
+    else:
+      self.display = self._buildDisplayHelper(self.value, False)
\ No newline at end of file

Copied: trunk/gnue-forms/src/input/displayHandlers/DateTime.py (from rev 7823, 
trunk/gnue-forms/src/GFDisplayHandler.py)
===================================================================
--- trunk/gnue-forms/src/GFDisplayHandler.py    2005-08-10 15:05:21 UTC (rev 
7823)
+++ trunk/gnue-forms/src/input/displayHandlers/DateTime.py      2005-08-13 
20:40:30 UTC (rev 7862)
@@ -0,0 +1,121 @@
+# This file is part of GNU Enterprise.
+#
+# GNU Enterprise is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2, or (at your option) any later version.
+#
+# GNU Enterprise is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with program; see the file COPYING. If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place
+# - Suite 330, Boston, MA 02111-1307, USA.
+#
+# Copyright 2002-2005 Free Software Foundation
+#
+# FILE:
+# GFDisplayHandler.py
+#
+# $Id$
+"""
+DisplayHandler classes for Forms input validation
+"""
+__revision__ = "$Id$"
+
+import sys, time
+
+from gnue.forms.input.displayHandlers.Cursor import BaseCursor
+
+try:
+  from mx.DateTime import DateTime, mktime
+except ImportError:
+  print """
+   This GNUe tool requires mxDateTime to be installed
+
+   You can find the mxDateTime at
+
+   http://www.lemburg.com/files/python/mxDateTime.html
+"""
+  sys.exit()
+
+class DateTime(BaseCursor):
+  """
+  Class to handle the display and entry of date based fields.
+  """
+  def __init__(self, entry, eventHandler, subEventHandler, displayMask,
+               inputMask):
+    BaseCursor.__init__(self, entry, eventHandler, subEventHandler,
+                                 None)
+    self.__displayMask = displayMask
+    self.__inputMask = inputMask
+
+
+  def setValue(self, value):
+    return FieldDisplayHandler.setValue(self, value)
+
+
+  # TODO: Replace with format mask
+  def _buildDisplayHelper(self, value, editing):
+    if editing:
+      if self.__inputMask:
+        format = self.__inputMask
+      else:
+        format = "%m/%d/%Y"
+    else:
+      if self.__displayMask:
+        format = self.__displayMask
+      else:
+        format = "%m/%d/%y"
+
+##    print "format=%s, value=%s, type=%s" % (format, value, type(value))
+    if value in (None, ""):
+      return ""
+    try:
+      return value.strftime (str (format))
+    except AttributeError:
+      return str(value)
+
+
+  def _buildValue(self):
+
+    if not len(self.work):
+      self.value = None
+      return 1
+
+    # TODO: Replace with format mask
+    if self.__inputMask:
+      try:
+        # mx.DateTime.strptime is not available under windows
+        self.value = mktime (time.strptime (self.work, self.__inputMask))
+      except:
+        return 0
+      return 1
+    try:
+      # TODO: Candidate for maketrans?
+      value = self.work.replace('.','/').replace('-','/')
+
+      # Support for quick entry like '123102' for '12/31/02'
+      if len(value) in (6, 8) and value.find('/') == -1:
+        month = value[:2]
+        day = value[2:4]
+        year = value[4:]
+      else:
+        month, day, year = value.split('/')
+
+      # TODO: Shouldn't the 50 be a config option
+      year = int(year)
+      if year < 100:
+        if year > 50:
+          year = year + 1900
+        else:
+          year = year + 2000
+
+      self.value = DateTime(year, int(month), int(day))
+
+      return 1
+    except:
+      return 0

Copied: trunk/gnue-forms/src/input/displayHandlers/Dropdown.py (from rev 7823, 
trunk/gnue-forms/src/GFDisplayHandler.py)
===================================================================
--- trunk/gnue-forms/src/GFDisplayHandler.py    2005-08-10 15:05:21 UTC (rev 
7823)
+++ trunk/gnue-forms/src/input/displayHandlers/Dropdown.py      2005-08-13 
20:40:30 UTC (rev 7862)
@@ -0,0 +1,125 @@
+
+# This file is part of GNU Enterprise.
+#
+# GNU Enterprise is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2, or (at your option) any later version.
+#
+# GNU Enterprise is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with program; see the file COPYING. If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place
+# - Suite 330, Boston, MA 02111-1307, USA.
+#
+# Copyright 2002-2005 Free Software Foundation
+#
+# FILE:
+# GFDisplayHandler.py
+#
+# $Id$
+"""
+DisplayHandler classes for Forms input validation
+"""
+__revision__ = "$Id$"
+
+from gnue.forms.input.displayHandlers.Cursor import BaseCursor
+
+class Dropdown(BaseCursor):
+  """
+  Class to handle the display and entry of fields that are rendered as style
+  of dropdown.
+  """
+
+  def __init__(self, *args, **params):
+
+    BaseCursor.__init__(self, *args, **params)
+
+    # My events...
+    self.subEventHandler.registerEventListeners( {
+           'requestREPLACEVALUE' : self._replaceText,
+           'requestCOMBODROPPED' : self._beginEdit } )
+
+
+  def _beginEdit(self, event):
+
+    if self.editing == True and self.modified == False:
+      return
+
+    if not self._loadedAllowedValues and not 
hasattr(self.field,'_allowedValues'):
+      self.field.allowedValues()
+      self._loadedAllowedValues = True
+
+    self.editing = self.field.isEditable(event._form.getCurrentMode())
+    self.modified = False
+
+    # TODO: Replace with formatter
+    self.setValue(self.field.getValue())
+
+    if self.value == None:
+      self.work = ""
+    else:
+      try:
+        self.work = self.field._allowedValues ["%s" % self.value]
+      except KeyError:
+        self.work = ""
+        event.__error__ = True
+        event.__errortext__ = u_("Invalid value '%s' for keyed pull-down "
+                                 "field") % self.value
+
+    self._buildDisplay()
+
+    self.cursor = len(self.display)
+
+
+
+  # TODO: Replace with format mask
+  def _buildDisplayHelper(self, value, editing):
+    if value in (None, ""):
+      return ""
+
+    if editing:
+      val = value.lower()
+      for disp in self.field._allowedValuesDescr:
+        if disp[:len(val)].lower() == val:
+          display = 
self.field._allowedValues[self.field._allowedValuesReverse[disp]]
+          return display
+      return value
+
+    if self.field._allowedValues.has_key ("%s" % value):
+      return self.field._allowedValues ["%s" % value]
+    else:
+      return ""
+
+  def _buildDisplay(self):
+    if self.editing:
+      self.display = self._buildDisplayHelper(self.work, True)
+      if self.cursor > len(self.work):
+        self.work = self.display
+    else:
+      self.display = self._buildDisplayHelper(self.value, False)
+
+
+  def _replaceText (self, event):
+    if not self.editing:
+      return
+
+    self.selection1 = 0
+    self.selection2 = len (self.display)
+    self._addText (event)
+
+# TODO: Kills dropdown handling with keyboard on win32
+# TODO: needs more work :(
+#    self.endEdit(event) # Hack: allows dropdowns to change field
+                        # value immediately (causes post-change
+                        # on the field to fire).
+                        # I don't think it'll hurt anything.
+                        # if it does then we'll need to pull
+                        # the logic from FieldDisplayHandler.endEdit
+                        # and add here.  - jamest
+
+

Copied: trunk/gnue-forms/src/input/displayHandlers/Image.py (from rev 7823, 
trunk/gnue-forms/src/GFDisplayHandler.py)
===================================================================
--- trunk/gnue-forms/src/GFDisplayHandler.py    2005-08-10 15:05:21 UTC (rev 
7823)
+++ trunk/gnue-forms/src/input/displayHandlers/Image.py 2005-08-13 20:40:30 UTC 
(rev 7862)
@@ -0,0 +1,57 @@
+
+# This file is part of GNU Enterprise.
+#
+# GNU Enterprise is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2, or (at your option) any later version.
+#
+# GNU Enterprise is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with program; see the file COPYING. If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place
+# - Suite 330, Boston, MA 02111-1307, USA.
+#
+# Copyright 2002-2005 Free Software Foundation
+#
+# FILE:
+# GFDisplayHandler.py
+#
+# $Id$
+"""
+Display handler responsible for handling image style entries.
+"""
+__revision__ = "$Id$"
+
+from gnue.forms.input.displayHandlers.Cursor import BaseCursor
+
+try:
+  import Image
+except ImportError:
+  Image = None
+
+class ImageDisplayHandler(BaseCursor):
+  """
+  Display handler responsible for handling image style entries.
+  """
+  def __init__(self, entry, eventHandler, subEventHandler):
+    if not Image:
+      raise "Form contains a <image> and image support not loaded"
+    BaseCursor.__init__(self, entry, eventHandler, subEventHandler,
+                                 None)
+
+  def _buildDisplayHelper(self, value, editing):
+    if self.entry.type.lower() == 'url':
+      try:
+        # PIL doesn't like our openResource function
+        # im = Image.open(openResource(value))
+        # TODO: Retest with latest PIL
+        im = Image.open(value)
+      except IOError:
+        im = Image.new("RGB", (1, 1, ))
+
+    return im
\ No newline at end of file

Copied: trunk/gnue-forms/src/input/displayHandlers/Listbox.py (from rev 7823, 
trunk/gnue-forms/src/GFDisplayHandler.py)
===================================================================
--- trunk/gnue-forms/src/GFDisplayHandler.py    2005-08-10 15:05:21 UTC (rev 
7823)
+++ trunk/gnue-forms/src/input/displayHandlers/Listbox.py       2005-08-13 
20:40:30 UTC (rev 7862)
@@ -0,0 +1,105 @@
+# This file is part of GNU Enterprise.
+#
+# GNU Enterprise is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2, or (at your option) any later version.
+#
+# GNU Enterprise is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with program; see the file COPYING. If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place
+# - Suite 330, Boston, MA 02111-1307, USA.
+#
+# Copyright 2002-2005 Free Software Foundation
+#
+# FILE:
+# GFDisplayHandler.py
+#
+# $Id$
+"""
+DisplayHandler classes for Forms input validation
+"""
+__revision__ = "$Id$"
+
+from gnue.forms.input.displayHandlers.Cursor import BaseCursor
+
+#############################################################################
+#
+# Handler for Listbox types
+#
+class Listbox(BaseCursor):
+
+  def __init__(self, *args, **params):
+
+    BaseCursor.__init__(self, *args, **params)
+
+    # My events...
+    self.subEventHandler.registerEventListeners( {
+           'requestREPLACEVALUE' : self._replaceText } )
+
+
+  def _beginEdit(self, event):
+    if self.editing == True and self.modified == False:
+      return
+
+    if not self._loadedAllowedValues and not 
hasattr(self.field,'_allowedValues'):
+      self.field.allowedValues()
+      self._loadedAllowedValues = True
+
+    self.editing = True
+    self.modified = False
+
+    # TODO: Replace with formatter
+    self.setValue(self.field.getValue())
+
+    if self.value == None:
+      self.work = ""
+    else:
+      try:
+        self.work = self.field._allowedValues ["%s" % self.value]
+      except KeyError:
+        self.work = ""
+        event.__error__ = True
+        event.__errortext__ = u_("Invalid value '%s' for keyed pull-down "
+                                 "field") % self.value
+
+    self._buildDisplay()
+
+    self.cursor = len(self.display)
+
+  # TODO: Replace with format mask
+  def _buildDisplayHelper(self, value, editing):
+    if value in (None, ""):
+      return ""
+
+    if editing:
+      val = value.lower()
+      for disp in self.field._allowedValuesDescr:
+        if disp[:len(val)].lower() == val:
+          display = 
self.field._allowedValues[self.field._allowedValuesReverse[disp]]
+          return display
+      return value
+
+    if self.field._allowedValues.has_key ("%s" % value):
+      return self.field._allowedValues ["%s" % value]
+    else:
+      return ""
+
+  def _buildDisplay(self):
+    if self.editing:
+      self.display = self._buildDisplayHelper(self.work, True)
+      if self.cursor > len(self.work):
+        self.work = self.display
+    else:
+      self.display = self._buildDisplayHelper(self.value, False)
+
+
+  def _replaceText(self, event):
+    self.selection1 = 0
+    self.selection2 = len(self.display)
+    self._addText(event)

Copied: trunk/gnue-forms/src/input/displayHandlers/Numeric.py (from rev 7823, 
trunk/gnue-forms/src/GFDisplayHandler.py)
===================================================================
--- trunk/gnue-forms/src/GFDisplayHandler.py    2005-08-10 15:05:21 UTC (rev 
7823)
+++ trunk/gnue-forms/src/input/displayHandlers/Numeric.py       2005-08-13 
20:40:30 UTC (rev 7862)
@@ -0,0 +1,112 @@
+
+# This file is part of GNU Enterprise.
+#
+# GNU Enterprise is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2, or (at your option) any later version.
+#
+# GNU Enterprise is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with program; see the file COPYING. If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place
+# - Suite 330, Boston, MA 02111-1307, USA.
+#
+# Copyright 2002-2005 Free Software Foundation
+#
+# FILE:
+# GFDisplayHandler.py
+#
+# $Id$
+"""
+DisplayHandler classes for Forms input validation
+"""
+__revision__ = "$Id$"
+
+import types
+
+from gnue.forms.input.displayHandlers.Cursor import BaseCursor
+
+class Numeric(BaseCursor):
+  """
+  Class to handle the display and entry of numeric fields.
+  """
+  def __init__(self, entry, eventHandler, subEventHandler, displayMask,
+               inputMask):
+    BaseCursor.__init__(self, entry, eventHandler, subEventHandler,
+                                 None)
+
+
+  def setValue(self, value):
+    if value in (None, ""):
+      value = None
+    else:
+      value = value
+
+    return BaseCursor.setValue(self, value)
+
+
+  # TODO: Replace with format mask
+  def _buildDisplayHelper(self, val, editing):
+    try:
+      if val in (None, ""):
+        return ""
+    except TypeError:
+      pass
+
+    if editing and type(val) == types.StringType:
+      return val
+
+#     if float(val) == val:
+#    try:
+    value = val
+    try:
+      if int(value) == value:
+        value = "%d" % value
+      else:
+        value = "%s" % value
+    except OverflowError:
+        value = "%s" % value
+    except ValueError:
+        value = "%s" % value
+#     else:
+#       value = "%s" % val
+#     if not editing:
+#       # Comma-fy (Temporary!)
+#       if value[:1] == '-':
+#         minus = "-"
+#         value = value[1:]
+#       else:
+#         minus = ""
+#
+#       try:
+#         whole, decimal = string.split(value,'.')
+#         value = ".%s" % decimal
+#       except ValueError:
+#         whole = value
+#         value = ""
+#
+#       while len(whole) > 3:
+#         value = ",%s%s" % (whole[-3:], value)
+#         whole = whole[:-3]
+#
+#       value = minus + whole + value
+
+    return value
+
+
+  def _buildValue(self):
+    if not len(self.work):
+      self.value = None
+      return True
+
+    try:
+      dummy = float(self.work)
+      self.value = self.work
+      return True
+    except ValueError:
+      return False
\ No newline at end of file

Copied: trunk/gnue-forms/src/input/displayHandlers/Password.py (from rev 7823, 
trunk/gnue-forms/src/GFDisplayHandler.py)
===================================================================
--- trunk/gnue-forms/src/GFDisplayHandler.py    2005-08-10 15:05:21 UTC (rev 
7823)
+++ trunk/gnue-forms/src/input/displayHandlers/Password.py      2005-08-13 
20:40:30 UTC (rev 7862)
@@ -0,0 +1,96 @@
+#
+# This file is part of GNU Enterprise.
+#
+# GNU Enterprise is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2, or (at your option) any later version.
+#
+# GNU Enterprise is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with program; see the file COPYING. If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place
+# - Suite 330, Boston, MA 02111-1307, USA.
+#
+# Copyright 2002-2005 Free Software Foundation
+#
+# FILE:
+# GFDisplayHandler.py
+#
+# $Id$
+"""
+DisplayHandler classes for Forms input validation
+"""
+__revision__ = "$Id$"
+
+from gnue.forms.input.displayHandlers.Cursor import BaseCursor
+
+class Password(BaseCursor):
+  """
+  Password display handler.
+  
+  Deals the entries of style password.  Replaces the value that would 
+  have been displayed with *s.  Also disables cut and paste functionality
+  as a security percaution.
+  """  
+  def __init__(self, entry, eventHandler, subEventHandler, displayMask,
+               inputMask):
+    """
+    Class initializer.
+    """
+    BaseCursor.__init__(self, entry, eventHandler, subEventHandler,
+                                 None)
+
+  def _beginEdit(self, event):
+    """
+    Notifies the handler that it will be doing edits.
+    
+    Serves the same function as the method in FieldDisplayHandler
+    except for the initial display value?
+    """
+    self.editing = self.field.isEditable(event._form.getCurrentMode())
+    self.modified = False
+
+    # TODO: Replace with formatter
+    self.setValue(self.field.getValue())
+    self.work = self.value
+    self._buildDisplay()
+
+    self.cursor = len(self.display)
+    # Ensure cursor is properly placed.
+    self.generateRefreshEvent()
+
+
+  def _buildDisplayHelper(self, value, editing):
+    """
+    Builds a string that represents what should be 
+    displayed for the field.
+
+    For password entry fields this is simply a string of *s
+    """
+    if value == None:
+      return ""
+    else:
+      return "*" * len(str(value))
+
+  def _clipboardCopy(self, event):
+    """
+    Handle requests for a copy of the display value to be placed 
+    into the systems clipboard
+    
+    This is disabled for password field types.
+    """
+    gDebug(4, "Entry %s: Password style entry.  Copy disabled." % 
self.entry.name)
+
+  def _clipboardCut(self, event):
+    """
+    Handle requests for a the display value to be cut and placed 
+    into the systems clipboard
+    
+    This is disabled for password field types.
+    """
+    gDebug(4, "Entry %s: Password style entry.  Cut disabled." % 
self.entry.name)

Copied: trunk/gnue-forms/src/input/displayHandlers/Text.py (from rev 7823, 
trunk/gnue-forms/src/GFDisplayHandler.py)
===================================================================
--- trunk/gnue-forms/src/GFDisplayHandler.py    2005-08-10 15:05:21 UTC (rev 
7823)
+++ trunk/gnue-forms/src/input/displayHandlers/Text.py  2005-08-13 20:40:30 UTC 
(rev 7862)
@@ -0,0 +1,41 @@
+
+# This file is part of GNU Enterprise.
+#
+# GNU Enterprise is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2, or (at your option) any later version.
+#
+# GNU Enterprise is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with program; see the file COPYING. If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place
+# - Suite 330, Boston, MA 02111-1307, USA.
+#
+# Copyright 2002-2005 Free Software Foundation
+#
+# FILE:
+# GFDisplayHandler.py
+#
+# $Id$
+"""
+Text display handler
+"""
+__revision__ = "$Id$"
+
+from gnue.forms.input.displayHandlers.Cursor import BaseCursor
+
+class Text(BaseCursor):
+  """
+  Basic string display handler.
+  
+  Deals the standard text data.
+  """
+  def __init__(self, entry, eventHandler, subEventHandler, displayMask,
+               inputMask):
+    BaseCursor.__init__(self, entry, eventHandler, subEventHandler,
+                                 None)

Added: trunk/gnue-forms/src/input/displayHandlers/__init__.py
===================================================================
--- trunk/gnue-forms/src/input/displayHandlers/__init__.py      2005-08-13 
18:00:25 UTC (rev 7861)
+++ trunk/gnue-forms/src/input/displayHandlers/__init__.py      2005-08-13 
20:40:30 UTC (rev 7862)
@@ -0,0 +1,40 @@
+#
+# This file is part of GNU Enterprise.
+#
+# GNU Enterprise is free software; you can redistribute it 
+# and/or modify it under the terms of the GNU General Public 
+# License as published by the Free Software Foundation; either 
+# version 2, or (at your option) any later version.
+#
+# GNU Enterprise is distributed in the hope that it will be 
+# useful, but WITHOUT ANY WARRANTY; without even the implied 
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+# PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public 
+# License along with program; see the file COPYING. If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place
+# - Suite 330, Boston, MA 02111-1307, USA.
+#
+# Copyright 2000-2005 Free Software Foundation
+#
+# FILE:
+#
+# DESCRIPTION: 
+"""
+"""
+
+__all__ = [
+      "Checkbox",
+      "Component",
+      "DateTime",
+      "Dropdown",
+      "Image",
+      "Listbox",
+      "Numeric",
+      "Password",
+      "Text",
+       ]
+
+for module in __all__:
+  exec "from gnue.forms.input.displayHandlers.%s import %s" % (module,module)





reply via email to

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