diff options
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.java | 124 |
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; + } + +} |
