/*
* Ext GWT 2.2.4 - Ext for GWT
* Copyright(c) 2007-2010, Ext JS, LLC.
* licensing@extjs.com
*
* http://extjs.com/license
*/
package com.extjs.gxt.ui.client.widget.treepanel;
import com.extjs.gxt.ui.client.GXT;
import com.extjs.gxt.ui.client.aria.FocusFrame;
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.TreePanelEvent;
import com.extjs.gxt.ui.client.store.Store;
import com.extjs.gxt.ui.client.store.TreeStore;
import com.extjs.gxt.ui.client.util.IconHelper;
import com.extjs.gxt.ui.client.util.Util;
import com.extjs.gxt.ui.client.widget.Component;
import com.extjs.gxt.ui.client.widget.treepanel.TreePanel.Joint;
import com.extjs.gxt.ui.client.widget.treepanel.TreePanel.TreeNode;
import com.google.gwt.dom.client.NodeList;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
import com.google.gwt.user.client.ui.Accessibility;
@SuppressWarnings({"unchecked", "rawtypes"})
public class TreePanelView<M extends ModelData> {
public enum TreeViewRenderMode {
ALL, BODY, CONTAINER, MAIN
};
protected TreeNode over;
protected TreePanel<M> tree;
protected TreeStore<M> treeStore;
private int cacheSize = 20;
private int cleanDelay = 500;
private int scrollDelay = 0;
public void bind(Component component, Store store) {
this.tree = (TreePanel) component;
this.treeStore = (TreeStore) store;
}
public void collapse(TreeNode node) {
getContainer(node).getStyle().setProperty("display", "none");
tree.refresh((M) node.m);
if (GXT.isFocusManagerEnabled()) {
Accessibility.setState((Element) node.getElement().getFirstChildElement(), "aria-expanded", "false");
FocusFrame.get().sync(tree);
}
}
public void expand(TreeNode node) {
getContainer(node).getStyle().setProperty("display", "block");
tree.refresh((M) node.m);
if (GXT.isFocusManagerEnabled()) {
FocusFrame.get().sync(tree);
Accessibility.setState((Element) node.getElement().getFirstChildElement(), "aria-expanded", "true");
}
}
public int getCacheSize() {
return cacheSize;
}
public Element getCheckElement(TreeNode node) {
if (node.check == null) {
node.check = getElementContainer(node) != null
? ((NodeList<Element>) getElementContainer(node).getChildNodes().cast()).getItem(2) : null;
}
return node.check;
}
public int getCleanDelay() {
return cleanDelay;
}
public Element getContainer(TreeNode node) {
if (node.container == null) {
String s = getTemplate(node.m, null, null, null, false, false, null, 0, TreeViewRenderMode.CONTAINER);
node.container = node.getElement().appendChild(XDOM.create(s));
}
return node.container;
}
public Element getElementContainer(TreeNode node) {
if (node.elContainer == null) {
node.elContainer = node.getElement() != null ? (Element) node.getElement().getFirstChild() : null;
}
return node.elContainer;
}
public Element getIconElement(TreeNode node) {
if (node.icon == null) {
node.icon = getElementContainer(node) != null
? ((NodeList<Element>) getElementContainer(node).getChildNodes().cast()).getItem(3) : null;
}
return node.icon;
}
public Element getJointElement(TreeNode node) {
if (node.joint == null) {
node.joint = ((NodeList<Element>) getElementContainer(node).getChildNodes().cast()).getItem(1);
}
return node.joint;
}
public int getScrollDelay() {
return scrollDelay;
}
public String getTemplate(ModelData m, String id, String text, AbstractImagePrototype icon, boolean checkable,
boolean checked, Joint joint, int level, TreeViewRenderMode renderMode) {
if (renderMode == TreeViewRenderMode.CONTAINER) {
return "<div unselectable=on class=\"x-tree3-node-ct\" role=\"group\"></div>";
}
StringBuilder sb = new StringBuilder();
if (renderMode == TreeViewRenderMode.ALL || renderMode == TreeViewRenderMode.MAIN) {
sb.append("<div unselectable=on id=\"");
sb.append(id);
sb.append("\"");
sb.append(" class=\"x-tree3-node\" role=\"presentation\">");
String cls = "x-tree3-el";
if (GXT.isHighContrastMode) {
switch (joint) {
case COLLAPSED:
cls += " x-tree3-node-joint-collapse";
break;
case EXPANDED:
cls += " x-tree3-node-joint-expand";
break;
}
}
sb.append("<div unselectable=on class=\"" + cls + "\" id=\"" + tree.getId() + "__" + id + "\" role=\"treeitem\" ");
sb.append(" aria-level=\"" + (level + 1) + "\">");
}
if (renderMode == TreeViewRenderMode.ALL || renderMode == TreeViewRenderMode.BODY) {
Element jointElement = null;
switch (joint) {
case COLLAPSED:
jointElement = (Element) tree.getStyle().getJointCollapsedIcon().createElement().cast();
break;
case EXPANDED:
jointElement = (Element) tree.getStyle().getJointExpandedIcon().createElement().cast();
break;
}
if (jointElement != null) {
El.fly(jointElement).addStyleName("x-tree3-node-joint");
}
sb.append("<img src=\"");
sb.append(GXT.BLANK_IMAGE_URL);
sb.append("\" style=\"height: 18px; width: ");
sb.append(level * getIndenting(findNode((M) m)));
sb.append("px;\" />");
sb.append(jointElement == null ? "<img src=\"" + GXT.BLANK_IMAGE_URL
+ "\" style=\"width: 16px\" class=\"x-tree3-node-joint\" />" : DOM.toString(jointElement));
if (checkable) {
Element e = (Element) (checked ? GXT.IMAGES.checked().createElement().cast()
: GXT.IMAGES.unchecked().createElement().cast());
El.fly(e).addStyleName("x-tree3-node-check");
sb.append(DOM.toString(e));
} else {
sb.append("<span class=\"x-tree3-node-check\"></span>");
}
if (icon != null) {
Element e = icon.createElement().cast();
El.fly(e).addStyleName("x-tree3-node-icon");
sb.append(DOM.toString(e));
} else {
sb.append("<span class=\"x-tree3-node-icon\"></span>");
}
sb.append("<span unselectable=on class=\"x-tree3-node-text\">");
sb.append(text);
sb.append("</span>");
}
if (renderMode == TreeViewRenderMode.ALL || renderMode == TreeViewRenderMode.MAIN) {
sb.append("</div>");
sb.append("</div>");
}
return sb.toString();
}
public Element getTextElement(TreeNode node) {
if (node.text == null) {
node.text = getElementContainer(node) != null
? ((NodeList<Element>) getElementContainer(node).getChildNodes().cast()).getItem(4) : null;
}
return node.text;
}
public boolean isSelectableTarget(M m, Element target) {
TreeNode n = findNode(m);
if (n == null) {
return false;
}
boolean isNotJointTarget = false;
if (GXT.isIE6) {
isNotJointTarget = !El.fly(target).getParent().hasStyleName("x-tree3-node-joint");
} else {
isNotJointTarget = !El.fly(target).hasStyleName("x-tree3-node-joint");
}
if (isNotJointTarget && tree.isCheckable()) {
boolean isNotCheckTarget = !El.fly(target).hasStyleName("x-tree3-node-check");
return isNotCheckTarget;
}
return isNotJointTarget;
}
public void onCheckChange(TreeNode node, boolean checkable, boolean check) {
Element checkEl = (Element) getCheckElement(node);
if (checkEl != null) {
Element e;
if (checkable) {
if (check) {
e = (Element) GXT.IMAGES.checked().createElement().cast();
} else {
e = (Element) GXT.IMAGES.unchecked().createElement().cast();
}
} else {
e = DOM.createSpan();
}
El.fly(e).addStyleName("x-tree3-node-check");
node.check = (Element) node.getElement().getFirstChild().insertBefore(e, checkEl);
El.fly(checkEl).remove();
}
}
public void onDropChange(TreeNode node, boolean drop) {
El.fly(getElementContainer(node)).setStyleName("x-ftree2-node-drop", drop);
}
public void onEvent(TreePanelEvent ce) {
int type = ce.getEventTypeInt();
switch (type) {
case Event.ONMOUSEOVER:
if (tree.isTrackMouseOver()) {
onMouseOver(ce);
}
break;
case Event.ONMOUSEOUT:
if (tree.isTrackMouseOver()) {
onMouseOut(ce);
}
break;
}
}
public void onIconStyleChange(TreeNode node, AbstractImagePrototype icon) {
Element iconEl = getIconElement(node);
if (iconEl != null) {
Element e;
if (icon != null) {
e = (Element) icon.createElement().cast();
} else {
e = DOM.createSpan();
}
El.fly(e).addStyleName("x-tree3-node-icon");
node.icon = (Element) node.getElement().getFirstChild().insertBefore(e, iconEl);
El.fly(iconEl).remove();
}
}
public void onJointChange(TreeNode node, Joint joint) {
Element jointEl = getJointElement(node);
if (jointEl != null) {
Element e;
switch (joint) {
case COLLAPSED:
e = (Element) tree.getStyle().getJointCollapsedIcon().createElement().cast();
if (GXT.isHighContrastMode) {
El.fly(node.elContainer).addStyleName("x-tree3-node-joint-collapse").removeStyleName(
"x-tree3-node-joint-expand");
}
break;
case EXPANDED:
e = (Element) tree.getStyle().getJointExpandedIcon().createElement().cast();
if (GXT.isHighContrastMode) {
El.fly(node.elContainer).addStyleName("x-tree3-node-joint-expand").removeStyleName(
"x-tree3-node-joint-collapse");
}
break;
default:
e = XDOM.create("<img src=\"" + GXT.BLANK_IMAGE_URL + "\" width=\"16px\"/>");
if (GXT.isHighContrastMode) {
El.fly(node.elContainer).removeStyleName("x-tree3-node-joint-collapse").removeStyleName(
"x-tree3-node-joint-expand");
}
}
El.fly(e).addStyleName("x-tree3-node-joint");
node.joint = (Element) node.getElement().getFirstChild().insertBefore(e, jointEl);
El.fly(jointEl).remove();
}
}
public void onLoading(TreeNode node) {
onIconStyleChange(node, IconHelper.createStyle("x-tree3-loading"));
}
public void onOverChange(TreeNode node, boolean select) {
El.fly(getElementContainer(node)).setStyleName("x-ftree2-node-over", select);
}
public void onSelectChange(M model, boolean select) {
if (select) {
tree.setExpanded(treeStore.getParent(model), true);
}
TreeNode node = findNode(model);
if (node != null) {
Element e = getElementContainer(node);
if (e != null) {
El.fly(e).setStyleName("x-ftree2-selected", select);
if (select) {
String tid = tree.getId();
Accessibility.setState(tree.getElement(), "aria-activedescendant", tid + "__" + node.getElement().getId());
}
}
}
}
public void onTextChange(TreeNode node, String text) {
Element textEl = getTextElement(node);
if (textEl != null) {
textEl.setInnerHTML(Util.isEmptyString(text) ? " " : text);
}
}
public void setCacheSize(int cacheSize) {
this.cacheSize = cacheSize;
}
public void setCleanDelay(int cleanDelay) {
this.cleanDelay = cleanDelay;
}
public void setScrollDelay(int scrollDelay) {
this.scrollDelay = scrollDelay;
}
protected TreeNode findNode(M m){
return tree.findNode(m);
}
protected int getCalculatedRowHeight() {
return 21;
}
protected int getIndenting(TreeNode node) {
return 18;
}
protected void onMouseOut(TreePanelEvent ce) {
if (over != null) {
onOverChange(over, false);
over = null;
}
}
protected void onMouseOver(TreePanelEvent ce) {
if (ce.getNode() != null) {
if (over != ce.getNode()) {
onMouseOut(ce);
over = ce.getNode();
onOverChange(over, true);
}
}
}
}