blob: c0d3497fc0ab418a870f3c06f727f7aaaa7e6826 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.click.control;
import org.apache.click.Context;
import org.apache.commons.lang.StringUtils;
import org.apache.click.util.HtmlStringBuffer;
/**
* Provides an ImageSubmit control:   <input type='image' src='edit.gif'>.
*
* <table class='htmlHeader' cellspacing='6'>
* <tr><td>
* <input type='image' value='img' title='ImageSubmit Control' src='image-submit.gif'/>
* </td></tr>
* </table>
*
* The ImageSubmit control is useful for creating custom form buttons. This
* control can also be used for creating image areas where the user clicks on
* a point on the image and the clicked x and y coordinates are submitted
* with the name of the control.
* <p/>
*
* See also W3C HTML reference
* <a class="external" target="_blank" title="W3C HTML 4.01 Specification"
* href="http://www.w3.org/TR/html401/interact/forms.html#h-17.4">INPUT</a>
*
* @see Submit
* @see Button
*/
public class ImageSubmit extends Submit {
private static final long serialVersionUID = 1L;
// ----------------------------------------------------- Instance Variables
/**
* The image path src attribute. If the src value is prefixed with
* '/' then the request context path will be prefixed to the src value when
* rendered by the control.
*/
protected String src;
/**
* The image pixel x coordinate clicked on by the user, the default value
* is -1. A value of -1 which means the value has not been set.
*/
protected int x = -1;
/**
* The image pixel y coordinate clicked on by the user, the default value
* is -1. A value of -1 means the value has not been set.
*/
protected int y = -1;
// ----------------------------------------------------------- Constructors
/**
* Create a ImageSubmit button with the given name.
*
* @param name the button name
*/
public ImageSubmit(String name) {
super(name);
}
/**
* Create a ImageSubmit button with the given name and image src path.
* If the src path value is prefixed with "/" the request context path will
* be prefixed to the src value when rendered in the control.
*
* @param name the button name
* @param src the image src path attribute
*/
public ImageSubmit(String name, String src) {
super(name);
setSrc(src);
}
/**
* Create a ImageSubmit button with the given name, image src path, listener
* object and listener method. If the src path value is prefixed with "/"
* the request context path will be prefixed to the src value when rendered
* in the control.
*
* @param name the button name
* @param src the image src path attribute
* @param listener the listener target object
* @param method the listener method to call
*/
public ImageSubmit(String name, String src, Object listener, String method) {
super(name, listener, method);
setSrc(src);
}
/**
* Create an ImageSubmit button with no name defined.
* <p/>
* <b>Please note</b> the control's name must be defined before it is valid.
*/
public ImageSubmit() {
super();
}
// ------------------------------------------------------ Public Attributes
/**
* Return the input type: '<tt>image</tt>'.
*
* @return the input type: '<tt>image</tt>'
*/
@Override
public String getType() {
return "image";
}
/**
* Return the image src path attribute. If the src value is prefixed with
* '/' then the request context path will be prefixed to the src value when
* rendered by the control.
*
* @return the image src path attribute
*/
public String getSrc() {
return src;
}
/**
* Set the image src path attribute. If the src value is prefixed with
* '/' then the request context path will be prefixed to the src value when
* rendered by the control.
*
* @param src the image src path attribute
*/
public void setSrc(String src) {
this.src = src;
}
/**
* Return the image x pixel coordinate clicked on by the user. The x
* pixel value will be set after control has been processed. The default x
* value is -1 which means the value has not been set.
*
* @return the image x pixel coordinate clicked on by the user
*/
public int getX() {
return x;
}
/**
* Return the image y pixel coordinate clicked on by the user. The y
* pixel value will be set after control has been processed. The default y
* value is -1 which means the value has not been set.
*
* @return the image y pixel coordinate clicked on by the user
*/
public int getY() {
return y;
}
// --------------------------------------------------------- Public Methods
/**
* Bind the request submission, setting the field {@link Submit#clicked},
* {@link #x} and {@link #y} if defined in the request.
*/
@Override
public void bindRequestValue() {
Context context = getContext();
// Note IE does not submit name
String xValue = context.getRequestParameter(getName() + ".x");
if (xValue != null) {
this.clicked = true;
try {
this.x = Integer.parseInt(xValue);
} catch (NumberFormatException nfe) {
nfe.printStackTrace();
}
String yValue = context.getRequestParameter(getName() + ".y");
try {
this.y = Integer.parseInt(yValue);
} catch (NumberFormatException nfe) {
nfe.printStackTrace();
}
}
}
/**
* Process the submit event and return true to continue event processing.
*
* @see org.apache.click.control.Submit#onProcess()
*
* @return true to continue Page event processing or false otherwise
*/
@Override
public boolean onProcess() {
if (isDisabled()) {
Context context = getContext();
// Switch off disabled property if control has incoming request
// parameter. Normally this means the field was enabled via JS
// Note IE does not submit name, so we check the X value
if (context.hasRequestParameter(getName() + ".x")) {
setDisabled(false);
} else {
// If field is disabled skip process event
return true;
}
}
bindRequestValue();
if (isClicked()) {
dispatchActionEvent();
}
return true;
}
/**
* Render the HTML representation of the ImageButton.
*
* @see #toString()
*
* @param buffer the specified buffer to render the control's output to
*/
@Override
public void render(HtmlStringBuffer buffer) {
buffer.elementStart(getTag());
buffer.appendAttribute("type", getType());
buffer.appendAttribute("name", getName());
buffer.appendAttribute("id", getId());
buffer.appendAttribute("value", getLabel());
buffer.appendAttribute("title", getTitle());
if (getTabIndex() > 0) {
buffer.appendAttribute("tabindex", getTabIndex());
}
String src = getSrc();
if (StringUtils.isNotBlank(src)) {
if (src.charAt(0) == '/') {
src = getContext().getRequest().getContextPath() + src;
}
buffer.appendAttribute("src", src);
}
appendAttributes(buffer);
if (isDisabled()) {
buffer.appendAttributeDisabled();
}
buffer.elementEnd();
}
}