diff options
Diffstat (limited to 'java/src/IceGridGUI/TreeNodeBase.java')
-rw-r--r-- | java/src/IceGridGUI/TreeNodeBase.java | 355 |
1 files changed, 355 insertions, 0 deletions
diff --git a/java/src/IceGridGUI/TreeNodeBase.java b/java/src/IceGridGUI/TreeNodeBase.java new file mode 100644 index 00000000000..d6425d98f66 --- /dev/null +++ b/java/src/IceGridGUI/TreeNodeBase.java @@ -0,0 +1,355 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2011 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +package IceGridGUI; + +import java.util.Enumeration; + +import java.awt.Component; +import javax.swing.JTree; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreePath; +import javax.swing.tree.TreeCellRenderer; +import javax.swing.JPopupMenu; + +// +// This class behaves like a leaf; derived class that represent non-leaf nodes must +// override various methods. +// +public class TreeNodeBase implements javax.swing.tree.TreeNode, TreeCellRenderer +{ + public Coordinator getCoordinator() + { + return _parent.getCoordinator(); + } + + public Enumeration children() + { + return new Enumeration() + { + public boolean hasMoreElements() + { + return false; + } + + public Object nextElement() + { + throw new java.util.NoSuchElementException(); + } + }; + } + + public boolean getAllowsChildren() + { + return false; + } + + public javax.swing.tree.TreeNode getChildAt(int childIndex) + { + return null; + } + + public int getChildCount() + { + return 0; + } + + public int getIndex(javax.swing.tree.TreeNode node) + { + return -1; + } + + public javax.swing.tree.TreeNode getParent() + { + return _parent; + } + + public boolean isLeaf() + { + return true; + } + + public Component getTreeCellRendererComponent( + JTree tree, + Object value, + boolean sel, + boolean expanded, + boolean leaf, + int row, + boolean hasFocus) + { + return null; + } + + public String toString() + { + return _id; + } + + public JPopupMenu getPopupMenu() + { + return null; + } + + public String getId() + { + return _id; + } + + public TreePath getPath() + { + if(_parent == null) + { + return new TreePath(this); + } + else + { + return _parent.getPath().pathByAddingChild(this); + } + } + + public java.util.LinkedList<String> getFullId() + { + java.util.LinkedList<String> result = _parent == null ? + new java.util.LinkedList<String>() : + _parent.getFullId(); + + result.add(_id); + return result; + } + + public TreeNodeBase findChild(String id) + { + Enumeration p = children(); + while(p.hasMoreElements()) + { + TreeNodeBase child = (TreeNodeBase)p.nextElement(); + if(child.getId().equals(id)) + { + return child; + } + } + return null; + } + + protected String makeNewChildId(String base) + { + String id = base; + int i = 0; + while(findChild(id) != null) + { + id = base + "-" + (++i); + } + return id; + } + + protected TreeNodeBase(TreeNodeBase parent, String id) + { + _parent = parent; + _id = id; + } + + // + // Helper functions + // + protected boolean insertSortedChild(TreeNodeBase newChild, java.util.List c, DefaultTreeModel treeModel) + { + @SuppressWarnings("unchecked") + java.util.List<TreeNodeBase> children = (java.util.List<TreeNodeBase>)c; + + String id = newChild.getId(); + int i; + for(i = 0; i < children.size(); ++i) + { + String otherId = children.get(i).getId(); + int cmp = id.compareTo(otherId); + + if(cmp == 0) + { + return false; + } + else if(cmp < 0) + { + break; + } + } + children.add(i, newChild); + + if(treeModel != null) + { + treeModel.nodesWereInserted(this, new int[]{getIndex(newChild)}); + } + return true; + } + + protected String insertSortedChildren(java.util.List nc, java.util.List ic, DefaultTreeModel treeModel) + { + @SuppressWarnings("unchecked") + java.util.List<TreeNodeBase> newChildren = (java.util.List<TreeNodeBase>)nc; + @SuppressWarnings("unchecked") + java.util.List<TreeNodeBase> intoChildren = (java.util.List<TreeNodeBase>)ic; + + TreeNodeBase[] children = newChildren.toArray(new TreeNodeBase[0]); + java.util.Arrays.sort(children, _childComparator); + + int[] indices = new int[children.length]; + + int offset = -1; + + int i = 0; + boolean checkInsert = true; + for(int j = 0; j < children.length; ++j) + { + String id = children[j].getId(); + + if(checkInsert) + { + while(i < intoChildren.size()) + { + TreeNodeBase existingChild = intoChildren.get(i); + int cmp = id.compareTo(existingChild.getId()); + if(cmp == 0) + { + return id; + } + if(cmp < 0) + { + break; // while + } + i++; + } + + if(i < intoChildren.size()) + { + // Insert here, and increment i (since children is sorted) + intoChildren.add(i, children[j]); + if(offset == -1) + { + offset = getIndex(intoChildren.get(0)); + } + + indices[j] = offset + i; + i++; + continue; // for + } + else + { + checkInsert = false; + } + } + + // + // Append + // + intoChildren.add(children[j]); + if(offset == -1) + { + offset = getIndex(intoChildren.get(0)); + } + indices[j] = offset + i; + i++; + } + + if(treeModel != null) + { + treeModel.nodesWereInserted(this, indices); + } + + return null; + } + + protected void removeSortedChildren(String[] childIds, java.util.List fc, DefaultTreeModel treeModel) + { + @SuppressWarnings("unchecked") + java.util.List<TreeNodeBase> fromChildren = (java.util.List<TreeNodeBase>)fc; + + if(childIds.length == 0) + { + return; // nothing to do + } + assert fromChildren.size() > 0; + + String[] ids = (String[])childIds.clone(); + java.util.Arrays.sort(ids); + + Object[] childrenToRemove = new Object[ids.length]; + int[] indices = new int[ids.length]; + + int i = getIndex(fromChildren.get(0)); + int j = 0; + + java.util.Iterator<TreeNodeBase> p = fromChildren.iterator(); + while(p.hasNext() && j < ids.length) + { + TreeNodeBase child = p.next(); + if(ids[j].equals(child.getId())) + { + childrenToRemove[j] = child; + indices[j] = i; + p.remove(); + ++j; + } + ++i; + } + + // + // Should be all removed + // + assert(j == ids.length); + + if(treeModel != null) + { + treeModel.nodesWereRemoved(this, indices, childrenToRemove); + } + } + + protected void childrenChanged(java.util.List c, DefaultTreeModel treeModel) + { + @SuppressWarnings("unchecked") + java.util.List<TreeNodeBase> children = (java.util.List<TreeNodeBase>)c; + + for(TreeNodeBase child : children) + { + treeModel.nodeStructureChanged(child); + } + } + + public int[] resize(int[] array, int size) + { + int[] result = new int[size]; + System.arraycopy(array, 0, result, 0, size); + return result; + } + + protected TreeNodeBase find(String id, java.util.List il) + { + @SuppressWarnings("unchecked") + java.util.List<TreeNodeBase> inList = (java.util.List<TreeNodeBase>)il; + + for(TreeNodeBase node : inList) + { + if(node.getId().equals(id)) + { + return node; + } + } + return null; + } + + protected TreeNodeBase _parent; + protected String _id; + + protected java.util.Comparator<TreeNodeBase> _childComparator = new java.util.Comparator<TreeNodeBase>() + { + public int compare(TreeNodeBase o1, TreeNodeBase o2) + { + return o1.getId().compareTo(o2.getId()); + } + }; +} |