commit-gnue
[Top][All Lists]
Advanced

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

[gnue] r8502 - in trunk/gnue-forms/src: . GFObjects input/displayHandler


From: reinhard
Subject: [gnue] r8502 - in trunk/gnue-forms/src: . GFObjects input/displayHandlers uidrivers/_commonGuiToolkit uidrivers/gtk2 uidrivers/win32 uidrivers/wx uidrivers/wx26
Date: Wed, 21 Jun 2006 03:26:30 -0500 (CDT)

Author: reinhard
Date: 2006-06-21 03:26:29 -0500 (Wed, 21 Jun 2006)
New Revision: 8502

Modified:
   trunk/gnue-forms/src/GFForm.py
   trunk/gnue-forms/src/GFInstance.py
   trunk/gnue-forms/src/GFObjects/GFButton.py
   trunk/gnue-forms/src/input/displayHandlers/Cursor.py
   trunk/gnue-forms/src/uidrivers/_commonGuiToolkit/MenuBar.py
   trunk/gnue-forms/src/uidrivers/_commonGuiToolkit/ToolBar.py
   trunk/gnue-forms/src/uidrivers/gtk2/MenuBar.py
   trunk/gnue-forms/src/uidrivers/gtk2/ToolBar.py
   trunk/gnue-forms/src/uidrivers/win32/MenuBar.py
   trunk/gnue-forms/src/uidrivers/win32/ToolBar.py
   trunk/gnue-forms/src/uidrivers/wx/MenuBar.py
   trunk/gnue-forms/src/uidrivers/wx/ToolBar.py
   trunk/gnue-forms/src/uidrivers/wx26/MenuBar.py
   trunk/gnue-forms/src/uidrivers/wx26/ToolBar.py
   trunk/gnue-forms/src/uidrivers/wx26/UIdriver.py
Log:
Introduced event_begin and event_end methods in GFForm that are called for
every user event (button press, menu selection, toolbar selection etc) and make
sure the form is in a consistent state while the event is processed.


Modified: trunk/gnue-forms/src/GFForm.py
===================================================================
--- trunk/gnue-forms/src/GFForm.py      2006-06-20 19:44:39 UTC (rev 8501)
+++ trunk/gnue-forms/src/GFForm.py      2006-06-21 08:26:29 UTC (rev 8502)
@@ -92,6 +92,9 @@
         # Hackery until proper layout support is added
         self._standardnamespaces = {'Char': 'GNUe:Forms:Char'}
 
+        # Set to True by GFInstance when we are closing the form
+        self._exiting = False
+
         # The "None" init gives datasources time to setup master/detail
         self._inits = [self.phase_1_init, None, self.phase_3_init]
 
@@ -472,13 +475,63 @@
 
 
 
-  #===========================================================================
-  # Events
-  #
-  # Incoming Event handlers
-  #===========================================================================
+    # =========================================================================
+    # Events
+    #
+    # Incoming Event handlers
+    # =========================================================================
 
     # -------------------------------------------------------------------------
+    # Function to be called at the begin of event handling code
+    # -------------------------------------------------------------------------
+
+    def event_begin (self):
+        """
+        Set the form into a defined state to prepare event handling.
+
+        This function sets the form into a consistent and defined state so that
+        event handling code (like triggers and actions) can rely on everything
+        being ok.
+
+        Most notably, this function updates the field value for the currently
+        edited entry and shows an hourglass mouse cursor.
+
+        This function has to be called at the beginning of each user event
+        being handled. At the end of handling the user event, L{event_end} has
+        to be called.
+        """
+
+        if hasattr(self._currentEntry, '_displayHandler'):
+            # FIXME: what if this fails?
+            self._currentEntry._displayHandler.updateFieldValue()
+        self.dispatchEvent('beginWAIT', _form=self);
+
+
+    # -------------------------------------------------------------------------
+    # Function to be called at the end of event handling code
+    # -------------------------------------------------------------------------
+
+    def event_end (self):
+        """
+        Set the form into a defined state to finalize event handling.
+
+        This function sets the form into a consistent and defined state after
+        event handling code (like triggers and actions) has been run.
+
+        Most notably, this function resets the mouse cursor from hourglass to
+        normal and updates the field values shown on the form to reflect any
+        data modifications done in the event handling code.
+
+        This function has to be called at the end of each user event being
+        handled, just like L{event_begin} is called at the beginning.
+        """
+
+        if not self._exiting:
+            self.dispatchEvent('endWAIT', _form=self);
+            self.refreshDisplay(self)
+
+
+    # -------------------------------------------------------------------------
     # Create a new, empty record
     # -------------------------------------------------------------------------
     def newRecord(self):
