package org.trianacode.gui.util.organize; import org.trianacode.gui.main.TaskGraphPanel; import org.trianacode.taskgraph.Task; import org.trianacode.taskgraph.TaskGraph; import org.trianacode.taskgraph.TaskGraphUtils; import org.trianacode.taskgraph.interceptor.execution.PoisonTask; import java.util.*; /** * @author Andrew Harrison * @version 1.0.0 Nov 22, 2010 */ public class TreeOrganize { private TaskGraphPanel panel; private TaskGraph taskgraph; private Map<Integer, List<Task>> levels = new HashMap<Integer, List<Task>>(); private List<Task> done = new ArrayList<Task>(); private int longestList = 0; public TreeOrganize(TaskGraphPanel panel) { this.panel = panel; this.taskgraph = panel.getTaskGraph(); } public void organize() { parse(); for (Integer integer : levels.keySet()) { List<Task> tasks = levels.get(integer); setPoints(tasks, integer); } //TaskLayoutUtils.translateToOrigin(taskgraph.getTasks(false), 1); panel.getContainer().invalidate(); panel.getContainer().validate(); panel.getContainer().repaint(); } private void setPoints(List<Task> tasks, int level) { int curr = 0; if (tasks.size() < longestList) { curr = (int) (longestList - tasks.size()) / 2; } for (int i = 0; i < tasks.size(); i++) { Task task = tasks.get(i); if (!(task instanceof PoisonTask)) { double x = 0; double y = 0; int ins = task.getInputNodeCount(); if (ins > 3) { x = ins * 0.2; y = x; } System.out.println("TreeOrganize.setPoints setting xy:" + (level + 1 + x) + " " + (i + curr)); task.setParameter(Task.GUI_X, (level + x) + ""); task.setParameter(Task.GUI_Y, (i + curr + y) + ""); } } } private void parse() { List<Task> roots = TaskGraphUtils.getRootTasks(taskgraph); for (int i = 0; i < roots.size(); i++) { Task task = roots.get(i); setLevel(task, 0, i); } } private void setLevel(Task task, int level, int y) { if (done.contains(task)) { return; } List<Task> tasks = levels.get(level); if (tasks == null) { tasks = new ArrayList<Task>(); tasks.add(new PoisonTask()); } for (int i = 0; i < y; i++) { if (tasks.size() - 1 < i) { tasks.add(new PoisonTask()); } } tasks.add(y, task); Collection<List<Task>> all = levels.values(); for (List<Task> taskList : all) { if (taskList.size() > longestList) { longestList = taskList.size(); } } levels.put(level, tasks); done.add(task); List<Task> children = TaskGraphUtils.getSuccessors(task); for (Task child : children) { setLevel(child, ++level, tasks.size() - 1); } } }