/*******************************************************************************
* Copyright (c) 2009 Red Hat, Inc.
* 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:
* Red Hat - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.callgraph;
import java.util.ArrayList;
import java.util.Map.Entry;
import java.util.TreeSet;
import org.eclipse.zest.layouts.algorithms.GridLayoutAlgorithm;
import org.eclipse.zest.layouts.dataStructures.InternalNode;
import org.eclipse.zest.layouts.dataStructures.InternalRelationship;
/**
* Calculates the size and location of a node when rendering the
* Aggregate View. This avoids needing to design a Layout Algorithm
* from scratch.
*/
public class AggregateLayoutAlgorithm extends GridLayoutAlgorithm{
private ArrayList<Long> list;
private Long totalTime;
private int graphWidth;
/**
* Layout algorithm for the Aggregate View in Eclipse Callgraph, based on the GridLayoutAlgorithm in Zest.
* @param styles
* @param entries
* @param time
* @param width
*/
public AggregateLayoutAlgorithm(int styles, TreeSet<Entry<String, Long>> entries, Long time, int width){
super(styles);
list = new ArrayList<>();
for (Entry<String, Long> ent : entries) {
list.add(ent.getValue());
}
this.totalTime = time;
this.graphWidth = width;
}
/**
* Called at the end of the layout algorithm -- change the size and colour
* of each node according to times called/total time
*/
@Override
protected void postLayoutAlgorithm(InternalNode[] entitiesToLayout,
InternalRelationship[] relationshipsToConsider) {
final int minimumSize = 40;
double xcursor = 0.0;
double ycursor = 0.0;
for (InternalNode sn : entitiesToLayout) {
Long time = list.remove(0);
double percent = (double) time / (double) totalTime;
double snWidth = (sn.getInternalWidth() * percent) + minimumSize;
double snHeight = (sn.getInternalHeight() * percent) + minimumSize;
sn.setSize(snWidth, snHeight);
if (xcursor + snWidth > graphWidth) {
//reaching the end of row, move to lower column
ycursor += snHeight;
xcursor = 0;
sn.setLocation(xcursor, ycursor);
} else {
sn.setLocation(xcursor, ycursor);
xcursor += snWidth;
}
}
}
}