/* * 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.transformation.ui.part; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.draw2d.geometry.Point; import org.eclipse.emf.ecore.EObject; import org.teiid.designer.diagram.ui.layout.DiagramLayout; import org.teiid.designer.diagram.ui.model.DiagramModelNode; import org.teiid.designer.diagram.ui.notation.uml.model.UmlClassifierNode; import org.teiid.designer.diagram.ui.notation.uml.model.UmlPackageNode; import org.teiid.designer.diagram.ui.util.DiagramUiUtilities; import org.teiid.designer.metamodels.diagram.Diagram; import org.teiid.designer.transformation.ui.model.TransformationNode; import org.teiid.designer.transformation.ui.util.TransformationDiagramUtil; /** * TransformationDiagramLayout * * @since 8.0 */ public class TransformationDiagramLayout extends DiagramLayout { public static final int TOP_MARGIN = 50; public static final int LEFT_PANEL_LEFT_MARGIN = 30; public static final int LEFT_PANEL_RIGHT_MARGIN = 30; public static final int RIGHT_PANEL_LEFT_MARGIN = 30; public static final int TABLE_GAP = 20; private DiagramModelNode modelRoot = null; private DiagramModelNode transformationNode = null; private DiagramModelNode diagramModelNode = null; /** * Construct an instance of TransformationDiagramLayout. * */ public TransformationDiagramLayout() { super(); } /** * Construct an instance of TransformationDiagramLayout. * @param newNodes */ public TransformationDiagramLayout(List newNodes) { super(newNodes); } @Override public int run() { if( TransformationDiagramUtil.isTreeLayout()) { layoutInTree(); } else { layoutInPanels(); } return SUCCESSFUL; } public void setDiagramNode(DiagramModelNode diagramModelNode) { clear(); this.diagramModelNode = diagramModelNode; // Let's populate the layout components setTransformation(getTransformationNode()); setRoot(getRootNode()); setSourceNodes(); } public void setRoot(DiagramModelNode rootNode) { modelRoot = rootNode; } public void setTransformation(DiagramModelNode transNode) { transformationNode = transNode; } private void layoutInPanels() { // Make sure root node isn't null - Defect 14331 NPE if( modelRoot == null ) return; // Define three X positions, root, transformation and source stack int rootX = LEFT_PANEL_LEFT_MARGIN; int rootY = TOP_MARGIN; int transX = 0; int transY = 0; int stackX = 0; modelRoot.setPosition(new Point(rootX, rootY)); transY = TOP_MARGIN; //modelRoot.getY() + modelRoot.getHeight()/2 - transformationNode.getHeight()/2; transX = rootX + modelRoot.getWidth() + LEFT_PANEL_RIGHT_MARGIN - transformationNode.getWidth()/2 ; transformationNode.setPosition(new Point(transX, transY)); stackX = rootX + modelRoot.getWidth() + LEFT_PANEL_RIGHT_MARGIN + RIGHT_PANEL_LEFT_MARGIN; if( getComponentCount() > 0 ) { DiagramModelNode[] nodeArray = getNodeArray(); int currentX = stackX; int nNodes = nodeArray.length; for( int i=0; i<nNodes; i++) { DiagramModelNode next = nodeArray[i]; next.setPosition(new Point(currentX, rootY)); currentX += next.getSize().width + TABLE_GAP; } } } private void layoutInTree() { // Make sure root node isn't null - Defect 14331 NPE if( modelRoot == null ) return; // Define three X positions, root, transformation and source stack int rootX = 10; int rootY = 10; int transX = 0; int transY = 0; int stackX = 0; int minNodeWidth = 9999; int minNodeHeight = 9999; int maxNodeWidth = 0; int maxNodeHeight = 0; int stackHeight = 0; modelRoot.setPosition(new Point(rootX, rootY)); transY = modelRoot.getY() + modelRoot.getHeight()/2 - transformationNode.getHeight()/2; transformationNode.setPosition(new Point(transX, transY)); transX = rootX + modelRoot.getWidth() + 90; stackX = transX + transformationNode.getWidth() + 120; if( getComponentCount() > 0 ) { DiagramModelNode[] nodeArray = getNodeArray(); int currentY = TOP_MARGIN; int nNodes = nodeArray.length; for( int i=0; i<nNodes; i++) { DiagramModelNode next = nodeArray[i]; maxNodeWidth = Math.max( next.getSize().width, maxNodeWidth ); maxNodeHeight = Math.max( next.getSize().height, maxNodeHeight ); minNodeWidth = Math.min( next.getSize().width, minNodeWidth ); minNodeHeight = Math.min( next.getSize().height, minNodeHeight ); currentY = stackHeight + TOP_MARGIN; next.setPosition(new Point(stackX, currentY)); stackHeight = stackHeight + next.getSize().height + 10; } } // Set rootY if( stackHeight < modelRoot.getHeight() ) { // Do Nothing } else { rootY = stackHeight/2 - modelRoot.getHeight()/2 + 10; modelRoot.setPosition(new Point(rootX, rootY)); } // Set the T Node transY = modelRoot.getY() + modelRoot.getHeight()/2 - transformationNode.getHeight()/2; transformationNode.setPosition(new Point(transX, transY)); } private void setSourceNodes() { Iterator iter = getCurrentSourceNodes().iterator(); DiagramModelNode nextNode = null; while( iter.hasNext() ) { nextNode = (DiagramModelNode)iter.next(); add(nextNode); } } private DiagramModelNode getTransformationNode() { // walk children and look for TransformationNode type Iterator iter = diagramModelNode.getChildren().iterator(); DiagramModelNode nextNode = null; while( iter.hasNext() ) { nextNode = (DiagramModelNode)iter.next(); if( nextNode instanceof TransformationNode ) return nextNode; } return null; } private List getCurrentSourceNodes() { DiagramModelNode rootNode = getRootNode(); List currentSourceNodes = new ArrayList(); Iterator iter = diagramModelNode.getChildren().iterator(); DiagramModelNode nextNode = null; while( iter.hasNext() ) { nextNode = (DiagramModelNode)iter.next(); if( (nextNode instanceof UmlClassifierNode || nextNode instanceof UmlPackageNode) && nextNode != rootNode ) currentSourceNodes.add(nextNode); } return currentSourceNodes; } private DiagramModelNode getRootNode() { DiagramModelNode root = null; DiagramModelNode transformationModelNode = getTransformationNode(); // Get it's target Diagram diagram = transformationModelNode.getDiagram(); if( diagram != null ) { EObject targetObject = diagram.getTarget(); if( targetObject != null ) { root = DiagramUiUtilities.getDiagramModelNode(targetObject, transformationModelNode.getParent()); } } return root; } }