]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.g3d/src/org/simantics/g3d/property/AnnotatedPropertyTabContributorFactory.java
Fix issue with cell editor type mismatch and disable user-entered values
[simantics/3d.git] / org.simantics.g3d / src / org / simantics / g3d / property / AnnotatedPropertyTabContributorFactory.java
index 73526d1c3a60c7216b2d2e18efbea12a64278b5d..15b787d6d91781b8177e5b824c71eb4860cd611d 100644 (file)
@@ -39,7 +39,6 @@ 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;
@@ -67,6 +66,7 @@ import org.eclipse.swt.widgets.Item;
 import org.eclipse.swt.widgets.TableColumn;
 import org.eclipse.swt.widgets.TableItem;
 import org.eclipse.ui.IWorkbenchSite;
+import org.simantics.browsing.ui.swt.ComboBoxCellEditor2;
 import org.simantics.db.management.ISessionContext;
 import org.simantics.g3d.property.annotations.CompoundGetPropertyValue;
 import org.simantics.g3d.property.annotations.CompoundSetPropertyValue;
@@ -599,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;
                                }
@@ -858,7 +870,8 @@ public class AnnotatedPropertyTabContributorFactory implements PropertyTabContri
                int index;
                NodeMap<?,?,?> nodeMap;
                TableViewer viewer;
-               CellEditor editor;
+               CellEditor propertyItemEditor;
+               Map<ComboPropertyItem,CellEditor> comboEditors = new HashMap<>();
 
                public PropertyEditingSupport(AnnotatedPropertyTab tab, TableViewer viewer, int index, NodeMap<?,?,?> nodeMap) {
                        super(viewer);
@@ -885,38 +898,52 @@ public class AnnotatedPropertyTabContributorFactory implements PropertyTabContri
                        IPropertyItem item = (IPropertyItem)element;
                        if (tab.getManipulator(item).getValueCount() <= index)
                                return null;
-                       if (editor == null)
-                           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;
+                       if (item instanceof PropertyItem) {
+                               if (propertyItemEditor == null) {
+                               propertyItemEditor = new TextCellEditor(viewer.getTable(),SWT.NONE) {
+                                       @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 propertyItemEditor;
+                       }
+                       else if (item instanceof ComboPropertyItem) {
+                           ComboPropertyItem comboPropertyItem = (ComboPropertyItem)item;
+                           CellEditor editor = comboEditors.get(comboPropertyItem);
+                           if (editor == null) {
+                                   ComboPropertyManipulator manipulator = (ComboPropertyManipulator)tab.manipulators.get(comboPropertyItem);
+                                   editor = new ComboBoxCellEditor2(viewer.getTable(), manipulator.getItems(), SWT.DROP_DOWN | SWT.READ_ONLY) {
+                                       @Override
+                           public void activate() {
+                               tab.setEditing(true);
+                           }
+                           
+                           @Override
+                           public void deactivate() {
+                               super.deactivate();
+                               tab.setEditing(false);
+                           }    
+                                   };
+                                   
+                                   comboEditors.put(comboPropertyItem, editor);
+                           }
+                           
+                           if (DEBUG) System.err.println("CELL EDITOR: " + element);
+                           return editor;
+                       }
+                       else {
+                               throw new IllegalStateException("Unsupported property item type " + item.getClass().getName());
+                       }
                }
                
                @Override