]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/DiagramLayersPage.java
Even more fixes to layers
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / diagramEditor / DiagramLayersPage.java
index 895c4bfa25e1afc89b97023ed5c99e36e903b99e..3bce16ccb99da72f42c7a4fd0197c90e2cc676dd 100644 (file)
@@ -56,41 +56,43 @@ import org.simantics.g2d.diagram.DiagramHints;
 import org.simantics.g2d.diagram.IDiagram;
 import org.simantics.g2d.diagram.participant.Selection;
 import org.simantics.g2d.element.ElementClass;
+import org.simantics.g2d.element.ElementHints;
 import org.simantics.g2d.element.IElement;
+import org.simantics.g2d.element.handler.ElementLayerListener;
 import org.simantics.g2d.element.handler.ElementLayers;
 import org.simantics.g2d.layers.IEditableLayer;
 import org.simantics.g2d.layers.ILayer;
 import org.simantics.g2d.layers.ILayers;
+import org.simantics.g2d.layers.ILayers.ILayersListener;
 import org.simantics.g2d.layers.ILayersEditor;
 import org.simantics.g2d.layers.SimpleLayer;
-import org.simantics.g2d.layers.ILayersEditor.ILayersEditorListener;
 import org.simantics.utils.datastructures.Arrays;
+import org.simantics.utils.datastructures.disposable.IDisposable;
+import org.simantics.utils.datastructures.disposable.IDisposeListener;
 import org.simantics.utils.datastructures.hints.HintListenerAdapter;
+import org.simantics.utils.datastructures.hints.IHintContext.Key;
 import org.simantics.utils.datastructures.hints.IHintListener;
 import org.simantics.utils.datastructures.hints.IHintObservable;
