You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by jk...@apache.org on 2006/05/28 18:52:10 UTC
svn commit: r409965 - in /tapestry/tapestry4/trunk:
examples/TimeTracker/src/java/org/apache/tapestry/timetracker/page/
framework/src/java/org/apache/tapestry/
framework/src/java/org/apache/tapestry/dojo/html/
framework/src/java/org/apache/tapestry/eng...
Author: jkuhnert
Date: Sun May 28 09:52:09 2006
New Revision: 409965
URL: http://svn.apache.org/viewvc?rev=409965&view=rev
Log:
Connected event listener to engine.
Added:
tapestry/tapestry4/trunk/framework/src/js/tapestry/lang.js (with props)
Modified:
tapestry/tapestry4/trunk/examples/TimeTracker/src/java/org/apache/tapestry/timetracker/page/TaskEntryPage.java
tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/IDirectEvent.java
tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/Tapestry.java
tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/dojo/html/WidgetEvent.script
tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/engine/DirectEventService.java
tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/event/BrowserEvent.java
tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/services/impl/ComponentEventInvoker.java
tapestry/tapestry4/trunk/framework/src/js/tapestry/__package__.js
tapestry/tapestry4/trunk/framework/src/js/tapestry/core.js
tapestry/tapestry4/trunk/framework/src/js/tapestry/event.js
tapestry/tapestry4/trunk/framework/src/js/tests/test_event.js
tapestry/tapestry4/trunk/framework/src/test/org/apache/tapestry/listener/ListenerMethodHolder.java
tapestry/tapestry4/trunk/framework/src/test/org/apache/tapestry/listener/TestListenerMapSource.java
Modified: tapestry/tapestry4/trunk/examples/TimeTracker/src/java/org/apache/tapestry/timetracker/page/TaskEntryPage.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/examples/TimeTracker/src/java/org/apache/tapestry/timetracker/page/TaskEntryPage.java?rev=409965&r1=409964&r2=409965&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/examples/TimeTracker/src/java/org/apache/tapestry/timetracker/page/TaskEntryPage.java (original)
+++ tapestry/tapestry4/trunk/examples/TimeTracker/src/java/org/apache/tapestry/timetracker/page/TaskEntryPage.java Sun May 28 09:52:09 2006
@@ -79,6 +79,6 @@
targets = { "projectChoose" }, elements = { "startPicker" })
public void projectSelected()
{
-
+ _log.debug("projectSelected()");
}
}
Modified: tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/IDirectEvent.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/IDirectEvent.java?rev=409965&r1=409964&r2=409965&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/IDirectEvent.java (original)
+++ tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/IDirectEvent.java Sun May 28 09:52:09 2006
@@ -15,7 +15,6 @@
import org.apache.tapestry.event.BrowserEvent;
-
/**
* Interface that defines classes that may be invoked directly by
* the event service.
Modified: tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/Tapestry.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/Tapestry.java?rev=409965&r1=409964&r2=409965&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/Tapestry.java (original)
+++ tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/Tapestry.java Sun May 28 09:52:09 2006
@@ -73,6 +73,15 @@
public static final String DIRECT_SERVICE = "direct";
/**
+ * Almost identical to the direct service, except specifically for handling
+ * browser level events.
+ *
+ * @since 4.1
+ */
+
+ public static final String DIRECT_EVENT_SERVICE = "directevent";
+
+ /**
* The name ("external") of a service that a allows {@link IExternalPage} to be selected.
* Associated with a {@link org.apache.tapestry.link.ExternalLink} component.
* <p>
Modified: tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/dojo/html/WidgetEvent.script
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/dojo/html/WidgetEvent.script?rev=409965&r1=409964&r2=409965&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/dojo/html/WidgetEvent.script (original)
+++ tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/dojo/html/WidgetEvent.script Sun May 28 09:52:09 2006
@@ -12,12 +12,25 @@
dojo.require("dojo.json");
dojo.require("dojo.event");
dojo.require("dojo.widget.Manager");
+ dojo.require("tapestry.event");
</unique>
</body>
<initialization>
<foreach expression="events" key="event">
dojo.event.connect(dojo.widget.byId("${component.id}"), "${event}", function(e) {
- dojo.debug("Event fired");
+ var content={beventname:"${event}"};
+ tapestry.event.buildEventProperties(e, content);
+ if (!content["beventtarget.id"]) content["beventtarget.id"]="${component.id}";
+
+ dojo.io.bind({
+ url:"${url}",
+ content:content,
+ preventCache:true,
+ load: function(type, data, evt) { dojo.debug("Response "); },
+ error: function(type, error) { dojo.debug("Error"); },
+ mimetype: "text/xml",
+ encoding: "UTF-8"
+ });
});
</foreach>
</initialization>
Modified: tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/engine/DirectEventService.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/engine/DirectEventService.java?rev=409965&r1=409964&r2=409965&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/engine/DirectEventService.java (original)
+++ tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/engine/DirectEventService.java Sun May 28 09:52:09 2006
@@ -27,7 +27,6 @@
import org.apache.tapestry.StaleSessionException;
import org.apache.tapestry.Tapestry;
import org.apache.tapestry.event.BrowserEvent;
-import org.apache.tapestry.event.EventTarget;
import org.apache.tapestry.services.LinkFactory;
import org.apache.tapestry.services.ResponseRenderer;
import org.apache.tapestry.services.ServiceConstants;
@@ -43,15 +42,15 @@
*/
public class DirectEventService implements IEngineService
-{
+{
/** @since 4.0 */
- protected ResponseRenderer _responseRenderer;
+ private ResponseRenderer _responseRenderer;
/** @since 4.0 */
- protected LinkFactory _linkFactory;
+ private LinkFactory _linkFactory;
/** @since 4.0 */
- protected WebRequest _request;
+ private WebRequest _request;
/** @since 4.0 */
private IRequestCycle _requestCycle;
@@ -132,14 +131,14 @@
throw new StaleSessionException(EngineMessages.requestStateSession(direct),
componentPage);
}
-
+
Object[] parameters = _linkFactory.extractListenerParameters(cycle);
-
+
triggerComponent(cycle, direct, parameters);
-
+
// Render the response. This will be the active page
// unless the direct component (or its delegate) changes it.
-
+
_responseRenderer.renderResponse(cycle);
}
@@ -147,18 +146,24 @@
protected void triggerComponent(IRequestCycle cycle, IDirectEvent direct, Object[] parameters)
{
- cycle.setListenerParameters(parameters);
-
- //TODO: This is BS! Need to grab real params
- Map tprops = new HashMap();
- tprops.put("id", "testId");
+ BrowserEvent event = null;
+ if (BrowserEvent.hasBrowserEvent(cycle)) {
+ event = new BrowserEvent(cycle);
+
+ Object[] parms = new Object[parameters.length + 1];
+ System.arraycopy(parameters, 0, parms, 0, parameters.length);
+ parms[parms.length - 1] = event;
+
+ cycle.setListenerParameters(parms);
+ } else
+ throw new ApplicationRuntimeException("No browser event found in request.");
- direct.triggerEvent(cycle, new BrowserEvent("onSelect", new EventTarget(tprops)));
+ direct.triggerEvent(cycle, event);
}
public String getName()
{
- return Tapestry.DIRECT_SERVICE;
+ return Tapestry.DIRECT_EVENT_SERVICE;
}
/** @since 4.0 */
Modified: tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/event/BrowserEvent.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/event/BrowserEvent.java?rev=409965&r1=409964&r2=409965&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/event/BrowserEvent.java (original)
+++ tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/event/BrowserEvent.java Sun May 28 09:52:09 2006
@@ -13,6 +13,12 @@
// limitations under the License.
package org.apache.tapestry.event;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.hivemind.util.Defense;
+import org.apache.tapestry.IRequestCycle;
+
/**
* Represents a client side generated browser event.
@@ -21,9 +27,56 @@
*/
public class BrowserEvent
{
- private final String _name;
+ static final String NAME="beventname";
+ static final String TYPE="beventtype";
+ static final String KEYS="beventkeys";
+ static final String CHAR_CODE="beventcharCode";
+ static final String PAGE_X="beventpageX";
+ static final String PAGE_Y="beventpageY";
+ static final String LAYER_X="beventlayerX";
+ static final String LAYER_Y="beventlayerY";
- private final EventTarget _target;
+ static final String TARGET="beventtarget";
+ static final String TARGET_ATTR_ID="id";
+
+ private String _name;
+ private String _type;
+ private String[] _keys;
+ private String _charCode;
+ private String _pageX;
+ private String _pageY;
+ private String _layerX;
+ private String _layerY;
+ private EventTarget _target;
+
+ /**
+ * Creates a new browser event that will extract its own
+ * parameters.
+ *
+ * @param cycle
+ * The request cycle to extract parameters from.
+ */
+ public BrowserEvent(IRequestCycle cycle)
+ {
+ Defense.notNull(cycle, "cycle");
+
+ _name = cycle.getParameter(NAME);
+ _type = cycle.getParameter(TYPE);
+ _keys = cycle.getParameters(KEYS);
+ _charCode = cycle.getParameter(CHAR_CODE);
+ _pageX = cycle.getParameter(PAGE_X);
+ _pageY = cycle.getParameter(PAGE_Y);
+ _layerX = cycle.getParameter(LAYER_X);
+ _layerY = cycle.getParameter(LAYER_Y);
+
+ String targetId = cycle.getParameter(TARGET + "." + TARGET_ATTR_ID);
+ if (targetId != null) {
+ Map props = new HashMap();
+ props.put(TARGET_ATTR_ID, targetId);
+
+ _target = new EventTarget(props);
+ }
+ }
/**
* Creates a new browser event with the specified
@@ -58,5 +111,75 @@
public EventTarget getTarget()
{
return _target;
+ }
+
+ /**
+ * @return the charCode
+ */
+ public String getCharCode()
+ {
+ return _charCode;
+ }
+
+ /**
+ * @return the keys
+ */
+ public String[] getKeys()
+ {
+ return _keys;
+ }
+
+ /**
+ * @return the layerX
+ */
+ public String getLayerX()
+ {
+ return _layerX;
+ }
+
+ /**
+ * @return the layerY
+ */
+ public String getLayerY()
+ {
+ return _layerY;
+ }
+
+ /**
+ * @return the pageX
+ */
+ public String getPageX()
+ {
+ return _pageX;
+ }
+
+ /**
+ * @return the pageY
+ */
+ public String getPageY()
+ {
+ return _pageY;
+ }
+
+ /**
+ * @return the type
+ */
+ public String getType()
+ {
+ return _type;
+ }
+
+ /**
+ * Utility method to check if the current request contains
+ * a browser event.
+ * @param cycle
+ * The associated request.
+ * @return True if the request contains browser event data.
+ */
+ public static boolean hasBrowserEvent(IRequestCycle cycle)
+ {
+ Defense.notNull(cycle, "cycle");
+
+ return cycle.getParameter(NAME) != null;
}
}
Modified: tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/services/impl/ComponentEventInvoker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/services/impl/ComponentEventInvoker.java?rev=409965&r1=409964&r2=409965&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/services/impl/ComponentEventInvoker.java (original)
+++ tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/services/impl/ComponentEventInvoker.java Sun May 28 09:52:09 2006
@@ -87,8 +87,8 @@
if (container == null) // only IPage has no container
container = component;
- IActionListener listener = component.getListeners().getListener(methodName);
- _invoker.invokeListener(listener, component, cycle);
+ IActionListener listener = container.getListeners().getListener(methodName);
+ _invoker.invokeListener(listener, container, cycle);
}
}
Modified: tapestry/tapestry4/trunk/framework/src/js/tapestry/__package__.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/framework/src/js/tapestry/__package__.js?rev=409965&r1=409964&r2=409965&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/js/tapestry/__package__.js (original)
+++ tapestry/tapestry4/trunk/framework/src/js/tapestry/__package__.js Sun May 28 09:52:09 2006
@@ -1,6 +1,8 @@
dojo.kwCompoundRequire({
common: [
- "tapestry.core"
+ "tapestry.core",
+ "tapestry.lang",
+ "tapestry.event"
]
});
dojo.provide("tapestry.*");
Modified: tapestry/tapestry4/trunk/framework/src/js/tapestry/core.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/framework/src/js/tapestry/core.js?rev=409965&r1=409964&r2=409965&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/js/tapestry/core.js (original)
+++ tapestry/tapestry4/trunk/framework/src/js/tapestry/core.js Sun May 28 09:52:09 2006
@@ -3,4 +3,4 @@
dojo.setModulePrefix("tapestry", "../tapestry");
-tapestry.version = "4.1";
\ No newline at end of file
+tapestry.version = "4.1";
Modified: tapestry/tapestry4/trunk/framework/src/js/tapestry/event.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/framework/src/js/tapestry/event.js?rev=409965&r1=409964&r2=409965&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/js/tapestry/event.js (original)
+++ tapestry/tapestry4/trunk/framework/src/js/tapestry/event.js Sun May 28 09:52:09 2006
@@ -20,14 +20,15 @@
if (!dojo.event.browser.isEvent(event)) return {};
if (!props) props={};
- if(event["type"]) props.type=event.type;
- if(event["keys"]) props.keys=encodeUriComponent(event.keys);
- if(event["pageX"]) props.pageX=evt.pageX;
- if(event["pageY"]) props.pageY=evt.pageY;
- if(event["layerX"]) props.layerX=evt.layerX;
- if(event["layerY"]) props.layerY=evt.layerY;
+ if(event["type"]) props.beventtype=event.type;
+ if(event["keys"]) props.beventkeys=event.keys;
+ if (event["charCode"]) props.beventcharCode=event.charCode;
+ if(event["pageX"]) props.beventpageX=event.pageX;
+ if(event["pageY"]) props.beventpageY=event.pageY;
+ if(event["layerX"]) props.beventlayerX=event.layerX;
+ if(event["layerY"]) props.beventlayerY=event.layerY;
- if (event["target"]) props.target=encodeURI(this.buildTargetProperties(event.target));
+ if (event["target"]) this.buildTargetProperties(props, event.target);
return props;
},
@@ -36,11 +37,11 @@
* Generic function to build a properties object populated with
* relevent target data.
*/
- buildTargetProperties:function(target){
+ buildTargetProperties:function(props, target){
if(!target) return;
if (dojo.dom.isNode(target))
- return this.buildNodeProperties(target);
+ return this.buildNodeProperties(props, target);
else
dojo.raise("buildTargetProperties() Unknown target type:" + target);
},
@@ -48,7 +49,8 @@
/**
* Builds needed target node properties, like the nodes id.
*/
- buildNodeProperties:function(node) {
- return {id:node.getAttribute("id")};
+ buildNodeProperties:function(props, node) {
+ if (node.getAttribute("id"))
+ props["beventtarget.id"]=node.getAttribute("id");
}
}
Added: tapestry/tapestry4/trunk/framework/src/js/tapestry/lang.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/framework/src/js/tapestry/lang.js?rev=409965&view=auto
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/js/tapestry/lang.js (added)
+++ tapestry/tapestry4/trunk/framework/src/js/tapestry/lang.js Sun May 28 09:52:09 2006
@@ -0,0 +1,46 @@
+dojo.provide("tapestry.lang");
+
+dojo.require("dojo.lang");
+
+tapestry.lang = {
+
+ /**
+ * Searches the specified list for an object with a matching propertyName/value pair.
+ * @param list The array of objects to search.
+ * @param properyName The object property key to match on. (ie object[propertyName])
+ * Can also be a template object to match in the form of {key:{key:value}} nested
+ * as deeply as you like.
+ * @param value The value to be matched against
+ * @return The matching array object found, or null.
+ */
+ find:function(list, property, value){
+ if (!list || !property || list.length < 1) return null;
+
+ // if not propMatch then template object was passed in
+ var propMatch=dojo.lang.isString(property);
+ if (propMatch && !value) return null; //if doing string/other non template match and no value
+
+ for (var i=0; i < list.length; i++) {
+ if (!list[i]) continue;
+ if (propMatch) {
+ if (list[i] && list[i][property] && list[i][property] == value) return list[i];
+ } else {
+ if (this.matchProperty(property, list[i])) return list[i];
+ }
+ }
+ return null;
+ },
+
+ // called recursively to match object properties
+ // partially stolen logic from dojo.widget.html.SortableTable.sort
+ matchProperty:function(template, object){
+ if(!dojo.lang.isObject(template) || !dojo.lang.isObject(object))
+ return template.valueOf() == object.valueOf();
+
+ for(var p in template){
+ if(!(p in object)) return false; // boolean
+ if (!this.matchProperty(template[p], object[p])) return false;
+ }
+ return true;
+ }
+}
\ No newline at end of file
Propchange: tapestry/tapestry4/trunk/framework/src/js/tapestry/lang.js
------------------------------------------------------------------------------
svn:eol-style = native
Modified: tapestry/tapestry4/trunk/framework/src/js/tests/test_event.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/framework/src/js/tests/test_event.js?rev=409965&r1=409964&r2=409965&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/js/tests/test_event.js (original)
+++ tapestry/tapestry4/trunk/framework/src/js/tests/test_event.js Sun May 28 09:52:09 2006
@@ -1,6 +1,6 @@
dojo.setModulePrefix("tapestry", "../tapestry");
-dojo.require("tapestry.event");
+dojo.require("tapestry.*");
dojo.require("tapestry.test");
// override to make sure our fake events pass
@@ -18,6 +18,6 @@
jum.assertTrue("evType", dojo.event.browser.isEvent(fevent));
jum.assertTrue("testNullProp", tapestry.event.buildEventProperties({}));
- jum.assertTrue("type", props.type != "undefined");
- jum.assertEquals("targetEncoded", "gobbly", props.target);
+ jum.assertTrue("type", props.beventtype != "undefined");
+ jum.assertEquals("targetprops", "testid", props["beventtarget.id"]);
}
Modified: tapestry/tapestry4/trunk/framework/src/test/org/apache/tapestry/listener/ListenerMethodHolder.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/framework/src/test/org/apache/tapestry/listener/ListenerMethodHolder.java?rev=409965&r1=409964&r2=409965&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/test/org/apache/tapestry/listener/ListenerMethodHolder.java (original)
+++ tapestry/tapestry4/trunk/framework/src/test/org/apache/tapestry/listener/ListenerMethodHolder.java Sun May 28 09:52:09 2006
@@ -19,6 +19,7 @@
import org.apache.tapestry.IPage;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.engine.ILink;
+import org.apache.tapestry.event.BrowserEvent;
import org.apache.tapestry.html.BasePage;
/**
@@ -69,6 +70,16 @@
{
}
+ public void barneyClicked(BrowserEvent event)
+ {
+
+ }
+
+ public void bangbangClicked(IRequestCycle cycle, BrowserEvent event, int argument)
+ {
+
+ }
+
public void noMatch(String argument1, double argument2, long argument3)
{
Modified: tapestry/tapestry4/trunk/framework/src/test/org/apache/tapestry/listener/TestListenerMapSource.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/framework/src/test/org/apache/tapestry/listener/TestListenerMapSource.java?rev=409965&r1=409964&r2=409965&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/test/org/apache/tapestry/listener/TestListenerMapSource.java (original)
+++ tapestry/tapestry4/trunk/framework/src/test/org/apache/tapestry/listener/TestListenerMapSource.java Sun May 28 09:52:09 2006
@@ -21,6 +21,7 @@
import org.apache.tapestry.IPage;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.engine.ILink;
+import org.apache.tapestry.event.BrowserEvent;
import org.easymock.MockControl;
/**
@@ -112,7 +113,26 @@
verifyControls();
}
+
+ public void testFoundWithAllParameters()
+ {
+ BrowserEvent event = new BrowserEvent("onClick", null);
+ IRequestCycle cycle = newCycle(new Object[] { event, new Integer(8) });
+ ListenerMethodHolder holder = newHolder();
+
+ holder.bangbangClicked(cycle, event, 8);
+
+ replayControls();
+
+ ListenerMapSource source = new ListenerMapSourceImpl();
+ ListenerMap map = source.getListenerMapForObject(holder);
+
+ map.getListener("bangbangClicked").actionTriggered(null, cycle);
+
+ verifyControls();
+ }
+
/**
* No exact match on parameter count, fall through to the no-arguments
* method implementation.