/******************************************************************************* * Copyright 2006, CHISEL Group, University of Victoria, Victoria, BC, Canada. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * The Chisel Group, University of Victoria *******************************************************************************/ package org.eclipse.zest.layouts.algorithms; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import org.eclipse.zest.layouts.LayoutEntity; import org.eclipse.zest.layouts.dataStructures.InternalNode; import org.eclipse.zest.layouts.dataStructures.InternalRelationship; /** * This layout shifts overlapping nodes to the right. * @author Ian Bull */ public class HorizontalShift extends AbstractLayoutAlgorithm { private static final double DELTA = 10; private static final double VSPACING = 2; public HorizontalShift(int styles) { super(styles); } protected void applyLayoutInternal(InternalNode[] entitiesToLayout, InternalRelationship[] relationshipsToConsider, double boundsX, double boundsY, double boundsWidth, double boundsHeight) { ArrayList row = new ArrayList(); for ( int i =0; i < entitiesToLayout.length; i++) { addToRowList(entitiesToLayout[i], row); } int heightSoFar = 0; Collections.sort(row, new Comparator() { public int compare(Object arg0, Object arg1) { // TODO Auto-generated method stub List a0 = (List) arg0; List a1 = (List) arg1; LayoutEntity node0 = ((InternalNode)a0.get(0)).getLayoutEntity(); LayoutEntity node1 = ((InternalNode)a1.get(0)).getLayoutEntity(); return (int) (node0.getYInLayout() - (node1.getYInLayout())); } }); Iterator iterator = row.iterator(); while (iterator.hasNext() ) { List currentRow = (List) iterator.next(); Collections.sort(currentRow, new Comparator() { public int compare(Object arg0, Object arg1) { return (int) (((InternalNode)arg1).getLayoutEntity().getYInLayout() - ((InternalNode)arg0).getLayoutEntity().getYInLayout()); } }); Iterator iterator2 = currentRow.iterator(); int i = 0; int width = (int) ((boundsWidth / 2) - currentRow.size() * 75); heightSoFar += ((InternalNode)currentRow.get(0)).getLayoutEntity().getHeightInLayout() + VSPACING*8 ; while(iterator2.hasNext()) { InternalNode currentNode = (InternalNode) iterator2.next(); double location = width + 10*++i; currentNode.setLocation(location , heightSoFar); width += currentNode.getLayoutEntity().getWidthInLayout(); } } } private void addToRowList( InternalNode node, ArrayList list) { double layoutY = node.getLayoutEntity().getYInLayout(); for ( int i = 0; i < list.size(); i++ ) { List currentRow = (List) list.get(i); InternalNode currentRowNode = (InternalNode) currentRow.get(0); double currentRowY = currentRowNode.getLayoutEntity().getYInLayout(); //double currentRowHeight = currentRowNode.getLayoutEntity().getHeightInLayout(); if ( layoutY >= (currentRowY-DELTA) && layoutY <= currentRowY + DELTA ) { currentRow.add(node); //list.add(i, currentRow); return; } } List newRow = new ArrayList(); newRow.add(node); list.add(newRow); } protected int getCurrentLayoutStep() { // TODO Auto-generated method stub return 0; } protected int getTotalNumberOfLayoutSteps() { // TODO Auto-generated method stub return 0; } protected boolean isValidConfiguration(boolean asynchronous, boolean continuous) { // TODO Auto-generated method stub return true; } protected void postLayoutAlgorithm(InternalNode[] entitiesToLayout, InternalRelationship[] relationshipsToConsider) { // TODO Auto-generated method stub } protected void preLayoutAlgorithm(InternalNode[] entitiesToLayout, InternalRelationship[] relationshipsToConsider, double x, double y, double width, double height) { // TODO Auto-generated method stub } public void setLayoutArea(double x, double y, double width, double height) { // TODO Auto-generated method stub } }