/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.diagram.ui.notation.uml; import org.eclipse.draw2d.Figure; import org.eclipse.swt.graphics.Image; import org.teiid.designer.diagram.ui.DiagramUiPlugin; import org.teiid.designer.diagram.ui.IDiagramType; import org.teiid.designer.diagram.ui.figure.DiagramFigure; import org.teiid.designer.diagram.ui.model.DiagramModelNode; import org.teiid.designer.diagram.ui.notation.NotationFigureGenerator; import org.teiid.designer.diagram.ui.notation.uml.figure.UmlAssociationFigure; import org.teiid.designer.diagram.ui.notation.uml.figure.UmlAttributeFigure; import org.teiid.designer.diagram.ui.notation.uml.figure.UmlClassifierContainerFigure; import org.teiid.designer.diagram.ui.notation.uml.figure.UmlClassifierFigure; import org.teiid.designer.diagram.ui.notation.uml.figure.UmlOperationFigure; import org.teiid.designer.diagram.ui.notation.uml.figure.UmlPackageFigure; import org.teiid.designer.diagram.ui.notation.uml.model.UmlAssociationNode; import org.teiid.designer.diagram.ui.notation.uml.model.UmlAttributeNode; import org.teiid.designer.diagram.ui.notation.uml.model.UmlClassifierContainerNode; import org.teiid.designer.diagram.ui.notation.uml.model.UmlClassifierNode; import org.teiid.designer.diagram.ui.notation.uml.model.UmlModelNode; import org.teiid.designer.diagram.ui.notation.uml.model.UmlOperationNode; import org.teiid.designer.diagram.ui.notation.uml.model.UmlPackageNode; import org.teiid.designer.diagram.ui.util.colors.ColorPalette; import org.teiid.designer.diagram.ui.util.colors.ColorPaletteManager; import org.teiid.designer.metamodels.diagram.Diagram; import org.teiid.designer.ui.viewsupport.ModelUtilities; /** * UmlFigureGenerator * * @since 8.0 */ public class UmlFigureGenerator implements NotationFigureGenerator { private static final int UML_CLASS = 1; private static final int UML_PACKAGE = 2; private static final int UML_CLASS_CONTAINER = 3; private static final int UML_ATTRIBUTE = 4; private static final int UML_ASSOCIATION = 5; private static final int UML_OPERATION = 6; private static final int UML_CLASS_IN_CLASS = 7; /** * Construct an instance of UmlFigureGenerator. * */ public UmlFigureGenerator() { super(); } @Override public Figure createFigure(Object modelObject) { int objectType = getObjectType(modelObject); Figure newFigure = null; ColorPalette colorPalette = null; switch( objectType ) { case UML_PACKAGE: { UmlPackageNode node = (UmlPackageNode)modelObject; String nodeName = node.getName(); Image icon = null; if( node.getModelObject() != null ) { colorPalette = getColorPalette(node); icon = getImage(node); } if( nodeName == null || nodeName.equalsIgnoreCase("null")) //$NON-NLS-1$ nodeName = "UnknownPackage"; //$NON-NLS-1$ String path = node.getPath(); if( node.hideLocation()) path = null; newFigure = new UmlPackageFigure(node.getStereotype(), nodeName, path, icon, colorPalette); } break; case UML_CLASS_IN_CLASS: { UmlClassifierNode node = (UmlClassifierNode)modelObject; Image icon = null; if( node.getModelObject() != null ) { colorPalette = getColorPalette(node); icon = getImage(node); } newFigure = new UmlClassifierFigure(node, node.getStereotype(), node.getName(), null, icon, colorPalette); } break; case UML_CLASS: { UmlClassifierNode node = (UmlClassifierNode)modelObject; Image icon = null; if( node.getModelObject() != null ) { colorPalette = getColorPalette(node); icon = getImage(node); } String path = node.getPath(); if( node.hideLocation()) path = null; newFigure = new UmlClassifierFigure(node, node.getStereotype(), node.getName(), path, icon, colorPalette); } break; case UML_CLASS_CONTAINER: { DiagramModelNode node = (DiagramModelNode)modelObject; colorPalette = getColorPalette(node); newFigure = new UmlClassifierContainerFigure(node, colorPalette); } break; case UML_ATTRIBUTE: { UmlAttributeNode node = (UmlAttributeNode)modelObject; String signature = node.getSignature(); Image icon = null; if( node.getModelObject() != null ) { colorPalette = getColorPalette(node); icon = getImage(node); } UmlAttributeFigure figure = new UmlAttributeFigure(signature, icon, colorPalette); figure.updateForType(node); newFigure = figure; } break; case UML_ASSOCIATION: { UmlAssociationNode node = (UmlAssociationNode)modelObject; String signature = node.getSignature(); Image icon = null; if( node.getModelObject() != null ) { colorPalette = getColorPalette(node); icon = getImage(node); } newFigure = new UmlAssociationFigure(signature, icon, colorPalette); } break; case UML_OPERATION: { UmlOperationNode node = (UmlOperationNode)modelObject; String signature = node.getSignature(); Image icon = null; if( node.getModelObject() != null ) { colorPalette = getColorPalette(node); icon = getImage(node); } newFigure = new UmlOperationFigure(signature, icon, colorPalette); } break; } if( newFigure != null && modelObject instanceof DiagramModelNode ) { DiagramModelNode node = (DiagramModelNode)modelObject; ((DiagramFigure)newFigure).setDiagramModelNode(node); if( node.hasErrors()) ((DiagramFigure)newFigure).updateForError(true); else if( node.hasWarnings() ) ((DiagramFigure)newFigure).updateForWarning(true); } return newFigure; } protected int getObjectType( Object modelObject ) { int objectType = -1; if( modelObject != null ) { if (modelObject instanceof UmlPackageNode) { objectType = UML_PACKAGE; } else if (modelObject instanceof UmlClassifierNode) { if( ((DiagramModelNode)modelObject).getParent() instanceof UmlClassifierContainerNode ) objectType = UML_CLASS_IN_CLASS; else objectType = UML_CLASS; } else if (modelObject instanceof UmlClassifierContainerNode){ objectType = UML_CLASS_CONTAINER; } else if (modelObject instanceof UmlAttributeNode) { objectType = UML_ATTRIBUTE; } else if (modelObject instanceof UmlAssociationNode) { objectType = UML_ASSOCIATION; } else if (modelObject instanceof UmlOperationNode) { objectType = UML_OPERATION; } } return objectType; } public ColorPaletteManager getColorPaletteManager(DiagramModelNode modelObject) { int objectType = getObjectType(modelObject); ColorPaletteManager cpm = null; String diagramType = null; DiagramModelNode dmn = null; // Need to get the "Diagram" for a diagramModelObject if( objectType == UML_PACKAGE || objectType == UML_CLASS ) { dmn = modelObject.getParent(); } else if( objectType == UML_CLASS_CONTAINER ) { DiagramModelNode classNode = modelObject.getParent(); dmn = classNode.getParent(); } else if( objectType == UML_ATTRIBUTE || objectType == UML_ASSOCIATION || objectType == UML_OPERATION ) { DiagramModelNode parentClassNode = modelObject.getParent().getParent(); if( getObjectType(parentClassNode) == UML_CLASS_IN_CLASS) { return getColorPaletteManager(parentClassNode); } DiagramModelNode classContainerNode = modelObject.getParent(); dmn = classContainerNode.getParent().getParent(); } else if(objectType == UML_CLASS_IN_CLASS) { DiagramModelNode classContainerNode = modelObject.getParent(); DiagramModelNode parentClassNode = classContainerNode.getParent(); return getColorPaletteManager(parentClassNode); } if( dmn != null ) { diagramType = ((Diagram)dmn.getModelObject()).getType(); if( diagramType != null) { IDiagramType diagram = DiagramUiPlugin.getDiagramTypeManager().getDiagram(diagramType); if( diagram != null ) { cpm = diagram.getColorPaletteManager(); } } } return cpm; } private Image getImage(DiagramModelNode node ) { Image icon = null; if( node instanceof UmlModelNode ) { icon = ModelUtilities.getModelObjectLabelProvider().getImage(node.getModelObject()); } if( icon == null ) icon = DiagramUiPlugin.getDiagramNotationManager().getLabelProvider().getImage(node.getModelObject()); return icon; } private ColorPalette getColorPalette(DiagramModelNode inputNode) { int objectType = getObjectType(inputNode); DiagramModelNode dmn = inputNode; // Container nodes don't have an EObject model object, so in this case // we get it's diagramNode parent. if( objectType == UML_CLASS_CONTAINER ) { dmn = inputNode.getParent(); } return getColorPaletteManager(dmn).getColorPalette(dmn.getModelObject()); } }