📄 htmltree.java
字号:
/** * Ensures that the node identified by the specified path is collapsed and * viewable. * * @param path the <code>TreePath</code> identifying a node */ public void collapsePath(TreePath path, FacesContext context) { HtmlTreeNode node = findNode(path, context); if (node != null) { node.setExpanded(false); } } public boolean isExpanded(TreePath path, FacesContext context) { if (path == null) { return false; } return findNode(path, context) != null; } private HtmlTreeNode findNode(TreePath path, FacesContext context) { HtmlTreeNode node = getRootNode(); int[] translatedPath = HtmlTreeNode.translatePath(path, getModel(context)); for (int i = 0; i < translatedPath.length; i++) { if (!node.isExpanded()) { return null; } int index = translatedPath[i]; node = (HtmlTreeNode) node.getChildren().get(index); } return node; } public TreePath getSelectionPath() { if (selectedPath == null) { return null; } return HtmlTreeNode.translatePath(selectedPath, getModel(FacesContext.getCurrentInstance())); } public void selectionChanged(HtmlTreeNode node) { TreePath oldPath = null; if (selectedPath != null) { oldPath = HtmlTreeNode.translatePath(selectedPath, getModel(FacesContext.getCurrentInstance())); } selectedPath = node.getTranslatedPath(); if (node.isSelected()) { queueEvent(new TreeSelectionEvent(this, oldPath, node.getPath())); } else { queueEvent(new TreeSelectionEvent(this, oldPath, null)); } } private void createRootNode(FacesContext context) { HtmlTreeNode node; TreeModel model = getModel(context); Object root = model.getRoot(); node = (HtmlTreeNode) context.getApplication().createComponent(HtmlTreeNode.COMPONENT_TYPE); String id = createUniqueId(context); node.setId(id); node.setPath(new TreePath(new Object[]{root})); node.setUserObject(root); node.setLayout(new int[]{HtmlTreeNode.CLOSED_SINGLE}); getFacets().put(FACET_ROOTNODE, node); } public HtmlTreeNode getRootNode() { return (HtmlTreeNode) getFacet(FACET_ROOTNODE); } public Object saveState(FacesContext context) { Object values[] = new Object[25]; values[0] = super.saveState(context); values[1] = iconChildFirst; values[2] = iconChildMiddle; values[3] = iconChildLast; values[4] = iconLine; values[5] = iconNodeClose; values[6] = iconNodeCloseFirst; values[7] = iconNodeCloseLast; values[8] = iconNodeCloseMiddle; values[9] = iconNodeOpen; values[10] = iconNodeOpenFirst; values[11] = iconNodeOpenLast; values[12] = iconNodeOpenMiddle; values[13] = iconNoline; values[14] = styleClass; values[15] = nodeClass; values[16] = selectedNodeClass; values[17] = new Integer(uniqueIdCounter); values[18] = selectedPath; values[19] = iconClass; values[20] = new Integer(internalId); values[21] = new Long(expireListeners); values[22] = rowClasses; values[23] = columnClasses; values[24] = var; return ((Object) (values)); } public void restoreState(FacesContext context, Object state) { Object values[] = (Object[]) state; super.restoreState(context, values[0]); iconChildFirst = (String) values[1]; iconChildMiddle = (String) values[2]; iconChildLast = (String) values[3]; iconLine = (String) values[4]; iconNodeClose = (String) values[5]; iconNodeCloseFirst = (String) values[6]; iconNodeCloseLast = (String) values[7]; iconNodeCloseMiddle = (String) values[8]; iconNodeOpen = (String) values[9]; iconNodeOpenFirst = (String) values[10]; iconNodeOpenLast = (String) values[11]; iconNodeOpenMiddle = (String) values[12]; iconNoline = (String) values[13]; styleClass = (String) values[14]; nodeClass = (String) values[15]; selectedNodeClass = (String) values[16]; uniqueIdCounter = ((Integer) values[17]).intValue(); selectedPath = (int[]) values[18]; iconClass = (String) values[19]; internalId = ((Integer) values[20]).intValue(); expireListeners = ((Long) values[21]).longValue(); rowClasses = (String) values[22]; columnClasses = (String) values[23]; var = (String) values[24]; addToModelListeners(); } public void decode(FacesContext context) { super.decode(context); //Save the current view root for later reference... context.getExternalContext().getRequestMap().put(PREVIOUS_VIEW_ROOT, context.getViewRoot()); //...and remember that this instance needs NO special treatment on // rendering: itemStatesRestored = true; } public void processDecodes(FacesContext context) { addToModelListeners(); super.processDecodes(context); } public void processValidators(FacesContext context) { addToModelListeners(); super.processValidators(context); } public void processUpdates(FacesContext context) { addToModelListeners(); super.processUpdates(context); } public void encodeBegin(FacesContext context) throws IOException { addToModelListeners(); processModelEvents(); HtmlTreeNode node = getRootNode(); if (node == null) { createRootNode(context); } if (!itemStatesRestored) { UIViewRoot previousRoot = (UIViewRoot) context.getExternalContext().getRequestMap().get(PREVIOUS_VIEW_ROOT); if (previousRoot != null) { restoreItemStates(context, previousRoot); } else { //no previous root, means no decode was done //--> a new request } } super.encodeBegin(context); } public void encodeEnd(FacesContext context) throws IOException { super.encodeEnd(context); } public void restoreItemStates(FacesContext facesContext, UIViewRoot previousRoot) { HtmlTree previousTree = (HtmlTree) previousRoot.findComponent(getClientId(facesContext)); if (previousTree != null) { HtmlTreeNode node = previousTree.getRootNode(); if (node != null) { getRootNode().restoreItemState(node); } selectedPath = previousTree.selectedPath; } } public void treeNodesChanged(TreeModelEvent e) { TreePath path = e.getTreePath(); FacesContext context = FacesContext.getCurrentInstance(); HtmlTreeNode node = findNode(path, context); if (node != null) { node.childrenChanged(e.getChildIndices(), context); } } public void treeNodesInserted(TreeModelEvent e) { TreePath path = e.getTreePath(); FacesContext context = FacesContext.getCurrentInstance(); HtmlTreeNode node = findNode(path, context); if (node != null) { node.childrenAdded(e.getChildIndices(), context); } } public void treeNodesRemoved(TreeModelEvent e) { TreePath path = e.getTreePath(); FacesContext context = FacesContext.getCurrentInstance(); HtmlTreeNode node = findNode(path, context); if (node != null) { node.childrenRemoved(e.getChildIndices()); } } public void treeStructureChanged(TreeModelEvent e) { TreePath path = e.getTreePath(); FacesContext context = FacesContext.getCurrentInstance(); if (isExpanded(path, context)) { collapsePath(path, context); expandPath(path, context); } } public boolean equals(Object obj) { if (!(obj instanceof HtmlTree)) { return false; } HtmlTree other = (HtmlTree) obj; return other.getId().equals(getId()); } public int hashCode() { return getClientId(FacesContext.getCurrentInstance()).hashCode(); } public void addToModelListeners() { Collection listeners = getModel(FacesContext.getCurrentInstance()).getTreeModelListeners(); long currentTime = System.currentTimeMillis(); boolean found = false; for (Iterator iterator = listeners.iterator(); iterator.hasNext();) { ModelListener listener = (ModelListener) iterator.next(); if (listener.getId() == internalId) { found = true; } else if (currentTime - listener.getLastAccessTime() > expireListeners) { iterator.remove(); } } if (!found) { listeners.add(new ModelListener(internalId)); } } private void processModelEvents() { Collection listeners = getModel(FacesContext.getCurrentInstance()).getTreeModelListeners(); for (Iterator iterator = listeners.iterator(); iterator.hasNext();) { ModelListener listener = (ModelListener) iterator.next(); if (listener.getId() == internalId) { for (Iterator events = listener.getEvents().iterator(); events.hasNext();) { Event event = (Event) events.next(); event.process(this); events.remove(); } break; } } } public void collapseAll() { HtmlTreeNode root = getRootNode(); FacesContext context = FacesContext.getCurrentInstance(); collapsePath(root.getPath(), context); for (int i = 0; i < root.getChildren().size(); i++) { HtmlTreeNode child = (HtmlTreeNode) (root.getChildren().get(i)); collapsePath(child.getPath(), context); if (!child.isLeaf(context)) { collapseChildren(context, child); } } } private void collapseChildren(FacesContext context, HtmlTreeNode parent) { for (int i = 0; i < parent.getChildren().size(); i++) { HtmlTreeNode child = (HtmlTreeNode) (parent.getChildren().get(i)); collapsePath(child.getPath(), context); if (!child.isLeaf(context)) { collapseChildren(context, child); } } } public void expandAll() { HtmlTreeNode root = getRootNode(); FacesContext context = FacesContext.getCurrentInstance(); expandPath(root.getPath(), context); for (int i = 0; i < root.getChildren().size(); i++) { HtmlTreeNode child = (HtmlTreeNode) (root.getChildren().get(i)); expandPath(child.getPath(), context); if (!child.isLeaf(context)) { expandChildren(context, child); } } } private void expandChildren(FacesContext context, HtmlTreeNode parent) { for (int i = 0; i < parent.getChildren().size(); i++) { HtmlTreeNode child = (HtmlTreeNode) (parent.getChildren().get(i)); expandPath(child.getPath(), context); if (!child.isLeaf(context)) { expandChildren(context, child); } } } public static String getDefaultImagePath(String relativePathInResourceFolder) { return AddResource.getResourceMappedPath(HtmlTree.class, relativePathInResourceFolder, null); } private static class ModelListener implements TreeModelListener { private long lastAccessTime = System.currentTimeMillis(); private LinkedList events = new LinkedList(); int id; public ModelListener(int id) { this.id = id; } public List getEvents() { lastAccessTime = System.currentTimeMillis(); return events; } public int getId() { return id; } public long getLastAccessTime() { return lastAccessTime; } public void treeNodesChanged(TreeModelEvent e) { events.addLast(new Event(EVENT_CHANGED, e)); } public void treeNodesInserted(TreeModelEvent e) { events.addLast(new Event(EVENT_INSERTED, e)); } public void treeNodesRemoved(TreeModelEvent e) { events.addLast(new Event(EVENT_REMOVED, e)); } public void treeStructureChanged(TreeModelEvent e) { events.addLast(new Event(EVENT_STRUCTURE_CHANGED, e)); } } private static class Event { private int kind; private TreeModelEvent event; public Event(int kind, TreeModelEvent event) { this.kind = kind; this.event = event; } public void process(HtmlTree tree) { switch (kind) { case EVENT_CHANGED: tree.treeNodesChanged(event); break; case EVENT_INSERTED: tree.treeNodesInserted(event); break; case EVENT_REMOVED: tree.treeNodesRemoved(event); break; case EVENT_STRUCTURE_CHANGED: tree.treeStructureChanged(event); break; } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -