commit-gnue
[Top][All Lists]
Advanced

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

gnue/gnuef client/gfclient src/GFController.py ...


From: James Thompson
Subject: gnue/gnuef client/gfclient src/GFController.py ...
Date: Sat, 17 Mar 2001 06:11:25 -0800

CVSROOT:        /cvs
Module name:    gnue
Changes by:     James Thompson <address@hidden> 01/03/17 06:11:25

Modified files:
        gnuef/client   : gfclient 
        gnuef/src      : GFController.py GFEvent.py GFForm.py 
                         GFObjects.py GFOptions.py UIbase.py 
                         UIwxpython.py 

Log message:
        Moved gfclient logic out of GFForm into gfclient where it belongs
        Fixed UI corruption issues in multi-block forms

CVSWeb URLs:
http://subversions.gnu.org/cgi-bin/cvsweb/gnue/gnuef/client/gfclient.diff?r1=1.23&r2=1.24
http://subversions.gnu.org/cgi-bin/cvsweb/gnue/gnuef/src/GFController.py.diff?r1=1.9&r2=1.10
http://subversions.gnu.org/cgi-bin/cvsweb/gnue/gnuef/src/GFEvent.py.diff?r1=1.11&r2=1.12
http://subversions.gnu.org/cgi-bin/cvsweb/gnue/gnuef/src/GFForm.py.diff?r1=1.77&r2=1.78
http://subversions.gnu.org/cgi-bin/cvsweb/gnue/gnuef/src/GFObjects.py.diff?r1=1.69&r2=1.70
http://subversions.gnu.org/cgi-bin/cvsweb/gnue/gnuef/src/GFOptions.py.diff?r1=1.23&r2=1.24
http://subversions.gnu.org/cgi-bin/cvsweb/gnue/gnuef/src/UIbase.py.diff?r1=1.24&r2=1.25
http://subversions.gnu.org/cgi-bin/cvsweb/gnue/gnuef/src/UIwxpython.py.diff?r1=1.74&r2=1.75

Patches:
Index: gnue/gnuef/client/gfclient
diff -u gnue/gnuef/client/gfclient:1.23 gnue/gnuef/client/gfclient:1.24
--- gnue/gnuef/client/gfclient:1.23     Sun Feb 25 12:02:54 2001
+++ gnue/gnuef/client/gfclient  Sat Mar 17 06:11:25 2001
@@ -8,10 +8,15 @@
 # and passes control to a UI.
 #
 # NOTES:
+#  Once all the events are moved back in here
+#    debug
+#    make the next/prec methods more generic in the GFForm
+#    change self.form in here to a list
+
 #
 # Copyright (c) 2000 Free Software Foundation
 #
-# $Revision: 1.23 $ $Date: 2001/02/25 20:02:54 $ $Author: jamest $
+# $Revision: 1.24 $ $Date: 2001/03/17 14:11:25 $ $Author: jamest $
 #
 
 import pstats
@@ -26,8 +31,6 @@
 from gnue.forms.GFDebug import *
 from gnue.forms.GFForm import *
 
-__version__ = "0.0.2"
-
 _usage = """
 Usage: %s [-h] [--help] [-d level] [--debug=level] \\
        [-D tracefile] [--debug_file=tracefile] \\
@@ -38,8 +41,8 @@
 Report bugs to address@hidden
 """
 
-class GFClient:
-  def __init__(self):
+class GFClient(GFController):
+  def __init__(self):    
     # Parse command line options 
     self.CmdOpt = GFGetOpt()
     self.CmdOpt.parseOptions(sys.argv)
@@ -49,9 +52,375 @@
     self.help = self.CmdOpt.getOption('help')
     self.version = self.CmdOpt.getOption('version')
     self.profile = self.CmdOpt.getOption('profile')
