Coverage Report - org.argouml.uml.diagram.UmlDiagramRenderer
 
Classes in this File Line Coverage Branch Coverage Complexity
UmlDiagramRenderer
1%
1/61
0%
0/70
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  
 }