IDEA-149666 Bookmark icons are not shown for files in Project View

OC-3630 Files View: bookmarks are not shown for files
This commit is contained in:
Anton Makeev
2015-12-22 12:28:51 +01:00
parent 374cda9067
commit cf1ace779d
4 changed files with 42 additions and 35 deletions
@@ -157,7 +157,7 @@ public class BookmarkManager extends AbstractProjectComponent implements Persist
return "BookmarkManager";
}
public void addEditorBookmark(Editor editor, int lineIndex) {
public void addEditorBookmark(@NotNull Editor editor, int lineIndex) {
Document document = editor.getDocument();
PsiFile psiFile = PsiDocumentManager.getInstance(myProject).getPsiFile(document);
if (psiFile == null) return;
@@ -168,14 +168,16 @@ public class BookmarkManager extends AbstractProjectComponent implements Persist
addTextBookmark(virtualFile, lineIndex, getAutoDescription(editor, lineIndex));
}
public Bookmark addTextBookmark(VirtualFile file, int lineIndex, String description) {
@NotNull
public Bookmark addTextBookmark(@NotNull VirtualFile file, int lineIndex, @NotNull String description) {
Bookmark b = new Bookmark(myProject, file, lineIndex, description);
myBookmarks.add(0, b);
myBus.syncPublisher(BookmarksListener.TOPIC).bookmarkAdded(b);
return b;
}
public static String getAutoDescription(final Editor editor, final int lineIndex) {
@NotNull
public static String getAutoDescription(@NotNull final Editor editor, final int lineIndex) {
String autoDescription = editor.getSelectionModel().getSelectedText();
if ( autoDescription == null ) {
Document document = editor.getDocument();
@@ -189,7 +191,7 @@ public class BookmarkManager extends AbstractProjectComponent implements Persist
}
@Nullable
public Bookmark addFileBookmark(VirtualFile file, String description) {
public Bookmark addFileBookmark(@Nullable VirtualFile file, @NotNull String description) {
if (file == null) return null;
if (findFileBookmark(file) != null) return null;
@@ -17,6 +17,8 @@
package com.intellij.ide.projectView.impl.nodes;
import com.intellij.codeInsight.navigation.NavigationUtil;
import com.intellij.ide.bookmarks.Bookmark;
import com.intellij.ide.bookmarks.BookmarkManager;
import com.intellij.ide.projectView.PresentationData;
import com.intellij.ide.projectView.ProjectViewNode;
import com.intellij.ide.projectView.ProjectViewNodeDecorator;
@@ -34,12 +36,16 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Iconable;
import com.intellij.openapi.vcs.FileStatus;
import com.intellij.openapi.vcs.FileStatusManager;
import com.intellij.openapi.vfs.VFileProperty;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.pom.StatePreservingNavigatable;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiUtilBase;
import com.intellij.ui.LayeredIcon;
import com.intellij.ui.RowIcon;
import com.intellij.util.PlatformIcons;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -157,6 +163,8 @@ public abstract class AbstractPsiBasedNode<Value> extends ProjectViewNode<Value>
catch (IndexNotReadyException ignored) {
}
updateImpl(data);
data.setIcon(patchIcon(myProject, data.getIcon(true), getVirtualFile()));
for (ProjectViewNodeDecorator decorator : Extensions.getExtensions(ProjectViewNodeDecorator.EP_NAME, myProject)) {
decorator.decorate(AbstractPsiBasedNode.this, data);
}
@@ -173,6 +181,31 @@ public abstract class AbstractPsiBasedNode<Value> extends ProjectViewNode<Value>
return flags;
}
@Nullable
public static Icon patchIcon(@NotNull Project project, @Nullable Icon original, @Nullable VirtualFile file) {
if (file == null || original == null) return null;
Icon icon = original;
final Bookmark bookmarkAtFile = BookmarkManager.getInstance(project).findFileBookmark(file);
if (bookmarkAtFile != null) {
final RowIcon composite = new RowIcon(2, RowIcon.Alignment.CENTER);
composite.setIcon(icon, 0);
composite.setIcon(bookmarkAtFile.getIcon(), 1);
icon = composite;
}
if (!file.isWritable()) {
icon = LayeredIcon.create(icon, PlatformIcons.LOCKED_ICON);
}
if (file.is(VFileProperty.SYMLINK)) {
icon = LayeredIcon.create(icon, PlatformIcons.SYMLINK_ICON);
}
return icon;
}
protected boolean isDeprecated() {
return false;
}
@@ -16,8 +16,6 @@
package com.intellij.ide.projectView.impl.nodes;
import com.intellij.ide.IconProvider;
import com.intellij.ide.bookmarks.Bookmark;
import com.intellij.ide.bookmarks.BookmarkManager;
import com.intellij.ide.projectView.PresentationData;
import com.intellij.ide.projectView.ProjectView;
import com.intellij.ide.projectView.ViewSettings;
@@ -38,19 +36,15 @@ import com.intellij.openapi.roots.ui.configuration.ProjectSettingsService;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VFileProperty;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.pom.NavigatableWithText;
import com.intellij.projectImport.ProjectAttachProcessor;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.impl.file.PsiDirectoryFactory;
import com.intellij.ui.LayeredIcon;
import com.intellij.ui.RowIcon;
import com.intellij.ui.SimpleTextAttributes;
import com.intellij.util.IconUtil;
import com.intellij.util.PathUtil;
import com.intellij.util.PlatformIcons;
import com.intellij.util.PlatformUtils;
import org.jetbrains.annotations.NotNull;
@@ -130,14 +124,14 @@ public class PsiDirectoryNode extends BasePsiNode<PsiDirectory> implements Navig
if (PlatformUtils.isAppCode()) {
final Icon icon = IconUtil.getIcon(virtualFile, 0, myProject);
if (icon != null) {
data.setIcon(patchIcon(icon, virtualFile));
data.setIcon(icon);
}
}
else {
for (final IconProvider provider : Extensions.getExtensions(IconProvider.EXTENSION_POINT_NAME)) {
final Icon icon = provider.getIcon(psiDirectory, 0);
if (icon != null) {
data.setIcon(patchIcon(icon, virtualFile));
data.setIcon(icon);
return;
}
}
@@ -273,28 +267,6 @@ public class PsiDirectoryNode extends BasePsiNode<PsiDirectory> implements Navig
return super.getTitle();
}
protected Icon patchIcon(Icon original, VirtualFile file) {
Icon icon = original;
final Bookmark bookmarkAtFile = BookmarkManager.getInstance(myProject).findFileBookmark(file);
if (bookmarkAtFile != null) {
final RowIcon composite = new RowIcon(2, RowIcon.Alignment.CENTER);
composite.setIcon(icon, 0);
composite.setIcon(bookmarkAtFile.getIcon(), 1);
icon = composite;
}
if (!file.isWritable()) {
icon = LayeredIcon.create(icon, PlatformIcons.LOCKED_ICON);
}
if (file.is(VFileProperty.SYMLINK)) {
icon = LayeredIcon.create(icon, PlatformIcons.SYMLINK_ICON);
}
return icon;
}
@Override
public Comparable getSortKey() {
if (ProjectAttachProcessor.canAttachToProject()) {
@@ -102,7 +102,7 @@ public final class TodoDirNode extends PsiDirectoryNode implements HighlightedRe
protected void setupIcon(PresentationData data, PsiDirectory psiDirectory) {
final VirtualFile virtualFile = psiDirectory.getVirtualFile();
if (ProjectRootsUtil.isModuleContentRoot(virtualFile, psiDirectory.getProject())) {
data.setIcon(patchIcon(new DirectoryIconProvider().getIcon(psiDirectory, 0), virtualFile));
data.setIcon(new DirectoryIconProvider().getIcon(psiDirectory, 0));
} else {
super.setupIcon(data, psiDirectory);
}