@@ -644,21 +697,16 @@
 
         message = None
         self.dispatchEvent ('endENTERQUERY', _form = self);
-        self.dispatchEvent ('beginWAIT', _form = self);
 
         try:
-          try:
-            self._currentBlock.processQuery ()
+          self._currentBlock.processQuery ()
 
-          except DBError:
-            self.rollback (1)
-            message = u_("Database query error:\n%(exType)s\n%(exMessage)s") \
-                % {'exType'   : sys.exc_info ()[0],
-                   'exMessage': sys.exc_info ()[1]}
+        except DBError:
+          self.rollback (1)
+          message = u_("Database query error:\n%(exType)s\n%(exMessage)s") \
+              % {'exType'   : sys.exc_info ()[0],
+                 'exMessage': sys.exc_info ()[1]}
 
-        finally:
-          self.dispatchEvent ('endWAIT', _form = self)
-
         self.refreshDisplay (self._currentBlock)
         if self._currentBlock.isEmpty ():
           self.triggerSetStatusText (_('Query returned no results.'))
@@ -686,7 +734,6 @@
         
         message = None
         newBlock = None                     # block to jump to after commit
-        self.dispatchEvent ('beginWAIT', _form = self)
 
         try:
           # Save all current records, since they get lost in the Pre-Commit 
code
@@ -754,7 +801,6 @@
           # occured during commit or in a trigger
           if newBlock is not None and newBlock != self._currentBlock:
             self.findAndChangeFocus (newBlock)
-          self.dispatchEvent ('endWAIT', _form = self)
 
         assert gLeave (4)
 

Modified: trunk/gnue-forms/src/GFInstance.py
===================================================================
--- trunk/gnue-forms/src/GFInstance.py  2006-06-20 19:44:39 UTC (rev 8501)
+++ trunk/gnue-forms/src/GFInstance.py  2006-06-21 08:26:29 UTC (rev 8502)
@@ -938,6 +938,7 @@
         event._form.refreshUIEvents ()
       else:
         event._form.processTrigger ('On-Exit')
+        event._form._exiting = True
         self.dispatchEvent ('exitApplication', _('Current data is saved'),
                            _formName = event._form.name, _form = event._form)
 

Modified: trunk/gnue-forms/src/GFObjects/GFButton.py
===================================================================
--- trunk/gnue-forms/src/GFObjects/GFButton.py  2006-06-20 19:44:39 UTC (rev 
8501)
+++ trunk/gnue-forms/src/GFObjects/GFButton.py  2006-06-21 08:26:29 UTC (rev 
8502)
@@ -89,14 +89,14 @@
         UI layer.
         """
 
-        if hasattr(self._form._currentEntry, '_displayHandler'):
-          self._form._currentEntry._displayHandler.updateFieldValue()
+        self._form.event_begin()
 
-        # Fire the ON-ACTION trigger
-        self.processTrigger('On-Action', False)
+        try:
+            # Fire the ON-ACTION trigger
+            self.processTrigger('On-Action', False)
 
-        # Fire the action
-        if self.__action is not None:
-            self.__action.run()
-
-        self._form.refreshDisplay(self._form)
+            # Fire the action
+            if self.__action is not None:
+                self.__action.run()
+        finally:
+            self._form.event_end()

Modified: trunk/gnue-forms/src/input/displayHandlers/Cursor.py
===================================================================
--- trunk/gnue-forms/src/input/displayHandlers/Cursor.py        2006-06-20 
19:44:39 UTC (rev 8501)
+++ trunk/gnue-forms/src/input/displayHandlers/Cursor.py        2006-06-21 
08:26:29 UTC (rev 8502)
@@ -758,9 +758,10 @@
     Update the associated field with the current value of the display handler
     """
 
