]> 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 1632f32caa5c0d6e58d2d9ff15992ea2a7ab01bb..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 = "Focus Active";
-    private static final String TOOLTIP_APPLY_FOCUS_SETTINGS = "Only Focus Diagram Elements For Active Roles";
-    private static final String TEXT_IGNORE_FOCUS_SETTINGS = "Focus All";
-    private static final String TOOLTIP_IGNORE_FOCUS_SETTINGS = "Focus All Diagram Elements Regardless Of Active Roles";
+    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 = "Show Active";
-    private static final String TOOLTIP_APPLY_VISIBILITY_SETTINGS = "Only Show Diagram Elements For Active Roles";
-    private static final String TEXT_IGNORE_VISIBILITY_SETTINGS = "Show All";
-    private static final String TOOLTIP_IGNORE_VISIBILITY_SETTINGS = "Show All Diagram Elements Regardless Of Active Roles";
+    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
@@ -107,7 +107,7 @@ public class DiagramLayersPage extends Page implements ILayersViewPage {
         boolean toBoolean() {
             switch (this) {
                 case Both:
-                    throw new IllegalStateException("cannot convert Tristate Both to boolean");
+                    throw new IllegalStateException("cannot convert Tristate Both to boolean"); //$NON-NLS-1$
                 case False:
                     return false;
                 case True:
@@ -227,86 +227,132 @@ 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("New");
-        addButton.setToolTipText("Create New Diagram Role");
+        addButton.setText(Messages.DiagramLayersPage_New);
+        addButton.setToolTipText(Messages.DiagramLayersPage_NewTT);
         addButton.addSelectionListener(new SelectionListener() {
 
             String findFreshName(ILayers layers, String proposal) {
@@ -324,13 +370,13 @@ public class DiagramLayersPage extends Page implements ILayersViewPage {
                     if (!match)
                         return name;
                     ++i;
-                    name = proposal + " " + i;
+                    name = proposal + " " + i; //$NON-NLS-1$
                 }
             }
 
             @Override
             public void widgetSelected(SelectionEvent e) {
-                String name = findFreshName(layers, "New Role");
+                String name = findFreshName(layers, Messages.DiagramLayersPage_NewRole);
                 SimpleLayer layer = new SimpleLayer(name);
                 layers.addLayer(layer);
                 layers.activate(layer);
@@ -344,8 +390,8 @@ public class DiagramLayersPage extends Page implements ILayersViewPage {
         });
 
         final Button removeButton = new Button(composite, SWT.NONE);
-        removeButton.setText("Remove");
-        removeButton.setToolTipText("Remove Selected Diagram Role");
+        removeButton.setText(Messages.DiagramLayersPage_Remove);
+        removeButton.setToolTipText(Messages.DiagramLayersPage_RemoveTT);
         removeButton.addSelectionListener(new SelectionListener() {
             @Override
             public void widgetSelected(SelectionEvent e) {
@@ -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
@@ -475,19 +492,19 @@ public class DiagramLayersPage extends Page implements ILayersViewPage {
         viewer = new CheckboxTreeViewer(composite, SWT.BORDER | SWT.FULL_SELECTION );
 
         GridDataFactory.fillDefaults().grab(true, true).span(4, 1).applyTo(viewer.getControl());
-        viewer.getControl().setToolTipText("Selects the diagram to include in the exported document.");
+        viewer.getControl().setToolTipText(Messages.DiagramLayersPage_SelectTT);
         viewer.setAutoExpandLevel(TreeViewer.ALL_LEVELS);
         viewer.getTree().setHeaderVisible(true);
         editor = new TreeEditor(viewer.getTree());
 
         final TreeColumn column1 = new TreeColumn(viewer.getTree(), SWT.LEFT);
-        column1.setText("Role");
+        column1.setText(Messages.DiagramLayersPage_Role);
         column1.setWidth(100);
         final TreeColumn column2 = new TreeColumn(viewer.getTree(), SWT.LEFT);
-        column2.setText("Show");
+        column2.setText(Messages.DiagramLayersPage_Show);
         column2.setWidth(50);
         final TreeColumn column3 = new TreeColumn(viewer.getTree(), SWT.LEFT);
-        column3.setText("Focus");
+        column3.setText(Messages.DiagramLayersPage_Focus);
         column3.setWidth(50);
         viewer.getTree().addListener(SWT.Resize, new Listener() {
             @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;
@@ -551,7 +572,7 @@ 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");
+                    System.out.println("startediting"); //$NON-NLS-1$
 
                     TreeItem[] items = viewer.getTree().getSelection();
                     if(items.length != 1)
@@ -685,7 +706,7 @@ public class DiagramLayersPage extends Page implements ILayersViewPage {
                     ILayer layer  = (ILayer)cell.getElement();
                     cell.setText(layer.getName());
                 } else {
-                    cell.setText("");
+                    cell.setText(""); //$NON-NLS-1$
                 }
             }
         });
@@ -707,6 +728,8 @@ public class DiagramLayersPage extends Page implements ILayersViewPage {
         for(ILayer layer : layers.getVisibleLayers()) {
             viewer.setSubtreeChecked(layer, true);
         }
+
+        composite.layout();
     }
 
     @Override
@@ -761,8 +784,8 @@ public class DiagramLayersPage extends Page implements ILayersViewPage {
                         if(layer instanceof IEditableLayer) {
                             IEditableLayer l = (IEditableLayer)layer;
                             l.setName(text.getText());
-                            System.out.println("renamed layer to " + text.getText());
-                            viewer.refresh();
+                            System.out.println("renamed layer to " + text.getText()); //$NON-NLS-1$
+                            //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) {