001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017: package org.apache.cocoon.woody.formmodel;
018:
019: import org.apache.cocoon.environment.Request;
020: import org.apache.cocoon.woody.FormContext;
021: import org.apache.cocoon.woody.Constants;
022: import org.apache.cocoon.woody.event.ActionEvent;
023: import org.apache.cocoon.woody.event.WidgetEvent;
024: import org.apache.cocoon.xml.AttributesImpl;
025: import org.xml.sax.ContentHandler;
026: import org.xml.sax.SAXException;
027:
028: import java.util.Locale;
029:
030: /**
031: * An Action widget. An Action widget can cause an {@link ActionEvent} to be triggered
032: * on the server side, which will be handled by either the event handlers defined in the
033: * form definition, and/or by the {@link org.apache.cocoon.woody.event.FormHandler FormHandler}
034: * registered with the form, if any. An Action widget can e.g. be rendered as a button,
035: * or as a hidden field which gets its value set by javascript. The Action widget will generate its associated
036: * ActionEvent when a requestparameter is present with as name the id of this Action widget, and as
037: * value a non-empty value.
038: *
039: * @version $Id: Action.java 433543 2006-08-22 06:22:54Z crossley $
040: */
041: public class Action extends AbstractWidget {
042: protected ActionDefinition definition;
043:
044: public Action(ActionDefinition definition) {
045: this .definition = definition;
046: setLocation(definition.getLocation());
047: }
048:
049: public String getId() {
050: return definition.getId();
051: }
052:
053: public void readFromRequest(final FormContext formContext) {
054: Form form = getForm();
055:
056: // Set the submit widget if we can determine it from the request
057: String fullId = getFullyQualifiedId();
058: Request request = formContext.getRequest();
059:
060: String value = request.getParameter(fullId);
061: if (value != null && value.length() > 0) {
062: form.setSubmitWidget(this );
063:
064: } else {
065: // Special workaround an IE bug for <input type="image" name="foo"> :
066: // in that case, IE only sends "foo.x" and "foo.y" and not "foo" whereas
067: // standards-compliant browsers such as Mozilla do send the "foo" parameter.
068: //
069: // Note that since actions are terminal widgets, there's no chance of conflict
070: // with a child "x" or "y" widget.
071: value = request.getParameter(fullId + ".x");
072: if ((value != null) && value.length() > 0) {
073: form.setSubmitWidget(this );
074: }
075: }
076:
077: if (form.getSubmitWidget() == this ) {
078: form.addWidgetEvent(new ActionEvent(this , definition
079: .getActionCommand()));
080:
081: handleActivate();
082: }
083: }
084:
085: /**
086: * Handle the fact that this action was activated. The default here is to end the
087: * current form processing and redisplay the form, which means that actual behaviour
088: * should be implemented in event listeners.
089: */
090: protected void handleActivate() {
091: getForm().endProcessing(true);
092: }
093:
094: /**
095: * Always return <code>true</code> (an action has no validation)
096: *
097: * @todo is there a use case for actions having validators?
098: */
099: public boolean validate(FormContext formContext) {
100: return true;
101: }
102:
103: private static final String ACTION_EL = "action";
104:
105: public void generateSaxFragment(ContentHandler contentHandler,
106: Locale locale) throws SAXException {
107: AttributesImpl buttonAttrs = new AttributesImpl();
108: buttonAttrs.addCDATAAttribute("id", getFullyQualifiedId());
109: contentHandler.startElement(Constants.WI_NS, ACTION_EL,
110: Constants.WI_PREFIX_COLON + ACTION_EL, buttonAttrs);
111: // generate label, help, hint, etc.
112: definition.generateDisplayData(contentHandler);
113: contentHandler.endElement(Constants.WI_NS, ACTION_EL,
114: Constants.WI_PREFIX_COLON + ACTION_EL);
115: }
116:
117: public void generateLabel(ContentHandler contentHandler)
118: throws SAXException {
119: definition.generateLabel(contentHandler);
120: }
121:
122: public void broadcastEvent(WidgetEvent event) {
123: this .definition.fireActionEvent((ActionEvent) event);
124: }
125: }
|