+
+    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,
+                           }
+    
+    # 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):
+    self.form.nextEntry()
+    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():
+      #self.dispatchEvent( GFEvent( 'msgBoxUI', GFOptions._msgDETAILNOTSAVED) )
+
+      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 hasattr(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 hasattr(self,'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 = hasattr(self.form.title,"title") and self.form.title or "Unknown"
+    formversion = hasattr(self.form,"version") and self.form.version or 
"Unknown"
+    author = hasattr(self.form,"author") and self.form.author or "Unknown"
+    description = hasattr(self.form,"description") and self.form.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()
+
+  #
+  # 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):
+    if hasattr(self.form.currentEntry,'tip'):
+      tip = self.form.currentEntry.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):
+    GFDebug.printMesg(10, "Keypress event %s"%event.data)
+    if (self.form.currentEntry != None):
+      if not hasattr(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 hasattr(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 sourse
+  #
+  def changeFocus(self, event):
+    if event.data.getObjectType()=='GFEntry' and (hasattr(event.data,'hidden') 
or
+                                                  
(hasattr(event.data,'readonly') and self.form.currentBlock.mode!='query')):
+      return
+    newEntry = event.data
+    self.form.changeFocus(newEntry)
+    self.dispatchEvent(GFEvent('gotoENTRY',{'object':self.form.currentEntry}))
+
+    self.updateRecordStatus()
+    self.updateTip()
+
     
-  def run(self):
+  def requestQuery(self, event):
+    if hasattr(self.form.currentBlock,"master"):
+      self.dispatchEvent( GFEvent( 'msgBoxUI', "Query from detail blocks 
currently not supported"))
+      return
+    message = self.form.prepQuery()
+    if message:
+      messageBox = GFMsgBox('HI')
+      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(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(message)
+      messageBox.show()
+                                        
+  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)
+                                                      
+
+#
+# old stuff still in use
+#
+
+  
+  def run(self):    
     if (self.debug_file != None):
       fh = open( self.debug_file, 'w' )
       GFDebug.catchStderr( fh )
@@ -68,7 +437,7 @@
         print _usage % (sys.argv[0])
         sys.exit()
       elif self.version :
-        print "%s v%s" % (sys.argv[0], __version__)
+        print "%s v%s" % (sys.argv[0], GFOptions.VERSION)
         sys.exit()
       else: 
         if sys.argv[0][-8:] != 'gfclient': 
@@ -84,26 +453,33 @@
       if os.environ.has_key('DISPLAY') or os.name != 'posix':
         from gnue.forms import UIwxpython
         ui=UIwxpython.GFUserInterface()
+        
       else:
         SetOptions.ui_type='text'
 
     if self.ui_type == 'pytext':
       from gnue.forms import UIpyncurses
-      ui=UIpyncurses.GFUserInterface()
+      ui=UIpyncurses.GFUserInterface(self)
 
     if self.ui_type == 'text' : 
       from gnue.forms import UIcurses
-      ui=UIcurses.GFUserInterface()
+      ui=UIcurses.GFUserInterface(self)
 
     #
+    # Register to receive events from the UI
+    #
+    ui.registerEventListener(self.processEvent)
+    self.registerEventListener(ui.processEvent)
+    
+    #
     # 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]):
-        fp = open(self.formfile,'r')
+        fileHandle = open(self.formfile,'r')
       else:
-        fp = urllib.urlopen(self.formfile)
+        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()
@@ -111,19 +487,51 @@
     #
     # Build the form tree
     #
-    form = GFForm()
-    control = GFController(form, ui)
-    form.run(fp)
-    fp.close()
+    self.form = GFForm(None,self)
+    control = GFController()
+    self.form.buildFormTree(fileHandle)
+    fileHandle.close()
+
+    #
+    # extract DB info and init datasources
+    #
+    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:
+          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()
+        
+
+          
 
     # pass control to UI
-    ui.buildForm(form)
-    ui.activateForm(form)
+    ui.buildForm(self.form)
+    ui.activateForm(self.form)
     ui.mainLoop()
       
 if __name__ == '__main__':
   GFClient = GFClient()
-  if GFClient.profile :
+  if GFClient.profile:
     import profile
     profile.run("GFClient.run()","runstats")
     p = pstats.Stats('runstats')
Index: gnue/gnuef/src/GFController.py
diff -u gnue/gnuef/src/GFController.py:1.9 gnue/gnuef/src/GFController.py:1.10
--- gnue/gnuef/src/GFController.py:1.9  Thu Jan 11 22:08:48 2001
+++ gnue/gnuef/src/GFController.py      Sat Mar 17 06:11:25 2001
@@ -18,13 +18,14 @@
 from GFEvent import *
 
 class GFController(GFEventAware):
-  def __init__(self, form, ui):
+#  def __init__(self, form, ui):
+  def __init__(self):
     GFEventAware.__init__(self)
-    self.form = form
-    self.ui = ui
+#    self.form = form
+#    self.ui = ui
 
-    ui.registerEventListener(form.processEvent)
-    form.registerEventListener(ui.processEvent)
+#    ui.registerEventListener(form.processEvent)
+#    form.registerEventListener(ui.processEvent)
 
 
 
Index: gnue/gnuef/src/GFEvent.py
diff -u gnue/gnuef/src/GFEvent.py:1.11 gnue/gnuef/src/GFEvent.py:1.12
--- gnue/gnuef/src/GFEvent.py:1.11      Mon Jan  8 17:55:10 2001
+++ gnue/gnuef/src/GFEvent.py   Sat Mar 17 06:11:25 2001
@@ -57,6 +57,7 @@
   #
   def processEvent(self, event):
     try:
+#       GFDebug.printMesg(3, "Event: %s " % (event.getEvent()))
        self.incommingEvent[event.event] (event)
     except KeyError:
       GFDebug.printMesg(3, "Unknown Event: %s " % (event.getEvent()))
Index: gnue/gnuef/src/GFForm.py
diff -u gnue/gnuef/src/GFForm.py:1.77 gnue/gnuef/src/GFForm.py:1.78
--- gnue/gnuef/src/GFForm.py:1.77       Tue Mar 13 16:18:34 2001
+++ gnue/gnuef/src/GFForm.py    Sat Mar 17 06:11:25 2001
@@ -24,42 +24,12 @@
 from GFTriggerError import *
 
 class GFForm(GFObj, GFEventAware):
-  def __init__(self, parent=None):
+  def __init__(self, parent=None, app= None):
     GFObj.__init__(self, parent)
     GFEventAware.__init__(self)
     self.type = "GFForm"
     self.currentObject = [self]
 
-    # Event processing
-    self.incommingEvent = {'requestNEXTENTRY'  : self.nextEntry,
-                           'requestPREVENTRY'  : self.previousEntry,
-                           'requestNEXTBLOCK'  : self.nextBlock,
-                           'requestPREVBLOCK'  : self.previousBlock,
-                           '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,
-                           'requestPREVRECORD' : self.prevRecord,
-                           'requestNEXTRECORD' : self.nextRecord,
-
-                           '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,
-                           }
-
     self.databaseDictionary = {}
     self.datasourceDictionary = {}
 
@@ -79,8 +49,9 @@
 
     self.borderPercentage = 10
     self.textPercentage   = 7.5
+    self.app = app
 
-  def run(self, URL):
+  def buildFormTree(self, URL):
     # Create a parser
     parser = saxexts.make_parser()
     
@@ -96,7 +67,9 @@
     self.walk(self.setInitialFocus)
 
     # Connect to the defined databases
+    #print "Am i here and shoud init the database stuff"
     self.walk(self.initDatabaseObjects)
+    #print "yes i Am i here"
 
     # build the block list
     self.walk(self.initBlocks)
@@ -127,8 +100,9 @@
     self.triggerns['GFMsgBox'] = GFMsgBox
     self.walk(self.initTriggers)      
 
+
+
 
-    self.updateStatus()
     
   #
   # begin routines made for walking
@@ -165,32 +139,32 @@
   def initDatabaseObjects(self, object):
     if object.getObjectType() =='GFDataSource':
       self.datasourceDictionary[object.name]=object
-      object.initialize()
+#      object.initialize()
       
     if object.getObjectType() =='GFDatabase':
       self.databaseDictionary[object.name]=object
-      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()
+#      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:
-          if sys.platform != 'win32':
-            os.system("stty sane")
-          print "Unexpected error:", sys.exc_info()[0], sys.exc_info()[1]
-          sys.exit()
-        else:
-          break
-        
+#        except:
+#          if sys.platform != 'win32':
+#            os.system("stty sane")
+#          print "Unexpected error:", sys.exc_info()[0], sys.exc_info()[1]
+#          sys.exit()
+#        else:
+#          break
+
   def initTriggers(self, object):
     if object.getObjectType() == "GFTrigger":
       object.triggerns.update( self.triggerns )
@@ -199,49 +173,18 @@
 
   #
   # end of routines made for walking
-  #
-
-  #
-  # Routines to update parts of the UI's status bar
   #
-  def updateInsertMode(self):
-    
self.dispatchEvent(GFEvent('uiUPDATESTATUS',[None,None,self.insertMode,None,None,None,None]))
-    
-  def updateRecordCounter(self):
-    
self.dispatchEvent(GFEvent('uiUPDATESTATUS',[None,None,None,self.currentBlock.currentRecord+1,self.currentBlock.recordCount+1,None,None]))
-    
-  def updatePageCounter(self):
-    maxPages = len(self.pageList)
-    for count in range(len(self.pageList)):
-      if self.pageList[count] == self.currentPage:
-        break
-      
-    
self.dispatchEvent(GFEvent('uiUPDATESTATUS',[None,None,None,None,None,count+1,maxPages]))
+  def getDatabaseList(self):
+    return self.databaseDictionary
+  
 
-  def updateTip(self):
-    if hasattr(self.currentEntry,'tip'):
-      tip = self.currentEntry.tip
-    else:
-      tip = ''
-
-    
self.dispatchEvent(GFEvent('uiUPDATESTATUS',[tip,None,None,None,None,None,None]))
-    
-  def updateRecordStatus(self):
-    if self.currentBlock.mode == 'query':
-      status = 'query'
-    else:
-      status = 
self.currentBlock.dataSourceLink.resultSetStatus[self.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()
+  def initializeDatasources(self):
+    for key in self.datasourceDictionary.keys():
+      object = self.datasourceDictionary[key]
+      object.initialize()
 
   def updateUIEntry(self,entry):
-    self.dispatchEvent(GFEvent('updateENTRY',entry));
+    self.app.dispatchEvent(GFEvent('updateENTRY',entry));
 
   def findValue(self, blockname, fieldname):
     for block in self.blockList:
@@ -252,107 +195,50 @@
         return value
     return None
       
-  def toggleInsertMode(self,event):
-    self.insertMode = not self.insertMode
-    self.updateInsertMode()
-
   #
   # Incomming Event handlers
   #
-  def nextRecord(self, event):
-    for block in self.blockList:
-      if hasattr(block,'master'):
-        masterBlock,masterField = string.split(block.master,'.')
-        if masterBlock == self.currentBlock.name:
-          if not block.isSaved():
-            message = GFMsgBox(self, GFOptions._msgDETAILNOTSAVED )
-            message.show()
-            return
-    
-    self.dispatchEvent(GFEvent('uiNEXTRECORD',self.currentEntry))
-    self.currentBlock.nextRecord()
-    self.dispatchEvent(GFEvent('gotoENTRY',self.currentEntry));
-    self.updateRecordCounter()
-    self.updateRecordStatus()
 
-  def prevRecord(self, event):
-    for block in self.blockList:
-      if hasattr(block,'master'):
-        masterBlock,masterField = string.split(block.master,'.')
-        if masterBlock == self.currentBlock.name:
-          if not block.isSaved():
-            message = GFMsgBox(self, GFOptions._msgNOTSAVED)
-            message.show()
-            return
-    self.dispatchEvent(GFEvent('uiPREVRECORD',self.currentEntry))
-    self.currentBlock.prevRecord()
-    self.dispatchEvent(GFEvent('gotoENTRY',self.currentEntry));
-    self.updateRecordCounter()
-    self.updateRecordStatus()
-
-  def newRecord(self, event):
+  def newRecord(self):
     if not hasattr(self,'readonly'):
       self.currentBlock.newRecord()
-      self.dispatchEvent(GFEvent('uiNEXTRECORD',self.currentEntry))
-      self.currentBlock.nextRecord()
-      self.dispatchEvent(GFEvent('uiPREVRECORD',self.currentEntry))
-      self.currentBlock.prevRecord()
-      self.dispatchEvent(GFEvent('gotoENTRY',self.currentEntry));
-      self.updateRecordCounter()
-      self.updateRecordStatus()
-    else:
-      self.dispatchEvent(GFEvent('formALERT','Form is readonly'))
 
-  def deleteRecord(self, event):
+  def deleteRecord(self):
     if not hasattr(self,'readonly'):
       self.currentBlock.deleteRecord()
-      self.updateRecordStatus()
-    else:
-      self.dispatchEvent(GFEvent('formALERT','Form is readonly'))
       
-  def executeExit(self, event):
+  def isSaved(self):
+    saved = 1
     for block in self.blockList:
       if not block.isSaved():
-        #self.parent.dispatchEvent( GFEvent( 'msgBoxUI', 
GFOptions._msgDETAILNOTSAVED) )
-        
-        message = GFMsgBox(self, GFOptions._msgNOTSAVED)
-       message.show()
-        return
-      
-    # If above loop didn't cause function to return then exit
-    self.dispatchEvent(GFEvent('exitApplication','Current data is saved'))
-
-  def requestQuery(self, event):
-    if hasattr(self.currentBlock,"master"):
-      self.parent.dispatchEvent( GFEvent( 'msgBoxUI', "Query from detail 
blocks currently not supported"))
-      return
+        saved = 0
+        break
+    return saved
+  
+
+  def prepQuery(self):
+    message = None
     for block in self.blockList:
       if not block.isSaved():
-        message = GFMsgBox(self, GFOptions._msgNOTSAVED)
-       message.show()
-        return
+        message = GFOptions._msgNOTSAVED
     for block in self.blockList:
       block.processRollback()
       
     self.currentBlock.initQuery()
-    self.dispatchEvent(GFEvent('uiNEXTRECORD',self.currentEntry))
-    self.currentBlock.nextRecord()
-    self.dispatchEvent(GFEvent('uiPREVRECORD',self.currentEntry))
-    self.currentBlock.prevRecord()
-    self.dispatchEvent(GFEvent('gotoENTRY',self.currentEntry));
-    self.updateStatus()
+    return message
+
     
-  def executeQuery(self, event):
+  def executeQuery(self):
+    message = None
     try:
       self.currentBlock.processQuery()
-      self.updateStatus()
     except DBError:
       for key in self.databaseDictionary.keys():
         self.databaseDictionary[key].rollback()
-      message = GFMsgBox(self,"Database query error:\n%s\n%s " % 
(sys.exc_info()[0], sys.exc_info()[1]))
-      message.show()
+      message = "Database query error:\n%s\n%s " % (sys.exc_info()[0], 
sys.exc_info()[1])
 
-  def executeCommit(self, event):
+  def commit(self):
+    message = None
     for key in self.databaseDictionary.keys():
       self.databaseDictionary[key].beginTransaction()
 
@@ -362,26 +248,28 @@
           GFDebug.printMesg(1, "Saving %s"%block.name)
           block.processCommit()
           
-        self.dispatchEvent(GFEvent('uiNEXTRECORD',self.currentEntry))
-        self.currentBlock.nextRecord()
-        self.dispatchEvent(GFEvent('uiPREVRECORD',self.currentEntry))
-        self.currentBlock.prevRecord()
-        self.dispatchEvent(GFEvent('gotoENTRY',self.currentEntry));
-        self.updateRecordStatus()
-        self.updateRecordCounter()
+#        self.dispatchEvent(GFEvent('uiNEXTRECORD',self.currentEntry))
+#        self.currentBlock.nextRecord()
+#        self.dispatchEvent(GFEvent('uiPREVRECORD',self.currentEntry))
+#        self.currentBlock.prevRecord()
+#        self.dispatchEvent(GFEvent('gotoENTRY',self.currentEntry));
+#        self.updateRecordStatus()
+#        self.updateRecordCounter()
       else:
-        self.dispatchEvent(GFEvent('formALERT','Form is readonly'))
-
+        message = 'Form is readonly'
+        return message
+      
       for key in self.databaseDictionary.keys():
         self.databaseDictionary[key].commit()
 
     except DBError:
       for key in self.databaseDictionary.keys():
         self.databaseDictionary[key].rollback()
-      message = GFMsgBox(self,"Database commit error:\n%s\n%s " % 
(sys.exc_info()[0], sys.exc_info()[1]))
-      message.show()
+      message = "Database commit error:\n%s\n%s " % (sys.exc_info()[0], 
sys.exc_info()[1])
     except:
-      print "Argh: \n%s\n%s " % (sys.exc_info()[0], sys.exc_info()[1]) 
+      print "GFForm Argh: \n%s\n%s " % (sys.exc_info()[0], sys.exc_info()[1]) 
+
+    return message
 
   def executeAbout(self,event):
      version = GFOptions.VERSION
@@ -392,17 +280,17 @@
      
      
self.dispatchEvent(GFEvent('uiABOUT',[version,name,formversion,author,description]))
 
-  def executeRollback(self,event):
+  def rollback(self):
     for block in self.blockList:
       block.processRollback();
-    self.dispatchEvent(GFEvent('gotoENTRY',self.currentEntry));
-    self.dispatchEvent(GFEvent('uiNEXTRECORD',self.currentEntry))
+#    self.dispatchEvent(GFEvent('gotoENTRY',self.currentEntry));
+#    self.dispatchEvent(GFEvent('uiNEXTRECORD',self.currentEntry))
     self.currentBlock.nextRecord()
-    self.dispatchEvent(GFEvent('uiPREVRECORD',self.currentEntry))
+#    self.dispatchEvent(GFEvent('uiPREVRECORD',self.currentEntry))
     self.currentBlock.prevRecord()
-    self.dispatchEvent(GFEvent('gotoENTRY',self.currentEntry));                
         
-    self.updateRecordStatus()
-    self.updateRecordCounter()
+#    self.dispatchEvent(GFEvent('gotoENTRY',self.currentEntry));               
          
+#    self.updateRecordStatus()
+#    self.updateRecordCounter()
     
   #
   # updateDetailBlocks
@@ -422,13 +310,154 @@
     print "Trigger Exception Message = ", t.msg
 
             
+
+  #
+  # changeFocus
+  #
+  # changes to the requested entry object requested by
+  # an event sourse
+  #
+  def changeFocus(self, widget):
+    try:
+      self.currentEntry.processTrigger('Pre-FocusOut')
+      self.currentEntry.processTrigger('Post-FocusOut')
+      widget.processTrigger('Pre-FocusIn')
+      self.currentEntry = widget
+      self.currentBlock = self.currentEntry.block
+      widget.processTrigger('Post-FocusIn')
+    except TriggerError, t:
+      print "Got to the exception handler!"
+      self.TriggerErrorFunc(t)
+      
+                        
+  #
+  # moveCursor
+  #
+  # called whenever an event source has requested that the
+  # current input (cursor) position in current entry object be
+  # moved to a new location
+  #
+  def moveCursor(self, position):
+    if position == 'end':
+      self.currentEntry.cursorPosition = len(self.currentEntry.value)
+    elif position == 'home':
+      self.currentEntry.cursorPosition = 0
+    elif position == 'left':
+      self.currentEntry.cursorPosition = self.currentEntry.cursorPosition - 1
+    elif position == 'right':
+      if self.currentEntry.cursorPosition < len(self.currentEntry.value):
+        self.currentEntry.cursorPosition= self.currentEntry.cursorPosition + 1
+  
+  def replaceValue(self,object, value):
+    replacement = ""
+    validValues = object.allowedValues()
+    for key in validValues.keys():
+      if validValues[key] == value:
+        replacement = key
+        break
+    GFDebug.printMesg(2,"(%s, %s)"%(object,value))
+    GFDebug.printMesg(2,"Replacing with %s"% replacement)
+    object.setValue(replacement)
+
+    # Hack!
+    self.dispatchEvent(GFEvent('updateDETAILBLOCK',self.currentBlock))
+    
+  #
+  # keyPress
+  #
+  # Called whenever an event source has requested that a
+  # charater be inserted into current entry object
+  #
+  def keyPress(self, value):
+    modified = 0
+    
+    if (self.currentEntry != None):
+        currentvalue = self.currentEntry.getValue()
+
+        if ord(value) == 13:
+          if self.currentEntry.height > 1: value = '\n';
+          else: return modified 
+
+        if hasattr(self.currentEntry,'foreign_key_description') and 
hasattr(self.currentEntry,'style') and (self.currentEntry.style=='dropdown'):
+          value= self.currentEntry.findClosestValue(value)
+          if not value: return modified
+          
+          self.currentEntry.setValue(value)
+          modified = 1
+          return modified
+          
+        if hasattr(self.currentEntry,'lowercase'):
+          value = string.lower(value)
+        if hasattr(self.currentEntry,'uppercase'):
+          value = string.upper(value)
+        if hasattr(self.currentEntry,'max_length'):
+          if len(currentvalue) >= int(self.currentEntry.max_length):
+            return modified
+          
+        if hasattr(self.currentEntry,'numeric') and self.currentBlock.mode == 
'normal':
+          if not (value in string.digits or value in '.'):
+            return modified
+  
+        if self.insertMode == 1:
+          currentvalue = currentvalue[:self.currentEntry.cursorPosition] + 
value + \
+                   currentvalue[self.currentEntry.cursorPosition:]
+        else:
+          currentvalue = currentvalue[:self.currentEntry.cursorPosition] + 
value + \
+                   currentvalue[self.currentEntry.cursorPosition+1:]
+      
+        self.currentEntry.cursorPosition = self.currentEntry.cursorPosition + 1
+        self.currentEntry.setValue(currentvalue)
+        # Hack alert
+        self.updateDetailBlocks(self.currentBlock)
+        # end hack alert
+                                               
+        modified = 1
+      
+    return modified
+                               
+  #
+  # removeCharacter
+  #
+  # Called whenever an event source has requested that a
+  # charater be removed from the current entry object
+  #
+  def removeCharacter(self, action):
+      modified = 0
+      if action == 'backspace':
+        if self.currentEntry.cursorPosition > 0:
+          self.currentEntry.cursorPosition = self.currentEntry.cursorPosition 
- 1
+          modified = 1
+        else:
+          return modified
+      
+      currentvalue = self.currentEntry.getValue()
+      currentvalue = currentvalue[:self.currentEntry.cursorPosition]  + \
+               currentvalue[self.currentEntry.cursorPosition+1:]
+      self.currentEntry.setValue(currentvalue)
+      modified = 1
+      # hack alert
+      self.updateDetailBlocks(self.currentBlock)
+      # end hack alert
+      return modified
+
+
+  #
+  # fireTrigger
+  #
+  def fireTrigger(self, triggerName):
+    self.triggerDictionary[triggerName](self)
+
+#
+# Updated methods for the new gfclient code
+#
+
   #
   # nextEntry
   #
   # Called whenever an event source has requested that the
   # focus change to the next data entry object
   #
-  def nextEntry(self, event):
+  def nextEntry(self):
     nextEntry = None
     keepNext = 0
     if not self.currentEntry.verifyValue(): return
@@ -451,9 +480,6 @@
 
       self.currentEntry.processTrigger('Post-FocusOut')
       nextEntry.processTrigger('Post-FocusIn')
-      self.dispatchEvent(GFEvent('gotoENTRY',self.currentEntry));
-      self.updateRecordStatus()
-      self.updateTip()
     except TriggerError, t:
       print "Got to the exception handler!"
       self.TriggerErrorFunc(t)
@@ -465,7 +491,7 @@
   # Called whenever an event source has requested that the
   # focus change to the next data entry object
   #
-  def previousEntry(self, event):
+  def previousEntry(self):
     # find last entry widget
     nextEntry = None
     if not self.currentEntry.verifyValue(): return
@@ -492,44 +518,14 @@
       print "Got to the exception handler!"
       self.TriggerErrorFunc(t)
       
-    self.dispatchEvent(GFEvent('gotoENTRY',self.currentEntry));
-    self.updateRecordStatus()
-    self.updateTip()
 
   #
-  # changeFocus
-  #
-  # changes to the requested entry object requested by
-  # an event sourse
-  #
-  def changeFocus(self, event):
-    if event.data.getObjectType()=='GFEntry' and (hasattr(event.data,'hidden') 
or
-                                                  
(hasattr(event.data,'readonly') and self.currentBlock.mode!='query')):
-      return
-    try:
-      self.currentEntry.processTrigger('Pre-FocusOut')
-      self.currentEntry.processTrigger('Post-FocusOut')
-      event.data.processTrigger('Pre-FocusIn')
-
-      self.currentEntry = event.data
-      self.currentBlock = self.currentEntry.block
-
-      event.data.processTrigger('Post-FocusIn')
-    except TriggerError, t:
-      print "Got to the exception handler!"
-      self.TriggerErrorFunc(t)
-      
-    self.dispatchEvent(GFEvent('gotoENTRY',self.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):      
+  def nextBlock(self):      
     nextBlock = self.blockList[0]
     keepNext = 0
     for object in self.blockList:
@@ -560,18 +556,13 @@
       pageWidget = pageWidget.parent
     self.currentPage = pageWidget
 
-    self.dispatchEvent(GFEvent('gotoPAGE',self.currentPage));
-    self.dispatchEvent(GFEvent('gotoENTRY',self.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):
+  def previousBlock(self):
     nextBlock = self.blockList[-1]
     for object in self.blockList:
       if object == self.currentBlock:
@@ -598,131 +589,32 @@
       pageWidget = pageWidget.parent
     self.currentPage = pageWidget
 
-    self.dispatchEvent(GFEvent('gotoPAGE',self.currentPage));
-    self.dispatchEvent(GFEvent('gotoENTRY',self.currentEntry));
-    self.updateStatus()
-
-  #
-  # 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.currentEntry.cursorPosition = len(self.currentEntry.value)
-    elif eventType == 'requestCURSORHOME':
-      self.currentEntry.cursorPosition = 0
-    elif eventType == 'requestCURSORLEFT' and self.currentEntry.cursorPosition 
> 0:
-      self.currentEntry.cursorPosition = self.currentEntry.cursorPosition - 1
-    elif eventType == 'requestCURSORRIGHT':
-      if self.currentEntry.cursorPosition < len(self.currentEntry.value):
-        self.currentEntry.cursorPosition= self.currentEntry.cursorPosition + 1
-      
-    self.dispatchEvent(GFEvent('updateENTRY',self.currentEntry));
-
-  
-  def replaceValue(self,event):
-    replacement = ""
-    object = event.data[0]
-    validValues = object.allowedValues()
-    for key in validValues.keys():
-      if validValues[key] == event.data[1]:
-        replacement = key
-        break
-    GFDebug.printMesg(2,"(%s, %s)"%(event.data[0], event.data[1]))
-    GFDebug.printMesg(2,"Replacing with %s"% replacement)
-    event.data[0].setValue(replacement)
 
-    # Hack!
-    self.dispatchEvent(GFEvent('updateDETAILBLOCK',self.currentBlock))
-    
-  #
-  # keyPress
-  #
-  # Called whenever an event source has requested that a
-  # charater be inserted into current entry object
-  #
-  def keyPress(self, event):
-    GFDebug.printMesg(10, "Keypress event %s"%event.data)
-    if (self.currentEntry != None):
-      if not hasattr(self.currentEntry,'readonly') or 
self.currentBlock.mode=='query':
-        currentvalue = self.currentEntry.getValue()
-
-        if ord(event.data) == 13:
-          if self.currentEntry.height > 1: event.data = '\n';
-          else: return
-
-        if hasattr(self.currentEntry,'foreign_key_description') and 
hasattr(self.currentEntry,'style') and (self.currentEntry.style=='dropdown'):
-          value= self.currentEntry.findClosestValue(event.data)
-          if not value: return
-          self.currentEntry.setValue(value)
-          self.dispatchEvent(GFEvent('updateENTRY',self.currentEntry));
-          return
-          
-        if hasattr(self.currentEntry,'lowercase'):
-          event.data = string.lower(event.data)
-        if hasattr(self.currentEntry,'uppercase'):
-          event.data = string.upper(event.data)
-        if hasattr(self.currentEntry,'max_length'):
-          if len(currentvalue) >= int(self.currentEntry.max_length):
-            return
-          
-        if hasattr(self.currentEntry,'numeric') and self.currentBlock.mode == 
'normal':
-          if not (event.data in string.digits or event.data in '.'):
-            return
-  
-        if self.insertMode == 1:
-          currentvalue = currentvalue[:self.currentEntry.cursorPosition] + 
event.data + \
-                   currentvalue[self.currentEntry.cursorPosition:]
-        else:
-          currentvalue = currentvalue[:self.currentEntry.cursorPosition] + 
event.data + \
-                   currentvalue[self.currentEntry.cursorPosition+1:]
-      
-        self.currentEntry.cursorPosition = self.currentEntry.cursorPosition + 1
-        self.currentEntry.setValue(currentvalue)
-        # Hack alert 
-        self.updateDetailBlocks(self.currentBlock)
-        # end hack alert
-        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 hasattr(self.currentEntry,'readonly') or 
self.currentBlock.mode=='query':
-      if event.getEvent() == 'requestBACKSPACE':
-        if self.currentEntry.cursorPosition > 0:
-          self.currentEntry.cursorPosition = self.currentEntry.cursorPosition 
- 1
-        else:
-          return
-      
-      currentvalue = self.currentEntry.getValue()
-      currentvalue = currentvalue[:self.currentEntry.cursorPosition]  + \
-               currentvalue[self.currentEntry.cursorPosition+1:]
-      self.currentEntry.setValue(currentvalue)
-      # hack alert
-      self.updateDetailBlocks(self.currentBlock)
-      # end hack alert
-      self.updateRecordStatus()
-    else:
-      self.dispatchEvent(GFEvent('formALERT','Field is readonly'))
-
+  def prevRecord(self):
+    for block in self.blockList:
+      if hasattr(block,'master'):
+        masterBlock,masterField = string.split(block.master,'.')
+        if masterBlock == self.currentBlock.name:
+          if not block.isSaved():
+            message = GFMsgBox(self, GFOptions._msgNOTSAVED)
+            message.show()
+            return    
+    self.currentBlock.prevRecord()
 
-  #
-  # fireTrigger
-  #
-  def fireTrigger(self, event):
-    self.triggerDictionary[event.data](self)
+  def nextRecord(self):
+    for block in self.blockList:
+      if hasattr(block,'master'):
+        masterBlock,masterField = string.split(block.master,'.')
+        if masterBlock == self.currentBlock.name:
+          if not block.isSaved():
+            message = GFMsgBox(self, GFOptions._msgDETAILNOTSAVED )
+            message.show()
+            return    
+    self.currentBlock.nextRecord()
 
 
+  def toggleInsertMode(self):
+    self.insertMode = not self.insertMode
 
 
 
Index: gnue/gnuef/src/GFObjects.py
diff -u gnue/gnuef/src/GFObjects.py:1.69 gnue/gnuef/src/GFObjects.py:1.70
--- gnue/gnuef/src/GFObjects.py:1.69    Tue Mar 13 16:18:34 2001
+++ gnue/gnuef/src/GFObjects.py Sat Mar 17 06:11:25 2001
@@ -36,6 +36,8 @@
     if parent :
       parent.addChild(self)
 
+    self.visibleIndex = 0
+
   #
   # initialize
   #
@@ -47,7 +49,6 @@
       for child in self.children:
         child.inititialize(function)
 
-  
   def getObjectType(self):
     return self.type
 
@@ -58,7 +59,6 @@
   #
   def addChild(self, child):
     self.children.append(child)
-
   
   def walk(self, function):
     function(self)
@@ -79,6 +79,44 @@
 
     return parentObject
 
+  #
+  # recalculateVisible
+  #
+  def recalculateVisible(self, adjustment, currentRecord, recordCount):
+    if not hasattr(self, 'hidden'):
+      index = self.visibleIndex + adjustment
+
+      if index < 0 : index = 0
+
+      # Don't let index pass the number of widgets on screen
+      if index >= int(self.visibleCount):
+        index = int(self.visibleCount)-1
+
+      # Don't let the index past the number of records in the
+      # system
+      lowestVisible = currentRecord - index
+      if lowestVisible < 0 : lowestVisible = 0
+      if lowestVisible + index > recordCount:
+        index = index -1
+
+      # If the current record has rolled around
+      # from the top to the bottom then reset
+      # the counter
+      if currentRecord == 0:
+        index = 0
+
+      # if the current record has rolled from
+      # bottom to top then flip to bottom keeping
+      # in mind the number of records in memory
+      if currentRecord == recordCount:
+        if recordCount > int(self.visibleCount)-1:
+          index = int(self.visibleCount)-1
+        else:
+          index = recordCount
+        
+      self.visibleIndex = index
+      self.lowestVisible = lowestVisible
+
 #
 # GFValue
 #
@@ -221,14 +259,16 @@
         
self.dataSourceLink.setField(self.recordCount,self.detail,fieldValue,TRUE)
       
     self.currentRecord = self.recordCount
-    self.switchRecord(self.currentRecord)
+    adjustment = self.recordCount - self.currentRecord
+    self.switchRecord(adjustment)
     
   #
   # Moves the proper record into editing position
   #
-  def switchRecord(self, newRecord):
+  def switchRecord(self, adjustment):
     for entry in self.entryList:
       entry.switchRecord(self.currentRecord)
+      entry.recalculateVisible( adjustment, self.currentRecord, 
self.recordCount)
       self.form.updateUIEntry(entry)
       
     self.form.updateDetailBlocks(self)
@@ -236,12 +276,13 @@
   def nextRecord(self):
     self.currentRecord = self.currentRecord + 1
     if self.currentRecord > self.recordCount : self.currentRecord = 0
-    self.switchRecord(self.currentRecord)
+    self.switchRecord(1)
 
   def prevRecord(self):
     self.currentRecord = self.currentRecord - 1
     if self.currentRecord < 0 : self.currentRecord = self.recordCount    
-    self.switchRecord(self.currentRecord)
+    self.switchRecord(-1)
+
       
   #
   # processCommit
Index: gnue/gnuef/src/GFOptions.py
diff -u gnue/gnuef/src/GFOptions.py:1.23 gnue/gnuef/src/GFOptions.py:1.24
--- gnue/gnuef/src/GFOptions.py:1.23    Mon Mar  5 19:15:42 2001
+++ gnue/gnuef/src/GFOptions.py Sat Mar 17 06:11:25 2001
@@ -66,4 +66,4 @@
 textPercentage = 100
 
 # Version
-VERSION = "0.0.6"
+VERSION = "pre-0.0.7"
Index: gnue/gnuef/src/UIbase.py
diff -u gnue/gnuef/src/UIbase.py:1.24 gnue/gnuef/src/UIbase.py:1.25
--- gnue/gnuef/src/UIbase.py:1.24       Tue Mar 13 16:18:34 2001
+++ gnue/gnuef/src/UIbase.py    Sat Mar 17 06:11:25 2001
@@ -13,7 +13,6 @@
 #
 from GFForm import *
 from GFEvent import *
-from GFController import *
 
 #
 # GFUserInterfaceBase
@@ -24,6 +23,7 @@
 class GFUserInterfaceBase(GFEventAware):
   def __init__(self):
     GFEventAware.__init__(self)
+    
     #
     # incommintEvents
     #
@@ -197,8 +197,12 @@
   # Moves the focus to a specific UI widget
   #
   def switchFocus(self, event):
-    index = self.formToUI[event.data][1]
-    self.formToUIWidget[event.data].indexedFocus(index)
+    formObject = event.data['object']
+    #index = self.formToUI[formObject][1]
+    if formObject: # Some pages might not have any widgets that can be active
+      index = formObject.visibleIndex
+      self.formToUIWidget[formObject].indexedFocus(index)
+    
 
   #
   # aboutBox
@@ -238,65 +242,64 @@
   # this will adjust the entries to ensure the proper one is visible
   #
   def adjustMultiView(self, event):
-#    print "adjustMultiView"
-    block = event.data.block.form.currentBlock
+    print "Whoops"
+    pass
+  
+##    adjustment = event.data['adjustment']
+##    currentRecord = event.data['currentRecord']
+##    recordCount   = event.data['recordCount']
+##    entryList     = event.data['entryList']
     
-    if event.getEvent() == 'uiPREVRECORD':
-      adjustment = -1
-    else:
-      adjustment = 1
+##    # Need to figure out what the currentRecord is
+##    # about to switch to. It hasn't yet.
+##    currentRecord = currentRecord + adjustment
+    
+##    if currentRecord < 0 : currentRecord = recordCount
+##    if currentRecord > recordCount : currentRecord = 0
 
-    # Need to figure out what the currentRecord is
-    # about to switch to. It hasn't yet.
-    currentRecord = block.currentRecord + adjustment
-    if currentRecord < 0 : currentRecord = block.recordCount
-    if currentRecord > block.recordCount : currentRecord = 0
-
-    for entry in block.entryList:
-      if not hasattr(entry, 'hidden'):
-        index = self.formToUI[entry][1]
-        index = index + adjustment
+##    for entry in entryList:
+##      if not hasattr(entry, 'hidden'):
+##        index = self.formToUI[entry][1]
+##        index = index + adjustment
         
-        if index < 0 : index = 0
+##        if index < 0 : index = 0
         
-        # Don't let index pass the number of widgets on screen
-        if index >= int(entry.visibleCount):
-          index = int(entry.visibleCount)-1
+##        # Don't let index pass the number of widgets on screen
+##        if index >= int(entry.visibleCount):
+##          index = int(entry.visibleCount)-1
           
-        # Don't let the index past the number of records in the
-        # system
-        lowestVisible = currentRecord - index
-        if lowestVisible < 0 : lowestVisible = 0
-        if lowestVisible + index > block.recordCount:
-          index = index -1
-
-        # If the current record has rolled around
-        # from the top to the bottom then reset
-        # the counter
-        if currentRecord == 0:
-          index = 0
+##        # Don't let the index past the number of records in the
+##        # system
+##        lowestVisible = currentRecord - index
+##        if lowestVisible < 0 : lowestVisible = 0
+##        if lowestVisible + index > recordCount:
+##          index = index -1
+
+##        # If the current record has rolled around
+##        # from the top to the bottom then reset
+##        # the counter
+##        if currentRecord == 0:
+##          index = 0
           
-        # if the current record has rolled from
-        # bottom to top then flip to bottom keeping
-        # in mind the number of records in memory
-        if currentRecord == block.recordCount:
-          if block.recordCount > int(entry.visibleCount)-1:
-            index = int(entry.visibleCount)-1
-          else:
-            index = block.recordCount
+##        # if the current record has rolled from
+##        # bottom to top then flip to bottom keeping
+##        # in mind the number of records in memory
+##        if currentRecord == recordCount:
+##          if recordCount > int(entry.visibleCount)-1:
+##            index = int(entry.visibleCount)-1
+##          else:
+##            index = recordCount
             
-        self.formToUI[entry][1] = index
+##        self.formToUI[entry][1] = index
 
   #
   # updateEntry
   #
   def updateEntry(self,event):
-    #print "updateEntry on %s" % self.formToUI[event.data]
-    index = self.formToUI[event.data][1]
+    index = event.data.visibleIndex
 
     block = event.data.block
     currentRecord = block.currentRecord
-#    print "Index %s CR %s block %s" %( index, currentRecord, block.name)
 
     if hasattr(event.data, 'style'):
       style = event.data.style
@@ -305,7 +308,6 @@
 
     # Fill the prior spots
     for count in range(index):
-#      print "Prior ",count
       value = 
block.dataSourceLink.getField(currentRecord-(index-count),event.data.field)
       if style == 'dropdown':
         value = event.data.allowedValues()[value]
Index: gnue/gnuef/src/UIwxpython.py
diff -u gnue/gnuef/src/UIwxpython.py:1.74 gnue/gnuef/src/UIwxpython.py:1.75
--- gnue/gnuef/src/UIwxpython.py:1.74   Sun Feb 25 17:50:55 2001
+++ gnue/gnuef/src/UIwxpython.py        Sat Mar 17 06:11:25 2001
@@ -86,7 +86,7 @@
     # In future need to implement callback in platform
     # independent way.
     self.splash = SplashScreen(None,bitmapfile=GFOptions.splashScreenPNG,
-                               duration=2000, # callback=self.onMain,
+                               duration=5000, # callback=self.onMain,
                                style=wxSIMPLE_BORDER|wxCENTRE_ON_SCREEN )
     swidth,sheight = self.splash.GetSizeTuple()
 
@@ -382,26 +382,20 @@
       eo = event.GetEventObject()
       object = wxPyTypeCast(eo, 'wxWindow')
 
+      # Move to proper object
       for key in self.formToUI.keys():
         for count in range(len(self.formToUI[key][0])):
           if self.formToUI[key][0][count].GetId() == object.GetId():
-            # Move to proper row
-            if count < self.formToUI[key][1]:
-              event = GFEvent('requestNEXTRECORD')
-            else:
-              event = GFEvent('requestPREVRECORD')
-            oldIndex = self.formToUI[key][1]
-            while (self.formToUI[key][1] != count):
-              self.dispatchEvent(event)
-              if oldIndex == self.formToUI[key][1]:
-                break  # They've clicked on a widget that
-                       # is beyond the currently loaded
-                       # record count
-
-            # Move to proper object
-            if key.getObjectType() == 'GFEntry':
-              action = GFEvent('requestFOCUS',key)
+            self.dispatchEvent(GFEvent('requestFOCUS',key))
+            self.dispatchEvent(GFEvent('requestJUMPRECORD',count - 
key.visibleIndex))
+            break
             
+      for key in self.formToUI.keys():
+        for count in range(len(self.formToUI[key][0])):
+          if self.formToUI[key][0][count].GetId() == object.GetId():
+            self.dispatchEvent(GFEvent('requestJUMPRECORD',count - 
key.visibleIndex))
+            break
+
     #
     # Combo box events
     #
@@ -417,22 +411,19 @@
       eo = event.GetEventObject()
       object = wxPyTypeCast(eo, 'wxWindow')
 
+      # Move to proper object
+      for key in self.formToUI.keys():
+        for count in range(len(self.formToUI[key][0])):
+          if self.formToUI[key][0][count].GetId() == object.GetId():
+            self.dispatchEvent(GFEvent('requestFOCUS',key))
+            self.dispatchEvent(GFEvent('requestJUMPRECORD',count - 
key.visibleIndex))
+            break
+            
       for key in self.formToUI.keys():
         for count in range(len(self.formToUI[key][0])):
-          GFDebug.printMesg(3, "uiItem %s we want 
%s"%(self.formToUI[key][0][count].GetId(), object.GetId()))
           if self.formToUI[key][0][count].GetId() == object.GetId():
-            # Move to proper row
-            if count < self.formToUI[key][1]:
-              eventAction = GFEvent('requestNEXTRECORD')
-            else:
-              eventAction = GFEvent('requestPREVRECORD')
-            oldIndex = self.formToUI[key][1]
-            while (self.formToUI[key][1] != count):
-              self.dispatchEvent(eventAction)
-              if oldIndex == self.formToUI[key][1]:
-                break  # They've clicked on a widget that
-                       # is beyond the currently loaded
-                       # record count
+            self.dispatchEvent(GFEvent('requestJUMPRECORD',count - 
key.visibleIndex))
+            break
 
       #
       # slightly altered event to call immediate



reply via email to

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