IDEA-169924 toggle breadcrumbs settings separately

This commit is contained in:
Sergey Malenkov
2017-04-17 18:01:48 +03:00
parent d8a366e2de
commit d101306eb6
3 changed files with 66 additions and 20 deletions
@@ -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,
@@ -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
@@ -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();
}
}