Return-Path: Delivered-To: apmail-cocoon-cvs-archive@www.apache.org Received: (qmail 53952 invoked from network); 27 Sep 2004 21:00:29 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur-2.apache.org with SMTP; 27 Sep 2004 21:00:29 -0000 Received: (qmail 35120 invoked by uid 500); 27 Sep 2004 21:00:16 -0000 Delivered-To: apmail-cocoon-cvs-archive@cocoon.apache.org Received: (qmail 35070 invoked by uid 500); 27 Sep 2004 21:00:15 -0000 Mailing-List: contact cvs-help@cocoon.apache.org; run by ezmlm Precedence: bulk Reply-To: dev@cocoon.apache.org list-help: list-unsubscribe: list-post: Delivered-To: mailing list cvs@cocoon.apache.org Received: (qmail 34944 invoked by uid 99); 27 Sep 2004 21:00:13 -0000 X-ASF-Spam-Status: No, hits=-10.0 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [209.237.227.194] (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.28) with SMTP; Mon, 27 Sep 2004 14:00:12 -0700 Received: (qmail 53617 invoked by uid 65534); 27 Sep 2004 21:00:05 -0000 Date: 27 Sep 2004 21:00:05 -0000 Message-ID: <20040927210005.53609.qmail@minotaur.apache.org> From: sylvain@apache.org To: cvs@cocoon.apache.org Subject: svn commit: rev 47332 - in cocoon/trunk/src: blocks/forms/java/org/apache/cocoon/forms/formmodel documentation/xdocs/userdocs/forms X-Virus-Checked: Checked X-Spam-Rating: minotaur-2.apache.org 1.6.2 0/1000/N Author: sylvain Date: Mon Sep 27 14:00:04 2004 New Revision: 47332 Modified: cocoon/trunk/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/DeleteRowsActionDefinition.java cocoon/trunk/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/RepeaterActionDefinitionBuilder.java cocoon/trunk/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/RowActionDefinition.java cocoon/trunk/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/RowActionDefinitionBuilder.java cocoon/trunk/src/documentation/xdocs/userdocs/forms/widget_repeater_action.xml cocoon/trunk/src/documentation/xdocs/userdocs/forms/widget_row_action.xml Log: Rename 'on-activate' to 'on-action' and call handlers before deleting rows Modified: cocoon/trunk/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/DeleteRowsActionDefinition.java ============================================================================== --- cocoon/trunk/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/DeleteRowsActionDefinition.java (original) +++ cocoon/trunk/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/DeleteRowsActionDefinition.java Mon Sep 27 14:00:04 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. + *

+ * The action listeners attached to this action, if any, are called before the rows + * are actually removed * * @author Sylvain Wallez - * @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/trunk/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/RepeaterActionDefinitionBuilder.java ============================================================================== --- cocoon/trunk/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/RepeaterActionDefinitionBuilder.java (original) +++ cocoon/trunk/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/RepeaterActionDefinitionBuilder.java Mon Sep 27 14:00:04 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/trunk/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/RowActionDefinition.java ============================================================================== --- cocoon/trunk/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/RowActionDefinition.java (original) +++ cocoon/trunk/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/RowActionDefinition.java Mon Sep 27 14:00:04 2004 @@ -21,7 +21,7 @@ /** * * @author Sylvain Wallez - * @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 before + * 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 after + * 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 after + * 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 after + * the new row has been created. + */ public static class AddAfterDefinition extends RowActionDefinition { public AddAfterDefinition() { super.addActionListener(new ActionListener() { @@ -82,6 +103,4 @@ }); } } - - } Modified: cocoon/trunk/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/RowActionDefinitionBuilder.java ============================================================================== --- cocoon/trunk/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/RowActionDefinitionBuilder.java (original) +++ cocoon/trunk/src/blocks/forms/java/org/apache/cocoon/forms/formmodel/RowActionDefinitionBuilder.java Mon Sep 27 14:00:04 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/trunk/src/documentation/xdocs/userdocs/forms/widget_repeater_action.xml ============================================================================== --- cocoon/trunk/src/documentation/xdocs/userdocs/forms/widget_repeater_action.xml (original) +++ cocoon/trunk/src/documentation/xdocs/userdocs/forms/widget_repeater_action.xml Mon Sep 27 14:00:04 2004 @@ -36,9 +36,9 @@ ... ... ... - + ... - + ]]>

The action-command 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.

-

fd:on-activate allows additional event handlers +

fd:on-action allows additional event handlers to be defined, see also Event Handling. The interface to be implemented for Java event listeners is org.apache.cocoon.forms.event.ActionListener. - The WidgetEvent subclass is org.apache.cocoon.forms.event.ActionEvent.

+ The WidgetEvent subclass is org.apache.cocoon.forms.event.ActionEvent. + The event handlers are called after the action is performed except for the + delete-rows action where event handlers are called before the + selected rows are deleted.

Modified: cocoon/trunk/src/documentation/xdocs/userdocs/forms/widget_row_action.xml ============================================================================== --- cocoon/trunk/src/documentation/xdocs/userdocs/forms/widget_row_action.xml (original) +++ cocoon/trunk/src/documentation/xdocs/userdocs/forms/widget_row_action.xml Mon Sep 27 14:00:04 2004 @@ -37,19 +37,22 @@ ... ... ... - + ... - + ]]>

The action-command attribute should have either the value add-after, delete, move-up or move-down.

-

fd:on-activate allows additional event handlers to +

fd:on-action allows additional event handlers to be defined, see also Event Handling. The interface to be implemented for Java event listeners is org.apache.cocoon.forms.event.ActionListener. - The WidgetEvent subclass is org.apache.cocoon.forms.event.ActionEvent.

+ The WidgetEvent subclass is org.apache.cocoon.forms.event.ActionEvent. + The event handlers are called after the action is performed except for the + delete row action where event handlers are called before the + row is deleted.

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.