# HG changeset patch # Parent c5dde9b9dc15b119316af211681eb6627d940e28 #252073 - Can expand no explorer nodes if one directory is very slow diff -r c5dde9b9dc15 openide.loaders/src/org/openide/loaders/DataNode.java --- a/openide.loaders/src/org/openide/loaders/DataNode.java Fri Sep 11 14:12:35 2015 +0200 +++ b/openide.loaders/src/org/openide/loaders/DataNode.java Fri Sep 11 16:48:32 2015 +0200 @@ -582,7 +582,7 @@ DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message(message)); return; } - DataNodeUtils.reqProcessor().post(new Runnable() { // #232671 + DataNodeUtils.reqProcessor(obj.getPrimaryFile()).post(new Runnable() { // #232671 @Override public void run() { setNewExt(newExt); @@ -841,20 +841,36 @@ if ( refresh ) { // refresh current nodes display name - DataNodeUtils.reqProcessor().post(new Runnable() { - @Override - public void run () { - Iterator it = DataObjectPool.getPOOL().getActiveDataObjects(); - while ( it.hasNext() ) { - DataObject obj = ((DataObjectPool.Item)it.next()).getDataObjectOrNull(); - if ( obj != null && obj.getNodeDelegate() instanceof DataNode ) { - ((DataNode)obj.getNodeDelegate()).updateDisplayName(); + Map> mapping + = new HashMap>(); + Iterator it = DataObjectPool.getPOOL().getActiveDataObjects(); + + // Assign DataNodes to RequestProcessors. See bug 252073 comment 17. + while (it.hasNext()) { + DataObject obj = ((DataObjectPool.Item) it.next()).getDataObjectOrNull(); + if (obj != null && obj.getNodeDelegate() instanceof DataNode) { + RequestProcessor rp = DataNodeUtils.reqProcessor(obj.getPrimaryFile()); + List list = mapping.get(rp); + if (list == null) { + list = new ArrayList(); + mapping.put(rp, list); + } + list.add(obj); + } + } + + for (Map.Entry> e : mapping.entrySet()) { + final List list = e.getValue(); + e.getKey().post(new Runnable() { + @Override + public void run() { + for (DataObject obj: list) { + ((DataNode) obj.getNodeDelegate()).updateDisplayName(); } - } - } - }, 300, Thread.MIN_PRIORITY); - } - + } + }, 300, Thread.MIN_PRIORITY); + } + } } private static Class defaultLookup; @@ -1005,14 +1021,55 @@ } refreshNamesIconsRunning = false; } - for (int i = 0; i < _refreshNameNodes.length; i++) { - _refreshNameNodes[i].fireChangeAccess(false, true); + // refresh name nodes + for (final Map.Entry> e + : groupByRP(_refreshNameNodes).entrySet()) { + e.getKey().post(new Runnable() { // post list to assigned RP + @Override + public void run() { + for (DataNode n: e.getValue()) { + n.fireChangeAccess(false, true); + } + } + }); } - for (int i = 0; i < _refreshIconNodes.length; i++) { - _refreshIconNodes[i].fireChangeAccess(true, false); + // refresh icon nodes + for (final Map.Entry> e + : groupByRP(_refreshIconNodes).entrySet()) { + e.getKey().post(new Runnable() { // post list to assigned RP + @Override + public void run() { + for (DataNode n: e.getValue()) { + n.fireChangeAccess(true, false); + } + } + }); } } - + + /** + * Group array of nodes by assigned RequestProcessors. + * + * @param nodes + * @return Mapping from RequestProcessor to list of nodes assigned to + * it. + */ + private Map> groupByRP(DataNode nodes[]) { + Map> mapping + = new HashMap>(); + for (DataNode node : nodes) { + DataObject dob = node.getDataObject(); + FileObject fo = dob == null ? null : dob.getPrimaryFile(); + RequestProcessor rp = DataNodeUtils.reqProcessor(fo); + List set = mapping.get(rp); + if (set == null) { + set = new ArrayList(); + mapping.put(rp, set); + } + set.add(node); + } + return mapping; + } } /** Handle for data object nodes */ diff -r c5dde9b9dc15 openide.loaders/src/org/openide/loaders/FolderChildren.java --- a/openide.loaders/src/org/openide/loaders/FolderChildren.java Fri Sep 11 14:12:35 2015 +0200 +++ b/openide.loaders/src/org/openide/loaders/FolderChildren.java Fri Sep 11 16:48:32 2015 +0200 @@ -133,10 +133,6 @@ this.pairs = pairs; } - static void waitRefresh() { - DataNodeUtils.reqProcessor().post(Task.EMPTY, 0, Thread.MIN_PRIORITY).waitFinished(); - } - /** If the folder changed its children we change our nodes. */ @Override @@ -585,7 +581,7 @@ } final synchronized void scheduleRefresh(String by) { - task = DataNodeUtils.reqProcessor().post(this); + task = DataNodeUtils.reqProcessor(pair.primaryFile).post(this); err.log(Level.FINE, "Task initialized by {0} to {1} for {2}", new Object[] { by, task, this }); } }