package org.zkoss.ganttz; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.zkoss.ganttz.util.DependencyRegistry; import org.zkoss.ganttz.util.TaskBean; import org.zkoss.zk.ui.ext.AfterCompose; import org.zkoss.zul.impl.XulElement; public class Planner extends XulElement implements AfterCompose { private DependencyAddedListener dependencyAddedListener; private Map tasksById = new HashMap(); private DependencyRegistry dependencyRegistry = new DependencyRegistry(); public Planner() { } private TaskList getTaskList() { List children = findOneComponentOfType(GanttPanel.class) .getChildren(); return Planner.findComponentsOfType(TaskList.class, children).get(0); } private T findOneComponentOfType(Class type) { List result = findComponentsOfType(type, getChildren()); if (result.isEmpty()) { throw new RuntimeException("it should have found a " + type.getSimpleName() + " in " + Planner.class.getSimpleName()); } return result.get(0); } void publish(String taskId, TaskBean task) { if (taskId == null) throw new IllegalArgumentException("taskId cannot be null"); if (task == null) throw new IllegalArgumentException("task cannot be null"); if (tasksById.containsKey(taskId)) throw new IllegalArgumentException("task with id " + taskId + " is already in " + tasksById); tasksById.put(taskId, task); dependencyRegistry.add(task); } TaskBean retrieve(String taskId) { return tasksById.get(taskId); } public static List findComponentsOfType(Class type, List children) { ArrayList result = new ArrayList(); for (Object child : children) { if (type.isInstance(child)) { result.add(type.cast(child)); } } return result; } private GanttPanel getGanntPanel() { return findOneComponentOfType(GanttPanel.class); } private DependencyList getDependencyList() { List children = getGanntPanel().getChildren(); return findComponentsOfType(DependencyList.class, children).get(0); } @Override public void afterCompose() { TaskList taskList = getTaskList(); dependencyAddedListener = new DependencyAddedListener() { @Override public void dependenceAdded(Dependency dependency) { getDependencyList().addDependency(dependency); } }; taskList.addDependencyListener(dependencyAddedListener); taskList.addTaskRemovedListener(new TaskRemovedListener() { @Override public void taskRemoved(Task taskRemoved) { dependencyRegistry.remove(taskRemoved.getTaskBean()); } }); } public void addTask(Task task) { getTaskList().addTask(task); } public void publishDependency(Dependency dependency) { dependencyRegistry.add(dependency); } }