diff --git a/platform/platform-api/src/com/intellij/ide/FrameStateManager.java b/platform/platform-api/src/com/intellij/ide/FrameStateManager.java index 399a5fa9dce4..1626d768ff7d 100644 --- a/platform/platform-api/src/com/intellij/ide/FrameStateManager.java +++ b/platform/platform-api/src/com/intellij/ide/FrameStateManager.java @@ -16,6 +16,7 @@ package com.intellij.ide; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.util.ActionCallback; /** * Manager of listeners for notifications about activation and deactivation of the @@ -47,4 +48,10 @@ public abstract class FrameStateManager { * @param listener the listener instance. */ public abstract void removeListener(FrameStateListener listener); + + + /** + * @return action callback for application's active state + */ + public abstract ActionCallback getApplicationActive(); } diff --git a/platform/platform-api/src/com/intellij/openapi/util/BusyObject.java b/platform/platform-api/src/com/intellij/openapi/util/BusyObject.java index 2849a09e1812..c556da3bd3dc 100644 --- a/platform/platform-api/src/com/intellij/openapi/util/BusyObject.java +++ b/platform/platform-api/src/com/intellij/openapi/util/BusyObject.java @@ -30,6 +30,8 @@ public interface BusyObject { protected abstract boolean isReady(); public final void onReady() { + if (!isReady()) return; + ActionCallback[] ready = getReadyCallbacks(true); for (ActionCallback each : ready) { if (each != null) { diff --git a/platform/platform-impl/src/com/intellij/ide/FrameStateManagerImpl.java b/platform/platform-impl/src/com/intellij/ide/FrameStateManagerImpl.java index 41e2c7518f20..7f6d2d5c7ff4 100644 --- a/platform/platform-impl/src/com/intellij/ide/FrameStateManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/ide/FrameStateManagerImpl.java @@ -18,6 +18,8 @@ package com.intellij.ide; import com.intellij.openapi.application.ApplicationAdapter; import com.intellij.openapi.application.impl.ApplicationImpl; import com.intellij.openapi.components.ApplicationComponent; +import com.intellij.openapi.util.ActionCallback; +import com.intellij.openapi.util.BusyObject; import com.intellij.openapi.wm.IdeFrame; import com.intellij.util.Alarm; import com.intellij.util.containers.ContainerUtil; @@ -33,7 +35,18 @@ public class FrameStateManagerImpl extends FrameStateManager implements Applicat private boolean myShouldSynchronize; private final Alarm mySyncAlarm; + private BusyObject.Impl myActive; + private ApplicationImpl myApp; + public FrameStateManagerImpl(final ApplicationImpl app) { + myApp = app; + myActive = new BusyObject.Impl() { + @Override + protected boolean isReady() { + return myApp.isActive(); + } + }; + myShouldSynchronize = false; mySyncAlarm = new Alarm(); @@ -41,6 +54,7 @@ public class FrameStateManagerImpl extends FrameStateManager implements Applicat app.addApplicationListener(new ApplicationAdapter() { @Override public void applicationActivated(IdeFrame ideFrame) { + myActive.onReady(); mySyncAlarm.cancelAllRequests(); if (myShouldSynchronize) { myShouldSynchronize = false; @@ -64,6 +78,11 @@ public class FrameStateManagerImpl extends FrameStateManager implements Applicat } + @Override + public ActionCallback getApplicationActive() { + return myActive.getReady(this); + } + @NotNull @NonNls public String getComponentName() {