You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by rl...@apache.org on 2005/05/15 06:48:40 UTC
cvs commit: jakarta-tapestry/framework/src/documentation/content/xdocs/tapestry/ComponentReference ImageSubmit.xml Submit.xml
rlewisshell 2005/05/14 21:48:40
Modified: . status.xml
framework/src/test/org/apache/tapestry/form TestSubmit.java
framework/src/java/org/apache/tapestry/form ImageSubmit.jwc
Submit.jwc Submit.java LinkSubmit.jwc
LinkSubmit.java
framework/src/documentation/content/xdocs/tapestry/ComponentReference
ImageSubmit.xml Submit.xml
Added: framework/src/java/org/apache/tapestry/form
AbstractSubmit.java
Log:
TAPESTRY-325: Allow deferred listener for LinkSubmit
TAPESTRY-326: Listener parameters for form submitting components
Revision Changes Path
1.106 +2 -0 jakarta-tapestry/status.xml
Index: status.xml
===================================================================
RCS file: /home/cvs/jakarta-tapestry/status.xml,v
retrieving revision 1.105
retrieving revision 1.106
diff -u -r1.105 -r1.106
--- status.xml 12 May 2005 18:56:26 -0000 1.105
+++ status.xml 15 May 2005 04:48:39 -0000 1.106
@@ -61,6 +61,8 @@
<action type="add" dev="HLS" fixes-bug="TAPESTRY-323"> Allow control over the ErrorHandler used when building the HiveMind Registry. </action>
<action type="update" dev="HLS"> Remove <inject-state>, and add type attribute to <inject>.</action>
<action type="fix" due-to="Richard Hensley">Fix some problems with the TestRestartService test suite.</action>
+ <action type="add" dev="RLS" fixes-bug="TAPESTRY-325">Added defer parameters parameter to LinkSubmit.</action>
+ <action type="add" dev="RLS" fixes-bug="TAPESTRY-326">Added listener parameters to Form submitting components.</action>
</release>
<release version="4.0-alpha-2" date="May 5 2005">
<action type="update" dev="HLS"> Coordinate Locale changes with the hivemind.ThreadLocale service. </action>
1.2 +66 -0 jakarta-tapestry/framework/src/test/org/apache/tapestry/form/TestSubmit.java
Index: TestSubmit.java
===================================================================
RCS file: /home/cvs/jakarta-tapestry/framework/src/test/org/apache/tapestry/form/TestSubmit.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- TestSubmit.java 9 May 2005 14:45:15 -0000 1.1
+++ TestSubmit.java 15 May 2005 04:48:39 -0000 1.2
@@ -14,6 +14,9 @@
package org.apache.tapestry.form;
+import java.util.Collection;
+import java.util.LinkedList;
+
import org.apache.hivemind.util.PropertyUtils;
import org.apache.tapestry.IActionListener;
import org.apache.tapestry.IBinding;
@@ -336,4 +339,67 @@
verifyControls();
}
+
+ public void testTriggerWithDeferredListenerAndSingleParameter()
+ {
+ IActionListener listener = newListener();
+ MockForm form = new MockForm();
+ MockControl cycleControl = newControl(IRequestCycle.class);
+ IRequestCycle cycle = (IRequestCycle)cycleControl.getMock();
+
+ Object parameter = new Object();
+ Creator creator = new Creator();
+ Submit submit = (Submit) creator.newInstance(Submit.class, new Object[]
+ { "listener", listener, "defer", Boolean.TRUE, "parameters", parameter });
+
+ cycle.setListenerParameters(new Object[] { parameter });
+ cycleControl.setMatcher(MockControl.ARRAY_MATCHER);
+
+ replayControls();
+
+ submit.handleClick(cycle, form);
+
+ verifyControls();
+
+ listener.actionTriggered(submit, cycle);
+
+ replayControls();
+
+ form.runDeferred();
+
+ verifyControls();
+ }
+
+ public void testTriggerWithDeferredListenerAndMultipleParameters()
+ {
+ IActionListener listener = newListener();
+ MockForm form = new MockForm();
+ MockControl cycleControl = newControl(IRequestCycle.class);
+ IRequestCycle cycle = (IRequestCycle)cycleControl.getMock();
+
+ Collection parameters = new LinkedList();
+ parameters.add("p1");
+ parameters.add("p2");
+
+ Creator creator = new Creator();
+ Submit submit = (Submit) creator.newInstance(Submit.class, new Object[]
+ { "listener", listener, "defer", Boolean.TRUE, "parameters", parameters });
+
+ cycle.setListenerParameters(new Object[] { "p1", "p2" });
+ cycleControl.setMatcher(MockControl.ARRAY_MATCHER);
+
+ replayControls();
+
+ submit.handleClick(cycle, form);
+
+ verifyControls();
+
+ listener.actionTriggered(submit, cycle);
+
+ replayControls();
+
+ form.runDeferred();
+
+ verifyControls();
+ }
}
1.7 +8 -0 jakarta-tapestry/framework/src/java/org/apache/tapestry/form/ImageSubmit.jwc
Index: ImageSubmit.jwc
===================================================================
RCS file: /home/cvs/jakarta-tapestry/framework/src/java/org/apache/tapestry/form/ImageSubmit.jwc,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- ImageSubmit.jwc 9 May 2005 14:45:15 -0000 1.6
+++ ImageSubmit.jwc 15 May 2005 04:48:39 -0000 1.7
@@ -69,6 +69,14 @@
a chance to update properties.
</description>
</parameter>
+
+ <parameter name="parameters" default-binding="ognl">
+ <description>
+ An object, or list of objects, gathered when the button is triggered and
+ made available as listener parameters in the request cycle, making
+ the parameters available to a deferred listener.
+ </description>
+ </parameter>
<reserved-parameter name="type"/>
<reserved-parameter name="src"/>
1.8 +7 -0 jakarta-tapestry/framework/src/java/org/apache/tapestry/form/Submit.jwc
Index: Submit.jwc
===================================================================
RCS file: /home/cvs/jakarta-tapestry/framework/src/java/org/apache/tapestry/form/Submit.jwc,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- Submit.jwc 13 May 2005 16:57:49 -0000 1.7
+++ Submit.jwc 15 May 2005 04:48:39 -0000 1.8
@@ -55,6 +55,13 @@
until just before the form's listener is invoked.
</description>
</parameter>
+ <parameter name="parameters" default-binding="ognl">
+ <description>
+ An object, or list of objects, gathered when the button is triggered and
+ made available as listener parameters in the request cycle, making
+ the parameters available to a deferred listener.
+ </description>
+ </parameter>
<reserved-parameter name="name"/>
<reserved-parameter name="type"/>
1.8 +17 -90 jakarta-tapestry/framework/src/java/org/apache/tapestry/form/Submit.java
Index: Submit.java
===================================================================
RCS file: /home/cvs/jakarta-tapestry/framework/src/java/org/apache/tapestry/form/Submit.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- Submit.java 9 May 2005 14:45:15 -0000 1.7
+++ Submit.java 15 May 2005 04:48:39 -0000 1.8
@@ -1,4 +1,4 @@
-// Copyright 2004, 2005 The Apache Software Foundation
+//Copyright 2004, 2005 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -14,8 +14,6 @@
package org.apache.tapestry.form;
-import org.apache.tapestry.IActionListener;
-import org.apache.tapestry.IForm;
import org.apache.tapestry.IMarkupWriter;
import org.apache.tapestry.IRequestCycle;
@@ -30,48 +28,22 @@
* @author Howard Lewis Ship
*/
-public abstract class Submit extends AbstractFormComponent
+public abstract class Submit extends AbstractSubmit
{
-
- protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
- {
- IForm form = getForm(cycle);
-
- if (form.wasPrerendered(writer, this))
- return;
-
- boolean rewinding = form.isRewinding();
-
- String name = form.getElementId(this);
-
- setName(name);
-
- if (rewinding)
- {
- // Don't bother doing anything if disabled.
-
- if (isDisabled())
- return;
-
- // How to know which Submit button was actually
- // clicked? When submitted, it produces a request parameter
- // with its name and value (the value serves double duty as both
- // the label on the button, and the parameter value).
-
- String value = cycle.getParameter(name);
-
- // If the value isn't there, then this button wasn't
- // selected.
-
- if (value == null)
- return;
-
- handleClick(cycle, form);
-
- return;
- }
-
- writer.beginEmpty("input");
+ protected boolean isClicked(IRequestCycle cycle, String name)
+ {
+ // How to know which Submit button was actually
+ // clicked? When submitted, it produces a request parameter
+ // with its name and value (the value serves double duty as both
+ // the label on the button, and the parameter value).
+
+ // If the value isn't there, then this button wasn't
+ // selected.
+ return cycle.getParameter(name) != null;
+ }
+
+ protected void writeTag(IMarkupWriter writer, IRequestCycle cycle, String name) {
+ writer.beginEmpty("input");
writer.attribute("type", "submit");
writer.attribute("name", name);
@@ -86,54 +58,9 @@
renderInformalParameters(writer, cycle);
writer.closeTag();
- }
-
- void handleClick(final IRequestCycle cycle, IForm form)
- {
- if (isParameterBound("selected"))
- setSelected(getTag());
-
- final IActionListener listener = getListener();
-
- if (listener == null)
- return;
-
- // Have a listener; notify it now, or defer for later?
-
- Runnable notify = new Runnable()
- {
- public void run()
- {
- listener.actionTriggered(Submit.this, cycle);
- }
- };
-
- if (getDefer())
- form.addDeferredRunnable(notify);
- else
- notify.run();
- }
+ }
/** parameter */
-
public abstract String getLabel();
- /** parameter */
-
- public abstract boolean isDisabled();
-
- /** parameter */
-
- public abstract IActionListener getListener();
-
- /** parameter */
-
- public abstract Object getTag();
-
- /** parameter */
-
- public abstract void setSelected(Object tag);
-
- /** parameter */
- public abstract boolean getDefer();
}
\ No newline at end of file
1.5 +19 -10 jakarta-tapestry/framework/src/java/org/apache/tapestry/form/LinkSubmit.jwc
Index: LinkSubmit.jwc
===================================================================
RCS file: /home/cvs/jakarta-tapestry/framework/src/java/org/apache/tapestry/form/LinkSubmit.jwc,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- LinkSubmit.jwc 18 Apr 2005 17:06:41 -0000 1.4
+++ LinkSubmit.jwc 15 May 2005 04:48:40 -0000 1.5
@@ -25,19 +25,28 @@
Creates a hyperlink that submits its enclosing form using JavaScript.
</description>
- <parameter name="listener">
- <description>
- The listener is invoked during the rewind as the link component is encountered. This is
- both attractive and dangerous when combined with a form. When the listener is
- invoked, the form has not completely rewound, so not all form values have necessarily
- been processed, so the listener might be performing its logic based on inconsistent
- data.
- </description>
- </parameter>
-
<parameter name="disabled"/>
<parameter name="selected"/>
<parameter name="tag"/>
+
+ <parameter name="listener" default-binding="listener">
+ <description>
+ A listener that is notified if this component is triggered.
+ </description>
+ </parameter>
+ <parameter name="defer" default-binding="ognl" default-value="true">
+ <description>
+ If true (the default), then any listener notification is deferred
+ until just before the form's listener is invoked.
+ </description>
+ </parameter>
+ <parameter name="parameters" default-binding="ognl">
+ <description>
+ An object, or list of objects, gathered when the link is triggered and
+ made available as listener parameters in the request cycle, making
+ the parameters available to a deferred listener.
+ </description>
+ </parameter>
<reserved-parameter name="name"/>
<reserved-parameter name="href"/>
1.8 +80 -106 jakarta-tapestry/framework/src/java/org/apache/tapestry/form/LinkSubmit.java
Index: LinkSubmit.java
===================================================================
RCS file: /home/cvs/jakarta-tapestry/framework/src/java/org/apache/tapestry/form/LinkSubmit.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- LinkSubmit.java 3 May 2005 17:41:27 -0000 1.7
+++ LinkSubmit.java 15 May 2005 04:48:40 -0000 1.8
@@ -15,8 +15,6 @@
package org.apache.tapestry.form;
import org.apache.hivemind.ApplicationRuntimeException;
-import org.apache.tapestry.IActionListener;
-import org.apache.tapestry.IBinding;
import org.apache.tapestry.IForm;
import org.apache.tapestry.IMarkupWriter;
import org.apache.tapestry.IRequestCycle;
@@ -31,7 +29,7 @@
* @author Richard Lewis-Shell
*/
-public abstract class LinkSubmit extends AbstractFormComponent
+public abstract class LinkSubmit extends AbstractSubmit
{
/**
* The name of an {@link org.apache.tapestry.IRequestCycle}attribute in which the current
@@ -47,118 +45,94 @@
*/
public static final String ATTRIBUTE_FUNCTION_NAME = "org.apache.tapestry.form.LinkSubmit_function";
- protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
- {
- IForm form = getForm(cycle);
-
- if (form.wasPrerendered(writer, this))
- return;
+ protected boolean isClicked(IRequestCycle cycle, String name)
+ {
+ // How to know which Submit link was actually
+ // clicked? When submitted, it sets its elementId into a hidden field
+ String value = cycle.getParameter("_linkSubmit");
+
+ // If the value isn't the elementId of this component, then this link wasn't
+ // selected.
+ return value != null && value.equals(name);
+ }
+
+ protected void writeTag(IMarkupWriter writer, IRequestCycle cycle, String name)
+ {
+ boolean disabled = isDisabled();
+
+ IMarkupWriter wrappedWriter;
+
+ if (!disabled)
+ {
+ PageRenderSupport pageRenderSupport = TapestryUtils.getPageRenderSupport(
+ cycle,
+ this);
+
+ // make sure the submit function is on the page (once)
+ if (cycle.getAttribute(ATTRIBUTE_FUNCTION_NAME) == null)
+ {
+ pageRenderSupport
+ .addBodyScript("function submitLink(form, elementId) { form._linkSubmit.value = elementId; if (form.onsubmit == null || form.onsubmit()) form.submit(); }");
+ cycle.setAttribute(ATTRIBUTE_FUNCTION_NAME, this);
+ }
+
+ IForm form = getForm(cycle);
+ String formName = form.getName();
+
+ // one hidden field per form:
+ String formHiddenFieldAttributeName = ATTRIBUTE_FUNCTION_NAME + formName;
+ if (cycle.getAttribute(formHiddenFieldAttributeName) == null)
+ {
+ writer.beginEmpty("input");
+ writer.attribute("type", "hidden");
+ writer.attribute("name", "_linkSubmit");
+ cycle.setAttribute(formHiddenFieldAttributeName, this);
+ }
+
+ writer.begin("a");
+ writer.attribute("href", "javascript:submitLink(document." + formName + ",\"" + name
+ + "\");");
+
+ // Allow the wrapped components a chance to render.
+ // Along the way, they may interact with this component
+ // and cause the name variable to get set.
+ wrappedWriter = writer.getNestedWriter();
+ }
+ else
+ wrappedWriter = writer;
- String formName = form.getName();
-
- boolean rewinding = form.isRewinding();
-
- String name = form.getElementId(this);
+ renderBody(wrappedWriter, cycle);
- IMarkupWriter wrappedWriter;
+ if (!disabled)
+ {
+ // Generate additional attributes from informal parameters.
+ renderInformalParameters(writer, cycle);
+
+ // Dump in HTML provided by wrapped components
+ wrappedWriter.close();
+
+ // Close the <a> tag
+ writer.end();
+ }
+ }
+
+ protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
+ {
if (cycle.getAttribute(ATTRIBUTE_NAME) != null)
throw new ApplicationRuntimeException(Tapestry.getMessage("LinkSubmit.may-not-nest"),
this, null, null);
cycle.setAttribute(ATTRIBUTE_NAME, this);
- boolean disabled = isDisabled();
- if (!disabled)
- {
- if (!rewinding)
- {
-
- PageRenderSupport pageRenderSupport = TapestryUtils.getPageRenderSupport(
- cycle,
- this);
-
- // make sure the submit function is on the page (once)
- if (cycle.getAttribute(ATTRIBUTE_FUNCTION_NAME) == null)
- {
- pageRenderSupport
- .addBodyScript("function submitLink(form, elementId) { form._linkSubmit.value = elementId; if (form.onsubmit == null || form.onsubmit()) form.submit(); }");
- cycle.setAttribute(ATTRIBUTE_FUNCTION_NAME, this);
- }
-
- // one hidden field per form:
- String formHiddenFieldAttributeName = ATTRIBUTE_FUNCTION_NAME + formName;
- if (cycle.getAttribute(formHiddenFieldAttributeName) == null)
- {
- writer.beginEmpty("input");
- writer.attribute("type", "hidden");
- writer.attribute("name", "_linkSubmit");
- cycle.setAttribute(formHiddenFieldAttributeName, this);
- }
- }
- else
- {
- // How to know which Submit link was actually
- // clicked? When submitted, it sets its elementId into a hidden field
-
- String value = cycle.getParameter("_linkSubmit");
-
- // If the value isn't the elementId of this component, then this link wasn't
- // selected.
-
- if (value != null && value.equals(name))
- {
- IBinding selectedBinding = getBinding("selected");
- if (selectedBinding != null)
- selectedBinding.setObject(getTag());
- IActionListener listener = getListener();
- if (listener != null)
- listener.actionTriggered(this, cycle);
- }
- }
-
- writer.begin("a");
- writer.attribute("href", "javascript:submitLink(document." + formName + ",\"" + name
- + "\");");
-
- // Allow the wrapped components a chance to render.
- // Along the way, they may interact with this component
- // and cause the name variable to get set.
-
- wrappedWriter = writer.getNestedWriter();
- }
- else
- wrappedWriter = writer;
-
- renderBody(wrappedWriter, cycle);
-
- if (!disabled)
- {
- // Generate additional attributes from informal parameters.
-
- renderInformalParameters(writer, cycle);
-
- // Dump in HTML provided by wrapped components
-
- wrappedWriter.close();
-
- // Close the <a> tag
-
- writer.end();
- }
-
- cycle.removeAttribute(ATTRIBUTE_NAME);
+ try
+ {
+ super.renderComponent(writer, cycle);
+ }
+ finally
+ {
+ cycle.removeAttribute(ATTRIBUTE_NAME);
+ }
}
- public abstract boolean isDisabled();
-
- public abstract void setDisabled(boolean disabled);
-
- public abstract IActionListener getListener();
-
- public abstract void setListener(IActionListener listener);
-
- public abstract Object getTag();
-
- public abstract void setTag(Object tag);
}
\ No newline at end of file
1.1 jakarta-tapestry/framework/src/java/org/apache/tapestry/form/AbstractSubmit.java
Index: AbstractSubmit.java
===================================================================
//Copyright 2004, 2005 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package org.apache.tapestry.form;
import java.util.Collection;
import org.apache.tapestry.IActionListener;
import org.apache.tapestry.IForm;
import org.apache.tapestry.IMarkupWriter;
import org.apache.tapestry.IRequestCycle;
/**
* Superclass for components submitting their form.
* @author Richard Lewis-Shell
* @since 4.0
*/
abstract class AbstractSubmit extends AbstractFormComponent {
/**
* Determine if this submit component was clicked.
* @param cycle
* @param name
* @return true if this submit was clicked
*/
protected abstract boolean isClicked(IRequestCycle cycle, String name);
/**
* Write the tag (and any nested content) for this submit component.
* @param writer
* @param cycle
* @param name
*/
protected abstract void writeTag(IMarkupWriter writer, IRequestCycle cycle, String name);
protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
{
IForm form = getForm(cycle);
if (form.wasPrerendered(writer, this))
return;
boolean rewinding = form.isRewinding();
String name = form.getElementId(this);
setName(name);
if (rewinding)
{
// Don't bother doing anything if disabled.
if (isDisabled())
return;
if (isClicked(cycle, name))
handleClick(cycle, form);
return;
}
writeTag(writer, cycle, name);
}
void handleClick(final IRequestCycle cycle, IForm form)
{
if (isParameterBound("selected"))
setSelected(getTag());
final IActionListener listener = getListener();
if (listener == null)
return;
Object parameters = getParameters();
if (parameters != null)
{
if (parameters instanceof Collection) {
cycle.setListenerParameters(((Collection)parameters).toArray());
}
else {
cycle.setListenerParameters(new Object[] {parameters});
}
}
// Have a listener; notify it now, or defer for later?
Runnable notify = new Runnable()
{
public void run()
{
listener.actionTriggered(AbstractSubmit.this, cycle);
}
};
if (getDefer())
form.addDeferredRunnable(notify);
else
notify.run();
}
/** parameter */
public abstract boolean isDisabled();
/** parameter */
public abstract IActionListener getListener();
/** parameter */
public abstract Object getTag();
/** parameter */
public abstract void setSelected(Object tag);
/** parameter */
public abstract boolean getDefer();
/** parameter */
public abstract Object getParameters();
}
1.4 +24 -0 jakarta-tapestry/framework/src/documentation/content/xdocs/tapestry/ComponentReference/ImageSubmit.xml
Index: ImageSubmit.xml
===================================================================
RCS file: /home/cvs/jakarta-tapestry/framework/src/documentation/content/xdocs/tapestry/ComponentReference/ImageSubmit.xml,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ImageSubmit.xml 9 May 2005 14:45:15 -0000 1.3
+++ ImageSubmit.xml 15 May 2005 04:48:40 -0000 1.4
@@ -169,6 +169,30 @@
before the enclosing &Form;'s listener.
</td>
</tr>
+ <tr>
+ <td>parameters</td>
+ <td>Object</td>
+ <td>in</td>
+ <td>no</td>
+ <td> </td>
+ <td>ognl</td>
+ <td>
+ Parameter(s) gathered at the time the button is triggered,
+ supplied as listener parameters in the IRequestCycle
+ available to the listener.
+ <p>
+ If the parameter is a Collection, it will be converted to
+ an Object array (to match the IRequestCycle getListenerParameters()
+ signature).
+ </p>
+ <p>
+ Allows deferred listeners
+ (defer = true) access to any rewind state not conveniently
+ placed using tag/selected (e.g. when there are multiple objects
+ to select as might happen with a nested Foreach).
+ </p>
+ </td>
+ </tr>
</table>
1.4 +24 -0 jakarta-tapestry/framework/src/documentation/content/xdocs/tapestry/ComponentReference/Submit.xml
Index: Submit.xml
===================================================================
RCS file: /home/cvs/jakarta-tapestry/framework/src/documentation/content/xdocs/tapestry/ComponentReference/Submit.xml,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- Submit.xml 9 May 2005 14:45:15 -0000 1.3
+++ Submit.xml 15 May 2005 04:48:40 -0000 1.4
@@ -150,6 +150,30 @@
before the enclosing &Form;'s listener.
</td>
</tr>
+ <tr>
+ <td>parameters</td>
+ <td>Object</td>
+ <td>in</td>
+ <td>no</td>
+ <td> </td>
+ <td>ognl</td>
+ <td>
+ Parameter(s) gathered at the time the button is triggered,
+ supplied as listener parameters in the IRequestCycle
+ available to the listener.
+ <p>
+ If the parameter is a Collection, it will be converted to
+ an Object array (to match the IRequestCycle getListenerParameters()
+ signature).
+ </p>
+ <p>
+ Allows deferred listeners
+ (defer = true) access to any rewind state not conveniently
+ placed using tag/selected (e.g. when there are multiple objects
+ to select as might happen with a nested Foreach).
+ </p>
+ </td>
+ </tr>
</table>
<p>
---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-dev-help@jakarta.apache.org