package org.trianacode.gui.util.organize;
import org.trianacode.gui.main.TaskComponent;
import org.trianacode.gui.main.TaskGraphPanel;
import org.trianacode.taskgraph.Node;
import org.trianacode.taskgraph.Task;
import org.trianacode.taskgraph.TaskGraph;
import org.trianacode.taskgraph.TaskLayoutUtils;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
/**
* @author Andrew Harrison
* @version 1.0.0 Nov 20, 2010
*/
public class OrganizableTaskGraph {
private TaskGraphPanel panel;
private TaskGraph taskgraph;
private List<OrganizableTask> tasks = new ArrayList<OrganizableTask>();
private List<Edge> edges = new ArrayList<Edge>();
public OrganizableTaskGraph(TaskGraphPanel panel) {
this.panel = panel;
this.taskgraph = panel.getTaskGraph();
TaskComponent[] comps = panel.getTaskComponents();
for (TaskComponent comp : comps) {
Task t = comp.getTaskInterface();
OrganizableTask ot = new OrganizableTask(comp.getComponent(), t);
tasks.add(ot);
}
for (OrganizableTask task : tasks) {
Node[] nodes = task.getTask().getInputNodes();
for (Node node : nodes) {
if (node.isConnected()) {
Task tsk = node.getCable().getSendingTask();
Edge e = new Edge(getTask(tsk), task);
if (!edges.contains(e)) {
edges.add(e);
}
}
}
nodes = task.getTask().getOutputNodes();
for (Node node : nodes) {
if (node.isConnected()) {
Task tsk = node.getCable().getReceivingTask();
Edge e = new Edge(task, getTask(tsk));
if (!edges.contains(e)) {
edges.add(e);
}
}
}
}
}
public TaskGraphPanel getPanel() {
return panel;
}
public Dimension getSize() {
return panel.getContainer().getSize();
}
public void repaint() {
for (OrganizableTask task : tasks) {
task.updatePoint(panel.getLayoutDetails());
}
Task[] ts = new Task[tasks.size()];
for (int i = 0; i < tasks.size(); i++) {
OrganizableTask task = tasks.get(i);
ts[i] = task.getTask();
}
TaskLayoutUtils.translateToOrigin(ts);
panel.getContainer().invalidate();
panel.getContainer().validate();
panel.getContainer().repaint();
}
public void setPanel(TaskGraphPanel panel) {
this.panel = panel;
}
public TaskGraph getTaskgraph() {
return taskgraph;
}
public void setTaskgraph(TaskGraph taskgraph) {
this.taskgraph = taskgraph;
}
public List<OrganizableTask> getTasks() {
return tasks;
}
public void setTasks(List<OrganizableTask> tasks) {
this.tasks = tasks;
}
public OrganizableTask getTask(Task t) {
for (OrganizableTask task : tasks) {
if (task.getTask() == t) {
return task;
}
}
return null;
}
public List<Edge> getEdges() {
return edges;
}
public java.util.List<OrganizableTask> getSuccessors(OrganizableTask t) {
java.util.List<OrganizableTask> ret = new ArrayList<OrganizableTask>();
Node[] nodes = t.getTask().getOutputNodes();
for (Node node : nodes) {
if (node.isConnected()) {
Task tsk = node.getCable().getReceivingTask();
OrganizableTask ot = getTask(tsk);
if (ot != null) {
ret.add(ot);
}
}
}
return ret;
}
public java.util.List<OrganizableTask> getPredecessors(OrganizableTask t) {
java.util.List<OrganizableTask> ret = new ArrayList<OrganizableTask>();
Node[] nodes = t.getTask().getInputNodes();
for (Node node : nodes) {
if (node.isConnected()) {
Task tsk = node.getCable().getSendingTask();
OrganizableTask ot = getTask(tsk);
if (ot != null) {
ret.add(ot);
}
}
}
return ret;
}
public static class Edge {
private OrganizableTask source;
private OrganizableTask dest;
public Edge(OrganizableTask source, OrganizableTask dest) {
this.source = source;
this.dest = dest;
}
public OrganizableTask getSource() {
return source;
}
public OrganizableTask getDest() {
return dest;
}
}
}