Skip to content

Commit 6da8bbb

Browse files
committed
Add refresh button for DevTools windows
1 parent d8d8e6f commit 6da8bbb

File tree

8 files changed

+101
-10
lines changed

8 files changed

+101
-10
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* Copyright 2024 The Chromium Authors. All rights reserved.
3+
* Use of this source code is governed by a BSD-style license that can be
4+
* found in the LICENSE file.
5+
*/
6+
package io.flutter.actions;
7+
8+
import com.intellij.icons.AllIcons;
9+
import com.intellij.openapi.actionSystem.AnActionEvent;
10+
import com.intellij.openapi.project.DumbAwareAction;
11+
import com.intellij.openapi.project.Project;
12+
import com.intellij.openapi.wm.ToolWindow;
13+
import com.intellij.openapi.wm.ex.ToolWindowManagerEx;
14+
import icons.FlutterIcons;
15+
import io.flutter.FlutterUtils;
16+
import io.flutter.performance.FlutterPerformanceView;
17+
import org.jetbrains.annotations.NotNull;
18+
19+
import java.util.Optional;
20+
21+
public class RefreshToolWindowAction extends DumbAwareAction {
22+
private String toolWindowId;
23+
24+
public RefreshToolWindowAction() {
25+
super(AllIcons.Actions.Refresh);
26+
}
27+
28+
public RefreshToolWindowAction(String toolWindowId) {
29+
super(AllIcons.Actions.Refresh);
30+
this.toolWindowId = toolWindowId;
31+
}
32+
@Override
33+
public void actionPerformed(@NotNull AnActionEvent event) {
34+
System.out.println("In refresh tool window: " + toolWindowId);
35+
36+
final Project project = event.getProject();
37+
if (project == null) {
38+
return;
39+
}
40+
41+
Optional.ofNullable(
42+
FlutterUtils.embeddedBrowser(project))
43+
.ifPresent(embeddedBrowser -> embeddedBrowser.refresh(toolWindowId));
44+
}
45+
}

flutter-idea/src/io/flutter/deeplinks/DeepLinksViewFactory.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,32 +5,27 @@
55
*/
66
package io.flutter.deeplinks;
77

8-
import com.intellij.ide.util.PropertiesComponent;
98
import com.intellij.openapi.application.ApplicationManager;
109
import com.intellij.openapi.project.Project;
1110
import com.intellij.openapi.wm.ToolWindow;
1211
import com.intellij.openapi.wm.ToolWindowFactory;
13-
import com.intellij.openapi.wm.ToolWindowManager;
14-
import com.intellij.ui.content.ContentManager;
15-
import icons.FlutterIcons;
1612
import io.flutter.FlutterUtils;
13+
import io.flutter.actions.RefreshToolWindowAction;
1714
import io.flutter.bazel.WorkspaceCache;
1815
import io.flutter.devtools.DevToolsIdeFeature;
1916
import io.flutter.devtools.DevToolsUrl;
20-
import io.flutter.performance.FlutterPerformanceView;
2117
import io.flutter.run.daemon.DevToolsService;
2218
import io.flutter.sdk.FlutterSdk;
2319
import io.flutter.sdk.FlutterSdkVersion;
2420
import io.flutter.utils.AsyncUtils;
25-
import io.flutter.utils.UIUtils;
26-
import io.flutter.view.FlutterViewMessages;
2721
import kotlin.coroutines.Continuation;
2822
import org.jetbrains.annotations.NotNull;
2923

24+
import java.util.List;
3025
import java.util.Optional;
3126

