[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
gnue/gnuef/src GFClient.py GFForm.py GFObjects....
From: |
James Thompson |
Subject: |
gnue/gnuef/src GFClient.py GFForm.py GFObjects.... |
Date: |
Tue, 03 Oct 2000 18:19:54 -0700 |
CVSROOT: /cvs
Module name: gnue
Changes by: James Thompson <address@hidden> 00/10/03 18:19:54
Modified files:
gnuef/src : GFClient.py GFForm.py GFObjects.py GFParser.py
GFTrigger.py UIbase.py UIwxpython.py
Added files:
gnuef/src : DSpostgresql.py
Removed files:
gnuef/src : DPyGetOpt.py GFCursesPanel.py GFCursesView.py
Log message:
Added Chris Trigger Code
Removed files no longer in use
Start of data access in place
CVSWeb URLs:
http://subversions.gnu.org/cgi-bin/cvsweb/gnue/gnuef/src/DSpostgresql.py.diff?r1=NONE&r2=1.1
http://subversions.gnu.org/cgi-bin/cvsweb/gnue/gnuef/src/GFClient.py.diff?r1=1.10&r2=1.11
http://subversions.gnu.org/cgi-bin/cvsweb/gnue/gnuef/src/GFForm.py.diff?r1=1.10&r2=1.11
http://subversions.gnu.org/cgi-bin/cvsweb/gnue/gnuef/src/GFObjects.py.diff?r1=1.6&r2=1.7
http://subversions.gnu.org/cgi-bin/cvsweb/gnue/gnuef/src/GFParser.py.diff?r1=1.2&r2=1.3
http://subversions.gnu.org/cgi-bin/cvsweb/gnue/gnuef/src/GFTrigger.py.diff?r1=1.1&r2=1.2
http://subversions.gnu.org/cgi-bin/cvsweb/gnue/gnuef/src/UIbase.py.diff?r1=1.2&r2=1.3
http://subversions.gnu.org/cgi-bin/cvsweb/gnue/gnuef/src/UIwxpython.py.diff?r1=1.5&r2=1.6
http://subversions.gnu.org/cgi-bin/cvsweb/gnue/gnuef/src/DPyGetOpt.py.diff?r1=1.1&r2=NONE
http://subversions.gnu.org/cgi-bin/cvsweb/gnue/gnuef/src/GFCursesPanel.py.diff?r1=1.2&r2=NONE
http://subversions.gnu.org/cgi-bin/cvsweb/gnue/gnuef/src/GFCursesView.py.diff?r1=1.2&r2=NONE
Patches:
Index: gnue/gnuef/src/GFClient.py
diff -u gnue/gnuef/src/GFClient.py:1.10 gnue/gnuef/src/GFClient.py:1.11
--- gnue/gnuef/src/GFClient.py:1.10 Fri Sep 29 15:31:44 2000
+++ gnue/gnuef/src/GFClient.py Tue Oct 3 18:19:53 2000
@@ -72,7 +72,6 @@
#
# build the form object
#
- #if os.path.exists(self.formfile):
try:
fp = urllib.urlopen(self.formfile)
except:
@@ -80,7 +79,6 @@
sys.exit()
form = GFForm(fp)
fp.close()
-
# determine the UI to use
if self.ui == 'PYNCURSES' :
Index: gnue/gnuef/src/GFForm.py
diff -u gnue/gnuef/src/GFForm.py:1.10 gnue/gnuef/src/GFForm.py:1.11
--- gnue/gnuef/src/GFForm.py:1.10 Thu Sep 28 21:05:47 2000
+++ gnue/gnuef/src/GFForm.py Tue Oct 3 18:19:53 2000
@@ -12,8 +12,6 @@
#
import sys
-from xml.sax import saxexts
-from xml.sax import saxlib
from GFObjects import *
from GFEvent import *
from GFParser import *
@@ -44,7 +42,11 @@
'requestNEXTRECORD' : self.nextRecord,
'requestNEWRECORD' : self.newRecord,
- 'recordSWITCHED' : self.recordSwitched
+ 'recordSWITCHED' :self.recordSwitched,
+
+# 'requestLOGIN' :self.requestLogin,
+ 'uiINITIALIZED' :self.uiInitialized
+
}
# Insert/Overwrite mode
@@ -57,9 +59,6 @@
self.blockList = []
-## self.currentRecord = 0
-## self.recordCount = 0
-
# Create a parser
parser = saxexts.make_parser()
@@ -78,12 +77,9 @@
self.walk(self.setInitialFocus)
# build the block list
- # self.walk(self.buildBlockList)
self.walk(self.initBlocks)
self.walk(self.initEntries)
- #self.walk(self.printObject)
-
#
# begin routines made for walking
#
@@ -99,10 +95,6 @@
if object.getObjectType() == 'GFEntry' and self.currentEntry == None:
self.currentEntry = object
- def buildBlockList(self,object):
- if object.getObjectType() == 'GFBlock':
- self.blockList.append(object)
-
def initBlocks(self, object):
if object.getObjectType() == 'GFBlock':
self.blockList.append(object)
@@ -259,11 +251,11 @@
nextBlock = object
break
-# self.currentBlock.processTrigger('Pre-FocusOut')
-# self.currentBlock.processTrigger('Post-FocusOut')
-# nextBlock.processTrigger('Pre-FocusIn')
+ self.currentBlock.processTrigger('Pre-FocusOut')
+ self.currentBlock.processTrigger('Post-FocusOut')
+ nextBlock.processTrigger('Pre-FocusIn')
self.currentBlock = nextBlock
-# nextBlock.processTrigger('Post-FocusIn')
+ nextBlock.processTrigger('Post-FocusIn')
# reset current entry
@@ -280,13 +272,6 @@
self.dispatchEvent(GFEvent('gotoPAGE',self.currentPage));
self.dispatchEvent(GFEvent('gotoENTRY',self.currentEntry));
-
-# print "New Page", self.currentPage
-# print "New Block", self.currentBlock
-# print "New Entry",self.currentEntry
-
-
-
#
# previousBlock
#
@@ -294,12 +279,6 @@
# focus change to the next data entry block
#
def previousBlock(self, event):
-
-# print "Current Page", self.currentPage
-# print "Current Block", self.currentBlock
-# print "Current Entry", self.currentEntry
-
-
nextBlock = self.blockList[-1]
for object in self.blockList:
if object == self.currentBlock:
@@ -307,11 +286,11 @@
nextBlock = object
-# self.currentBlock.processTrigger('Pre-FocusOut')
-# self.currentBlock.processTrigger('Post-FocusOut')
-# nextBlock.processTrigger('Pre-FocusIn')
+ self.currentBlock.processTrigger('Pre-FocusOut')
+ self.currentBlock.processTrigger('Post-FocusOut')
+ nextBlock.processTrigger('Pre-FocusIn')
self.currentBlock = nextBlock
-# nextBlock.processTrigger('Post-FocusIn')
+ nextBlock.processTrigger('Post-FocusIn')
# reset current entry
@@ -328,14 +307,6 @@
self.dispatchEvent(GFEvent('gotoPAGE',self.currentPage));
self.dispatchEvent(GFEvent('gotoENTRY',self.currentEntry));
-
-# print "New Page", self.currentPage
-# print "New Block", self.currentBlock
-# print "New Entry",self.currentEntry
-
-
-
-
#
# cursorMove
#
@@ -409,8 +380,21 @@
self.dispatchEvent(GFEvent('updateENTRY',event.data))
+ #
+ # requireLogin
+ #
+ # Tells the UI to prompt for username/password and
+ # blocks until it gets them
+ #
+ def uiInitialized(self,event):
+ self.loginInProgress = 1
+
+ self.dispatchEvent(GFEvent('requireLogin',self))
+ while self.loginInProgress:
+ print "We're up dude!"
+ pass
Index: gnue/gnuef/src/GFObjects.py
diff -u gnue/gnuef/src/GFObjects.py:1.6 gnue/gnuef/src/GFObjects.py:1.7
--- gnue/gnuef/src/GFObjects.py:1.6 Thu Sep 28 21:05:47 2000
+++ gnue/gnuef/src/GFObjects.py Tue Oct 3 18:19:53 2000
@@ -15,6 +15,8 @@
from GFTrigger import *
from GFEvent import *
+DEBUG = 0
+
#
# Class GFObj
#
@@ -76,15 +78,18 @@
def __init__(self, parent=None, value=None):
self.value = value
self.type = "GFValue"
- print "Value = ", self.value
+ if DEBUG:
+ print "Value = ", self.value
GFObj.__init__(self, parent)
def setValue(self, value):
- print "Value = ", self.value
+ if DEBUG:
+ print "Value = ", self.value
self.value = value
def getValue(self):
- print "Value = ", self.value
+ if DEBUG:
+ print "Value = ", self.value
return self.value
#
@@ -136,9 +141,29 @@
def setValue(self, value):
if not self.value:
GFValue.setValue(self,value)
-
#
+#GFDataSource
+#
+class GFDataSource(GFObj):
+ def __init__(self, parent=None):
+ GFObj.__init__(self, parent)
+ self.type = "GFDataSource"
+#
+#GFDatabase
+#
+class GFDataSet(GFObj):
+ def __init__(self, parent=None):
+ GFObj.__init__(self, parent)
+ self.type = "GFDataSet"
+#
+#GFDataSource
+#
+class GFDatabase(GFObj):
+ def __init__(self, parent=None):
+ GFObj.__init__(self, parent)
+ self.type = "GFDatabase"
+#
#
# More complex objects below
#
@@ -213,7 +238,8 @@
# recordSwitched
#
def recordSwitched(self, event):
- print event.data, " just switched records"
+ if DEBUG:
+ print event.data, " just switched records"
self.dispatchEvent(GFEvent('recordSWITCHED',event.data))
#
@@ -276,7 +302,8 @@
# Moves the proper record into editing position
#
def switchRecord(self, event):
- print "Switching to record ",event.data
+ if DEBUG:
+ print "Switching to record ",event.data
self.value = self.valueArray[event.data]
self.dispatchEvent(GFEvent('recordSWITCHED',self));
Index: gnue/gnuef/src/GFParser.py
diff -u gnue/gnuef/src/GFParser.py:1.2 gnue/gnuef/src/GFParser.py:1.3
--- gnue/gnuef/src/GFParser.py:1.2 Thu Sep 28 23:05:48 2000
+++ gnue/gnuef/src/GFParser.py Tue Oct 3 18:19:53 2000
@@ -9,6 +9,7 @@
# HISTORY:
# 20-Sep-2000 File cut from GFForm.py and modified by Chris Spence
# 21-Sep-2000 Started work on new object model which is easier to expand
+# 30-Sep-2000 Added support for two elements <trigger> and <inittrigger>
#
# Copyright (c) 2000 James Thompson
#
@@ -19,7 +20,7 @@
import string
import sys
-DEBUG = 1
+DEBUG = 0
#
#Remove redundant whitespace from a string ( from xml-howto )
@@ -28,6 +29,17 @@
return string.join( string.split(text), ' ')
#
+# Dictionary to keep track of the namespace for python triggers. For the
+# time being it is instantiated with module scope, but will need to
+# be an attribute of the form class eventually. The static key is intended
+# for form scope variables and the parser key is intended to give options
+# to the parser. Other keys are the block names in the XML file.
+#
+
+triggerns = { 'static': {},
+ 'parser': {'version': '0.0'}}
+
+#
#Abstract class representing XML element
#Methods:
# __init__ called when a start tag of this element is encountered.
@@ -117,6 +129,46 @@
return {self.name: contents}
#
+# Class representing a <trigger> element. In this implentation, I've
+# built the trigger inside the parser. In future this could be broken
+# into a series of subclasses dealing with different trigger languages
+#
+class XMLTrigger(XMLElement):
+ def __init__(self, name, attrs, wparent):
+ XMLElement.__init__(self, name, attrs, wparent)
+ try: self.type = attrs['type']
+ except KeyError:
+ print "No Type specified for trigger in %s" % wparent.name
+ sys.exit()
+ try:
+ self.language = attrs['language']
+ except KeyError:
+ self.language = 'python'
+
+ def __del__(self):
+ XMLElement.__del__(self)
+ if self.language != 'python':
+ print "Language %s not implemented" % self.language
+ sys.exit()
+ # First compile the trigger:
+ # Compilation at this stage has the useful side effect that
+ # syntax errors are spotted during XML parsing rather than
+ # during execution.
+ try:
+ code = compile(self.contents, '<string>', 'exec')
+ except SyntaxError, err:
+ print "Syntax error in line %d of trigger in element ??" \
+ % ( err.lineno )
+ sys.exit()
+ localns = {} # Set the namespace used for the
+ globalns = triggerns # trigger.
+ # Now add to the widget
+ def thisTrigger(myself, code = code,
+ localns = localns, globalns = globalns):
+ globalns['self'] = myself
+ exec( code, globalns, localns )
+ self.widgetParent.addTrigger(self.type, thisTrigger)
+#
# Class representing a widget. Note: Later it will be neccesary to seperate
# this into subclasses for container widgets and controls in order to
# allow widget packing etc.
@@ -125,7 +177,12 @@
widgets = { 'page' : GFPage,
'block' : GFBlock,
'label' : GFLabel,
- 'entry' : GFEntry}
+ 'entry' : GFEntry,
+# 'trigger': GFTrigger,
+ 'datasource': GFDataSource,
+ 'dataset': GFDataSet,
+ 'database': GFDatabase
+ }
def __init__(self, name, attrs, wParent):
XMLOElement.__init__(self, name, attrs, wParent)
@@ -138,7 +195,10 @@
def startTag(self, name, attrs):
child = XMLOElement.startTag(self, name, attrs)
if child == None:
- child = XMLWidget(name, attrs, self.widget)
+ if name == 'trigger':
+ child = XMLTrigger(name, attrs, self.widget)
+ else:
+ child = XMLWidget(name, attrs, self.widget)
return child
def __del__(self):
@@ -181,4 +241,7 @@
#
#
#
+
+
+
Index: gnue/gnuef/src/GFTrigger.py
diff -u gnue/gnuef/src/GFTrigger.py:1.1 gnue/gnuef/src/GFTrigger.py:1.2
--- gnue/gnuef/src/GFTrigger.py:1.1 Mon Aug 28 11:40:35 2000
+++ gnue/gnuef/src/GFTrigger.py Tue Oct 3 18:19:53 2000
@@ -11,14 +11,8 @@
# Copyright (c) 2000 James Thompson
#
-#
-# Class GFObj
-#
-# Base internal object for GNUE Forms
-#
-# Provides the basic nested object tree support
-# as well as support for triggers
-#
+from GFObjects import *
+
class GFTriggerAware:
def __init__(self):
self.trigger = {}
@@ -36,11 +30,43 @@
def processTrigger(self, key):
if self.validTriggers.count(key):
- if len(self.trigger) != 0:
+ if self.trigger.has_key(key):
for function in self.trigger[key]:
function(self)
else:
print "No triggers to fire"
else:
print "Invalid trigger ",key
+
+
+
+##class GFTrigger(GFObj):
+## def __init__(self, name, attrs, wparent):
+## GFObj.__init__(self, parent)
+## if self.language != 'python':
+## print "Language %s not implemented" % self.language
+## sys.exit()
+## # First compile the trigger:
+## # Compilation at this stage has the useful side effect that
+## # syntax errors are spotted during XML parsing rather than
+## # during execution.
+## try:
+## code = compile(self.contents, '<string>', 'exec')
+## except SyntaxError, err:
+## print "Syntax error in line %d of trigger in element ??" \
+## % ( err.lineno )
+## sys.exit()
+
+## localns = {} # Set the namespace used for the
+## globalns = triggerns # trigger.
+
+## def thisTrigger(myself, code = code,
+## localns = localns, globalns = globalns):
+## globalns['self'] = myself
+## exec( code, globalns, localns )
+
+
+
+
+
Index: gnue/gnuef/src/UIbase.py
diff -u gnue/gnuef/src/UIbase.py:1.2 gnue/gnuef/src/UIbase.py:1.3
--- gnue/gnuef/src/UIbase.py:1.2 Sun Aug 27 20:06:37 2000
+++ gnue/gnuef/src/UIbase.py Tue Oct 3 18:19:53 2000
@@ -28,7 +28,6 @@
self.form = form;
self.formToUI = {} # the GFObj to UI widget cross ref
-# self.UIToForm = {}
self.currentObject = [form] # the current GFForm object
self.currentWidget = [self] # the current UI widget
@@ -51,7 +50,8 @@
'GFPage': self.pageHandler,
'GFLabel': self.stdHandler,
'GFEntry': self.stdHandler,
- 'GFForm': self.formHandler
+ 'GFForm': self.formHandler,
+ 'GFDataSource': self.notVisible
}
#
@@ -65,8 +65,8 @@
self.onInit(form)
-# self.buildUI()
-# self.pageList[0].Show(TRUE)
+ def notVisible(self):
+ pass
#
# stdHandler
Index: gnue/gnuef/src/UIwxpython.py
diff -u gnue/gnuef/src/UIwxpython.py:1.5 gnue/gnuef/src/UIwxpython.py:1.6
--- gnue/gnuef/src/UIwxpython.py:1.5 Fri Sep 29 10:15:29 2000
+++ gnue/gnuef/src/UIwxpython.py Tue Oct 3 18:19:53 2000
@@ -66,6 +66,7 @@
self.buildUI()
self.pageList[0].Show(TRUE)
self.visiblePage = self.pageList[0]
+
#
# uiEventTrap traps wxPython events and converts
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- gnue/gnuef/src GFClient.py GFForm.py GFObjects....,
James Thompson <=