[Top][All Lists]
[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)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gnue] r7862 - in trunk/gnue-forms/src: . GFObjects input input/displayHandlers,
jamest <=