/*
FieldPropertyEditor.java
(c) 2010-2013 Edward Swartz
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
*/
package org.ejs.gui.properties;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Scale;
import org.eclipse.swt.widgets.Text;
import org.ejs.gui.common.FontUtils;
import ejs.base.properties.FieldProperty;
import ejs.base.properties.PropertyUtils;
import ejs.base.properties.Range;
/**
* @author ejs
*
*/
public class FieldPropertyEditor implements
IPropertyEditor {
protected final FieldProperty property;
public FieldPropertyEditor(FieldProperty property) {
this.property = property;
}
/* (non-Javadoc)
*
*/
public IPropertyEditorControl createEditor(Composite parent) {
if (property == null)
return null;
Object value = getValue();
if (value == null)
return null;
if (value instanceof IPropertyEditorProvider) {
IPropertyEditor editor = ((IPropertyEditorProvider) value).createEditor(property);
if (editor != null)
return editor.createEditor(parent);
}
final Class<?> klass = property.getField().getType();
if (Number.class.isInstance(value)) {
Range range = property.getField().getAnnotation(Range.class);
if (range == null) {
final Text text = new Text(parent, SWT.BORDER);
text.setText(String.valueOf(value));
final ModifyListener modifyListener = new ModifyListener() {
public void modifyText(ModifyEvent e) {
try {
setValueFromString(text.getText());
} catch (Throwable t) {
t.printStackTrace();
}
}
};
text.addModifyListener(modifyListener);
return new IPropertyEditorControl() {
@Override
public Control getControl() {
return text;
}
@Override
public void reset() {
text.removeModifyListener(modifyListener);
text.setText(property.getString());
text.addModifyListener(modifyListener);
}
};
} else {
final Composite comp = new Composite(parent, SWT.NONE);
GridLayoutFactory.fillDefaults().numColumns(2).applyTo(comp);
final Scale scale = new Scale(comp, SWT.HORIZONTAL);
GridDataFactory.fillDefaults().grab(true, false).applyTo(scale);
final Label label = new Label(comp, SWT.NONE);
label.setText(String.valueOf(value));
GridDataFactory.fillDefaults().grab(false, false).
minSize(FontUtils.measureText(comp.getDisplay(), comp.getFont(), "-100.0!")).
applyTo(label);
final float add = range.minimum();
final float mul = (range.maximum() - range.minimum());
scale.setMinimum(0);
scale.setMaximum(1000);
scale.setSelection((int) ((((Number) value).doubleValue() - add) * 1000 / mul));
final SelectionListener selectListener = new SelectionAdapter() {
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
try {
double value = (scale.getSelection() * mul / 1000.) + add;
property.setValue(PropertyUtils.convertStringToValue(
String.valueOf(value),
property.getType()));
label.setText(String.valueOf(value));
} catch (Throwable t) {
t.printStackTrace();
}
}
};
scale.addSelectionListener(selectListener);
return new IPropertyEditorControl() {
@Override
public Control getControl() {
return comp;
}
@Override
public void reset() {
scale.removeSelectionListener(selectListener);
double value = property.getDouble();
scale.setSelection((int) ((value - add) * 1000 / mul));
label.setText(String.valueOf(value));
scale.addSelectionListener(selectListener);
}
};
}
} else if (Boolean.class.isInstance(value)) {
final Button check = new Button(parent, SWT.CHECK);
check.setSelection(Boolean.TRUE.equals(value));
final SelectionAdapter selectionListener = new SelectionAdapter() {
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
try {
setValue(check.getSelection());
} catch (Throwable t) {
t.printStackTrace();
}
}
};
check.addSelectionListener(selectionListener);
return new IPropertyEditorControl() {
@Override
public Control getControl() {
return check;
}
@Override
public void reset() {
check.removeSelectionListener(selectionListener);
check.setSelection(property.getBoolean());
check.addSelectionListener(selectionListener);
}
};
} else if (Enum.class.isAssignableFrom(klass)) {
final Combo combo = new Combo(parent, SWT.READ_ONLY);
final Enum<?>[] enumFields= (Enum<?>[]) klass.getEnumConstants();
if (enumFields != null) {
final String[] values = new String[enumFields.length] ;
for (int i = 0; i < values.length; i++) {
Enum<?> ef = enumFields[i];
values[i] = ef.toString();
}
combo.setItems(values);
combo.setText(value.toString());
final SelectionAdapter selectionListener = new SelectionAdapter() {
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected(SelectionEvent e) {
try {
setValue(enumFields[combo.getSelectionIndex()]);
} catch (Exception e1) {
e1.printStackTrace();
}
}
};
combo.addSelectionListener(selectionListener);
return new IPropertyEditorControl() {
@Override
public Control getControl() {
return combo;
}
@Override
public void reset() {
combo.removeSelectionListener(selectionListener);
for (int i = 0; i < values.length; i++) {
Enum<?> ef = enumFields[i];
if (property.getValue() == ef) {
combo.select(i);
break;
}
}
combo.addSelectionListener(selectionListener);
}
};
}
}
return null;
}
/**
* @param selection
*/
protected void setValue(Object value) {
property.setValue(value);
}
protected Object getValue() {
return property.getValue();
}
protected void setValueFromString(final String txt) {
Object value = PropertyUtils.convertStringToValue(txt, property.getType());
property.setValue(value);
//FieldUtils.setValueFromString(property.getField(), property.getObject(), txt);
}
}