diff --git a/xml/impl/src/com/intellij/xml/breadcrumbs/BreadcrumbsInitializingActivity.java b/xml/impl/src/com/intellij/xml/breadcrumbs/BreadcrumbsInitializingActivity.java index 7947105d3f63..81502303f4eb 100644 --- a/xml/impl/src/com/intellij/xml/breadcrumbs/BreadcrumbsInitializingActivity.java +++ b/xml/impl/src/com/intellij/xml/breadcrumbs/BreadcrumbsInitializingActivity.java @@ -133,8 +133,7 @@ public class BreadcrumbsInitializingActivity implements StartupActivity, DumbAwa return false; } - final FileViewProvider provider = PsiManager.getInstance(project).findViewProvider(file); - return provider != null && BreadcrumbsXmlWrapper.findInfoProvider(provider) != null; + return BreadcrumbsXmlWrapper.findInfoProvider(file, project) != null; } private static void registerWrapper(@NotNull FileEditorManager fileEditorManager, diff --git a/xml/impl/src/com/intellij/xml/breadcrumbs/BreadcrumbsXmlWrapper.java b/xml/impl/src/com/intellij/xml/breadcrumbs/BreadcrumbsXmlWrapper.java index 31a8b110f294..236cde0daaaa 100644 --- a/xml/impl/src/com/intellij/xml/breadcrumbs/BreadcrumbsXmlWrapper.java +++ b/xml/impl/src/com/intellij/xml/breadcrumbs/BreadcrumbsXmlWrapper.java @@ -20,7 +20,6 @@ import com.intellij.codeInsight.highlighting.HighlightManager; import com.intellij.lang.Language; import com.intellij.openapi.Disposable; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.EditorGutter; import com.intellij.openapi.editor.LogicalPosition; @@ -102,8 +101,7 @@ public class BreadcrumbsXmlWrapper extends JComponent implements Disposable { assert project != null; myProject = project; - Document document = myEditor.getDocument(); - myFile = FileDocumentManager.getInstance().getFile(document); + myFile = getVirtualFile(myEditor); final FileStatusManager manager = FileStatusManager.getInstance(project); manager.addFileStatusListener(new FileStatusListener() { @@ -113,7 +111,7 @@ public class BreadcrumbsXmlWrapper extends JComponent implements Disposable { } }, this); - myInfoProvider = findInfoProvider(findViewProvider(myFile, myProject)); + myInfoProvider = findInfoProvider(myFile, myProject); final CaretListener caretListener = new CaretAdapter() { @Override @@ -370,6 +368,26 @@ public class BreadcrumbsXmlWrapper extends JComponent implements Disposable { return PsiManager.getInstance(project).findViewProvider(file); } + @Nullable + static FileViewProvider findViewProvider(Editor editor) { + if (editor == null) return null; + + Project project = editor.getProject(); + if (project == null) return null; + + VirtualFile file = getVirtualFile(editor); + return findViewProvider(file, project); + } + + @Nullable + static BreadcrumbsInfoProvider findInfoProvider(VirtualFile file, Project project) { + return project == null ? null : findInfoProvider(findViewProvider(file, project)); + } + + private static VirtualFile getVirtualFile(@NotNull Editor editor) { + return FileDocumentManager.getInstance().getFile(editor.getDocument()); + } + private void updateCrumbs(final LogicalPosition position) { if (myFile != null && myEditor != null && !myEditor.isDisposed() && !myProject.isDisposed()) { if (PsiDocumentManager.getInstance(myProject).isUncommited(myEditor.getDocument())) { @@ -381,20 +399,24 @@ public class BreadcrumbsXmlWrapper extends JComponent implements Disposable { @Nullable public static BreadcrumbsInfoProvider findInfoProvider(@Nullable FileViewProvider viewProvider) { - if (EditorSettingsExternalizable.getInstance().isBreadcrumbsShown() && viewProvider != null) { - final Language baseLang = viewProvider.getBaseLanguage(); - BreadcrumbsInfoProvider provider = getInfoProvider(baseLang); - if (provider != null) { - return provider; - } - for (final Language language : viewProvider.getLanguages()) { - provider = getInfoProvider(language); - if (provider != null) { - return provider; + if (viewProvider == null) return null; + + EditorSettingsExternalizable settings = EditorSettingsExternalizable.getInstance(); + if (!settings.isBreadcrumbsShown()) return null; + + Language baseLang = viewProvider.getBaseLanguage(); + if (!settings.isBreadcrumbsShownFor(baseLang.getID())) return null; + + BreadcrumbsInfoProvider provider = getInfoProvider(baseLang); + if (provider == null) { + for (Language language : viewProvider.getLanguages()) { + if (settings.isBreadcrumbsShownFor(language.getID())) { + provider = getInfoProvider(language); + if (provider != null) break; } } } - return null; + return provider; } @Deprecated diff --git a/xml/impl/src/com/intellij/xml/breadcrumbs/ToggleBreadcrumbsAction.java b/xml/impl/src/com/intellij/xml/breadcrumbs/ToggleBreadcrumbsAction.java index 91fa5d636621..548806ba2c58 100644 --- a/xml/impl/src/com/intellij/xml/breadcrumbs/ToggleBreadcrumbsAction.java +++ b/xml/impl/src/com/intellij/xml/breadcrumbs/ToggleBreadcrumbsAction.java @@ -22,19 +22,35 @@ import com.intellij.openapi.actionSystem.ToggleAction; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.ex.EditorSettingsExternalizable; import com.intellij.openapi.project.DumbAware; +import com.intellij.psi.FileViewProvider; import org.jetbrains.annotations.NotNull; final class ToggleBreadcrumbsAction extends ToggleAction implements DumbAware { @Override public boolean isSelected(AnActionEvent event) { EditorSettingsExternalizable settings = EditorSettingsExternalizable.getInstance(); - return settings.isBreadcrumbsShown(); + + boolean selected = settings.isBreadcrumbsShown(); + if (!selected) return false; + + String languageID = findLanguageID(event); + return languageID == null || settings.isBreadcrumbsShownFor(languageID); } @Override public void setSelected(AnActionEvent event, boolean selected) { EditorSettingsExternalizable settings = EditorSettingsExternalizable.getInstance(); - if (settings.setBreadcrumbsShown(selected)) { + + boolean modified; + String languageID = findLanguageID(event); + if (languageID == null) { + modified = settings.setBreadcrumbsShown(selected); + } + else { + modified = settings.setBreadcrumbsShownFor(languageID, selected); + if (selected && settings.setBreadcrumbsShown(true)) modified = true; + } + if (modified) { UISettings.getInstance().fireUISettingsChanged(); } } @@ -43,7 +59,16 @@ final class ToggleBreadcrumbsAction extends ToggleAction implements DumbAware { public void update(@NotNull AnActionEvent event) { super.update(event); - Editor editor = event.getData(CommonDataKeys.EDITOR_EVEN_IF_INACTIVE); + Editor editor = findEditor(event); event.getPresentation().setEnabled(editor != null); } + + private static Editor findEditor(AnActionEvent event) { + return event == null ? null : event.getData(CommonDataKeys.EDITOR_EVEN_IF_INACTIVE); + } + + private static String findLanguageID(AnActionEvent event) { + FileViewProvider provider = BreadcrumbsXmlWrapper.findViewProvider(findEditor(event)); + return provider == null ? null : provider.getBaseLanguage().getID(); + } }