]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/DiagramLayersPage.java
Bringing layers back to life
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / diagramEditor / DiagramLayersPage.java
index 895c4bfa25e1afc89b97023ed5c99e36e903b99e..87e18ed8e3a9b7818edb33bed324e6cbe58b7dc2 100644 (file)
@@ -61,36 +61,36 @@ 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
@@ -227,82 +227,128 @@ 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) {
+                    // TODO Auto-generated method stub
+                    System.out.println("REM");
+                }
 
-            @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();
+        }
 
-        composite = new Composite(parent, SWT.NONE);
-        GridLayoutFactory.fillDefaults().numColumns(4).applyTo(composite);
+        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 void initialize2(ILayersEditor layers, IDiagram diagram) {
+        layers.addLayersListener(layersListener);
 
         Button addButton = new Button(composite, SWT.NONE);
         addButton.setText(Messages.DiagramLayersPage_New);
@@ -372,6 +418,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 +435,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 +462,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 +536,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;
@@ -707,6 +728,8 @@ public class DiagramLayersPage extends Page implements ILayersViewPage {
         for(ILayer layer : layers.getVisibleLayers()) {
             viewer.setSubtreeChecked(layer, true);
         }
+
+        composite.layout();
     }
 
     @Override
@@ -762,7 +785,7 @@ public class DiagramLayersPage extends Page implements ILayersViewPage {
                             IEditableLayer l = (IEditableLayer)layer;
                             l.setName(text.getText());
                             System.out.println("renamed layer to " + text.getText()); //$NON-NLS-1$
-                            viewer.refresh();
+                            //viewer.refresh();
                         }
 
                         //                                     // Item may be disposed if the tree gets reset after a previous editing.
@@ -810,7 +833,7 @@ public class DiagramLayersPage extends Page implements ILayersViewPage {
                                     IEditableLayer l = (IEditableLayer)layer;
                                     l.setName(text.getText());
                                     //System.out.println("renamed layer to " + text.getText());
-                                    viewer.refresh();
+                                    //viewer.refresh();
                                 }
                                 //                                     error = modifier.isValid(text.getText());
                                 //                                     if (error == null) {