diff --git a/src/io/flutter/FlutterInitializer.java b/src/io/flutter/FlutterInitializer.java index a620c5fd68..e6abbd91af 100644 --- a/src/io/flutter/FlutterInitializer.java +++ b/src/io/flutter/FlutterInitializer.java @@ -6,6 +6,7 @@ package io.flutter; import com.google.common.annotations.VisibleForTesting; +import com.intellij.ProjectTopics; import com.intellij.ide.BrowserUtil; import com.intellij.ide.plugins.IdeaPluginDescriptor; import com.intellij.ide.plugins.PluginManagerCore; @@ -18,16 +19,19 @@ import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.project.ModuleListener; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.startup.StartupActivity; import io.flutter.analytics.Analytics; import io.flutter.analytics.ToolWindowTracker; import io.flutter.android.IntelliJAndroidSdk; +import io.flutter.bazel.WorkspaceCache; import io.flutter.editor.FlutterSaveActionsManager; import io.flutter.logging.FlutterConsoleLogManager; import io.flutter.perf.FlutterWidgetPerfManager; import io.flutter.performance.FlutterPerformanceViewFactory; +import io.flutter.preview.PreviewViewFactory; import io.flutter.pub.PubRoot; import io.flutter.pub.PubRoots; import io.flutter.run.FlutterReloadManager; @@ -58,6 +62,8 @@ public class FlutterInitializer implements StartupActivity { private static Analytics analytics; + private boolean toolWindowsInitialized = false; + @Override public void runActivity(@NotNull Project project) { // Convert all modules of deprecated type FlutterModuleType. @@ -79,11 +85,6 @@ public void runActivity(@NotNull Project project) { // Start a DevTools server DevToolsService.getInstance(project); - // Start watching for Flutter debug active events. - FlutterViewFactory.init(project); - - FlutterPerformanceViewFactory.init(project); - // If the project declares a Flutter dependency, do some extra initialization. boolean hasFlutterModule = false; @@ -115,6 +116,19 @@ public void runActivity(@NotNull Project project) { } } + if (hasFlutterModule || WorkspaceCache.getInstance(project).isBazel()) { + initializeToolWindows(project); + } else { + project.getMessageBus().connect().subscribe(ProjectTopics.MODULES, new ModuleListener() { + @Override + public void moduleAdded(@NotNull Project project, @NotNull Module module) { + if (!toolWindowsInitialized && FlutterModuleUtils.isFlutterModule(module)) { + initializeToolWindows(project); + } + } + }); + } + if (hasFlutterModule) { // Ensure a run config is selected and ready to go. FlutterModuleUtils.ensureRunConfigSelected(project); @@ -199,6 +213,14 @@ public void actionPerformed(@NotNull AnActionEvent event) { } } + private void initializeToolWindows(@NotNull Project project) { + // Start watching for Flutter debug active events. + FlutterViewFactory.init(project); + FlutterPerformanceViewFactory.init(project); + PreviewViewFactory.init(project); + toolWindowsInitialized = true; + } + /** * Automatically set Android SDK based on ANDROID_HOME. */ diff --git a/src/io/flutter/performance/FlutterPerformanceViewFactory.java b/src/io/flutter/performance/FlutterPerformanceViewFactory.java index e5aa743003..fd488b01d5 100644 --- a/src/io/flutter/performance/FlutterPerformanceViewFactory.java +++ b/src/io/flutter/performance/FlutterPerformanceViewFactory.java @@ -12,24 +12,25 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowFactory; +import com.intellij.openapi.wm.ToolWindowManager; import io.flutter.view.FlutterViewMessages; import org.jetbrains.annotations.NotNull; public class FlutterPerformanceViewFactory implements ToolWindowFactory, DumbAware { - @Override - public void init(ToolWindow window) { - window.setAvailable(true, null); - } - public static void init(@NotNull Project project) { project.getMessageBus().connect().subscribe( FlutterViewMessages.FLUTTER_DEBUG_TOPIC, (event) -> initPerfView(project, event) ); + final ToolWindow window = ToolWindowManager.getInstance(project).getToolWindow(FlutterPerformanceView.TOOL_WINDOW_ID); + if (window != null) { + window.setAvailable(true); + } } private static void initPerfView(@NotNull Project project, FlutterViewMessages.FlutterDebugEvent event) { ApplicationManager.getApplication().invokeLater(() -> { final FlutterPerformanceView flutterPerfView = ServiceManager.getService(project, FlutterPerformanceView.class); + ToolWindowManager.getInstance(project).getToolWindow(FlutterPerformanceView.TOOL_WINDOW_ID).setAvailable(true); flutterPerfView.debugActive(event); }); } @@ -41,4 +42,9 @@ public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindo (ServiceManager.getService(project, FlutterPerformanceView.class)).initToolWindow(toolWindow); }); } + + @Override + public boolean shouldBeAvailable(@NotNull Project project) { + return false; + } } diff --git a/src/io/flutter/preview/PreviewViewFactory.java b/src/io/flutter/preview/PreviewViewFactory.java index e2acb5081f..1a8e591487 100644 --- a/src/io/flutter/preview/PreviewViewFactory.java +++ b/src/io/flutter/preview/PreviewViewFactory.java @@ -11,9 +11,17 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowFactory; +import com.intellij.openapi.wm.ToolWindowManager; import org.jetbrains.annotations.NotNull; public class PreviewViewFactory implements ToolWindowFactory, DumbAware { + public static void init(@NotNull Project project) { + final ToolWindow window = ToolWindowManager.getInstance(project).getToolWindow(PreviewView.TOOL_WINDOW_ID); + if (window != null) { + window.setAvailable(true); + } + } + @Override public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) { //noinspection CodeBlock2Expr @@ -21,4 +29,9 @@ public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindo (ServiceManager.getService(project, PreviewView.class)).initToolWindow(toolWindow); }); } + + @Override + public boolean shouldBeAvailable(@NotNull Project project) { + return false; + } } diff --git a/src/io/flutter/view/FlutterViewFactory.java b/src/io/flutter/view/FlutterViewFactory.java index 0c82d99e45..0710d9ef83 100644 --- a/src/io/flutter/view/FlutterViewFactory.java +++ b/src/io/flutter/view/FlutterViewFactory.java @@ -12,6 +12,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowFactory; +import com.intellij.openapi.wm.ToolWindowManager; import org.jetbrains.annotations.NotNull; public class FlutterViewFactory implements ToolWindowFactory, DumbAware { @@ -19,11 +20,16 @@ public static void init(@NotNull Project project) { project.getMessageBus().connect().subscribe( FlutterViewMessages.FLUTTER_DEBUG_TOPIC, (event) -> initFlutterView(project, event) ); + + final ToolWindow window = ToolWindowManager.getInstance(project).getToolWindow(FlutterView.TOOL_WINDOW_ID); + if (window != null) { + window.setAvailable(true); + } } @Override - public void init(ToolWindow window) { - window.setAvailable(true, null); + public boolean shouldBeAvailable(@NotNull Project project) { + return false; } private static void initFlutterView(@NotNull Project project, FlutterViewMessages.FlutterDebugEvent event) {