Index: src/org/openide/explorer/view/TreeView.java =================================================================== RCS file: /cvs/openide/src/org/openide/explorer/view/TreeView.java,v retrieving revision 1.121 diff -u -r1.121 TreeView.java --- src/org/openide/explorer/view/TreeView.java 3 Feb 2003 07:36:56 -0000 1.121 +++ src/org/openide/explorer/view/TreeView.java 4 Feb 2003 19:03:26 -0000 @@ -115,6 +115,11 @@ transient TreeViewDropSupport dropSupport; transient boolean dropTargetPopupAllowed = true; + transient private Container contentPane; + transient private PropertyChangeListener waitListener; + transient private Node waitingNode; + transient private String PROP_INIT_CHILDREN_STARTED = "initChildrenStarted"; // NOI18N + transient private String PROP_INIT_CHILDREN_FINISHED = "initChildrenFinished"; // NOI18N /** Constructor. */ @@ -180,6 +185,7 @@ // init listener & attach it to closing of managerListener = new TreePropertyListener(); tree.addTreeExpansionListener (managerListener); + tree.addTreeWillExpandListener (managerListener); // do not care about focus setRequestFocusEnabled (false); @@ -393,6 +399,7 @@ * @param n node */ public void expandNode (Node n) { + lookupExplorerManager (); @@ -483,7 +490,6 @@ public void removeNotify () { super.removeNotify (); - //System.out.println ("Calling remove notify..."); // NOI18N tree.getSelectionModel().removeTreeSelectionListener(managerListener); } @@ -660,6 +666,64 @@ return tree.getSelectionModel ().getSelectionMode (); } + private void showWaitCursor () { + if (contentPane == null) { + contentPane = getRootPane ().getContentPane (); + } + if (SwingUtilities.isEventDispatchThread ()) { + contentPane.setCursor (Utilities.createProgressCursor (contentPane)); + } else { + SwingUtilities.invokeLater (new Runnable () { + public void run () { + contentPane.setCursor (Utilities.createProgressCursor (contentPane)); + } + }); + } + } + + private void showNormalCursor () { + if (contentPane == null) { + contentPane = getRootPane ().getContentPane (); + } + if (SwingUtilities.isEventDispatchThread ()) { + contentPane.setCursor (null); + } else { + SwingUtilities.invokeLater (new Runnable () { + public void run () { + contentPane.setCursor (null); + } + }); + } + if (waitingNode !=null) { + removePropertyChangeListener (waitListener); + } + } + + private void prepareWaitCursor (final Node node) { + // check type of node + if (node == null) { + showNormalCursor (); + } + waitingNode = node; + + // initialize wait listener + if (waitListener == null) { + waitListener = new PropertyChangeListener () { + public void propertyChange (PropertyChangeEvent evt) { + if (PROP_INIT_CHILDREN_STARTED.equals (evt.getPropertyName ())) { + showWaitCursor (); + } + if (PROP_INIT_CHILDREN_FINISHED.equals (evt.getPropertyName ())) { + showNormalCursor (); + } + } + }; + } + + // remove wait listener + node.addPropertyChangeListener (waitListener); + } + /** Synchronize the selected nodes from the manager of this Explorer. * The default implementation does nothing. */ @@ -691,6 +755,7 @@ class TreePropertyListener implements VetoableChangeListener, PropertyChangeListener, TreeExpansionListener, + TreeWillExpandListener, TreeSelectionListener, Runnable { private RequestProcessor.Task scheduled; @@ -721,7 +786,7 @@ public synchronized void treeExpanded (TreeExpansionEvent ev) { final TreePath path = ev.getPath (); - + RequestProcessor.Task t = scheduled; if (t != null) { t.cancel (); @@ -733,11 +798,13 @@ public void run () { if (!SwingUtilities.isEventDispatchThread()) { SwingUtilities.invokeLater (this); + return; } if (!tree.isVisible(path)) { // if the path is not visible - don't check the children + return; } @@ -755,6 +822,9 @@ // System.out.println("different roots."); return; } + + // show wait cursor + //showWaitCursor (); int lastChildIndex = myNode.getChildCount()-1; if (lastChildIndex >= 0) { @@ -775,6 +845,7 @@ public synchronized void treeCollapsed (final TreeExpansionEvent ev) { final TreePath path = ev.getPath (); + showNormalCursor (); RequestProcessor.Task t = scheduled; if (t != null) { @@ -871,6 +942,15 @@ callSelectionChanged ((Node[])ll.toArray (new Node[ll.size ()])); } + public void treeWillCollapse(TreeExpansionEvent event) throws ExpandVetoException { + } + + public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException { + // prepare wait cursor and optionally show it + TreePath path = event.getPath (); + prepareWaitCursor (DragDropUtilities.secureFindNode (path.getLastPathComponent ())); + } + } // end of TreePropertyListener Index: src/org/openide/loaders/DataFolder.java =================================================================== RCS file: /cvs/openide/src/org/openide/loaders/DataFolder.java,v retrieving revision 1.133 diff -u -r1.133 DataFolder.java --- src/org/openide/loaders/DataFolder.java 29 Jan 2003 01:42:46 -0000 1.133 +++ src/org/openide/loaders/DataFolder.java 4 Feb 2003 19:03:27 -0000 @@ -1038,6 +1038,10 @@ /** Node for a folder. */ public class FolderNode extends DataNode { + + private String PROP_INIT_CHILDREN_STARTED = "initChildrenStarted"; // NOI18N + private String PROP_INIT_CHILDREN_FINISHED = "initChildrenFinished"; // NOI18N + /** Create a folder node with some children. * @param ch children to use for the node */ @@ -1059,6 +1063,16 @@ } else { return super.getCookie (clazz); } + } + + /** Helper method informs TreeView about start of calucation the folder children. */ + void fireChildrenStarted () { + firePropertyChange (PROP_INIT_CHILDREN_STARTED, null, Boolean.TRUE); + } + + /** Helper method informs TreeView about the calucation of folder children was finished. */ + void fireChildrenFinished () { + firePropertyChange (PROP_INIT_CHILDREN_FINISHED, null, Boolean.TRUE); } /* Adds properties for sorting. Index: src/org/openide/loaders/FolderChildren.java =================================================================== RCS file: /cvs/openide/src/org/openide/loaders/FolderChildren.java,v retrieving revision 1.61 diff -u -r1.61 FolderChildren.java --- src/org/openide/loaders/FolderChildren.java 4 Feb 2003 13:38:43 -0000 1.61 +++ src/org/openide/loaders/FolderChildren.java 4 Feb 2003 19:03:27 -0000 @@ -208,6 +208,10 @@ * @param force true if the content should be filled immediatelly */ private Task initialize (boolean force, boolean waitFirst) { + // fire event that initialization children started + if (folder.getNodeDelegate () instanceof DataFolder.FolderNode) { + ((DataFolder.FolderNode)folder.getNodeDelegate ()).fireChildrenStarted (); + } Task t = initTask; @@ -249,7 +253,7 @@ } /** time delay between two inserts of nodes */ - private static final int TIME_DELAY = 256; + private static final int TIME_DELAY = 1024; /** Private req processor for Addition's refresh tasks */ private static RequestProcessor refRP = @@ -418,6 +422,13 @@ } } } + if (processingFinished) { + // fire event that initialization children finished + if (folder.getNodeDelegate () instanceof DataFolder.FolderNode) { + ((DataFolder.FolderNode)folder.getNodeDelegate ()).fireChildrenFinished (); + } + } + } }