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(); lastIndicator = new ProgressIndicatorBase();
// Move long resolve operation to another thread // Move long resolve operation to another thread
ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { searchResolvedDescriptor(jetFile, declaration, editor, lastIndicator);
@Override
public void run() {
searchResolvedDescriptor(jetFile, declaration, editor, lastIndicator);
}
});
} }
else { else {
// Mouse moved out of the declaration - can stop search for descriptor // 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); | 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( private void searchResolvedDescriptor(
@NotNull final JetFile jetFile, @NotNull final JetFile jetFile,
@NotNull final JetNamedDeclaration declaration, @NotNull final JetNamedDeclaration declaration,
@NotNull final Editor editor, @NotNull final Editor editor,
@NotNull final ProgressIndicator indicator @NotNull final ProgressIndicator indicator
) { ) {
runWithWriteActionPriority(indicator, new Runnable() { ApplicationManager.getApplication().executeOnPooledThread(new Runnable() {
@Override @Override
public void run() { public void run() {
DeclarationDescriptor descriptor = null; runWithWriteActionPriority(indicator, new Runnable() {
try { @Override
BindingContext bindingContext = WholeProjectAnalyzerFacade.analyzeProjectWithCacheOnAFile(jetFile).getBindingContext(); public void run() {
descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, declaration); // Executed in the thread from Thread Pool
} DeclarationDescriptor descriptor = null;
finally { try {
// Back to GUI thread for submitting result BindingContext bindingContext =
final DeclarationDescriptor finalDescriptor = descriptor; WholeProjectAnalyzerFacade.analyzeProjectWithCacheOnAFile(jetFile).getBindingContext();
ApplicationManager.getApplication().invokeLater(new Runnable() { descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, declaration);
@Override
public void run() {
onDescriptorReady(finalDescriptor, declaration, editor, jetFile, indicator);
} }
}); 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. * Execute action with immediate stop when write lock is required.
* *
* @see ProgressIndicatorUtils.runWithWriteActionPriority();
*
* @param indicator * @param indicator
* @param action * @param action
* @see ProgressIndicatorUtils.runWithWriteActionPriority();
*/ */
@SuppressWarnings("JavadocReference")
private void runWithWriteActionPriority(final ProgressIndicator indicator, final Runnable action) { private void runWithWriteActionPriority(final ProgressIndicator indicator, final Runnable action) {
// Executed in Thread Pool // Executed in Thread Pool
final ApplicationAdapter listener = new ApplicationAdapter() { final ApplicationAdapter listener = new ApplicationAdapter() {
@@ -235,7 +237,7 @@ public class DeclarationHintSupport extends AbstractProjectComponent {
final Application application = ApplicationManager.getApplication(); final Application application = ApplicationManager.getApplication();
try { try {
application.addApplicationListener(listener); application.addApplicationListener(listener);
ProgressManager.getInstance().runProcess(new Runnable(){ ProgressManager.getInstance().runProcess(new Runnable() {
@Override @Override
public void run() { public void run() {
application.runReadAction(action); application.runReadAction(action);