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
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) {
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();
}
}
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);
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
}
});
- 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
});
- 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
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;
// 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;
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;
}
}
for(ILayer layer : layers.getVisibleLayers()) {
viewer.setSubtreeChecked(layer, true);
}
+
+ composite.layout();
}
@Override
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();
}
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) {