Java tutorial
/* * Copyright 2011 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package org.drools.guvnor.client.decisiontable; import java.math.BigDecimal; import java.math.BigInteger; import java.util.Date; import java.util.Map; import java.util.Set; import org.drools.guvnor.client.common.AbstractRestrictedEntryTextBox; import org.drools.guvnor.client.common.NumericBigDecimalTextBox; import org.drools.guvnor.client.common.NumericBigIntegerTextBox; import org.drools.guvnor.client.common.NumericByteTextBox; import org.drools.guvnor.client.common.NumericDoubleTextBox; import org.drools.guvnor.client.common.NumericFloatTextBox; import org.drools.guvnor.client.common.NumericIntegerTextBox; import org.drools.guvnor.client.common.NumericLongTextBox; import org.drools.guvnor.client.common.NumericShortTextBox; import org.drools.guvnor.client.common.NumericTextBox; import org.drools.guvnor.client.common.PopupDatePicker; import org.drools.guvnor.client.configurations.ApplicationPreferences; import org.drools.guvnor.client.decisiontable.widget.DefaultValueDropDownManager; import org.drools.guvnor.client.decisiontable.widget.LimitedEntryDropDownManager; import org.drools.guvnor.client.decisiontable.widget.LimitedEntryDropDownManager.Context; import org.drools.guvnor.client.messages.Constants; import org.drools.ide.common.client.modeldriven.DropDownData; import org.drools.ide.common.client.modeldriven.SuggestionCompletionEngine; import org.drools.ide.common.client.modeldriven.dt52.ActionInsertFactCol52; import org.drools.ide.common.client.modeldriven.dt52.ActionSetFieldCol52; import org.drools.ide.common.client.modeldriven.dt52.BaseColumn; import org.drools.ide.common.client.modeldriven.dt52.ConditionCol52; import org.drools.ide.common.client.modeldriven.dt52.DTCellValue52; import org.drools.ide.common.client.modeldriven.dt52.DTColumnConfig52; import org.drools.ide.common.client.modeldriven.dt52.DTDataTypes52; import org.drools.ide.common.client.modeldriven.dt52.GuidedDecisionTable52; import org.drools.ide.common.client.modeldriven.dt52.LimitedEntryCol; import org.drools.ide.common.client.modeldriven.dt52.Pattern52; import org.drools.ide.common.client.modeldriven.ui.ConstraintValueEditorHelper; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; /** * A Factory for Widgets to edit DTCellValues */ public class DTCellValueWidgetFactory { private final SuggestionCompletionEngine sce; private final GuidedDecisionTable52 dtable; private final LimitedEntryDropDownManager dropDownManager; private final boolean isReadOnly; private final boolean allowEmptyValues; private static final String DATE_FORMAT = ApplicationPreferences.getDroolsDateFormat(); private static final DateTimeFormat format = DateTimeFormat.getFormat(DATE_FORMAT); public static DTCellValueWidgetFactory getInstance(GuidedDecisionTable52 dtable, SuggestionCompletionEngine sce, boolean isReadOnly, boolean allowEmptyValues) { switch (dtable.getTableFormat()) { case EXTENDED_ENTRY: return new DTCellValueWidgetFactory(dtable, sce, new DefaultValueDropDownManager(dtable, sce), isReadOnly, allowEmptyValues); default: return new DTCellValueWidgetFactory(dtable, sce, new LimitedEntryDropDownManager(dtable, sce), isReadOnly, allowEmptyValues); } } private DTCellValueWidgetFactory(GuidedDecisionTable52 dtable, SuggestionCompletionEngine sce, LimitedEntryDropDownManager dropDownManager, boolean isReadOnly, boolean allowEmptyValues) { this.sce = sce; this.dtable = dtable; this.dropDownManager = dropDownManager; this.isReadOnly = isReadOnly; this.allowEmptyValues = allowEmptyValues; } /** * Make a DTCellValue for a column * * @param c * @return */ public DTCellValue52 makeNewValue(DTColumnConfig52 c) { DTDataTypes52 type = dtable.getTypeSafeType(c, sce); return new DTCellValue52(type, allowEmptyValues); } /** * Make a DTCellValue for a column. This overloaded method takes a Pattern52 * object as well since the pattern may be different to that to which the * column has been bound in the Decision Table model, i.e. when adding or * editing a column * * @param p * @param c * @return */ public DTCellValue52 makeNewValue(Pattern52 p, ConditionCol52 c) { DTDataTypes52 type = dtable.getTypeSafeType(p, c, sce); return new DTCellValue52(type, allowEmptyValues); } /** * Get a Widget to edit a DTCellValue. A value is explicitly provided as * some columns (in the future) will have multiple DTCellValues (for * "Default Value" and "Option List"). This overloaded method takes a * Pattern52 object as well since the pattern may be different to that to * which the column has been bound in the Decision Table model, i.e. when * adding or editing a column * * @param pattern * @param column * @param value * @return */ public Widget getWidget(Pattern52 pattern, ConditionCol52 column, DTCellValue52 value) { //Check if the column has a "Value List" or an enumeration. Value List takes precedence if (dtable.hasValueList(column)) { final String[] valueList = dtable.getValueList(column); return makeListBox(valueList, pattern, column, value); } else if (sce.hasEnums(pattern.getFactType(), column.getFactField())) { final Context context = new Context(pattern, column); final Map<String, String> currentValueMap = dropDownManager.getCurrentValueMap(context); final DropDownData dd = sce.getEnums(pattern.getFactType(), column.getFactField(), currentValueMap); if (dd == null) { return makeListBox(new String[0], pattern, column, value); } return makeListBox(dd.fixedList, pattern, column, value); } DTDataTypes52 type = dtable.getTypeSafeType(pattern, column, sce); switch (type) { case NUMERIC: return makeNumericTextBox(value); case NUMERIC_BIGDECIMAL: return makeNumericBigDecimalTextBox(value); case NUMERIC_BIGINTEGER: return makeNumericBigIntegerTextBox(value); case NUMERIC_BYTE: return makeNumericByteTextBox(value); case NUMERIC_DOUBLE: return makeNumericDoubleTextBox(value); case NUMERIC_FLOAT: return makeNumericFloatTextBox(value); case NUMERIC_INTEGER: return makeNumericIntegerTextBox(value); case NUMERIC_LONG: return makeNumericLongTextBox(value); case NUMERIC_SHORT: return makeNumericShortTextBox(value); case BOOLEAN: return makeBooleanSelector(value); case DATE: return makeDateSelector(value); default: return makeTextBox(value); } } /** * Make a DTCellValue for a column. This overloaded method takes a Pattern52 * object as well since the ActionSetFieldCol52 column may be associated * with an unbound Pattern * * @param p * @param c * @return */ public DTCellValue52 makeNewValue(Pattern52 p, ActionSetFieldCol52 c) { DTDataTypes52 type = dtable.getTypeSafeType(p, c, sce); return new DTCellValue52(type, allowEmptyValues); } /** * Get a Widget to edit a DTCellValue. A value is explicitly provided as * some columns (in the future) will have multiple DTCellValues (for * "Default Value" and "Option List"). This overloaded method takes a * Pattern52 object as well since the ActionSetFieldCol52 column may be * associated with an unbound Pattern * * @param pattern * @param column * @param value * @return */ public Widget getWidget(Pattern52 pattern, ActionSetFieldCol52 column, DTCellValue52 value) { //Check if the column has a "Value List" or an enumeration. Value List takes precedence if (dtable.hasValueList(column)) { final String[] valueList = dtable.getValueList(column); return makeListBox(valueList, pattern, column, value); } else if (sce.hasEnums(pattern.getFactType(), column.getFactField())) { final Context context = new Context(pattern, column); final Map<String, String> currentValueMap = dropDownManager.getCurrentValueMap(context); final DropDownData dd = sce.getEnums(pattern.getFactType(), column.getFactField(), currentValueMap); if (dd == null) { return makeListBox(new String[0], pattern, column, value); } return makeListBox(dd.fixedList, pattern, column, value); } DTDataTypes52 type = dtable.getTypeSafeType(pattern, column, sce); switch (type) { case NUMERIC: return makeNumericTextBox(value); case NUMERIC_BIGDECIMAL: return makeNumericBigDecimalTextBox(value); case NUMERIC_BIGINTEGER: return makeNumericBigIntegerTextBox(value); case NUMERIC_BYTE: return makeNumericByteTextBox(value); case NUMERIC_DOUBLE: return makeNumericDoubleTextBox(value); case NUMERIC_FLOAT: return makeNumericFloatTextBox(value); case NUMERIC_INTEGER: return makeNumericIntegerTextBox(value); case NUMERIC_LONG: return makeNumericLongTextBox(value); case NUMERIC_SHORT: return makeNumericShortTextBox(value); case BOOLEAN: return makeBooleanSelector(value); case DATE: return makeDateSelector(value); default: return makeTextBox(value); } } /** * Get a Widget to edit a DTCellValue. A value is explicitly provided as * some columns (in the future) will have multiple DTCellValues (for * "Default Value" and "Option List"). * * @param column * @param value * @return */ public Widget getWidget(ActionInsertFactCol52 column, DTCellValue52 value) { //Check if the column has a "Value List" or an enumeration. Value List takes precedence if (dtable.hasValueList(column)) { final String[] valueList = dtable.getValueList(column); return makeListBox(valueList, column, value); } else if (sce.hasEnums(column.getFactType(), column.getFactField())) { final Context context = new Context(column); final Map<String, String> currentValueMap = dropDownManager.getCurrentValueMap(context); final DropDownData dd = sce.getEnums(column.getFactType(), column.getFactField(), currentValueMap); if (dd == null) { return makeListBox(new String[0], column, value); } return makeListBox(dd.fixedList, column, value); } DTDataTypes52 type = dtable.getTypeSafeType(column, sce); switch (type) { case NUMERIC: return makeNumericTextBox(value); case NUMERIC_BIGDECIMAL: return makeNumericBigDecimalTextBox(value); case NUMERIC_BIGINTEGER: return makeNumericBigIntegerTextBox(value); case NUMERIC_BYTE: return makeNumericByteTextBox(value); case NUMERIC_DOUBLE: return makeNumericDoubleTextBox(value); case NUMERIC_FLOAT: return makeNumericFloatTextBox(value); case NUMERIC_INTEGER: return makeNumericIntegerTextBox(value); case NUMERIC_LONG: return makeNumericLongTextBox(value); case NUMERIC_SHORT: return makeNumericShortTextBox(value); case BOOLEAN: return makeBooleanSelector(value); case DATE: return makeDateSelector(value); default: return makeTextBox(value); } } private ListBox makeBooleanSelector(final DTCellValue52 value) { final ListBox lb = new ListBox(); int indexTrue = 0; int indexFalse = 1; if (allowEmptyValues) { indexTrue = 1; indexFalse = 2; lb.addItem(Constants.INSTANCE.Choose(), ""); } lb.addItem("true"); lb.addItem("false"); Boolean currentItem = value.getBooleanValue(); if (currentItem == null) { lb.setSelectedIndex(0); } else { lb.setSelectedIndex(currentItem ? indexTrue : indexFalse); } // Wire up update handler lb.setEnabled(!isReadOnly); if (!isReadOnly) { lb.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { final String txtValue = lb.getValue(lb.getSelectedIndex()); Boolean boolValue = (txtValue.equals("") ? null : txtValue.equals("true")); value.setBooleanValue(boolValue); } }); } return lb; } private ListBox makeListBox(final String[] completions, final Pattern52 basePattern, final ConditionCol52 baseCondition, final DTCellValue52 value) { final ListBox lb = makeListBox(completions, value); // Wire up update handler lb.setEnabled(!isReadOnly); if (!isReadOnly) { lb.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { int index = lb.getSelectedIndex(); if (index > -1) { //Set base column value value.setStringValue(lb.getValue(index)); //Update any dependent enumerations final Context context = new Context(basePattern, baseCondition); Set<Integer> dependentColumnIndexes = dropDownManager.getDependentColumnIndexes(context); for (Integer iCol : dependentColumnIndexes) { BaseColumn column = dtable.getExpandedColumns().get(iCol); if (column instanceof LimitedEntryCol) { ((LimitedEntryCol) column).setValue(null); } else if (column instanceof DTColumnConfig52) { ((DTColumnConfig52) column).setDefaultValue(null); } } } else { value.setStringValue(null); } } }); } return lb; } private ListBox makeListBox(final String[] completions, final Pattern52 basePattern, final ActionSetFieldCol52 baseAction, final DTCellValue52 value) { final ListBox lb = makeListBox(completions, value); // Wire up update handler lb.setEnabled(!isReadOnly); if (!isReadOnly) { lb.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { int index = lb.getSelectedIndex(); if (index > -1) { //Set base column value value.setStringValue(lb.getValue(index)); //Update any dependent enumerations final Context context = new Context(basePattern, baseAction); Set<Integer> dependentColumnIndexes = dropDownManager.getDependentColumnIndexes(context); for (Integer iCol : dependentColumnIndexes) { BaseColumn column = dtable.getExpandedColumns().get(iCol); if (column instanceof LimitedEntryCol) { ((LimitedEntryCol) column).setValue(null); } else if (column instanceof DTColumnConfig52) { ((DTColumnConfig52) column).setDefaultValue(null); } } } else { value.setStringValue(null); } } }); } return lb; } private ListBox makeListBox(final String[] completions, final ActionInsertFactCol52 baseAction, final DTCellValue52 value) { final ListBox lb = makeListBox(completions, value); // Wire up update handler lb.setEnabled(!isReadOnly); if (!isReadOnly) { lb.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { int index = lb.getSelectedIndex(); if (index > -1) { //Set base column value value.setStringValue(lb.getValue(index)); //Update any dependent enumerations final Context context = new Context(baseAction); Set<Integer> dependentColumnIndexes = dropDownManager.getDependentColumnIndexes(context); for (Integer iCol : dependentColumnIndexes) { BaseColumn column = dtable.getExpandedColumns().get(iCol); if (column instanceof LimitedEntryCol) { ((LimitedEntryCol) column).setValue(null); } else if (column instanceof DTColumnConfig52) { ((DTColumnConfig52) column).setDefaultValue(null); } } } else { value.setStringValue(null); } } }); } return lb; } private ListBox makeListBox(final String[] completions, final DTCellValue52 value) { int selectedIndex = -1; final ListBox lb = new ListBox(); if (allowEmptyValues) { lb.addItem(Constants.INSTANCE.Choose(), ""); } String currentItem = value.getStringValue(); int selectedIndexOffset = (allowEmptyValues ? 1 : 0); for (int i = 0; i < completions.length; i++) { String item = completions[i].trim(); String[] splut = ConstraintValueEditorHelper.splitValue(item); lb.addItem(splut[1], splut[0]); if (splut[0].equals(currentItem)) { lb.setSelectedIndex(i + selectedIndexOffset); selectedIndex = i + selectedIndexOffset; } } //If nothing has been selected, select the first value if (selectedIndex == -1) { if (lb.getItemCount() > 0) { lb.setSelectedIndex(0); value.setStringValue(lb.getValue(0)); } else { value.setStringValue(null); } } return lb; } private AbstractRestrictedEntryTextBox makeNumericTextBox(final DTCellValue52 value) { final AbstractRestrictedEntryTextBox tb = new NumericTextBox(allowEmptyValues); final BigDecimal numericValue = (BigDecimal) value.getNumericValue(); tb.setValue(numericValue == null ? "" : numericValue.toPlainString()); // Wire up update handler tb.setEnabled(!isReadOnly); if (!isReadOnly) { tb.addValueChangeHandler(new ValueChangeHandler<String>() { public void onValueChange(ValueChangeEvent<String> event) { try { value.setNumericValue(new BigDecimal(event.getValue())); } catch (NumberFormatException nfe) { if (allowEmptyValues) { value.setNumericValue((BigDecimal) null); tb.setValue(""); } else { value.setNumericValue(BigDecimal.ZERO); tb.setValue(BigDecimal.ZERO.toPlainString()); } } } }); } return tb; } private AbstractRestrictedEntryTextBox makeNumericBigDecimalTextBox(final DTCellValue52 value) { final AbstractRestrictedEntryTextBox tb = new NumericBigDecimalTextBox(allowEmptyValues); final BigDecimal numericValue = (BigDecimal) value.getNumericValue(); tb.setValue(numericValue == null ? "" : numericValue.toPlainString()); // Wire up update handler tb.setEnabled(!isReadOnly); if (!isReadOnly) { tb.addValueChangeHandler(new ValueChangeHandler<String>() { public void onValueChange(ValueChangeEvent<String> event) { try { value.setNumericValue(new BigDecimal(event.getValue())); } catch (NumberFormatException nfe) { if (allowEmptyValues) { value.setNumericValue((BigDecimal) null); tb.setValue(""); } else { value.setNumericValue(BigDecimal.ZERO); tb.setValue(BigDecimal.ZERO.toPlainString()); } } } }); } return tb; } private AbstractRestrictedEntryTextBox makeNumericBigIntegerTextBox(final DTCellValue52 value) { final AbstractRestrictedEntryTextBox tb = new NumericBigIntegerTextBox(allowEmptyValues); final BigInteger numericValue = (BigInteger) value.getNumericValue(); tb.setValue(numericValue == null ? "" : numericValue.toString()); // Wire up update handler tb.setEnabled(!isReadOnly); if (!isReadOnly) { tb.addValueChangeHandler(new ValueChangeHandler<String>() { public void onValueChange(ValueChangeEvent<String> event) { try { value.setNumericValue(new BigInteger(event.getValue())); } catch (NumberFormatException nfe) { if (allowEmptyValues) { value.setNumericValue((BigInteger) null); tb.setValue(""); } else { value.setNumericValue(BigInteger.ZERO); tb.setValue(BigInteger.ZERO.toString()); } } } }); } return tb; } private AbstractRestrictedEntryTextBox makeNumericByteTextBox(final DTCellValue52 value) { final AbstractRestrictedEntryTextBox tb = new NumericByteTextBox(allowEmptyValues); final Byte numericValue = (Byte) value.getNumericValue(); tb.setValue(numericValue == null ? "" : numericValue.toString()); // Wire up update handler tb.setEnabled(!isReadOnly); if (!isReadOnly) { tb.addValueChangeHandler(new ValueChangeHandler<String>() { public void onValueChange(ValueChangeEvent<String> event) { try { value.setNumericValue(new Byte(event.getValue())); } catch (NumberFormatException nfe) { if (allowEmptyValues) { value.setNumericValue((Byte) null); tb.setValue(""); } else { value.setNumericValue(new Byte("0")); tb.setValue("0"); } } } }); } return tb; } private AbstractRestrictedEntryTextBox makeNumericDoubleTextBox(final DTCellValue52 value) { final AbstractRestrictedEntryTextBox tb = new NumericDoubleTextBox(allowEmptyValues); final Double numericValue = (Double) value.getNumericValue(); tb.setValue(numericValue == null ? "" : numericValue.toString()); // Wire up update handler tb.setEnabled(!isReadOnly); if (!isReadOnly) { tb.addValueChangeHandler(new ValueChangeHandler<String>() { public void onValueChange(ValueChangeEvent<String> event) { try { value.setNumericValue(new Double(event.getValue())); } catch (NumberFormatException nfe) { if (allowEmptyValues) { value.setNumericValue((Double) null); tb.setValue(""); } else { value.setNumericValue(new Double("0")); tb.setValue("0"); } } } }); } return tb; } private AbstractRestrictedEntryTextBox makeNumericFloatTextBox(final DTCellValue52 value) { final AbstractRestrictedEntryTextBox tb = new NumericFloatTextBox(allowEmptyValues); final Float numericValue = (Float) value.getNumericValue(); tb.setValue(numericValue == null ? "" : numericValue.toString()); // Wire up update handler tb.setEnabled(!isReadOnly); if (!isReadOnly) { tb.addValueChangeHandler(new ValueChangeHandler<String>() { public void onValueChange(ValueChangeEvent<String> event) { try { value.setNumericValue(new Float(event.getValue())); } catch (NumberFormatException nfe) { if (allowEmptyValues) { value.setNumericValue((Float) null); tb.setValue(""); } else { value.setNumericValue(new Float("0")); tb.setValue("0"); } } } }); } return tb; } private AbstractRestrictedEntryTextBox makeNumericIntegerTextBox(final DTCellValue52 value) { final AbstractRestrictedEntryTextBox tb = new NumericIntegerTextBox(allowEmptyValues); final Integer numericValue = (Integer) value.getNumericValue(); tb.setValue(numericValue == null ? "" : numericValue.toString()); // Wire up update handler tb.setEnabled(!isReadOnly); if (!isReadOnly) { tb.addValueChangeHandler(new ValueChangeHandler<String>() { public void onValueChange(ValueChangeEvent<String> event) { try { value.setNumericValue(new Integer(event.getValue())); } catch (NumberFormatException nfe) { if (allowEmptyValues) { value.setNumericValue((Integer) null); tb.setValue(""); } else { value.setNumericValue(new Integer("0")); tb.setValue("0"); } } } }); } return tb; } private AbstractRestrictedEntryTextBox makeNumericLongTextBox(final DTCellValue52 value) { final AbstractRestrictedEntryTextBox tb = new NumericLongTextBox(allowEmptyValues); final Long numericValue = (Long) value.getNumericValue(); tb.setValue(numericValue == null ? "" : numericValue.toString()); // Wire up update handler tb.setEnabled(!isReadOnly); if (!isReadOnly) { tb.addValueChangeHandler(new ValueChangeHandler<String>() { public void onValueChange(ValueChangeEvent<String> event) { try { value.setNumericValue(new Long(event.getValue())); } catch (NumberFormatException nfe) { if (allowEmptyValues) { value.setNumericValue((Long) null); tb.setValue(""); } else { value.setNumericValue(new Long("0")); tb.setValue("0"); } } } }); } return tb; } private AbstractRestrictedEntryTextBox makeNumericShortTextBox(final DTCellValue52 value) { final AbstractRestrictedEntryTextBox tb = new NumericShortTextBox(allowEmptyValues); final Short numericValue = (Short) value.getNumericValue(); tb.setValue(numericValue == null ? "" : numericValue.toString()); // Wire up update handler tb.setEnabled(!isReadOnly); if (!isReadOnly) { tb.addValueChangeHandler(new ValueChangeHandler<String>() { public void onValueChange(ValueChangeEvent<String> event) { try { value.setNumericValue(new Short(event.getValue())); } catch (NumberFormatException nfe) { if (allowEmptyValues) { value.setNumericValue((Short) null); tb.setValue(""); } else { value.setNumericValue(new Short("0")); tb.setValue("0"); } } } }); } return tb; } private TextBox makeTextBox(final DTCellValue52 value) { TextBox tb = new TextBox(); tb.setValue(value.getStringValue()); // Wire up update handler tb.setEnabled(!isReadOnly); if (!isReadOnly) { tb.addValueChangeHandler(new ValueChangeHandler<String>() { public void onValueChange(ValueChangeEvent<String> event) { value.setStringValue(event.getValue()); } }); } return tb; } private Widget makeDateSelector(final DTCellValue52 value) { //If read-only return a label if (isReadOnly) { Label dateLabel = new Label(); dateLabel.setText(format.format(value.getDateValue())); return dateLabel; } PopupDatePicker dp = new PopupDatePicker(allowEmptyValues); if (value.getDateValue() != null) { dp.setValue(value.getDateValue()); } // Wire up update handler dp.addValueChangeHandler(new ValueChangeHandler<Date>() { public void onValueChange(ValueChangeEvent<Date> event) { value.setDateValue(event.getValue()); } }); return dp; } /** * An editor for whether the column is hidden or not * * @param col * @return */ public static CheckBox getHideColumnIndicator(final DTColumnConfig52 col) { final CheckBox chkHide = new CheckBox(); chkHide.setValue(col.isHideColumn()); chkHide.addClickHandler(new ClickHandler() { public void onClick(ClickEvent sender) { col.setHideColumn(chkHide.getValue()); } }); return chkHide; } }