001: /*
002: * Created on Jul 27, 2005
003: */
004: package uk.org.ponder.rsf.components;
005:
006: import uk.org.ponder.beanutil.PathUtil;
007:
008: /**
009: * Represents a control that will cause a non-idempotent (POST) request to the
010: * server. The basic case where the command is rendered using a piece of
011: * non-bound text is handled by filling in the "commandtext" field. For more
012: * complex command contents including bound ones, leave this field as null and
013: * add rendering components as childen of the command. You may NOT set the
014: * (navigation) target of a UICommand, by RSF design it will ALWAYS (in the case
015: * of an HTTP/HTML render system) post to the same URL as the page on which it
016: * is contained.
017: *
018: * @author Antranig Basman (antranig@caret.cam.ac.uk)
019: *
020: */
021: public class UICommand extends UIParameterHolder {
022: /**
023: * The EL reference of the action/method binding to be invoked when this
024: * control is operated.
025: */
026: public ELReference methodbinding;
027: /** The text labelling this command control */
028: public UIBoundString commandtext;
029:
030: //Creates a command link initiating the specified method binding on trigger,
031: //but also backed by infrastructure to produce a GET redirect to the original
032: //view requested in this cycle once the action has been handled. This depends
033: //on the use of the custom ViewHandler "ClassViewHandler". (Memorial comment)
034:
035: /** Creates a command link which will initiate a non-idempotent request
036: * (action cycle) to handle the command.
037: * @param parent The parent component to which this action link will be added
038: * as a child.
039: * @param text The text that will be rendered to the user on this component.
040: * @param methodbinding An RSF EL expression representing the action to be
041: * triggered when the user activates this link.
042: */
043: public static UICommand make(UIContainer parent, String ID,
044: String text, String methodbinding) {
045: UIBoundString commandtext = null;
046: if (text != null) {
047: commandtext = new UIOutput();
048: commandtext.setValue(text);
049: }
050: return make(parent, ID, commandtext, methodbinding);
051: }
052:
053: /**
054: * Creates a command control which accepts a bound string (for example a
055: * UIMessage) as the textual label.
056: *
057: * @see #make(UIContainer, String, String, String)
058: */
059: public static UICommand make(UIContainer parent, String ID,
060: UIBoundString commandtext, String methodbinding) {
061: UICommand togo = new UICommand();
062: togo.commandtext = new UIOutput();
063: togo.commandtext = commandtext;
064: togo.ID = ID;
065: togo.methodbinding = ELReference.make(methodbinding);
066: // TODO: do this at fixup
067:
068: // if (parent.getActiveForm() == null) {
069: // throw new UniversalRuntimeException("Component " + parent
070: // + " does not have a form parent");
071: // }
072: parent.addComponent(togo);
073: return togo;
074: }
075:
076: /**
077: * Construct a command control with a command text but no method binding.
078: * @see #make(UIContainer, String, UIBoundString, String)
079: */
080: public static UICommand make(UIContainer parent, String ID,
081: UIBoundString commandtext) {
082: return make(parent, ID, commandtext, null);
083: }
084:
085: /**
086: * Construct a command control with a method binding, but the nested markup
087: * unchanged from the template.
088: * @see #make(UIContainer, String, String, String)
089: */
090: public static UICommand make(UIContainer parent, String ID,
091: String methodbinding) {
092: return make(parent, ID, (UIBoundString) null, methodbinding);
093: }
094:
095: /**
096: * Construct an "actionless" command link, suitable for a CRUD-type
097: * application where the data alteration constitutes the entire action.
098: */
099: public static UICommand make(UIContainer parent, String ID) {
100: return make(parent, ID, (UIBoundString) null, null);
101: }
102:
103: /** Sets the method binding for this UICommand to perform no action but to
104: * return the supplied value, should the cycle complete without errors.
105: * This will overwrite any existing method binding for the component.
106: * @param returnvalue The required return value from the action cycle.
107: * @return this component.
108: */
109: public UICommand setReturn(String returnvalue) {
110: methodbinding = new ELReference(PathUtil.composePath(
111: "constantReturn", returnvalue));
112: return this;
113: }
114:
115: }
|