Java/GWT/Image
Image widget that overcomes PNG browser incompatabilities
<source lang="java">
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 ToggleButton("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. */
class ToggleButton extends ImageButton {
private int trueState;
public ToggleButton (String url, int width, int height) { super(url, width, height); } protected void init () { addMouseListener(new MouseListenerAdapter(){ public void onMouseEnter (Widget sender) { trueState = getState(); setState(ON_STATE); setColors(); } public void onMouseLeave (Widget sender) { setState(trueState); setColors(); } }); } public void setOn (boolean on) { if (on) { setState(ON_STATE); trueState = ON_STATE; } else { setState(OFF_STATE); trueState = OFF_STATE; } setColors(); }
/** * Toggle button state * @param on */ public void toggle () { if (trueState == ON_STATE) { trueState = OFF_STATE; } else { trueState = ON_STATE; } setState(trueState); setColors(); }
} /*
* 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, ""); 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; }
}
</source>
Load image
<source lang="java">
package com.jexp.gwt.client; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.ClickListener; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.DialogBox; import com.google.gwt.user.client.ui.DockPanel; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.Image; public class GWTClient implements EntryPoint {
public void onModuleLoad() { Button b = new Button("Click me", new ClickListener() { public void onClick(Widget sender) { DialogBox dlg = new MyDialog(); dlg.center(); } }); RootPanel.get().add(b); }
} class MyDialog extends DialogBox implements ClickListener {
public MyDialog() { setText("Sample DialogBox"); Button closeButton = new Button("Close", this);HTML msg = new HTML("
DockPanel dock = new DockPanel(); dock.setSpacing(4); dock.add(closeButton, DockPanel.SOUTH); dock.add(msg, DockPanel.NORTH); dock.add(new Image("images/yourImage.jpg"), DockPanel.CENTER); dock.setCellHorizontalAlignment(closeButton, DockPanel.ALIGN_RIGHT); dock.setWidth("100%"); setWidget(dock); } public void onClick(Widget sender) { hide(); }
}
</source>
Use GWT Resource To Load Images
<source lang="java">
package com.jexp.gwt.client; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.ClickListener; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.RichTextArea; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.DOM; public class GWTClient implements EntryPoint {
public void onModuleLoad() { RichTextArea area = new RichTextArea(); RichTextToolbar tb = new RichTextToolbar(area); VerticalPanel p = new VerticalPanel(); p.add(tb); p.add(area); area.setHeight("14em"); area.setWidth("100%"); tb.setWidth("100%"); p.setWidth("100%"); DOM.setStyleAttribute(p.getElement(), "margin-right", "4px"); p.setWidth("32em"); RootPanel.get().add(p); }
} ////////////////// /*
* Copyright 2007 Google Inc. * * 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 com.google.gwt.sample.kitchensink.client; package com.jexp.gwt.client; import com.google.gwt.core.client.GWT; import com.google.gwt.i18n.client.Constants; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.AbstractImagePrototype; import com.google.gwt.user.client.ui.ChangeListener; import com.google.gwt.user.client.ui.ClickListener; import com.google.gwt.user.client.ui.ruposite; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.ImageBundle; import com.google.gwt.user.client.ui.KeyboardListener; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.PushButton; import com.google.gwt.user.client.ui.RichTextArea; import com.google.gwt.user.client.ui.ToggleButton; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; /**
* A sample toolbar for use with {@link RichTextArea}. It provides a simple UI * for all rich text formatting, dynamically displayed only for the available * functionality. */
public class RichTextToolbar extends Composite {
/** * This {@link ImageBundle} is used for all the button icons. Using an image * bundle allows all of these images to be packed into a single image, which * saves a lot of HTTP requests, drastically improving startup time. */ public interface Images extends ImageBundle { /** * @gwt.resource bold.gif */ AbstractImagePrototype bold(); /** * @gwt.resource createLink.gif */ AbstractImagePrototype createLink(); /** * @gwt.resource hr.gif */ AbstractImagePrototype hr(); /** * @gwt.resource indent.gif */ AbstractImagePrototype indent(); /** * @gwt.resource insertImage.gif */ AbstractImagePrototype insertImage(); /** * @gwt.resource italic.gif */ AbstractImagePrototype italic(); /** * @gwt.resource justifyCenter.gif */ AbstractImagePrototype justifyCenter(); /** * @gwt.resource justifyLeft.gif */ AbstractImagePrototype justifyLeft(); /** * @gwt.resource justifyRight.gif */ AbstractImagePrototype justifyRight(); /** * @gwt.resource ol.gif */ AbstractImagePrototype ol(); /** * @gwt.resource outdent.gif */ AbstractImagePrototype outdent(); /** * @gwt.resource removeFormat.gif */ AbstractImagePrototype removeFormat(); /** * @gwt.resource removeLink.gif */ AbstractImagePrototype removeLink(); /** * @gwt.resource strikeThrough.gif */ AbstractImagePrototype strikeThrough(); /** * @gwt.resource subscript.gif */ AbstractImagePrototype subscript(); /** * @gwt.resource superscript.gif */ AbstractImagePrototype superscript(); /** * @gwt.resource ul.gif */ AbstractImagePrototype ul(); /** * @gwt.resource underline.gif */ AbstractImagePrototype underline(); } /** * This {@link Constants} interface is used to make the toolbar"s strings * internationalizable. */ public interface Strings extends Constants { String black(); String blue(); String bold(); String color(); String createLink(); String font(); String green(); String hr(); String indent(); String insertImage(); String italic(); String justifyCenter(); String justifyLeft(); String justifyRight(); String large(); String medium(); String normal(); String ol(); String outdent(); String red(); String removeFormat(); String removeLink(); String size(); String small(); String strikeThrough(); String subscript(); String superscript(); String ul(); String underline(); String white(); String xlarge(); String xsmall(); String xxlarge(); String xxsmall(); String yellow(); } /** * We use an inner EventListener class to avoid exposing event methods on the * RichTextToolbar itself. */ private class EventListener implements ClickListener, ChangeListener, KeyboardListener { public void onChange(Widget sender) { if (sender == backColors) { basic.setBackColor(backColors.getValue(backColors.getSelectedIndex())); backColors.setSelectedIndex(0); } else if (sender == foreColors) { basic.setForeColor(foreColors.getValue(foreColors.getSelectedIndex())); foreColors.setSelectedIndex(0); } else if (sender == fonts) { basic.setFontName(fonts.getValue(fonts.getSelectedIndex())); fonts.setSelectedIndex(0); } else if (sender == fontSizes) { basic.setFontSize(fontSizesConstants[fontSizes.getSelectedIndex() - 1]); fontSizes.setSelectedIndex(0); } } public void onClick(Widget sender) { if (sender == bold) { basic.toggleBold(); } else if (sender == italic) { basic.toggleItalic(); } else if (sender == underline) { basic.toggleUnderline(); } else if (sender == subscript) { basic.toggleSubscript(); } else if (sender == superscript) { basic.toggleSuperscript(); } else if (sender == strikethrough) { extended.toggleStrikethrough(); } else if (sender == indent) { extended.rightIndent(); } else if (sender == outdent) { extended.leftIndent(); } else if (sender == justifyLeft) { basic.setJustification(RichTextArea.Justification.LEFT); } else if (sender == justifyCenter) { basic.setJustification(RichTextArea.Justification.CENTER); } else if (sender == justifyRight) { basic.setJustification(RichTextArea.Justification.RIGHT); } else if (sender == insertImage) { String url = Window.prompt("Enter an image URL:", "http://"); if (url != null) { extended.insertImage(url); } } else if (sender == createLink) { String url = Window.prompt("Enter a link URL:", "http://"); if (url != null) { extended.createLink(url); } } else if (sender == removeLink) { extended.removeLink(); } else if (sender == hr) { extended.insertHorizontalRule(); } else if (sender == ol) { extended.insertOrderedList(); } else if (sender == ul) { extended.insertUnorderedList(); } else if (sender == removeFormat) { extended.removeFormat(); } else if (sender == richText) { // We use the RichTextArea"s onKeyUp event to update the toolbar status. // This will catch any cases where the user moves the cursur using the // keyboard, or uses one of the browser"s built-in keyboard shortcuts. updateStatus(); } } public void onKeyDown(Widget sender, char keyCode, int modifiers) { } public void onKeyPress(Widget sender, char keyCode, int modifiers) { } public void onKeyUp(Widget sender, char keyCode, int modifiers) { if (sender == richText) { // We use the RichTextArea"s onKeyUp event to update the toolbar status. // This will catch any cases where the user moves the cursur using the // keyboard, or uses one of the browser"s built-in keyboard shortcuts. updateStatus(); } } } private static final RichTextArea.FontSize[] fontSizesConstants = new RichTextArea.FontSize[] { RichTextArea.FontSize.XX_SMALL, RichTextArea.FontSize.X_SMALL, RichTextArea.FontSize.SMALL, RichTextArea.FontSize.MEDIUM, RichTextArea.FontSize.LARGE, RichTextArea.FontSize.X_LARGE, RichTextArea.FontSize.XX_LARGE}; private Images images = (Images) GWT.create(Images.class); private Strings strings = (Strings) GWT.create(Strings.class); private EventListener listener = new EventListener(); private RichTextArea richText; private RichTextArea.BasicFormatter basic; private RichTextArea.ExtendedFormatter extended; private VerticalPanel outer = new VerticalPanel(); private HorizontalPanel topPanel = new HorizontalPanel(); private HorizontalPanel bottomPanel = new HorizontalPanel(); private ToggleButton bold; private ToggleButton italic; private ToggleButton underline; private ToggleButton subscript; private ToggleButton superscript; private ToggleButton strikethrough; private PushButton indent; private PushButton outdent; private PushButton justifyLeft; private PushButton justifyCenter; private PushButton justifyRight; private PushButton hr; private PushButton ol; private PushButton ul; private PushButton insertImage; private PushButton createLink; private PushButton removeLink; private PushButton removeFormat; private ListBox backColors; private ListBox foreColors; private ListBox fonts; private ListBox fontSizes; /** * Creates a new toolbar that drives the given rich text area. * * @param richText the rich text area to be controlled */ public RichTextToolbar(RichTextArea richText) { this.richText = richText; this.basic = richText.getBasicFormatter(); this.extended = richText.getExtendedFormatter(); outer.add(topPanel); outer.add(bottomPanel); topPanel.setWidth("100%"); bottomPanel.setWidth("100%"); initWidget(outer); setStyleName("gwt-RichTextToolbar"); if (basic != null) { topPanel.add(bold = createToggleButton(images.bold(), strings.bold())); topPanel.add(italic = createToggleButton(images.italic(), strings.italic())); topPanel.add(underline = createToggleButton(images.underline(), strings.underline())); topPanel.add(subscript = createToggleButton(images.subscript(), strings.subscript())); topPanel.add(superscript = createToggleButton(images.superscript(), strings.superscript())); topPanel.add(justifyLeft = createPushButton(images.justifyLeft(), strings.justifyLeft())); topPanel.add(justifyCenter = createPushButton(images.justifyCenter(), strings.justifyCenter())); topPanel.add(justifyRight = createPushButton(images.justifyRight(), strings.justifyRight())); } if (extended != null) { topPanel.add(strikethrough = createToggleButton(images.strikeThrough(), strings.strikeThrough())); topPanel.add(indent = createPushButton(images.indent(), strings.indent())); topPanel.add(outdent = createPushButton(images.outdent(), strings.outdent())); topPanel.add(hr = createPushButton(images.hr(), strings.hr())); topPanel.add(ol = createPushButton(images.ol(), strings.ol())); topPanel.add(ul = createPushButton(images.ul(), strings.ul())); topPanel.add(insertImage = createPushButton(images.insertImage(), strings.insertImage())); topPanel.add(createLink = createPushButton(images.createLink(), strings.createLink())); topPanel.add(removeLink = createPushButton(images.removeLink(), strings.removeLink())); topPanel.add(removeFormat = createPushButton(images.removeFormat(), strings.removeFormat())); } if (basic != null) { bottomPanel.add(backColors = createColorList("Background")); bottomPanel.add(foreColors = createColorList("Foreground")); bottomPanel.add(fonts = createFontList()); bottomPanel.add(fontSizes = createFontSizes()); // We only use these listeners for updating status, so don"t hook them up // unless at least basic editing is supported. richText.addKeyboardListener(listener); richText.addClickListener(listener); } } private ListBox createColorList(String caption) { ListBox lb = new ListBox(); lb.addChangeListener(listener); lb.setVisibleItemCount(1); lb.addItem(caption); lb.addItem(strings.white(), "white"); lb.addItem(strings.black(), "black"); lb.addItem(strings.red(), "red"); lb.addItem(strings.green(), "green"); lb.addItem(strings.yellow(), "yellow"); lb.addItem(strings.blue(), "blue"); return lb; } private ListBox createFontList() { ListBox lb = new ListBox(); lb.addChangeListener(listener); lb.setVisibleItemCount(1); lb.addItem(strings.font(), ""); lb.addItem(strings.normal(), ""); lb.addItem("Times New Roman", "Times New Roman"); lb.addItem("Arial", "Arial"); lb.addItem("Courier New", "Courier New"); lb.addItem("Georgia", "Georgia"); lb.addItem("Trebuchet", "Trebuchet"); lb.addItem("Verdana", "Verdana"); return lb; } private ListBox createFontSizes() { ListBox lb = new ListBox(); lb.addChangeListener(listener); lb.setVisibleItemCount(1); lb.addItem(strings.size()); lb.addItem(strings.xxsmall()); lb.addItem(strings.xsmall()); lb.addItem(strings.small()); lb.addItem(strings.medium()); lb.addItem(strings.large()); lb.addItem(strings.xlarge()); lb.addItem(strings.xxlarge()); return lb; } private PushButton createPushButton(AbstractImagePrototype img, String tip) { PushButton pb = new PushButton(img.createImage()); pb.addClickListener(listener); pb.setTitle(tip); return pb; } private ToggleButton createToggleButton(AbstractImagePrototype img, String tip) { ToggleButton tb = new ToggleButton(img.createImage()); tb.addClickListener(listener); tb.setTitle(tip); return tb; } /** * Updates the status of all the stateful buttons. */ private void updateStatus() { if (basic != null) { bold.setDown(basic.isBold()); italic.setDown(basic.isItalic()); underline.setDown(basic.isUnderlined()); subscript.setDown(basic.isSubscript()); superscript.setDown(basic.isSuperscript()); } if (extended != null) { strikethrough.setDown(extended.isStrikethrough()); } }
}
</source>