Java/GWT/Image Button
Image Button without browser compatibility issue
package com.jexp.gwt.client;
import com.google.gwt.user.client.*;
import com.google.gwt.user.client.ui.*;
import com.google.gwt.core.client.*;
public class GWTClient implements EntryPoint{
public void onModuleLoad() {
RootPanel.get().add(new ImageButton("images/close.png",16,16));
}
}
/*
* Copyright 2006 Robert Hanson <iamroberthanson AT gmail.ru>
*
* 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.
*/
/**
* Use an image as a button. Allows for setting of on/off
* background color, border color, border width, and border
* style. The "on" colors are used on mouse over.
*
* @author rhanson
*/
class ImageButton extends PNGImage
{
protected final static int ON_STATE = 1;
protected final static int OFF_STATE = -1;
private int state = OFF_STATE;
private String onStyle = "gwl-ImageButton-On";
private String offStyle = "gwl-ImageButton-Off";
private Color backgroundOnColor = Color.NONE;
private Color backgroundOffColor = Color.NONE;
private Color borderOnColor = Color.BLACK;
private Color borderOffColor = Color.NONE;
private int borderOnWidth = 1;
private int borderOffWidth = 0;
private int paddingLeft = 0;
private int paddingRight = 0;
private int paddingTop = 0;
private int paddingBottom = 0;
private BorderStyleConstant borderOnStyle = BorderStyle.BORDER_STYLE_SOLID;
private BorderStyleConstant borderOffStyle = BorderStyle.BORDER_STYLE_NONE;
public ImageButton (String url, int width, int height)
{
super(url, width, height);
setStyleName("gwl-image-button");
setColors();
init();
}
protected void init ()
{
addMouseListener(new MouseListenerAdapter(){
public void onMouseEnter (Widget sender)
{
state = ON_STATE;
setColors();
}
public void onMouseLeave (Widget sender)
{
state = OFF_STATE;
setColors();
}
});
}
public boolean isOn ()
{
return state == ON_STATE;
}
/**
* Updates the colors of the widget based on the state
* and color settings. This is usually only used after
* setting one or more of the colors.
*/
public void setColors ()
{
DOM.setStyleAttribute(getElement(), "paddingTop", getPaddingTopWidth() + "px");
DOM.setStyleAttribute(getElement(), "paddingRight", getPaddingRightWidth() + "px");
DOM.setStyleAttribute(getElement(), "paddingBottom", getPaddingBottomWidth() + "px");
DOM.setStyleAttribute(getElement(), "paddingLeft", getPaddingLeftWidth() + "px");
DOM.setStyleAttribute(getElement(), "borderWidth", getBorderWidth() + "px");
DOM.setStyleAttribute(getElement(), "borderColor", getBorderColor().getHexValue());
DOM.setStyleAttribute(getElement(), "borderStyle", getBorderStyle().getBorderStyleName());
DOM.setStyleAttribute(getElement(), "backgroundColor", getBackgroundColor().getHexValue());
setStyleName(getCssStyleName());
}
private String getCssStyleName ()
{
if (state == ON_STATE)
return onStyle;
else
return offStyle;
}
private Color getBackgroundColor ()
{
if (state == ON_STATE)
return backgroundOnColor;
else
return backgroundOffColor;
}
private BorderStyleConstant getBorderStyle ()
{
if (state == ON_STATE)
return borderOnStyle;
else
return borderOffStyle;
}
private Color getBorderColor ()
{
if (state == ON_STATE)
return borderOnColor;
else
return borderOffColor;
}
private int getBorderWidth ()
{
if (state == ON_STATE)
return borderOnWidth;
else
return borderOffWidth;
}
private int getPaddingLeftWidth ()
{
int max = (borderOnWidth > borderOffWidth) ? borderOnWidth : borderOffWidth;
if (state == ON_STATE) {
return (max - borderOnWidth + paddingLeft);
}
else {
return (max - borderOffWidth + paddingLeft);
}
}
private int getPaddingRightWidth ()
{
int max = (borderOnWidth > borderOffWidth) ? borderOnWidth : borderOffWidth;
if (state == ON_STATE) {
return (max - borderOnWidth + paddingRight);
}
else {
return (max - borderOffWidth + paddingRight);
}
}
private int getPaddingTopWidth ()
{
int max = (borderOnWidth > borderOffWidth) ? borderOnWidth : borderOffWidth;
if (state == ON_STATE) {
return (max - borderOnWidth + paddingTop);
}
else {
return (max - borderOffWidth + paddingTop);
}
}
private int getPaddingBottomWidth ()
{
int max = (borderOnWidth > borderOffWidth) ? borderOnWidth : borderOffWidth;
if (state == ON_STATE) {
return (max - borderOnWidth + paddingBottom);
}
else {
return (max - borderOffWidth + paddingBottom);
}
}
/**
* This method is under consideration for removal,
* if you have an opion please comment on http://gwtwidgets.blogspot.ru.
*/
public void setMargin (int px)
{
DOM.setStyleAttribute(getElement(), "margin", px + "px");
}
/**
* This method is under consideration for removal,
* if you have an opion please comment on http://gwtwidgets.blogspot.ru.
*/
public void setHorizontalMargin (int px)
{
DOM.setStyleAttribute(getElement(), "marginLeft", px + "px");
DOM.setStyleAttribute(getElement(), "marginRight", px + "px");
}
/**
* This method is under consideration for removal,
* if you have an opion please comment on http://gwtwidgets.blogspot.ru.
*/
public void setVerticleMargin (int px)
{
DOM.setStyleAttribute(getElement(), "marginTop", px + "px");
DOM.setStyleAttribute(getElement(), "marginBotom", px + "px");
}
/**
* This method is under consideration for removal,
* if you have an opion please comment on http://gwtwidgets.blogspot.ru.
*/
public Color getBackgroundOffColor ()
{
return backgroundOffColor;
}
/**
* This method is under consideration for removal,
* if you have an opion please comment on http://gwtwidgets.blogspot.ru.
*/
public void setBackgroundOffColor (Color backgroundOffColor)
{
this.backgroundOffColor = backgroundOffColor;
}
/**
* This method is under consideration for removal,
* if you have an opion please comment on http://gwtwidgets.blogspot.ru.
*/
public Color getBackgroundOnColor ()
{
return backgroundOnColor;
}
/**
* This method is under consideration for removal,
* if you have an opion please comment on http://gwtwidgets.blogspot.ru.
*/
public void setBackgroundOnColor (Color backgroundOnColor)
{
this.backgroundOnColor = backgroundOnColor;
}
/**
* This method is under consideration for removal,
* if you have an opion please comment on http://gwtwidgets.blogspot.ru.
*/
public Color getBorderOffColor ()
{
return borderOffColor;
}
/**
* This method is under consideration for removal,
* if you have an opion please comment on http://gwtwidgets.blogspot.ru.
*/
public void setBorderOffColor (Color borderOffColor)
{
this.borderOffColor = borderOffColor;
}
/**
* This method is under consideration for removal,
* if you have an opion please comment on http://gwtwidgets.blogspot.ru.
*/
public BorderStyleConstant getBorderOffStyle ()
{
return borderOffStyle;
}
/**
* This method is under consideration for removal,
* if you have an opion please comment on http://gwtwidgets.blogspot.ru.
*/
public void setBorderOffStyle (BorderStyleConstant borderOffStyle)
{
this.borderOffStyle = borderOffStyle;
}
/**
* This method is under consideration for removal,
* if you have an opion please comment on http://gwtwidgets.blogspot.ru.
*/
public int getBorderOffWidth ()
{
return borderOffWidth;
}
/**
* This method is under consideration for removal,
* if you have an opion please comment on http://gwtwidgets.blogspot.ru.
*/
public void setBorderOffWidth (int borderOffWidth)
{
this.borderOffWidth = borderOffWidth;
}
/**
* This method is under consideration for removal,
* if you have an opion please comment on http://gwtwidgets.blogspot.ru.
*/
public Color getBorderOnColor ()
{
return borderOnColor;
}
/**
* This method is under consideration for removal,
* if you have an opion please comment on http://gwtwidgets.blogspot.ru.
*/
public void setBorderOnColor (Color borderOnColor)
{
this.borderOnColor = borderOnColor;
}
/**
* This method is under consideration for removal,
* if you have an opion please comment on http://gwtwidgets.blogspot.ru.
*/
public BorderStyleConstant getBorderOnStyle ()
{
return borderOnStyle;
}
/**
* This method is under consideration for removal,
* if you have an opion please comment on http://gwtwidgets.blogspot.ru.
*/
public void setBorderOnStyle (BorderStyleConstant borderOnStyle)
{
this.borderOnStyle = borderOnStyle;
}
/**
* This method is under consideration for removal,
* if you have an opion please comment on http://gwtwidgets.blogspot.ru.
*/
public int getBorderOnWidth ()
{
return borderOnWidth;
}
/**
* This method is under consideration for removal,
* if you have an opion please comment on http://gwtwidgets.blogspot.ru.
*/
public void setBorderOnWidth (int borderOnWidth)
{
this.borderOnWidth = borderOnWidth;
}
protected int getState ()
{
return state;
}
protected void setState (int state)
{
this.state = state;
}
public String getOffStyle ()
{
return offStyle;
}
public void setOffStyle (String offStyle)
{
this.offStyle = offStyle;
}
public String getOnStyle ()
{
return onStyle;
}
public void setOnStyle (String onStyle)
{
this.onStyle = onStyle;
}
}
/*
* Copyright 2006 Robert Hanson <iamroberthanson AT gmail.ru>
*
* 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.
*/
/**
* Image widget that overcomes PNG browser incompatabilities.
* Although meant for PNG images, it will work with any image
* format supported by the browser. If the image file ends
* with ".png" or ".PNG" it will use the PNG specific routines,
* otherwise will use generic non-PNG specific routines.
*
* The URL, width, and height are required at the creation of the
* widget, and may not be updated via the widget methogs. Calling
* setUrl() will throw a RuntimeException. This is in part due to
* the workarounds required for IE 5.5 and IE6.
*
* @author rhanson
*/
class PNGImage extends Image
{
private PNGImageImpl impl;
public PNGImage (String url, int width, int height)
{
impl = (PNGImageImpl) GWT.create(PNGImageImpl.class);
setElement(impl.createElement(url, width, height));
sinkEvents(Event.ONCLICK | Event.MOUSEEVENTS | Event.ONLOAD | Event.ONERROR);
}
public String getUrl ()
{
return impl.getUrl(this);
}
/**
* Should not be used. Throws RuntimeException
*/
public void setUrl (String url)
{
throw new RuntimeException("Not allowed to set url for a PNG image");
}
}
/*
* Copyright 2006 Robert Hanson <iamroberthanson AT gmail.ru>
*
* 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.
*/
class PNGImageImpl
{
public Element createElement (String url, int width, int height)
{
Element result = DOM.createImg();
DOM.setAttribute(result, "src", url);
DOM.setIntAttribute(result, "width", width);
DOM.setIntAttribute(result, "height", height);
return result;
}
public String getUrl (PNGImage image)
{
return DOM.getAttribute(image.getElement(), "src");
}
}
/*
* Copyright 2006 Robert Hanson <iamroberthanson AT gmail.ru>
*
* 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.
*/
class PNGImageImplIE6 extends PNGImageImpl
{
private String url;
private boolean isPng;
public Element createElement (String url, int width, int height)
{
this.url = url;
if (url.endsWith(".png") || url.endsWith(".PNG")) {
isPng = true;
}
else {
isPng = false;
}
if (isPng) {
Element div = DOM.createDiv();
DOM.setInnerHTML(div, "<span style=\"display:inline-block;width:" + width + "px;height:" + height + "px;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src="" + url + "", sizingMethod="scale")\"></span>");
return DOM.getFirstChild(div);
}
else {
return super.createElement(url, width, height);
}
}
public String getUrl (PNGImage image)
{
if (isPng) {
return url;
}
else {
return super.getUrl(image);
}
}
}
public class BorderStyleConstant
{
private String styleName;
public BorderStyleConstant (String styleName)
{
this.styleName = styleName;
}
public String getBorderStyleName() {
return styleName;
}
}
class BorderStyle
{
final public static BorderStyleConstant BORDER_STYLE_NONE = new BorderStyleConstant("none");
final public static BorderStyleConstant BORDER_STYLE_DOTTED = new BorderStyleConstant("dotted");
final public static BorderStyleConstant BORDER_STYLE_DASHED = new BorderStyleConstant("dashed");
final public static BorderStyleConstant BORDER_STYLE_SOLID = new BorderStyleConstant("solid");
final public static BorderStyleConstant BORDER_STYLE_DOUBLE = new BorderStyleConstant("double");
final public static BorderStyleConstant BORDER_STYLE_GROOVE = new BorderStyleConstant("groove");
final public static BorderStyleConstant BORDER_STYLE_RIDGE = new BorderStyleConstant("ridge");
final public static BorderStyleConstant BORDER_STYLE_INSET = new BorderStyleConstant("inset");
final public static BorderStyleConstant BORDER_STYLE_OUTSET = new BorderStyleConstant("outset");
}
class Color
{
public final static Color WHITE = new Color(255, 255, 255);
public final static Color LIGHT_GRAY = new Color(192, 192, 192);
public final static Color GRAY = new Color(128, 128, 128);
public final static Color DARK_GRAY = new Color(64, 64, 64);
public final static Color BLACK = new Color(0, 0, 0);
public final static Color RED = new Color(255, 0, 0);
public final static Color PINK = new Color(255, 175, 175);
public final static Color ORANGE = new Color(255, 200, 0);
public final static Color YELLOW = new Color(255, 255, 0);
public final static Color GREEN = new Color(0, 255, 0);
public final static Color MAGENTA = new Color(255, 0, 255);
public final static Color CYAN = new Color(0, 255, 255);
public final static Color BLUE = new Color(0, 0, 255);
public static final Color NONE = new Color("");
private int r, g, b;
// only for special cases, like no color, or maybe named colors
private String colorText = null;
private Color (String colorText) {
this.colorText = colorText;
}
public Color (int r, int g, int b)
{
this.r = r;
this.g = g;
this.b = b;
}
public int getRed ()
{
return r;
}
public int getGreen ()
{
return g;
}
public int getBlue ()
{
return b;
}
public String getHexValue ()
{
if (colorText != null) {
return colorText;
}
return "#"
+ pad(Integer.toHexString(r))
+ pad(Integer.toHexString(g))
+ pad(Integer.toHexString(b));
}
private String pad (String in)
{
if (in.length() == 0) {
return "00";
}
if (in.length() == 1) {
return "0" + in;
}
return in;
}
public String toString ()
{
if (colorText != null) {
return colorText;
}
return "red=" + r + ", green=" + g + ", blue=" + b;
}
}