- 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;