Skip to content

Commit 9e618af

Browse files
committed
Migrate the FlutterSampleNotificationProvider to the new EditorNotificationProvider API (flutter#7840)
This is progress on flutter#7830
1 parent dc1a47f commit 9e618af

File tree

2 files changed

+58
-64
lines changed

2 files changed

+58
-64
lines changed

flutter-idea/src/io/flutter/samples/FlutterSampleActionsPanel.java

Lines changed: 0 additions & 40 deletions
This file was deleted.

flutter-idea/src/io/flutter/samples/FlutterSampleNotificationProvider.java

Lines changed: 58 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,72 +6,81 @@
66
package io.flutter.samples;
77

88
import com.google.common.annotations.VisibleForTesting;
9+
import com.intellij.ide.BrowserUtil;
910
import com.intellij.openapi.application.ApplicationManager;
1011
import com.intellij.openapi.editor.Document;
1112
import com.intellij.openapi.editor.Editor;
13+
import com.intellij.openapi.editor.colors.EditorColors;
1214
import com.intellij.openapi.fileEditor.FileEditor;
1315
import com.intellij.openapi.fileEditor.TextEditor;
14-
import com.intellij.openapi.project.DumbAware;
1516
import com.intellij.openapi.project.Project;
1617
import com.intellij.openapi.util.Computable;
17-
import com.intellij.openapi.util.Key;
1818
import com.intellij.openapi.vfs.VirtualFile;
1919
import com.intellij.psi.PsiDocumentManager;
2020
import com.intellij.psi.PsiFile;
2121
import com.intellij.psi.util.PsiTreeUtil;
2222
import com.intellij.ui.EditorNotificationPanel;
23-
import com.intellij.ui.EditorNotifications;
23+
import com.intellij.ui.EditorNotificationProvider;
24+
import com.intellij.ui.HyperlinkLabel;
2425
import com.jetbrains.lang.dart.psi.DartClass;
26+
import icons.FlutterIcons;
2527
import io.flutter.sdk.FlutterSdk;
2628
import org.jetbrains.annotations.NotNull;
2729
import org.jetbrains.annotations.Nullable;
2830

31+
import javax.swing.*;
2932
import java.util.ArrayList;
3033
import java.util.Collections;
3134
import java.util.List;
35+
import java.util.function.Function;
3236
import java.util.regex.Pattern;
3337

34-
public class FlutterSampleNotificationProvider extends EditorNotifications.Provider<EditorNotificationPanel> implements DumbAware {
35-
private static final Key<EditorNotificationPanel> KEY = Key.create("flutter.sample");
36-
38+
public class FlutterSampleNotificationProvider implements EditorNotificationProvider {
3739
@NotNull final Project project;
3840

3941
public FlutterSampleNotificationProvider(@NotNull Project project) {
4042
this.project = project;
4143
}
4244

43-
@NotNull
44-
@Override
45-
public Key<EditorNotificationPanel> getKey() {
46-
return KEY;
47-
}
48-
4945
@Nullable
5046
@Override
51-
public EditorNotificationPanel createNotificationPanel(@NotNull VirtualFile file,
52-
@NotNull FileEditor fileEditor,
53-
@NotNull Project project) {
54-
if (!(fileEditor instanceof TextEditor textEditor)) {
55-
return null;
56-
}
57-
47+
public Function<? super @NotNull FileEditor, ? extends @Nullable JComponent> collectNotificationData(@NotNull Project project,
48+
@NotNull VirtualFile file) {
5849
final FlutterSdk sdk = FlutterSdk.getFlutterSdk(project);
5950
if (sdk == null) {
6051
return null;
6152
}
6253

6354
final String flutterPackagePath = sdk.getHomePath() + "/packages/flutter/lib/src/";
64-
final String filePath = file.getPath();
6555

6656
// Only show for files in the flutter sdk.
57+
final String filePath = file.getPath();
6758
if (!filePath.startsWith(flutterPackagePath)) {
6859
return null;
6960
}
7061

62+
return fileEditor -> createPanelForSamples(fileEditor, project, file, filePath, sdk, flutterPackagePath);
63+
}
64+
65+
@Nullable
66+
private EditorNotificationPanel createPanelForSamples(@NotNull FileEditor fileEditor,
67+
@NotNull Project project,
68+
@NotNull VirtualFile file,
69+
@NotNull String filePath,
70+
@NotNull FlutterSdk sdk,
71+
@NotNull String flutterPackagePath) {
72+
if (!(fileEditor instanceof TextEditor textEditor)) {
73+
return null;
74+
}
75+
7176
final Editor editor = textEditor.getEditor();
7277
final Document document = editor.getDocument();
78+
final PsiDocumentManager psiDocumentManager = PsiDocumentManager.getInstance(project);
79+
if (psiDocumentManager == null) {
80+
return null;
81+
}
7382

74-
final PsiFile psiFile = PsiDocumentManager.getInstance(project).getPsiFile(document);
83+
final PsiFile psiFile = psiDocumentManager.getPsiFile(document);
7584
if (psiFile == null || !psiFile.isValid()) {
7685
return null;
7786
}
@@ -86,7 +95,7 @@ public EditorNotificationPanel createNotificationPanel(@NotNull VirtualFile file
8695
return samples.isEmpty() ? null : new FlutterSampleActionsPanel(samples);
8796
}
8897

89-
private List<FlutterSample> getSamplesFromDoc(String flutterPackagePath, Document document, String filePath) {
98+
private List<FlutterSample> getSamplesFromDoc(@NotNull String flutterPackagePath, @NotNull Document document, @NotNull String filePath) {
9099
final List<FlutterSample> samples = new ArrayList<>();
91100

92101
// Find all candidate class definitions.
@@ -111,7 +120,8 @@ private List<FlutterSample> getSamplesFromDoc(String flutterPackagePath, Documen
111120
try {
112121
// Context: https://github.com/flutter/flutter-intellij/issues/5634
113122
dartdoc = DartDocumentUtils.getDartdocFor(document, declaration);
114-
}catch (IndexOutOfBoundsException e) {
123+
}
124+
catch (IndexOutOfBoundsException e) {
115125
// ignore
116126
}
117127
if (dartdoc != null && containsDartdocFlutterSample(dartdoc)) {
@@ -127,7 +137,6 @@ private List<FlutterSample> getSamplesFromDoc(String flutterPackagePath, Documen
127137
}
128138
}
129139
}
130-
131140
return samples;
132141
}
133142

@@ -153,3 +162,28 @@ public static boolean containsDartdocFlutterSample(@NotNull List<String> lines)
153162
return false;
154163
}
155164
}
165+
166+
class FlutterSampleActionsPanel extends EditorNotificationPanel {
167+
FlutterSampleActionsPanel(@NotNull List<FlutterSample> samples) {
168+
super(EditorColors.GUTTER_BACKGROUND);
169+
170+
icon(FlutterIcons.Flutter);
171+
text("View hosted code sample");
172+
173+
for (int i = 0; i < samples.size(); i++) {
174+
if (i != 0) {
175+
myLinksPanel.add(new JSeparator(SwingConstants.VERTICAL));
176+
}
177+
178+
final FlutterSample sample = samples.get(i);
179+
180+
final HyperlinkLabel label = createActionLabel(sample.getClassName(), () -> browseTo(sample));
181+
label.setToolTipText(sample.getHostedDocsUrl());
182+
}
183+
}
184+
185+
private void browseTo(FlutterSample sample) {
186+
BrowserUtil.browse(sample.getHostedDocsUrl());
187+
}
188+
}
189+

0 commit comments

Comments
 (0)