-    if self._buildValue ():
-      if self.field._allowedValues and \
-         not self.field._allowedValues.has_key ("%s" % self.value):
-        raise InvalidFieldValueError, (self.field.name, self.value)
+    if self.isPending ():
+      if self._buildValue ():
+        if self.field._allowedValues and \
+           not self.field._allowedValues.has_key ("%s" % self.value):
+          raise InvalidFieldValueError, (self.field.name, self.value)
 
-      self.field.setValue (self.value)
+        self.field.setValue (self.value)

Modified: trunk/gnue-forms/src/uidrivers/_commonGuiToolkit/MenuBar.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/_commonGuiToolkit/MenuBar.py 2006-06-20 
19:44:39 UTC (rev 8501)
+++ trunk/gnue-forms/src/uidrivers/_commonGuiToolkit/MenuBar.py 2006-06-21 
08:26:29 UTC (rev 8502)
@@ -94,6 +94,20 @@
 
 
   # ---------------------------------------------------------------------------
+  # Fire menu item
+  # ---------------------------------------------------------------------------
+
+  def _fire(self, userAction):
+
+    self.form.event_begin()
+    try:
+      event = "request%s" % userAction.event
+      self.driver.dispatchEvent (event, _form = self.form)
+    finally:
+      self.form.event_end()
+
+
+  # ---------------------------------------------------------------------------
   # Create a menu item
   # ---------------------------------------------------------------------------
 
@@ -136,8 +150,6 @@
     self.disableItem (item)
 
 
-
-
 # =============================================================================
 # Default menu definition
 # =============================================================================

Modified: trunk/gnue-forms/src/uidrivers/_commonGuiToolkit/ToolBar.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/_commonGuiToolkit/ToolBar.py 2006-06-20 
19:44:39 UTC (rev 8501)
+++ trunk/gnue-forms/src/uidrivers/_commonGuiToolkit/ToolBar.py 2006-06-21 
08:26:29 UTC (rev 8502)
@@ -112,6 +112,23 @@
 
           self.driver.registerEventListeners (eventListeners)
 
+  # ---------------------------------------------------------------------------
+  # Fire tool bar item
+  # ---------------------------------------------------------------------------
+
+  def _fire(self, userAction, toggle):
+
+    self.form.event_begin()
+    try:
+      if toggle:
+        event = "request%s" % userAction.canToggle
+      else:
+        event = "request%s" % userAction.event
+      self.driver.dispatchEvent (event, _form = self.form)
+    finally:
+      self.form.event_end()
+
+
   def __canRequestEvent(self, event):
     item = self.__actionMap[event.__event__[3:]]
     self.enableItem(item)

Modified: trunk/gnue-forms/src/uidrivers/gtk2/MenuBar.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/MenuBar.py      2006-06-20 19:44:39 UTC 
(rev 8501)
+++ trunk/gnue-forms/src/uidrivers/gtk2/MenuBar.py      2006-06-21 08:26:29 UTC 
(rev 8502)
@@ -113,8 +113,7 @@
 
   def _menuHandler (self, menuItem, userAction):
 
-    event = "request%s" % userAction.event
-    self.driver.dispatchEvent (event, _form = self.form)
+    self._fire(userAction)
 
 
   # ---------------------------------------------------------------------------

