X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.g3d%2Fsrc%2Forg%2Fsimantics%2Fg3d%2Fproperty%2FAnnotatedPropertyTabContributorFactory.java;h=344dd8cabc1be4805f46f07d46d3025252b880a7;hb=32b0d23669bb57c4869ea4b761ae821892a14be5;hp=7e3f85333bb88022ce5038e43670bdf0ab792346;hpb=ebfe6b0245b5cf9231cecedf0aaacd891eb5d344;p=simantics%2F3d.git diff --git a/org.simantics.g3d/src/org/simantics/g3d/property/AnnotatedPropertyTabContributorFactory.java b/org.simantics.g3d/src/org/simantics/g3d/property/AnnotatedPropertyTabContributorFactory.java index 7e3f8533..344dd8ca 100644 --- a/org.simantics.g3d/src/org/simantics/g3d/property/AnnotatedPropertyTabContributorFactory.java +++ b/org.simantics.g3d/src/org/simantics/g3d/property/AnnotatedPropertyTabContributorFactory.java @@ -39,6 +39,7 @@ import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent; 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; @@ -69,10 +70,12 @@ import org.eclipse.ui.IWorkbenchSite; 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; import org.simantics.g3d.scenegraph.NodeMapProvider; import org.simantics.g3d.scenegraph.base.INode; @@ -186,6 +189,35 @@ public class AnnotatedPropertyTabContributorFactory implements PropertyTabContri } 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; } } } @@ -249,9 +281,22 @@ public class AnnotatedPropertyTabContributorFactory implements PropertyTabContri } } + 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{ @@ -269,6 +314,11 @@ public class AnnotatedPropertyTabContributorFactory implements PropertyTabContri this.id = id; } + @Override + public String getId() { + return id; + } + @Override public int hashCode() { return id.hashCode(); @@ -283,6 +333,11 @@ public class AnnotatedPropertyTabContributorFactory implements PropertyTabContri public String getName() { return name; } + + @Override + public boolean editable() { + return setter != null; + } } private static class CompoundPropertyItem implements IPropertyItem{ @@ -300,6 +355,11 @@ public class AnnotatedPropertyTabContributorFactory implements PropertyTabContri this.id = id; } + @Override + public String getId() { + return id; + } + @Override public int hashCode() { return id.hashCode(); @@ -314,8 +374,55 @@ public class AnnotatedPropertyTabContributorFactory implements PropertyTabContri 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 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 items; @@ -345,8 +452,8 @@ public class AnnotatedPropertyTabContributorFactory implements PropertyTabContri private static class AnnotatedPropertyTab implements IPropertyTab2, NodeListener { //private String id; List contibutedItems; - List resolvedItems = new ArrayList(); - private Map manipulators = new HashMap(); + List resolvedItems = new ArrayList(); + private Map manipulators = new HashMap(); private TableViewer viewer; @@ -407,7 +514,7 @@ public class AnnotatedPropertyTabContributorFactory implements PropertyTabContri @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); @@ -492,10 +599,22 @@ public class AnnotatedPropertyTabContributorFactory implements PropertyTabContri } ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy( viewer) { + Object lastSource = null; + int clickCount = 0; + protected boolean isEditorActivationEvent( ColumnViewerEditorActivationEvent event) { + if (!event.getSource().equals(lastSource)) + clickCount = 0; + + lastSource = event.getSource(); + + if (event.eventType == ColumnViewerEditorActivationEvent.MOUSE_CLICK_SELECTION) + clickCount += 1; + return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION + || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_CLICK_SELECTION && clickCount >= 2 || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR) || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC; } @@ -574,7 +693,7 @@ public class AnnotatedPropertyTabContributorFactory implements PropertyTabContri if (nodeMap != null) break; } - n = (IG3DNode)n.getParent(); + n = (INode)n.getParent(); } boolean readOnly = (node instanceof IStructuralNode && ((IStructuralNode)node).isPartOfInstantiatedModel() && !((IStructuralNode)node).isInstantiatedModelRoot()); @@ -584,14 +703,18 @@ public class AnnotatedPropertyTabContributorFactory implements PropertyTabContri 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 manipulators = createManipulators(compound, node); for (PropertyItem i : manipulators.keySet()) { resolvedItems.add(i); this.manipulators.put(i, manipulators.get(i)); } + } else { + } } @@ -688,7 +811,7 @@ public class AnnotatedPropertyTabContributorFactory implements PropertyTabContri 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) @@ -704,7 +827,7 @@ public class AnnotatedPropertyTabContributorFactory implements PropertyTabContri 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) @@ -713,7 +836,7 @@ public class AnnotatedPropertyTabContributorFactory implements PropertyTabContri } }); } else { - for (PropertyItem item : resolvedItems) { + for (IPropertyItem item : resolvedItems) { delayedUpdate.add(item); } } @@ -729,7 +852,7 @@ public class AnnotatedPropertyTabContributorFactory implements PropertyTabContri } - public PropertyManipulator getManipulator(PropertyItem item) { + public PropertyManipulator getManipulator(IPropertyItem item) { return manipulators.get(item); } @@ -759,10 +882,10 @@ public class AnnotatedPropertyTabContributorFactory implements PropertyTabContri @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; @@ -771,32 +894,52 @@ public class AnnotatedPropertyTabContributorFactory implements PropertyTabContri @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; } @@ -804,14 +947,14 @@ public class AnnotatedPropertyTabContributorFactory implements PropertyTabContri @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); } @@ -824,12 +967,12 @@ public class AnnotatedPropertyTabContributorFactory implements PropertyTabContri @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()); } @@ -845,7 +988,7 @@ public class AnnotatedPropertyTabContributorFactory implements PropertyTabContri @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)