-import org.simantics.utils.datastructures.hints.IHintContext.Key;
 import org.simantics.utils.ui.ISelectionUtils;
 
 public class DiagramLayersPage extends Page implements ILayersViewPage {
 
-    private static final String TEXT_APPLY_FOCUS_SETTINGS = Messages.DiagramLayersPage_FocusActive;
-    private static final String TOOLTIP_APPLY_FOCUS_SETTINGS = Messages.DiagramLayersPage_FocusActiveTT;
     private static final String TEXT_IGNORE_FOCUS_SETTINGS = Messages.DiagramLayersPage_FocusAll;
     private static final String TOOLTIP_IGNORE_FOCUS_SETTINGS = Messages.DiagramLayersPage_FocusAllTT;
 
-    private static final String TEXT_APPLY_VISIBILITY_SETTINGS = Messages.DiagramLayersPage_ShowActive;
-    private static final String TOOLTIP_APPLY_VISIBILITY_SETTINGS = Messages.DiagramLayersPage_ShowActiveTT;
     private static final String TEXT_IGNORE_VISIBILITY_SETTINGS = Messages.DiagramLayersPage_ShowAll;
     private static final String TOOLTIP_IGNORE_VISIBILITY_SETTINGS = Messages.DiagramLayersPage_ShowAllTT;
 
     final private ICanvasContext context;
-    final private IDiagram diagram;
     private CheckboxTreeViewer viewer;
+    private Button ignoreVisibilityButton;
+    private Button ignoreFocusButton;
     private Composite composite;
     private TreeEditor editor;
 
     private Collection<IElement> elements = Collections.emptySet();
-
+    private ILayersEditor layers;
+    
     enum Attribute {
         Visible,
         Focusable
@@ -167,19 +169,6 @@ public class DiagramLayersPage extends Page implements ILayersViewPage {
         return null;
     }
 
-    boolean setAttribute(IElement e, ILayer layer, Attribute attribute, boolean value) {
-        ElementClass ec = e.getElementClass();
-        for (ElementLayers el : ec.getItemsByClass(ElementLayers.class)) {
-            switch (attribute) {
-                case Visible:
-                    return el.setVisibility(e, layer, value);
-                case Focusable:
-                    return el.setFocusability(e, layer, value);
-            }
-        }
-        return false;
-    }
-
     Tristate getJointAttribute(Collection<IElement> elements, ILayer layer, Attribute attribute) {
         Tristate state = null;
         for (IElement e : elements) {
@@ -196,13 +185,39 @@ public class DiagramLayersPage extends Page implements ILayersViewPage {
         return state;
     }
 
-    int setAttribute(Collection<IElement> elements, ILayer layer, Attribute attribute, boolean value) {
-        int result = 0;
-        for (IElement e : elements) {
-            if (setAttribute(e, layer, attribute, value))
-                ++result;
+    void setAttribute(Collection<IElement> elements, ILayer layer, Attribute attribute, boolean value) {
+        // Short-circuit the hint updates so that the result will be immediately available for viewer.refresh().
+        // There is no listener for the element layer hints so the viewer won't update the tristates automatically!
+
+        IDiagram diagram = context.getDefaultHintContext().getHint(DiagramHints.KEY_DIAGRAM);
+        ElementLayerListener elementLayerListener = diagram.getHint(DiagramHints.KEY_ELEMENT_LAYER_LISTENER);
+        switch (attribute) {
+            case Visible:
+                for (IElement e : elements) {
+                    Set<ILayer> elementLayers = (Set<ILayer>) e.getHint(ElementHints.KEY_VISIBLE_LAYERS);
+                    if (elementLayers != null) {
+                        if (value)
+                            elementLayers.add(layer);
+                        else
+                            elementLayers.remove(layer);
+                    }
+                    elementLayerListener.visibilityChanged(e, layer, value);
+                }
+                break;
+            case Focusable:
+                for (IElement e : elements) {
+                    Set<ILayer> elementLayers = (Set<ILayer>) e.getHint(ElementHints.KEY_FOCUS_LAYERS);
+                    if (elementLayers != null) {
+                        if (value)
+                            elementLayers.add(layer);
+                        else
+                            elementLayers.remove(layer);
+                    }
+                    elementLayerListener.focusabilityChanged(e, layer, value);
+                }
+                break;
         }
-        return result;
+        elementLayerListener.flush();
     }
 
 
@@ -227,107 +242,151 @@ public class DiagramLayersPage extends Page implements ILayersViewPage {
         }
 
         private void redraw() {
-            viewer.getControl().getDisplay().asyncExec(new Runnable() {
+            if (viewer != null) {
+                viewer.getControl().getDisplay().asyncExec(new Runnable() {
+                    @Override
+                    public void run() {
+                        if (viewer.getControl().isDisposed())
+                            return;
+                        viewer.getControl().redraw();
+                    }
+                });
+            }
+        }
+    };
+    
+    final private IDisposeListener contextDisposeListener = new IDisposeListener() {
+
+        @Override
+        public void onDisposed(IDisposable sender) {
+            if (getControl() != null) getControl().getDisplay().asyncExec(new Runnable() {
                 @Override
                 public void run() {
-                    if (viewer.getControl().isDisposed())
-                        return;
-                    viewer.getControl().redraw();
+                    dispose();
                 }
             });
         }
     };
 
-    public DiagramLayersPage(IDiagram diagram, ICanvasContext context) {
-
-        assert(diagram != null);
-
-        this.diagram = diagram;
+    public DiagramLayersPage(ICanvasContext context) {
         this.context = context;
 
         context.getDefaultHintContext().addKeyHintListener(Selection.SELECTION0, selectionListener);
+        context.addDisposeListener(contextDisposeListener);
     }
 
     @Override
     public void dispose() {
 
         context.getDefaultHintContext().removeKeyHintListener(Selection.SELECTION0, selectionListener);
-
+        context.removeDisposeListener(contextDisposeListener);
+        if (layers != null && layersListener != null) {
+            layers.removeLayersListener(layersListener);
+            layersListener = null;
+        }
         super.dispose();
 
     }
 
     @Override
     public void createControl(Composite parent) {
-
-        final ILayersEditor layers = diagram.getHint(DiagramHints.KEY_LAYERS_EDITOR);
-        layers.addListener(new ILayersEditorListener() {
-
+        composite = new Composite(parent, SWT.NONE);
+        GridLayoutFactory.fillDefaults().numColumns(4).applyTo(composite);
+        
+        IDiagram diagram = context.getDefaultHintContext().getHint(DiagramHints.KEY_DIAGRAM);
+        if (diagram != null) onDiagramSet(diagram);
+        context.getDefaultHintContext().addKeyHintListener(DiagramHints.KEY_DIAGRAM, new IHintListener() {
             @Override
-            public void layerRemoved(ILayer layer) {
-                scheduleRefresh();
+            public void hintChanged(IHintObservable sender, Key key, Object oldValue, Object newValue) {
+                IDiagram diagram = (IDiagram)newValue;
+                onDiagramSet(diagram);
             }
 
             @Override
-            public void layerAdded(ILayer layer) {
-                scheduleRefresh();
+            public void hintRemoved(IHintObservable sender, Key key, Object oldValue) {
             }
 
-            @Override
-            public void layerActivated(ILayer layer) {
-                scheduleRefresh();
-            }
+        });
+    }
+    
+    private void onDiagramSet(IDiagram diagram) {
+        if (diagram != null) {
+            layers = diagram.getHint(DiagramHints.KEY_LAYERS_EDITOR);
+            if (layers != null) initialize(layers, diagram);
+            diagram.addKeyHintListener(DiagramHints.KEY_LAYERS_EDITOR, new IHintListener() {
+                
+                
+                @Override
+                public void hintChanged(IHintObservable sender, Key key, Object oldValue, Object newValue) {
+                    if (newValue != null) {
+                        initialize(layers, diagram);
+                    }
+                }
+                @Override
+                public void hintRemoved(IHintObservable sender, Key key, Object oldValue) {
+                }
 
-            @Override
-            public void layerDeactivated(ILayer layer) {
-                scheduleRefresh();
-            }
+            });
+        }
+    }
 
-            @Override
-            public void ignoreFocusChanged(boolean value) {
-            }
+    private void initialize(ILayersEditor layers, IDiagram diagram) {
+       composite.getDisplay().asyncExec(new Runnable() {
+                       @Override
+                       public void run() {
+                               initialize2(layers, diagram);
+                       }
+       });
+    }
 
-            @Override
-            public void ignoreVisibilityChanged(boolean value) {
-            }
+    private ILayersListener layersListener = new ILayersListener() {
 
-            void scheduleRefresh() {
-                viewer.getControl().getDisplay().asyncExec(new Runnable() {
-                    @Override
-                    public void run() {
-                        viewer.refresh();
-                    }
-                });
+        @Override
+        public void changed() {
+            scheduleRefresh();
+        }
+
+        void scheduleRefresh() {
+            viewer.getControl().getDisplay().asyncExec(new Runnable() {
+                @Override
+                public void run() {
+                    viewer.refresh();
+                    ignoreVisibilityButton.setSelection(layers.getIgnoreVisibilitySettings());
+                    ignoreFocusButton.setSelection(layers.getIgnoreFocusSettings());
+                    if (!context.isDisposed())
+                        context.getContentContext().setDirty();
+                }
+            });
+        }
+    };
+
+    private static String findFreshName(ILayers layers, String proposal) {
+        Set<ILayer> all = layers.getLayers();
+        String name = proposal;
+        int i = 1;
+        while (true) {
+            boolean match = false;
+            for (ILayer layer : all) {
+                if (name.equals(layer.getName())) {
+                    match = true;
+                    break;
+                }
             }
-        });
+            if (!match)
+                return name;
+            ++i;
+            name = proposal + " " + i; //$NON-NLS-1$
+        }
+    }
 
-        composite = new Composite(parent, SWT.NONE);
-        GridLayoutFactory.fillDefaults().numColumns(4).applyTo(composite);
+    private void initialize2(ILayersEditor layers, IDiagram diagram) {
+        layers.addLayersListener(layersListener);
 
         Button addButton = new Button(composite, SWT.NONE);
         addButton.setText(Messages.DiagramLayersPage_New);
         addButton.setToolTipText(Messages.DiagramLayersPage_NewTT);
         addButton.addSelectionListener(new SelectionListener() {
 
-            String findFreshName(ILayers layers, String proposal) {
-                Set<ILayer> all = layers.getLayers();
-                String name = proposal;
-                int i = 1;
-                while (true) {
-                    boolean match = false;
-                    for (ILayer layer : all) {
-                        if (name.equals(layer.getName())) {
-                            match = true;
-                            break;
-                        }
-                    }
-                    if (!match)
-                        return name;
-                    ++i;
-                    name = proposal + " " + i; //$NON-NLS-1$
-                }
-            }
-
             @Override
             public void widgetSelected(SelectionEvent e) {
                 String name = findFreshName(layers, Messages.DiagramLayersPage_NewRole);
@@ -372,6 +431,15 @@ public class DiagramLayersPage extends Page implements ILayersViewPage {
                 if (selectIndex >= 0) {
                     viewer.getTree().select(all[selectIndex]);
                 }
+                context.getThreadAccess().asyncExec(new Runnable() {
+
+                    @Override
+                    public void run() {
+                        if(context.isDisposed()) return;
+                        context.getContentContext().setDirty();
+                    }
+
+                });
             }
 
             @Override
@@ -380,34 +448,15 @@ public class DiagramLayersPage extends Page implements ILayersViewPage {
             }
         });
 
-        String ignoreVisibilityText = TEXT_IGNORE_VISIBILITY_SETTINGS;
-        String ignoreVisibilityTooltip = TOOLTIP_IGNORE_VISIBILITY_SETTINGS;
-        boolean ignoreVisibility = layers.getIgnoreVisibilitySettings();
-        if (ignoreVisibility) {
-            ignoreVisibilityText = TEXT_APPLY_VISIBILITY_SETTINGS;
-            ignoreVisibilityTooltip = TOOLTIP_APPLY_VISIBILITY_SETTINGS;
-        }
-
-        final Button ignoreVisibilityButton = new Button(composite, SWT.NONE);
-        ignoreVisibilityButton.setText(ignoreVisibilityText);
-        ignoreVisibilityButton.setToolTipText(ignoreVisibilityTooltip);
+        ignoreVisibilityButton = new Button(composite, SWT.CHECK);
+        ignoreVisibilityButton.setText(TEXT_IGNORE_VISIBILITY_SETTINGS);
+        ignoreVisibilityButton.setToolTipText(TOOLTIP_IGNORE_VISIBILITY_SETTINGS);
+        ignoreVisibilityButton.setSelection(layers.getIgnoreVisibilitySettings());
         ignoreVisibilityButton.addSelectionListener(new SelectionListener() {
 
             @Override
             public void widgetSelected(SelectionEvent e) {
-                String ignoreText = TEXT_IGNORE_VISIBILITY_SETTINGS;
-                String ignoreTooltip= TOOLTIP_IGNORE_VISIBILITY_SETTINGS;
-                boolean ignore = layers.getIgnoreVisibilitySettings();
-                if(!ignore) {
-                    ignoreText = TEXT_APPLY_VISIBILITY_SETTINGS;
-                    ignoreTooltip = TOOLTIP_APPLY_VISIBILITY_SETTINGS;
-                    layers.setIgnoreVisibilitySettings(true);
-                } else {
-                    layers.setIgnoreVisibilitySettings(false);
-                }
-                ignoreVisibilityButton.setText(ignoreText);
-                ignoreVisibilityButton.setToolTipText(ignoreTooltip);
-                composite.layout();
+                layers.setIgnoreVisibilitySettings(!layers.getIgnoreVisibilitySettings());
                 context.getThreadAccess().asyncExec(new Runnable() {
 
                     @Override
@@ -426,34 +475,15 @@ public class DiagramLayersPage extends Page implements ILayersViewPage {
 
         });
 
-        String ignoreFocusText = TEXT_IGNORE_FOCUS_SETTINGS;
-        String ignoreFocusTooltip = TOOLTIP_IGNORE_FOCUS_SETTINGS;
-        boolean ignoreFocus = layers.getIgnoreFocusSettings();
-        if(ignoreFocus) {
-            ignoreFocusText = TEXT_APPLY_FOCUS_SETTINGS;
-            ignoreFocusTooltip = TOOLTIP_APPLY_FOCUS_SETTINGS;
-        }
-
-        final Button ignoreFocusButton = new Button(composite, SWT.NONE);
-        ignoreFocusButton.setText(ignoreFocusText);
-        ignoreFocusButton.setToolTipText(ignoreFocusTooltip);
+        ignoreFocusButton = new Button(composite, SWT.CHECK);
+        ignoreFocusButton.setText(TEXT_IGNORE_FOCUS_SETTINGS);
+        ignoreFocusButton.setToolTipText(TOOLTIP_IGNORE_FOCUS_SETTINGS);
+        ignoreFocusButton.setSelection(layers.getIgnoreFocusSettings());
         ignoreFocusButton.addSelectionListener(new SelectionListener() {
 
             @Override
             public void widgetSelected(SelectionEvent e) {
-                String ignoreText = TEXT_IGNORE_FOCUS_SETTINGS;
-                String ignoreTooltip = TOOLTIP_IGNORE_FOCUS_SETTINGS;
-                boolean ignore = layers.getIgnoreFocusSettings();
-                if(!ignore) {
-                    ignoreText = TEXT_APPLY_FOCUS_SETTINGS;
-                    ignoreTooltip = TOOLTIP_APPLY_FOCUS_SETTINGS;
-                    layers.setIgnoreFocusSettings(true);
-                } else {
-                    layers.setIgnoreFocusSettings(false);
-                }
-                ignoreFocusButton.setText(ignoreText);
-                ignoreFocusButton.setToolTipText(ignoreTooltip);
-                composite.layout();
+                layers.setIgnoreFocusSettings(!layers.getIgnoreFocusSettings());
                 context.getThreadAccess().asyncExec(new Runnable() {
 
                     @Override
@@ -519,16 +549,20 @@ public class DiagramLayersPage extends Page implements ILayersViewPage {
                     Tristate state = getJointAttribute(elements, lz[index], attribute);
 
                     Color color = null;
-                    switch (state) {
-                        case False:
-                            color = viewer.getTree().getDisplay().getSystemColor(SWT.COLOR_RED);
-                            break;
-                        case True:
-                            color = viewer.getTree().getDisplay().getSystemColor(SWT.COLOR_GREEN);
-                            break;
-                        case Both:
-                            color = viewer.getTree().getDisplay().getSystemColor(SWT.COLOR_GRAY);
-                            break;
+                    if (state == null) {
+                        color = viewer.getTree().getDisplay().getSystemColor(SWT.COLOR_GRAY);
+                    } else {
+                        switch (state) {
+                            case False:
+                                color = viewer.getTree().getDisplay().getSystemColor(SWT.COLOR_RED);
+                                break;
+                            case True:
+                                color = viewer.getTree().getDisplay().getSystemColor(SWT.COLOR_GREEN);
+                                break;
+                            case Both:
+                                color = viewer.getTree().getDisplay().getSystemColor(SWT.COLOR_GRAY);
+                                break;
+                        }
                     }
 
                     GC gc = event.gc;
@@ -551,8 +585,6 @@ public class DiagramLayersPage extends Page implements ILayersViewPage {
                     // FIXME: Eclipse currently eats F2 presses. This should be
                     // implemented as a command handler or find some way to
                     // force these listeners to have priority...
-                    System.out.println("startediting"); //$NON-NLS-1$
-
                     TreeItem[] items = viewer.getTree().getSelection();
                     if(items.length != 1)
                         return;
@@ -594,18 +626,16 @@ public class DiagramLayersPage extends Page implements ILayersViewPage {
                 rect = item.getBounds(1);
                 if (rect.contains(pt)) {
                     Tristate state = getJointAttribute(elements, layer, Attribute.Visible);
-                    if (setAttribute(elements, layer, Attribute.Visible, state.toggle().toBoolean()) > 0) {
-                        refresh();
-                    }
+                    setAttribute(elements, layer, Attribute.Visible, state.toggle().toBoolean());
+                    refresh();
                     return;
                 }
 
                 Rectangle rect2 = item.getBounds(2);
                 if (rect2.contains(pt)) {
                     Tristate state = getJointAttribute(elements, layer, Attribute.Focusable);
-                    if (setAttribute(elements, layer, Attribute.Focusable, state.toggle().toBoolean()) > 0) {
-                        refresh();
-                    }
+                    setAttribute(elements, layer, Attribute.Focusable, state.toggle().toBoolean());
+                    refresh();
                     return;
                 }
             }
@@ -707,6 +737,8 @@ public class DiagramLayersPage extends Page implements ILayersViewPage {
         for(ILayer layer : layers.getVisibleLayers()) {
             viewer.setSubtreeChecked(layer, true);
         }
+
+        composite.layout();
     }
 
     @Override
@@ -760,8 +792,8 @@ public class DiagramLayersPage extends Page implements ILayersViewPage {
                     case SWT.FocusOut:
                         if(layer instanceof IEditableLayer) {
                             IEditableLayer l = (IEditableLayer)layer;
-                            l.setName(text.getText());
-                            System.out.println("renamed layer to " + text.getText()); //$NON-NLS-1$
+                            String name = findFreshName(layers, text.getText());
+                            l.setName(name);
                             viewer.refresh();
                         }
 
@@ -808,9 +840,11 @@ public class DiagramLayersPage extends Page implements ILayersViewPage {
                             case SWT.TRAVERSE_RETURN:
                                 if(layer instanceof IEditableLayer) {
                                     IEditableLayer l = (IEditableLayer)layer;
-                                    l.setName(text.getText());
-                                    //System.out.println("renamed layer to " + text.getText());
+                                    String name = findFreshName(layers, text.getText());
+                                    l.setName(name);
                                     viewer.refresh();
+                                    //System.out.println("renamed layer to " + text.getText());
+                                    //viewer.refresh();
                                 }
                                 //                                     error = modifier.isValid(text.getText());
                                 //                                     if (error == null) {