error reporting in 'Project Structure' dialog: merge UI updates (IDEA-116808, IDEA-110799)

This commit is contained in:
nik
2013-11-25 13:49:58 +04:00
parent 495fddcaa4
commit dfee10f094
@@ -7,13 +7,13 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.roots.ui.configuration.projectRoot.StructureConfigurableContext;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.MultiValuesMap;
import com.intellij.util.Alarm;
import com.intellij.util.EventDispatcher;
import com.intellij.util.ui.update.MergingUpdateQueue;
import com.intellij.util.ui.update.Update;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -29,6 +29,7 @@ public class ProjectStructureDaemonAnalyzer implements Disposable {
private final Set<ProjectStructureElement> myElementsToShowWarningIfUnused = new HashSet<ProjectStructureElement>();
private final Map<ProjectStructureElement, ProjectStructureProblemDescription> myWarningsAboutUnused = new HashMap<ProjectStructureElement, ProjectStructureProblemDescription>();
private final MergingUpdateQueue myAnalyzerQueue;
private final MergingUpdateQueue myResultsUpdateQueue;
private final EventDispatcher<ProjectStructureDaemonAnalyzerListener> myDispatcher = EventDispatcher.create(ProjectStructureDaemonAnalyzerListener.class);
private final AtomicBoolean myStopped = new AtomicBoolean(false);
private final ProjectConfigurationProblems myProjectConfigurationProblems;
@@ -36,7 +37,9 @@ public class ProjectStructureDaemonAnalyzer implements Disposable {
public ProjectStructureDaemonAnalyzer(StructureConfigurableContext context) {
Disposer.register(context, this);
myProjectConfigurationProblems = new ProjectConfigurationProblems(this, context);
myAnalyzerQueue = new MergingUpdateQueue("Project Structure Daemon Analyzer", 300, false, null, this, null, false);
myAnalyzerQueue = new MergingUpdateQueue("Project Structure Daemon Analyzer", 300, false, null, this, null, Alarm.ThreadToUse.POOLED_THREAD);
myResultsUpdateQueue = new MergingUpdateQueue("Project Structure Analysis Results Updater", 300, false, MergingUpdateQueue.ANY_COMPONENT,
this, null, Alarm.ThreadToUse.SWING_THREAD);
}
private void doUpdate(final ProjectStructureElement element, final boolean check, final boolean collectUsages) {
@@ -63,21 +66,7 @@ public class ProjectStructureDaemonAnalyzer implements Disposable {
ProjectStructureValidator.check(element, problemsHolder);
}
}.execute();
invokeLater(new Runnable() {
@Override
public void run() {
if (myStopped.get()) return;
if (LOG.isDebugEnabled()) {
LOG.debug("updating problems for " + element);
}
final ProjectStructureProblemDescription warning = myWarningsAboutUnused.get(element);
if (warning != null)
problemsHolder.registerProblem(warning);
myProblemHolders.put(element, problemsHolder);
myDispatcher.getMulticaster().problemsChanged(element);
}
});
myResultsUpdateQueue.queue(new ProblemsComputedUpdate(element, problemsHolder));
}
private void doCollectUsages(final ProjectStructureElement element) {
@@ -92,18 +81,9 @@ public class ProjectStructureDaemonAnalyzer implements Disposable {
result.setResult(getUsagesInElement(element));
}
}.execute().getResultObject();
invokeLater(new Runnable() {
@Override
public void run() {
if (myStopped.get() || usages == null) return;
if (LOG.isDebugEnabled()) {
LOG.debug("updating usages for " + element);
}
updateUsages(element, usages);
}
});
if (usages != null) {
myResultsUpdateQueue.queue(new UsagesCollectedUpdate(element, usages));
}
}
private static List<ProjectStructureElementUsage> getUsagesInElement(final ProjectStructureElement element) {
@@ -116,11 +96,7 @@ public class ProjectStructureDaemonAnalyzer implements Disposable {
addUsage(usage);
}
myElementWithNotCalculatedUsages.remove(element);
reportUnusedElements();
}
private static void invokeLater(Runnable runnable) {
SwingUtilities.invokeLater(runnable);
myResultsUpdateQueue.queue(new ReportUnusedElementsUpdate());
}
public void queueUpdate(@NotNull final ProjectStructureElement element) {
@@ -159,7 +135,7 @@ public class ProjectStructureDaemonAnalyzer implements Disposable {
removeUsagesInElement(element);
myDispatcher.getMulticaster().problemsChanged(element);
}
reportUnusedElements();
myResultsUpdateQueue.queue(new ReportUnusedElementsUpdate());
}
@@ -212,8 +188,10 @@ public class ProjectStructureDaemonAnalyzer implements Disposable {
LOG.debug("analyzer stopped");
myStopped.set(true);
myAnalyzerQueue.cancelAllUpdates();
myResultsUpdateQueue.cancelAllUpdates();
clearCaches();
myAnalyzerQueue.deactivate();
myResultsUpdateQueue.deactivate();
}
public void clearCaches() {
@@ -239,6 +217,7 @@ public class ProjectStructureDaemonAnalyzer implements Disposable {
public void dispose() {
myStopped.set(true);
myAnalyzerQueue.cancelAllUpdates();
myResultsUpdateQueue.cancelAllUpdates();
}
@Nullable
@@ -263,6 +242,7 @@ public class ProjectStructureDaemonAnalyzer implements Disposable {
public void reset() {
LOG.debug("analyzer started");
myAnalyzerQueue.activate();
myResultsUpdateQueue.activate();
myAnalyzerQueue.queue(new Update("reset") {
@Override
public void run() {
@@ -277,9 +257,7 @@ public class ProjectStructureDaemonAnalyzer implements Disposable {
mySourceElement2Usages.clear();
myContainingElement2Usages.clear();
myElementWithNotCalculatedUsages.clear();
if (myProjectConfigurationProblems != null) {
myProjectConfigurationProblems.clearProblems();
}
myProjectConfigurationProblems.clearProblems();
}
private class AnalyzeElementUpdate extends Update {
@@ -319,4 +297,78 @@ public class ProjectStructureDaemonAnalyzer implements Disposable {
}
}
}
private class UsagesCollectedUpdate extends Update {
private final ProjectStructureElement myElement;
private final List<ProjectStructureElementUsage> myUsages;
private final Object[] myEqualityObjects;
public UsagesCollectedUpdate(ProjectStructureElement element, List<ProjectStructureElementUsage> usages) {
super(element);
myElement = element;
myUsages = usages;
myEqualityObjects = new Object[]{element, "usages collected"};
}
@NotNull
@Override
public Object[] getEqualityObjects() {
return myEqualityObjects;
}
@Override
public void run() {
if (myStopped.get()) return;
if (LOG.isDebugEnabled()) {
LOG.debug("updating usages for " + myElement);
}
updateUsages(myElement, myUsages);
}
}
private class ProblemsComputedUpdate extends Update {
private final ProjectStructureElement myElement;
private final ProjectStructureProblemsHolderImpl myProblemsHolder;
private final Object[] myEqualityObjects;
public ProblemsComputedUpdate(ProjectStructureElement element, ProjectStructureProblemsHolderImpl problemsHolder) {
super(element);
myElement = element;
myProblemsHolder = problemsHolder;
myEqualityObjects = new Object[]{element, "problems computed"};
}
@NotNull
@Override
public Object[] getEqualityObjects() {
return myEqualityObjects;
}
@Override
public void run() {
if (myStopped.get()) return;
if (LOG.isDebugEnabled()) {
LOG.debug("updating problems for " + myElement);
}
final ProjectStructureProblemDescription warning = myWarningsAboutUnused.get(myElement);
if (warning != null) {
myProblemsHolder.registerProblem(warning);
}
myProblemHolders.put(myElement, myProblemsHolder);
myDispatcher.getMulticaster().problemsChanged(myElement);
}
}
private class ReportUnusedElementsUpdate extends Update {
private ReportUnusedElementsUpdate() {
super("unused elements");
}
@Override
public void run() {
reportUnusedElements();
}
}
}