commit-gnue
[Top][All Lists]
Advanced

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

[gnue] r7929 - in trunk/gnue-forms/src: GFObjects uidrivers/_base uidriv


From: johannes
Subject: [gnue] r7929 - in trunk/gnue-forms/src: GFObjects uidrivers/_base uidrivers/gtk2/widgets uidrivers/win32/widgets uidrivers/wx/widgets
Date: Wed, 28 Sep 2005 12:35:25 -0500 (CDT)

Author: johannes
Date: 2005-09-20 10:25:31 -0500 (Tue, 20 Sep 2005)
New Revision: 7929

Modified:
   trunk/gnue-forms/src/GFObjects/GFBlock.py
   trunk/gnue-forms/src/GFObjects/GFObj.py
   trunk/gnue-forms/src/GFObjects/GFScrollBar.py
   trunk/gnue-forms/src/uidrivers/_base/UIdriver.py
   trunk/gnue-forms/src/uidrivers/gtk2/widgets/scrollbar.py
   trunk/gnue-forms/src/uidrivers/win32/widgets/_base.py
   trunk/gnue-forms/src/uidrivers/win32/widgets/scrollbar.py
   trunk/gnue-forms/src/uidrivers/wx/widgets/scrollbar.py
Log:
Fixed scrollbars for gtk2, wx and win32


Modified: trunk/gnue-forms/src/GFObjects/GFBlock.py
===================================================================
--- trunk/gnue-forms/src/GFObjects/GFBlock.py   2005-09-20 09:18:44 UTC (rev 
7928)
+++ trunk/gnue-forms/src/GFObjects/GFBlock.py   2005-09-20 15:25:31 UTC (rev 
7929)
@@ -427,7 +427,7 @@
 
     # Adjusting scrollbars
     for sb in self._scrollbars:
-      sb.adjustScrollbar(self._currentRecord, self._recordCount)
+      sb.adjustScrollbar (self._currentRecord, self._recordCount)
 
   #
   # newRecord
@@ -545,7 +545,14 @@
       self.processTrigger('PRE-FOCUSIN')
       self.processTrigger('POST-FOCUSIN')
 
+      if self._form._currentEntry._block != self:
+        self._form.findAndChangeFocus (self)
+      else:
+        self._form.findAndChangeFocus (self._form._currentEntry)
 
+      self._form._instance.updateRecordCounter (self._form)
+
+
   def jumpRecords(self, adjustment):
     targetRecord = self._resultSet.getRecordNumber() + adjustment
 
@@ -714,12 +721,13 @@
 
     # Adjusting scrollbars
     for sb in self._scrollbars:
-      sb.adjustScrollbar(self._currentRecord, self._recordCount)
+      sb.adjustScrollbar (self._currentRecord, self._recordCount)
 
 
-  def registerScrollbar(self, sb):
-    self._scrollbars.append(sb)
+  def registerScrollbar (self, sb):
+    self._scrollbars.append (sb)
 
+
   # ---------------------------------------------------------------------------
   # Call a datasource's function
   # ---------------------------------------------------------------------------

Modified: trunk/gnue-forms/src/GFObjects/GFObj.py
===================================================================
--- trunk/gnue-forms/src/GFObjects/GFObj.py     2005-09-20 09:18:44 UTC (rev 
7928)
+++ trunk/gnue-forms/src/GFObjects/GFObj.py     2005-09-20 15:25:31 UTC (rev 
7929)
@@ -60,6 +60,10 @@
     self._gap = 0
     self._inits = []
 
+    # The reference to the uiWidget will be set by the
+    # uidrivers._base.UIdriver._buildUI () function
+    self.uiWidget = None
+
   def isNavigable(self, mode='edit'):
     """
     Is the current object currently navigable?

Modified: trunk/gnue-forms/src/GFObjects/GFScrollBar.py
===================================================================
--- trunk/gnue-forms/src/GFObjects/GFScrollBar.py       2005-09-20 09:18:44 UTC 
(rev 7928)
+++ trunk/gnue-forms/src/GFObjects/GFScrollBar.py       2005-09-20 15:25:31 UTC 
(rev 7929)
@@ -1,56 +1,122 @@
+# GNU Enterprise Forms - GF Class Hierarchy - Scrollbar
 #
-# This file is part of GNU Enterprise.
+# Copyright 2001-2005 Free Software Foundation
 #
-# GNU Enterprise is free software; you can redistribute it 
-# and/or modify it under the terms of the GNU General Public 
-# License as published by the Free Software Foundation; either 
+# This file is part of GNU Enterprise
+#
+# GNU Enterprise is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
 # version 2, or (at your option) any later version.
 #
-# GNU Enterprise is distributed in the hope that it will be 
-# useful, but WITHOUT ANY WARRANTY; without even the implied 
-# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+# GNU Enterprise is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 # PURPOSE. See the GNU General Public License for more details.
 #
-# You should have received a copy of the GNU General Public 
-# License along with program; see the file COPYING. If not, 
-# write to the Free Software Foundation, Inc., 59 Temple Place 
+# You should have received a copy of the GNU General Public
+# License along with program; see the file COPYING. If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place
 # - Suite 330, Boston, MA 02111-1307, USA.
 #
-# Copyright 2000-2005 Free Software Foundation
-#
-# FILE:
-# GFObjects.py
-#
-# DESCRIPTION:
+# $Id$
 """
