/* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.riotfamily.forms.event; import java.io.PrintWriter; import java.util.List; import org.riotfamily.common.util.FormatUtils; import org.riotfamily.common.util.Generics; import org.riotfamily.common.util.TagWriter; import org.riotfamily.forms.AbstractEditorBase; import org.riotfamily.forms.MessageUtils; import org.riotfamily.forms.request.FormRequest; import org.riotfamily.forms.ui.Dimension; /** * A button widget. */ public class Button extends AbstractEditorBase implements JavaScriptEventAdapter { private List<ClickListener> listeners; private String labelKey; private String defaultLabel; private String label; private boolean submit = false; private String partitialSubmit; private boolean clicked; private int tabIndex; public Button() { setInline(true); } @Override public String getEventTriggerId() { return getId() + "-event-source"; } public String getLabelKey() { return labelKey; } public void setLabelKey(String labelKey) { this.labelKey = labelKey; } public String getDefaultLabel() { return defaultLabel; } public void setDefaultLabel(String defaultLabel) { this.defaultLabel = defaultLabel; } @Override public String getLabel() { if (label != null) { return label; } if (getLabelKey() != null) { return MessageUtils.getMessage(this, getLabelKey(), null, getDefaultLabel()); } return "Submit"; } @Override public void setLabel(String label) { this.label = label; } @Override protected String getSystemStyleClass() { String suffix = null; if (getLabelKey() != null) { int i = getLabelKey().lastIndexOf('.'); String s = i != -1 ? getLabelKey().substring(i + 1) : getLabelKey(); suffix = FormatUtils.toCssClass(s); } else { suffix = FormatUtils.toCssClass(getLabel()); } return "button button-" + suffix; } @Override protected String getWrapperStyleClass() { return FormatUtils.join(" ", "button-wrapper", isEnabled() ? null : "disabled"); } public void setSubmit(boolean submit) { this.submit = submit; } public void setPartitialSubmit(String partitialSubmit) { this.partitialSubmit = partitialSubmit; this.submit = partitialSubmit != null; } public void setTabIndex(int tabIndex) { this.tabIndex = tabIndex; } public void addClickListener(ClickListener listener) { if (listeners == null) { listeners = Generics.newArrayList(); } listeners.add(listener); } @Override public void processRequest(FormRequest request) { String value = request.getParameter(getParamName()); clicked = value != null; if (clicked) { onClick(); } } public boolean isClicked() { return this.clicked; } @Override public void renderInternal(PrintWriter writer) { TagWriter tag = new TagWriter(writer); tag.startEmpty("input") .attribute("type", submit ? "submit" : "button") .attribute("id", getEventTriggerId()) .attribute("class", getSystemStyleClass()) .attribute("tabindex", tabIndex) .attribute("disabled", !isEnabled()) .attribute("name", getParamName()) .attribute("value", FormatUtils.stripTags(getLabel())); if (partitialSubmit != null && isEnabled()) { tag.attribute("onclick", "submitElement('" + partitialSubmit + "', this); return false;"); } tag.end(); } public Dimension getDimension() { return getFormContext().getSizing().getButtonSize(); } protected void onClick() { log.debug("Button " + getId() + " clicked."); fireClickEvent(); } protected void fireClickEvent() { if (listeners != null) { ClickEvent event = new ClickEvent(this); for (ClickListener listener : listeners) { listener.clicked(event); } } } public int getEventTypes() { if (!submit && listeners != null) { return JavaScriptEvent.ON_CLICK; } return 0; } public void handleJavaScriptEvent(JavaScriptEvent event) { if (event.getType() == JavaScriptEvent.ON_CLICK) { onClick(); } } }