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