/*
* 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.Collections;
import java.util.Iterator;
import java.util.List;
import org.eclipse.draw2d.geometry.Point;
import org.teiid.designer.diagram.ui.connection.NodeConnectionModel;
import org.teiid.designer.diagram.ui.layout.spring.SpringLayout;
import org.teiid.designer.diagram.ui.model.DiagramModelNode;
/**
* LayoutUtilities
*
* @since 8.0
*/
public class LayoutUtilities {
public static List getSingleNetwork(List connectedNodes) {
DiagramModelNode firstDiagramNode = (DiagramModelNode)connectedNodes.get(0);
List singleNodeNetwork = getLinkedNodesForNode(firstDiagramNode);
if( singleNodeNetwork.isEmpty())
return Collections.EMPTY_LIST;
connectedNodes.removeAll(singleNodeNetwork);
return singleNodeNetwork;
}
public static List getSingleNetwork(List connectedNodes, DiagramModelNode startingNode) {
DiagramModelNode firstDiagramNode = startingNode;
List singleNodeNetwork = getLinkedNodesForNode(firstDiagramNode);
if( singleNodeNetwork.isEmpty())
return Collections.EMPTY_LIST;
connectedNodes.removeAll(singleNodeNetwork);
return singleNodeNetwork;
}
public static List getLinkedNodesForNode(DiagramModelNode theNode ) {
List linkedNodes = new ArrayList();
addLinkedNodesForNode(linkedNodes, theNode);
return linkedNodes;
}
private static void addLinkedNodesForNode(List linkedNodes, DiagramModelNode theNode) {
List connectionList = new ArrayList();
connectionList.addAll(theNode.getSourceConnections());
connectionList.addAll(theNode.getTargetConnections());
Iterator iter = connectionList.iterator();
NodeConnectionModel nextConnection = null;
DiagramModelNode sourceNode = null;
DiagramModelNode targetNode = null;
while( iter.hasNext() ) {
nextConnection = (NodeConnectionModel)iter.next();
sourceNode = (DiagramModelNode)nextConnection.getSourceNode();
targetNode = (DiagramModelNode)nextConnection.getTargetNode();
if( sourceNode != null && !sourceNode.equals(theNode) && !linkedNodes.contains(sourceNode) ) {
linkedNodes.add(sourceNode);
addLinkedNodesForNode(linkedNodes, sourceNode);
}
if( targetNode != null && !targetNode.equals(theNode) && !linkedNodes.contains(targetNode) ) {
linkedNodes.add(targetNode);
addLinkedNodesForNode(linkedNodes, targetNode);
}
}
}
public static int getConnectionCount(List diagramNodes) {
List allConnectionList = new ArrayList();
Iterator iter = diagramNodes.iterator();
DiagramModelNode nextDiagramNode = null;
Object nextNode = null;
while( iter.hasNext() ) {
nextNode = iter.next();
if( nextNode instanceof DiagramModelNode ) {
nextDiagramNode = (DiagramModelNode)nextNode;
allConnectionList.addAll(nextDiagramNode.getSourceConnections());
// Assume here that if we get all the source connections, we get all the
// connections without any duplicates,since all are binary.
}
}
if( allConnectionList.isEmpty() )
return 0;
return allConnectionList.size();
}
public static int runSpringLayout(final LayoutGroup layoutGroup) {
int result = 0;
SpringLayout layout = new SpringLayout(layoutGroup.getLayoutNodes());
layout.setAutoEdgeLength(true);
layout.setEpsilon(5.0);
layout.setStartLocation(20, 20);
// layout.setAutoEdgeLength(true);
// layout.setEdgeLength(200);
// layout.setAutomaticSingleSpacing(true);
// layout.setSpecifyLayoutSize(true);
// layout.setLayoutSize(600);
// layout.setEpsilon(0.5);
// layout.setHorizontalAlignment(SpringLayout.LEFT_ALIGNMENT);
// layout.setUseObjectsSizes(false);
// layout.setVerticalAlignment(SpringLayout.TOP_ALIGNMENT);
int size = (int)layout.getSizeEstimate();
layout.setSpecifyLayoutSize(true);
layout.setLayoutSize(size);
result = layout.run();
return result;
}
public static int runSpringLayout(final LayoutGroup layoutGroup, final int sizeFactor) {
int result = 0;
SpringLayout layout = new SpringLayout(layoutGroup.getLayoutNodes());
layout.setAutoEdgeLength(true);
layout.setEpsilon(5.0);
layout.setStartLocation(20, 20);
// layout.setAutoEdgeLength(true);
// layout.setEdgeLength(200);
// layout.setAutomaticSingleSpacing(true);
// layout.setSpecifyLayoutSize(true);
// layout.setLayoutSize(600);
// layout.setEpsilon(0.5);
// layout.setHorizontalAlignment(SpringLayout.LEFT_ALIGNMENT);
// layout.setUseObjectsSizes(false);
// layout.setVerticalAlignment(SpringLayout.TOP_ALIGNMENT);
int size = (int)layout.getSizeEstimate()*sizeFactor;
layout.setSpecifyLayoutSize(true);
layout.setLayoutSize(size);
result = layout.run();
return result;
}
public static int runTreeLayout(final LayoutGroup layoutGroup) {
int result = 0;
TreeLayout layout = new TreeLayout(layoutGroup.getLayoutNodes(), 10, 10, 1000, 1000);
layout.setRoot((LayoutNode)layoutGroup.getLayoutNodes().get(0));
// layout.setOrientation(TreeLayout.ORIENTATION_ROOT_TOP);
layout.setFixedSpacing(true);
layout.setFixedXSpacing(100);
layout.setFixedYSpacing(100);
layout.setUseObjectsSizes(true);
// layout.setHeight(400);
// layout.setWidth(400);
// layout.setOrientation(MmTreeLayout.ORIENTATION_ROOT_LEFT);
// layout.setFixedSpacing(true);
// layout.setFixedXSpacing(140);
// layout.setFixedYSpacing(140);
// layout.setUseObjectsSizes(true);
result = layout.run();
return result;
}
public static int runTreeLayout(final LayoutGroup layoutGroup, final LayoutNode rootNode) {
int result = 0;
TreeLayout layout = new TreeLayout(layoutGroup.getLayoutNodes(), 10, 10, 1000, 1000);
layout.setRoot(rootNode);
// layout.setOrientation(TreeLayout.ORIENTATION_ROOT_TOP);
layout.setFixedSpacing(true);
layout.setFixedXSpacing(100);
layout.setFixedYSpacing(100);
layout.setUseObjectsSizes(true);
// layout.setHeight(400);
// layout.setWidth(400);
// layout.setOrientation(MmTreeLayout.ORIENTATION_ROOT_LEFT);
// layout.setFixedSpacing(true);
// layout.setFixedXSpacing(140);
// layout.setFixedYSpacing(140);
// layout.setUseObjectsSizes(true);
result = layout.run();
return result;
}
public static int runColumnLayout(final LayoutGroup layoutGroup) {
int startX = 10;
int startY = 10;
ColumnLayout columnLayout = new ColumnLayout(layoutGroup.getLayoutNodes(), startX, startY );
columnLayout.run();
return 0;
}
public static int runColumnLayout(final LayoutGroup layoutGroup, final int padding) {
int startX = 10;
int startY = 10;
ColumnLayout columnLayout = new ColumnLayout(layoutGroup.getLayoutNodes(), startX, startY );
columnLayout.setPadding(padding);
columnLayout.run();
return 0;
}
public static LayoutNode[] getLayoutNodeArray(final List nodes) {
LayoutNode[] nodeArray = new LayoutNode[nodes.size()];
Object nextNode = null;
Iterator iter = nodes.iterator();
int count = 0;
while( iter.hasNext() ) {
nextNode = iter.next();
if(nextNode instanceof LayoutNode ) {
nodeArray[count] = (LayoutNode)nextNode;
count++;
}
}
return nodeArray;
}
public static void justifyAllToCorner(final List nodes) {
// Check to see that minimum initial X,Y of all components is < 11
// else move all components to fill up left/top of window.
Iterator iter = nodes.iterator();
double minX = 9999;
double minY = 9999;
LayoutNode nextComp = null;
double deltaX = 0;
double deltaY = 0;
while( iter.hasNext() ) {
nextComp = (LayoutNode)iter.next();
minX = Math.min( nextComp.getX(), minX );
minY = Math.min( nextComp.getY(), minY );
}
deltaX = minX - 20;
deltaY = minY - 20;
iter = nodes.iterator();
while( iter.hasNext() ) {
nextComp = (LayoutNode)iter.next();
nextComp.setPosition( new Point(nextComp.getX() - deltaX, nextComp.getY() - deltaY) );
}
}
public static void justifyAllToCorner(final Object[] nodes) {
// Check to see that minimum initial X,Y of all components is < 11
// else move all components to fill up left/top of window.
int nNodes = nodes.length;
double minX = 9999;
double minY = 9999;
LayoutNode nextComp = null;
double deltaX = 0;
double deltaY = 0;
for(int i=0; i<nNodes; i++) {
nextComp = (LayoutNode)nodes[i];
minX = Math.min( nextComp.getX(), minX );
minY = Math.min( nextComp.getY(), minY );
}
deltaX = minX - 20;
deltaY = minY - 20;
for(int i=0; i<nNodes; i++) {
nextComp = (LayoutNode)nodes[i];
nextComp.setPosition( new Point(nextComp.getX() - deltaX, nextComp.getY() - deltaY) );
}
}
public static int getCurrentHeight(final List layoutNodes) {
// Walk through springNodes and get the total width
double currentHeight = 0;
double minH = 9999;
double maxH = -9999;
double nextYPlusH = 0;
Iterator iter = layoutNodes.iterator();
LayoutNode nextNode;
while( iter.hasNext() ) {
nextNode = (LayoutNode)iter.next();
minH = Math.min(minH, nextNode.getY());
nextYPlusH = nextNode.getY() + nextNode.getHeight();
maxH = Math.max(maxH, nextYPlusH);
}
currentHeight = maxH - minH;
return (int)currentHeight;
}
public static int getCurrentHeight(final LayoutNode[] layoutNodes) {
// Walk through springNodes and get the total width
double currentHeight = 0;
double minH = 9999;
double maxH = -9999;
double nextYPlusH = 0;
int nNodes = layoutNodes.length;
LayoutNode nextNode;
for(int i=0; i<nNodes; i++ ) {
nextNode = layoutNodes[i];
minH = Math.min(minH, nextNode.getY());
nextYPlusH = nextNode.getY() + nextNode.getHeight();
maxH = Math.max(maxH, nextYPlusH);
}
currentHeight = maxH - minH;
return (int)currentHeight;
}
}