package org.geogebra.web.web.gui.util; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.MouseDownEvent; import com.google.gwt.event.dom.client.MouseDownHandler; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.resources.client.ImageResource; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.ToggleButton; /** * Extends GWT ToggleButton to support tooltips and Icon image data. * */ public class MyToggleButtonW extends ToggleButton implements MouseDownHandler { private HandlerRegistration actionListener; /** * @param upText * String */ public MyToggleButtonW(String upText) { super(upText); initButton(); } /** * @param image * an {@link Image} to use as an up Image */ public MyToggleButtonW(Image image) { super(image); initButton(); } /** * @param upIcon * the icon to show as up Image */ public MyToggleButtonW(ImageResource upIcon) { this(new Image(upIcon.getSafeUri())); } /** * @param upIcon * an {@link ImageResource} to use as an up Image * @param handler * {@link ClickHandler} */ public MyToggleButtonW(ImageResource upIcon, ClickHandler handler) { super(new Image(upIcon.getSafeUri()), handler); initButton(); } /** * @param upImage * an {@link Image} to use as an up Image * @param downImage * an {@link Image} to use as an down Image * @param handler * {@link ClickHandler} */ public MyToggleButtonW(Image upImage, Image downImage, ClickHandler handler) { super(upImage, downImage, handler); initButton(); } /** * @param upImage * an {@link Image} to use as an up Image * @param downImage * an {@link Image} to use as an down Image */ public MyToggleButtonW(Image upImage, Image downImage) { super(upImage, downImage); initButton(); } /** * @param upIcon * an {@link ImageResource} to use as an up Image * @param downIcon * an {@link ImageResource} to use an down Image * @param handler * {@link ClickHandler} */ public MyToggleButtonW(ImageResource upIcon, ImageResource downIcon, ClickHandler handler) { this(new Image(upIcon.getSafeUri()), new Image(downIcon.getSafeUri()), handler); } /** * @param upIcon * an {@link ImageResource} to use as an up Image * @param downIcon * an {@link ImageResource} to use an down Image */ public MyToggleButtonW(ImageResource upIcon, ImageResource downIcon) { this(new Image(upIcon.getSafeUri()), new Image(downIcon.getSafeUri())); } private void initButton() { setDown(false); addStyleName("MyToggleButton"); addMouseDownHandler(this); } /** * Button instances override this method to update the state of the button * (e.g. visibility) based on a given array of GeoElements. * * @param geos * Array of GeoElements */ public void update(Object[] geos) { // do nothing } /** * Sets selection state (Java isSelected => GWT isDown) * * @param isSelected * selection flag */ public void setSelected(boolean isSelected) { setDown(isSelected); if(isSelected) { this.addStyleName("selected"); } else { this.removeStyleName("selected"); } } /** * Returns selection state (Java isSelected => GWT isDown) * * @return toggle button selection state */ public boolean isSelected() { return isDown(); } /** * */ public void removeValueChangeHandler() { if (actionListener != null) { actionListener.removeHandler(); } } @Override public HandlerRegistration addValueChangeHandler( ValueChangeHandler<Boolean> handler) { actionListener = addHandler(handler, ValueChangeEvent.getType()); return actionListener; } /** * Sets the toolTip text * * @param toolTipText * toolTip string */ public void setToolTipText(String toolTipText) { setTitle(toolTipText); } @Override public void onMouseDown(MouseDownEvent event) { this.setFocus(false); // if we do not stop propagation, this will close keyboard => rebuild // DOM => internal state of button is lost (hovering + capturing flag in // ToggleButton), mouseUp will have no effect e.g. with axis button in // EV event.stopPropagation(); } }