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 = "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
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:
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("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) {
- 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;
- }
- }
-
@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);
});
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) {
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
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
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");
-
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;
}
}
ILayer layer = (ILayer)cell.getElement();
cell.setText(layer.getName());
} else {
- cell.setText("");
+ cell.setText(""); //$NON-NLS-1$
}
}
});
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());
+ 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) {