Modified: trunk/gnue-forms/src/uidrivers/gtk2/ToolBar.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/ToolBar.py      2006-06-20 19:44:39 UTC 
(rev 8501)
+++ trunk/gnue-forms/src/uidrivers/gtk2/ToolBar.py      2006-06-21 08:26:29 UTC 
(rev 8502)
@@ -104,22 +104,16 @@
 
   def _toggleEvent (self, button, userAction):
 
-    if button.get_active ():
-      event = 'request%s' % userAction.event
-    else:
-      event = 'request%s' % userAction.canToggle
+    self._fire(userAction, not button.get_active())
 
-    self.driver.dispatchEvent (event, _form = self.form)
 
-
   # ---------------------------------------------------------------------------
   # Event handler for toolbar buttons
   # ---------------------------------------------------------------------------
 
   def _buttonPress (self, button, userAction):
 
-    event = 'request%s' % userAction.event
-    self.driver.dispatchEvent (event, _form = self.form)
+    self._fire(userAction, False)
 
 
   # ---------------------------------------------------------------------------

Modified: trunk/gnue-forms/src/uidrivers/win32/MenuBar.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/win32/MenuBar.py     2006-06-20 19:44:39 UTC 
(rev 8501)
+++ trunk/gnue-forms/src/uidrivers/win32/MenuBar.py     2006-06-21 08:26:29 UTC 
(rev 8502)
@@ -71,8 +71,7 @@
     id = getNextId()
     self.container.addDescription(id, textEncode(userAction.description) or '')
     win32gui.AppendMenu(parent, _menustyle, id, textEncode(label))
-    event = 'request' + userAction.event
-    self.container.Connect(id, lambda l=self.driver, e=event, f=self.form: 
l.dispatchEvent(events.Event(e,_form=f)))
+    self.container.Connect(id, lambda u=userAction: self._fire(u))
 
     return (parent, id)
 

Modified: trunk/gnue-forms/src/uidrivers/win32/ToolBar.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/win32/ToolBar.py     2006-06-20 19:44:39 UTC 
(rev 8501)
+++ trunk/gnue-forms/src/uidrivers/win32/ToolBar.py     2006-06-21 08:26:29 UTC 
(rev 8502)
@@ -106,18 +106,16 @@
 
     if userAction.canToggle:
       self.container.Connect(id, 
-        lambda l=self.driver,
-              e=event,
-              te='request%s' % userAction.canToggle,
-              tb=parent.GetHwnd(),
-              f=self.form: l.dispatchEvent(
-                  (win32gui.SendMessage(tb, commctrl.TB_ISBUTTONCHECKED, id, 
0) and e or te),_form=f))
+        lambda u=userAction,
+              tb=parent.GetHwnd(): self._fire(u,
+                  not win32gui.SendMessage(tb, commctrl.TB_ISBUTTONCHECKED, id,
+                      0)))
       check = 1
       style = commctrl.TBSTYLE_CHECK
 
     else:
       self.container.Connect(id, 
-        lambda l=self.driver, e=event, f=self.form: l.dispatchEvent(e,_form=f))
+        lambda u=userAction: self._fire(u, False))
       check = 0
       style = commctrl.TBSTYLE_BUTTON
 

Modified: trunk/gnue-forms/src/uidrivers/wx/MenuBar.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/wx/MenuBar.py        2006-06-20 19:44:39 UTC 
(rev 8501)
+++ trunk/gnue-forms/src/uidrivers/wx/MenuBar.py        2006-06-21 08:26:29 UTC 
(rev 8502)
@@ -92,9 +92,8 @@
 
     parent.SetLabel(id, wxEncode(label))
 
-    event = 'request' + userAction.event
     EVT_MENU(self.driver._wxapp, id,
-      lambda event, l=self.driver, e=event, f=self.form: 
l.dispatchEvent(e,_form=f))
+      lambda event, u=userAction: self._fire(u))
 
     return item
 

