import java.awt.Dimension; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.eclipse.draw2d.geometry.Rectangle; import agg.editor.impl.EdGraGra; import agg.editor.impl.EdGraph; import agg.editor.impl.EdNode; import agg.layout.evolutionary.EvolutionaryGraphLayout; import agg.util.XMLHelper; import agg.xt_basis.BaseFactory; import agg.xt_basis.GraGra; public class GraphLayoutTest { boolean resizing = true; Dimension nextSize = new Dimension(0,0); GraGra basicGrammar; EdGraGra grammar; String fileName; XMLHelper h; public GraphLayoutTest() { } public GraphLayoutTest(String filename) { this.fileName = filename; System.out.println("File name: " + this.fileName); /* load gragra */ this.basicGrammar = load(this.fileName); if (this.basicGrammar != null) { // create EdGraGra instance that allows to use AGG graph layouter this.grammar = new EdGraGra(this.basicGrammar); makeLayout(); // save EdGraGra instance String outName = "out_" + filename; this.grammar.save(outName); System.out.println("Grammar saved in: " + outName); } else System.out.println("Grammar: " + filename + " FAILED!"); } private void makeLayout() { EvolutionaryGraphLayout layouter = new EvolutionaryGraphLayout(100, null); EdGraph graph = this.grammar.getGraph(); graph.doDefaultEvolutionaryGraphLayout(layouter, 50, 20); } @SuppressWarnings("unused") private void testTreeLayout() { EdGraph graph = this.grammar.getGraph();; List<Rectangle> figures = new ArrayList<Rectangle>(); for (EdNode node : graph.getNodes()) { EdNode graphNode = node; Rectangle newRectangle = new Rectangle(node.getX(), node.getY(),node.getWidth(), node.getHeight()); figures.add(newRectangle.expand(10,10)); } List<Rectangle> remaning = new ArrayList<Rectangle>(figures); Map<Integer, Collection<Integer>> columnIntersects = new HashMap<Integer, Collection<Integer>>(); Map<Integer, Collection<Integer>> rowIntersects = new HashMap<Integer, Collection<Integer>>(); for (Rectangle rectangle1 : figures) { remaning.remove(rectangle1); for (Rectangle rectangle2 : remaning) { Rectangle r1 = new Rectangle(rectangle1); Rectangle r2 = new Rectangle(rectangle2); Rectangle intersect = r1.intersect(r2); if (rectangle1.y != rectangle2.y) { if (intersect.height > 0) { Collection<Integer> column = columnIntersects.get(Integer.valueOf(intersect.x)); if (column == null) { column = new ArrayList<Integer>(); columnIntersects.put(Integer.valueOf(intersect.x), column); } column.add(Integer.valueOf(intersect.height)); } } if (rectangle1.x != rectangle2.x && intersect.width > 0) { Collection<Integer> row = rowIntersects.get(Integer.valueOf(intersect.y)); if (row == null) { row = new ArrayList<Integer>(); rowIntersects.put(Integer.valueOf(intersect.y), row); } row.add(Integer.valueOf(intersect.width)); } } } int uniqueColumns = columnIntersects.keySet().size(); int uniqueRows = rowIntersects.keySet().size(); int maxOverlapWidth = 0; int maxOverlapHeight = 0; for (Entry<Integer, Collection<Integer>> entry : columnIntersects.entrySet()) { int overlapHeight = 0; for (Integer columnIntersect : entry.getValue()) { if (columnIntersect.intValue() > overlapHeight) { overlapHeight = columnIntersect.intValue(); } } overlapHeight = overlapHeight * uniqueRows; if (overlapHeight > maxOverlapHeight) { maxOverlapHeight = overlapHeight; } } for (Entry<Integer, Collection<Integer>> entry : rowIntersects.entrySet()) { int overlapWidth = 0; for (Integer rowIntersect : entry.getValue()) { if (rowIntersect.intValue() > overlapWidth) { overlapWidth = rowIntersect.intValue(); } } overlapWidth = overlapWidth * uniqueColumns; if (overlapWidth > maxOverlapWidth) { maxOverlapWidth = overlapWidth; } } if (maxOverlapWidth != 0 || maxOverlapHeight != 0) { this.nextSize.setSize(new Dimension(this.nextSize.width + maxOverlapWidth, this.nextSize.height + maxOverlapHeight)); applyLayout(); } else { this.resizing = false; } } private void applyLayout() { } public static void main(String[] args) { if (args.length == 1) { new GraphLayoutTest(args[0]); } else System.out.println("Input Grammar FAILED!"); } public GraGra load(String fName) { if (fName.endsWith(".ggx")) { this.h = new XMLHelper(); if (this.h.read_from_xml(fName)) { // create a gragra GraGra gra = BaseFactory.theFactory().createGraGra(); this.h.getTopObject(gra); gra.setFileName(fName); return gra; } return null; } return null; } // not used here public void save(GraGra gra, String outFileName) { if (outFileName.endsWith(".ggx")) { XMLHelper xmlh = new XMLHelper(); xmlh.addTopObject(gra); xmlh.save_to_xml(outFileName); } } }