[Checkins] SVN: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/ attempting work on attaching events to any widget.

Paul Carduner paulcarduner at gmail.com
Thu Jun 21 20:50:34 EDT 2007


Log message for revision 76929:
  attempting work on attaching events to any 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/jsbutton.py
  U   Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.py
  A   Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jswidget.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:46:19 UTC (rev 76928)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/README.txt	2007-06-22 00:50:33 UTC (rev 76929)
@@ -36,8 +36,11 @@
 These events have javascript handlers which can be dynamically
 generated so we will define a handler using a function.
 
-  >>> def simpleHandler():
-  ...     return 'alert("Some event was called!");'
+  >>> def simpleHandler(form, id):
+  ...     return ('alert("Some event was called '
+  ...                    'for the element with id %s '
+  ...                    'and for the form %s");'
+  ...                    % (id, form)) 
 
 Another aspect of javascript events is that they get attached to a
 specific dom element using an id.  So let us make an imaginary dom
@@ -62,8 +65,9 @@
 
   >>> renderer = zope.component.getMultiAdapter((jsevent.CLICK,
   ...                                            request), jsinterfaces.IJSEventRenderer)
-  >>> renderer.render(simpleHandler, id)
-  '$("#form-field-age").bind("click", function(){alert("Some event was called!");});'
+  >>> renderer.render(simpleHandler, id, None)
+  '$("#form-field-age").bind("click", function(){alert("Some event was
+  called for the element with id form-field-age and for the form None");});'
 
 
 Buttons
@@ -99,11 +103,11 @@
   ...     prefix = 'form'
   ...
   ...     @jsbutton.handler(IButtons['apply'])
-  ...     def apply(self):
+  ...     def apply(self, id):
   ...         return 'alert("You Clicked the Apply Button!");'
   ...
   ...     @jsbutton.handler(IButtons['cancel'], event=jsevent.DBLCLICK)
-  ...     def cancel(self):
+  ...     def cancel(self, id):
   ...         return 'alert("You Double Clicked the Cancel Button!");'
 
 Notice that the jsbutton.handler decorator takes the keyword argument
@@ -121,9 +125,9 @@
 
 Action managers are instantiated using the form, request, and
 context/content. A special button-action-manager implementation is avaialble
-in the ``jsbutton`` package:
+in the ``z3c.form.button`` package:
 
-  >>> actions = jsbutton.JSButtonActions(form, request, None)
+  >>> actions = button.ButtonActions(form, request, None)
   >>> actions.update()
 
 Once the action manager is updated, the buttons should be available as
@@ -140,7 +144,7 @@
   >>> apply.__name__
   'apply'
   >>> apply.__parent__
-  <JSButtonActions None>
+  <ButtonActions None>
 
 A button action is also a button widget. The attributes translate as follows:
 
@@ -219,29 +223,29 @@
   >>> import zope.component
   >>> zope.component.provideAdapter(factory, name=interfaces.INPUT_MODE)
 
-Now for the magic.  We can attach an event to this widget by adapting
-it to ``IJSEventWidget``.
+Now for the magic.  We can attach events to this widget by adapting
+it to ``IJSEventWidget``.  First we will create the events we want to
+add to it.
 
   >>> def ageClickHandler():
   ...     return 'alert("This Widget was Clicked!");'
+  >>> def ageDblClickHandler():
+  ...     return 'alert("This Widget was Double Clicked!");'
+  >>> events = jsevent.JSEvents(click=ageClickHandler,
+  ...                           dblclick=ageDblClickHandler)
+  >>> age = zope.component.getMultiAdapter((events, age), jsinterfaces.IJSEventsWidget)
 
-  >>> jsinterfaces.IJSEventWidget(age).addEvent(jsevent.CLICK, ageClickHandler)
-
 Now we can update and render this widget.
 
   >>> age.update()
   >>> print age.render()
-  <input type="text" name="age" value="39" />
-
-If we render the widget in the regular way, nothing is different.
-However, we can render it using the IJSEventWidget adapter to have the
-event attached.
-
-  >>> jsinterfaces.IJSEventWidget(age).render()
-  <input type="text" id="age" name="age" value="39" />
+  <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>
 
 
 Rendering Widgets with Attached Events
@@ -305,5 +309,5 @@
   >>> jsinterfaces.IJSEventWidgetManager(add.widgets).renderEvents()
   <script type="javascript">
     $("#form-age").bind("click", function(){alert("The Age was Clicked!");});
-    $("#form-gender").bind("dblclick", function(){alert("The Gender was Changed!");});
+    $("#form-gender").bind("change", function(){alert("The Gender was Changed!");});
   </script>

Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/configure.zcml
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/configure.zcml	2007-06-22 00:46:19 UTC (rev 76928)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/configure.zcml	2007-06-22 00:50:33 UTC (rev 76929)
@@ -12,4 +12,36 @@
       factory=".jsevent.JQueryEventRenderer"
       />
 
+  <!-- Widget Factory -->
+  <adapter
+      factory=".jswidget.JSEventsWidget"
+      />
+
+  <!-- JavaScript Event Utitilities -->
+  <utility
+      provides="z3c.formjs.interfaces.IJSEvent"
+      name="click"
+      component="z3c.formjs.jsevent.CLICK"
+      />
+
+  <utility
+      provides="z3c.formjs.interfaces.IJSEvent"
+      name="dblclick"
+      component="z3c.formjs.jsevent.DBLCLICK"
+      />
+
+  <utility
+      provides="z3c.formjs.interfaces.IJSEvent"
+      name="changed"
+      component="z3c.formjs.jsevent.CHANGED"
+      />
+
+  <utility
+      provides="z3c.formjs.interfaces.IJSEvent"
+      name="load"
+      component="z3c.formjs.jsevent.LOAD"
+      />
+
+
+
 </configure>

Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/interfaces.py
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/interfaces.py	2007-06-22 00:46:19 UTC (rev 76928)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/interfaces.py	2007-06-22 00:50:33 UTC (rev 76929)
@@ -22,9 +22,10 @@
 from zope import schema
 
 from z3c.form.interfaces import IButton, IButtonHandler, IManager, IWidget