Modified: trunk/gnue-forms/src/uidrivers/wx/ToolBar.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/wx/ToolBar.py        2006-06-20 19:44:39 UTC 
(rev 8501)
+++ trunk/gnue-forms/src/uidrivers/wx/ToolBar.py        2006-06-21 08:26:29 UTC 
(rev 8502)
@@ -55,14 +55,11 @@
     event = 'request%s' % userAction.event
     if userAction.canToggle:
       EVT_MENU(self.driver._wxapp, id,
-        lambda event, l=self.driver,
-              e=event, i=id,
-              te='request%s' % userAction.canToggle,
-              s=self.toolbar.GetToolState,
-              f=self.form: l.dispatchEvent((s(i) and e or te),_form=f))
+        lambda event, u=userAction, i=id, s=self.toolbar.GetToolState: \
+                self._fire(u, not s(i)))
     else:
       EVT_MENU(self.driver._wxapp, id,
-        lambda event, l=self.driver, e=event, f=self.form: 
l.dispatchEvent(e,_form=f))
+        lambda event, u=userAction: self._fire(u, False))
 
     # Set the action icon if available
     if iconloc:

Modified: trunk/gnue-forms/src/uidrivers/wx26/MenuBar.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/wx26/MenuBar.py      2006-06-20 19:44:39 UTC 
(rev 8501)
+++ trunk/gnue-forms/src/uidrivers/wx26/MenuBar.py      2006-06-21 08:26:29 UTC 
(rev 8502)
@@ -106,10 +106,8 @@
 
       result.SetBitmap (icon)
 
-    event = 'request' + userAction.event
-    wx.EVT_MENU (wx.GetApp (), result.GetId (), \
-        lambda event, l = self.driver, e = event, f = self.form: \
-          l.dispatchEvent (e, _form = f))
+    wx.EVT_MENU (wx.GetApp (), result.GetId (),
+        lambda event, u = userAction: self._fire (u))
 
     parent.AppendItem (result)
 

Modified: trunk/gnue-forms/src/uidrivers/wx26/ToolBar.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/wx26/ToolBar.py      2006-06-20 19:44:39 UTC 
(rev 8501)
+++ trunk/gnue-forms/src/uidrivers/wx26/ToolBar.py      2006-06-21 08:26:29 UTC 
(rev 8502)
@@ -110,16 +110,11 @@
     item   = self.toolbar.FindById (event.GetId ())
     action = item.GetClientData ()
 
-    tEvent = 'request%s' % action.event
+    self._fire(action, action.canToggle \
+            and not self.toolbar.GetToolState(item.GetId()))
 
-    if action.canToggle:
-      if not self.toolbar.GetToolState (item.GetId ()):
-        tEvent = 'request%s' % action.canToggle
 
-    self.driver.dispatchEvent (tEvent, _form = self.form)
 
-
-
   # ---------------------------------------------------------------------------
   # Finalize the toolbar creation process
   # ---------------------------------------------------------------------------

Modified: trunk/gnue-forms/src/uidrivers/wx26/UIdriver.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/wx26/UIdriver.py     2006-06-20 19:44:39 UTC 
(rev 8501)
+++ trunk/gnue-forms/src/uidrivers/wx26/UIdriver.py     2006-06-21 08:26:29 UTC 
(rev 8502)
@@ -251,6 +251,17 @@
 
 
   # ---------------------------------------------------------------------------
+  # Begin/end wait cursor
+  # ---------------------------------------------------------------------------
+
+  def beginWait (self, event):
+    wx.BeginBusyCursor()
+
+  def endWait (self, event):
+    wx.EndBusyCursor()
+
+
+  # ---------------------------------------------------------------------------
   # Form alert
   # ---------------------------------------------------------------------------
 





reply via email to

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