diff --git a/spellchecker/src/META-INF/SpellCheckerPlugin.xml b/spellchecker/src/META-INF/SpellCheckerPlugin.xml
index 990f3594266d..4a0ef8b09c0a 100644
--- a/spellchecker/src/META-INF/SpellCheckerPlugin.xml
+++ b/spellchecker/src/META-INF/SpellCheckerPlugin.xml
@@ -7,6 +7,7 @@
+
diff --git a/spellchecker/src/com/intellij/spellchecker/settings/BuiltInDictionariesProvider.kt b/spellchecker/src/com/intellij/spellchecker/settings/BuiltInDictionariesProvider.kt
new file mode 100644
index 000000000000..d613e8bf26ce
--- /dev/null
+++ b/spellchecker/src/com/intellij/spellchecker/settings/BuiltInDictionariesProvider.kt
@@ -0,0 +1,16 @@
+// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
+package com.intellij.spellchecker.settings
+
+import com.intellij.openapi.extensions.ExtensionPointName
+
+abstract class BuiltInDictionariesProvider {
+ abstract fun getDictionaries(): List
+
+ companion object {
+ val EP_NAME = ExtensionPointName.create("com.intellij.spellchecker.builtInDictionariesProvider")
+
+ fun getAll(): List {
+ return EP_NAME.extensionList
+ }
+ }
+}
\ No newline at end of file
diff --git a/spellchecker/src/com/intellij/spellchecker/settings/BuiltInDictionary.kt b/spellchecker/src/com/intellij/spellchecker/settings/BuiltInDictionary.kt
new file mode 100644
index 000000000000..f1060dac1dcc
--- /dev/null
+++ b/spellchecker/src/com/intellij/spellchecker/settings/BuiltInDictionary.kt
@@ -0,0 +1,9 @@
+// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
+package com.intellij.spellchecker.settings
+
+import com.intellij.openapi.project.Project
+
+interface BuiltInDictionary {
+ fun openDictionaryInEditor(project: Project)
+ val name: String
+}
\ No newline at end of file
diff --git a/spellchecker/src/com/intellij/spellchecker/settings/CustomDictionariesPanel.java b/spellchecker/src/com/intellij/spellchecker/settings/CustomDictionariesPanel.java
index 80b4bea21be5..61795a3595da 100644
--- a/spellchecker/src/com/intellij/spellchecker/settings/CustomDictionariesPanel.java
+++ b/spellchecker/src/com/intellij/spellchecker/settings/CustomDictionariesPanel.java
@@ -35,14 +35,19 @@ public final class CustomDictionariesPanel extends JPanel {
private final CustomDictionariesTableView myCustomDictionariesTableView;
private final List removedDictionaries = new ArrayList<>();
private final List defaultDictionaries;
+ private final Map builtInDictionaries;
public CustomDictionariesPanel(@NotNull SpellCheckerSettings settings, @NotNull Project project, @NotNull SpellCheckerManager manager) {
mySettings = settings;
myManager = manager;
defaultDictionaries = project.isDefault() ? new ArrayList<>() : asList(SpellCheckerBundle.message("app.dictionary"), SpellCheckerBundle
.message("project.dictionary"));
+ builtInDictionaries = new HashMap<>();
+ BuiltInDictionariesProvider.Companion.getAll().stream()
+ .map(BuiltInDictionariesProvider::getDictionaries).flatMap(List::stream)
+ .forEach(dictionary -> builtInDictionaries.put(dictionary.getName(), dictionary));
myCustomDictionariesTableView = new CustomDictionariesTableView(new ArrayList<>(settings.getCustomDictionariesPaths()),
- defaultDictionaries);
+ defaultDictionaries, builtInDictionaries.keySet().stream().toList());
ToolbarDecorator decorator = ToolbarDecorator.createDecorator(myCustomDictionariesTableView)
.setAddActionName(SpellCheckerBundle.message("add.custom.dictionaries"))
.setAddAction(new AnActionButtonRunnable() {
@@ -62,7 +67,10 @@ public final class CustomDictionariesPanel extends JPanel {
removedDictionaries.addAll(myCustomDictionariesTableView.getSelectedObjects());
TableUtil.removeSelectedItems(myCustomDictionariesTableView);
})
- .setRemoveActionUpdater(e -> !ContainerUtil.exists(myCustomDictionariesTableView.getSelectedObjects(), defaultDictionaries::contains))
+ .setRemoveActionUpdater(
+ e -> !ContainerUtil.exists(myCustomDictionariesTableView.getSelectedObjects(),
+ x -> defaultDictionaries.contains(x) || builtInDictionaries.containsKey(x))
+ )
.setEditActionName(SpellCheckerBundle.message("edit.custom.dictionary"))
.setEditAction(new AnActionButtonRunnable() {
@@ -71,6 +79,11 @@ public final class CustomDictionariesPanel extends JPanel {
String selectedDictionary = myCustomDictionariesTableView.getSelectedObject();
if (selectedDictionary == null) return;
+ if(builtInDictionaries.containsKey(selectedDictionary)) {
+ var dictionary = builtInDictionaries.get(selectedDictionary);
+ dictionary.openDictionaryInEditor(project);
+ return;
+ }
if (defaultDictionaries.contains(selectedDictionary)) {
selectedDictionary = selectedDictionary.equals(SpellCheckerBundle.message("app.dictionary"))
? myManager.getAppDictionaryPath$intellij_spellchecker()
@@ -112,7 +125,7 @@ public final class CustomDictionariesPanel extends JPanel {
Set newPaths = new HashSet<>();
for (String t : collection) {
- if (!defaultDictionaries.contains(t)) {
+ if (!defaultDictionaries.contains(t) && !builtInDictionaries.containsKey(t)) {
newPaths.add(t);
}
}
@@ -121,14 +134,14 @@ public final class CustomDictionariesPanel extends JPanel {
public void reset() {
myCustomDictionariesTableView.getListTableModel()
- .setItems(new ArrayList<>(ContainerUtil.concat(defaultDictionaries, mySettings.getCustomDictionariesPaths())));
+ .setItems(new ArrayList<>(ContainerUtil.concat(defaultDictionaries, builtInDictionaries.keySet().stream().toList(), mySettings.getCustomDictionariesPaths())));
removedDictionaries.clear();
}
public void apply() {
List oldPaths = mySettings.getCustomDictionariesPaths();
List newPaths = new ArrayList<>(ContainerUtil.filter(myCustomDictionariesTableView.getItems(), dict -> {
- return !defaultDictionaries.contains(dict);
+ return !defaultDictionaries.contains(dict) && !builtInDictionaries.containsKey(dict);
}));
mySettings.setCustomDictionariesPaths(newPaths);
myManager.updateBundledDictionaries(ContainerUtil.filter(oldPaths, o -> !newPaths.contains(o)));
@@ -143,9 +156,11 @@ public final class CustomDictionariesPanel extends JPanel {
final TableCellRenderer myTypeRenderer;
private CustomDictionariesTableView(@NotNull List dictionaries,
- @NotNull List defaultDictionaries) {
- myTypeRenderer = createTypeRenderer(defaultDictionaries);
+ @NotNull List defaultDictionaries,
+ @NotNull List builtInDictionaries) {
+ myTypeRenderer = createTypeRenderer(defaultDictionaries, builtInDictionaries);
var items = new ArrayList<>(defaultDictionaries);
+ items.addAll(builtInDictionaries);
items.addAll(dictionaries);
setModelAndUpdateColumns(new ListTableModel<>(createDictionaryColumnInfos(), items, 0));
setAutoResizeMode(AUTO_RESIZE_LAST_COLUMN);
@@ -155,7 +170,8 @@ public final class CustomDictionariesPanel extends JPanel {
setTableHeader(null);
}
- private static TableCellRenderer createTypeRenderer(List defaultDictionaries) {
+ private static TableCellRenderer createTypeRenderer(List defaultDictionaries,
+ @NotNull List builtInDictionaries) {
return new TableCellRenderer() {
final SimpleColoredComponent myLabel = new SimpleColoredComponent();
@@ -170,7 +186,7 @@ public final class CustomDictionariesPanel extends JPanel {
myLabel.clear();
myLabel.append((String)value, SimpleTextAttributes.REGULAR_ATTRIBUTES);
String type;
- if (defaultDictionaries.contains(value)) {
+ if (defaultDictionaries.contains(value) || builtInDictionaries.contains(value)) {
type = SpellCheckerBundle.message("built.in.dictionary");
}
else {