[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
gnue/gnuef/src GFClient.py GFInstance.py
From: |
Jason Cater |
Subject: |
gnue/gnuef/src GFClient.py GFInstance.py |
Date: |
Thu, 31 May 2001 14:52:57 -0700 |
CVSROOT: /home/cvs
Module name: gnue
Changes by: Jason Cater <address@hidden> 01/05/31 14:52:57
Modified files:
gnuef/src : GFClient.py
Added files:
gnuef/src : GFInstance.py
Log message:
Moved controller logic out of GFClient and into new class GFInstance.
This is in anticipation of mult-forms logic.
CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnuef/src/GFInstance.py?cvsroot=OldCVS&rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnuef/src/GFClient.py.diff?cvsroot=OldCVS&tr1=1.15&tr2=1.16&r1=text&r2=text
Patches:
Index: gnue/gnuef/src/GFClient.py
diff -u gnue/gnuef/src/GFClient.py:1.15 gnue/gnuef/src/GFClient.py:1.16
--- gnue/gnuef/src/GFClient.py:1.15 Wed May 30 10:45:36 2001
+++ gnue/gnuef/src/GFClient.py Thu May 31 14:52:57 2001
@@ -34,7 +34,7 @@
#
# Copyright (c) 2000 Free Software Foundation
#
-# $Id: GFClient.py,v 1.15 2001/05/30 17:45:36 jcater Exp $
+# $Id: GFClient.py,v 1.16 2001/05/31 21:52:57 jcater Exp $
#
import pstats
@@ -44,6 +44,7 @@
import urllib
import gnue.forms.GFOptions
from gnue.forms.GFGetOpt import *
+from gnue.forms.GFInstance import *
from gnue.forms.GFForm import *
from gnue.forms.GFController import *
from gnue.forms.GFParser import loadForm
@@ -52,14 +53,16 @@
from gnue.common.GClientApp import *
-class GFClient(GClientApp, GFController):
+class GFClient(GClientApp):
#
# GClientApp() overrides
#
VERSION = GFOptions.VERSION
+ COMMAND = "gfclient"
NAME = "GNUe Forms"
+ USAGE = "gfclient [options] file"
COMMAND_OPTIONS = [
[ 'user_interface', 'u', 'user_interface', 1, 'gui', 'type',
'The currently supported values for <type> are ' \
@@ -70,388 +73,14 @@
#
# Initialize the class
#
- def __init__(self):
- GClientApp.__init__(self)
+ def __init__(self, connections=None):
+ GClientApp.__init__(self, connections)
- self.ui_type = self.OPTIONS['user_interface']
-
- GFController.__init__(self)
-
- # Incomming events
- self.incommingEvent = {'requestNEXTENTRY' : self.nextEntry,
- 'requestPREVENTRY' : self.previousEntry,
- 'requestNEXTBLOCK' : self.nextBlock,
- 'requestPREVBLOCK' : self.previousBlock,
- 'requestPREVRECORD' : self.prevRecord,
- 'requestNEXTRECORD' : self.nextRecord,
- 'requestJUMPRECORD' : self.jumpRecords,
-
- 'requestKEYPRESS' : self.keyPress,
- 'requestREPLACEVALUE' : self.replaceValue,
- 'requestCURSORLEFT' : self.cursorMove,
- 'requestCURSORRIGHT' : self.cursorMove,
- 'requestCURSOREND' : self.cursorMove,
- 'requestCURSORHOME' : self.cursorMove,
- 'requestBACKSPACE' : self.removeCharacter,
- 'requestDELETE' : self.removeCharacter,
- 'requestFOCUS' : self.changeFocus,
- 'requestMODETOGGLE' : self.toggleInsertMode,
-
- 'requestNEWRECORD' : self.newRecord,
- 'requestMARKFORDELETE' : self.deleteRecord,
-
- 'requestQUERY' : self.requestQuery,
- 'executeQUERY' : self.executeQuery,
- 'requestCOMMIT' : self.executeCommit,
- 'requestROLLBACK' : self.executeRollback,
- 'requestEXIT' : self.executeExit,
- 'requestABOUT' : self.executeAbout,
- 'fireTRIGGER' : self.fireTrigger,
-
- 'requestTOGGLECHKBOX' : self.toggleCheckBox,
- }
-
- # Init database list
- self._databaseDictionary = {}
-
- #
- # nextEntry
- #
- # Called whenever an event source has requested that the
- # focus change to the next data entry object
- #
- def nextEntry(self, event):
- message = self._form.nextEntry()
- if message:
- messageBox = GFMsgBox(self, message)
- messageBox.show()
- return
-
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
- self.updateRecordStatus()
- self.updateTip()
-
- #
- # prevEntry
- #
- # Called whenever an event source has requested that the
- # focus change to the next data entry object
- #
- def previousEntry(self, event):
- self._form.previousEntry()
-
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
- self.updateRecordStatus()
- self.updateTip()
-
- #
- # nextBlock
- #
- # Called whenever an event source has requested that the
- # focus change to the next data entry block
- #
- def nextBlock(self,event):
- self._form.nextBlock()
- self.dispatchEvent(GFEvent('gotoPAGE',self._form._currentPage));
-
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
-
- self.updateStatus()
-
- #
- # previousBlock
- #
- # Called whenever an event source has requested that the
- # focus change to the next data entry block
- #
- def previousBlock(self, event):
- self._form.previousBlock()
- self.dispatchEvent(GFEvent('gotoPAGE',self._form._currentPage));
-
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
- self.updateStatus()
-
- #
- # previousRecord
- #
- # Called enever an event source has requested that the
- # form advance to the next record in memory
- #
- def prevRecord(self, event):
- self._form.prevRecord()
-
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
- self.updateRecordCounter()
- self.updateRecordStatus()
-
- #
- # nextRecord
- #
- # Called enever an event source has requested that the
- # form advance to the next record in memory
- #
- def nextRecord(self, event):
- self._form.nextRecord()
-
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
- self.updateRecordCounter()
- self.updateRecordStatus()
-
- #
- # jumpRecord
- #
- # Called enever an event source has requested that the
- # form move an arbitrary number of records
- #
- def jumpRecords(self,event):
- count = event.data
- for jumps in range(abs(count)):
- if count > 0:
- self._form.nextRecord()
- if count < 0:
- self._form.prevRecord()
-
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
- self.updateRecordCounter()
- self.updateRecordStatus()
-
-
-
- def executeExit(self, event):
- if not self._form.isSaved():
- message = GFMsgBox(self, GFOptions._msgNOTSAVED)
- message.show()
- else:
- # If above loop didn't cause function to return then exit
- self.dispatchEvent(GFEvent('exitApplication','Current data is saved'))
-
- return
-
- #
- # deleteRecord
- #
- # Tells the form to mark a record for delete
- #
- def deleteRecord(self, event):
- if not self._form.readonly:
- self._form.deleteRecord()
- self.updateRecordStatus()
- else:
- self.dispatchEvent(GFEvent('formALERT','Form is readonly'))
-
-
- #
- # newRecord
- #
- # Tells the form to create a new record
- #
- def newRecord(self, event):
- if not self._form.readonly:
- self._form.newRecord()
-
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
- self.updateRecordCounter()
- self.updateRecordStatus()
- else:
- self.dispatchEvent(GFEvent('formALERT','Form is readonly'))
-
-
- #
- # executeAbout
- #
- # Displays the about dialog
- #
- def executeAbout(self,event):
- version = GFOptions.VERSION
- name = self._form.getOption('title') or "Unknown"
- formversion = self._form.getOption('version') or "Unknown"
- author = self._form.getOption('author') or "Unknown"
- description = self._form.getOption('description') or "Unknown"
-
self.dispatchEvent(GFEvent('uiABOUT',[version,name,formversion,author,description]))
-
- #
- # toggleInsertMode(self):
- #
- # tells the form to toggle mode
- #
- def toggleInsertMode(self, event):
- self._form.toggleInsertMode()
- self.updateInsertMode()
-
- #
- # executeRollback
- #
- # Tells the form to rollback everything it contains
- #
- def executeRollback(self,event):
- self._form.rollback()
-
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
- self.updateRecordStatus()
- self.updateRecordCounter()
+ self._formInstances = {}
+ self._lastSerialNumber = 0
- #
- # cursorMove
- #
- # called whenever an event source has requested that the
- # current input (cursor) position in current entry object be
- # moved to a new location
- #
- def cursorMove(self, event):
- eventType = event.getEvent()
- if eventType == 'requestCURSOREND':
- self._form.moveCursor('end')
- elif eventType == 'requestCURSORHOME':
- self._form.moveCursor('home')
- elif eventType == 'requestCURSORLEFT':
- self._form.moveCursor('left')
- elif eventType == 'requestCURSORRIGHT':
- self._form.moveCursor('right')
-
- self.dispatchEvent(GFEvent('updateENTRY',self._form._currentEntry));
-
- #
- # Routines to update parts of the UI's status bar
- #
- def updateInsertMode(self):
-
self.dispatchEvent(GFEvent('uiUPDATESTATUS',[None,None,self._form._insertMode,None,None,None,None]))
-
- def updateRecordCounter(self):
-
self.dispatchEvent(GFEvent('uiUPDATESTATUS',[None,None,None,self._form._currentBlock._currentRecord+1,self._form._currentBlock._recordCount+1,None,None]))
-
- def updatePageCounter(self):
- maxPages = len(self._form._pageList)
- for count in range(len(self._form._pageList)):
- if self._form._pageList[count] == self._form._currentPage:
- break
-
-
self.dispatchEvent(GFEvent('uiUPDATESTATUS',[None,None,None,None,None,count+1,maxPages]))
-
- def updateTip(self):
- tip = ''
- if self._form._currentEntry:
- if self._form._currentEntry.getOption('tip'):
- tip = self._form._currentEntry.getOption('tip')
- else:
- tip = ''
-
-
self.dispatchEvent(GFEvent('uiUPDATESTATUS',[tip,None,None,None,None,None,None]))
-
- def updateRecordStatus(self):
- if self._form._currentBlock.mode == 'query':
- status = 'query'
- else:
- status =
self._form._currentBlock._dataSourceLink.resultSetStatus[self._form._currentBlock._currentRecord]
-
self.dispatchEvent(GFEvent('uiUPDATESTATUS',[None,status,None,None,None,None,None]))
-
- def updateStatus(self):
- self.updateTip()
- self.updateInsertMode()
- self.updateRecordCounter()
- self.updateRecordStatus()
- self.updatePageCounter()
-
- #
- # keyPress
- #
- # Called whenever an event source has requested that a
- # charater be inserted into current entry object
- #
- def keyPress(self, event):
- GDebug.printMesg(10, "Keypress event %s"%event.data)
- if (self._form._currentEntry != None):
- if not self._form._currentEntry.readonly or
self._form._currentBlock.mode=='query':
- if self._form.keyPress(event.data):
- self.dispatchEvent(GFEvent('updateENTRY',self._form._currentEntry));
- self.updateRecordStatus()
- else:
- self.dispatchEvent(GFEvent('formALERT','Field is readonly'))
-
- #
- # removeCharacter
- #
- # Called whenever an event source has requested that a
- # charater be removed from the current entry object
- #
- def removeCharacter(self, event):
- if not self._form._currentEntry.readonly or
self._form._currentBlock.mode=='query':
- if event.getEvent() == 'requestBACKSPACE':
- action = 'backspace'
- else:
- action = 'delete'
-
- if self._form.removeCharacter(action):
- self.dispatchEvent(GFEvent('updateENTRY',self._form._currentEntry));
- self.updateRecordStatus()
- self.updateRecordStatus()
- else:
- self.dispatchEvent(GFEvent('formALERT','Field is readonly'))
-
- #
- # changeFocus
- #
- # changes to the requested entry object requested by
- # an event source
- #
- def changeFocus(self, event):
- if event.data.getObjectType()=='GFEntry' and (event.data.hidden or
- (event.data.readonly and
self._form._currentBlock.mode!='query')):
- return
- newEntry = event.data
- message = self._form.changeFocus(newEntry)
- if message:
- messageBox = GFMsgBox(self, message)
- messageBox.show()
- return
-
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
-
- self.updateRecordStatus()
- self.updateTip()
-
-
- def requestQuery(self, event):
- if hasattr(self._form._currentBlock,"master"):
- messageBox = GFMsgBox(self, "Query from detail blocks currently not
supported")
- messageBox.show()
- return
- message = self._form.prepQuery()
- if message:
- messageBox = GFMsgBox(self,message)
- messageBox.show()
- return
-
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
- self.updateStatus()
-
- def executeCommit(self, event):
- message = self._form.commit()
- if message:
- messageBox = GFMsgBox(self,message)
- messageBox.show()
- return
-
self.dispatchEvent(GFEvent('gotoENTRY',{'object':self._form._currentEntry}))
- self.updateRecordStatus()
- self.updateRecordCounter()
-
- def executeQuery(self, event):
- message = self._form.executeQuery()
- if message:
- messageBox = GFMsgBox(self,message)
- messageBox.show()
- self.updateRecordStatus()
- self.updateRecordCounter()
-
- def replaceValue(self,event):
- replacement = ""
- object = event.data[0]
- value = event.data[1]
- self._form.replaceValue(object,value)
-
- # Hack!
- self.dispatchEvent(GFEvent('updateDETAILBLOCK',self._form._currentBlock))
-
- #
- # fireTrigger
- #
- def fireTrigger(self, event):
- self._form.fireTrigger(event.data)
-
+ self.ui_type = self.OPTIONS['user_interface']
- def toggleCheckBox(self, event):
- object = event.data[0]
- value = event.data[1]
- object.setValue(value)
-
#
# old stuff still in use
@@ -462,11 +91,11 @@
#
# GClientApp().run() override
#
- def run(self):
-
+ def run(self):
+
# assign form file from 1st free argument
try:
- self._formfile = self.ARGUMENTS[0]
+ formfile = self.ARGUMENTS[0]
except:
self.handleStartupError ("No Forms Definition File Specified.")
@@ -476,87 +105,52 @@
if self.ui_type == 'gui' :
if os.environ.has_key('DISPLAY') or os.name != 'posix':
from gnue.forms import UIwxpython
- ui=UIwxpython.GFUserInterface()
+ self._ui=UIwxpython.GFUserInterface
else:
self.ui_type='text'
if self.ui_type == 'pytext':
from gnue.forms import UIpyncurses
- ui=UIpyncurses.GFUserInterface(self)
+ self._ui=UIpyncurses.GFUserInterface
if self.ui_type == 'text' :
from gnue.forms import UIcurses
- ui=UIcurses.GFUserInterface(self)
+ self._ui=UIcurses.GFUserInterface
- #
- # Register to receive events from the UI
- #
- ui.registerEventListener(self.processEvent)
- self.registerEventListener(ui.processEvent)
- self.setLoginHandler(ui.getLoginHandler())
+ self.runForm(formfile)
+
+
+ def runForm(self, formFile):
- #
- # get the form file handler
- # we have to deal with win32 urllib thinking the the c: in c:/foo/bar is a
protocol
- drive = os.path.splitdrive(self._formfile)
- try:
- if len(drive[0]):
- fileHandle = open(self._formfile,'r')
- else:
- fileHandle = urllib.urlopen(self._formfile)
- except:
- print "The file %s doesn't seem to exist.\n%s\n%s" % (self._formfile,
sys.exc_info()[0], sys.exc_info()[1])
- sys.exit()
+ instance = GFInstance(self, self.getNextSerialNumber(),
+ connections=self.connections, ui=self._ui)
#
# Build the form tree
#
- self._form = loadForm (fileHandle, self)
- fileHandle.close()
+ drive = os.path.splitdrive(formFile)
+ if len(drive[0]):
+ fileHandle = open(formFile,'r')
+ else:
+ fileHandle = urllib.urlopen(formFile)
- control = GFController()
+ form = loadForm (fileHandle, instance)
+ fileHandle.close()
#
- # extract DB info and init datasources
+ # Create and start the instance
#
- databaseList = self._form.getDatabaseList()
- for key in databaseList.keys():
- object = databaseList[key]
- while 1:
- try:
- #Login
- authcode = ["", "", object]
- self.dispatchEvent( GFEvent('getLogin', authcode) )
- user = authcode[0]
- passwd = authcode[1]
-
- object.initialize(user,passwd)
-
- except DBError:
- message = GFMsgBox(self,"Database initialization error:\n%s\n%s " %
(sys.exc_info()[0], sys.exc_info()[1]))
- message.show()
- except TypeError:
- # For some bizarre reason, the Oracle driver
- # returns a TypeError for an invalid login????
- print "Invalid Login"
- except:
- if sys.platform != 'win32':
- os.system("stty sane")
- print "Unexpected error:", sys.exc_info()[0], sys.exc_info()[1]
- sys.exit()
- else:
- break
- self._form.initializeDatasources()
-
-# print self._form.dumpXML(1)
-
- # pass control to UI
- ui.buildForm(self._form)
- ui.activateForm(self._form)
- self.updateStatus()
- ui.mainLoop()
+ self._formInstances[instance.getSerialNumber()] = instance
+
+ instance.setForm(form)
+ instance.activate()
+
+
+ def getNextSerialNumber (self):
+ self._lastSerialNumber = self._lastSerialNumber + 1
+ return self._lastSerialNumber
if __name__ == '__main__':
GFClient().run()
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- gnue/gnuef/src GFClient.py GFInstance.py,
Jason Cater <=