Capture indicator value before moving to another thread

This commit is contained in:
Nikolay Krasko
2012-08-24 11:16:40 +04:00
parent 719234b802
commit 607a502fd7
@@ -117,12 +117,7 @@ public class DeclarationHintSupport extends AbstractProjectComponent {
lastIndicator = new ProgressIndicatorBase();
// Move long resolve operation to another thread
ApplicationManager.getApplication().executeOnPooledThread(new Runnable() {
@Override
public void run() {
searchResolvedDescriptor(jetFile, declaration, editor, lastIndicator);
}
});
searchResolvedDescriptor(jetFile, declaration, editor, lastIndicator);
}
else {
// Mouse moved out of the declaration - can stop search for descriptor
@@ -187,31 +182,38 @@ public class DeclarationHintSupport extends AbstractProjectComponent {
| HintManager.HIDE_BY_SCROLLING | HintManager.HIDE_BY_OTHER_HINT | HintManager.HIDE_BY_MOUSEOVER, 0, false);
}
// Executed in Thread Pool
// Moves execution from GUI thread to thread pool thread
private void searchResolvedDescriptor(
@NotNull final JetFile jetFile,
@NotNull final JetNamedDeclaration declaration,
@NotNull final Editor editor,
@NotNull final ProgressIndicator indicator
) {
runWithWriteActionPriority(indicator, new Runnable() {
ApplicationManager.getApplication().executeOnPooledThread(new Runnable() {
@Override
public void run() {
DeclarationDescriptor descriptor = null;
try {
BindingContext bindingContext = WholeProjectAnalyzerFacade.analyzeProjectWithCacheOnAFile(jetFile).getBindingContext();
descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, declaration);
}
finally {
// Back to GUI thread for submitting result
final DeclarationDescriptor finalDescriptor = descriptor;
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
onDescriptorReady(finalDescriptor, declaration, editor, jetFile, indicator);
runWithWriteActionPriority(indicator, new Runnable() {
@Override
public void run() {
// Executed in the thread from Thread Pool
DeclarationDescriptor descriptor = null;
try {
BindingContext bindingContext =
WholeProjectAnalyzerFacade.analyzeProjectWithCacheOnAFile(jetFile).getBindingContext();
descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, declaration);
}
});
}
finally {
// Back to GUI thread for submitting result
final DeclarationDescriptor finalDescriptor = descriptor;
ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
onDescriptorReady(finalDescriptor, declaration, editor, jetFile, indicator);
}
});
}
}
});
}
});
}
@@ -219,11 +221,11 @@ public class DeclarationHintSupport extends AbstractProjectComponent {
/**
* Execute action with immediate stop when write lock is required.
*
* @see ProgressIndicatorUtils.runWithWriteActionPriority();
*
* @param indicator
* @param action
* @see ProgressIndicatorUtils.runWithWriteActionPriority();
*/
@SuppressWarnings("JavadocReference")
private void runWithWriteActionPriority(final ProgressIndicator indicator, final Runnable action) {
// Executed in Thread Pool
final ApplicationAdapter listener = new ApplicationAdapter() {
@@ -235,7 +237,7 @@ public class DeclarationHintSupport extends AbstractProjectComponent {
final Application application = ApplicationManager.getApplication();
try {
application.addApplicationListener(listener);
ProgressManager.getInstance().runProcess(new Runnable(){
ProgressManager.getInstance().runProcess(new Runnable() {
@Override
public void run() {
application.runReadAction(action);