1 package gr.grnet.pithos.web.client.components;
3 import com.google.gwt.event.dom.client.ClickEvent;
4 import com.google.gwt.event.dom.client.ClickHandler;
5 import com.google.gwt.event.logical.shared.ValueChangeEvent;
6 import com.google.gwt.event.logical.shared.ValueChangeHandler;
7 import com.google.gwt.event.shared.HandlerRegistration;
8 import com.google.gwt.user.client.DOM;
9 import com.google.gwt.user.client.Element;
10 import com.google.gwt.user.client.ui.FocusWidget;
11 import com.google.gwt.user.client.ui.HasValue;
14 * Checkbox with three states (checked, unchecked and undefined).
17 public class TristateCheckBox extends FocusWidget implements HasValue<Boolean> {
19 private static final String UNCHECKED_IMG = "images/tristate_unchecked.gif";
21 private static final String UNKNOWN_IMG = "images/tristate_intermediate.gif";
23 private static final String CHECKED_IMG = "images/tristate_checked.gif";
25 private final Element buttonElement = DOM.createElement("input");
27 private boolean valueChangeHandlerInitialized;
29 private Boolean value;
31 private Boolean initialValue;
33 public TristateCheckBox(final Boolean state) {
34 DOM.setElementProperty(buttonElement, "type", "image");
35 setElement(buttonElement);
36 setStyleName("tristateCheckbox");
37 DOM.setElementAttribute(buttonElement, "src", UNCHECKED_IMG);
39 addClickHandler(new ClickHandler() {
42 public void onClick(ClickEvent event) {
43 final String img = DOM.getElementAttribute(buttonElement, "src");
45 if (img.endsWith(UNCHECKED_IMG))
47 else if (img.endsWith(UNKNOWN_IMG))
48 newImg = UNCHECKED_IMG;
49 else if (img.endsWith(CHECKED_IMG))
50 if (initialValue==null) // Only show unknown choice if there is a reason for it
53 newImg = UNCHECKED_IMG;
55 throw new IllegalArgumentException("unknown checkbox state");
57 DOM.setElementAttribute(buttonElement, "src", newImg);
66 public void setState(final Boolean state) {
67 DOM.setElementAttribute(buttonElement, "src", state == null ?
68 UNKNOWN_IMG : state.booleanValue() ? CHECKED_IMG : UNCHECKED_IMG);
71 public Boolean getState() {
72 final String img = DOM.getElementAttribute(buttonElement, "src");
73 if (img.endsWith(UNCHECKED_IMG))
75 else if (img.endsWith(UNKNOWN_IMG))
77 else if (img.endsWith(CHECKED_IMG))
80 throw new IllegalArgumentException("unknown checkbox state");
84 public Boolean getValue() {
89 public void setValue(final Boolean _value) {
94 public HandlerRegistration addValueChangeHandler(
95 ValueChangeHandler<Boolean> handler) {
96 // Is this the first value change handler? If so, time to add handlers
97 if (!valueChangeHandlerInitialized) {
98 ensureDomEventHandlers();
99 valueChangeHandlerInitialized = true;
101 return addHandler(handler, ValueChangeEvent.getType());
104 protected void ensureDomEventHandlers() {
105 addClickHandler(new ClickHandler() {
107 public void onClick(ClickEvent event) {
108 ValueChangeEvent.fire(TristateCheckBox.this, getValue());
114 public void setValue(Boolean _value, boolean fireEvents) {
115 Boolean oldValue = getValue();
117 if (_value.equals(oldValue))
120 ValueChangeEvent.fire(this, _value);