-Implements logical scrollbar support
+Class implementing scrollbars for controlling record positions within blocks
 """
-# NOTES:
-#
 
-from GFObj import GFObj
+from gnue.common.apps import errors
+from gnue.forms.GFObjects.GFObj import GFObj
 
-#
+# =============================================================================
+# Exceptions
+# =============================================================================
+
+class MissingBlockError (errors.ApplicationError):
+  def __init__ (self, block):
+    msg = u_("Scrollbar references a non-existent block '%s'") % block
+    errors.ApplicationError.__init__ (self, msg)
+
+
+# =============================================================================
 # GFScrollBar
-#
-class GFScrollBar(GFObj):
-  def __init__(self, parent=None):
-    GFObj.__init__(self, parent)
+# =============================================================================
+
+class GFScrollBar (GFObj):
+  
+  # ---------------------------------------------------------------------------
+  # Constructor
+  # ---------------------------------------------------------------------------
+
+  def __init__ (self, parent = None):
+    GFObj.__init__ (self, parent)
     self._type = "GFScrollBar"
     self.label = ""
-    self.rows = 1
+    self.rows  = 1
 
-    # Runtime Variables
-    self._inits = [self.initialize]
+    self._inits = [self.__initialize]
 
-  def initialize(self):
-    self._form = self.findParentOfType('GFForm')
 
-    # ...Block
-    try:
-      self._block = block = self._form._logic._blockMap[self.block]
-    except KeyError:
-      raise "Entry references non-existent block '%s'" % self.block
+  # ---------------------------------------------------------------------------
+  # Get the number of records and rows of the wrapped block
+  # ---------------------------------------------------------------------------
 
+  def getRecordAndPageCount (self):
+    """
+    Get the current record, the number of records and the number of rows of the
+    underlying block. The number of rows is usable as a page size.
 
