From 1c18f1b35da0c3879fec1f2ce9e440bb0cbc5c00 Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Mon, 22 Aug 2011 14:19:31 +0400 Subject: [PATCH] funcTests: stability fixes --- .../project1/module1/scripts/suite.ijs | 1 + .../com/intellij/ide/UiActivityMonitor.java | 72 +++++++++++++------ .../ui/playback/PlaybackCallFacade.java | 51 +++++++++---- .../openapi/wm/impl/ToolWindowImpl.java | 25 +++++-- 4 files changed, 107 insertions(+), 42 deletions(-) diff --git a/platform/funcTests/project1/module1/scripts/suite.ijs b/platform/funcTests/project1/module1/scripts/suite.ijs index abf7d699c37b..dbf9dac86b66 100644 --- a/platform/funcTests/project1/module1/scripts/suite.ijs +++ b/platform/funcTests/project1/module1/scripts/suite.ijs @@ -1,2 +1,3 @@ %cd ../community/platform/funcTests/project1/module1/scripts + %include selectIn/projectView.ijs \ No newline at end of file diff --git a/platform/platform-api/src/com/intellij/ide/UiActivityMonitor.java b/platform/platform-api/src/com/intellij/ide/UiActivityMonitor.java index 1be2f5d78f85..efe2a2c2fa8e 100644 --- a/platform/platform-api/src/com/intellij/ide/UiActivityMonitor.java +++ b/platform/platform-api/src/com/intellij/ide/UiActivityMonitor.java @@ -22,9 +22,11 @@ import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.project.ProjectManagerAdapter; import com.intellij.openapi.util.BusyObject; import com.intellij.util.containers.HashSet; +import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import javax.swing.*; import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -59,34 +61,50 @@ public class UiActivityMonitor implements ApplicationComponent { } - public void addActivity(@NotNull Project project, Object activity) { - if (!hasObjectFor(project)) { - Project[] open = ProjectManager.getInstance().getOpenProjects(); - for (Project each : open) { - if (each == project) { - initBusyObjectFor(project); - break; + public void addActivity(@NotNull final Project project, final Object activity) { + UIUtil.invokeLaterIfNeeded(new Runnable() { + @Override + public void run() { + if (!hasObjectFor(project)) { + Project[] open = ProjectManager.getInstance().getOpenProjects(); + for (Project each : open) { + if (each == project) { + initBusyObjectFor(project); + break; + } + } } + + _getBusy(project).addActivity(activity); } - } - - _getBusy(project).addActivity(activity); + }); } - boolean hasObjectFor(Project project) { - return myObjects.containsKey(project); + public void removeActivity(@NotNull final Project project, final Object activity) { + UIUtil.invokeLaterIfNeeded(new Runnable() { + @Override + public void run() { + _getBusy(project).removeActivity(activity); + } + }); } - public void removeActivity(@NotNull Project project, Object activity) { - _getBusy(project).removeActivity(activity); + public void addActivity(final Object activity) { + UIUtil.invokeLaterIfNeeded(new Runnable() { + @Override + public void run() { + _getBusy(null).addActivity(activity); + } + }); } - public void addActivity(Object activity) { - _getBusy(null).addActivity(activity); - } - - public void removeActivity(Object activity) { - _getBusy(null).removeActivity(activity); + public void removeActivity(final Object activity) { + UIUtil.invokeLaterIfNeeded(new Runnable() { + @Override + public void run() { + _getBusy(null).removeActivity(activity); + } + }); } private BusyImpl _getBusy(@Nullable Object key) { @@ -99,6 +117,10 @@ public class UiActivityMonitor implements ApplicationComponent { myObjects.put(key, object); } + boolean hasObjectFor(Project project) { + return myObjects.containsKey(project); + } + private BusyObjectGlobalImpl getGlobalBusy() { return (BusyObjectGlobalImpl)myObjects.get(null); } @@ -138,8 +160,16 @@ public class UiActivityMonitor implements ApplicationComponent { } public void removeActivity(Object activity) { + if (!myActivities.contains(activity)) return; + myActivities.remove(activity); - onReady(); + + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + onReady(); + } + }); } } diff --git a/platform/platform-impl/src/com/intellij/openapi/ui/playback/PlaybackCallFacade.java b/platform/platform-impl/src/com/intellij/openapi/ui/playback/PlaybackCallFacade.java index 9a212437c204..36e2798a0e97 100644 --- a/platform/platform-impl/src/com/intellij/openapi/ui/playback/PlaybackCallFacade.java +++ b/platform/platform-impl/src/com/intellij/openapi/ui/playback/PlaybackCallFacade.java @@ -15,17 +15,20 @@ */ package com.intellij.openapi.ui.playback; +import com.intellij.ide.RecentProjectsManagerBase; import com.intellij.ide.UiActivityMonitor; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.project.ProjectManager; -import com.intellij.openapi.project.ProjectManagerAdapter; -import com.intellij.openapi.project.ProjectManagerListener; +import com.intellij.openapi.project.*; import com.intellij.openapi.startup.StartupManager; import com.intellij.openapi.ui.Queryable; +import com.intellij.openapi.util.ActionCallback; import com.intellij.openapi.util.AsyncResult; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.wm.IdeFocusManager; +import com.intellij.openapi.wm.IdeFrame; +import com.intellij.util.ui.UIUtil; +import javax.swing.*; import java.awt.*; import java.io.File; import java.io.IOException; @@ -46,7 +49,7 @@ public class PlaybackCallFacade { File parentDir = FileUtil.createTempDirectory("funcTest", ""); File sourceDir = getFile(context.getCurrentCmd().getBaseDir(), path); - FileUtil.copyDir(sourceDir, parentDir); + FileUtil.copyDir(sourceDir, parentDir); File projectDir = new File(parentDir, sourceDir.getName()); return openProject(context, projectDir.getAbsolutePath()); } @@ -55,12 +58,8 @@ public class PlaybackCallFacade { } } - public static File getFile(File baseDir, String path) { - File sourceDir = new File(path); - if (!sourceDir.isAbsolute()) { - sourceDir = new File(baseDir, path); - } - return sourceDir; + public static AsyncResult openLastProject(final PlaybackContext context) { + return openProject(context, RecentProjectsManagerBase.getInstance().getLastProjectPath()); } public static AsyncResult openProject(final PlaybackContext context, String path) { @@ -74,7 +73,12 @@ public class PlaybackCallFacade { @Override public void run() { pm.removeProjectManagerListener(listener.get()); - result.setDone("opened successfully: " + project.getProjectFilePath()); + DumbService.getInstance(project).runWhenSmart(new Runnable() { + @Override + public void run() { + result.setDone("opened successfully: " + project.getProjectFilePath()); + } + }); } }); } @@ -92,10 +96,16 @@ public class PlaybackCallFacade { return result; } + public static AsyncResult flushUiActivity(PlaybackContext context) { + AsyncResult result = new AsyncResult(); + getActivityReady(context).notify(result); + return result; + } + public static AsyncResult printFocus(final PlaybackContext context) { final AsyncResult result = new AsyncResult(); - UiActivityMonitor.getInstance().getBusy().getReady(context).doWhenProcessed(new Runnable() { + getActivityReady(context).doWhenProcessed(new Runnable() { @Override public void run() { final LinkedHashMap focusInfo = getFocusInfo(); @@ -136,7 +146,7 @@ public class PlaybackCallFacade { } } - UiActivityMonitor.getInstance().getBusy().getReady(context).doWhenDone(new Runnable() { + getActivityReady(context).doWhenDone(new Runnable() { @Override public void run() { try { @@ -151,6 +161,10 @@ public class PlaybackCallFacade { return result; } + private static ActionCallback getActivityReady(PlaybackContext context) { + return UiActivityMonitor.getInstance().getBusy().getReady(context); + } + private static void doAssert(Map expected, AsyncResult result, PlaybackContext context) throws AssertionError { final LinkedHashMap actual = getFocusInfo(); @@ -211,4 +225,13 @@ public class PlaybackCallFacade { } return actual; } + + public static File getFile(File baseDir, String path) { + File sourceDir = new File(path); + if (!sourceDir.isAbsolute()) { + sourceDir = new File(baseDir, path); + } + return sourceDir; + } + } diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowImpl.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowImpl.java index 9a9d29ff4e8d..dbebe4b017ef 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowImpl.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.wm.impl; +import com.intellij.ide.UiActivityMonitor; import com.intellij.ide.impl.ContentManagerWatcher; import com.intellij.openapi.actionSystem.ActionGroup; import com.intellij.openapi.application.ApplicationManager; @@ -119,15 +120,25 @@ public final class ToolWindowImpl implements ToolWindowEx { public void activate(@Nullable final Runnable runnable, boolean autoFocusContents, boolean forced) { ApplicationManager.getApplication().assertIsDispatchThread(); + + final String activity = "toolWindow:" + getId(); + UiActivityMonitor.getInstance().addActivity(myToolWindowManager.getProject(), activity); + myToolWindowManager.activateToolWindow(myId, forced, autoFocusContents); - if (runnable != null) { - getActivation().doWhenDone(new Runnable() { - public void run() { - myToolWindowManager.invokeLater(runnable); - } - }); - } + getActivation().doWhenDone(new Runnable() { + public void run() { + myToolWindowManager.invokeLater(new Runnable() { + @Override + public void run() { + if (runnable != null) { + runnable.run(); + } + UiActivityMonitor.getInstance().removeActivity(myToolWindowManager.getProject(), activity); + } + }); + } + }); } public final boolean isActive() {