Index: openide/src/org/openide/explorer/view/NodeRenderer.java =================================================================== RCS file: /cvs/openide/src/org/openide/explorer/view/NodeRenderer.java,v retrieving revision 1.18 diff -c -r1.18 NodeRenderer.java *** openide/src/org/openide/explorer/view/NodeRenderer.java 20 Nov 2002 08:58:27 -0000 1.18 --- openide/src/org/openide/explorer/view/NodeRenderer.java 25 Nov 2002 13:18:59 -0000 *************** *** 197,204 **** // // Renderers // ! ! private static NodeRenderer.Tree tree = null; private synchronized static NodeRenderer.Tree getTree () { --- 197,203 ---- // // Renderers // ! private static NodeRenderer.Tree tree = null; private synchronized static NodeRenderer.Tree getTree () { *************** *** 252,267 **** ImageIcon nodeicon; if (expanded) { ! nodeicon = NodeRenderer.getIcon(vis.node.getOpenedIcon(BeanInfo.ICON_COLOR_16x16)); } else { ! nodeicon = NodeRenderer.getIcon(vis.node.getIcon(BeanInfo.ICON_COLOR_16x16)); } ! setIconTextGap (4 - nodeicon.getIconWidth() ! + ( nodeicon.getIconWidth() > 24 ? nodeicon.getIconWidth() : 24 ) ); setIcon(nodeicon); ! setText(vis.displayName); // provide "drag under" feedback if DnD operation is active // NOI18N if (vis == draggedOver) { --- 251,266 ---- ImageIcon nodeicon; if (expanded) { ! nodeicon = vis.getOpenedIcon(BeanInfo.ICON_COLOR_16x16); } else { ! nodeicon = vis.getIcon(BeanInfo.ICON_COLOR_16x16); } ! setIconTextGap ( nodeicon.getIconWidth() >= 24 ? 4 : 28 - nodeicon.getIconWidth() ); setIcon(nodeicon); ! String label = vis.displayName; ! setText(javax.swing.plaf.basic.BasicHTML.isHTMLString(label)? "\ufeff"+label: label); // zero-width non-breaking space // provide "drag under" feedback if DnD operation is active // NOI18N if (vis == draggedOver) { *************** *** 315,321 **** boolean cellHasFocus) // the list and the cell have the focus { VisualizerNode vis = (VisualizerNode)value; ! ImageIcon nodeicon = NodeRenderer.getIcon(vis.node.getIcon(BeanInfo.ICON_COLOR_16x16)); setIcon(nodeicon); setText(vis.displayName); --- 314,320 ---- boolean cellHasFocus) // the list and the cell have the focus { VisualizerNode vis = (VisualizerNode)value; ! ImageIcon nodeicon = vis.getIcon(BeanInfo.ICON_COLOR_16x16); setIcon(nodeicon); setText(vis.displayName); *************** *** 383,389 **** ) { VisualizerNode vis = (VisualizerNode)value; ! setIcon(NodeRenderer.getIcon(vis.node.getIcon(BeanInfo.ICON_COLOR_32x32))); setText(vis.displayName); if (isSelected){ --- 382,388 ---- ) { VisualizerNode vis = (VisualizerNode)value; ! setIcon(vis.getIcon(BeanInfo.ICON_COLOR_32x32)); setText(vis.displayName); if (isSelected){ Index: openide/src/org/openide/explorer/view/NodeTreeModel.java =================================================================== RCS file: /cvs/openide/src/org/openide/explorer/view/NodeTreeModel.java,v retrieving revision 1.13 diff -c -r1.13 NodeTreeModel.java *** openide/src/org/openide/explorer/view/NodeTreeModel.java 15 Jul 2002 11:58:46 -0000 1.13 --- openide/src/org/openide/explorer/view/NodeTreeModel.java 25 Nov 2002 13:18:59 -0000 *************** *** 72,79 **** } v.removeNodeModel (listener ()); - nr.addNodeModel (listener ()); setRoot (nr); } }); --- 72,79 ---- } v.removeNodeModel (listener ()); nr.addNodeModel (listener ()); + setRoot (nr); } }); *************** *** 95,102 **** * set the user object of the changed node to something meaningful. */ public void valueForPathChanged(TreePath path, Object newValue) { ! if (path == null) return; Object o = path.getLastPathComponent(); if (o instanceof VisualizerNode) { --- 95,103 ---- * set the user object of the changed node to something meaningful. */ public void valueForPathChanged(TreePath path, Object newValue) { ! if (path == null) { return; + } Object o = path.getLastPathComponent(); if (o instanceof VisualizerNode) { *************** *** 108,114 **** aNode.setUserObject(newValue); nodeChanged(aNode); } - /** The listener */ private static final class Listener implements NodeModel { --- 109,114 ---- Index: openide/src/org/openide/explorer/view/TreeTableModelAdapter.java =================================================================== RCS file: /cvs/openide/src/org/openide/explorer/view/TreeTableModelAdapter.java,v retrieving revision 1.3 diff -c -r1.3 TreeTableModelAdapter.java *** openide/src/org/openide/explorer/view/TreeTableModelAdapter.java 4 Jul 2002 09:11:03 -0000 1.3 --- openide/src/org/openide/explorer/view/TreeTableModelAdapter.java 25 Nov 2002 13:18:59 -0000 *************** *** 164,169 **** --- 164,170 ---- } private void updateNodes() { + System.out.println("TreeTableModelAdapter.Listener.updateNodes"); Node[] nodes = new Node[tree.getRowCount()]; for (int i = 0; i < tree.getRowCount(); i++) { nodes[i] = Visualizer.findNode(tree.getPathForRow(i).getLastPathComponent()); Index: openide/src/org/openide/explorer/view/TreeView.java =================================================================== RCS file: /cvs/openide/src/org/openide/explorer/view/TreeView.java,v retrieving revision 1.112 diff -c -r1.112 TreeView.java *** openide/src/org/openide/explorer/view/TreeView.java 21 Nov 2002 16:51:07 -0000 1.112 --- openide/src/org/openide/explorer/view/TreeView.java 25 Nov 2002 13:19:00 -0000 *************** *** 171,176 **** --- 171,184 ---- NodeRenderer rend = NodeRenderer.sharedInstance (); tree.setCellRenderer(rend); + Node dummy = Node.EMPTY.cloneNode(); + dummy.setDisplayName(" "); // NOI18N + Component comp = rend.getTreeCellRendererComponent( + tree, VisualizerNode.getVisualizer(null, dummy), false, false, true, 0, tree.hasFocus() + ); + tree.setRowHeight(comp.getPreferredSize().height); + tree.setLargeModel(true); + tree.putClientProperty("JTree.lineStyle", "Angled"); // NOI18N setViewportView (tree); *************** *** 746,751 **** --- 754,760 ---- if (treeModel == null) { // no model, no action, no problem + // System.out.println("no model, no action, no problem"); return; } *************** *** 810,816 **** return; } ! TreeNode myNode = (TreeNode)path.getLastPathComponent(); if (treeModel.getPathToRoot(myNode)[0] != treeModel.getRoot()) { --- 819,825 ---- return; } ! VisualizerNode myNode = (VisualizerNode)path.getLastPathComponent(); if (treeModel.getPathToRoot(myNode)[0] != treeModel.getRoot()) { *************** *** 821,827 **** return; } ! treeModel.nodeStructureChanged(myNode); } }, TIME_TO_COLLAPSE); } --- 830,843 ---- return; } ! /* need to do for children because it doesn't work correctly on collapsed node */ ! java.util.List l = myNode.getChildren(); ! VisualizerNode tn; ! for (int i=0; i= 0; i -= 2) { ! ((NodeModel)listeners[i]).added (ev); } - parent = (VisualizerNode)parent.getParent (); - } ! if (empty) { ! // change of state ! this.parent.notifyVisualizerChildrenChange (list.size (), this); } - } /** Notification that children has been removed. Modifies the list of nodes --- 62,81 ---- VisualizerNode parent = this.parent; ! if (parent != null && !parent.isComputingChildren()) { ! while (parent != null) { ! Object[] listeners = parent.getListenerList (); ! for (int i = listeners.length - 1; i >= 0; i -= 2) { ! ((NodeModel)listeners[i]).added (ev); ! } ! parent = (VisualizerNode)parent.getParent (); } ! if (empty) { ! // change of state ! this.parent.notifyVisualizerChildrenChange (this); ! } } } /** Notification that children has been removed. Modifies the list of nodes *************** *** 99,115 **** } VisualizerNode parent = this.parent; ! while (parent != null) { ! Object[] listeners = parent.getListenerList (); ! for (int i = listeners.length - 1; i >= 0; i -= 2) { ! ((NodeModel)listeners[i]).removed (ev); } - parent = (VisualizerNode)parent.getParent (); - } ! if (list.isEmpty ()) { ! // now is empty ! this.parent.notifyVisualizerChildrenChange (0, this); } } --- 100,118 ---- } VisualizerNode parent = this.parent; ! if (parent != null && !parent.isComputingChildren()) { ! while (parent != null) { ! Object[] listeners = parent.getListenerList (); ! for (int i = listeners.length - 1; i >= 0; i -= 2) { ! ((NodeModel)listeners[i]).removed (ev); ! } ! parent = (VisualizerNode)parent.getParent (); } ! if (list.isEmpty ()) { ! // now is empty ! this.parent.notifyVisualizerChildrenChange (this); ! } } } *************** *** 154,165 **** list.addAll (Arrays.asList (arr)); VisualizerNode parent = this.parent; ! while (parent != null) { ! Object[] listeners = parent.getListenerList (); ! for (int i = listeners.length - 1; i >= 0; i -= 2) { ! ((NodeModel)listeners[i]).reordered (ev); } - parent = (VisualizerNode)parent.getParent (); } } --- 157,170 ---- list.addAll (Arrays.asList (arr)); VisualizerNode parent = this.parent; ! if (parent != null && !parent.isComputingChildren()) { ! while (parent != null) { ! Object[] listeners = parent.getListenerList (); ! for (int i = listeners.length - 1; i >= 0; i -= 2) { ! ((NodeModel)listeners[i]).reordered (ev); ! } ! parent = (VisualizerNode)parent.getParent (); } } } Index: openide/src/org/openide/explorer/view/VisualizerNode.java =================================================================== RCS file: /cvs/openide/src/org/openide/explorer/view/VisualizerNode.java,v retrieving revision 1.24 diff -c -r1.24 VisualizerNode.java *** openide/src/org/openide/explorer/view/VisualizerNode.java 11 Oct 2002 15:17:02 -0000 1.24 --- openide/src/org/openide/explorer/view/VisualizerNode.java 25 Nov 2002 13:19:00 -0000 *************** *** 17,22 **** --- 17,23 ---- import java.lang.ref.WeakReference; import java.beans.PropertyChangeListener; import java.util.*; + import javax.swing.ImageIcon; import javax.swing.UIManager; import javax.swing.SwingUtilities; import javax.swing.event.EventListenerList; *************** *** 43,51 **** /** one template to use for searching for visualizers */ private static final VisualizerNode TEMPLATE = new VisualizerNode (0); - /** constant holding empty reference to children */ - private static final Reference NO_REF = new WeakReference (null); - /** cache of visializers (VisualizerNode, Reference (VisualizerNode)) */ private static WeakHashMap cache = new WeakHashMap (); --- 44,49 ---- *************** *** 87,94 **** Node node; /** system hashcode of the node */ private int hashCode; ! /** visualizer children attached thru weak references Reference (VisualizerChildren) */ ! private Reference children = NO_REF; /** the VisualizerChildren that contains this VisualizerNode or null */ private VisualizerChildren parent; /** listener on UI */ --- 85,94 ---- Node node; /** system hashcode of the node */ private int hashCode; ! /** visualizer children */ ! private VisualizerChildren children = null; ! /** Flag to aviod repeated computing of children */ ! private transient boolean computingChildren = false; /** the VisualizerChildren that contains this VisualizerNode or null */ private VisualizerChildren parent; /** listener on UI */ *************** *** 98,103 **** --- 98,107 ---- public String name; /** cached display name */ public String displayName; + /** cached icon */ + public ImageIcon icon; + /** cached opened icon */ + public ImageIcon openedIcon; private static final String UNKNOWN = new String(); *************** *** 138,167 **** return desc; } /** Getter for list of children of this visualizer. * @return list of VisualizerNode objects */ public List getChildren () { ! VisualizerChildren ch = (VisualizerChildren)children.get (); if (ch == null && !node.isLeaf ()) { ! // go into lock to ensure that no childrenAdded, childrenRemoved, ! // childrenReordered notifications occures and that is why we do ! // not loose any changes ! ch = (VisualizerChildren)Children.MUTEX.readAccess (new Mutex.Action () { ! public Object run () { ! Node[] nodes = node.getChildren ().getNodes (); ! VisualizerChildren vc = new VisualizerChildren ( ! VisualizerNode.this, nodes ! ); ! notifyVisualizerChildrenChange (nodes.length, vc); ! return vc; ! } ! }); } return ch == null ? Collections.EMPTY_LIST : ch.list; } // // TreeNode interface (callable only from AWT-Event-Queue) --- 142,193 ---- return desc; } + /** Getter for node icon */ + ImageIcon getIcon (int type) { + if (icon == null) { + icon = NodeRenderer.getIcon(node.getIcon (type)); + } + return icon; + } + + /** Getter for opened node icon */ + ImageIcon getOpenedIcon (int type) { + if (openedIcon == null) { + openedIcon = NodeRenderer.getIcon(node.getIcon (type)); + } + return openedIcon; + } /** Getter for list of children of this visualizer. * @return list of VisualizerNode objects */ public List getChildren () { ! VisualizerChildren ch = children; if (ch == null && !node.isLeaf ()) { + computingChildren = true; ! // go into lock to ensure that no childrenAdded, childrenRemoved, ! // childrenReordered notifications occures and that is why we do ! // not loose any changes ! ch = (VisualizerChildren)Children.MUTEX.readAccess (new Mutex.Action () { ! public Object run () { ! Node[] nodes = node.getChildren ().getNodes (); ! VisualizerChildren vc = new VisualizerChildren ( ! VisualizerNode.this, nodes ! ); ! notifyVisualizerChildrenChange (vc); ! return vc; ! } ! }); ! computingChildren = false; } return ch == null ? Collections.EMPTY_LIST : ch.list; } + + /** returns whether children are computed or not */ + /* package private */ boolean isComputingChildren () { + return computingChildren; + } // // TreeNode interface (callable only from AWT-Event-Queue) *************** *** 224,234 **** * @param ev event describing the action */ public void childrenAdded(NodeMemberEvent ev) { ! VisualizerChildren ch = (VisualizerChildren)children.get (); ! if (ch == null) return; QUEUE.runSafe (new VisualizerEvent.Added ( ! ch, ev.getDelta (), ev.getDeltaIndices () )); } --- 250,259 ---- * @param ev event describing the action */ public void childrenAdded(NodeMemberEvent ev) { ! if (children == null) return; QUEUE.runSafe (new VisualizerEvent.Added ( ! children, ev.getDelta (), ev.getDeltaIndices () )); } *************** *** 236,255 **** * @param ev event describing the action */ public void childrenRemoved(NodeMemberEvent ev) { ! VisualizerChildren ch = (VisualizerChildren)children.get (); ! if (ch == null) return; ! QUEUE.runSafe (new VisualizerEvent.Removed (ch, ev.getDeltaIndices ())); } /** Fired when the order of children is changed. * @param ev event describing the change */ public void childrenReordered(NodeReorderEvent ev) { ! VisualizerChildren ch = (VisualizerChildren)children.get (); ! if (ch == null) return; ! QUEUE.runSafe (new VisualizerEvent.Reordered (ch, ev.getPermutation ())); } /** Fired when the node is deleted. --- 261,278 ---- * @param ev event describing the action */ public void childrenRemoved(NodeMemberEvent ev) { ! if (children == null) return; ! QUEUE.runSafe (new VisualizerEvent.Removed (children, ev.getDeltaIndices ())); } /** Fired when the order of children is changed. * @param ev event describing the change */ public void childrenReordered(NodeReorderEvent ev) { ! if (children == null) return; ! QUEUE.runSafe (new VisualizerEvent.Reordered (children, ev.getPermutation ())); } /** Fired when the node is deleted. *************** *** 277,283 **** SwingUtilities.invokeLater( new Runnable() { public void run() { ! children = NO_REF; // notify models VisualizerNode parent = VisualizerNode.this; while (parent != null) { --- 300,306 ---- SwingUtilities.invokeLater( new Runnable() { public void run() { ! children = null; // notify models VisualizerNode parent = VisualizerNode.this; while (parent != null) { *************** *** 307,312 **** --- 330,337 ---- name = node.getName (); displayName = node.getDisplayName (); shortDescription = UNKNOWN; + icon = null; + openedIcon = null; // // notify models *************** *** 331,343 **** * @param size amount of children * @param ch the children */ ! void notifyVisualizerChildrenChange (int size, VisualizerChildren ch) { ! if (size == 0) { ! // hold the children hard ! children = new StrongReference (ch); ! } else { ! children = new WeakReference (ch); ! } } // ******************************** --- 356,363 ---- * @param size amount of children * @param ch the children */ ! void notifyVisualizerChildrenChange (VisualizerChildren ch) { ! children = ch; } // ******************************** *************** *** 376,396 **** return displayName; } - /** Strong reference. - */ - private static final class StrongReference extends WeakReference { - private Object o; - public StrongReference (Object o) { - super (null); - this.o = o; - } - - public Object get () { - return o; - } - } - - /** Class that processes runnables in event queue. It guarantees that * the order of processed objects will be exactly the same as they * arrived. --- 396,401 ----