001: /*
002: * $Id: AjaxSubmitButton.java 5125 2006-03-25 11:42:10 -0800 (Sat, 25 Mar 2006)
003: * ivaynberg $ $Revision: 461395 $ $Date: 2006-03-25 11:42:10 -0800 (Sat, 25 Mar
004: * 2006) $
005: *
006: * ==============================================================================
007: * Licensed under the Apache License, Version 2.0 (the "License"); you may not
008: * use this file except in compliance with the License. You may obtain a copy of
009: * the License at
010: *
011: * http://www.apache.org/licenses/LICENSE-2.0
012: *
013: * Unless required by applicable law or agreed to in writing, software
014: * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
015: * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
016: * License for the specific language governing permissions and limitations under
017: * the License.
018: */
019: package wicket.ajax.markup.html.form;
020:
021: import wicket.ajax.AjaxRequestTarget;
022: import wicket.ajax.IAjaxCallDecorator;
023: import wicket.ajax.form.AjaxFormSubmitBehavior;
024: import wicket.markup.ComponentTag;
025: import wicket.markup.html.WebComponent;
026: import wicket.markup.html.form.Button;
027: import wicket.markup.html.form.Form;
028: import wicket.util.string.AppendingStringBuffer;
029:
030: /**
031: * A button that submits the form via ajax. Since this button takes the form as
032: * a constructor argument it does not need to be added to it unlike the
033: * {@link Button} component.
034: *
035: * @since 1.2
036: *
037: * @author Igor Vaynberg (ivaynberg)
038: */
039: public abstract class AjaxSubmitButton extends WebComponent {
040: private static final long serialVersionUID = 1L;
041:
042: /**
043: * Construct.
044: *
045: * @param id
046: * @param form
047: */
048: public AjaxSubmitButton(String id, final Form form) {
049: super (id);
050:
051: add(new AjaxFormSubmitBehavior(form, "onclick") {
052:
053: private static final long serialVersionUID = 1L;
054:
055: protected void onSubmit(AjaxRequestTarget target) {
056: AjaxSubmitButton.this .onSubmit(target, form);
057: }
058:
059: protected void onError(AjaxRequestTarget target) {
060: AjaxSubmitButton.this .onError(target, form);
061: }
062:
063: protected CharSequence getEventHandler() {
064: return new AppendingStringBuffer(super
065: .getEventHandler()).append("; return false;");
066: }
067:
068: protected IAjaxCallDecorator getAjaxCallDecorator() {
069: return AjaxSubmitButton.this .getAjaxCallDecorator();
070: }
071:
072: });
073:
074: }
075:
076: /**
077: * Returns the {@link IAjaxCallDecorator} that will be used to modify the
078: * generated javascript. This is the preferred way of changing the
079: * javascript in the onclick handler
080: *
081: * @return call decorator used to modify the generated javascript or null
082: * for none
083: */
084: protected IAjaxCallDecorator getAjaxCallDecorator() {
085: return null;
086: }
087:
088: protected void onComponentTag(ComponentTag tag) {
089: checkComponentTag(tag, "input");
090:
091: final String type = tag.getAttributes().getString("type");
092: if (!"button".equals(type) && !"image".equals(type)
093: && !"submit".equals(type)) {
094: findMarkupStream()
095: .throwMarkupException(
096: "Component "
097: + getId()
098: + " must be applied to a tag with 'type'"
099: + " attribute matching 'submit', 'button' or 'image', not '"
100: + type + "'");
101: }
102:
103: super .onComponentTag(tag);
104: }
105:
106: /**
107: * Listener method invoked on form submit with no errors
108: *
109: * @param target
110: * @param form
111: */
112: protected abstract void onSubmit(AjaxRequestTarget target, Form form);
113:
114: /**
115: * Listener method invoked on form submit with errors
116: *
117: * @param target
118: * @param form
119: *
120: * TODO 1.3: Make abstract to be consistent with onsubmit()
121: */
122: protected void onError(AjaxRequestTarget target, Form form) {
123:
124: }
125:
126: }
|