/** * Copyright 2010 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 org.waveprotocol.wave.client.widget.common; import com.google.gwt.dom.client.Element; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.Label; public class Button extends Label { /** * Flag if button is enabled */ protected boolean enabled = false; /** * Overrides the same method as per Label. Updates the CSS style on the parent * DIV, and then passes on control to the superclass implementation. * * @see com.google.gwt.user.client.ui.Label#onBrowserEvent(com.google.gwt.user.client.Event) */ @Override public void onBrowserEvent(Event event) { switch (event.getTypeInt()) { case Event.ONMOUSEDOWN: me.replaceClassName(ButtonStyle.mouseUp, ButtonStyle.mouseDown); if (cancelMouseDownBubble) { event.stopPropagation(); } if (preventMouseDownDefault) { event.preventDefault(); } break; case Event.ONMOUSEUP: me.replaceClassName(ButtonStyle.mouseDown, ButtonStyle.mouseUp); break; case Event.ONMOUSEOVER: me.replaceClassName(ButtonStyle.mouseOut, ButtonStyle.mouseOver); break; case Event.ONMOUSEOUT: me.replaceClassName(ButtonStyle.mouseOver, ButtonStyle.mouseOut); break; } // Call to super to handle all event generation. super.onBrowserEvent(event); } /** * UIElement version of widget */ protected Element me = null; /** * UIElement in center of table for labeled buttons */ protected Element c = null; /** * Constructs a simple CSS button around a single div. Use * this for iconic buttons sans label * * @param styleName A style name to append to the button. * @param title A title to give to the button. * @param handler A click handler for the CSSButton. */ public Button(String styleName, String title, final ClickHandler handler) { me = getElement(); setStyleName(ButtonStyle.button); addStyleName(styleName); addStyleName(ButtonStyle.mouseUp); addStyleName(ButtonStyle.mouseOut); setEnabled(true); if (handler != null) { addClickHandler(new ClickHandler() { public void onClick(ClickEvent e) { if (enabled) { handler.onClick(e); } } }); } setTitle(title); } /** * Constructs a not-so-simple CSS button around a div with a three-<td> * table. Use this for buttons with labels * * @param styleName A style name to append to the button. * @param title A title to give to the button. * @param handler A click handler for the CSSButton. * @param label The text label for the button */ public Button(String styleName, String title, ClickHandler handler, String label) { this(styleName, title, handler); // TODO(user): Use CssResource's @sprite. addStyleName(ButtonStyle.labeledButton); me.setInnerHTML( "<table cellSpacing='0'><tbody><tr>" + "<td><div class='" + ButtonStyle.left + "'></div></td>" + "<td class='" + ButtonStyle.center + " " + ButtonStyle.xRepeat + "'></td>" + "<td><div class='" + ButtonStyle.right + "'></div></td>" + "</tr></tbody></table>"); // TODO(user): Declarative UI c = me.getChild(0).<Element>cast().getChild(0).<Element>cast() .getChild(0).<Element>cast().getChild(1).cast(); c.setInnerHTML(label); } /** * Flag that mouse down events should not bubble. * * @see #setCancelMouseDownBubble */ private boolean cancelMouseDownBubble = false; /** * Flags that button should eat mouse downs (as in canceling the * event's bubbling). Use this, e.g., on buttons * that results in panel focus going away from panel containing the * button. That way, if user click the button on a blurred panel, * the panel doesn't get focus in the short time between mousedown * and click. For example: close button on conversation panel. */ public void setCancelMouseDownBubble() { cancelMouseDownBubble = true; } /** * Flag that mouse down events should not perform default action. * * @see #setPreventMouseDownDefault */ private boolean preventMouseDownDefault = false; /** * Flags that button should eat mouse downs' default action. Use * this on buttons with an onclick handler depending on the current * selection to avoid that the mousedown destroys that selection. * For example, the reply button on blip widgets */ public void setPreventMouseDownDefault() { preventMouseDownDefault = true; } /** * @param enabled */ public void setEnabled(boolean enabled) { this.enabled = enabled; if (enabled) { me.replaceClassName(ButtonStyle.disabled, ButtonStyle.enabled); } else { me.replaceClassName(ButtonStyle.enabled, ButtonStyle.disabled); } } /** * @return True if button is enabled */ public boolean isEnabled() { return enabled; } }