/******************************************************************************* * Copyright (c) 2014 Bruno Medeiros and other Contributors. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Bruno Medeiros - initial API and implementation *******************************************************************************/ package melnorme.util.swt.components; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import melnorme.util.swt.SWTUtil; import melnorme.utilbox.fields.Field; import melnorme.utilbox.fields.FieldValueListener; import melnorme.utilbox.fields.FieldValueListener.FieldChangeListener; import melnorme.utilbox.fields.IField; import melnorme.utilbox.fields.validation.Validator; /** * Field component with a field value that can be manipulated (get/set) even if the * componented is not created. */ public abstract class FieldWidget<VALUE> extends AbstractDisableableWidget implements IField<VALUE> { private final Field<VALUE> field; protected boolean listenersNeedNotify; protected boolean settingValueFromControl; public FieldWidget() { this(new Field<>(null)); } public FieldWidget(VALUE defaultFieldValue) { this(new Field<>(defaultFieldValue)); } public FieldWidget(Field<VALUE> domainField) { this.field = domainField; this.field.addChangeListener(new FieldChangeListener() { @Override public void fieldValueChanged() { if(!settingValueFromControl) { updateWidgetFromInput(); } } }); } public Field<VALUE> getField() { return field; } @Override public VALUE getFieldValue() { return field.getFieldValue(); } @Override public void setFieldValue(VALUE value) { doSetFieldValue(value); } /** Update the field value from a control modification. */ public void setFieldValueFromControl(VALUE newValue) { settingValueFromControl = true; try { doSetFieldValue(newValue); } finally { settingValueFromControl = false; } } protected void doSetFieldValue(VALUE newValue) { field.setFieldValue(newValue); } public void fireFieldValueChanged() { field.fireFieldValueChanged(); } @Override public void addListener(FieldValueListener<? super VALUE> listener) { field.addListener(listener); } @Override public void removeListener(FieldValueListener<? super VALUE> listener) { field.removeListener(listener); } /* ----------------- ----------------- */ @Override public void doUpdateWidgetFromInput() { if(isCreated()) { doUpdateWidgetFromValue(); } } /** do Update component controls for given value. * Precondition: component is created.*/ protected abstract void doUpdateWidgetFromValue(); @Override protected abstract void createContents(Composite topControl); /* ----------------- ----------------- */ public abstract Control getFieldControl(); public boolean isCreated() { return SWTUtil.isOkToUse(getFieldControl()); } /* ----------------- ----------------- */ public void addFieldValidator2(Validator<VALUE, ?> validator) { validation().addFieldValidation2(this, validator.toValidationSource(this)); } }