commit-gnue
[Top][All Lists]
Advanced

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

r6653 - trunk/gnue-common/src/datasources/drivers/Base


From: reinhard
Subject: r6653 - trunk/gnue-common/src/datasources/drivers/Base
Date: Mon, 8 Nov 2004 10:51:11 -0600 (CST)

Author: reinhard
Date: 2004-11-08 10:51:10 -0600 (Mon, 08 Nov 2004)
New Revision: 6653

Modified:
   trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py
Log:
Added a possibility to notify other objects that the current record has moved.


Modified: trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py
===================================================================
--- trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py 2004-11-08 
15:03:52 UTC (rev 6652)
+++ trunk/gnue-common/src/datasources/drivers/Base/ResultSet.py 2004-11-08 
16:51:10 UTC (rev 6653)
@@ -57,6 +57,8 @@
      self._defaultValues = {}
      self._defaultValues.update(defaultValues)
 
+     self.__listeners = []
+
      self.current = None
 
      if masterRecordSet:
@@ -121,6 +123,16 @@
       return self._cachedRecords[record]
 
 
+  # Move to a record number already in cache
+  def __move (self, record):
+    if record != self._currentRecord \
+         or self.current != self._cachedRecords [self._currentRecord]:
+      self._currentRecord = record
+      self.current = self._cachedRecords [self._currentRecord]
+      self.notifyDetailObjects ()
+      self.__notifyListeners ()
+
+
   # move to record #, returns record or None if record number out of range
   def setRecord(self, record):
 
@@ -129,26 +141,18 @@
 
     if record >= len(self._cachedRecords):
       return None
-    elif record == self._currentRecord \
-         and self.current == self._cachedRecords [self._currentRecord]:
-      # Nothing has changed - no need to do anything
-      return self.current
-
     else:
-      self._currentRecord = record
-      self.current = self._cachedRecords[self._currentRecord]
-      self.notifyDetailObjects()
+      self.__move (record)
       return self.current
 
+
   # returns next record, or None if no more records
   def nextRecord(self):
     if self._currentRecord + 1 == len(self._cachedRecords):
       if not self._cacheNextRecord():
         return None
 
-    self._currentRecord += 1
-    self.current = self._cachedRecords[self._currentRecord]
-    self.notifyDetailObjects()
+    self.__move (self._currentRecord + 1)
     return self.current
 
 
@@ -157,9 +161,7 @@
     if self._currentRecord < 1:
       return None
     else:
-      self._currentRecord -= 1
-      self.current = self._cachedRecords[self._currentRecord]
-      self.notifyDetailObjects()
+      self.__move (self._currentRecord - 1)
       return self.current
 
 
@@ -169,13 +171,10 @@
       if not self._cacheNextRecord():
         return None
 
-    self._currentRecord = 0
-    self.current = self._cachedRecords[0]
-    self.notifyDetailObjects()
+    self.__move (0)
     return self.current
 
 
-
   # returns 1=at last record, 0=No records loaded
   def lastRecord(self):
     if self._currentRecord == -1:
@@ -183,9 +182,7 @@
     else:
       while self._cacheNextRecord():
         pass
-      self._currentRecord = len(self._cachedRecords) - 1
-      self.current = self._cachedRecords[self._currentRecord]
-      self.notifyDetailObjects()
+      self.__move (len (self._cachedRecords) - 1)
       return self.current
 
 
@@ -223,6 +220,7 @@
           i += 1
 
       self.notifyDetailObjects()
+      self.__notifyListeners ()
       return self.current
 
 
@@ -340,6 +338,24 @@
                                          detail[0]._masterRecordChanged(self))
 
 
+  # Other objects can register here. Their currentRecordMoved method will then
+  # get called whenever the current record of this ResultSet changes.
+  def registerListener (self, listener):
+    if listener not in self.__listeners:
+      self.__listeners.append (listener)
+      # Inform new listener about current record
+      if self._currentRecord >= 0:
+        listener.currentRecordMoved ()
+
+
+  # This gets called whenever the ResultSet gets a new current recordset,
+  # that happens in case of record navigation and in case of inserting a new
+  # record.
+  def __notifyListeners (self):
+    for listener in self.__listeners:
+      listener.currentRecordMoved ()
+
+
   # Returns 1=Field is bound to a database field
   def isFieldBound(self, fieldName):
     if self._dataObject._fieldReferences.has_key(fieldName):





reply via email to

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