import org.eclipse.jface.viewers.ColumnViewerEditorActivationListener;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
import org.eclipse.jface.viewers.ColumnViewerEditorDeactivationEvent;
+import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.FocusCellOwnerDrawHighlighter;
import org.eclipse.jface.viewers.ISelection;
import org.simantics.db.management.ISessionContext;
import org.simantics.g3d.property.annotations.CompoundGetPropertyValue;
import org.simantics.g3d.property.annotations.CompoundSetPropertyValue;
+import org.simantics.g3d.property.annotations.GetComboProperty;
+import org.simantics.g3d.property.annotations.GetComboPropertyValue;
import org.simantics.g3d.property.annotations.GetPropertyValue;
import org.simantics.g3d.property.annotations.PropertyTabBlacklist;
+import org.simantics.g3d.property.annotations.SetComboPropertyValue;
import org.simantics.g3d.property.annotations.SetPropertyValue;
import org.simantics.g3d.scenegraph.IG3DNode;
import org.simantics.g3d.scenegraph.NodeMap;
}
item.setter = m;
+ } else if (annotation.annotationType().equals(GetComboPropertyValue.class)) {
+ GetComboPropertyValue get = (GetComboPropertyValue)annotation;
+ ComboPropertyItem item = (ComboPropertyItem)items.get(get.value());
+ if (item == null) {
+ item = new ComboPropertyItem(get.value());
+ items.put(item.id, item);
+ }
+ item.getter = m;
+ item.manipulatorClass = ComboPropertyManipulator.class;
+
+ item.tabId = get.tabId();
+
+ item.name = get.name();
+ } else if (annotation.annotationType().equals(SetComboPropertyValue.class)) {
+ SetComboPropertyValue set = (SetComboPropertyValue)annotation;
+ ComboPropertyItem item = (ComboPropertyItem)items.get(set.value());
+ if (item == null) {
+ item = new ComboPropertyItem(set.value());
+ items.put(item.id, item);
+ }
+ item.setter = m;
+ } else if (annotation.annotationType().equals(GetComboProperty.class)) {
+ GetComboProperty get = (GetComboProperty)annotation;
+ ComboPropertyItem item = (ComboPropertyItem)items.get(get.value());
+ if (item == null) {
+ item = new ComboPropertyItem(get.value());
+ items.put(item.id, item);
+ }
+ item.values = m;
}
}
}
}
}
+ private static PropertyManipulator createManipulator(ComboPropertyItem item, Object obj) {
+ try {
+ MethodComboValueProvider provider = new MethodComboValueProvider(item.getter, item.setter,item.values);
+ PropertyManipulator manipulator = item.manipulatorClass.getConstructor(ValueProvider.class,Object.class).newInstance(provider,obj);
+ return manipulator;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
private static interface IPropertyItem {
public String getTabId();
public String getName();
+ public String getId();
+ public boolean editable();
}
private static class PropertyItem implements IPropertyItem{
this.id = id;
}
+ @Override
+ public String getId() {
+ return id;
+ }
+
@Override
public int hashCode() {
return id.hashCode();
public String getName() {
return name;
}
+
+ @Override
+ public boolean editable() {
+ return setter != null;
+ }
}
private static class CompoundPropertyItem implements IPropertyItem{
this.id = id;
}
+ @Override
+ public String getId() {
+ return id;
+ }
+
@Override
public int hashCode() {
return id.hashCode();
public String getName() {
return name;
}
+
+ @Override
+ public boolean editable() {
+ return setter != null;
+ }
}
+ private static class ComboPropertyItem implements IPropertyItem{
+ private String id;
+ private String name;
+ private String tabId;
+ private Method getter;
+ private Method setter;
+ private Method values;
+ private Class<? extends ComboPropertyManipulator> manipulatorClass;
+
+
+ public ComboPropertyItem(String id) {
+ if (id == null)
+ throw new NullPointerException();
+ this.id = id;
+ }
+
+ @Override
+ public String getId() {
+ return id;
+ }
+
+ @Override
+ public int hashCode() {
+ return id.hashCode();
+ }
+
+ @Override
+ public String getTabId() {
+ return tabId;
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public boolean editable() {
+ return setter != null;
+ }
+ }
+
private static class AnnotatedPropertyTabContributor implements PropertyTabContributor {
private String id;
List<IPropertyItem> items;
private static class AnnotatedPropertyTab implements IPropertyTab2, NodeListener {
//private String id;
List<IPropertyItem> contibutedItems;
- List<PropertyItem> resolvedItems = new ArrayList<PropertyItem>();
- private Map<PropertyItem,PropertyManipulator> manipulators = new HashMap<PropertyItem, PropertyManipulator>();
+ List<IPropertyItem> resolvedItems = new ArrayList<IPropertyItem>();
+ private Map<IPropertyItem,PropertyManipulator> manipulators = new HashMap<IPropertyItem, PropertyManipulator>();
private TableViewer viewer;
@Override
public void selectionChanged(SelectionChangedEvent event) {
- PropertyItem item = AdaptationUtils.adaptToSingle(event.getSelection(), PropertyItem.class);
+ IPropertyItem item = AdaptationUtils.adaptToSingle(event.getSelection(), IPropertyItem.class);
selectedItem = item;
if (!manipulators.get(selectedItem).getEditMode())
manipulators.get(selectedItem).setEditMode(true);
if (item instanceof PropertyItem) {
resolvedItems.add((PropertyItem)item);
manipulators.put((PropertyItem)item, createManipulator((PropertyItem)item, node));
- }
- else {
+ } else if (item instanceof ComboPropertyItem) {
+ resolvedItems.add((ComboPropertyItem)item);
+ manipulators.put((ComboPropertyItem)item, createManipulator((ComboPropertyItem)item, node));
+ } else if (item instanceof CompoundPropertyItem) {
CompoundPropertyItem compound = (CompoundPropertyItem)item;
Map<PropertyItem, PropertyManipulator> manipulators = createManipulators(compound, node);
for (PropertyItem i : manipulators.keySet()) {
resolvedItems.add(i);
this.manipulators.put(i, manipulators.get(i));
}
+ } else {
+
}
}
if (viewer.getTable().isDisposed())
return;
if (DEBUG)System.out.println("Viewer refresh " + id);
- for (PropertyItem item : resolvedItems)
+ for (IPropertyItem item : resolvedItems)
if (!item.equals(selectedItem))
viewer.refresh(item);
if (selectedItem != null)
return;
}
if (DEBUG) System.out.println("Viewer threaded refresh " + id);
- for (PropertyItem item : resolvedItems)
+ for (IPropertyItem item : resolvedItems)
if (!item.equals(selectedItem))
viewer.refresh(item);
if (selectedItem != null)
}
});
} else {
- for (PropertyItem item : resolvedItems) {
+ for (IPropertyItem item : resolvedItems) {
delayedUpdate.add(item);
}
}
}
- public PropertyManipulator getManipulator(PropertyItem item) {
+ public PropertyManipulator getManipulator(IPropertyItem item) {
return manipulators.get(item);
}
@Override
protected boolean canEdit(Object element) {
- PropertyItem item = (PropertyItem)element;
+ IPropertyItem item = (IPropertyItem)element;
if (tab.getManipulator(item).getValueCount() <= index)
return false;
- if (item.setter == null)
+ if (!item.editable())
return false;
if (getValue(element) == null)
return false;
@Override
protected CellEditor getCellEditor(Object element) {
-
- if (tab.getManipulator((PropertyItem)element).getValueCount() <= index)
+ IPropertyItem item = (IPropertyItem)element;
+ if (tab.getManipulator(item).getValueCount() <= index)
return null;
if (editor == null)
- editor = new TextCellEditor(viewer.getTable(),SWT.NONE) {
- @Override
- public void activate() {
- tab.setEditing(true);
- }
-
- @Override
- public void deactivate() {
- super.deactivate();
- tab.setEditing(false);
- }
- };
+ if (item instanceof PropertyItem)
+ editor = new TextCellEditor(viewer.getTable(),SWT.NONE) {
+ @Override
+ public void activate() {
+ tab.setEditing(true);
+ }
+
+ @Override
+ public void deactivate() {
+ super.deactivate();
+ tab.setEditing(false);
+ }
+ };
+ else if (item instanceof ComboPropertyItem) {
+ ComboPropertyItem comboPropertyItem = (ComboPropertyItem)item;
+ ComboPropertyManipulator manipulator = (ComboPropertyManipulator)tab.manipulators.get(comboPropertyItem);
+ editor = new ComboBoxCellEditor(viewer.getTable(), manipulator.getItems()) {
+ @Override
+ public void activate() {
+ tab.setEditing(true);
+ }
+
+ @Override
+ public void deactivate() {
+ super.deactivate();
+ tab.setEditing(false);
+ }
+ };
+ }
if (DEBUG)System.err.println("CELL EDITOR: " + element);
return editor;
}
@Override
protected Object getValue(Object element) {
- PropertyItem item = (PropertyItem)element;
+ IPropertyItem item = (IPropertyItem)element;
PropertyManipulator manipulator = tab.getManipulator(item);//createManipulator(item, obj);
if (manipulator.getValueCount() <= index)
return null;
+ if (manipulator instanceof ComboPropertyManipulator) {
+ return ((ComboPropertyManipulator)manipulator).getValueIndex();
+ }
Object value = manipulator.getValue(index);
return value;
}
@Override
protected void setValue(Object element, Object value) {
- PropertyItem item = (PropertyItem)element;
+ IPropertyItem item = (IPropertyItem)element;
PropertyManipulator manipulator = tab.getManipulator(item);//createManipulator(item, obj);
if (manipulator.getValueCount() <= index)
throw new IllegalAccessError("Editing value in index " + index + " is not allowed.");
if (DEBUG)System.err.println("CELL SET VALUE: " + element + " " + value);
- manipulator.setValue((String)value,index);
+ manipulator.setValue(value.toString(),index);
viewer.refresh(item);
- nodeMap.commit("Set " + item.id + " value to " + value);
+ nodeMap.commit("Set " + item.getId() + " value to " + value);
}
@Override
public void update(ViewerCell cell) {
- PropertyItem item = (PropertyItem)cell.getElement();
+ IPropertyItem item = (IPropertyItem)cell.getElement();
- if (item.name.length() > 0)
- cell.setText(item.name);
+ if (item.getName().length() > 0)
+ cell.setText(item.getName());
else
- cell.setText(item.id);
+ cell.setText(item.getId());
}
@Override
public void update(ViewerCell cell) {
- PropertyItem item = (PropertyItem)cell.getElement();
+ IPropertyItem item = (IPropertyItem)cell.getElement();
int index = cell.getColumnIndex() -1;
PropertyManipulator manipulator = tab.getManipulator(item);//createManipulator(item, object);
if (manipulator.getValueCount() <= index)