diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/annotate/FileAnnotation.java b/platform/vcs-api/src/com/intellij/openapi/vcs/annotate/FileAnnotation.java index 8db413c63d1a..df3fb7e4f4ed 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/annotate/FileAnnotation.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/annotate/FileAnnotation.java @@ -15,9 +15,12 @@ */ package com.intellij.openapi.vcs.annotate; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vcs.ProjectLevelVcsManager; import com.intellij.openapi.vcs.VcsKey; import com.intellij.openapi.vcs.history.VcsFileRevision; import com.intellij.openapi.vcs.history.VcsRevisionNumber; +import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.Nullable; import java.util.Date; @@ -27,8 +30,13 @@ import java.util.List; * A provider of file annotations related to VCS */ public abstract class FileAnnotation { + private final Project myProject; private Runnable myCloser; + protected FileAnnotation(Project project) { + myProject = project; + } + /** * This method is invoked when the annotation provider is no * more used by UI. @@ -121,4 +129,10 @@ public abstract class FileAnnotation { final VcsRevisionNumber currentRevision = getCurrentRevision(); return currentRevision != null && ! currentRevision.equals(number); } + + public abstract VirtualFile getFile(); + + public void unregister() { + ProjectLevelVcsManager.getInstance(myProject).getAnnotationLocalChangesListener().unregisterAnnotation(getFile(), this); + } } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotateToggleAction.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotateToggleAction.java index 296cf8154821..f4f8272b986b 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotateToggleAction.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotateToggleAction.java @@ -199,9 +199,6 @@ public class AnnotateToggleAction extends ToggleAction implements DumbAware, Ann editor.getGutter().closeAllAnnotations(); } }); - if (onCurrentRevision) { - listener.unregisterAnnotation(file, fileAnnotation); - } } }); if (onCurrentRevision) { diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotationFieldGutter.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotationFieldGutter.java index 582c7cd810a9..80cb5ddfd2b5 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotationFieldGutter.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotationFieldGutter.java @@ -132,6 +132,7 @@ public class AnnotationFieldGutter implements ActiveAnnotationGutter { } public void gutterClosed() { + myAnnotation.unregister(); myAnnotation.dispose(); final Collection gutters = myEditor.getUserData(AnnotateToggleAction.KEY_IN_EDITOR); if (gutters != null) { diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsAnnotationLocalChangesListenerImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsAnnotationLocalChangesListenerImpl.java index 14ccaffb14e3..5e2de4405f6a 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsAnnotationLocalChangesListenerImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsAnnotationLocalChangesListenerImpl.java @@ -213,6 +213,9 @@ public class VcsAnnotationLocalChangesListenerImpl implements Disposable, VcsAnn if (annotations != null && ! annotations.isEmpty()) { annotations.remove(annotation); } + if (annotations != null && annotations.isEmpty()) { + myFileAnnotationMap.remove(file); + } } } diff --git a/plugins/cvs/cvs-plugin/src/com/intellij/cvsSupport2/annotate/CvsAnnotationProvider.java b/plugins/cvs/cvs-plugin/src/com/intellij/cvsSupport2/annotate/CvsAnnotationProvider.java index ccf745dd7984..902f75444a81 100644 --- a/plugins/cvs/cvs-plugin/src/com/intellij/cvsSupport2/annotate/CvsAnnotationProvider.java +++ b/plugins/cvs/cvs-plugin/src/com/intellij/cvsSupport2/annotate/CvsAnnotationProvider.java @@ -74,7 +74,7 @@ public class CvsAnnotationProvider implements AnnotationProvider{ final List revisions = myCvsHistoryProvider.createRevisions(filePath); final Annotation[] lineAnnotations = operation.getLineAnnotations(); adjustAnnotation(revisions, lineAnnotations); - return new CvsFileAnnotation(operation.getContent(), lineAnnotations, revisions, virtualFile, revision); + return new CvsFileAnnotation(operation.getContent(), lineAnnotations, revisions, virtualFile, revision, myProject); } public FileAnnotation annotate(VirtualFile file, VcsFileRevision revision) throws VcsException { @@ -118,7 +118,7 @@ public class CvsAnnotationProvider implements AnnotationProvider{ } } } - return new CvsFileAnnotation(annotateOperation.getContent(), lineAnnotations, revisions, cvsVirtualFile, revision); + return new CvsFileAnnotation(annotateOperation.getContent(), lineAnnotations, revisions, cvsVirtualFile, revision, myProject); } private static boolean annotateBinary(VirtualFile cvsVirtualFile, CvsEnvironment environment) { diff --git a/plugins/cvs/cvs-plugin/src/com/intellij/cvsSupport2/annotate/CvsFileAnnotation.java b/plugins/cvs/cvs-plugin/src/com/intellij/cvsSupport2/annotate/CvsFileAnnotation.java index 895b9cc27213..f53fe7867e6e 100644 --- a/plugins/cvs/cvs-plugin/src/com/intellij/cvsSupport2/annotate/CvsFileAnnotation.java +++ b/plugins/cvs/cvs-plugin/src/com/intellij/cvsSupport2/annotate/CvsFileAnnotation.java @@ -21,6 +21,7 @@ import com.intellij.cvsSupport2.application.CvsEntriesManager; import com.intellij.cvsSupport2.cvsoperations.cvsAnnotate.Annotation; import com.intellij.cvsSupport2.cvsstatuses.CvsEntriesListener; import com.intellij.cvsSupport2.history.CvsRevisionNumber; +import com.intellij.openapi.project.Project; import com.intellij.openapi.vcs.VcsKey; import com.intellij.openapi.vcs.annotate.AnnotationSourceSwitcher; import com.intellij.openapi.vcs.annotate.FileAnnotation; @@ -77,7 +78,8 @@ public class CvsFileAnnotation extends FileAnnotation{ public CvsFileAnnotation(final String content, final Annotation[] annotations, - @Nullable final List revisions, VirtualFile file, String currentRevision) { + @Nullable final List revisions, VirtualFile file, String currentRevision, Project project) { + super(project); myContent = content; myAnnotations = annotations; myRevisions = revisions; @@ -200,4 +202,9 @@ public class CvsFileAnnotation extends FileAnnotation{ public VcsKey getVcsKey() { return CvsVcs2.getKey(); } + + @Override + public VirtualFile getFile() { + return myFile; + } } diff --git a/plugins/git4idea/src/git4idea/annotate/GitFileAnnotation.java b/plugins/git4idea/src/git4idea/annotate/GitFileAnnotation.java index 4d1ff47975d4..4dfe4da19de0 100644 --- a/plugins/git4idea/src/git4idea/annotate/GitFileAnnotation.java +++ b/plugins/git4idea/src/git4idea/annotate/GitFileAnnotation.java @@ -96,6 +96,7 @@ public class GitFileAnnotation extends FileAnnotation { * @param revision */ public GitFileAnnotation(@NotNull final Project project, @NotNull VirtualFile file, final boolean monitorFlag, final VcsRevisionNumber revision) { + super(project); myProject = project; myVcs = GitVcs.getInstance(myProject); myFile = file; diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/provider/annotate/HgAnnotation.java b/plugins/hg4idea/src/org/zmlx/hg4idea/provider/annotate/HgAnnotation.java index 1a9b1d246bd3..fafe7ff89e96 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/provider/annotate/HgAnnotation.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/provider/annotate/HgAnnotation.java @@ -24,6 +24,7 @@ import com.intellij.openapi.vcs.annotate.*; import com.intellij.openapi.vcs.changes.CurrentContentRevision; import com.intellij.openapi.vcs.history.VcsFileRevision; import com.intellij.openapi.vcs.history.VcsRevisionNumber; +import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -56,6 +57,7 @@ public class HgAnnotation extends FileAnnotation { public HgAnnotation(@NotNull Project project, @NotNull HgFile hgFile, @NotNull List lines, @NotNull List vcsFileRevisions, VcsRevisionNumber revision) { + super(project); myProject = project; myLines = lines; myFileRevisions = vcsFileRevisions; @@ -214,4 +216,9 @@ public class HgAnnotation extends FileAnnotation { public VcsKey getVcsKey() { return HgVcs.getKey(); } + + @Override + public VirtualFile getFile() { + return LocalFileSystem.getInstance().refreshAndFindFileByIoFile(myFile.getFile()); + } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/annotate/BaseSvnFileAnnotation.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/annotate/BaseSvnFileAnnotation.java index 1ae79efd1003..f16bfa41c963 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/annotate/BaseSvnFileAnnotation.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/annotate/BaseSvnFileAnnotation.java @@ -159,6 +159,7 @@ public abstract class BaseSvnFileAnnotation extends FileAnnotation { } public BaseSvnFileAnnotation(final SvnVcs vcs, final String contents, final VcsRevisionNumber baseRevision) { + super(vcs.getProject()); myVcs = vcs; myContents = contents; myBaseRevision = baseRevision; diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/annotate/SvnRemoteFileAnnotation.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/annotate/SvnRemoteFileAnnotation.java index d20260949e16..f00bc7b97aaa 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/annotate/SvnRemoteFileAnnotation.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/annotate/SvnRemoteFileAnnotation.java @@ -49,4 +49,9 @@ public class SvnRemoteFileAnnotation extends BaseSvnFileAnnotation { @Override public void dispose() { } + + @Override + public VirtualFile getFile() { + return myCurrentFile; + } }