X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.modeling.ui%2Fsrc%2Forg%2Fsimantics%2Fmodeling%2Fui%2FdiagramEditor%2FDiagramLayersPage.java;h=3bce16ccb99da72f42c7a4fd0197c90e2cc676dd;hb=0bc1e827754b507fc0d7dee0390550253ab88378;hp=895c4bfa25e1afc89b97023ed5c99e36e903b99e;hpb=236aa4e765e0acd6e31cbc42dd9df9c2c23677e2;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/DiagramLayersPage.java b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/DiagramLayersPage.java index 895c4bfa2..3bce16ccb 100644 --- a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/DiagramLayersPage.java +++ b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/DiagramLayersPage.java @@ -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 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 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 elements, ILayer layer, Attribute attribute, boolean value) { - int result = 0; - for (IElement e : elements) { - if (setAttribute(e, layer, attribute, value)) - ++result; + void setAttribute(Collection 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 elementLayers = (Set) 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 elementLayers = (Set) 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 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 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) {