package com.eas.widgets.boxes; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.InputElement; import com.google.gwt.dom.client.Style; import com.google.gwt.dom.client.Style.VerticalAlign; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.ui.CheckBox; public class NullableCheckBox extends CheckBox { protected Element anchor = Document.get().createDivElement(); protected InputElement inputElem; protected Boolean value; public NullableCheckBox() { this(DOM.createInputCheck()); getElement().removeClassName("gwt-CheckBox"); Element child = getElement().getFirstChildElement(); while(child != null){ if("input".equalsIgnoreCase(child.getTagName())){ child.addClassName("check-box"); }else{ child.addClassName("check-label"); } child = child.getNextSiblingElement(); } } public NullableCheckBox(Element elem) { super(elem); inputElem = InputElement.as(elem); inputElem.setPropertyBoolean("indeterminate", true); inputElem.getStyle().setVerticalAlign(VerticalAlign.MIDDLE); anchor.getStyle().setDisplay(Style.Display.INLINE_BLOCK); anchor.getStyle().setPosition(Style.Position.RELATIVE); anchor.getStyle().setHeight(100, Style.Unit.PCT); anchor.getStyle().setVerticalAlign(Style.VerticalAlign.MIDDLE); getElement().appendChild(anchor); } @Override public void setValue(Boolean aValue, boolean fireEvents) { Boolean oldValue = getValue(); value = aValue; inputElem.setPropertyBoolean("indeterminate", value == null); if (value == null ? oldValue != null : !value.equals(oldValue)) { inputElem.setChecked(aValue != null ? aValue : false); inputElem.setDefaultChecked(aValue != null ? aValue : false); if (fireEvents) { ValueChangeEvent.fire(this, aValue); } } } @Override public Boolean getValue() { return value; } protected void ensureDomEventHandlers() { addDomHandler(new ChangeHandler() { @Override public void onChange(ChangeEvent event) { setValue(inputElem.isChecked(), true); } }, ChangeEvent.getType()); } }