Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
UmlDiagramRenderer |
|
| 3.5555555555555554;3.556 |
1 | /* $Id: UmlDiagramRenderer.java 18404 2010-05-26 07:42:05Z bobtarling $ | |
2 | ***************************************************************************** | |
3 | * Copyright (c) 2009 Contributors - see below | |
4 | * All rights reserved. This program and the accompanying materials | |
5 | * are made available under the terms of the Eclipse Public License v1.0 | |
6 | * which accompanies this distribution, and is available at | |
7 | * http://www.eclipse.org/legal/epl-v10.html | |
8 | * | |
9 | * Contributors: | |
10 | * bobtarling | |
11 | ***************************************************************************** | |
12 | * | |
13 | * Some portions of this file was previously release using the BSD License: | |
14 | */ | |
15 | ||
16 | // Copyright (c) 1996-2009 The Regents of the University of California. All | |
17 | // Rights Reserved. Permission to use, copy, modify, and distribute this | |
18 | // software and its documentation without fee, and without a written | |
19 | // agreement is hereby granted, provided that the above copyright notice | |
20 | // and this paragraph appear in all copies. This software program and | |
21 | // documentation are copyrighted by The Regents of the University of | |
22 | // California. The software program and documentation are supplied "AS | |
23 | // IS", without any accompanying services from The Regents. The Regents | |
24 | // does not warrant that the operation of the program will be | |
25 | // uninterrupted or error-free. The end-user understands that the program | |
26 | // was developed for research purposes and is advised not to rely | |
27 | // exclusively on the program for any reason. IN NO EVENT SHALL THE | |
28 | // UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, | |
29 | // SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, | |
30 | // ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF | |
31 | // THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF | |
32 | // SUCH DAMAGE. THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY | |
33 | // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |
34 | // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE | |
35 | // PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF | |
36 | // CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, | |
37 | // UPDATES, ENHANCEMENTS, OR MODIFICATIONS. | |
38 | ||
39 | package org.argouml.uml.diagram; | |
40 | ||
41 | import java.util.Map; | |
42 | ||
43 | import org.argouml.model.Model; | |
44 | import org.argouml.uml.CommentEdge; | |
45 | import org.argouml.uml.diagram.ui.FigCompartment; | |
46 | import org.argouml.uml.diagram.ui.FigCompartmentBox; | |
47 | import org.argouml.uml.diagram.ui.FigEdgeModelElement; | |
48 | import org.tigris.gef.base.Layer; | |
49 | import org.tigris.gef.graph.GraphEdgeRenderer; | |
50 | import org.tigris.gef.graph.GraphNodeRenderer; | |
51 | import org.tigris.gef.presentation.Fig; | |
52 | import org.tigris.gef.presentation.FigEdge; | |
53 | import org.tigris.gef.presentation.FigNode; | |
54 | ||
55 | /** | |
56 | * Factory methods to create Figs based an model elements with supplementary | |
57 | * data provided by a map of name value pairs.<p> | |
58 | * | |
59 | * Provides {@link org.tigris.gef.graph.GraphNodeRenderer#getFigNodeFor( | |
60 | * Object, int, int, Map)} to implement the {@link GraphNodeRenderer} | |
61 | * interface and {@link | |
62 | * org.tigris.gef.graph.GraphEdgeRenderer#getFigEdgeFor(Object, Map)} | |
63 | * to implement the {@link GraphEdgeRenderer} interface. | |
64 | */ | |
65 | 3016 | public abstract class UmlDiagramRenderer |
66 | implements GraphNodeRenderer, GraphEdgeRenderer { | |
67 | ||
68 | /** | |
69 | * @deprecated for 0.27.3 by tfmorris. Only used by | |
70 | * {@link DiagramFactory#createRenderingElement(Object, Object)} | |
71 | * which is itself unused (and now deprecated). | |
72 | */ | |
73 | @Deprecated | |
74 | public FigNode getFigNodeFor( | |
75 | Object node, int x, int y, | |
76 | Map styleAttributes) { | |
77 | 0 | return null; |
78 | // if (node == null) { | |
79 | // throw new IllegalArgumentException( | |
80 | // "A model element must be supplied"); | |
81 | // } | |
82 | // FigNode figNode = null; | |
83 | // if (Model.getFacade().isAComment(node)) { | |
84 | // figNode = new FigComment(); | |
85 | // } else if (Model.getFacade().isAStubState(node)) { | |
86 | // return new FigStubState(); | |
87 | // } else if (Model.getFacade().isAAssociationClass(node)) { | |
88 | // figNode = new FigClassAssociationClass(node, x, y, 10, 10); | |
89 | // } else if (Model.getFacade().isAClass(node)) { | |
90 | // figNode = new FigClass(node, x, y, 10, 10); | |
91 | // } else if (Model.getFacade().isAInterface(node)) { | |
92 | // figNode = new FigInterface(); | |
93 | // } else if (Model.getFacade().isAEnumeration(node)) { | |
94 | // figNode = new FigEnumeration(); | |
95 | // } else if (Model.getFacade().isAStereotype(node)) { | |
96 | // figNode = new FigStereotypeDeclaration(); | |
97 | // } else if (Model.getFacade().isADataType(node)) { | |
98 | // figNode = new FigDataType(); | |
99 | // } else if (Model.getFacade().isAModel(node)) { | |
100 | // figNode = new FigModel(node, x, y); | |
101 | // } else if (Model.getFacade().isASubsystem(node)) { | |
102 | // figNode = new FigSubsystem(node, x, y); | |
103 | // } else if (Model.getFacade().isAPackage(node)) { | |
104 | // figNode = new FigPackage(node, x, y); | |
105 | // } else if (Model.getFacade().isAAssociation(node)) { | |
106 | // figNode = new FigNodeAssociation(); | |
107 | // } else if (Model.getFacade().isAActor(node)) { | |
108 | // figNode = new FigActor(); | |
109 | // } else if (Model.getFacade().isAUseCase(node)) { | |
110 | // figNode = new FigUseCase(); | |
111 | // } else if (Model.getFacade().isAPartition(node)) { | |
112 | // figNode = new FigPartition(); | |
113 | // } else if (Model.getFacade().isACallState(node)) { | |
114 | // figNode = new FigCallState(); | |
115 | // } else if (Model.getFacade().isAObjectFlowState(node)) { | |
116 | // figNode = new FigObjectFlowState(); | |
117 | // } else if (Model.getFacade().isASubactivityState(node)) { | |
118 | // figNode = new FigSubactivityState(); | |
119 | // } else if (Model.getFacade().isAClassifierRole(node)) { | |
120 | // figNode = new FigClassifierRole(); | |
121 | // } else if (Model.getFacade().isAMessage(node)) { | |
122 | // figNode = new FigMessage(); | |
123 | // } else if (Model.getFacade().isANode(node)) { | |
124 | // figNode = new FigMNode(); | |
125 | // } else if (Model.getFacade().isANodeInstance(node)) { | |
126 | // figNode = new FigNodeInstance(); | |
127 | // } else if (Model.getFacade().isAComponent(node)) { | |
128 | // figNode = new FigComponent(); | |
129 | // } else if (Model.getFacade().isAComponentInstance(node)) { | |
130 | // figNode = new FigComponentInstance(); | |
131 | // } else if (Model.getFacade().isAObject(node)) { | |
132 | // figNode = new FigObject(); | |
133 | // } else if (Model.getFacade().isAComment(node)) { | |
134 | // figNode = new FigComment(); | |
135 | // } else if (Model.getFacade().isAActionState(node)) { | |
136 | // figNode = new FigActionState(); | |
137 | // } else if (Model.getFacade().isAFinalState(node)) { | |
138 | // figNode = new FigFinalState(); | |
139 | // } else if (Model.getFacade().isASubmachineState(node)) { | |
140 | // figNode = new FigSubmachineState(); | |
141 | // } else if (Model.getFacade().isAConcurrentRegion(node)) { | |
142 | // figNode = new FigConcurrentRegion(); | |
143 | // } else if (Model.getFacade().isASynchState(node)) { | |
144 | // figNode = new FigSynchState(); | |
145 | // } else if (Model.getFacade().isACompositeState(node)) { | |
146 | // figNode = new FigCompositeState(); | |
147 | // } else if (Model.getFacade().isAState(node)) { | |
148 | // figNode = new FigSimpleState(); | |
149 | // } else if (Model.getFacade().isAPseudostate(node)) { | |
150 | // Object pState = node; | |
151 | // Object kind = Model.getFacade().getKind(pState); | |
152 | // if (Model.getPseudostateKind().getInitial().equals(kind)) { | |
153 | // figNode = new FigInitialState(); | |
154 | // } else if (Model.getPseudostateKind().getChoice() | |
155 | // .equals(kind)) { | |
156 | // figNode = new FigBranchState(); | |
157 | // } else if (Model.getPseudostateKind().getJunction() | |
158 | // .equals(kind)) { | |
159 | // figNode = new FigJunctionState(); | |
160 | // } else if (Model.getPseudostateKind().getFork().equals(kind)) { | |
161 | // figNode = new FigForkState(); | |
162 | // } else if (Model.getPseudostateKind().getJoin().equals(kind)) { | |
163 | // figNode = new FigJoinState(); | |
164 | // } else if (Model.getPseudostateKind().getShallowHistory() | |
165 | // .equals(kind)) { | |
166 | // figNode = new FigShallowHistoryState(); | |
167 | // } else if (Model.getPseudostateKind().getDeepHistory() | |
168 | // .equals(kind)) { | |
169 | // figNode = new FigDeepHistoryState(); | |
170 | // } | |
171 | // } | |
172 | // | |
173 | // if (figNode == null) { | |
174 | // throw new IllegalArgumentException( | |
175 | // "Failed to construct a FigNode for " + node); | |
176 | // } | |
177 | // setStyleAttributes(figNode, styleAttributes); | |
178 | // | |
179 | // return figNode; | |
180 | } | |
181 | ||
182 | /** | |
183 | * Set the fig style according to attributes. <p> | |
184 | * | |
185 | * TODO: This is never used! Can we remove? | |
186 | * | |
187 | * @param fig the fig to style. | |
188 | * @param attributeMap a map of name value pairs | |
189 | */ | |
190 | private void setStyleAttributes(Fig fig, Map<String, String> attributeMap) { | |
191 | String name; | |
192 | String value; | |
193 | 0 | for (Map.Entry<String, String> entry : attributeMap.entrySet()) { |
194 | 0 | name = entry.getKey(); |
195 | 0 | value = entry.getValue(); |
196 | ||
197 | 0 | if(fig instanceof FigCompartmentBox) { |
198 | 0 | FigCompartmentBox fcb = (FigCompartmentBox) fig; |
199 | 0 | if ("operationsVisible".equals(name)) { |
200 | 0 | fcb.showCompartment( |
201 | Model.getMetaTypes().getOperation(), | |
202 | value.equalsIgnoreCase("true")); | |
203 | 0 | } else if ("attributesVisible".equals(name)) { |
204 | 0 | fcb.showCompartment( |
205 | Model.getMetaTypes().getAttribute(), | |
206 | value.equalsIgnoreCase("true")); | |
207 | 0 | } else if ("enumerationLiteralsVisible".equals(name)) { |
208 | 0 | fcb.showCompartment( |
209 | Model.getMetaTypes().getEnumerationLiteral(), | |
210 | value.equalsIgnoreCase("true")); | |
211 | 0 | } else if ("extensionPointVisible".equals(name)) { |
212 | 0 | fcb.showCompartment( |
213 | Model.getMetaTypes().getExtensionPoint(), | |
214 | value.equalsIgnoreCase("true")); | |
215 | } | |
216 | 0 | } |
217 | } | |
218 | 0 | } |
219 | ||
220 | /** | |
221 | * @deprecated for 0.27.3 by tfmorris. Use method of same name which takes | |
222 | * a GraphModel argument in the subclasses of this class. | |
223 | * @see org.tigris.gef.graph.GraphEdgeRenderer#getFigEdgeFor(java.lang.Object, java.util.Map) | |
224 | */ | |
225 | @Deprecated | |
226 | public FigEdge getFigEdgeFor(Object edge, Map styleAttributes) { | |
227 | 0 | return null; |
228 | // if (edge == null) { | |
229 | // throw new IllegalArgumentException("A model edge must be supplied"); | |
230 | // } | |
231 | // FigEdge newEdge = null; | |
232 | // if (Model.getFacade().isAAssociationClass(edge)) { | |
233 | // newEdge = new FigAssociationClass(); | |
234 | // } else if (Model.getFacade().isAAssociationEnd(edge)) { | |
235 | // newEdge = new FigAssociationEnd(); | |
236 | // } else if (Model.getFacade().isAAssociation(edge)) { | |
237 | // newEdge = new FigAssociation(); | |
238 | // } else if (Model.getFacade().isALink(edge)) { | |
239 | // newEdge = new FigLink(); | |
240 | // } else if (Model.getFacade().isAGeneralization(edge)) { | |
241 | // newEdge = new FigGeneralization(); | |
242 | // } else if (Model.getFacade().isAPackageImport(edge)) { | |
243 | // newEdge = new FigPermission(); | |
244 | // } else if (Model.getFacade().isAUsage(edge)) { | |
245 | // newEdge = new FigUsage(); | |
246 | // } else if (Model.getFacade().isADependency(edge)) { | |
247 | // if (Model.getExtensionMechanismsHelper().hasStereotype(edge, | |
248 | // CoreFactory.REALIZE_STEREOTYPE)) { | |
249 | // newEdge = new FigAbstraction(); | |
250 | // } else { | |
251 | // newEdge = new FigDependency(); | |
252 | // } | |
253 | // } else if (edge instanceof CommentEdge) { | |
254 | // newEdge = null; | |
255 | // } else if (Model.getFacade().isAAssociationRole(edge)) { | |
256 | // newEdge = new FigAssociationRole(); | |
257 | // } else if (Model.getFacade().isATransition(edge)) { | |
258 | // newEdge = new FigTransition(); | |
259 | // } else if (Model.getFacade().isAExtend(edge)) { | |
260 | // newEdge = new FigExtend(); | |
261 | // } else if (Model.getFacade().isAInclude(edge)) { | |
262 | // newEdge = new FigInclude(); | |
263 | // } | |
264 | // | |
265 | // if (newEdge == null) { | |
266 | // throw new IllegalArgumentException( | |
267 | // "Failed to construct a FigEdge for " + edge); | |
268 | // } | |
269 | // | |
270 | // return newEdge; | |
271 | } | |
272 | ||
273 | /** | |
274 | * Find the Figs in the given layer that should be the source and | |
275 | * destination and attach these to either end of the FigEdge | |
276 | * @param layer the layer to look for the FigNodes | |
277 | * @param newEdge The edge to attach | |
278 | */ | |
279 | protected final void setPorts(Layer layer, FigEdge newEdge) { | |
280 | 0 | Object modelElement = newEdge.getOwner(); |
281 | 0 | if (newEdge.getSourcePortFig() == null) { |
282 | Object source; | |
283 | 0 | if (modelElement instanceof CommentEdge) { |
284 | 0 | source = ((CommentEdge) modelElement).getSource(); |
285 | } else { | |
286 | 0 | source = Model.getUmlHelper().getSource(modelElement); |
287 | } | |
288 | 0 | FigNode sourceNode = getNodePresentationFor(layer, source); |
289 | 0 | assert (sourceNode != null) : "No FigNode found for " + source; |
290 | 0 | setSourcePort(newEdge, sourceNode); |
291 | } | |
292 | ||
293 | 0 | if (newEdge.getDestPortFig() == null) { |
294 | Object dest; | |
295 | 0 | if (modelElement instanceof CommentEdge) { |
296 | 0 | dest = ((CommentEdge) modelElement).getDestination(); |
297 | } else { | |
298 | 0 | dest = Model.getUmlHelper().getDestination(newEdge.getOwner()); |
299 | } | |
300 | 0 | setDestPort(newEdge, getNodePresentationFor(layer, dest)); |
301 | } | |
302 | ||
303 | 0 | if (newEdge.getSourcePortFig() == null |
304 | || newEdge.getDestPortFig() == null) { | |
305 | 0 | throw new IllegalStateException("Edge of type " |
306 | + newEdge.getClass().getName() | |
307 | + " created with no source or destination port"); | |
308 | } | |
309 | 0 | } |
310 | ||
311 | private void setSourcePort(FigEdge edge, FigNode source) { | |
312 | 0 | edge.setSourcePortFig(source); |
313 | 0 | edge.setSourceFigNode(source); |
314 | 0 | } |
315 | ||
316 | private void setDestPort(FigEdge edge, FigNode dest) { | |
317 | 0 | edge.setDestPortFig(dest); |
318 | 0 | edge.setDestFigNode(dest); |
319 | 0 | } |
320 | ||
321 | /** | |
322 | * Get the FigNode from the given layer that represents the given | |
323 | * model element. | |
324 | * The FigNode portion of an association class is returned in preference | |
325 | * to the FigEdge portion. | |
326 | * If no FigNode is found then a FIgEdge is searched for and the FigNode | |
327 | * that acts as its edge port is returned. | |
328 | * @param lay the layer containing the Fig | |
329 | * @param modelElement the model element to find presentation for | |
330 | * @return the FigNode presentation of the model element | |
331 | */ | |
332 | private FigNode getNodePresentationFor(Layer lay, Object modelElement) { | |
333 | 0 | assert modelElement != null : "A modelElement must be supplied"; |
334 | 0 | for (Object fig : lay.getContentsNoEdges()) { |
335 | ||
336 | 0 | if (fig instanceof FigNode |
337 | && modelElement.equals(((FigNode) fig).getOwner())) { | |
338 | 0 | return ((FigNode) fig); |
339 | } | |
340 | } | |
341 | 0 | for (Object fig : lay.getContentsEdgesOnly()) { |
342 | 0 | if (fig instanceof FigEdgeModelElement |
343 | && modelElement.equals(((FigEdgeModelElement) fig) | |
344 | .getOwner())) { | |
345 | 0 | return ((FigEdgeModelElement) fig).getEdgePort(); |
346 | } | |
347 | } | |
348 | 0 | return null; |
349 | } | |
350 | ||
351 | ||
352 | protected FigNode getFigNodeForAssociationEnd( | |
353 | final ArgoDiagram diagram, | |
354 | final Object associationEnd) { | |
355 | 0 | Object classifier = |
356 | Model.getFacade().getClassifier(associationEnd); | |
357 | 0 | return getNodePresentationFor(diagram.getLayer(), classifier); |
358 | } | |
359 | ||
360 | protected void addEdge(Layer lay, FigEdge newEdge, Object edge) { | |
361 | 0 | if (newEdge == null) { |
362 | 0 | throw new IllegalArgumentException( |
363 | "Don't know how to create FigEdge for model type " | |
364 | + edge.getClass().getName()); | |
365 | } | |
366 | ||
367 | 0 | setPorts(lay, newEdge); |
368 | ||
369 | 0 | assert newEdge != null : "There has been no FigEdge created"; |
370 | ||
371 | // newEdge.setDiElement( | |
372 | // GraphChangeAdapter.getInstance().createElement(gm, edge)); | |
373 | ||
374 | 0 | assert newEdge != null : "There has been no FigEdge created"; |
375 | assert (newEdge.getDestFigNode() != null) | |
376 | 0 | : "The FigEdge has no dest node"; |
377 | assert (newEdge.getDestPortFig() != null) | |
378 | 0 | : "The FigEdge has no dest port"; |
379 | assert (newEdge.getSourceFigNode() != null) | |
380 | 0 | : "The FigEdge has no source node"; |
381 | assert (newEdge.getSourcePortFig() != null) | |
382 | 0 | : "The FigEdge has no source port"; |
383 | ||
384 | 0 | lay.add(newEdge); |
385 | 0 | } |
386 | } |