/*
* Ext GWT 2.2.4 - Ext for GWT
* Copyright(c) 2007-2010, Ext JS, LLC.
* licensing@extjs.com
*
* http://extjs.com/license
*/
package com.extjs.gxt.ui.client.widget.button;
import java.util.ArrayList;
import java.util.List;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.widget.Component;
import com.extjs.gxt.ui.client.widget.ComponentManager;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
import com.google.gwt.user.client.ui.Accessibility;
/**
* A 2-state toggle button.
*
* <dl>
* <dt><b>Events:</b></dt>
*
* <dd><b>Toggle</b> : ButtonEvent(button)<br>
* <div>Fires when the "pressed" state of this button changes.</div>
* <ul>
* <li>button : this</li>
* </ul>
* </dd>
* </dl>
*/
public class ToggleButton extends Button {
private boolean pressed;
private String toggleGroup;
private boolean allowDepress = true;
/**
* Creates a new toggle button.
*/
public ToggleButton() {
super();
}
/**
* Creates a new toggle button.
*
* @param text the button text
*/
public ToggleButton(String text) {
super(text);
}
/**
* Creates a new toggle button.
*
* @param text the button text
* @param listener a selection listener
*/
public ToggleButton(String text, SelectionListener<ButtonEvent> listener) {
super(text, listener);
}
/**
* Creates a new toggle button with the given text and icon.
*
* @param text the button text
* @param icon the icon
*/
public ToggleButton(String text, AbstractImagePrototype icon) {
this(text);
setIcon(icon);
}
/**
* Returns the toggle group name.
*
* @return the toggle group name
*/
public String getToggleGroup() {
return toggleGroup;
}
public boolean isAllowDepress() {
return allowDepress;
}
/**
* Returns true if the button is pressed.
*
* @return the pressed state
*/
public boolean isPressed() {
return pressed;
}
/**
* Toggles the current state.
*/
public void toggle() {
toggle(!pressed, false);
}
/**
* Sets the current pressed state.
*
* @param state true to set pressed state
*/
public void toggle(boolean state) {
toggle(state, false);
}
/**
* True to allow a toggle item to be depressed (default to true).
*
* @param allowDepress true to allow depressing
*/
public void setAllowDepress(boolean allowDepress) {
this.allowDepress = allowDepress;
}
/**
* Optionally, set the the button's toggle group name.
*
* @param toggleGroup the toggle group name
*/
public void setToggleGroup(String toggleGroup) {
this.toggleGroup = toggleGroup;
}
@Override
protected void onClick(ComponentEvent ce) {
ce.preventDefault();
focus();
hideToolTip();
if (!disabled) {
if (allowDepress || !pressed) {
toggle();
}
if (menu != null && !menu.isVisible()) {
showMenu();
}
ButtonEvent be = new ButtonEvent(this);
be.setEvent(ce.getEvent());
fireEvent(Events.Select, be);
}
}
@Override
protected void onFocus(ComponentEvent ce) {
if (!pressed) {
super.onFocus(ce);
}
}
@Override
protected void onMouseDown(ComponentEvent ce) {
// do nothing
}
@Override
protected void onMouseOver(ComponentEvent ce) {
if (!pressed) {
super.onMouseOver(ce);
}
}
@Override
protected void onMouseUp(ComponentEvent ce) {
// do nothing
}
@Override
protected void onRender(Element parent, int pos) {
super.onRender(parent, pos);
if (pressed) {
toggle(pressed, true);
}
}
/**
* Sets the current pressed state.
*
* @param state true to set pressed state
* @param silent true to not fire the toggle event
*/
protected void toggle(boolean state, boolean silent) {
this.pressed = state;
if (rendered) {
ButtonEvent be = new ButtonEvent(this);
if (state) {
addStyleName(baseStyle + "-pressed");
removeStyleName(baseStyle + "-over");
removeStyleName(baseStyle + "-blur");
} else {
removeStyleName(baseStyle + "-pressed");
}
if (state && toggleGroup != null && toggleGroup.length() > 0) {
List<Component> list = new ArrayList<Component>(ComponentManager.get().getAll());
for (Component c : list) {
if (c instanceof ToggleButton && c != this && toggleGroup.equals(((ToggleButton) c).getToggleGroup())) {
((ToggleButton) c).toggle(false, silent);
}
}
}
Accessibility.setState(buttonEl.dom, "aria-pressed", "" + state);
if (!silent) {
fireEvent(Events.Toggle, be);
}
}
}
}