Author: sylvain Date: Mon Sep 27 13:47:00 2004 New Revision: 47331 Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/ActionDefinition.java cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/DeleteRowsActionDefinition.java cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/Repeater.java cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/RepeaterActionDefinitionBuilder.java cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/RowActionDefinition.java cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/RowActionDefinitionBuilder.java cocoon/branches/BRANCH_2_1_X/src/documentation/xdocs/userdocs/forms/widget_repeater_action.xml cocoon/branches/BRANCH_2_1_X/src/documentation/xdocs/userdocs/forms/widget_row_action.xml cocoon/branches/BRANCH_2_1_X/status.xml Log: Rename 'on-activate' to 'on-action' and call handlers before deleting rows
Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/ActionDefinition.java ============================================================================== --- cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/ActionDefinition.java (original) +++ cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/ActionDefinition.java Mon Sep 27 13:47:00 2004 @@ -22,7 +22,7 @@ /** * The [EMAIL PROTECTED] WidgetDefinition} part of a Action widget, see [EMAIL PROTECTED] Action} for more information. * - * @version $Id: ActionDefinition.java,v 1.1 2004/03/09 10:33:50 reinhard Exp $ + * @version $Id$ */ public class ActionDefinition extends AbstractWidgetDefinition { private String actionCommand; Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/DeleteRowsActionDefinition.java ============================================================================== --- cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/DeleteRowsActionDefinition.java (original) +++ cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/DeleteRowsActionDefinition.java Mon Sep 27 13:47:00 2004 @@ -16,13 +16,15 @@ package org.apache.cocoon.forms.formmodel; import org.apache.cocoon.forms.event.ActionEvent; -import org.apache.cocoon.forms.event.ActionListener; /** * The definition for a repeater action that deletes the selected rows of a sibling repeater. + * <p> + * The action listeners attached to this action, if any, are called <em>before</em> the rows + * are actually removed * * @author <a href="http://www.apache.org/~sylvain/">Sylvain Wallez</a> - * @version CVS $Id: DeleteRowsActionDefinition.java,v 1.2 2004/05/07 16:43:42 mpo Exp $ + * @version CVS $Id$ */ public class DeleteRowsActionDefinition extends RepeaterActionDefinition { @@ -31,17 +33,24 @@ public DeleteRowsActionDefinition(String repeaterName, String selectName) { super(repeaterName); this.selectName = selectName; + } + + public boolean hasActionListeners() { + // we always want to be notified + return true; + } + + public void fireActionEvent(ActionEvent event) { + // Call action listeners, if any + super.fireActionEvent(event); - this.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent event) { - Repeater repeater = ((RepeaterAction)event.getSource()).getRepeater(); - for (int i = repeater.getSize() - 1; i >= 0; i--) { - Repeater.RepeaterRow row = repeater.getRow(i); - if (Boolean.TRUE.equals(row.getChild(DeleteRowsActionDefinition.this.selectName).getValue())) { - repeater.removeRow(i); - } - } + // and actually delete the rows + Repeater repeater = ((RepeaterAction)event.getSource()).getRepeater(); + for (int i = repeater.getSize() - 1; i >= 0; i--) { + Repeater.RepeaterRow row = repeater.getRow(i); + if (Boolean.TRUE.equals(row.getChild(DeleteRowsActionDefinition.this.selectName).getValue())) { + repeater.removeRow(i); } - }); + } } } Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/Repeater.java ============================================================================== --- cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/Repeater.java (original) +++ cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/Repeater.java Mon Sep 27 13:47:00 2004 @@ -39,7 +39,7 @@ * <p>Using the methods [EMAIL PROTECTED] #getSize()} and [EMAIL PROTECTED] #getWidget(int, java.lang.String)} * you can access all of the repeated widget instances. * - * @version $Id: Repeater.java,v 1.14 2004/05/07 20:54:21 mpo Exp $ + * @version $Id$ */ public class Repeater extends AbstractWidget //implements ContainerWidget @@ -53,7 +53,7 @@ removeRows(); } - protected WidgetDefinition getDefinition() { + public WidgetDefinition getDefinition() { return definition; } Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/RepeaterActionDefinitionBuilder.java ============================================================================== --- cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/RepeaterActionDefinitionBuilder.java (original) +++ cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/RepeaterActionDefinitionBuilder.java Mon Sep 27 13:47:00 2004 @@ -17,6 +17,7 @@ import java.util.Iterator; +import org.apache.cocoon.forms.Constants; import org.apache.cocoon.forms.event.ActionListener; import org.apache.cocoon.forms.util.DomHelper; import org.w3c.dom.Element; @@ -49,7 +50,14 @@ definition.setActionCommand(actionCommand); - Iterator iter = buildEventListeners(widgetElement, "on-activate", ActionListener.class).iterator(); + // Warn of the mis-named 'on-action' that existed initially + Element buggyOnActivate = DomHelper.getChildElement(widgetElement, Constants.DEFINITION_NS, "on-activate", false); + if (buggyOnActivate != null) { + throw new Exception("Use 'on-action' instead of 'on-activate' on row-action at " + + DomHelper.getLocation(buggyOnActivate)); + } + + Iterator iter = buildEventListeners(widgetElement, "on-action", ActionListener.class).iterator(); while (iter.hasNext()) { definition.addActionListener((ActionListener)iter.next()); } Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/RowActionDefinition.java ============================================================================== --- cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/RowActionDefinition.java (original) +++ cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/RowActionDefinition.java Mon Sep 27 13:47:00 2004 @@ -21,7 +21,7 @@ /** * * @author <a href="http://www.apache.org/~sylvain/">Sylvain Wallez</a> - * @version CVS $Id: RowActionDefinition.java,v 1.1 2004/03/09 10:33:50 reinhard Exp $ + * @version CVS $Id$ */ public class RowActionDefinition extends ActionDefinition { @@ -29,19 +29,32 @@ return new RowAction(this); } + /** + * Deletes the row containing this action. Action listeners, if any, are called <em>before</em> + * the row is deleted. + */ public static class DeleteRowDefinition extends RowActionDefinition { - public DeleteRowDefinition() { - super.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent event) { - Repeater.RepeaterRow row = Repeater.getParentRow(event.getSourceWidget()); - Repeater repeater = (Repeater)row.getParent(); - repeater.removeRow(repeater.indexOf(row)); - } - }); + + public boolean hasActionListeners() { + // We always want to be notified + return true; + } + + public void fireActionEvent(ActionEvent event) { + // Call event listeners, if any (the row still exists) + super.fireActionEvent(event); + + // and delete the row + Repeater.RepeaterRow row = Repeater.getParentRow(event.getSourceWidget()); + Repeater repeater = (Repeater)row.getParent(); + repeater.removeRow(repeater.indexOf(row)); } } + /** + * Moves up the row containing this action. Action listeners, if any, are called <em>after</em> + * the row has been moved. + */ public static class MoveUpDefinition extends RowActionDefinition { public MoveUpDefinition() { super.addActionListener(new ActionListener() { @@ -56,6 +69,10 @@ } } + /** + * Moves up the row containing this action. Action listeners, if any, are called <em>after</em> + * the row has been moved. + */ public static class MoveDownDefinition extends RowActionDefinition { public MoveDownDefinition() { super.addActionListener(new ActionListener() { @@ -70,6 +87,10 @@ } } + /** + * Adds a row after the one containing this action. Action listeners, if any, are called <em>after</em> + * the new row has been created. + */ public static class AddAfterDefinition extends RowActionDefinition { public AddAfterDefinition() { super.addActionListener(new ActionListener() { @@ -82,6 +103,4 @@ }); } } - - } Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/RowActionDefinitionBuilder.java ============================================================================== --- cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/RowActionDefinitionBuilder.java (original) +++ cocoon/branches/BRANCH_2_1_X/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/RowActionDefinitionBuilder.java Mon Sep 27 13:47:00 2004 @@ -17,6 +17,7 @@ import java.util.Iterator; +import org.apache.cocoon.forms.Constants; import org.apache.cocoon.forms.event.ActionListener; import org.apache.cocoon.forms.util.DomHelper; import org.w3c.dom.Element; @@ -37,7 +38,14 @@ definition.setActionCommand(actionCommand); - Iterator iter = buildEventListeners(widgetElement, "on-activate", ActionListener.class).iterator(); + // Warn of the mis-named 'on-action' that existed initially + Element buggyOnActivate = DomHelper.getChildElement(widgetElement, Constants.DEFINITION_NS, "on-activate", false); + if (buggyOnActivate != null) { + throw new Exception("Use 'on-action' instead of 'on-activate' on row-action at " + + DomHelper.getLocation(buggyOnActivate)); + } + + Iterator iter = buildEventListeners(widgetElement, "on-action", ActionListener.class).iterator(); while (iter.hasNext()) { definition.addActionListener((ActionListener)iter.next()); } Modified: cocoon/branches/BRANCH_2_1_X/src/documentation/xdocs/userdocs/forms/widget_repeater_action.xml ============================================================================== --- cocoon/branches/BRANCH_2_1_X/src/documentation/xdocs/userdocs/forms/widget_repeater_action.xml (original) +++ cocoon/branches/BRANCH_2_1_X/src/documentation/xdocs/userdocs/forms/widget_repeater_action.xml Mon Sep 27 13:47:00 2004 @@ -36,9 +36,9 @@ <fd:label>...</fd:label> <fd:help>...</fd:help> <fd:hint>...</fd:hint> - <fd:on-activate> + <fd:on-action> ... - </fd:on-activate> + </fd:on-action> </fd:repeater-action>]]></source> <p>The <strong>action-command</strong> attribute should have either @@ -56,10 +56,13 @@ returns a boolean) that is part of the repeater and used to mark the rows to be deleted.</p> - <p><strong>fd:on-activate</strong> allows additional event handlers + <p><strong>fd:on-action</strong> allows additional event handlers to be defined, see also <link href="eventhandling.html">Event Handling</link>. The interface to be implemented for Java event listeners is <code>org.apache.cocoon.forms.event.ActionListener</code>. - The WidgetEvent subclass is <code>org.apache.cocoon.forms.event.ActionEvent</code>.</p> + The WidgetEvent subclass is <code>org.apache.cocoon.forms.event.ActionEvent</code>. + The event handlers are called <em>after</em> the action is performed except for the + <code>delete-rows</code> action where event handlers are called <em>before</em> the + selected rows are deleted.</p> </s1> </body> </document> Modified: cocoon/branches/BRANCH_2_1_X/src/documentation/xdocs/userdocs/forms/widget_row_action.xml ============================================================================== --- cocoon/branches/BRANCH_2_1_X/src/documentation/xdocs/userdocs/forms/widget_row_action.xml (original) +++ cocoon/branches/BRANCH_2_1_X/src/documentation/xdocs/userdocs/forms/widget_row_action.xml Mon Sep 27 13:47:00 2004 @@ -37,19 +37,22 @@ <fd:label>...</fd:label> <fd:help>...</fd:help> <fd:hint>...</fd:hint> - <fd:on-activate> + <fd:on-action> ... - </fd:on-activate> + </fd:on-action> </fd:row-action>]]></source> <p>The <strong>action-command</strong> attribute should have either the value <code>add-after</code>, <code>delete</code>, <code>move-up</code> or <code>move-down</code>.</p> - <p><strong>fd:on-activate</strong> allows additional event handlers to + <p><strong>fd:on-action</strong> allows additional event handlers to be defined, see also <link href="eventhandling.html">Event Handling</link>. The interface to be implemented for Java event listeners is <code>org.apache.cocoon.forms.event.ActionListener</code>. - The WidgetEvent subclass is <code>org.apache.cocoon.forms.event.ActionEvent</code>.</p> + The WidgetEvent subclass is <code>org.apache.cocoon.forms.event.ActionEvent</code>. + The event handlers are called <em>after</em> the action is performed except for the + <code>delete</code> row action where event handlers are called <em>before</em> the + row is deleted.</p> <p>Where all you want to do is submit a specific row on a repeater, simply add a fd:submit element to the widgets for the repeater.</p> Modified: cocoon/branches/BRANCH_2_1_X/status.xml ============================================================================== --- cocoon/branches/BRANCH_2_1_X/status.xml (original) +++ cocoon/branches/BRANCH_2_1_X/status.xml Mon Sep 27 13:47:00 2004 @@ -34,7 +34,7 @@ version CDATA #REQUIRED date CDATA #REQUIRED > -<!ELEMENT action (#PCDATA | link | br | code | ul)*> +<!ELEMENT action (#PCDATA | link | br | code | ul | strong)*> <!ATTLIST action context (build | code | docs) #IMPLIED assigned-to CDATA #IMPLIED @@ -46,6 +46,7 @@ > <!ELEMENT code (#PCDATA)> <!ELEMENT br EMPTY> +<!ELEMENT strong (#PCDATA)> <!ELEMENT link (#PCDATA)> <!ATTLIST link href CDATA #REQUIRED @@ -204,6 +205,11 @@ <changes> <release version="@version@" date="@date@"> + <action dev="SW" type="fix"> + Forms block: rename <code>fd:on-activate</code> to <code>fd:on-action</code> on + <code>fd:row-action</code> and <code>fd:repeater-action</code> for consistency + with <code>fd:action</code> and <code>fd:submit</code>. + </action> <action dev="CZ" type="update"> Cache the mime-type of readers and serializers. </action>