diff options
Diffstat (limited to 'platform/platform-impl/src/com/intellij/ide/UiActivityMonitorImpl.java')
-rw-r--r-- | platform/platform-impl/src/com/intellij/ide/UiActivityMonitorImpl.java | 170 |
1 files changed, 58 insertions, 112 deletions
diff --git a/platform/platform-impl/src/com/intellij/ide/UiActivityMonitorImpl.java b/platform/platform-impl/src/com/intellij/ide/UiActivityMonitorImpl.java index c25c68b4bb2b..e9de64905415 100644 --- a/platform/platform-impl/src/com/intellij/ide/UiActivityMonitorImpl.java +++ b/platform/platform-impl/src/com/intellij/ide/UiActivityMonitorImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,6 @@ package com.intellij.ide; import com.intellij.openapi.Disposable; -import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.application.ModalityStateListener; @@ -24,7 +23,6 @@ import com.intellij.openapi.application.impl.LaterInvocator; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.BusyObject; import com.intellij.openapi.util.Disposer; -import com.intellij.openapi.util.registry.Registry; import com.intellij.util.containers.FactoryMap; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; @@ -34,16 +32,16 @@ import javax.swing.*; import java.util.*; public class UiActivityMonitorImpl extends UiActivityMonitor implements ModalityStateListener, Disposable { - private final FactoryMap<Project, BusyContainer> myObjects = new FactoryMap<Project, BusyContainer>() { @Override protected BusyContainer create(Project key) { if (isEmpty()) { installListener(); } - return key == null ? new BusyContainer(key) : new BusyContainer(null) { + return key == null ? new BusyContainer(null) : new BusyContainer(null) { + @NotNull @Override - protected BusyImpl createBusyImpl(HashSet<UiActivity> key) { + protected BusyImpl createBusyImpl(@NotNull Set<UiActivity> key) { return new BusyImpl(key, this) { @Override public boolean isReady() { @@ -63,7 +61,8 @@ public class UiActivityMonitorImpl extends UiActivityMonitor implements Modality private boolean myActive; - private BusyObject myEmptyBusy = new BusyObject.Impl() { + @NotNull + private final BusyObject myEmptyBusy = new BusyObject.Impl() { @Override public boolean isReady() { return true; @@ -84,17 +83,12 @@ public class UiActivityMonitorImpl extends UiActivityMonitor implements Modality @Override public void beforeModalityStateChanged(boolean entering) { - if (isUnitTestMode()) { - maybeReady(); - } - else { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - maybeReady(); - } - }); - } + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + maybeReady(); + } + }); } public void maybeReady() { @@ -103,15 +97,17 @@ public class UiActivityMonitorImpl extends UiActivityMonitor implements Modality } } + @NotNull @Override - public BusyObject getBusy(@NotNull Project project, UiActivity... toWatch) { + public BusyObject getBusy(@NotNull Project project, @NotNull UiActivity... toWatch) { if (!isActive()) return myEmptyBusy; return _getBusy(project, toWatch); } + @NotNull @Override - public BusyObject getBusy(UiActivity... toWatch) { + public BusyObject getBusy(@NotNull UiActivity... toWatch) { if (!isActive()) return myEmptyBusy; return _getBusy(null, toWatch); @@ -129,10 +125,10 @@ public class UiActivityMonitorImpl extends UiActivityMonitor implements Modality if (!isActive()) return; - invokeLaterIfNeeded(new MyRunnable() { + UIUtil.invokeLaterIfNeeded(new Runnable() { @Override - public void run(Throwable allocation) { - getBusyContainer(project).addActivity(activity, allocation, effectiveModalityState); + public void run() { + getBusyContainer(project).addActivity(activity, effectiveModalityState); } }); } @@ -141,9 +137,9 @@ public class UiActivityMonitorImpl extends UiActivityMonitor implements Modality public void removeActivity(@NotNull final Project project, @NotNull final UiActivity activity) { if (!isActive()) return; - invokeLaterIfNeeded(new MyRunnable() { + UIUtil.invokeLaterIfNeeded(new Runnable() { @Override - public void run(Throwable allocation) { + public void run() { _getBusy(project).removeActivity(activity); } }); @@ -162,10 +158,10 @@ public class UiActivityMonitorImpl extends UiActivityMonitor implements Modality public void addActivity(@NotNull final UiActivity activity, @NotNull final ModalityState effectiveModalityState) { if (!isActive()) return; - invokeLaterIfNeeded(new MyRunnable() { + UIUtil.invokeLaterIfNeeded(new Runnable() { @Override - public void run(Throwable allocation) { - getBusyContainer(null).addActivity(activity, allocation, effectiveModalityState); + public void run() { + getBusyContainer(null).addActivity(activity, effectiveModalityState); } }); } @@ -174,15 +170,16 @@ public class UiActivityMonitorImpl extends UiActivityMonitor implements Modality public void removeActivity(@NotNull final UiActivity activity) { if (!isActive()) return; - invokeLaterIfNeeded(new MyRunnable() { + UIUtil.invokeLaterIfNeeded(new Runnable() { @Override - public void run(Throwable allocation) { + public void run() { _getBusy(null).removeActivity(activity); } }); } - private BusyImpl _getBusy(@Nullable Project key, UiActivity... toWatch) { + @NotNull + private BusyImpl _getBusy(@Nullable Project key, @NotNull UiActivity... toWatch) { return getBusyContainer(key).getOrCreateBusy(toWatch); } @@ -204,6 +201,7 @@ public class UiActivityMonitorImpl extends UiActivityMonitor implements Modality return myObjects.get(null); } + @Override public void clear() { final Set<Project> keys = myObjects.keySet(); for (Project each : keys) { @@ -215,7 +213,7 @@ public class UiActivityMonitorImpl extends UiActivityMonitor implements Modality public void setActive(boolean active) { if (myActive == active) return; - if (myActive && !active) { + if (myActive) { clear(); } @@ -227,25 +225,19 @@ public class UiActivityMonitorImpl extends UiActivityMonitor implements Modality } private static class ActivityInfo { - private final Throwable myAllocation; private final ModalityState myEffectiveState; - private ActivityInfo(@Nullable Throwable allocation, @NotNull ModalityState effectiveState) { - myAllocation = allocation; + private ActivityInfo(@NotNull ModalityState effectiveState) { myEffectiveState = effectiveState; } - @Nullable - public Throwable getAllocation() { - return myAllocation; - } - @NotNull public ModalityState getEffectiveState() { return myEffectiveState; } } + @NotNull protected ModalityState getCurrentState() { return ModalityState.current(); } @@ -258,9 +250,9 @@ public class UiActivityMonitorImpl extends UiActivityMonitor implements Modality protected final Set<UiActivity> myToWatch; protected final UiActivity[] myToWatchArray; - private UiActivityMonitorImpl.BusyContainer myContainer; + private final UiActivityMonitorImpl.BusyContainer myContainer; - private BusyImpl(Set<UiActivity> toWatch, BusyContainer container) { + private BusyImpl(@NotNull Set<UiActivity> toWatch, @NotNull BusyContainer container) { myToWatch = toWatch; myToWatchArray = toWatch.toArray(new UiActivity[toWatch.size()]); myContainer = container; @@ -274,9 +266,7 @@ public class UiActivityMonitorImpl extends UiActivityMonitor implements Modality boolean isOwnReady() { Map<UiActivity, ActivityInfo> infoToCheck = new HashMap<UiActivity, ActivityInfo>(); - final Iterator<Set<UiActivity>> activitySets = myContainer.myActivities2Object.keySet().iterator(); - while (activitySets.hasNext()) { - Set<UiActivity> eachActivitySet = activitySets.next(); + for (Set<UiActivity> eachActivitySet : myContainer.myActivities2Object.keySet()) { final BusyImpl eachBusyObject = myContainer.myActivities2Object.get(eachActivitySet); if (eachBusyObject == this) continue; @@ -304,19 +294,16 @@ public class UiActivityMonitorImpl extends UiActivityMonitor implements Modality return true; } + public void addActivity(@NotNull UiActivity activity, @NotNull ModalityState effectiveModalityState) { + if (!myToWatch.isEmpty() && !myToWatch.contains(activity)) return; - public void addActivity(UiActivity activity, Throwable allocation, ModalityState effectiveModalityState) { - if (!myToWatch.isEmpty()) { - if (!myToWatch.contains(activity)) return; - } - - myActivities.put(activity, new ActivityInfo(allocation, effectiveModalityState)); + myActivities.put(activity, new ActivityInfo(effectiveModalityState)); myQueuedToRemove.remove(activity); - myContainer.onActivityAdded(this, activity); + myContainer.onActivityAdded(activity); } - public void removeActivity(final UiActivity activity) { + public void removeActivity(@NotNull final UiActivity activity) { if (!myActivities.containsKey(activity)) return; myQueuedToRemove.add(activity); @@ -333,87 +320,48 @@ public class UiActivityMonitorImpl extends UiActivityMonitor implements Modality onReady(); } }; - if (isUnitTestMode()) { - runnable.run(); - } - else { - SwingUtilities.invokeLater(runnable); - } + SwingUtilities.invokeLater(runnable); } - - public void clear() { - UiActivity[] activities = myActivities.keySet().toArray(new UiActivity[myActivities.size()]); - for (UiActivity each : activities) { - removeActivity(each); - } - } - } - - private static void invokeLaterIfNeeded(final MyRunnable runnable) { - final Throwable allocation = Registry.is("ide.debugMode") ? new Exception() : null; - - if (isUnitTestMode()) { - runnable.run(allocation); - } - else { - UIUtil.invokeLaterIfNeeded(new Runnable() { - @Override - public void run() { - runnable.run(allocation); - } - }); - } - } - - private interface MyRunnable { - void run(Throwable allocation); - } - - private static boolean isUnitTestMode() { - Application app = ApplicationManager.getApplication(); - return app == null || app.isUnitTestMode(); } public class BusyContainer implements Disposable { + private final Map<Set<UiActivity>, BusyImpl> myActivities2Object = new HashMap<Set<UiActivity>, BusyImpl>(); + private final Map<BusyImpl, Set<UiActivity>> myObject2Activities = new HashMap<BusyImpl, Set<UiActivity>>(); - private Map<Set<UiActivity>, BusyImpl> myActivities2Object = new HashMap<Set<UiActivity>, BusyImpl>(); - private Map<BusyImpl, Set<UiActivity>> myObject2Activities = new HashMap<BusyImpl, Set<UiActivity>>(); - - private Set<UiActivity> myActivities = new HashSet<UiActivity>(); - - private BusyImpl myDefault; + private final Set<UiActivity> myActivities = new HashSet<UiActivity>(); private boolean myRemovingActivityNow; @Nullable private final Project myProject; public BusyContainer(@Nullable Project project) { myProject = project; - myDefault = registerBusyObject(new HashSet<UiActivity>()); + registerBusyObject(new HashSet<UiActivity>()); if (project != null) { Disposer.register(project, this); } } - public BusyImpl getOrCreateBusy(UiActivity... activities) { - final HashSet<UiActivity> key = new HashSet<UiActivity>(); + @NotNull + public BusyImpl getOrCreateBusy(@NotNull UiActivity... activities) { + Set<UiActivity> key = new HashSet<UiActivity>(); key.addAll(Arrays.asList(activities)); if (myActivities2Object.containsKey(key)) { return myActivities2Object.get(key); } - else { - return registerBusyObject(key); - } + return registerBusyObject(key); } - private BusyImpl registerBusyObject(HashSet<UiActivity> key) { + @NotNull + private BusyImpl registerBusyObject(@NotNull Set<UiActivity> key) { final BusyImpl busy = createBusyImpl(key); myActivities2Object.put(key, busy); myObject2Activities.put(busy, key); return busy; } - protected BusyImpl createBusyImpl(HashSet<UiActivity> key) { + @NotNull + protected BusyImpl createBusyImpl(@NotNull Set<UiActivity> key) { return new BusyImpl(key, this); } @@ -437,11 +385,11 @@ public class UiActivityMonitorImpl extends UiActivityMonitor implements Modality } } - public void onActivityAdded(BusyImpl busy, UiActivity activity) { + public void onActivityAdded(@NotNull UiActivity activity) { myActivities.add(activity); } - public void onActivityRemoved(BusyImpl busy, UiActivity activity) { + public void onActivityRemoved(@NotNull BusyImpl busy, @NotNull UiActivity activity) { if (myRemovingActivityNow) return; final Map<BusyImpl, Set<UiActivity>> toRemove = new HashMap<BusyImpl, Set<UiActivity>>(); @@ -450,9 +398,7 @@ public class UiActivityMonitorImpl extends UiActivityMonitor implements Modality myRemovingActivityNow = true; myActivities.remove(activity); - final Iterator<BusyImpl> objects = myObject2Activities.keySet().iterator(); - while (objects.hasNext()) { - BusyImpl each = objects.next(); + for (BusyImpl each : myObject2Activities.keySet()) { if (each != busy) { each.removeActivity(activity); } @@ -472,11 +418,11 @@ public class UiActivityMonitorImpl extends UiActivityMonitor implements Modality } } - public void addActivity(UiActivity activity, Throwable allocation, ModalityState state) { + public void addActivity(@NotNull UiActivity activity, @NotNull ModalityState state) { getOrCreateBusy(activity); final Set<BusyImpl> busies = myObject2Activities.keySet(); for (BusyImpl each : busies) { - each.addActivity(activity, allocation, state); + each.addActivity(activity, state); } } |