From 5ee01073bbb2c519f3dc33cb4982590822510876 Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Tue, 18 Apr 2017 18:13:51 +0300 Subject: [PATCH] IDEA-169924 API: move breadcrumbs provider to platform --- .../ui/breadcrumbs/BreadcrumbsProvider.java | 89 +++++++++++++++++++ .../src/META-INF/LangExtensionPoints.xml | 3 + .../src/META-INF/XmlPlugin.xml | 2 - .../yaml/breadcrumbs/YAMLBreadcrumbsTest.java | 6 +- .../XmlTagTreeHighlightingPass.java | 4 +- .../breadcrumbs/BreadcrumbsConfigurable.java | 3 +- .../breadcrumbs/BreadcrumbsXmlWrapper.java | 39 ++++---- .../intellij/xml/breadcrumbs/PsiCrumb.java | 5 +- .../breadcrumbs/BreadcrumbsInfoProvider.java | 55 +----------- 9 files changed, 128 insertions(+), 78 deletions(-) create mode 100644 platform/editor-ui-api/src/com/intellij/ui/breadcrumbs/BreadcrumbsProvider.java diff --git a/platform/editor-ui-api/src/com/intellij/ui/breadcrumbs/BreadcrumbsProvider.java b/platform/editor-ui-api/src/com/intellij/ui/breadcrumbs/BreadcrumbsProvider.java new file mode 100644 index 000000000000..6b4ddac4170e --- /dev/null +++ b/platform/editor-ui-api/src/com/intellij/ui/breadcrumbs/BreadcrumbsProvider.java @@ -0,0 +1,89 @@ +/* + * Copyright 2000-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.ui.breadcrumbs; + +import com.intellij.lang.Language; +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.Icon; +import java.util.List; + +import static java.util.Collections.emptyList; + +/** + * @author Alexey.Pegov + * @author Sergey.Malenkov + */ +public interface BreadcrumbsProvider { + ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.breadcrumbsInfoProvider"); + + /** + * @return an array of languages supported by this provider + */ + Language[] getLanguages(); + + /** + * @param element that represents a single crumb + * @return {@code true} if the specified element is supported by this provider + */ + boolean acceptElement(@NotNull PsiElement element); + + /** + * @param element that represents a single crumb + * @return a text for the specified element + */ + @NotNull + String getElementInfo(@NotNull PsiElement element); + + /** + * @param element that represents a single crumb + * @return an icon for the specified element + */ + @Nullable + default Icon getElementIcon(@NotNull PsiElement element) { + return null; + } + + /** + * @param element that represents a single crumb + * @return a description for the specified element + */ + @Nullable + default String getElementTooltip(@NotNull PsiElement element) { + return null; + } + + /** + * @param element that represents a single crumb + * @return an element that represents a parent crumb, or {@code null} + */ + @Nullable + default PsiElement getParent(@NotNull PsiElement element) { + return element.getParent(); + } + + /** + * @param element that represents a single crumb + * @return a list of elements to navigate + */ + @NotNull + default List getChildren(@NotNull PsiElement element) { + return emptyList(); + } +} diff --git a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml index e31422fb1abd..5e49a079aa7d 100644 --- a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml +++ b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml @@ -906,6 +906,9 @@ + + + diff --git a/platform/platform-resources/src/META-INF/XmlPlugin.xml b/platform/platform-resources/src/META-INF/XmlPlugin.xml index 08e9f264be2a..810cee4cf8e5 100644 --- a/platform/platform-resources/src/META-INF/XmlPlugin.xml +++ b/platform/platform-resources/src/META-INF/XmlPlugin.xml @@ -50,8 +50,6 @@ - - Arrays.asList(p.getLanguages()).contains(language)); if (provider == null) { return Collections.emptyList(); } diff --git a/xml/impl/src/com/intellij/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingPass.java b/xml/impl/src/com/intellij/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingPass.java index c90c1058e190..e5b20d72ba36 100644 --- a/xml/impl/src/com/intellij/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingPass.java +++ b/xml/impl/src/com/intellij/codeInsight/daemon/impl/tagTreeHighlighting/XmlTagTreeHighlightingPass.java @@ -44,7 +44,7 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.XmlChildRole; import com.intellij.psi.xml.XmlTag; import com.intellij.psi.xml.XmlTokenType; -import com.intellij.xml.breadcrumbs.BreadcrumbsInfoProvider; +import com.intellij.ui.breadcrumbs.BreadcrumbsProvider; import com.intellij.xml.breadcrumbs.BreadcrumbsXmlWrapper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -65,7 +65,7 @@ public class XmlTagTreeHighlightingPass extends TextEditorHighlightingPass { private final PsiFile myFile; private final EditorEx myEditor; - private final BreadcrumbsInfoProvider myInfoProvider; + private final BreadcrumbsProvider myInfoProvider; private final List> myPairsToHighlight = new ArrayList<>(); diff --git a/xml/impl/src/com/intellij/xml/breadcrumbs/BreadcrumbsConfigurable.java b/xml/impl/src/com/intellij/xml/breadcrumbs/BreadcrumbsConfigurable.java index 096a491601c7..ae4a89ee7698 100644 --- a/xml/impl/src/com/intellij/xml/breadcrumbs/BreadcrumbsConfigurable.java +++ b/xml/impl/src/com/intellij/xml/breadcrumbs/BreadcrumbsConfigurable.java @@ -23,6 +23,7 @@ import com.intellij.openapi.editor.ex.EditorSettingsExternalizable; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.colors.pages.GeneralColorsPage; +import com.intellij.ui.breadcrumbs.BreadcrumbsProvider; import com.intellij.ui.components.labels.LinkLabel; import com.intellij.ui.components.panels.HorizontalLayout; import com.intellij.ui.components.panels.VerticalLayout; @@ -68,7 +69,7 @@ final class BreadcrumbsConfigurable implements Configurable { JPanel boxes = new JPanel(new VerticalLayout(0)); boxes.setBorder(JBUI.Borders.emptyLeft(20)); - for (BreadcrumbsInfoProvider provider : BreadcrumbsInfoProvider.EP_NAME.getExtensions()) { + for (BreadcrumbsProvider provider : BreadcrumbsProvider.EP_NAME.getExtensions()) { for (Language language : provider.getLanguages()) { String id = language.getID(); if (!map.containsKey(id)) { diff --git a/xml/impl/src/com/intellij/xml/breadcrumbs/BreadcrumbsXmlWrapper.java b/xml/impl/src/com/intellij/xml/breadcrumbs/BreadcrumbsXmlWrapper.java index 236cde0daaaa..18cf98af4289 100644 --- a/xml/impl/src/com/intellij/xml/breadcrumbs/BreadcrumbsXmlWrapper.java +++ b/xml/impl/src/com/intellij/xml/breadcrumbs/BreadcrumbsXmlWrapper.java @@ -47,6 +47,7 @@ import com.intellij.openapi.vcs.FileStatusManager; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.ui.Gray; +import com.intellij.ui.breadcrumbs.BreadcrumbsProvider; import com.intellij.ui.components.breadcrumbs.Crumb; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.MouseEventAdapter; @@ -85,7 +86,7 @@ public class BreadcrumbsXmlWrapper extends JComponent implements Disposable { private final VirtualFile myFile; private boolean myUserCaretChange = true; private final MergingUpdateQueue myQueue = new MergingUpdateQueue("Breadcrumbs.Queue", 200, true, breadcrumbs); - private final BreadcrumbsInfoProvider myInfoProvider; + private final BreadcrumbsProvider myInfoProvider; private final Update myUpdate = new MyUpdate(this); public static final Key BREADCRUMBS_COMPONENT_KEY = new Key<>("BREADCRUMBS_KEY"); @@ -235,9 +236,8 @@ public class BreadcrumbsXmlWrapper extends JComponent implements Disposable { } @Nullable - private static BreadcrumbsInfoProvider findProviderForElement(@NotNull final PsiElement element, - final BreadcrumbsInfoProvider defaultProvider) { - final BreadcrumbsInfoProvider provider = getInfoProvider(element.getLanguage()); + private static BreadcrumbsProvider findProviderForElement(@NotNull PsiElement element, BreadcrumbsProvider defaultProvider) { + final BreadcrumbsProvider provider = getInfoProvider(element.getLanguage()); return provider == null ? defaultProvider : provider; } @@ -270,7 +270,7 @@ public class BreadcrumbsXmlWrapper extends JComponent implements Disposable { final VirtualFile file, final Editor editor, final Project project, - final BreadcrumbsInfoProvider defaultInfoProvider) { + final BreadcrumbsProvider defaultInfoProvider) { final LinkedList result = getLineElements(editor.logicalPositionToOffset(position), file, project, defaultInfoProvider); @@ -289,7 +289,7 @@ public class BreadcrumbsXmlWrapper extends JComponent implements Disposable { } @Nullable - public static PsiElement[] getLinePsiElements(int offset, VirtualFile file, Project project, BreadcrumbsInfoProvider infoProvider) { + public static PsiElement[] getLinePsiElements(int offset, VirtualFile file, Project project, BreadcrumbsProvider infoProvider) { final LinkedList lineElements = getLineElements(offset, file, project, infoProvider); return lineElements != null ? toPsiElementArray(lineElements) : null; } @@ -298,13 +298,13 @@ public class BreadcrumbsXmlWrapper extends JComponent implements Disposable { private static LinkedList getLineElements(final int offset, VirtualFile file, Project project, - BreadcrumbsInfoProvider defaultInfoProvider) { + BreadcrumbsProvider defaultInfoProvider) { PsiElement element = findFirstBreadcrumbedElement(offset, file, project, defaultInfoProvider); if (element == null) return null; final LinkedList result = new LinkedList<>(); while (element != null) { - BreadcrumbsInfoProvider provider = findProviderForElement(element, defaultInfoProvider); + BreadcrumbsProvider provider = findProviderForElement(element, defaultInfoProvider); if (provider != null && provider.acceptElement(element)) { result.addFirst(new PsiCrumb(element, provider)); @@ -319,7 +319,7 @@ public class BreadcrumbsXmlWrapper extends JComponent implements Disposable { private static PsiElement findFirstBreadcrumbedElement(final int offset, final VirtualFile file, final Project project, - final BreadcrumbsInfoProvider defaultInfoProvider) { + final BreadcrumbsProvider defaultInfoProvider) { if (file == null || !file.isValid()) return null; PriorityQueue leafs = @@ -346,7 +346,7 @@ public class BreadcrumbsXmlWrapper extends JComponent implements Disposable { final PsiElement element = leafs.remove(); if (!element.isValid()) continue; - BreadcrumbsInfoProvider provider = findProviderForElement(element, defaultInfoProvider); + BreadcrumbsProvider provider = findProviderForElement(element, defaultInfoProvider); if (provider != null && provider.acceptElement(element)) { return element; } @@ -358,7 +358,7 @@ public class BreadcrumbsXmlWrapper extends JComponent implements Disposable { } @Nullable - private static PsiElement getParent(@NotNull PsiElement element, @Nullable BreadcrumbsInfoProvider provider) { + private static PsiElement getParent(@NotNull PsiElement element, @Nullable BreadcrumbsProvider provider) { return provider != null ? provider.getParent(element) : element.getParent(); } @@ -380,7 +380,7 @@ public class BreadcrumbsXmlWrapper extends JComponent implements Disposable { } @Nullable - static BreadcrumbsInfoProvider findInfoProvider(VirtualFile file, Project project) { + static BreadcrumbsProvider findInfoProvider(VirtualFile file, Project project) { return project == null ? null : findInfoProvider(findViewProvider(file, project)); } @@ -398,7 +398,7 @@ public class BreadcrumbsXmlWrapper extends JComponent implements Disposable { } @Nullable - public static BreadcrumbsInfoProvider findInfoProvider(@Nullable FileViewProvider viewProvider) { + public static BreadcrumbsProvider findInfoProvider(@Nullable FileViewProvider viewProvider) { if (viewProvider == null) return null; EditorSettingsExternalizable settings = EditorSettingsExternalizable.getInstance(); @@ -407,7 +407,7 @@ public class BreadcrumbsXmlWrapper extends JComponent implements Disposable { Language baseLang = viewProvider.getBaseLanguage(); if (!settings.isBreadcrumbsShownFor(baseLang.getID())) return null; - BreadcrumbsInfoProvider provider = getInfoProvider(baseLang); + BreadcrumbsProvider provider = getInfoProvider(baseLang); if (provider == null) { for (Language language : viewProvider.getLanguages()) { if (settings.isBreadcrumbsShownFor(language.getID())) { @@ -481,9 +481,16 @@ public class BreadcrumbsXmlWrapper extends JComponent implements Disposable { } @Nullable - private static BreadcrumbsInfoProvider getInfoProvider(@NotNull final Language language) { + private static BreadcrumbsProvider getInfoProvider(@NotNull Language language) { EditorSettingsExternalizable settings = EditorSettingsExternalizable.getInstance(); - return BreadcrumbsInfoProvider.find(supported -> settings.isBreadcrumbsShownFor(language.getID()) && supported.isKindOf(language)); + for (BreadcrumbsProvider provider : BreadcrumbsProvider.EP_NAME.getExtensions()) { + for (Language supported : provider.getLanguages()) { + if (settings.isBreadcrumbsShownFor(language.getID()) && supported.isKindOf(language)) { + return provider; + } + } + } + return null; } private static class MyUpdate extends Update { diff --git a/xml/impl/src/com/intellij/xml/breadcrumbs/PsiCrumb.java b/xml/impl/src/com/intellij/xml/breadcrumbs/PsiCrumb.java index 247f72e001b2..0305208c4e41 100644 --- a/xml/impl/src/com/intellij/xml/breadcrumbs/PsiCrumb.java +++ b/xml/impl/src/com/intellij/xml/breadcrumbs/PsiCrumb.java @@ -16,6 +16,7 @@ package com.intellij.xml.breadcrumbs; import com.intellij.psi.PsiElement; +import com.intellij.ui.breadcrumbs.BreadcrumbsProvider; import com.intellij.ui.components.breadcrumbs.Crumb; /** @@ -25,8 +26,8 @@ final class PsiCrumb extends Crumb.Impl { final PsiElement element; CrumbPresentation presentation; - PsiCrumb(PsiElement element, BreadcrumbsInfoProvider provider) { - super(null, provider.getElementInfo(element), provider.getElementTooltip(element)); + PsiCrumb(PsiElement element, BreadcrumbsProvider provider) { + super(provider.getElementIcon(element), provider.getElementInfo(element), provider.getElementTooltip(element)); this.element = element; } diff --git a/xml/openapi/src/com/intellij/xml/breadcrumbs/BreadcrumbsInfoProvider.java b/xml/openapi/src/com/intellij/xml/breadcrumbs/BreadcrumbsInfoProvider.java index 56d87d74034a..5a1c700e8e51 100644 --- a/xml/openapi/src/com/intellij/xml/breadcrumbs/BreadcrumbsInfoProvider.java +++ b/xml/openapi/src/com/intellij/xml/breadcrumbs/BreadcrumbsInfoProvider.java @@ -14,59 +14,10 @@ * limitations under the License. */ -/* - * Created by IntelliJ IDEA. - * User: spleaner - * Date: Jun 19, 2007 - * Time: 3:33:15 PM - */ package com.intellij.xml.breadcrumbs; -import com.intellij.lang.Language; -import com.intellij.psi.PsiElement; -import com.intellij.openapi.extensions.ExtensionPointName; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import com.intellij.ui.breadcrumbs.BreadcrumbsProvider; -import java.util.LinkedHashMap; -import java.util.function.Predicate; - -public abstract class BreadcrumbsInfoProvider { - public static final ExtensionPointName EP_NAME - = ExtensionPointName.create("com.intellij.breadcrumbsInfoProvider"); - - public abstract Language[] getLanguages(); - - public abstract boolean acceptElement(@NotNull final PsiElement e); - - @Nullable - public PsiElement getParent(@NotNull final PsiElement e) { - return e.getParent(); - } - - @NotNull - public abstract String getElementInfo(@NotNull final PsiElement e); - - @Nullable - public abstract String getElementTooltip(@NotNull final PsiElement e); - - @NotNull - public static Iterable getSupportedLanguages() { - LinkedHashMap map = new LinkedHashMap<>(); - for (BreadcrumbsInfoProvider provider : EP_NAME.getExtensions()) { - for (Language language : provider.getLanguages()) { - map.put(language.getID(), language); - } - } - return map.values(); - } - - public static BreadcrumbsInfoProvider find(Predicate predicate) { - for (BreadcrumbsInfoProvider provider : EP_NAME.getExtensions()) { - for (Language language : provider.getLanguages()) { - if (predicate.test(language)) return provider; - } - } - return null; - } +@Deprecated +public abstract class BreadcrumbsInfoProvider implements BreadcrumbsProvider { } \ No newline at end of file