3227
public class DeepLinksViewFactory implements ToolWindowFactory {
33-
private static String TOOL_WINDOW_ID = "Flutter Deep Links";
28+
@NotNull private static String TOOL_WINDOW_ID = "Flutter Deep Links";
3429

3530
@Override
3631
public Object isApplicableAsync(@NotNull Project project, @NotNull Continuation<? super Boolean> $completion) {
@@ -41,7 +36,6 @@ public Object isApplicableAsync(@NotNull Project project, @NotNull Continuation<
4136

4237
@Override
4338
public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) {
44-
final ContentManager contentManager = toolWindow.getContentManager();
4539
FlutterSdk sdk = FlutterSdk.getFlutterSdk(project);
4640
FlutterSdkVersion sdkVersion = sdk == null ? null : sdk.getVersion();
4741

@@ -78,5 +72,9 @@ public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindo
7872
});
7973
}
8074
);
75+
76+
// TODO(helin24): It may be better to add this to the gear actions or to attach as a mouse event on individual tabs within a tool
77+
// window, but I wasn't able to get either working immediately.
78+
toolWindow.setTitleActions(List.of(new RefreshToolWindowAction(TOOL_WINDOW_ID)));
8179
}
8280
}

flutter-idea/src/io/flutter/devtools/DevToolsExtensionsViewFactory.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import com.intellij.ui.content.ContentManager;
1414
import icons.FlutterIcons;
1515
import io.flutter.FlutterUtils;
16+
import io.flutter.actions.RefreshToolWindowAction;
1617
import io.flutter.bazel.WorkspaceCache;
1718
import io.flutter.run.daemon.DevToolsService;
1819
import io.flutter.sdk.FlutterSdk;
@@ -24,9 +25,12 @@
2425
import org.jetbrains.annotations.NotNull;
2526
import org.jetbrains.annotations.Nullable;
2627

28+
import java.util.List;
2729
import java.util.Optional;
2830

2931
public class DevToolsExtensionsViewFactory implements ToolWindowFactory {
32+
@NotNull private static String TOOL_WINDOW_ID = "Flutter DevTools Extensions";
33+
3034
public static void init(Project project) {
3135
project.getMessageBus().connect().subscribe(
3236
FlutterViewMessages.FLUTTER_DEBUG_TOPIC, (FlutterViewMessages.FlutterDebugNotifier)event -> initView(project, event)
@@ -84,6 +88,8 @@ public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindo
8488
});
8589
}
8690
);
91+
92+
window.setTitleActions(List.of(new RefreshToolWindowAction(TOOL_WINDOW_ID)));
8793
}
8894

8995
@Nullable

flutter-idea/src/io/flutter/devtools/RemainingDevToolsViewFactory.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import com.intellij.ui.content.ContentManager;
1414
import icons.FlutterIcons;
1515
import io.flutter.FlutterUtils;
16+
import io.flutter.actions.RefreshToolWindowAction;
1617
import io.flutter.bazel.WorkspaceCache;
1718
import io.flutter.run.daemon.DevToolsService;
1819
import io.flutter.sdk.FlutterSdk;
@@ -24,10 +25,11 @@
2425
import org.jetbrains.annotations.NotNull;
2526
import org.jetbrains.annotations.Nullable;
2627

28+
import java.util.List;
2729
import java.util.Optional;
2830

2931
public class RemainingDevToolsViewFactory implements ToolWindowFactory {
30-
private static String TOOL_WINDOW_ID = "Flutter DevTools";
32+
@NotNull private static String TOOL_WINDOW_ID = "Flutter DevTools";
3133
public static void init(Project project) {
3234
project.getMessageBus().connect().subscribe(
3335
FlutterViewMessages.FLUTTER_DEBUG_TOPIC, (FlutterViewMessages.FlutterDebugNotifier)event -> initView(project, event)
@@ -86,6 +88,8 @@ public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindo
8688
});
8789
}
8890
);
91+
92+
window.setTitleActions(List.of(new RefreshToolWindowAction(TOOL_WINDOW_ID)));
8993
}
9094

9195
@Nullable

flutter-idea/src/io/flutter/view/EmbeddedBrowser.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727