+from z3c.form.interfaces import ISelectionManager
 
 class IJSEvent(Interface):
-    """A marker interface for javascript event objects."""
+    """An interface for javascript event objects."""
 
     name = schema.TextLine(
         title=u"Event Name",
@@ -32,6 +33,10 @@
         required=True)
 
 
+class IJSEvents(ISelectionManager):
+    """Selection manager for javascript event objects."""
+
+
 class IJSEventRenderer(Interface):
     """A renderer that produces javascript code for connecting DOM elements
     to events.
@@ -47,7 +52,15 @@
         code produced by the given handler.
         """
 
+class IJSEventsWidget(Interface):
+    """Offers a jsEvents attribute."""
 
+    jsEvents = schema.Field(
+        title=u"JavaScript Events",
+        description=u"The javascript events associated with this widget.",
+        required=True)
+
+
 class IJSButton(IButton):
     """A button that just connects to javascript handlers."""
 

Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsbutton.py
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsbutton.py	2007-06-22 00:46:19 UTC (rev 76928)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsbutton.py	2007-06-22 00:50:33 UTC (rev 76929)
@@ -110,11 +110,10 @@
     zope.interface.implements(IFieldWidget)
     zope.component.adapts(
         IJQueryJavaScriptBrowserLayer,
-        interfaces.IJSButton,
-        zope.interface.Interface)
+        interfaces.IJSButton)
 
-    def __init__(self, request, field, name):
-        action.Action.__init__(self, request, field.title, name)
+    def __init__(self, request, field):
+        action.Action.__init__(self, request, field.title)
         ButtonWidget.__init__(self, request)
         self.field = field
 

Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.py
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.py	2007-06-22 00:46:19 UTC (rev 76928)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jsevent.py	2007-06-22 00:50:33 UTC (rev 76929)
@@ -19,7 +19,7 @@
 
 from zope.interface import implements
 from zope.component import adapts
-
+from z3c.form import util
 from jquery.layer import IJQueryJavaScriptBrowserLayer
 
 import interfaces
@@ -37,12 +37,26 @@
     def __repr__(self):
         return '<JSEvent "%s">' % self.name
 
+
 CLICK = JSEvent("click")
 DBLCLICK = JSEvent("dblclick")
 CHANGED = JSEvent("changed")
 LOAD = JSEvent("load")
 
 
+class JSEvents(util.SelectionManager):
+    """Selection manager for IJSEvents."""
+
+    implements(interfaces.IJSEvents)
+
+    def __init__(self, *args, **kwargs):
+        super(JSEvents, self).__init__(*args, **kwargs)
+        for kw in kwargs:
+            self._data_keys.append(kw)
+            self._data_values.append(kwargs[kw])
+            self._data[kw] = kwargs[kw]
+
+
 class JQueryEventRenderer(object):
     """IJSEventRenderer implementation.
 

Added: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jswidget.py
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jswidget.py	                        (rev 0)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jswidget.py	2007-06-22 00:50:33 UTC (rev 76929)
@@ -0,0 +1,13 @@
+import zope.component
+import zope.interface
+from z3c.form.interfaces import IWidget
+import interfaces
+
+ at zope.component.adapter(interfaces.IJSEvents, IWidget)
+ at zope.interface.implementer(interfaces.IJSEventsWidget)
+def JSEventsWidget(events, widget):
+    """Set the events for the widget."""
+    widget.jsEvents = events
+    if not interfaces.IJSEventsWidget.providedBy(widget):
+        zope.interface.alsoProvides(widget, interfaces.IJSEventsWidget)
+    return widget


Property changes on: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/jswidget.py
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/testing.py
===================================================================
--- Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/testing.py	2007-06-22 00:46:19 UTC (rev 76928)
+++ Sandbox/pcardune/z3cFormJS/trunk/src/z3c/formjs/testing.py	2007-06-22 00:50:33 UTC (rev 76929)
@@ -20,12 +20,16 @@
 import os.path
 
 import zope.interface
+import zope.component
 from zope.publisher.browser import TestRequest
 from zope.app.testing import setup
+import z3c.form.interfaces
 
 import jquery.layer
-from z3c.formjs import jsbutton
+from z3c.formjs import jsbutton, jswidget
+from z3c.formjs import interfaces
 
+from z3c.form.interfaces import IWidget
 import browser
 
 class TestRequest(TestRequest):
@@ -36,6 +40,14 @@
 
 def setUp(test):
     test.globs = {'root': setup.placefulSetUp(True)}
+    zope.component.provideAdapter(jsbutton.JSButtonAction,
+                                  (jquery.layer.IJQueryJavaScriptBrowserLayer,
+                                   interfaces.IJSButton),
+                                  z3c.form.interfaces.IFieldWidget)
 
+    zope.component.provideAdapter(jswidget.JSEventsWidget,
+                                  (interfaces.IJSEvents, IWidget),
+                                  interfaces.IJSEventsWidget)
+
 def tearDown(test):
     setup.placefulTearDown()



More information about the Checkins mailing list