[Checkins] SVN: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/ moved button event handler to jsevent, as it should be distinguished from a button.

Paul Carduner paulcarduner at gmail.com
Wed Jun 27 12:58:40 EDT 2007


Log message for revision 77145:
  moved button event handler to jsevent, as it should be distinguished from a button.

Changed:
  U   Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/interfaces.py
  U   Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsbutton.py
  U   Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsbutton.txt
  U   Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.py
  U   Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.txt

-=-
Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/interfaces.py
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/interfaces.py	2007-06-27 16:56:53 UTC (rev 77144)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/interfaces.py	2007-06-27 16:58:39 UTC (rev 77145)
@@ -97,7 +97,7 @@
     """Button widget."""
 
 
-class IJSButtonHandler(IButtonHandler):
+class IJSEventHandler(IButtonHandler):
     """A button handler for javascript buttons."""
 
     def __call__(form, id):

Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsbutton.py
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsbutton.py	2007-06-27 16:56:53 UTC (rev 77144)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsbutton.py	2007-06-27 16:58:39 UTC (rev 77145)
@@ -55,53 +55,6 @@
     zope.interface.implements(interfaces.IJSButton)
 
 
-class Handlers(button.Handlers):
-    """Event Handlers for Javascript Buttons."""
-
-    def addHandler(self, button, handler):
-        """See z3c.form.interfaces.IButtonHandlers"""
-        # Create a specification for the button
-        buttonSpec = util.getSpecification(button)
-        if isinstance(buttonSpec, util.classTypes):
-            buttonSpec = zope.interface.implementedBy(buttonSpec)
-        # Register the handler
-        self._registry.register(
-            (buttonSpec,), interfaces.IJSButtonHandler, '', handler)
-        self._handlers += ((button, handler),)
-
-    def getHandler(self, button):
-        """See z3c.form.interfaces.IButtonHandlers"""
-        buttonProvided = zope.interface.providedBy(button)
-        return self._registry.lookup1(buttonProvided, interfaces.IJSButtonHandler)
-
-
-class Handler(object):
-    zope.interface.implements(interfaces.IJSButtonHandler)
-
-    def __init__(self, button, func, event=jsevent.CLICK):
-        self.button = button
-        self.func = func
-        self.event = event
-
-    def __call__(self, form, id):
-        return self.func(form, id)
-
-    def __repr__(self):
-        return '<%s for %r>' %(self.__class__.__name__, self.button)
-
-
-def handler(button, **kwargs):
-    """A decorator for defining a javascript event handler."""
-    def createHandler(func):
-        handler = Handler(button, func, event=kwargs.get('event', jsevent.CLICK))
-        frame = sys._getframe(1)
-        f_locals = frame.f_locals
-        jshandlers = f_locals.setdefault('jshandlers', Handlers())
-        jshandlers.addHandler(button, handler)
-        return handler
-    return createHandler
-
-
 class JSButtonAction(action.Action, ButtonWidget, zope.location.Location):
     zope.interface.implements(IFieldWidget)
     zope.component.adapts(

Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsbutton.txt
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsbutton.txt	2007-06-27 16:56:53 UTC (rev 77144)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsbutton.txt	2007-06-27 16:58:39 UTC (rev 77145)
@@ -36,11 +36,11 @@
   ...     buttons = button.Buttons(IButtons)
   ...     prefix = 'form'
   ...
-  ...     @jsbutton.handler(buttons['apply'])
+  ...     @jsevent.handler(buttons['apply'])
   ...     def apply(self, id):
   ...         return 'alert("You Clicked the Apply Button!");'
   ...
-  ...     @jsbutton.handler(buttons['cancel'], event=jsevent.DBLCLICK)
+  ...     @jsevent.handler(buttons['cancel'], event=jsevent.DBLCLICK)
   ...     def cancel(self, id):
   ...         return 'alert("You Double Clicked the Cancel Button!");'
 

Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.py
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.py	2007-06-27 16:56:53 UTC (rev 77144)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.py	2007-06-27 16:58:39 UTC (rev 77145)
@@ -17,10 +17,12 @@
 """
 __docformat__ = "reStructuredText"
 
+import sys
+
 from zope.interface import implements
 import zope.component
 from zope.publisher.interfaces.browser import IBrowserRequest
-from z3c.form import util
+from z3c.form import util, button
 from z3c.form.interfaces import IForm
 from jquery.layer import IJQueryJavaScriptBrowserLayer
 
@@ -126,3 +128,50 @@
 
     def render(self, handler, id, form):
         return '$("#%s").bind("%s", function(){%s});' % (id, self.event.name, handler(form, id))
+
+
+class Handlers(button.Handlers):
+    """Event Handlers for Javascript Buttons."""
+
+    def addHandler(self, button, handler):
+        """See z3c.form.interfaces.IButtonHandlers"""
+        # Create a specification for the button
+        buttonSpec = util.getSpecification(button)
+        if isinstance(buttonSpec, util.classTypes):
+            buttonSpec = zope.interface.implementedBy(buttonSpec)
+        # Register the handler
+        self._registry.register(
+            (buttonSpec,), interfaces.IJSEventHandler, '', handler)
+        self._handlers += ((button, handler),)
+
+    def getHandler(self, button):
+        """See z3c.form.interfaces.IButtonHandlers"""
+        buttonProvided = zope.interface.providedBy(button)
+        return self._registry.lookup1(buttonProvided, interfaces.IJSEventHandler)
+
+
+class Handler(object):
+    zope.interface.implements(interfaces.IJSEventHandler)
+
+    def __init__(self, button, func, event=CLICK):
+        self.button = button
+        self.func = func
+        self.event = event
+
+    def __call__(self, form, id):
+        return self.func(form, id)
+
+    def __repr__(self):
+        return '<%s for %r>' %(self.__class__.__name__, self.button)
+
+
+def handler(button, **kwargs):
+    """A decorator for defining a javascript event handler."""
+    def createHandler(func):
+        handler = Handler(button, func, event=kwargs.get('event', CLICK))
+        frame = sys._getframe(1)
+        f_locals = frame.f_locals
+        jshandlers = f_locals.setdefault('jshandlers', Handlers())
+        jshandlers.addHandler(button, handler)
+        return handler
+    return createHandler

Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.txt
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.txt	2007-06-27 16:56:53 UTC (rev 77144)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.txt	2007-06-27 16:58:39 UTC (rev 77145)
@@ -241,3 +241,33 @@
   >>> print jsinterfaces.IJSFormEventsRenderer(edit).render()
   $("#form-widgets-gender").bind("change", function(){alert("The Gender was Changed!");});
   $("#form-widgets-age").bind("click", function(){alert("The Age was Clicked!");});
+
+
+Attaching Events to Form Fields
+-------------------------------
+
+The above method is pretty ugly, and we would really prefer something
+like what is done with buttons.  So here is how it would work.
+
+#  >>> class PersonEditForm(form.AddForm):
+#  ...
+#  ...     fields = field.Fields(IPerson)
+#  ...
+#  ...     @jsevent.handler(fields['age'])
+#  ...     def ageClickEvent(self, form, id):
+#  ...         return 'alert("The Age was Clicked!");'
+#  ...
+#  ...     @jsevent.handler(fields['gender'], event=jsevent.CHANGE)
+#  ...     def genderChangeEvent(self, form, id):
+#  ...         return 'alert("The Gender was Changed!");'
+#
+#Now we can update this form and render the widget event handler.
+#
+#  >>> request = TestRequest()
+#  >>> edit = PersonEditForm(root, request)
+#  >>> edit.update()
+
+#  >>> zope.component.provideAdapter(jsevent.JSFormEventsRenderer)
+#  >>> print jsinterfaces.IJSFormEventsRenderer(edit).render()
+#  $("#form-widgets-gender").bind("change", function(){alert("The Gender was Changed!");});
+#  $("#form-widgets-age").bind("click", function(){alert("The Age was Clicked!");});



More information about the Checkins mailing list