/*
* Beanfabrics Framework Copyright (C) by Michael Karneim, beanfabrics.org
* Use is subject to license terms. See license.txt.
*/
package org.beanfabrics.swt;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import org.beanfabrics.IModelProvider;
import org.beanfabrics.Link;
import org.beanfabrics.ModelSubscriber;
import org.beanfabrics.Path;
import org.beanfabrics.View;
import org.beanfabrics.event.WeakPropertyChangeListener;
import org.beanfabrics.model.IIntegerPM;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Spinner;
/**
* @author Max Gensthaler
*/
public class BnSpinnerDecorator extends AbstractDecorator<Spinner> implements View<IIntegerPM>, ModelSubscriber {
private final Link link = new Link(this);
private final PropertyChangeListener listener = new WeakPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
refreshUI();
}
};
private ValidationIndicator validationIndicator;
private IIntegerPM pModel;
private Spinner spinner;
public BnSpinnerDecorator(Spinner spinner) {
super(spinner);
this.spinner = spinner;
hookControl(spinner);
}
private void hookControl(Spinner spinner) {
Composite parent = spinner.getParent();
if (parent instanceof ValidationIndicator) {
setValidationIndicator((ValidationIndicator)parent);
}
spinner.addModifyListener(new ModifyListener() {
public void modifyText(final ModifyEvent evt) {
updateModel();
}
});
refreshUI();
}
public BnSpinnerDecorator(Composite parent, int style) {
this(new Spinner(parent, style));
}
protected void updateModel() {
if (pModel != null) {
pModel.setText(String.valueOf(spinner.getSelection()));
}
}
/** {@inheritDoc} */
public IIntegerPM getPresentationModel() {
return pModel;
}
/** {@inheritDoc} */
public void setPresentationModel(IIntegerPM pModel) {
if (this.pModel != null) {
this.pModel.removePropertyChangeListener(listener);
}
this.pModel = pModel;
if (this.pModel != null) {
this.pModel.addPropertyChangeListener(listener);
}
refreshUI();
}
protected void refreshUI() {
refreshEditable();
refreshText();
refreshMinMax();
refreshTooltip();
refreshValidationIndicator();
}
protected void refreshEditable() {
if (pModel != null) {
spinner.setEnabled(pModel.isEditable());
} else {
spinner.setEnabled(false);
}
}
protected void refreshText() {
if (pModel != null) {
Integer pModelInteger = pModel.getInteger();
int pModelInt = (pModelInteger == null ? 0 : pModelInteger.intValue());
if (spinner.getSelection() != pModelInt) {
spinner.setSelection(pModelInt);
}
} else {
spinner.setSelection(0);
}
}
private void refreshMinMax() {
if (pModel != null) {
spinner.setMinimum((int)((IIntegerPM)pModel).getMinValue());
spinner.setMaximum((int)((IIntegerPM)pModel).getMaxValue());
} else {
spinner.setMinimum(Integer.MIN_VALUE);
spinner.setMaximum(Integer.MAX_VALUE);
}
}
protected void refreshTooltip() {
if (pModel != null) {
if (pModel.isValid() == false) {
spinner.setToolTipText(pModel.getValidationState().getMessage());
} else {
spinner.setToolTipText(pModel.getDescription());
}
} else {
spinner.setToolTipText(null);
}
}
protected void refreshValidationIndicator() {
if (validationIndicator != null) {
if (pModel != null) {
validationIndicator.setValidationState(pModel.getValidationState());
} else {
validationIndicator.setValidationState(null);
}
}
}
/** {@inheritDoc} */
public void setModelProvider(IModelProvider provider) {
this.link.setModelProvider(provider);
}
/** {@inheritDoc} */
public IModelProvider getModelProvider() {
return link.getModelProvider();
}
/** {@inheritDoc} */
public void setPath(Path path) {
this.link.setPath(path);
}
/** {@inheritDoc} */
public Path getPath() {
return link.getPath();
}
public ValidationIndicator getValidationIndicator() {
return validationIndicator;
}
public void setValidationIndicator(ValidationIndicator validationIndicator) {
this.validationIndicator = validationIndicator;
}
}