mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
1. tick icon for bookmarked nodes in project view
2. improoved navigation to bookmarked folders in project view 3. use file colors in file renderer in bookmarks popup
This commit is contained in:
@@ -16,6 +16,7 @@ import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.openapi.vfs.VirtualFileManager;
|
||||
import com.intellij.psi.PsiDocumentManager;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.util.messages.MessageBus;
|
||||
import org.jdom.Element;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@@ -35,13 +36,15 @@ public class BookmarkManager implements PersistentStateComponent<Element> {
|
||||
private final List<Bookmark> myBookmarks = new ArrayList<Bookmark>();
|
||||
private final MyEditorMouseListener myEditorMouseListener = new MyEditorMouseListener();
|
||||
private final Project myProject;
|
||||
private final MessageBus myBus;
|
||||
|
||||
public static BookmarkManager getInstance(Project project) {
|
||||
return ServiceManager.getService(project, BookmarkManager.class);
|
||||
}
|
||||
|
||||
public BookmarkManager(Project project) {
|
||||
public BookmarkManager(Project project, MessageBus bus) {
|
||||
myProject = project;
|
||||
myBus = bus;
|
||||
}
|
||||
|
||||
public void projectOpened() {
|
||||
@@ -66,7 +69,9 @@ public class BookmarkManager implements PersistentStateComponent<Element> {
|
||||
}
|
||||
|
||||
public void addTextBookmark(VirtualFile file, int lineIndex, String description) {
|
||||
myBookmarks.add(new Bookmark(myProject, file, lineIndex, description));
|
||||
Bookmark b = new Bookmark(myProject, file, lineIndex, description);
|
||||
myBus.syncPublisher(BookmarksListener.TOPIC).bookmarkAdded(b);
|
||||
myBookmarks.add(b);
|
||||
}
|
||||
|
||||
public static String getAutoDescription(final Editor editor, final int lineIndex) {
|
||||
@@ -86,7 +91,9 @@ public class BookmarkManager implements PersistentStateComponent<Element> {
|
||||
if (file == null) return;
|
||||
if (findFileBookmark(file) != null) return;
|
||||
|
||||
myBookmarks.add(new Bookmark(myProject, file, description));
|
||||
Bookmark b = new Bookmark(myProject, file, description);
|
||||
myBookmarks.add(b);
|
||||
myBus.syncPublisher(BookmarksListener.TOPIC).bookmarkAdded(b);
|
||||
}
|
||||
|
||||
|
||||
@@ -122,6 +129,7 @@ public class BookmarkManager implements PersistentStateComponent<Element> {
|
||||
public void removeBookmark(Bookmark bookmark) {
|
||||
myBookmarks.remove(bookmark);
|
||||
bookmark.release();
|
||||
myBus.syncPublisher(BookmarksListener.TOPIC).bookmarkRemoved(bookmark);
|
||||
}
|
||||
|
||||
public Element getState() {
|
||||
@@ -131,8 +139,10 @@ public class BookmarkManager implements PersistentStateComponent<Element> {
|
||||
}
|
||||
|
||||
public void loadState(Element state) {
|
||||
BookmarksListener publisher = myBus.syncPublisher(BookmarksListener.TOPIC);
|
||||
for (Bookmark bookmark : myBookmarks) {
|
||||
bookmark.release();
|
||||
publisher.bookmarkRemoved(bookmark);
|
||||
}
|
||||
myBookmarks.clear();
|
||||
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
/*
|
||||
* @author max
|
||||
*/
|
||||
package com.intellij.ide.bookmarks;
|
||||
|
||||
import com.intellij.util.messages.Topic;
|
||||
|
||||
public interface BookmarksListener {
|
||||
Topic<BookmarksListener> TOPIC = Topic.create("Bookmarks", BookmarksListener.class);
|
||||
|
||||
void bookmarkAdded(Bookmark b);
|
||||
void bookmarkRemoved(Bookmark b);
|
||||
}
|
||||
@@ -18,7 +18,6 @@ import com.intellij.openapi.editor.highlighter.EditorHighlighterFactory;
|
||||
import com.intellij.openapi.editor.markup.EffectType;
|
||||
import com.intellij.openapi.editor.markup.TextAttributes;
|
||||
import com.intellij.openapi.fileEditor.FileDocumentManager;
|
||||
import com.intellij.openapi.fileEditor.FileEditorManager;
|
||||
import com.intellij.openapi.project.DumbAware;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.ui.popup.PopupChooserBuilder;
|
||||
@@ -29,9 +28,10 @@ import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.openapi.wm.IdeFocusManager;
|
||||
import com.intellij.openapi.wm.ToolWindowManager;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.PsiManager;
|
||||
import com.intellij.ui.ColoredListCellRenderer;
|
||||
import com.intellij.ui.LightColors;
|
||||
import com.intellij.ui.FileColorManager;
|
||||
import com.intellij.ui.ListSpeedSearch;
|
||||
import com.intellij.ui.SimpleTextAttributes;
|
||||
import com.intellij.util.Alarm;
|
||||
@@ -227,10 +227,7 @@ public class BookmarksAction extends AnAction implements DumbAware {
|
||||
|
||||
model.addElement(new ManageBookmarksItem(bookmarkAtPlace));
|
||||
|
||||
if (bookmarkAtPlace != null) {
|
||||
model.addElement(new RemoveBookmarkItem(bookmarkAtPlace));
|
||||
}
|
||||
else {
|
||||
if (bookmarkAtPlace == null) {
|
||||
model.addElement(new SetBookmarkItem(file, line));
|
||||
}
|
||||
|
||||
@@ -386,8 +383,11 @@ public class BookmarksAction extends AnAction implements DumbAware {
|
||||
renderer.append(String.valueOf(myBookmark.getLine() + 1), SimpleTextAttributes.GRAYED_ATTRIBUTES);
|
||||
}
|
||||
|
||||
if (!selected && FileEditorManager.getInstance(project).isFileOpen(file)) {
|
||||
renderer.setBackground(LightColors.SLIGHTLY_GREEN);
|
||||
if (!selected && (fileOrDir instanceof PsiFile)) {
|
||||
Color color = FileColorManager.getInstance(project).getFileColor((PsiFile)fileOrDir);
|
||||
if (color != null) {
|
||||
renderer.setBackground(color);
|
||||
}
|
||||
}
|
||||
|
||||
String description = myBookmark.getDescription();
|
||||
|
||||
@@ -10,7 +10,6 @@ import com.intellij.ide.projectView.impl.AbstractProjectViewPane;
|
||||
import com.intellij.openapi.extensions.Extensions;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.ActionCallback;
|
||||
import com.intellij.openapi.util.Comparing;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.openapi.wm.ToolWindowId;
|
||||
import com.intellij.openapi.wm.ToolWindowManager;
|
||||
@@ -84,14 +83,6 @@ public abstract class ProjectViewSelectInTarget extends SelectInTargetPsiWrapper
|
||||
|
||||
@Override
|
||||
protected boolean canSelect(PsiFileSystemItem file) {
|
||||
final Project project = file.getProject();
|
||||
final String activeToolWindowId = ToolWindowManager.getInstance(project).getActiveToolWindowId();
|
||||
if (ToolWindowId.PROJECT_VIEW.equals(activeToolWindowId)) {
|
||||
final String currentView = ProjectView.getInstance(project).getCurrentViewId();
|
||||
if (Comparing.strEqual(currentView, getMinorViewId())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -2,13 +2,15 @@ package com.intellij.ide.projectView.impl;
|
||||
|
||||
import com.intellij.ProjectTopics;
|
||||
import com.intellij.ide.CopyPasteUtil;
|
||||
import com.intellij.ide.bookmarks.Bookmark;
|
||||
import com.intellij.ide.bookmarks.BookmarksListener;
|
||||
import com.intellij.ide.projectView.BaseProjectTreeBuilder;
|
||||
import com.intellij.ide.projectView.ProjectViewNode;
|
||||
import com.intellij.ide.projectView.ProjectViewPsiTreeChangeListener;
|
||||
import com.intellij.ide.util.treeView.AbstractTreeUpdater;
|
||||
import com.intellij.ide.util.treeView.NodeDescriptor;
|
||||
import com.intellij.openapi.application.ModalityState;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.application.ModalityState;
|
||||
import com.intellij.openapi.ide.CopyPasteManager;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.ModuleRootEvent;
|
||||
@@ -55,6 +57,9 @@ public class ProjectTreeBuilder extends BaseProjectTreeBuilder {
|
||||
getUpdater().addSubtreeToUpdate(getRootNode());
|
||||
}
|
||||
});
|
||||
|
||||
connection.subscribe(BookmarksListener.TOPIC, new MyBookmarksListener());
|
||||
|
||||
PsiManager.getInstance(myProject).addPsiTreeChangeListener(myPsiTreeChangeListener);
|
||||
myFileStatusListener = new MyFileStatusListener();
|
||||
FileStatusManager.getInstance(myProject).addFileStatusListener(myFileStatusListener);
|
||||
@@ -115,20 +120,30 @@ public class ProjectTreeBuilder extends BaseProjectTreeBuilder {
|
||||
}
|
||||
}
|
||||
|
||||
private final class MyBookmarksListener implements BookmarksListener {
|
||||
public void bookmarkAdded(Bookmark b) {
|
||||
updateForFile(b.getFile());
|
||||
}
|
||||
|
||||
public void bookmarkRemoved(Bookmark b) {
|
||||
updateForFile(b.getFile());
|
||||
}
|
||||
|
||||
private void updateForFile(VirtualFile file) {
|
||||
PsiElement element = findPsi(file);
|
||||
if (element != null) {
|
||||
getUpdater().addSubtreeToUpdateByElement(element);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private final class MyFileStatusListener implements FileStatusListener {
|
||||
public void fileStatusesChanged() {
|
||||
getUpdater().addSubtreeToUpdate(getRootNode());
|
||||
}
|
||||
|
||||
public void fileStatusChanged(@NotNull VirtualFile vFile) {
|
||||
PsiElement element;
|
||||
PsiManager psiManager = PsiManager.getInstance(myProject);
|
||||
if (vFile.isDirectory()) {
|
||||
element = psiManager.findDirectory(vFile);
|
||||
}
|
||||
else {
|
||||
element = psiManager.findFile(vFile);
|
||||
}
|
||||
PsiElement element = findPsi(vFile);
|
||||
|
||||
final boolean fileAdded = getUpdater().addSubtreeToUpdateByElement(element);
|
||||
if (!fileAdded) {
|
||||
@@ -142,6 +157,18 @@ public class ProjectTreeBuilder extends BaseProjectTreeBuilder {
|
||||
}
|
||||
}
|
||||
|
||||
private PsiElement findPsi(VirtualFile vFile) {
|
||||
PsiElement element;
|
||||
PsiManager psiManager = PsiManager.getInstance(myProject);
|
||||
if (vFile.isDirectory()) {
|
||||
element = psiManager.findDirectory(vFile);
|
||||
}
|
||||
else {
|
||||
element = psiManager.findFile(vFile);
|
||||
}
|
||||
return element;
|
||||
}
|
||||
|
||||
/* private class PropertiesFileListener implements PropertiesFilesManager.PropertiesFileListener {
|
||||
public void fileAdded(VirtualFile propertiesFile) {
|
||||
fileChanged(propertiesFile, null);
|
||||
@@ -219,4 +246,4 @@ public class ProjectTreeBuilder extends BaseProjectTreeBuilder {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+18
-4
@@ -1,6 +1,8 @@
|
||||
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.ViewSettings;
|
||||
import com.intellij.ide.projectView.impl.ProjectRootsUtil;
|
||||
@@ -20,6 +22,7 @@ import com.intellij.openapi.vfs.VirtualFile;
|
||||
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.Icons;
|
||||
import com.intellij.util.PathUtil;
|
||||
@@ -89,16 +92,15 @@ public class PsiDirectoryNode extends BasePsiNode<PsiDirectory> {
|
||||
setupIcon(data, psiDirectory);
|
||||
}
|
||||
|
||||
private static void setupIcon(PresentationData data, PsiDirectory psiDirectory) {
|
||||
private void setupIcon(PresentationData data, PsiDirectory psiDirectory) {
|
||||
final VirtualFile virtualFile = psiDirectory.getVirtualFile();
|
||||
final boolean isWritable = virtualFile.isWritable();
|
||||
for (final IconProvider provider : Extensions.getExtensions(IconProvider.EXTENSION_POINT_NAME)) {
|
||||
final Icon openIcon = provider.getIcon(psiDirectory, Iconable.ICON_FLAG_OPEN);
|
||||
if (openIcon != null) {
|
||||
final Icon closedIcon = provider.getIcon(psiDirectory, Iconable.ICON_FLAG_CLOSED);
|
||||
if (closedIcon != null) {
|
||||
data.setOpenIcon(addReadMark(openIcon, isWritable));
|
||||
data.setClosedIcon(addReadMark(closedIcon, isWritable));
|
||||
data.setOpenIcon(patchIcon(openIcon, virtualFile));
|
||||
data.setClosedIcon(patchIcon(closedIcon, virtualFile));
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -187,6 +189,18 @@ public class PsiDirectoryNode extends BasePsiNode<PsiDirectory> {
|
||||
return super.getTitle();
|
||||
}
|
||||
|
||||
private Icon patchIcon(Icon original, VirtualFile file) {
|
||||
Bookmark bookmarkAtFile = BookmarkManager.getInstance(myProject).findFileBookmark(file);
|
||||
if (bookmarkAtFile != null) {
|
||||
RowIcon composite = new RowIcon(2);
|
||||
composite.setIcon(original, 0);
|
||||
composite.setIcon(Bookmark.TICK, 1);
|
||||
return addReadMark(composite, file.isWritable());
|
||||
}
|
||||
|
||||
return addReadMark(original, file.isWritable());
|
||||
}
|
||||
|
||||
private static Icon addReadMark(Icon originalIcon, boolean isWritable) {
|
||||
if (isWritable) {
|
||||
return originalIcon;
|
||||
|
||||
Reference in New Issue
Block a user