package org.tltv.gantt.demo;
import java.util.Collection;
import java.util.HashSet;
import org.apache.commons.lang3.mutable.MutableInt;
import org.tltv.gantt.Gantt;
import org.tltv.gantt.client.shared.Step;
import com.vaadin.v7.data.util.BeanItemContainer;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.v7.ui.Tree.CollapseEvent;
import com.vaadin.v7.ui.Tree.CollapseListener;
import com.vaadin.v7.ui.Tree.ExpandEvent;
import com.vaadin.v7.ui.Tree.ExpandListener;
import com.vaadin.v7.ui.TreeTable;
import com.vaadin.ui.UI;
public class TreeTableGanttLayout extends HorizontalLayout implements GanttListener {
Gantt gantt;
TreeTable ganttTable;
BeanItemContainer<Step> container;
public TreeTableGanttLayout(Gantt gantt) {
this.gantt = gantt;
setSizeFull();
setMargin(false);
setSpacing(false);
UI.getCurrent().getPage().getStyles().add(".v-table-table tr td.v-table-cell-content { height: 36px; }");
UI.getCurrent().getPage().getStyles()
.add(".v-table-table tr:first-child td.v-table-cell-content { height: 37px; }");
ganttTable = createTreeTableForGantt();
addComponent(ganttTable);
addComponent(gantt);
}
private TreeTable createTreeTableForGantt() {
container = new BeanItemContainer<Step>(Step.class);
final TreeTable table = new TreeTable(null, container);
table.setBuffered(false);
table.setSizeFull();
container.addAll(gantt.getSteps());
// create hierarchy just for demonstration purpose
table.setChildrenAllowed(gantt.getSteps().get(0), true);
table.setChildrenAllowed(gantt.getSteps().get(1), true);
table.setParent(gantt.getSteps().get(1), gantt.getSteps().get(0));
table.setParent(gantt.getSteps().get(2), gantt.getSteps().get(1));
table.setVisibleColumns("caption");
table.setCollapsed(gantt.getSteps().get(0), false);
table.setCollapsed(gantt.getSteps().get(1), false);
table.addCollapseListener(new CollapseListener() {
@Override
public void nodeCollapse(CollapseEvent event) {
removeChildStepRecursively(table, event.getItemId());
}
});
table.addExpandListener(new ExpandListener() {
@Override
public void nodeExpand(ExpandEvent event) {
addChildStepRecursively(table, event.getItemId(), new MutableInt());
}
});
gantt.setVerticalScrollDelegateTarget(table);
table.setColumnWidth(null, 500);
return table;
}
/**
* Add all child steps directed by the TreeTable's hierarchical data source.
*/
private void addChildStepRecursively(TreeTable table, Object itemId, MutableInt index) {
if (!table.hasChildren(itemId)) {
return;
}
if (index.getValue() == 0) {
index.setValue(gantt.getSteps().indexOf(itemId) + 1);
}
Collection<?> childs = new HashSet<Object>(table.getChildren(itemId));
for (Object child : childs) {
if (child instanceof Step) {
gantt.addStep(index.getValue(), (Step) child);
index.increment();
addChildStepRecursively(table, child, index);
}
}
}
/**
* Remove all child steps directed by the TreeTable's hierarchical data
* source.
*/
private void removeChildStepRecursively(TreeTable table, Object itemId) {
if (table.hasChildren(itemId)) {
for (Object child : new HashSet<Object>(table.getChildren(itemId))) {
if (child instanceof Step) {
gantt.removeStep((Step) child);
removeChildStepRecursively(table, child);
}
}
}
}
@Override
public void stepModified(Step step) {
if (!ganttTable.containsId(step)) {
container.addBean(step);
} else {
ganttTable.refreshRowCache();
}
}
@Override
public void stepDeleted(Step step) {
container.removeItem(step);
}
@Override
public void stepMoved(Step step, int newStepIndex, int oldStepIndex) {
// move to new position
if (oldStepIndex < newStepIndex) {
newStepIndex--;
}
ganttTable.removeItem(step);
container.addItemAt(newStepIndex, step);
}
}