summaryrefslogtreecommitdiff
path: root/projects/net.wotonomy.web/src/main/java/net/wotonomy/web/WOForm.java
diff options
context:
space:
mode:
Diffstat (limited to 'projects/net.wotonomy.web/src/main/java/net/wotonomy/web/WOForm.java')
-rw-r--r--projects/net.wotonomy.web/src/main/java/net/wotonomy/web/WOForm.java124
1 files changed, 124 insertions, 0 deletions
diff --git a/projects/net.wotonomy.web/src/main/java/net/wotonomy/web/WOForm.java b/projects/net.wotonomy.web/src/main/java/net/wotonomy/web/WOForm.java
new file mode 100644
index 0000000..887d1a3
--- /dev/null
+++ b/projects/net.wotonomy.web/src/main/java/net/wotonomy/web/WOForm.java
@@ -0,0 +1,124 @@
+/*
+ Wotonomy: OpenStep design patterns for pure Java applications.
+ Copyright (C) 2000 Blacksmith, Inc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see http://www.gnu.org
+ */
+
+package net.wotonomy.web;
+
+import net.wotonomy.foundation.NSArray;
+import net.wotonomy.foundation.NSDictionary;
+
+/**
+* Implements a FORM element with dynamic bindings.
+* @author michael@mpowers.net
+* @author $Author: cgruber $
+* @version $Revision: 905 $
+*/
+public class WOForm extends WODynamicElement {
+
+ public WOForm() {
+ super();
+ }
+
+ public WOForm(String n, NSDictionary m, WOElement t) {
+ super(n, m, t);
+ }
+
+ public String href(WOContext c) {
+ return (String)valueForProperty("href", c.component());
+ }
+
+ public String directActionName(WOContext c) {
+ return (String)valueForProperty("directAction", c.component());
+ }
+
+ public String directActionClass(WOContext c) {
+ return (String)valueForProperty("actionClass", c.component());
+ }
+
+ public boolean multipleSubmit(WOContext c) {
+ return booleanForProperty("multipleSubmit", c.component());
+ }
+
+ public void takeValuesFromRequest (
+ WORequest aRequest, WOContext aContext)
+ {
+ if ( rootElement != null )
+ {
+ rootElement.takeValuesFromRequest( aRequest, aContext );
+ }
+ }
+
+ public void appendToResponse(WOResponse r, WOContext c) {
+ //Append the opening tag
+ r.appendContentString("<FORM");
+ String link = href(c);
+ //Append the href, if present
+ if (link != null) {
+ r.appendContentString(" HREF=\"");
+ r.appendContentString(link);
+ r.appendContentString("\"");
+ link = null;
+ } else {
+ link = directActionName(c);
+ }
+
+ //otherwise, append Direct Action
+ if (link != null) {
+ r.appendContentString(" HREF=\"");
+ if (directActionClass(c) != null)
+ link = directActionClass(c) + "/" + link;
+ r.appendContentString(c.directActionURLForActionNamed(link, urlFields(c.component())));
+ r.appendContentString("\"");
+ link = null;
+// } else if (associations.objectForKey("action") != null) {
+ } else {
+ //finally, append action
+ r.appendContentString(" action=\"");
+ r.appendContentString(c.componentActionURL());
+ r.appendContentString("\"");
+ } //else
+// now defaulting to action if not specified(?): WOBuilder does generate WOForms without any bindings(!)
+// throw new IllegalArgumentException("You must use one of directActionName, action, or href.");
+
+ //Append any additional properties
+ link = additionalHTMLProperties(c.component(), new NSArray(new Object[]{
+ "href", "action", "directActionName", "actionClass", "multipleSubmit" }));
+ if (link.length() > 0)
+ r.appendContentString(link);
+ r.appendContentString(">");
+ //Notify that we're inside a form now
+ c.setInForm(true);
+ //Append the inner template
+ rootElement.appendToResponse(r, c);
+ //Close the tag
+ r.appendContentString("</FORM>");
+// c.deleteLastElementIDComponent();
+ c.setInForm(false);
+ }
+
+ public WOActionResults invokeAction(WORequest r, WOContext c) {
+ //We only process the request if it's not a multipleSubmit (otherwise we leave it to the buttons)
+ if (!multipleSubmit(c)
+ && c.elementID().equals(c.senderID())
+ && associations.objectForKey("action") != null ) {
+ return (WOActionResults)valueForProperty("action", c.component());
+ }
+ WOActionResults res = rootElement.invokeAction(r, c);
+ return res;
+ }
+
+}