diff --git a/platform/lang-impl/src/com/intellij/ide/bookmarks/BookmarkManager.java b/platform/lang-impl/src/com/intellij/ide/bookmarks/BookmarkManager.java index 9d67cd360696..8a441e74e8f7 100644 --- a/platform/lang-impl/src/com/intellij/ide/bookmarks/BookmarkManager.java +++ b/platform/lang-impl/src/com/intellij/ide/bookmarks/BookmarkManager.java @@ -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 { private final List myBookmarks = new ArrayList(); 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 { } 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 { 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 { 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 { } public void loadState(Element state) { + BookmarksListener publisher = myBus.syncPublisher(BookmarksListener.TOPIC); for (Bookmark bookmark : myBookmarks) { bookmark.release(); + publisher.bookmarkRemoved(bookmark); } myBookmarks.clear(); diff --git a/platform/lang-impl/src/com/intellij/ide/bookmarks/BookmarksListener.java b/platform/lang-impl/src/com/intellij/ide/bookmarks/BookmarksListener.java new file mode 100644 index 000000000000..15163627a8e7 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/ide/bookmarks/BookmarksListener.java @@ -0,0 +1,13 @@ +/* + * @author max + */ +package com.intellij.ide.bookmarks; + +import com.intellij.util.messages.Topic; + +public interface BookmarksListener { + Topic TOPIC = Topic.create("Bookmarks", BookmarksListener.class); + + void bookmarkAdded(Bookmark b); + void bookmarkRemoved(Bookmark b); +} diff --git a/platform/lang-impl/src/com/intellij/ide/bookmarks/actions/BookmarksAction.java b/platform/lang-impl/src/com/intellij/ide/bookmarks/actions/BookmarksAction.java index cf0663a2809a..11cd4bbafe0c 100644 --- a/platform/lang-impl/src/com/intellij/ide/bookmarks/actions/BookmarksAction.java +++ b/platform/lang-impl/src/com/intellij/ide/bookmarks/actions/BookmarksAction.java @@ -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(); diff --git a/platform/lang-impl/src/com/intellij/ide/impl/ProjectViewSelectInTarget.java b/platform/lang-impl/src/com/intellij/ide/impl/ProjectViewSelectInTarget.java index 18359e25bc52..5bbbf8c3cac0 100644 --- a/platform/lang-impl/src/com/intellij/ide/impl/ProjectViewSelectInTarget.java +++ b/platform/lang-impl/src/com/intellij/ide/impl/ProjectViewSelectInTarget.java @@ -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; } diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectTreeBuilder.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectTreeBuilder.java index 481322f853ec..04fbf3ce5214 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectTreeBuilder.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectTreeBuilder.java @@ -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 { } } } -} \ No newline at end of file +} diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiDirectoryNode.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiDirectoryNode.java index 4a834f4f30ce..a8f2c66d6352 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiDirectoryNode.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/nodes/PsiDirectoryNode.java @@ -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 { 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 { 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;