/* * 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.layout; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.teiid.designer.diagram.ui.model.DiagramModelNode; import org.teiid.designer.diagram.ui.util.DiagramUiUtilities; /** * LayoutHelper * This class is designed to provide a diagram a means for breaking down diagram components into managable * * @since 8.0 */ public class LayoutHelper { public static final int NO_LINKS_LAYOUT = 0; public static final int SIMPLE_LAYOUT = 1; // i.e. no circular links public static final int COMPLEX_LAYOUT = 2; // circular links protected DiagramModelNode diagramNode; protected List layoutGroups; protected LayoutGroup unConnectedGroup = null; /** * Construct an instance of LayoutHelper. * */ public LayoutHelper() { super(); } public LayoutHelper(DiagramModelNode diagramNode) { this.diagramNode = diagramNode; // Get the children of the diagramNode and go from there. processNodes(diagramNode.getChildren()); } public LayoutHelper(DiagramModelNode diagramNode, DiagramModelNode startingNode) { this.diagramNode = diagramNode; // Get the children of the diagramNode and go from there. processNodes(diagramNode.getChildren(), startingNode); } public List getLayoutGroups() { return layoutGroups; } public void layoutAll() { // This performs a layout of all layout groups, individually, and then does // a "move" layout to layout the layouts // Then it does a call to tell all layouts to set their final positions of all layoutNodes. Iterator iter = layoutGroups.iterator(); LayoutGroup nextGroup = null; while( iter.hasNext() ) { nextGroup = (LayoutGroup)iter.next(); nextGroup.layout(); } if( unConnectedGroup != null ) unConnectedGroup.layout(); layoutLayouts(); setFinalPositions(); } public void setFinalPositions() { Iterator iter = layoutGroups.iterator(); LayoutGroup nextGroup = null; while( iter.hasNext() ) { nextGroup = (LayoutGroup)iter.next(); nextGroup.setFinalPositions(); } if( unConnectedGroup != null ) unConnectedGroup.setFinalPositions(); } protected void processNodes(List childNodes) { layoutGroups = new ArrayList(); // This method begins to break down the objects in the diagram List nonConnectedModelNodes = DiagramUiUtilities.getNonConnectedModelNodes(getDiagramNode()); if( !nonConnectedModelNodes.isEmpty()) { unConnectedGroup = new LayoutGroup(nonConnectedModelNodes, LayoutHelper.NO_LINKS_LAYOUT); } // Now we have to process the connected nodes and create a LayoutGroup for each network. List connectedModelNodes = DiagramUiUtilities.getConnectedModelNodes(getDiagramNode()); while( !connectedModelNodes.isEmpty() ) { // make a call to a method which returns a group of connected nodes. List connectedNodeList = LayoutUtilities.getSingleNetwork(connectedModelNodes); if( !connectedNodeList.isEmpty() ) layoutGroups.add(new LayoutGroup(connectedNodeList)); } } protected void processNodes(List childNodes, DiagramModelNode startingNode) { DiagramModelNode tempStartingNode = startingNode; layoutGroups = new ArrayList(); // This method begins to break down the objects in the diagram List nonConnectedModelNodes = DiagramUiUtilities.getNonConnectedModelNodes(getDiagramNode()); if( !nonConnectedModelNodes.isEmpty()) { unConnectedGroup = new LayoutGroup(nonConnectedModelNodes, LayoutHelper.NO_LINKS_LAYOUT); } // Now we have to process the connected nodes and create a LayoutGroup for each network. List connectedModelNodes = DiagramUiUtilities.getConnectedModelNodes(getDiagramNode()); while( !connectedModelNodes.isEmpty() ) { // make a call to a method which returns a group of connected nodes. List connectedNodeList = null; if( tempStartingNode != null ) { connectedNodeList = LayoutUtilities.getSingleNetwork(connectedModelNodes, tempStartingNode); // If the starting node has no links, we default to the generic call. if( connectedNodeList.isEmpty() ) { tempStartingNode = null; connectedNodeList = LayoutUtilities.getSingleNetwork(connectedModelNodes); } } else connectedNodeList = LayoutUtilities.getSingleNetwork(connectedModelNodes); if( !connectedNodeList.isEmpty() ) { if( tempStartingNode != null) { layoutGroups.add(new LayoutGroup(connectedNodeList, tempStartingNode)); tempStartingNode = null; }else layoutGroups.add(new LayoutGroup(connectedNodeList)); } } } /** * @return */ public DiagramModelNode getDiagramNode() { return diagramNode; } private void layoutLayouts() { LayoutGroup finalLayoutGroup = null; if( layoutGroups != null && !layoutGroups.isEmpty() ) { finalLayoutGroup = new LayoutGroup(layoutGroups); LayoutUtilities.runColumnLayout(finalLayoutGroup, 100); } if( unConnectedGroup != null ) { if( finalLayoutGroup != null ) { double currentHeight = finalLayoutGroup.getCurrentHeight(); unConnectedGroup.move(20, currentHeight + 150); } } } }