| /* |
| * 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.wicket.markup.html.form; |
| |
| import org.apache.wicket.IRequestListener; |
| import org.apache.wicket.markup.ComponentTag; |
| import org.apache.wicket.markup.html.image.resource.LocalizedImageResource; |
| import org.apache.wicket.model.IModel; |
| import org.apache.wicket.model.Model; |
| import org.apache.wicket.request.mapper.parameter.PageParameters; |
| import org.apache.wicket.request.resource.IResource; |
| import org.apache.wicket.request.resource.ResourceReference; |
| |
| |
| /** |
| * <input type="image"> component - like {@link Button} only with an image. |
| * <p> |
| * For details of how ImageButtons load, generate and manage images, see |
| * {@link LocalizedImageResource}. |
| * |
| * @author Jonathan Locke |
| */ |
| public class ImageButton extends Button implements IRequestListener |
| { |
| private static final long serialVersionUID = 1L; |
| |
| /** The image resource this image component references */ |
| private final LocalizedImageResource localizedImageResource = new LocalizedImageResource(this); |
| |
| /** |
| * Constructs an image button from an image <code>ResourceReference</code>. That resource |
| * reference will bind its resource to the current SharedResources. |
| * |
| * If you are using non sticky session clustering and the resource reference is pointing to a |
| * <code>Resource</code> that isn't guaranteed to be on every server, for example a dynamic |
| * image or resources that aren't added with a <code>IInitializer</code> at application startup. |
| * Then if only that resource is requested from another server, without the rendering of the |
| * page, the image won't be there and will result in a broken link. |
| * |
| * @param id |
| * See Component |
| * @param resourceReference |
| * The shared image resource |
| */ |
| public ImageButton(final String id, final ResourceReference resourceReference) |
| { |
| this(id, resourceReference, null); |
| } |
| |
| /** |
| * Constructs an image button from an image <code>ResourceReference</code>. That resource |
| * reference will bind its resource to the current SharedResources. |
| * |
| * If you are using non sticky session clustering and the resource reference is pointing to a |
| * <code>Resource</code> that isn't guaranteed to be on every server, for example a dynamic |
| * image or resources that aren't added with a <code>IInitializer</code> at application startup. |
| * Then if only that resource is requested from another server, without the rendering of the |
| * page, the image won't be there and will result in a broken link. |
| * |
| * @param id |
| * See Component |
| * @param resourceReference |
| * The shared image resource |
| * @param resourceParameters |
| * The resource parameters |
| */ |
| public ImageButton(final String id, final ResourceReference resourceReference, |
| PageParameters resourceParameters) |
| { |
| super(id); |
| setImageResourceReference(resourceReference, resourceParameters); |
| } |
| |
| /** |
| * Constructs an image directly from an image resource. |
| * |
| * This one doesn't have the 'non sticky session clustering' problem that the |
| * <code>ResourceReference</code> constructor has. But this will result in a non 'stable' url |
| * and the url will have request parameters. |
| * |
| * @param id |
| * See Component |
| * |
| * @param imageResource |
| * The image resource |
| */ |
| public ImageButton(final String id, final IResource imageResource) |
| { |
| super(id); |
| setImageResource(imageResource); |
| } |
| |
| /** |
| * @param id |
| * @param model |
| * @see org.apache.wicket.Component#Component(String, IModel) |
| */ |
| public ImageButton(final String id, final IModel<String> model) |
| { |
| super(id, model); |
| } |
| |
| /** |
| * @param id |
| * See Component |
| * @param string |
| * Name of image |
| * @see org.apache.wicket.Component#Component(String, IModel) |
| */ |
| public ImageButton(final String id, final String string) |
| { |
| this(id, new Model<String>(string)); |
| } |
| |
| @Override |
| public boolean rendersPage() |
| { |
| return false; |
| } |
| |
| /** |
| * @see org.apache.wicket.IResourceListener#onResourceRequested() |
| */ |
| @Override |
| public void onRequest() |
| { |
| localizedImageResource.onResourceRequested(null); |
| } |
| |
| /** |
| * @param imageResource |
| * The new ImageResource to set. |
| */ |
| public void setImageResource(final IResource imageResource) |
| { |
| localizedImageResource.setResource(imageResource); |
| } |
| |
| /** |
| * @param resourceReference |
| * The shared ImageResource to set. |
| */ |
| public void setImageResourceReference(final ResourceReference resourceReference) |
| { |
| localizedImageResource.setResourceReference(resourceReference); |
| } |
| |
| /** |
| * @param resourceReference |
| * The shared ImageResource to set. |
| * @param parameters |
| * Set the resource parameters for the resource. |
| */ |
| public void setImageResourceReference(final ResourceReference resourceReference, |
| final PageParameters parameters) |
| { |
| localizedImageResource.setResourceReference(resourceReference, parameters); |
| } |
| |
| /** |
| * @see org.apache.wicket.Component#setDefaultModel(org.apache.wicket.model.IModel) |
| */ |
| @Override |
| public ImageButton setDefaultModel(IModel<?> model) |
| { |
| // Null out the image resource, so we reload it (otherwise we'll be |
| // stuck with the old model. |
| localizedImageResource.setResourceReference(null); |
| localizedImageResource.setResource(null); |
| return (ImageButton)super.setDefaultModel(model); |
| } |
| |
| /** |
| * @return Resource returned from subclass |
| */ |
| protected IResource getImageResource() |
| { |
| return localizedImageResource.getResource(); |
| } |
| |
| /** |
| * @return ResourceReference returned from subclass |
| */ |
| protected ResourceReference getImageResourceReference() |
| { |
| return localizedImageResource.getResourceReference(); |
| } |
| |
| /** |
| * Processes the component tag. |
| * |
| * @param tag |
| * Tag to modify |
| * @see org.apache.wicket.Component#onComponentTag(ComponentTag) |
| */ |
| @Override |
| protected final void onComponentTag(final ComponentTag tag) |
| { |
| checkComponentTag(tag, "input"); |
| checkComponentTagAttribute(tag, "type", "image"); |
| |
| final IResource resource = getImageResource(); |
| if (resource != null) |
| { |
| localizedImageResource.setResource(resource); |
| } |
| final ResourceReference resourceReference = getImageResourceReference(); |
| if (resourceReference != null) |
| { |
| localizedImageResource.setResourceReference(resourceReference); |
| } |
| localizedImageResource.setSrcAttribute(tag); |
| super.onComponentTag(tag); |
| } |
| |
| /** |
| * @see org.apache.wicket.markup.html.form.Button#getStatelessHint() |
| */ |
| @Override |
| protected boolean getStatelessHint() |
| { |
| return getImageResource() == null && localizedImageResource.isStateless(); |
| } |
| } |