2828
import javax.swing.*;
2929
import java.awt.*;
30+
import java.awt.event.MouseAdapter;
31+
import java.awt.event.MouseEvent;
3032
import java.util.ArrayList;
3133
import java.util.HashMap;
3234
import java.util.List;
@@ -123,6 +125,12 @@ public void openPanel(ToolWindow toolWindow, String tabName, DevToolsUrl devTool
123125
tab.devToolsUrlFuture.complete(devToolsUrl);
124126

125127
JComponent component = tab.embeddedTab.getTabComponent(tab.contentManager);
128+
component.addMouseListener(new MouseAdapter() {
129+
@Override
130+
public void mousePressed(MouseEvent e) {
131+
System.out.println("mouse clicked");
132+
}
133+
});
126134

127135
ApplicationManager.getApplication().invokeLater(() -> {
128136
if (tab.contentManager.isDisposed()) {
@@ -270,6 +278,25 @@ public void updateVmServiceUri(@NotNull String newVmServiceUri) {
270278
});
271279
}
272280

281+
// This will refresh all the browser tabs within a tool window (e.g. if there are multiple apps running and the inspector tool window is
282+
// refreshed, an inspector tab will refresh for each app.)
283+
// TODO(helin24): Consider allowing refresh for single browser tabs within tool windows.
284+
public void refresh(String toolWindowId) {
285+
Map<String, BrowserTab> tabs = windows.get(toolWindowId);
286+
287+
if (tabs == null) {
288+
return;
289+
}
290+
291+
tabs.forEach((tabName, tab) -> {
292+
if (tab == null || tab.devToolsUrlFuture == null) return;
293+
tab.devToolsUrlFuture.thenAccept(devToolsUrl -> {
294+
if (devToolsUrl == null) return;
295+
tab.embeddedTab.loadUrl(devToolsUrl.getUrlString());
296+
});
297+
});
298+
}
299+
273300
private void updateUrlAndReload(Function<DevToolsUrl, DevToolsUrl> newDevToolsUrlFn) {
274301
this.windows.forEach((window, tabs) -> {
275302
tabs.forEach((tabName, tab) -> {

flutter-idea/src/io/flutter/view/FlutterView.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import io.flutter.FlutterBundle;
4040
import io.flutter.FlutterInitializer;
4141
import io.flutter.FlutterUtils;
42+
import io.flutter.actions.RefreshToolWindowAction;
4243
import io.flutter.bazel.WorkspaceCache;
4344
import io.flutter.devtools.DevToolsIdeFeature;
4445
import io.flutter.devtools.DevToolsUrl;
@@ -244,6 +245,8 @@ private void addBrowserInspectorViewContent(FlutterApp app,
244245
);
245246
busSubscribed = true;
246247
}
248+
249+
toolWindow.setTitleActions(List.of(new RefreshToolWindowAction(TOOL_WINDOW_ID)));
247250
} else {
248251
BrowserLauncher.getInstance().browse(
249252
new DevToolsUrl.Builder()

resources/META-INF/plugin.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,10 @@
546546
text="Open Flutter DevTools" description="Open Flutter DevTools" icon="FlutterIcons.Dart_16">
547547
</action>
548548

549+
<action id="io.flutter.RefreshToolWindow" class="io.flutter.actions.RefreshToolWindowAction" text="Refresh Tool Window"
550+
description="Refresh current tool window contents">
551+
</action>
552+
549553
<!-- action
550554
id="DeveloperServices.FlutterNewsAssistant"
551555
class="io.flutter.actions.OpenFlutterNewsSidePanelAction"

resources/META-INF/plugin_template.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,10 @@
245245
text="Open Flutter DevTools" description="Open Flutter DevTools" icon="FlutterIcons.Dart_16">
246246
</action>
247247

248+
<action id="io.flutter.RefreshToolWindow" class="io.flutter.actions.RefreshToolWindowAction" text="Refresh Tool Window"
249+
description="Refresh current tool window contents">
250+
</action>
251+
248252
<!-- action
249253
id="DeveloperServices.FlutterNewsAssistant"
250254
class="io.flutter.actions.OpenFlutterNewsSidePanelAction"

0 commit comments

Comments
 (0)