/*
* 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.ITextPM;
import org.beanfabrics.model.Options;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
/**
* @author Michael Karneim
*/
public class BnComboDecorator extends AbstractDecorator<Combo> implements View<ITextPM>, ModelSubscriber {
private final Link link = new Link(this);
private final PropertyChangeListener listener = new WeakPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
refreshUI();
}
};
private class MyModifyListener implements ModifyListener {
public boolean enabled = true;
public void modifyText(ModifyEvent evt) {
if (enabled) {
updateModel();
}
}
};
private final MyModifyListener uiListener = new MyModifyListener();
private ITextPM pModel;
private ValidationIndicator validationIndicator;
private Combo combo;
public BnComboDecorator(Combo combo) {
super(combo);
this.combo = combo;
hookControl(combo);
}
public BnComboDecorator(Composite parent, int style) {
this(new Combo(parent, style));
}
protected void hookControl(Combo combo) {
Composite parent = combo.getParent();
if (parent instanceof ValidationIndicator) {
setValidationIndicator((ValidationIndicator)parent);
}
combo.addModifyListener(uiListener);
refreshUI();
}
protected void updateModel() {
if (pModel != null) {
pModel.setText(combo.getText());
}
}
/** {@inheritDoc} */
public ITextPM getPresentationModel() {
return pModel;
}
/** {@inheritDoc} */
public void setPresentationModel(ITextPM pModel) {
if (this.pModel != null) {
this.pModel.removePropertyChangeListener(listener);
}
this.pModel = pModel;
if (this.pModel != null) {
this.pModel.addPropertyChangeListener(listener);
}
refreshUI();
}
protected void refreshUI() {
uiListener.enabled = false;
try {
refreshEditable();
refreshOptions();
refreshText();
refreshToolTip();
refreshValidationIndicator();
} finally {
uiListener.enabled = true;
}
}
protected void refreshEditable() {
if (pModel != null) {
combo.setEnabled(pModel.isEditable());
} else {
combo.setEnabled(false);
}
}
protected void refreshValidationIndicator() {
if (validationIndicator != null) {
if (pModel != null) {
validationIndicator.setValidationState(pModel.getValidationState());
} else {
validationIndicator.setValidationState(null);
}
}
}
protected void refreshToolTip() {
if (pModel != null) {
if (pModel.isValid() == false) {
combo.setToolTipText(pModel.getValidationState().getMessage());
} else {
combo.setToolTipText(pModel.getDescription());
}
} else {
combo.setToolTipText(null);
}
}
protected void refreshText() {
if (pModel != null) {
final String textInModel = pModel.getText();
if (!combo.getText().equals(textInModel)) {
// if ((combo.getStyle() & SWT.READ_ONLY)!=0) {
if (true) {
if (combo.indexOf(textInModel) == -1) {
combo.add(textInModel, 0);
combo.select(0);
}
}
combo.setText(textInModel);
}
} else {
combo.setText("");
}
}
protected void refreshOptions() {
if (pModel != null) {
Options<?> opts = pModel.getOptions();
if (opts != null) {
if (equals(combo.getItems(), opts.getValues()) == false) {
combo.remove(0, combo.getItemCount() - 1);
for (String value : opts.getValues()) {
combo.add(value);
}
}
} else {
combo.removeAll();
}
} else {
combo.removeAll();
}
}
private boolean equals(String[] a, String[] b) {
if (a == b) {
return true;
} else if (a == null || b == null) {
return false;
} else if (a.length != b.length) {
return false;
} else {
for (int i = 0; i < a.length; ++i) {
if (!equals(a[i], b[i])) {
return false;
}
}
return true;
}
}
private boolean equals(String a, String b) {
if (a == b) {
return true;
} else if (a == null) {
return false;
} else {
return a.equals(b);
}
}
/** {@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;
}
}