diff -r c9cba4f80aef java.sourceui/src/org/netbeans/modules/java/source/ui/JavaTypeProvider.java --- a/java.sourceui/src/org/netbeans/modules/java/source/ui/JavaTypeProvider.java Wed Nov 04 12:42:44 2009 +0300 +++ b/java.sourceui/src/org/netbeans/modules/java/source/ui/JavaTypeProvider.java Wed Nov 04 12:45:16 2009 +0100 @@ -347,13 +347,8 @@ } if (types.isEmpty() && scanInProgress) { - try { - synchronized (JavaTypeProvider.this) { - this.wait(2000); - } - } catch (InterruptedException ex) { - Exceptions.printStackTrace(ex); - } + res.pendingResult(); + return; } if ( isCanceled ) { diff -r c9cba4f80aef jumpto/apichanges.xml --- a/jumpto/apichanges.xml Wed Nov 04 12:42:44 2009 +0300 +++ b/jumpto/apichanges.xml Wed Nov 04 12:45:16 2009 +0100 @@ -121,6 +121,22 @@ + + + Added method (Type|Symbol)Provider.Result.pendingResult() + + + + + + Added method TypeProvider.Result.pendingResult() and + SymbolProvider.Result.pendingResult() to notify + provider's caller that the provider should be called again. + + + + + diff -r c9cba4f80aef jumpto/manifest.mf --- a/jumpto/manifest.mf Wed Nov 04 12:42:44 2009 +0300 +++ b/jumpto/manifest.mf Wed Nov 04 12:45:16 2009 +0100 @@ -2,5 +2,5 @@ OpenIDE-Module: org.netbeans.modules.jumpto/1 OpenIDE-Module-Layer: org/netbeans/modules/jumpto/resources/layer.xml OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/jumpto/resources/Bundle.properties -OpenIDE-Module-Specification-Version: 1.11 +OpenIDE-Module-Specification-Version: 1.12 AutoUpdate-Show-In-Client: false diff -r c9cba4f80aef jumpto/src/org/netbeans/modules/jumpto/symbol/SymbolProviderAccessor.java --- a/jumpto/src/org/netbeans/modules/jumpto/symbol/SymbolProviderAccessor.java Wed Nov 04 12:42:44 2009 +0300 +++ b/jumpto/src/org/netbeans/modules/jumpto/symbol/SymbolProviderAccessor.java Wed Nov 04 12:45:16 2009 +0100 @@ -45,6 +45,7 @@ import org.netbeans.spi.jumpto.symbol.SymbolProvider; import org.netbeans.spi.jumpto.type.SearchType; import org.openide.util.Exceptions; +import static org.netbeans.spi.jumpto.symbol.SymbolProvider.*; /** * @@ -65,4 +66,6 @@ public abstract SymbolProvider.Context createContext(Project p, String text, SearchType t); public abstract SymbolProvider.Result createResult(List result, String[] message); + + public abstract int getRetry(Result result); } diff -r c9cba4f80aef jumpto/src/org/netbeans/modules/jumpto/type/GoToTypeAction.java --- a/jumpto/src/org/netbeans/modules/jumpto/type/GoToTypeAction.java Wed Nov 04 12:42:44 2009 +0300 +++ b/jumpto/src/org/netbeans/modules/jumpto/type/GoToTypeAction.java Wed Nov 04 12:45:16 2009 +0100 @@ -63,6 +63,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Pattern; import javax.swing.AbstractAction; @@ -389,40 +390,51 @@ this.text = text; this.createTime = System.currentTimeMillis(); LOGGER.fine( "Worker for " + text + " - created after " + ( System.currentTimeMillis() - panel.time ) + " ms." ); - } - + } + public void run() { - - LOGGER.fine( "Worker for " + text + " - started " + ( System.currentTimeMillis() - createTime ) + " ms." ); - - final List types = getTypeNames( text ); - if ( isCanceled ) { - LOGGER.fine( "Worker for " + text + " exited after cancel " + ( System.currentTimeMillis() - createTime ) + " ms." ); - return; - } - ListModel model = Models.fromList(types); - if (typeFilter != null) { - model = LazyListModel.create(model, GoToTypeAction.this, 0.1, "Not computed yet"); - } - final ListModel fmodel = model; - if ( isCanceled ) { - LOGGER.fine( "Worker for " + text + " exited after cancel " + ( System.currentTimeMillis() - createTime ) + " ms." ); - return; - } - - if ( !isCanceled && fmodel != null ) { - LOGGER.fine( "Worker for text " + text + " finished after " + ( System.currentTimeMillis() - createTime ) + " ms." ); - SwingUtilities.invokeLater(new Runnable() { - public void run() { - panel.setModel(fmodel); - if (okButton != null && !types.isEmpty()) { - okButton.setEnabled (true); + for (;;) { + final int[] retry = new int[1]; + LOGGER.fine( "Worker for " + text + " - started " + ( System.currentTimeMillis() - createTime ) + " ms." ); + + final List types = getTypeNames( text, retry); + if ( isCanceled ) { + LOGGER.fine( "Worker for " + text + " exited after cancel " + ( System.currentTimeMillis() - createTime ) + " ms." ); + return; + } + ListModel model = Models.fromList(types); + if (typeFilter != null) { + model = LazyListModel.create(model, GoToTypeAction.this, 0.1, "Not computed yet"); + } + final ListModel fmodel = model; + if ( isCanceled ) { + LOGGER.fine( "Worker for " + text + " exited after cancel " + ( System.currentTimeMillis() - createTime ) + " ms." ); + return; + } + + if ( !isCanceled && fmodel != null ) { + LOGGER.fine( "Worker for text " + text + " finished after " + ( System.currentTimeMillis() - createTime ) + " ms." ); + SwingUtilities.invokeLater(new Runnable() { + public void run() { + if (!types.isEmpty() || retry[0] == 0) { + panel.setModel(fmodel); + } + if (okButton != null && !types.isEmpty()) { + okButton.setEnabled (true); + } } + }); + } + if (retry[0] > 0) { + try { + Thread.sleep(retry[0]); + } catch (InterruptedException ex) { + LOGGER.log(Level.WARNING, "Waiting for retry", ex); } - }); - } - - + } else { + return; + } + } // for } public void cancel() { @@ -440,7 +452,7 @@ } @SuppressWarnings("unchecked") - private List getTypeNames(String text) { + private List getTypeNames(String text, int[] retry) { // TODO: Search twice, first for current project, then for all projects List items; // Multiple providers: merge results @@ -465,8 +477,8 @@ } long delta = System.currentTimeMillis() - start; LOGGER.fine("Provider '" + provider.getDisplayName() + "' took " + delta + " ms."); - } + retry[0] = TypeProviderAccessor.DEFAULT.getRetry(result); if ( !isCanceled ) { //time = System.currentTimeMillis(); Collections.sort(items, new TypeComparator()); @@ -513,7 +525,7 @@ final void waitSearchFinished() { task.waitFinished(); } - + private static class Renderer extends DefaultListCellRenderer implements ChangeListener { private MyPanel rendererComponent; diff -r c9cba4f80aef jumpto/src/org/netbeans/modules/jumpto/type/TypeProviderAccessor.java --- a/jumpto/src/org/netbeans/modules/jumpto/type/TypeProviderAccessor.java Wed Nov 04 12:42:44 2009 +0300 +++ b/jumpto/src/org/netbeans/modules/jumpto/type/TypeProviderAccessor.java Wed Nov 04 12:45:16 2009 +0100 @@ -64,4 +64,6 @@ public abstract Context createContext(Project p, String text, SearchType t); public abstract Result createResult(List result, String[] message); + + public abstract int getRetry(Result result); } diff -r c9cba4f80aef jumpto/src/org/netbeans/spi/jumpto/symbol/SymbolProvider.java --- a/jumpto/src/org/netbeans/spi/jumpto/symbol/SymbolProvider.java Wed Nov 04 12:42:44 2009 +0300 +++ b/jumpto/src/org/netbeans/spi/jumpto/symbol/SymbolProvider.java Wed Nov 04 12:45:16 2009 +0100 @@ -135,7 +135,14 @@ @Override public Result createResult(List result, String[] message) { return new Result(result, message); - } + } + + @Override + public int getRetry(Result result) { + return result.retry; + } + + }; } @@ -179,6 +186,7 @@ private List result; private String[] message; + private int retry; Result(List result, String[] message) { this.result = result; @@ -213,6 +221,19 @@ public void addResult(List symbolDescriptor) { ((List)result).addAll(symbolDescriptor); //workaround javac issue http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6507334 } + + /** + * Notify caller that a provider should be called again because + * of incomplete or inaccurate results. + * + * Method can be used when long running task blocks the provider + * to complete the data. + * + * @since 1.12 + */ + public void pendingResult() { + retry = 2000; + } } } diff -r c9cba4f80aef jumpto/src/org/netbeans/spi/jumpto/type/TypeProvider.java --- a/jumpto/src/org/netbeans/spi/jumpto/type/TypeProvider.java Wed Nov 04 12:42:44 2009 +0300 +++ b/jumpto/src/org/netbeans/spi/jumpto/type/TypeProvider.java Wed Nov 04 12:45:16 2009 +0100 @@ -138,6 +138,11 @@ public Result createResult(List result, String[] message) { return new Result(result, message); } + + @Override + public int getRetry(Result result) { + return result.retry; + } }; } @@ -182,6 +187,7 @@ private List result; private String[] message; + private int retry; Result(List result, String[] message) { this.result = result; @@ -216,6 +222,19 @@ public void addResult(List typeDescriptor) { ((List)result).addAll(typeDescriptor); //workaround javac issue http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6507334 } + + /** + * Notify caller that a provider should be called again because + * of incomplete or inaccurate results. + * + * Method can be used when long running task blocks the provider + * to complete the data. + * + * @since 1.12 + */ + public void pendingResult() { + retry = 2000; + } } }