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.