[Checkins] SVN: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/ got rendering of multiple events attached to a single widget to work for just the widget.

Paul Carduner paulcarduner at gmail.com
Thu Jun 21 22:07:24 EDT 2007


Log message for revision 76932:
  got rendering of multiple events attached to a single widget to work for just the widget.

Changed:
  U   Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/README.txt
  U   Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/configure.zcml
  U   Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/interfaces.py
  U   Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.py
  U   Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/testing.py

-=-
Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/README.txt
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/README.txt	2007-06-22 00:56:48 UTC (rev 76931)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/README.txt	2007-06-22 02:07:24 UTC (rev 76932)
@@ -20,8 +20,8 @@
   <JSEvent "click">
   >>> jsevent.DBLCLICK
   <JSEvent "dblclick">
-  >>> jsevent.CHANGED
-  <JSEvent "changed">
+  >>> jsevent.CHANGE
+  <JSEvent "change">
   >>> jsevent.LOAD
   <JSEvent "load">
 
@@ -227,9 +227,9 @@
 it to ``IJSEventWidget``.  First we will create the events we want to
 add to it.
 
-  >>> def ageClickHandler():
+  >>> def ageClickHandler(widget, id):
   ...     return 'alert("This Widget was Clicked!");'
-  >>> def ageDblClickHandler():
+  >>> def ageDblClickHandler(widget, id):
   ...     return 'alert("This Widget was Double Clicked!");'
   >>> events = jsevent.JSEvents(click=ageClickHandler,
   ...                           dblclick=ageDblClickHandler)
@@ -239,15 +239,20 @@
 
   >>> age.update()
   >>> print age.render()
-  <input type="text" name="age" value="39" id="age"/>
-  <script type="javascript">
-    $('#age').bind("click", function(){alert("This Widget was Clicked!");});
-  </script>
-  <script type="javascript">
-    $('#age').bind("dblclick", function(){alert("This Widget was Double Clicked!");});
-  </script>
+  <input type="text" name="age" value="39" id="age" />
 
+And then render the widget's events.
 
+  >>> zope.component.provideAdapter(jsevent.JSEventsRenderer)
+  >>> request = TestRequest()
+  >>> renderer = zope.component.getMultiAdapter((events, request),
+  ...                                           jsinterfaces.IJSEventsRenderer)
+  >>> age.id = 'age'
+  >>> print renderer.render(age, None)
+  $("#age").bind("click", function(){alert("This Widget was Clicked!");});
+  $("#age").bind("dblclick", function(){alert("This Widget was Double Clicked!");});
+
+
 Rendering Widgets with Attached Events
 --------------------------------------
 
@@ -295,7 +300,7 @@
   ...     def ageClickEvent(self):
   ...         return 'alert("The Age was Clicked!");'
   ...
-  ...     @eventHandler('gender', event=jsevent.CHANGED)
+  ...     @eventHandler('gender', event=jsevent.CHANGE)
   ...     def genderChangeEvent(self):
   ...         return 'alert("The Gender was Changed!");'
 

Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/configure.zcml
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/configure.zcml	2007-06-22 00:56:48 UTC (rev 76931)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/configure.zcml	2007-06-22 02:07:24 UTC (rev 76932)
@@ -12,6 +12,10 @@
       factory=".jsevent.JQueryEventRenderer"
       />
 
+  <adapter
+      factory=".jsevent.JSEventsRenderer"
+      />
+
   <!-- Widget Factory -->
   <adapter
       factory=".jswidget.JSEventsWidget"

Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/interfaces.py
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/interfaces.py	2007-06-22 00:56:48 UTC (rev 76931)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/interfaces.py	2007-06-22 02:07:24 UTC (rev 76932)
@@ -52,6 +52,21 @@
         code produced by the given handler.
         """
 
+class IJSEventsRenderer(Interface):
+    """A renderer that produces javascript code for connecting DOM elements
+    to events.
+    """
+
+    events = schema.Object(
+        title=u"The set of events to be rendered.",
+        schema=IJSEvents,
+        required=True)
+
+    def render(widget, form):
+        """render javascript events on widget.
+        """
+
+
 class IJSEventsWidget(Interface):
     """Offers a jsEvents attribute."""
 

Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.py
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.py	2007-06-22 00:56:48 UTC (rev 76931)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.py	2007-06-22 02:07:24 UTC (rev 76932)
@@ -18,7 +18,8 @@
 __docformat__ = "reStructuredText"
 
 from zope.interface import implements
-from zope.component import adapts
+import zope.component
+from zope.publisher.interfaces.browser import IBrowserRequest
 from z3c.form import util
 from jquery.layer import IJQueryJavaScriptBrowserLayer
 
@@ -40,7 +41,7 @@
 
 CLICK = JSEvent("click")
 DBLCLICK = JSEvent("dblclick")
-CHANGED = JSEvent("changed")
+CHANGE = JSEvent("change")
 LOAD = JSEvent("load")
 
 
@@ -57,14 +58,35 @@
             self._data[kw] = kwargs[kw]
 
 
+class JSEventsRenderer(object):
+    """IJSEventsRenderer implementation"""
+    implements(interfaces.IJSEventsRenderer)
+    zope.component.adapts(interfaces.IJSEvents,
+                          IBrowserRequest)
+
+    def __init__(self, events, request):
+        self.request = request
+        self.events = events
+
+    def render(self, widget, form):
+        result = ''
+        for eventName, handler in self.events.items():
+            event = zope.component.getUtility(interfaces.IJSEvent, name=eventName)
+            renderer = zope.component.queryMultiAdapter((event, self.request),
+                                                        interfaces.IJSEventRenderer,
+                                                        default=JQueryEventRenderer(event, self.request))
+            result += renderer.render(handler, widget.id, form) + '\n'
+        return result
+
+
 class JQueryEventRenderer(object):
     """IJSEventRenderer implementation.
 
     See ``interfaces.IJSEventRenderer``.
     """
     implements(interfaces.IJSEventRenderer)
-    adapts(interfaces.IJSEvent,
-           IJQueryJavaScriptBrowserLayer)
+    zope.component.adapts(interfaces.IJSEvent,
+                          IJQueryJavaScriptBrowserLayer)
 
     def __init__(self, event, request):
         self.request = request

Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/testing.py
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/testing.py	2007-06-22 00:56:48 UTC (rev 76931)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/testing.py	2007-06-22 02:07:24 UTC (rev 76932)
@@ -26,7 +26,7 @@
 import z3c.form.interfaces
 
 import jquery.layer
-from z3c.formjs import jsbutton, jswidget
+from z3c.formjs import jsbutton, jswidget, jsevent
 from z3c.formjs import interfaces
 
 from z3c.form.interfaces import IWidget
@@ -44,10 +44,14 @@
                                   (jquery.layer.IJQueryJavaScriptBrowserLayer,
                                    interfaces.IJSButton),
                                   z3c.form.interfaces.IFieldWidget)
-
     zope.component.provideAdapter(jswidget.JSEventsWidget,
                                   (interfaces.IJSEvents, IWidget),
                                   interfaces.IJSEventsWidget)
+    ## Event Utilities
+    zope.component.provideUtility(jsevent.CLICK, interfaces.IJSEvent, name='click')
+    zope.component.provideUtility(jsevent.DBLCLICK, interfaces.IJSEvent, name='dblclick')
+    zope.component.provideUtility(jsevent.LOAD, interfaces.IJSEvent, name='load')
+    zope.component.provideUtility(jsevent.CHANGE, interfaces.IJSEvent, name='change')
 
 def tearDown(test):
     setup.placefulTearDown()



More information about the Checkins mailing list