Skip to content

Commit d22385f

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

File tree

2 files changed

+62
-66
lines changed

2 files changed

+62
-66
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: 62 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,87 +6,98 @@
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
}
7887

7988
// Run the code to query the document in a read action.
8089
final List<FlutterSample> samples = ApplicationManager.getApplication().
8190
runReadAction((Computable<List<FlutterSample>>)() -> {
82-
//noinspection CodeBlock2Expr
8391
return getSamplesFromDoc(flutterPackagePath, document, filePath);
8492
});
8593

86-
return samples.isEmpty() ? null : new FlutterSampleActionsPanel(samples);
94+
if (samples != null && !samples.isEmpty()) {
95+
return new FlutterSampleActionsPanel(samples);
96+
}
97+
return null;
8798
}
8899

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

92103
// Find all candidate class definitions.
@@ -111,7 +122,8 @@ private List<FlutterSample> getSamplesFromDoc(String flutterPackagePath, Documen
111122
try {
112123
// Context: https://github.com/flutter/flutter-intellij/issues/5634
113124
dartdoc = DartDocumentUtils.getDartdocFor(document, declaration);
114-
}catch (IndexOutOfBoundsException e) {
125+
}
126+
catch (IndexOutOfBoundsException e) {
115127
// ignore
116128
}
117129
if (dartdoc != null && containsDartdocFlutterSample(dartdoc)) {
@@ -127,7 +139,6 @@ private List<FlutterSample> getSamplesFromDoc(String flutterPackagePath, Documen
127139
}
128140
}
129141
}
130-
131142
return samples;
132143
}
133144

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

0 commit comments

Comments
 (0)