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 {