ItEr16S09RFComportamentoGraficoPlanificadorItEr15S12: Using now MutableTreeModel on ListDetails to avoid invalidation when adding tasks.
This commit is contained in:
parent
a1e26c8370
commit
e2347a01e8
1 changed files with 35 additions and 50 deletions
|
|
@ -1,6 +1,5 @@
|
||||||
package org.zkoss.ganttz;
|
package org.zkoss.ganttz;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
@ -10,6 +9,7 @@ import java.util.Map;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.zkoss.ganttz.TaskDetail.ITaskDetailNavigator;
|
import org.zkoss.ganttz.TaskDetail.ITaskDetailNavigator;
|
||||||
|
import org.zkoss.ganttz.util.MutableTreeModel;
|
||||||
import org.zkoss.ganttz.util.TaskBean;
|
import org.zkoss.ganttz.util.TaskBean;
|
||||||
import org.zkoss.ganttz.util.TaskContainerBean;
|
import org.zkoss.ganttz.util.TaskContainerBean;
|
||||||
import org.zkoss.zk.ui.Component;
|
import org.zkoss.zk.ui.Component;
|
||||||
|
|
@ -18,7 +18,6 @@ import org.zkoss.zk.ui.HtmlMacroComponent;
|
||||||
import org.zkoss.zk.ui.event.Event;
|
import org.zkoss.zk.ui.event.Event;
|
||||||
import org.zkoss.zk.ui.event.EventListener;
|
import org.zkoss.zk.ui.event.EventListener;
|
||||||
import org.zkoss.zk.ui.event.OpenEvent;
|
import org.zkoss.zk.ui.event.OpenEvent;
|
||||||
import org.zkoss.zul.SimpleTreeModel;
|
|
||||||
import org.zkoss.zul.SimpleTreeNode;
|
import org.zkoss.zul.SimpleTreeNode;
|
||||||
import org.zkoss.zul.Tree;
|
import org.zkoss.zul.Tree;
|
||||||
import org.zkoss.zul.TreeModel;
|
import org.zkoss.zul.TreeModel;
|
||||||
|
|
@ -30,12 +29,11 @@ public class ListDetails extends HtmlMacroComponent {
|
||||||
|
|
||||||
private final class TaskBeanRenderer implements TreeitemRenderer {
|
private final class TaskBeanRenderer implements TreeitemRenderer {
|
||||||
public void render(Treeitem item, Object data) throws Exception {
|
public void render(Treeitem item, Object data) throws Exception {
|
||||||
SimpleTreeNode node = (SimpleTreeNode) data;
|
TaskBean taskBean = (TaskBean) data;
|
||||||
TaskBean taskBean = (TaskBean) node.getData();
|
|
||||||
item.setOpen(isOpened(taskBean));
|
item.setOpen(isOpened(taskBean));
|
||||||
final int[] path = tasksTreeModel.getPath(tasksTreeModel.getRoot(),
|
final int[] path = tasksTreeModel.getPath(tasksTreeModel.getRoot(),
|
||||||
node);
|
taskBean);
|
||||||
String cssClass = "depth_"+path.length;
|
String cssClass = "depth_" + path.length;
|
||||||
TaskDetail taskDetail = TaskDetail.create(taskBean,
|
TaskDetail taskDetail = TaskDetail.create(taskBean,
|
||||||
new TreeNavigator(tasksTreeModel, path));
|
new TreeNavigator(tasksTreeModel, path));
|
||||||
if (taskBean instanceof TaskContainerBean) {
|
if (taskBean instanceof TaskContainerBean) {
|
||||||
|
|
@ -44,9 +42,10 @@ public class ListDetails extends HtmlMacroComponent {
|
||||||
Component row = Executions.getCurrent().createComponents(
|
Component row = Executions.getCurrent().createComponents(
|
||||||
"~./ganttz/zul/taskdetail.zul", item, null);
|
"~./ganttz/zul/taskdetail.zul", item, null);
|
||||||
taskDetail.doAfterCompose(row);
|
taskDetail.doAfterCompose(row);
|
||||||
List<Object> rowChildren = row.getChildren();
|
List<Object> rowChildren = row.getChildren();
|
||||||
List<Treecell> treeCells = Planner.findComponentsOfType(Treecell.class, rowChildren);
|
List<Treecell> treeCells = Planner.findComponentsOfType(
|
||||||
for(Treecell cell : treeCells){
|
Treecell.class, rowChildren);
|
||||||
|
for (Treecell cell : treeCells) {
|
||||||
cell.setSclass(cssClass);
|
cell.setSclass(cssClass);
|
||||||
}
|
}
|
||||||
detailsForBeans.put(taskBean, taskDetail);
|
detailsForBeans.put(taskBean, taskDetail);
|
||||||
|
|
@ -78,38 +77,31 @@ public class ListDetails extends HtmlMacroComponent {
|
||||||
private final class TreeNavigator implements ITaskDetailNavigator {
|
private final class TreeNavigator implements ITaskDetailNavigator {
|
||||||
private final int[] pathToNode;
|
private final int[] pathToNode;
|
||||||
|
|
||||||
private final TreeModel treemodel;
|
|
||||||
|
|
||||||
private SimpleTreeNode parentCached;
|
|
||||||
|
|
||||||
private TreeNavigator(TreeModel treemodel, int[] pathToNode) {
|
private TreeNavigator(TreeModel treemodel, int[] pathToNode) {
|
||||||
this.treemodel = treemodel;
|
|
||||||
this.pathToNode = pathToNode;
|
this.pathToNode = pathToNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TaskDetail getAboveDetail() {
|
public TaskDetail getAboveDetail() {
|
||||||
SimpleTreeNode parent = getParent(pathToNode);
|
TaskBean parent = getParent(pathToNode);
|
||||||
int lastPosition = pathToNode[pathToNode.length - 1];
|
int lastPosition = pathToNode[pathToNode.length - 1];
|
||||||
if (lastPosition != 0) {
|
if (lastPosition != 0) {
|
||||||
return getChild(parent, lastPosition - 1);
|
return getChild(parent, lastPosition - 1);
|
||||||
} else if (treemodel.getRoot() != parent) {
|
} else if (tasksTreeModel.getRoot() != parent) {
|
||||||
return detailsForBeans.get(getTaskBean(parent));
|
return detailsForBeans.get(parent);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private TaskDetail getChild(SimpleTreeNode parent, int position) {
|
private TaskDetail getChild(TaskBean parent, int position) {
|
||||||
SimpleTreeNode node = (SimpleTreeNode) parent.getChildren().get(
|
TaskBean child = tasksTreeModel.getChild(parent, position);
|
||||||
position);
|
return detailsForBeans.get(child);
|
||||||
TaskBean bean = getTaskBean(node);
|
|
||||||
return detailsForBeans.get(bean);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TaskDetail getBelowDetail() {
|
public TaskDetail getBelowDetail() {
|
||||||
SimpleTreeNode parent = getParent(pathToNode);
|
TaskBean parent = getParent(pathToNode);
|
||||||
int childCount = parent.getChildCount();
|
int childCount = tasksTreeModel.getChildCount(parent);
|
||||||
int lastPosition = pathToNode[pathToNode.length - 1];
|
int lastPosition = pathToNode[pathToNode.length - 1];
|
||||||
int belowPosition = lastPosition + 1;
|
int belowPosition = lastPosition + 1;
|
||||||
if (belowPosition < childCount) {
|
if (belowPosition < childCount) {
|
||||||
|
|
@ -118,14 +110,12 @@ public class ListDetails extends HtmlMacroComponent {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private SimpleTreeNode getParent(int[] path) {
|
private TaskBean getParent(int[] path) {
|
||||||
if (parentCached != null)
|
TaskBean current = tasksTreeModel.getRoot();
|
||||||
return parentCached;
|
|
||||||
SimpleTreeNode current = (SimpleTreeNode) treemodel.getRoot();
|
|
||||||
for (int i = 0; i < path.length - 1; i++) {
|
for (int i = 0; i < path.length - 1; i++) {
|
||||||
current = (SimpleTreeNode) current.getChildren().get(path[i]);
|
current = tasksTreeModel.getChild(current, path[i]);
|
||||||
}
|
}
|
||||||
return parentCached = current;
|
return current;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -136,9 +126,7 @@ public class ListDetails extends HtmlMacroComponent {
|
||||||
|
|
||||||
private final List<TaskBean> taskBeans;
|
private final List<TaskBean> taskBeans;
|
||||||
|
|
||||||
private SimpleTreeNode rootNode;
|
private MutableTreeModel<TaskBean> tasksTreeModel;
|
||||||
|
|
||||||
private SimpleTreeModel tasksTreeModel;
|
|
||||||
|
|
||||||
private Tree tasksTree;
|
private Tree tasksTree;
|
||||||
|
|
||||||
|
|
@ -150,23 +138,22 @@ public class ListDetails extends HtmlMacroComponent {
|
||||||
return (TaskBean) node.getData();
|
return (TaskBean) node.getData();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<SimpleTreeNode> asSimpleTreeNodes(
|
private static void fillModel(MutableTreeModel<TaskBean> treeModel,
|
||||||
List<TaskBean> taskBeans) {
|
List<TaskBean> taskBeans) {
|
||||||
ArrayList<SimpleTreeNode> result = new ArrayList<SimpleTreeNode>();
|
|
||||||
for (TaskBean taskBean : taskBeans) {
|
for (TaskBean taskBean : taskBeans) {
|
||||||
SimpleTreeNode node = asSimpleTreeNode(taskBean);
|
fillModel(treeModel, treeModel.getRoot(), taskBean);
|
||||||
if (taskBean instanceof TaskContainerBean) {
|
|
||||||
TaskContainerBean container = (TaskContainerBean) taskBean;
|
|
||||||
node.getChildren().addAll(
|
|
||||||
asSimpleTreeNodes(container.getTasks()));
|
|
||||||
}
|
|
||||||
result.add(node);
|
|
||||||
}
|
}
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static SimpleTreeNode asSimpleTreeNode(TaskBean taskBean) {
|
private static void fillModel(MutableTreeModel<TaskBean> treeModel,
|
||||||
return new SimpleTreeNode(taskBean, new ArrayList<SimpleTreeNode>());
|
TaskBean parent, TaskBean node) {
|
||||||
|
treeModel.add(parent, node);
|
||||||
|
if (node instanceof TaskContainerBean) {
|
||||||
|
TaskContainerBean container = (TaskContainerBean) node;
|
||||||
|
for (TaskBean child : container.getTasks()) {
|
||||||
|
fillModel(treeModel, container, child);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Planner getPlanner() {
|
Planner getPlanner() {
|
||||||
|
|
@ -207,16 +194,14 @@ public class ListDetails extends HtmlMacroComponent {
|
||||||
setClass("listdetails");
|
setClass("listdetails");
|
||||||
super.afterCompose();
|
super.afterCompose();
|
||||||
tasksTree = (Tree) getFellow("tasksTree");
|
tasksTree = (Tree) getFellow("tasksTree");
|
||||||
rootNode = new SimpleTreeNode(null, asSimpleTreeNodes(taskBeans));
|
tasksTreeModel = MutableTreeModel.create(TaskBean.class);
|
||||||
tasksTreeModel = new SimpleTreeModel(rootNode);
|
fillModel(tasksTreeModel, taskBeans);
|
||||||
tasksTree.setModel(tasksTreeModel);
|
tasksTree.setModel(tasksTreeModel);
|
||||||
tasksTree.setTreeitemRenderer(new TaskBeanRenderer());
|
tasksTree.setTreeitemRenderer(new TaskBeanRenderer());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addTask(TaskBean taskBean) {
|
private void addTask(TaskBean taskBean) {
|
||||||
rootNode.getChildren().add(
|
tasksTreeModel.add(tasksTreeModel.getRoot(), taskBean);
|
||||||
new SimpleTreeNode(taskBean, new ArrayList<TaskBean>()));
|
|
||||||
tasksTree.setModel(tasksTreeModel);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue