1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
\r
3 * in Industry THTH ry.
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.g2d.diagram.participant;
\r
14 import java.util.Map;
\r
16 import org.simantics.g2d.diagram.IDiagram;
\r
17 import org.simantics.g2d.diagram.IDiagram.CompositionListener;
\r
18 import org.simantics.g2d.diagram.handler.CanvasListener;
\r
19 import org.simantics.g2d.element.IElement;
\r
20 import org.simantics.utils.datastructures.hints.HintContext;
\r
21 import org.simantics.utils.datastructures.hints.IHintContext;
\r
22 import org.simantics.utils.datastructures.hints.IHintContext.Key;
\r
25 * DiagramParticipant sends events to CanvasMonitors (=diagram handler)
\r
27 * DiagramParticipant must be added to canvas context before diagram is set.
\r
29 * @author Toni Kalajainen
\r
31 public class DiagramParticipant extends AbstractDiagramParticipant {
\r
33 IHintContext ctx = new HintContext();
\r
36 * Diagram composition listener
\r
38 CompositionListener listener = new CompositionListener() {
\r
40 public void onElementAdded(IDiagram d, IElement e) {
\r
44 public void onElementRemoved(IDiagram d, IElement e) {
\r
45 // TODO Remove element variables... somehow efficiently
\r
50 protected void onDiagramSet(IDiagram newDiagram, IDiagram oldDiagram) {
\r
51 if (clazz==null) return;
\r
52 for (CanvasListener cm : clazz.getItemsByClass(CanvasListener.class))
\r
53 cm.onAddedToCanvas(newDiagram, getContext());
\r
55 if (newDiagram==null)
\r
56 for (Key key : ctx.getHints().keySet())
\r
57 ctx.removeHint(key);
\r
59 if (oldDiagram!=null) oldDiagram.removeCompositionListener(listener);
\r
60 if (newDiagram!=null) newDiagram.addCompositionListener(listener);
\r
63 public void setElementHint(IElement e, Key key, Object value)
\r
65 Key elementCtxKey = new ElementCtxKey(e);
\r
66 IHintContext elementCtx = ctx.getHint(elementCtxKey);
\r
67 if (elementCtx==null) {
\r
68 elementCtx = new HintContext();
\r
69 ctx.setHint(elementCtxKey, elementCtx);
\r
71 elementCtx.setHint(key, value);
\r
74 public <E> E getElementHint(IElement e, Key key)
\r
76 Key elementCtxKey = new ElementCtxKey(e);
\r
77 IHintContext elementCtx = ctx.getHint(elementCtxKey);
\r
78 if (elementCtx==null) return null;
\r
79 return elementCtx.getHint(key);
\r
82 public Map<Key, Object> getElementHints(IElement e)
\r
84 Key elementCtxKey = new ElementCtxKey(e);
\r
85 IHintContext elementCtx = ctx.getHint(elementCtxKey);
\r
86 if (elementCtx==null) return null;
\r
87 return elementCtx.getHints();
\r
90 public <E> E removeElementHint(IElement e, Key key)
\r
92 Key elementCtxKey = new ElementCtxKey(e);
\r
93 IHintContext elementCtx = ctx.getHint(elementCtxKey);
\r
94 if (elementCtx==null) return null;
\r
95 return elementCtx.removeHint(key);
\r
98 public void setDiagramHint(IDiagram d, Key key, Object value)
\r
100 ctx.setHint(key, value);
\r
103 public <E> E removeDiagramHint(IDiagram d, Key key)
\r
105 return ctx.removeHint(key);
\r
108 @SuppressWarnings("unused")
\r
109 private class DiagramKey extends Key {
\r
110 public final IDiagram d;
\r
111 private final int hash;
\r
112 public final Key key;
\r
114 public DiagramKey(IDiagram d, Key key)
\r
120 this.hash = key.hashCode() ^ d.hashCode();
\r
123 public int hashCode() {
\r
127 public boolean equals(Object obj) {
\r
128 if (!(obj instanceof DiagramKey)) return false;
\r
129 DiagramKey other = (DiagramKey) obj;
\r
130 if (other.key.equals(key)) return false;
\r
131 if (other.d != d) return false;
\r
135 public boolean isValueAccepted(Object value) {
\r
136 return key.isValueAccepted(value);
\r
141 private class ElementKey extends Key {
\r
142 public final IElement e;
\r
143 private final int hash;
\r
144 public final Key key;
\r
146 public ElementKey(IElement e, Key key)
\r
152 this.hash = key.hashCode() ^ e.hashCode();
\r
155 public int hashCode() {
\r
159 public boolean equals(Object obj) {
\r
160 if (!(obj instanceof ElementKey)) return false;
\r
161 ElementKey other = (ElementKey) obj;
\r
162 if (other.e != e) return false;
\r
163 if (!other.key.equals(key)) return false;
\r
167 public boolean isValueAccepted(Object value) {
\r
168 return key.isValueAccepted(value);
\r
172 private class ElementCtxKey extends Key {
\r
173 public final IElement e;
\r
175 public ElementCtxKey(IElement e)
\r
181 public int hashCode() {
\r
182 return e.hashCode();
\r
185 public boolean equals(Object obj) {
\r
186 if (!(obj instanceof ElementCtxKey)) return false;
\r
187 ElementCtxKey other = (ElementCtxKey) obj;
\r
188 return other.e == e;
\r
191 public boolean isValueAccepted(Object value) {
\r
192 return value instanceof IHintContext;
\r