/* * Ext GWT - Ext for GWT * Copyright(c) 2007-2009, Ext JS, LLC. * licensing@extjs.com * * http://extjs.com/license */ package com.extjs.gxt.ui.client.widget.form; import com.extjs.gxt.ui.client.GXT; import com.extjs.gxt.ui.client.core.El; import com.extjs.gxt.ui.client.core.XDOM; import com.extjs.gxt.ui.client.event.ComponentEvent; import com.google.gwt.dom.client.InputElement; import com.google.gwt.i18n.client.LocaleInfo; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; /** * Single checkbox field. Unlike other fields, checkbox fires change events when the radios state is changed, not on blur. * * <dl> * <dt>Inherited Events:</dt> * <dd>Field Focus</dd> * <dd>Field Blur</dd> * <dd>Field Change</dd> * <dd>Field Invalid</dd> * <dd>Field Valid</dd> * <dd>Field KeyPress</dd> * <dd>Field SpecialKey</dd> * <dd>BoxComponent Move</dd> * <dd>BoxComponent Resize</dd> * <dd>Component Enable</dd> * <dd>Component Disable</dd> * <dd>Component BeforeHide</dd> * <dd>Component Hide</dd> * <dd>Component BeforeShow</dd> * <dd>Component Show</dd> * <dd>Component Attach</dd> * <dd>Component Detach</dd> * <dd>Component BeforeRender</dd> * <dd>Component Render</dd> * <dd>Component BrowserEvent</dd> * <dd>Component BeforeStateRestore</dd> * <dd>Component StateRestore</dd> * <dd>Component BeforeStateSave</dd> * <dd>Component SaveState</dd> * </dl> */ public class CheckBox extends Field<Boolean> { protected El wrap, input, boxLabelEl; private String boxLabel; private String valueAttribute; public CheckBox() { setFireChangeEventOnSetValue(true); value = false; propertyEditor = new BooleanPropertyEditor(); ensureVisibilityOnSizing = true; } @Override public void clearInvalid() { // do nothing } public String getBoxLabel() { return boxLabel; } @Override public String getRawValue() { if (!rendered) { return value.toString(); } return String.valueOf(((InputElement) getInputEl().dom.cast()).isChecked()); } @Override public Boolean getValue() { if (!isAttached() && rendered) { return ((InputElement) input.dom.cast()).isDefaultChecked(); } return super.getValue(); } /** * * Returns the value property of the input element */ public String getValueAttribute() { if (rendered) { input.getValue(); } return valueAttribute; } @Override public void markInvalid(String msg) { } /** * The text that appears beside the checkbox (defaults to null). * * @param boxLabel * the box label */ public void setBoxLabel(String boxLabel) { this.boxLabel = boxLabel; if (rendered) { boxLabelEl.update(getBoxLabel()); } } @Override public void setRawValue(String value) { boolean b = Boolean.valueOf(value).booleanValue(); ((InputElement) getInputEl().dom.cast()).setChecked(b); } @Override public void setValue(Boolean value) { if (value == null) { value = false; } focusValue = value; super.setValue(value); if (rendered) { ((InputElement) input.dom.cast()).setDefaultChecked(value); } } /** * Sets a new value attribute to the input element * * @param valueAttribute * the value attribute to set */ public void setValueAttribute(String valueAttribute) { this.valueAttribute = valueAttribute; if (rendered) { input.setValue(valueAttribute); } } @Override protected void afterRender() { super.afterRender(); alignElements(); } protected void alignElements() { if (boxLabel == null) { input.alignTo(getElement(), "c-c", null); if (GXT.isIE || GXT.isOpera) { input.alignTo(getElement(), "c-c", null); } } else { String alignTo = "l-l"; String boxAlignTo = "l-r"; if (LocaleInfo.getCurrentLocale().isRTL()) { alignTo = "r-r"; boxAlignTo = "r-l"; } input.alignTo(getElement(), alignTo, new int[] { 0, 0 }); if (GXT.isIE || GXT.isOpera) { input.alignTo(getElement(), alignTo, new int[] { 0, 0 }); } boxLabelEl.alignTo(input.dom, boxAlignTo, new int[] { 5, GXT.isIE ? -1 : 0 }); if (GXT.isIE || GXT.isOpera) { boxLabelEl.alignTo(input.dom, boxAlignTo, new int[] { 5, GXT.isIE ? -1 : 0 }); } } } @Override protected El getFocusEl() { return input; } @Override protected El getInputEl() { return input; } @Override protected El getStyleEl() { return input; } @Override protected void onClick(ComponentEvent ce) { super.onClick(ce); if (readOnly) { ce.stopEvent(); return; } boolean v = getInputEl().dom.getPropertyBoolean("checked"); setValue(v); } @Override protected void onRender(Element target, int index) { if (this instanceof Radio) { input = new El(DOM.createInputRadio("")); } else { input = new El(DOM.createInputCheck()); } input.setId(XDOM.getUniqueId()); input.makePositionable(); wrap = new El(DOM.createDiv()); wrap.dom.setPropertyString("hideFocus", "hideFocus"); wrap.dom.setClassName("x-form-check-wrap"); wrap.dom.appendChild(input.dom); setElement(wrap.dom, target, index); wrap.makePositionable(); if (boxLabel != null) { boxLabelEl = new El(DOM.createLabel()); boxLabelEl.setElementAttribute("for", input.getId()); boxLabelEl.setElementAttribute("htmlFor", input.getId()); boxLabelEl.dom.setClassName("x-form-cb-label"); boxLabelEl.makePositionable(); wrap.dom.appendChild(boxLabelEl.dom); setBoxLabel(boxLabel); } super.onRender(target, index); setValueAttribute(valueAttribute); focusStyle = null; } @Override protected void onResize(int width, int height) { super.onResize(width, height); if (boxLabel == null) { // center it again alignElements(); } } }