diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadLeftPane.java b/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadLeftPane.java index 625c45cbb..8546cac01 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadLeftPane.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadLeftPane.java @@ -4,38 +4,73 @@ import java.util.List; import org.zkoss.ganttz.data.resourceload.LoadTimeLine; import org.zkoss.ganttz.data.resourceload.LoadTimelinesGroup; +import org.zkoss.ganttz.util.MutableTreeModel; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.HtmlMacroComponent; import org.zkoss.zul.Div; import org.zkoss.zul.Label; -import org.zkoss.zul.api.Box; +import org.zkoss.zul.Treecell; +import org.zkoss.zul.Treeitem; +import org.zkoss.zul.TreeitemRenderer; +import org.zkoss.zul.Treerow; +import org.zkoss.zul.api.Tree; public class ResourceLoadLeftPane extends HtmlMacroComponent { private final List groups; + private MutableTreeModel modelForTree; public ResourceLoadLeftPane(List groups) { this.groups = groups; + this.modelForTree = createModelForTree(); } - private void addGroups(Box container) { - for (LoadTimelinesGroup loadTimelinesGroup : this.groups) { - LoadTimeLine principal = loadTimelinesGroup.getPrincipal(); - container.appendChild(createFirstLevel(principal)); - for (LoadTimeLine loadTimeLine : loadTimelinesGroup.getChildren()) { - container.appendChild(createSecondLevel(loadTimeLine)); - } - } - } @Override public void afterCompose() { super.afterCompose(); - addGroups(getContainer()); + getContainerTree().setModel(modelForTree); + getContainerTree().setTreeitemRenderer(getRendererForTree()); } - private Box getContainer() { - return (Box) getFellow("leftVBox"); + private TreeitemRenderer getRendererForTree() { + return new TreeitemRenderer() { + @Override + public void render(Treeitem item, Object data) throws Exception { + LoadTimeLine line = (LoadTimeLine) data; + Treerow row = new Treerow(); + Treecell cell = new Treecell(); + Component component = createComponent(line); + item.appendChild(row); + row.appendChild(cell); + cell.appendChild(component); + } + + private Component createComponent(LoadTimeLine line) { + return isTopLevel(line) ? createFirstLevel(line) + : createSecondLevel(line); + } + + private boolean isTopLevel(LoadTimeLine line) { + int[] path = modelForTree.getPath(modelForTree.getRoot(), line); + return path.length == 0; + } + }; + } + + private MutableTreeModel createModelForTree() { + MutableTreeModel result = MutableTreeModel + .create(LoadTimeLine.class); + for (LoadTimelinesGroup loadTimelinesGroup : this.groups) { + LoadTimeLine principal = loadTimelinesGroup.getPrincipal(); + result.addToRoot(principal); + result.add(principal, loadTimelinesGroup.getChildren()); + } + return result; + } + + private Tree getContainerTree() { + return (Tree) getFellow("loadsTree"); } private Component createFirstLevel(LoadTimeLine principal) { diff --git a/ganttzk/src/main/resources/web/ganttz/resourceload/leftPane.zul b/ganttzk/src/main/resources/web/ganttz/resourceload/leftPane.zul index 53a170b74..7de32e384 100644 --- a/ganttzk/src/main/resources/web/ganttz/resourceload/leftPane.zul +++ b/ganttzk/src/main/resources/web/ganttz/resourceload/leftPane.zul @@ -3,6 +3,9 @@ top = self; ]]> - - + + + + + \ No newline at end of file diff --git a/navalplanner-webapp/src/main/webapp/planner/css/ganttzk.css b/navalplanner-webapp/src/main/webapp/planner/css/ganttzk.css index 6cbc457fd..b6e229137 100644 --- a/navalplanner-webapp/src/main/webapp/planner/css/ganttzk.css +++ b/navalplanner-webapp/src/main/webapp/planner/css/ganttzk.css @@ -386,21 +386,7 @@ tr.z-vbox-sep { padding-right: 15px; overflow-y: hidden; } -.resourceloadleftpane .firstlevel { - height:10px; - border: 1px; - margin-bottom:10px; - margin-top:10px; - border-bottom: 1px dotted #CCCCCC; -} -.resourceloadleftpane .secondlevel { - height:10px; - margin-bottom:10px; - margin-top:10px; - margin-left: 8px; - border-bottom: 1px dotted #CCCCCC; -} .resourceloadlist { margin-top: 70px; width: 80%;