commit-gnue
[Top][All Lists]
Advanced

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

[gnue] r7601 - in trunk: gnue-common/src/datasources gnue-forms/src/GFOb


From: reinhard
Subject: [gnue] r7601 - in trunk: gnue-common/src/datasources gnue-forms/src/GFObjects
Date: Thu, 16 Jun 2005 15:43:48 -0500 (CDT)

Author: reinhard
Date: 2005-06-16 15:43:47 -0500 (Thu, 16 Jun 2005)
New Revision: 7601

Modified:
   trunk/gnue-common/src/datasources/GDataSource.py
   trunk/gnue-forms/src/GFObjects/GFBlock.py
   trunk/gnue-forms/src/GFObjects/GFField.py
Log:
Replaced ResultSetListener system by standard event handling system.


Modified: trunk/gnue-common/src/datasources/GDataSource.py
===================================================================
--- trunk/gnue-common/src/datasources/GDataSource.py    2005-06-16 20:40:17 UTC 
(rev 7600)
+++ trunk/gnue-common/src/datasources/GDataSource.py    2005-06-16 20:43:47 UTC 
(rev 7601)
@@ -29,6 +29,7 @@
 
 from gnue.common.apps import errors
 from gnue.common.definitions import GObjects, GParser, GParserHelpers
+from gnue.common import events
 from gnue.common.formatting import GTypecast
 from gnue.common.datasources import Exceptions, GConditions, GConnections
 
@@ -42,6 +43,15 @@
   Class that handles DataSources.  This is a subclass of GObj, which
   means this class can be created from XML markup and stored in an
   Object tree (e.g., a Forms tree).
+
+  Each GDataSource object maintains its own event controller and issues the
+  following events:
+  - dsResultSetActivated (parameters: resultSet) whenever the current ResultSet
+    of this datasource changes; this happens when a query is executed or when
+    the master of this datasource moves to another record.
+  - dsResultSetChanged (parameters: resultSet) whenever the current ResultSet
+    has been reloaded from the backend; this happens after each commit if the
+    "requery" option of this datasource is in use.
   """
 
   # 
--------------------------------------------------------------------------- 
@@ -77,10 +87,14 @@
     # (pk_fields, fk_fields) tuples.
     self.__details = {}
 
+    # We maintain our own event controller, so an object interested in *our*
+    # events doesn't get the events of other datasources
+    self.__eventController = events.EventController ()
+    self.registerEventListeners = self.__eventController.registerEventListeners
+
     self._inits = [self.__primaryInit, self.__secondaryInit,
                    self.__tertiaryInit]
     self._currentResultSet = None
-    self._resultSetListeners = []
     self._toplevelParent = None # Needs to be set by subclass
                                 # so that _topObject gets set
     self._topObject = None
@@ -419,14 +433,6 @@
 
 
   # ---------------------------------------------------------------------------
-  # Register a listener for changes of the ResultSet
-  # ---------------------------------------------------------------------------
-
-  def registerResultSetListener(self, listener):
-    self._resultSetListeners.append(listener)
-
-
-  # ---------------------------------------------------------------------------
   # Called by dbdrivers whenever this datasource's master has changed
   # ---------------------------------------------------------------------------
 
@@ -490,9 +496,9 @@
     newResultSet.close ()
 
     # If this is the current result set, then the UI has to follow the changes.
-    # FIXME: this should be a different method than for a new result set.
     if resultSet == self._currentResultSet:
-      self.__notifyResultSetListeners ()
+      self.__eventController.dispatchEvent ('dsResultSetChanged',
+          resultSet = resultSet)
 
 
   # ---------------------------------------------------------------------------
@@ -587,19 +593,11 @@
   def _activateResultSet (self, resultSet):
 
     self._currentResultSet = resultSet
-    self.__notifyResultSetListeners ()
+    self.__eventController.dispatchEvent ('dsResultSetActivated',
+        resultSet = resultSet)
 
 
   # ---------------------------------------------------------------------------
-  # Notify everybody who's interested in newly loaded result sets
-  # ---------------------------------------------------------------------------
-
-  def __notifyResultSetListeners (self):
-    for listener in self._resultSetListeners:
-      listener (self._currentResultSet)
-
-
-  # ---------------------------------------------------------------------------
   # Post all changes in this datasource to the backend
   # ---------------------------------------------------------------------------
 

Modified: trunk/gnue-forms/src/GFObjects/GFBlock.py
===================================================================
--- trunk/gnue-forms/src/GFObjects/GFBlock.py   2005-06-16 20:40:17 UTC (rev 
7600)
+++ trunk/gnue-forms/src/GFObjects/GFBlock.py   2005-06-16 20:43:47 UTC (rev 
7601)
@@ -226,6 +226,12 @@
              'block': self.name}
     self._dataSourceLink.setBlock (self)
 
+    # Register event handling functions
+    self._dataSourceLink.registerEventListeners ({
+        'dsResultSetActivated': self.__dsResultSetActivated,
+        'dsResultSetChanged'  : self.__dsResultSetActivated, # sic!
+        })
+
     # Get min and max child rows, if applicable
     try:
       self._minChildRows = self._dataSourceLink.detailmin
@@ -236,9 +242,6 @@
     except AttributeError:
       self._maxChildRows = None
 
-    # We will monitor our own resultSet changes
-    self._dataSourceLink.registerResultSetListener(self._loadResultSet)
-
     self.walk(self.__setChildRowSettings)
 
   def __setChildRowSettings(self, object):
@@ -252,9 +255,33 @@
     else:
       object._gap = self._gap
 
+
+  # ---------------------------------------------------------------------------
+  # Event handling functions for datasource events
+  # ---------------------------------------------------------------------------
+
+  def __dsResultSetActivated (self, event):
+
+    self._resultSet = event.resultSet
+
+    self._recordCount = self._resultSet.getRecordCount ()
+
+    # This makes the resultSet call our currentRecordMoved method
+    self._resultSet.registerListener (self)
+
+    # Do this again because currentRecordMoved doesn't act on -1
+    self._currentRecord = self._resultSet.getRecordNumber ()
+
+    # If the ResultSet already has a current record loaded, stay there.
+    # Otherwise, jump to the first record. If there is none, create an empty
+    # record.
+    if self._currentRecord == -1 and not self._resultSet.firstRecord ():
+      self.newRecord ()
+
+
+  # ---------------------------------------------------------------------------
   #
   #
-  #
   def getFocusOrder(self):
     list = []
     for field in self._children:
@@ -295,29 +322,6 @@
     self._resultSet.current.delete()
 
   #
-  #
-  def _loadResultSet(self, resultSet):
-    """
-    Load and process a resultset
-    """
-    self._resultSet = resultSet
-
-    self._recordCount = self._resultSet.getRecordCount ()
-
-    # This makes the resultSet call our currentRecordMoved method
-    resultSet.registerListener (self)
-
-    # Do this again because currentRecordMoved doesn't act on -1
-    self._currentRecord = self._resultSet.getRecordNumber ()
-
-    # If the ResultSet already has a current record loaded, stay there.
-    # Otherwise, jump to the first record. If there is none, create an empty
-    # record.
-    if self._currentRecord == -1 and not self._resultSet.firstRecord ():
-      self.newRecord ()
-
-
-  #
   # isEmpty()
   #
   def isEmpty(self):

Modified: trunk/gnue-forms/src/GFObjects/GFField.py
===================================================================
--- trunk/gnue-forms/src/GFObjects/GFField.py   2005-06-16 20:40:17 UTC (rev 
7600)
+++ trunk/gnue-forms/src/GFObjects/GFField.py   2005-06-16 20:43:47 UTC (rev 
7601)
@@ -217,9 +217,13 @@
       for field in [self.fk_key] + self._fk_descr:
         self._fk_datasource.referenceField(field, None)
 
-      # Register as a result set listener
-      self._fk_datasource.registerResultSetListener (self.__loadAllowedValues)
+      # Register event handling functions
+      self._fk_datasource.registerEventListeners ({
+          'dsResultSetActivated': self.__dsResultSetActivated,
+          'dsResultSetChanged'  : self.__dsResultSetActivated, # sic!
+          })
 
+
     if hasattr(self, 'queryDefault') and \
          self.queryDefault != None and \
          self._bound and \
@@ -227,6 +231,18 @@
       block._queryDefaults[self] = self.queryDefault
 
 
+  # ---------------------------------------------------------------------------
+  # Event handling functions for datasource events
+  # ---------------------------------------------------------------------------
+
+  def __dsResultSetActivated (self, event):
+    self.__loadAllowedValues (event.resultSet)
+
+
+  # ---------------------------------------------------------------------------
+  #
+  # ---------------------------------------------------------------------------
+
   def isQueryable(self):
     return self._queryable
 





reply via email to

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