/*
* Ext GWT - Ext for GWT
* Copyright(c) 2007-2009, Ext JS, LLC.
* licensing@extjs.com
*
* http://extjs.com/license
*/
package com.extjs.gxt.ui.client.widget.treegrid;
import java.util.List;
import com.extjs.gxt.ui.client.GXT;
import com.extjs.gxt.ui.client.core.El;
import com.extjs.gxt.ui.client.core.XDOM;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.event.GridEvent;
import com.extjs.gxt.ui.client.store.TreeStore;
import com.extjs.gxt.ui.client.widget.grid.BufferView;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.treegrid.TreeGrid.TreeNode;
import com.extjs.gxt.ui.client.widget.treepanel.TreePanel.Joint;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
@SuppressWarnings("unchecked")
public class TreeGridView extends BufferView {
protected TreeGrid tree;
protected TreeStore treeStore;
private String collapseHtml = GXT.IMAGES.tree_collapsed().getHTML();
private String expandHtml = GXT.IMAGES.tree_expanded().getHTML();
public TreeGridView() {
setRowSelectorDepth(20);
setCellSelectorDepth(10);
}
public void collapse(TreeNode node) {
ModelData p = node.m;
ModelData lc = treeStore.getLastChild(p);
if (tree.isExpanded(lc)) {
lc = treeStore.getLastChild(lc);
}
int start = ds.indexOf(p);
int end = ds.indexOf(lc);
for (int i = end; i > start; i--) {
ds.remove(grid.getStore().getAt(i));
}
tree.refresh(node.m);
}
public void expand(TreeNode node) {
ModelData p = node.m;
List<ModelData> children = treeStore.getChildren(p);
int idx = ds.indexOf(p);
ds.insert(children, idx + 1);
for (ModelData child : children) {
TreeNode cn = tree.findNode(child);
if (cn.isExpanded()) {
expand(cn);
}
}
tree.refresh(node.m);
}
public Element getJointElement(TreeNode node) {
Element row = getRowElement(node);
if (row != null) {
El jointEl = fly(row).selectNode(".x-tree3-el");
return jointEl == null ? null : (Element) jointEl.dom.getChildNodes().getItem(1);
}
return null;
}
public String getTemplate(ModelData m, String id, String text,
AbstractImagePrototype icon, boolean checkable, Joint joint, int level) {
StringBuffer sb = new StringBuffer();
sb.append("<div id=\"");
sb.append(id);
sb.append("\" class=\"x-tree3-node\">");
sb.append("<div class=\"x-tree3-el\">");
String h = "";
switch (joint) {
case COLLAPSED:
h = collapseHtml;
break;
case EXPANDED:
h = expandHtml;
break;
default:
h = "<img src=\"" + GXT.BLANK_IMAGE_URL + "\" style='width: 16px'>";
}
sb.append("<img src=\"");
sb.append(GXT.BLANK_IMAGE_URL);
sb.append("\" style=\"height: 18px; width: ");
sb.append(level * 18);
sb.append("px;\" />");
sb.append(h);
if (checkable) {
sb.append(GXT.IMAGES.unchecked().getHTML());
} else {
sb.append("<span></span>");
}
if (icon != null) {
sb.append(icon.getHTML());
} else {
sb.append("<span></span>");
}
sb.append("<span class=\"x-tree3-node-text\">");
sb.append(text);
sb.append("</span>");
sb.append("</div>");
sb.append("</div>");
return sb.toString();
}
public boolean isSelectableTarget(ModelData model, Element target) {
TreeNode node = tree.findNode(model);
if (node != null) {
if (DOM.isOrHasChild(getJointElement(node), target)) {
return false;
}
}
return true;
}
public void onIconStyleChange(TreeNode node, AbstractImagePrototype icon) {
El nodeEl = fly(getRowElement(node)).selectNode(".x-tree3-el");
if (nodeEl != null) {
Element iconEl = nodeEl.dom.getChildNodes().getItem(3).cast();
if (iconEl != null) {
if (icon != null) {
iconEl.getParentElement().insertBefore(icon.createElement(), iconEl);
} else {
iconEl.getParentElement().insertBefore(DOM.createSpan(), iconEl);
}
El.fly(iconEl).remove();
}
}
}
public void onJointChange(TreeNode node, Joint joint) {
Element jointEl = getJointElement(node);
if (jointEl != null) {
switch (joint) {
case EXPANDED:
jointEl.getParentElement().insertBefore(
GXT.IMAGES.tree_expanded().createElement(), jointEl);
break;
case COLLAPSED:
jointEl.getParentElement().insertBefore(
GXT.IMAGES.tree_collapsed().createElement(), jointEl);
break;
default:
jointEl.getParentElement().insertBefore(
XDOM.create("<img src=\"" + GXT.BLANK_IMAGE_URL + "\" style='width: 16px'>"),
jointEl);
}
El.fly(jointEl).remove();
}
}
protected Element getRowElement(TreeNode node) {
return getRow(ds.indexOf(node.m)).cast();
}
@Override
protected void init(Grid grid) {
super.init(grid);
tree = (TreeGrid) grid;
treeStore = tree.getTreeStore();
}
protected void onClick(GridEvent<ModelData> ce) {
if (ce.getModel() != null && !isSelectableTarget(ce.getModel(), ce.getTarget())) {
return;
}
super.onClick(ce);
}
@Override
protected void onHeaderClick(Grid<ModelData> grid, int column) {
}
}