/* * 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.treepanel; 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.TreePanelEvent; import com.extjs.gxt.ui.client.store.Store; import com.extjs.gxt.ui.client.store.TreeStore; 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; @SuppressWarnings("unchecked") public class TreePanelView<M extends ModelData> { public enum TreeViewRenderMode { ALL, BODY, MAIN, CONTAINER }; protected TreeStore<M> treeStore; protected TreePanel<M> tree; protected TreeNode over; private String collapseHtml = GXT.IMAGES.tree_collapsed().getHTML(); private String expandHtml = GXT.IMAGES.tree_expanded().getHTML(); private int cleanDelay = 500; private int cacheSize = 20; 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); } public void expand(TreeNode node) { getContainer(node).getStyle().setProperty("display", "block"); tree.refresh((M) node.m); } public int getCacheSize() { return cacheSize; } public Element getCheckElement(TreeNode node) { if (node.check == null) { node.check = ((NodeList<Element>) getElementContainer(node).getChildNodes().cast()).getItem(2); } return node.check; } public int getCleanDelay() { return cleanDelay; } public Element getContainer(TreeNode node) { if (node.container == null) { String s = getTemplate(null, null, null, null, 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 = (Element) node.getElement().getFirstChild(); } return node.elContainer; } public Element getIconElement(TreeNode node) { if (node.icon == null) { node.icon = ((NodeList<Element>) getElementContainer(node).getChildNodes().cast()).getItem(3); } 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, Joint joint, int level, TreeViewRenderMode renderMode) { if (renderMode == TreeViewRenderMode.CONTAINER) { return "<ul class=\"x-tree3-node-ct\"></ul>"; } StringBuilder sb = new StringBuilder(); if (renderMode == TreeViewRenderMode.ALL || renderMode == TreeViewRenderMode.MAIN) { sb.append("<li id=\""); sb.append(id); sb.append("\" class=\"x-tree3-node\">"); sb.append("<div class=\"x-tree3-el\">"); } if (renderMode == TreeViewRenderMode.ALL || renderMode == TreeViewRenderMode.BODY) { 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("<input type=\"checkbox\" />"); 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>"); } if (renderMode == TreeViewRenderMode.ALL || renderMode == TreeViewRenderMode.MAIN) { sb.append("</div>"); sb.append("</li>"); } return sb.toString(); } public Element getTextElement(TreeNode node) { if (node.text == null) { node.text = ((NodeList<Element>) getElementContainer(node).getChildNodes().cast()).getItem(4); } return node.text; } public boolean isSelectableTarget(M m, Element target) { TreeNode n = tree.findNode(m); if (n == null) { return false; } boolean result = getJointElement(n) != target; if (result && tree.isCheckable()) { return getCheckElement(n) != target; } return result; } public void onCheckChange(TreeNode node, boolean check) { Element checkEl = (Element) getCheckElement(node); if (checkEl != null) { if (check) { node.check = (Element) node.getElement().getFirstChild().insertBefore(GXT.IMAGES.checked().createElement(), checkEl); } else { node.check = (Element) node.getElement().getFirstChild().insertBefore(GXT.IMAGES.unchecked().createElement(), checkEl); } El.fly(checkEl).remove(); } } 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) { if (icon != null) { node.icon = (Element) node.getElement().getFirstChild().insertBefore(icon.createElement(), iconEl); } else { node.getElement().getFirstChild().insertBefore(DOM.createSpan(), iconEl); node.icon = null; } El.fly(iconEl).remove(); } } public void onJointChange(TreeNode node, Joint joint) { Element jointEl = getJointElement(node); if (jointEl != null) { switch (joint) { case EXPANDED: node.joint = (Element) node.getElement().getFirstChild().insertBefore( GXT.IMAGES.tree_expanded().createElement(), jointEl); break; case COLLAPSED: node.joint = (Element) node.getElement().getFirstChild().insertBefore( GXT.IMAGES.tree_collapsed().createElement(), jointEl); break; default: node.joint = null; node.getElement().getFirstChild().insertBefore( XDOM.create("<img src=\"" + GXT.BLANK_IMAGE_URL + "\" style='width: 16px'>"), jointEl); } El.fly(jointEl).remove(); } } public void onLoadingChange(TreeNode node, boolean loading) { onIconStyleChange(node, GXT.IMAGES.icon_wait()); if (loading) { } else { } } public void onOverChange(TreeNode node, boolean select) { El.fly(getElementContainer(node)).setStyleName("x-ftree2-node-over", select); } public void onSelectChange(M model, boolean select) { TreeNode node = tree.findNode(model); if (node != null) { El.fly(getElementContainer(node)).setStyleName("x-ftree2-selected", select); } } public void onTextChange(TreeNode node, String text) { Element textEl = getTextElement(node); if (textEl != null) { textEl.setInnerHTML(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 int getCalculatedRowHeight() { return 21; } 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); } } } }