+    @return: tuple (current-record, record-count, rows)
+    """
 
+    return (self._block._currentRecord, self._block._recordCount,
+        self._block._rows)
+
+
+  # ---------------------------------------------------------------------------
+  # Adjust the ui scrollbar to reflect new position and/or record-cound
+  # ---------------------------------------------------------------------------
+
+  def adjustScrollbar (self, current, count):
+    """
+    Update the UI scrollbar to reflect a new position or record-count.
+
+    @param current: current record number in the block
+    @param count: number of records in the block
+    """
+
+    if self.uiWidget is not None:
+      self.uiWidget.adjustScrollbar (current, count)
+
+
+  # ---------------------------------------------------------------------------
+  # Jump to a given record number
+  # ---------------------------------------------------------------------------
+
+  def jumpToRecord (self, recordNumber):
+    """
+    Jump to the given record in the underlying block.
+
+    @param recordNumber: number of record to jump to.
+    """
+
+    self._block.jumpRecord (recordNumber)
+
+  def jumpRelative (self, adjustment):
+
+    self._block.jumpRecords (adjustment)
+
+
+  # ---------------------------------------------------------------------------
+  # Phase I init: find the parent GFForm and the bound GFBlock
+  # ---------------------------------------------------------------------------
+
+  def __initialize (self):
+
+    self._form = self.findParentOfType ('GFForm')
+
+    # ...Block
+    if not self.block in self._form._logic._blockMap:
+      raise MissingBlockError, self.block
+
+    self._block = self._form._logic._blockMap [self.block]
+    self._block.registerScrollbar (self)


Property changes on: trunk/gnue-forms/src/GFObjects/GFScrollBar.py
___________________________________________________________________
Name: svn:keywords
   + Id

Modified: trunk/gnue-forms/src/uidrivers/_base/UIdriver.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/_base/UIdriver.py    2005-09-20 09:18:44 UTC 
(rev 7928)
+++ trunk/gnue-forms/src/uidrivers/_base/UIdriver.py    2005-09-20 15:25:31 UTC 
(rev 7929)
@@ -270,6 +270,7 @@
       # Add to the cross refernce
       #
       self._gfObjToUIWidget [object] = uiWidget
+      object.uiWidget = uiWidget
 
       #
       # If the current object is a GFForm then add it to the

Modified: trunk/gnue-forms/src/uidrivers/gtk2/widgets/scrollbar.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/widgets/scrollbar.py    2005-09-20 
09:18:44 UTC (rev 7928)
+++ trunk/gnue-forms/src/uidrivers/gtk2/widgets/scrollbar.py    2005-09-20 
15:25:31 UTC (rev 7929)
@@ -38,55 +38,50 @@
 
   def _createWidget (self, event, spacer):
     gfObject = event.object
-    gfBlock  = gfObject._block
 
-    pageSize = getattr (gfBlock, '_rows') or 1
-    self.adjustment = gtk.Adjustment (1, 1, gfBlock._recordCount, 1, pageSize,
-        pageSize)
+    (crec, recs, page) = gfObject.getRecordAndPageCount ()
 
+    self.adjustment = gtk.Adjustment (crec, 0, recs, 1, page - 1, 0)
+
     newWidget = gtk.VScrollbar (self.adjustment)
     height    = gfObject.Char__height * event.widgetHeight
     newWidget.set_size_request (-1, height)
-    self.adjustment._scrollHandler = self.adjustment.connect ('value-changed',
-                                                self._scrollHandler, gfObject)
+
+    self.adjustment.__scrollHandler = self.adjustment.connect ('value-changed',
+                                                self.__scrollHandler)
     
     event.container.put (newWidget, self.itemX, self.itemY)
     newWidget.show ()
 
-    gfBlock.registerScrollbar (self)
-    
     return newWidget
 
 
   # ---------------------------------------------------------------------------
-  # Handle changes of the adjustment's value
+  # adjust the scrollbar to a new position
   # ---------------------------------------------------------------------------
 
-  def _scrollHandler (self, adjustment, gfObject):
+  def adjustScrollbar (self, position, count):
 
-    assert gDebug (6, "Adjust to %s" % (int (adjustment.value)))
-    action = events.Event ('requestRECORDNUMBER', int (adjustment.value),
-                           _form = gfObject._form)
-    adjustment.stop_emission ('value-changed')
-    gtk.idle_add (self._eventHandler, action)
+    if int (self.adjustment.upper) != count:
+      self.adjustment.upper = float (count)
 
-    return True
+    self._blockHandler (self.adjustment, '__scrollHandler')
+    self.adjustment.set_value (position)
+    self._blockHandler (self.adjustment, '__scrollHandler', True)
 
 
   # ---------------------------------------------------------------------------
-  # adjust the scrollbar to a new position
+  # Handle changes of the adjustment's value
   # ---------------------------------------------------------------------------
 
-  def adjustScrollbar (self, position, count):
-    if int (self.adjustment.upper) != count:
-      self.adjustment.upper = float (count)
+  def __scrollHandler (self, adjustment):
 
-    newPos = position + 1
-    self._blockHandler (self.adjustment, '_scrollHandler')
-    self.adjustment.set_value (newPos)
-    self._blockHandler (self.adjustment, '_scrollHandler', True)
+    assert gDebug (6, "Adjust to %s" % int (adjustment.value))
+    self._gfObject.jumpToRecord (int (adjustment.value))
 
+    return True
 
+
 # -----------------------------------------------------------------------------
 # Configuration data
 # -----------------------------------------------------------------------------

Modified: trunk/gnue-forms/src/uidrivers/win32/widgets/_base.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/win32/widgets/_base.py       2005-09-20 
09:18:44 UTC (rev 7928)
+++ trunk/gnue-forms/src/uidrivers/win32/widgets/_base.py       2005-09-20 
15:25:31 UTC (rev 7929)
@@ -442,28 +442,36 @@
 
     if scrollCode == win32con.SB_THUMBTRACK:
       format = "IIiiIii"
-      size = struct.calcsize(format)
-      scrollinfo = struct.pack(format, size, win32con.SIF_ALL, 0, 0, 0, 0, 0)
+      size = struct.calcsize (format)
+      scrollinfo = struct.pack (format, size, win32con.SIF_ALL, 0, 0, 0, 0, 0)
       win32gui.SendMessage(lParam, win32con.SBM_GETSCROLLINFO, 0, scrollinfo)
-      size, mask, min, max, page, pos, trackpos = struct.unpack(format, 
scrollinfo)
-      recno = int(trackpos)+1
-      action = events.Event('requestRECORDNUMBER',object=gfObject,
-                            data=recno,
-                          _form=gfObject._form)
+      size, mask, min, max, page, pos, trackpos = struct.unpack (format,
+          scrollinfo)
+      recno = int (trackpos)
+      gfObject.jumpToRecord (recno)
+
+    elif scrollCode == win32con.SB_PAGEUP:
+      action = events.Event ('requestJUMPROWSUP', object = gfObject, _form =
+          gfObject._form)
+      uiObject._uiForm._eventHandler (action)
+
     elif scrollCode == win32con.SB_PAGEDOWN:
-      action = events.Event('requestJUMPROWSDOWN',object=gfObject, 
_form=gfObject._form)
-    elif scrollCode == win32con.SB_PAGEUP:
-      action = events.Event('requestJUMPROWSUP',object=gfObject, 
_form=gfObject._form)
+      action = events.Event ('requestJUMPROWSDOWN', object = gfObject, _form =
+          gfObject._form)
+      uiObject._uiForm._eventHandler (action)
+
     elif scrollCode == win32con.SB_LINEDOWN:
-      action = events.Event('requestNEXTRECORD',object=gfObject, 
_form=gfObject._form)
+      gfObject.jumpRelative (1)
+
     elif scrollCode == win32con.SB_LINEUP:
-      action = events.Event('requestPREVRECORD',object=gfObject, 
_form=gfObject._form)
+      gfObject.jumpRelative (-1)
+
     elif scrollCode == win32con.SB_BOTTOM:
-      action = events.Event('requestLASTRECORD',object=gfObject, 
_form=gfObject._form)
+      gfObject.jumpToRecord (self.lastRecord)
+
     elif scrollCode == win32con.SB_TOP:
-      action = events.Event('requestFIRSTRECORD',object=gfObject, 
_form=gfObject._form)
+      gfObject.jumpToRecord (0)
 
-    uiObject._uiForm._eventHandler(action)
 
 class Win32Image(Win32Base):
     

Modified: trunk/gnue-forms/src/uidrivers/win32/widgets/scrollbar.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/win32/widgets/scrollbar.py   2005-09-20 
09:18:44 UTC (rev 7928)
+++ trunk/gnue-forms/src/uidrivers/win32/widgets/scrollbar.py   2005-09-20 
15:25:31 UTC (rev 7929)
@@ -33,40 +33,58 @@
 from gnue.forms.uidrivers.win32.widgets._base import UIHelper, Win32Window
 from gnue.forms.uidrivers.win32.common import getNextId
 
-#
-# UIScrollBar
-#
-# Widget set specific function that creates a single instance of a scroll bar 
used
-# to navigate multiple records
-#
-class UIScrollBar(UIHelper):
-  def _createWidget(self, event, spacer):
+# =============================================================================
+# Class implementing an UI scroll bar
+# =============================================================================
+
+class UIScrollBar (UIHelper):
+
+  # ---------------------------------------------------------------------------
+  # Create a new scrollbar widget
+  # ---------------------------------------------------------------------------
+
+  def _createWidget (self, event, spacer):
+
     object = event.object
 
-    style = win32con.WS_CHILD | win32con.WS_VISIBLE |win32con.SBS_VERT | 
win32con.SBS_LEFTALIGN
+    style = win32con.WS_CHILD | win32con.WS_VISIBLE | win32con.SBS_VERT | \
+            win32con.SBS_LEFTALIGN
     styleEx = 0
 
-    newWidget = self._widget = Win32Window(self._uiDriver, styleEx, 
"Scrollbar", "", style,
-                        self.itemX,
-                        self.itemY, 
+    newWidget = self._widget = Win32Window (self._uiDriver, styleEx,
+                        "Scrollbar", "", style,
+                        self.itemX, self.itemY,
                         -1, #object.Char__width*event.widgetWidth,
                         object.Char__height*event.widgetHeight,
-                        event.container, getNextId())
+                        event.container, getNextId ())
 
     if event.initialize:
-      object._block.registerScrollbar(self)
-      self._rows = object._block._rows
-      self._hwnd = newWidget.GetHwnd()
+      (crec, self.lastRecord, self.pageSize) = object.getRecordAndPageCount ()
+      self._rows = self.pageSize
+      self._hwnd = newWidget.GetHwnd ()
+      self.adjustScrollbar (crec, self.lastRecord)
 
     return newWidget
 
-  def adjustScrollbar(self, pos, range):
-      format = "IIiiIii"
-      size = struct.calcsize(format)
-      mask =  win32con.SIF_RANGE | win32con.SIF_PAGE | win32con.SIF_POS
-      scrollinfo = struct.pack(format, size, mask, 0, range+self._rows-3, 
self._rows-1, pos, 0)
-      win32gui.SendMessage(self._hwnd, win32con.SBM_SETSCROLLINFO , 1, 
scrollinfo)
 
+  # ---------------------------------------------------------------------------
+  # Adjust the scrollbar to reflect changed record or record-cound
+  # ---------------------------------------------------------------------------
+
+  def adjustScrollbar (self, current, count):
+
+    format = "IIiiIii"
+    size = struct.calcsize (format)
+    mask = win32con.SIF_RANGE | win32con.SIF_PAGE | win32con.SIF_POS
+    scrollinfo = struct.pack (format, size, mask, 0, count + 1, 
self.pageSize-1,
+        current, 0)
+    win32gui.SendMessage (self._hwnd, win32con.SBM_SETSCROLLINFO, 1, 
scrollinfo)
+
+
+# =============================================================================
+# Config dictionary
+# =============================================================================
+
 configuration = {
     'baseClass'  : UIScrollBar,
     'provides'   : 'GFScrollBar',

Modified: trunk/gnue-forms/src/uidrivers/wx/widgets/scrollbar.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/wx/widgets/scrollbar.py      2005-09-20 
09:18:44 UTC (rev 7928)
+++ trunk/gnue-forms/src/uidrivers/wx/widgets/scrollbar.py      2005-09-20 
15:25:31 UTC (rev 7929)
@@ -44,29 +44,30 @@
   # --------------------------------------------------------------------------
   # Create a scrollbar widget
   # --------------------------------------------------------------------------
-  def _createWidget(self, event, spacer):
+  def _createWidget (self, event, spacer):
     """
     Creates a new wxScrollBar widget.
     """
-    object = event.object
+    gfObject = event.object
 
     itemX =      self.itemX
-    itemY =      (object.Char__y + spacer) * event.widgetHeight
-    itemWidth =  object.Char__width * event.widgetWidth
-    itemHeight = object.Char__height * event.widgetHeight
+    itemY =      (gfObject.Char__y + spacer) * event.widgetHeight
+    itemWidth =  gfObject.Char__width * event.widgetWidth
+    itemHeight = gfObject.Char__height * event.widgetHeight
 
-    newWidget = self._widget = wxScrollBar(event.container, -1,
+    newWidget = self._widget = wxScrollBar (event.container, -1,
                            wxPoint(itemX, itemY),
                            wxSize(itemWidth, itemHeight),
                            wxSB_VERTICAL)
 
     if event.initialize:
       self._eventHandler = event.eventHandler
-      EVT_COMMAND_SCROLL(newWidget, newWidget.GetId(), self.scrollbarHandler)
-      _setDefaultEventHandlers(newWidget, event.eventHandler, 
event.initialize,self._uiDriver)
+      EVT_COMMAND_SCROLL (newWidget, newWidget.GetId (), self.scrollbarHandler)
+      _setDefaultEventHandlers (newWidget, event.eventHandler,
+          event.initialize,self._uiDriver)
 
-      object._block.registerScrollbar(self)
-      self._rows = object._block._rows
+    (crec, recs, self.pageSize) = gfObject.getRecordAndPageCount ()
+    self.adjustScrollbar (crec, recs)
 
     return newWidget
 
@@ -74,31 +75,26 @@
   # --------------------------------------------------------------------------
   # Handle scrollbar events
   # --------------------------------------------------------------------------
-  def scrollbarHandler(self, event):
+  def scrollbarHandler (self, event):
     """
     Handles scrollbar events.
     """
     object = _eventObjTowxWindow(event)
-    id = object.GetId()
+    id = object.GetId ()
 
-    value = object.GetThumbPosition()
-    recno = int(value) + 1
+    self._gfObject.jumpToRecord (int (object.GetThumbPosition ()))
 
-    gfObject = self._uiDriver._IdToGFObj[id]
-    action = events.Event('requestRECORDNUMBER', object=gfObject, data=recno,
-                          _form=gfObject._form)
-    self._eventHandler(action)
 
-
   # --------------------------------------------------------------------------
   # Adjusts scrollbar pos and size
   # --------------------------------------------------------------------------
-  def adjustScrollbar(self, pos, range):
+  def adjustScrollbar (self, current, count):
     """
     Adjusts the scrollbar's position and size
     """
+
     # position, thumbSize, range, pageSize, refresh = TRUE
-    self._widget.SetScrollbar(pos, self._rows, range + self._rows - 1, 
self._rows - 1)
+    self._widget.SetScrollbar (current, 1, count, self.pageSize - 1)
 
 
 # ----------------------------------------------------------------------------





reply via email to

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