]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/participant/DiagramParticipant.java
Sync git svn branch with SVN repository r33269.
[simantics/platform.git] / bundles / org.simantics.g2d / src / org / simantics / g2d / diagram / participant / DiagramParticipant.java
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
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.g2d.diagram.participant;\r
13 \r
14 import java.util.Map;\r
15 \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
23 \r
24 /**\r
25  * DiagramParticipant sends events to CanvasMonitors (=diagram handler)\r
26  * \r
27  * DiagramParticipant must be added to canvas context before diagram is set.\r
28  * \r
29  * @author Toni Kalajainen\r
30  */\r
31 public class DiagramParticipant extends AbstractDiagramParticipant {\r
32 \r
33     IHintContext ctx = new HintContext();\r
34 \r
35     /**\r
36      * Diagram composition listener\r
37      */\r
38     CompositionListener listener = new CompositionListener() {\r
39         @Override\r
40         public void onElementAdded(IDiagram d, IElement e) {\r
41 \r
42         }\r
43         @Override\r
44         public void onElementRemoved(IDiagram d, IElement e) {\r
45             // TODO Remove element variables...  somehow efficiently\r
46         }\r
47     };\r
48 \r
49     @Override\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
54 \r
55         if (newDiagram==null)\r
56             for (Key key : ctx.getHints().keySet())\r
57                 ctx.removeHint(key);\r
58 \r
59         if (oldDiagram!=null) oldDiagram.removeCompositionListener(listener);\r
60         if (newDiagram!=null) newDiagram.addCompositionListener(listener);\r
61     }\r
62 \r
63     public void setElementHint(IElement e, Key key, Object value)\r
64     {\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
70         }\r
71         elementCtx.setHint(key, value);\r
72     }\r
73 \r
74     public <E> E getElementHint(IElement e, Key key)\r
75     {\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
80     }\r
81 \r
82     public Map<Key, Object> getElementHints(IElement e)\r
83     {\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
88     }\r
89 \r
90     public <E> E removeElementHint(IElement e, Key key)\r
91     {\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
96     }\r
97 \r
98     public void setDiagramHint(IDiagram d, Key key, Object value)\r
99     {\r
100         ctx.setHint(key, value);\r
101     }\r
102 \r
103     public <E> E removeDiagramHint(IDiagram d, Key key)\r
104     {\r
105         return ctx.removeHint(key);\r
106     }\r
107 \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
113 \r
114         public DiagramKey(IDiagram d, Key key)\r
115         {\r
116             super();\r
117             assert(key!=null);\r
118             this.key = key;\r
119             this.d = d;\r
120             this.hash = key.hashCode() ^ d.hashCode();\r
121         }\r
122         @Override\r
123         public int hashCode() {\r
124             return hash;\r
125         }\r
126         @Override\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
132             return true;\r
133         }\r
134         @Override\r
135         public boolean isValueAccepted(Object value) {\r
136             return key.isValueAccepted(value);\r
137         }\r
138 \r
139     }\r
140 \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
145 \r
146         public ElementKey(IElement e, Key key)\r
147         {\r
148             super();\r
149             assert(key!=null);\r
150             this.key = key;\r
151             this.e = e;\r
152             this.hash = key.hashCode() ^ e.hashCode();\r
153         }\r
154         @Override\r
155         public int hashCode() {\r
156             return hash;\r
157         }\r
158         @Override\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
164             return true;\r
165         }\r
166         @Override\r
167         public boolean isValueAccepted(Object value) {\r
168             return key.isValueAccepted(value);\r
169         }\r
170     }\r
171 \r
172     private class ElementCtxKey extends Key {\r
173         public final IElement e;\r
174 \r
175         public ElementCtxKey(IElement e)\r
176         {\r
177             super();\r
178             this.e = e;\r
179         }\r
180         @Override\r
181         public int hashCode() {\r
182             return e.hashCode();\r
183         }\r
184         @Override\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
189         }\r
190         @Override\r
191         public boolean isValueAccepted(Object value) {\r
192             return value instanceof IHintContext;\r
193         }\r
194     }\r
195 \r
196 \r
197 }\r