vcs annotate: pass corrected line numbers to actions
authorAleksey Pivovarov <AMPivovarov@gmail.com>
Sat, 20 Jun 2015 12:15:38 +0000 (15:15 +0300)
committerAleksey Pivovarov <AMPivovarov@gmail.com>
Thu, 3 Sep 2015 16:28:02 +0000 (19:28 +0300)
platform/vcs-api/src/com/intellij/openapi/vcs/annotate/UpToDateLineNumberListener.java [new file with mode: 0644]
platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotateCurrentRevisionAction.java
platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotatePreviousRevisionAction.java
platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotateRevisionAction.java
platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotateToggleAction.java
platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AnnotationPresentation.java
platform/vcs-impl/src/com/intellij/openapi/vcs/actions/CopyRevisionNumberFromAnnotateAction.java
platform/vcs-impl/src/com/intellij/openapi/vcs/actions/ShowDiffFromAnnotation.java
plugins/github/src/org/jetbrains/plugins/github/GithubShowCommitInBrowserFromAnnotateAction.java

diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/annotate/UpToDateLineNumberListener.java b/platform/vcs-api/src/com/intellij/openapi/vcs/annotate/UpToDateLineNumberListener.java
new file mode 100644 (file)
index 0000000..6124250
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2000-2015 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.openapi.vcs.annotate;
+
+import com.intellij.util.Consumer;
+
+public interface UpToDateLineNumberListener extends Consumer<Integer> {
+}
index 70948840a98b773c6aaef0248f84fd9813305a84..0d8eda07fcb11982a2cb8ce1f2f8d84a69608828 100644 (file)
@@ -1,7 +1,6 @@
 package com.intellij.openapi.vcs.actions;
 
 import com.intellij.icons.AllIcons;
-import com.intellij.openapi.localVcs.UpToDateLineNumberProvider;
 import com.intellij.openapi.vcs.AbstractVcs;
 import com.intellij.openapi.vcs.annotate.FileAnnotation;
 import com.intellij.openapi.vcs.history.VcsFileRevision;
@@ -17,10 +16,9 @@ import java.util.Map;
 class AnnotateCurrentRevisionAction extends AnnotateRevisionAction {
   @Nullable private final List<VcsFileRevision> myRevisions;
 
-  public AnnotateCurrentRevisionAction(@NotNull UpToDateLineNumberProvider getUpToDateLineNumber,
-                                       @NotNull FileAnnotation annotation, @NotNull AbstractVcs vcs) {
+  public AnnotateCurrentRevisionAction(@NotNull FileAnnotation annotation, @NotNull AbstractVcs vcs) {
     super("Annotate Revision", "Annotate selected revision in new tab", AllIcons.Actions.Annotate,
-          getUpToDateLineNumber, annotation, vcs);
+          annotation, vcs);
     List<VcsFileRevision> revisions = annotation.getRevisions();
     if (revisions == null) {
       myRevisions = null;
index 30b48de9f7c7d62c5af3dc613e614138ab94a9ea..476f63865f6aebe44fedbd6a1ac35132aaeaf5ca 100644 (file)
@@ -1,7 +1,6 @@
 package com.intellij.openapi.vcs.actions;
 
 import com.intellij.icons.AllIcons;
-import com.intellij.openapi.localVcs.UpToDateLineNumberProvider;
 import com.intellij.openapi.vcs.AbstractVcs;
 import com.intellij.openapi.vcs.annotate.FileAnnotation;
 import com.intellij.openapi.vcs.history.VcsFileRevision;
@@ -17,10 +16,9 @@ import java.util.Map;
 class AnnotatePreviousRevisionAction extends AnnotateRevisionAction {
   @Nullable private final List<VcsFileRevision> myRevisions;
 
-  public AnnotatePreviousRevisionAction(@NotNull UpToDateLineNumberProvider getUpToDateLineNumber,
-                                        @NotNull FileAnnotation annotation, @NotNull AbstractVcs vcs) {
+  public AnnotatePreviousRevisionAction(@NotNull FileAnnotation annotation, @NotNull AbstractVcs vcs) {
     super("Annotate Previous Revision", "Annotate successor of selected revision in new tab", AllIcons.Actions.Annotate,
-          getUpToDateLineNumber, annotation, vcs);
+          annotation, vcs);
     List<VcsFileRevision> revisions = annotation.getRevisions();
     if (revisions == null) {
       myRevisions = null;
index df4633b0b1f81c0ebbaaa8c7b96193aafd16a5d8..011d9c60e148b199cad78c930bb4506b5e134abf 100644 (file)
@@ -2,12 +2,11 @@ package com.intellij.openapi.vcs.actions;
 
 import com.intellij.openapi.actionSystem.AnActionEvent;
 import com.intellij.openapi.fileTypes.FileType;
-import com.intellij.openapi.localVcs.UpToDateLineNumberProvider;
 import com.intellij.openapi.project.DumbAware;
 import com.intellij.openapi.vcs.AbstractVcs;
 import com.intellij.openapi.vcs.FilePath;
 import com.intellij.openapi.vcs.annotate.FileAnnotation;
-import com.intellij.openapi.vcs.annotate.LineNumberListener;
+import com.intellij.openapi.vcs.annotate.UpToDateLineNumberListener;
 import com.intellij.openapi.vcs.history.VcsFileRevision;
 import com.intellij.openapi.vcs.history.VcsFileRevisionEx;
 import com.intellij.openapi.vcs.vfs.VcsFileSystem;
@@ -20,19 +19,15 @@ import org.jetbrains.annotations.Nullable;
 import javax.swing.*;
 import java.util.List;
 
-abstract class AnnotateRevisionAction extends AnnotateRevisionActionBase implements DumbAware, LineNumberListener {
-  private final UpToDateLineNumberProvider myGetUpToDateLineNumber;
-
+abstract class AnnotateRevisionAction extends AnnotateRevisionActionBase implements DumbAware, UpToDateLineNumberListener {
   @NotNull private final FileAnnotation myAnnotation;
   @NotNull private final AbstractVcs myVcs;
 
   private int currentLine;
 
   public AnnotateRevisionAction(@Nullable String text, @Nullable String description, @Nullable Icon icon,
-                                @NotNull UpToDateLineNumberProvider getUpToDateLineNumber,
                                 @NotNull FileAnnotation annotation, @NotNull AbstractVcs vcs) {
     super(text, description, icon);
-    myGetUpToDateLineNumber = getUpToDateLineNumber;
     myAnnotation = annotation;
     myVcs = vcs;
   }
@@ -81,11 +76,8 @@ abstract class AnnotateRevisionAction extends AnnotateRevisionActionBase impleme
     List<VcsFileRevision> revisions = getRevisions();
     assert getRevisions() != null;
 
-    if (currentLine < 0) return null;
-    int corrected = myGetUpToDateLineNumber.getLineNumber(currentLine);
-
-    if (corrected < 0 || corrected >= revisions.size()) return null;
-    return revisions.get(corrected);
+    if (currentLine < 0 || currentLine >= revisions.size()) return null;
+    return revisions.get(currentLine);
   }
 
   @Override
index 969b2601906699b887cea9626dbb447f3357359c..c2d158d2edb6684f5657c2437e36778cb43fce2d 100644 (file)
@@ -33,13 +33,11 @@ import com.intellij.openapi.progress.Task;
 import com.intellij.openapi.project.DumbAware;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.Couple;
-import com.intellij.openapi.util.Key;
 import com.intellij.openapi.util.Ref;
 import com.intellij.openapi.util.registry.Registry;
 import com.intellij.openapi.vcs.*;
 import com.intellij.openapi.vcs.annotate.*;
 import com.intellij.openapi.vcs.changes.BackgroundFromStartOption;
-import com.intellij.openapi.vcs.changes.VcsAnnotationLocalChangesListener;
 import com.intellij.openapi.vcs.history.VcsFileRevision;
 import com.intellij.openapi.vcs.history.VcsRevisionNumber;
 import com.intellij.openapi.vcs.impl.BackgroundableActionEnabledHandler;
@@ -223,7 +221,6 @@ public class AnnotateToggleAction extends ToggleAction implements DumbAware, Ann
                                 final FileAnnotation fileAnnotation,
                                 final AbstractVcs vcs,
                                 final boolean onCurrentRevision) {
-    final UpToDateLineNumberProvider getUpToDateLineNumber = new UpToDateLineNumberProviderImpl(editor.getDocument(), project);
     editor.getGutter().closeAllAnnotations();
 
     fileAnnotation.setCloser(new Runnable() {
@@ -246,12 +243,13 @@ public class AnnotateToggleAction extends ToggleAction implements DumbAware, Ann
     final EditorGutterComponentEx editorGutter = (EditorGutterComponentEx)editor.getGutter();
     final List<AnnotationFieldGutter> gutters = new ArrayList<AnnotationFieldGutter>();
     final AnnotationSourceSwitcher switcher = fileAnnotation.getAnnotationSourceSwitcher();
+    final UpToDateLineNumberProvider getUpToDateLineNumber = new UpToDateLineNumberProviderImpl(editor.getDocument(), project);
 
-    final AnnotationPresentation presentation = new AnnotationPresentation(fileAnnotation, switcher);
+    final AnnotationPresentation presentation = new AnnotationPresentation(fileAnnotation, getUpToDateLineNumber, switcher);
     if (vcs.getCommittedChangesProvider() != null) {
-      presentation.addAction(new ShowDiffFromAnnotation(getUpToDateLineNumber, fileAnnotation, vcs, file));
+      presentation.addAction(new ShowDiffFromAnnotation(fileAnnotation, vcs, file));
     }
-    presentation.addAction(new CopyRevisionNumberFromAnnotateAction(getUpToDateLineNumber, fileAnnotation));
+    presentation.addAction(new CopyRevisionNumberFromAnnotateAction(fileAnnotation));
     presentation.addAction(Separator.getInstance());
 
     final Couple<Map<VcsRevisionNumber, Color>> bgColorMap =
@@ -291,16 +289,10 @@ public class AnnotateToggleAction extends ToggleAction implements DumbAware, Ann
     presentation.addAction(actionGroup, 1);
     gutters.add(new ExtraFieldGutter(fileAnnotation, editor, presentation, bgColorMap, actionGroup));
 
-    presentation.addAction(new AnnotateCurrentRevisionAction(getUpToDateLineNumber, fileAnnotation, vcs));
-    presentation.addAction(new AnnotatePreviousRevisionAction(getUpToDateLineNumber, fileAnnotation, vcs));
+    presentation.addAction(new AnnotateCurrentRevisionAction(fileAnnotation, vcs));
+    presentation.addAction(new AnnotatePreviousRevisionAction(fileAnnotation, vcs));
     addActionsFromExtensions(presentation, fileAnnotation);
 
-    for (AnAction action : presentation.getActions()) {
-      if (action instanceof LineNumberListener) {
-        presentation.addLineNumberListener((LineNumberListener)action);
-      }
-    }
-
     for (AnnotationFieldGutter gutter : gutters) {
       final AnnotationGutterLineConvertorProxy proxy = new AnnotationGutterLineConvertorProxy(getUpToDateLineNumber, gutter);
       if (gutter.isGutterAction()) {
index 66db4fc76f5e48d0c4aaec31f07ede59d57115b0..1154768d663bb6bd35d2c503f61a4f3fe10fd088 100644 (file)
@@ -18,10 +18,11 @@ package com.intellij.openapi.vcs.actions;
 import com.intellij.openapi.actionSystem.AnAction;
 import com.intellij.openapi.editor.colors.ColorKey;
 import com.intellij.openapi.editor.colors.EditorFontType;
+import com.intellij.openapi.localVcs.UpToDateLineNumberProvider;
 import com.intellij.openapi.vcs.annotate.*;
 import com.intellij.openapi.vcs.history.VcsRevisionNumber;
 import com.intellij.util.Consumer;
-import com.intellij.util.containers.ContainerUtil;
+import com.intellij.util.ObjectUtils;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -29,22 +30,20 @@ import java.util.ArrayList;
 import java.util.List;
 
 class AnnotationPresentation implements TextAnnotationPresentation {
-  private final FileAnnotation myFileAnnotation;
-  @Nullable
-  private final AnnotationSourceSwitcher mySwitcher;
+  @NotNull private final FileAnnotation myFileAnnotation;
+  @NotNull private final UpToDateLineNumberProvider myUpToDateLineNumberProvider;
+  @Nullable private final AnnotationSourceSwitcher mySwitcher;
   private final ArrayList<AnAction> myActions = new ArrayList<AnAction>();
   private SwitchAnnotationSourceAction mySwitchAction;
-  private final List<LineNumberListener> myPopupLineNumberListeners = ContainerUtil.createLockFreeCopyOnWriteList();
 
-  AnnotationPresentation(@NotNull FileAnnotation fileAnnotation, @Nullable final AnnotationSourceSwitcher switcher) {
+  AnnotationPresentation(@NotNull FileAnnotation fileAnnotation,
+                         @NotNull UpToDateLineNumberProvider upToDateLineNumberProvider,
+                         @Nullable final AnnotationSourceSwitcher switcher) {
+    myUpToDateLineNumberProvider = upToDateLineNumberProvider;
     myFileAnnotation = fileAnnotation;
     mySwitcher = switcher;
   }
 
-  public void addLineNumberListener(final LineNumberListener listener) {
-    myPopupLineNumberListeners.add(listener);
-  }
-
   public EditorFontType getFontType(final int line) {
     VcsRevisionNumber revision = myFileAnnotation.originalRevision(line);
     VcsRevisionNumber currentRevision = myFileAnnotation.getCurrentRevision();
@@ -57,9 +56,15 @@ class AnnotationPresentation implements TextAnnotationPresentation {
   }
 
   public List<AnAction> getActions(int line) {
-    for (LineNumberListener listener : myPopupLineNumberListeners) {
-      listener.consume(line);
+    int correctedNumber = myUpToDateLineNumberProvider.getLineNumber(line);
+    for (AnAction action : myActions) {
+      UpToDateLineNumberListener upToDateListener = ObjectUtils.tryCast(action, UpToDateLineNumberListener.class);
+      if (upToDateListener != null) upToDateListener.consume(correctedNumber);
+
+      LineNumberListener listener = ObjectUtils.tryCast(action, LineNumberListener.class);
+      if (listener != null) listener.consume(line);
     }
+
     return myActions;
   }
 
index ff2b22fad9633cfb35f1d7dcb2203c912fa3491d..1849e4dbf4e933e7c3d72b2480e6ce51d7e61b65 100644 (file)
@@ -18,31 +18,27 @@ package com.intellij.openapi.vcs.actions;
 import com.intellij.openapi.actionSystem.AnAction;
 import com.intellij.openapi.actionSystem.AnActionEvent;
 import com.intellij.openapi.ide.CopyPasteManager;
-import com.intellij.openapi.localVcs.UpToDateLineNumberProvider;
 import com.intellij.openapi.vcs.annotate.FileAnnotation;
-import com.intellij.openapi.vcs.annotate.LineNumberListener;
-import com.intellij.util.ui.TextTransferable;
+import com.intellij.openapi.vcs.annotate.UpToDateLineNumberListener;
 import com.intellij.openapi.vcs.history.VcsRevisionNumber;
+import com.intellij.util.ui.TextTransferable;
 
 /**
  * @author Konstantin Bulenkov
  */
-public class CopyRevisionNumberFromAnnotateAction extends AnAction implements LineNumberListener {
-  private final UpToDateLineNumberProvider myGetUpToDateLineNumber;
+public class CopyRevisionNumberFromAnnotateAction extends AnAction implements UpToDateLineNumberListener {
   private final FileAnnotation myAnnotation;
   private int myLineNumber = -1;
 
-  public CopyRevisionNumberFromAnnotateAction(UpToDateLineNumberProvider getUpToDateLineNumber, FileAnnotation annotation) {
+  public CopyRevisionNumberFromAnnotateAction(FileAnnotation annotation) {
     super("Copy revision number");
-    myGetUpToDateLineNumber = getUpToDateLineNumber;
     myAnnotation = annotation;
   }
 
   @Override
   public void actionPerformed(AnActionEvent e) {
     if (myLineNumber < 0) return;
-    final int corrected = myGetUpToDateLineNumber.getLineNumber(myLineNumber);
-    final VcsRevisionNumber revisionNumber = myAnnotation.getLineRevisionNumber(corrected);
+    final VcsRevisionNumber revisionNumber = myAnnotation.getLineRevisionNumber(myLineNumber);
     if (revisionNumber != null) {
       final String revision = revisionNumber.asString();
       CopyPasteManager.getInstance().setContents(new TextTransferable(revision));
@@ -51,9 +47,7 @@ public class CopyRevisionNumberFromAnnotateAction extends AnAction implements Li
 
   @Override
   public void update(AnActionEvent e) {
-    int corrected = myLineNumber;
-    final boolean enabled = myLineNumber >= 0 && (corrected = myGetUpToDateLineNumber.getLineNumber(myLineNumber)) >= 0 &&
-                            myAnnotation.getLineRevisionNumber(corrected) != null;
+    final boolean enabled = myLineNumber >= 0 && myAnnotation.getLineRevisionNumber(myLineNumber) != null;
     e.getPresentation().setEnabled(enabled);
     e.getPresentation().setVisible(enabled);
   }
index 5a900f52307983c2e978573ff3e2a52b05fe4133..dc67ed590abe234d969ab85841e343de147c41b3 100644 (file)
  */
 package com.intellij.openapi.vcs.actions;
 
+import com.intellij.diff.DiffDialogHints;
+import com.intellij.diff.util.DiffUserDataKeysEx;
 import com.intellij.icons.AllIcons;
 import com.intellij.idea.ActionsBundle;
 import com.intellij.openapi.actionSystem.AnAction;
 import com.intellij.openapi.actionSystem.AnActionEvent;
 import com.intellij.openapi.diff.DiffNavigationContext;
-import com.intellij.openapi.localVcs.UpToDateLineNumberProvider;
 import com.intellij.openapi.progress.ProgressIndicator;
 import com.intellij.openapi.progress.ProgressManager;
 import com.intellij.openapi.progress.Task;
 import com.intellij.openapi.ui.MessageType;
 import com.intellij.openapi.util.Pair;
-import com.intellij.diff.DiffDialogHints;
-import com.intellij.diff.util.DiffUserDataKeysEx;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.openapi.vcs.*;
 import com.intellij.openapi.vcs.annotate.FileAnnotation;
-import com.intellij.openapi.vcs.annotate.LineNumberListener;
+import com.intellij.openapi.vcs.annotate.UpToDateLineNumberListener;
 import com.intellij.openapi.vcs.changes.BackgroundFromStartOption;
 import com.intellij.openapi.vcs.changes.Change;
 import com.intellij.openapi.vcs.changes.ChangeListManager;
@@ -54,20 +53,17 @@ import java.util.List;
 /**
  * @author Konstantin Bulenkov
  */
-class ShowDiffFromAnnotation extends AnAction implements LineNumberListener {
-  private final UpToDateLineNumberProvider myLineNumberProvider;
+class ShowDiffFromAnnotation extends AnAction implements UpToDateLineNumberListener {
   private final FileAnnotation myFileAnnotation;
   private final AbstractVcs myVcs;
   private final VirtualFile myFile;
   private int currentLine;
   private boolean myEnabled;
 
-  ShowDiffFromAnnotation(final UpToDateLineNumberProvider lineNumberProvider,
-                         final FileAnnotation fileAnnotation, final AbstractVcs vcs, final VirtualFile file) {
+  ShowDiffFromAnnotation(final FileAnnotation fileAnnotation, final AbstractVcs vcs, final VirtualFile file) {
     super(ActionsBundle.message("action.Diff.UpdatedFiles.text"),
           ActionsBundle.message("action.Diff.UpdatedFiles.description"),
           AllIcons.Actions.Diff);
-    myLineNumberProvider = lineNumberProvider;
     myFileAnnotation = fileAnnotation;
     myVcs = vcs;
     myFile = file;
@@ -82,19 +78,14 @@ class ShowDiffFromAnnotation extends AnAction implements LineNumberListener {
 
   @Override
   public void update(AnActionEvent e) {
-    final int number = getActualLineNumber();
+    final int number = currentLine;
     e.getPresentation().setVisible(myEnabled);
     e.getPresentation().setEnabled(myEnabled && number >= 0 && number < myFileAnnotation.getLineCount());
   }
 
-  private int getActualLineNumber() {
-    if (currentLine < 0) return -1;
-    return myLineNumberProvider.getLineNumber(currentLine);
-  }
-
   @Override
   public void actionPerformed(AnActionEvent e) {
-    final int actualNumber = getActualLineNumber();
+    final int actualNumber = currentLine;
     if (actualNumber < 0) return;
 
     final VcsRevisionNumber revisionNumber = myFileAnnotation.getLineRevisionNumber(actualNumber);
index f49e52b281b669cce3f311039a2477d821244b1c..ed8de64b39b7d344836241770ee7fc786866b7e8 100644 (file)
@@ -19,12 +19,10 @@ import com.intellij.openapi.actionSystem.AnActionEvent;
 import com.intellij.openapi.actionSystem.CommonDataKeys;
 import com.intellij.openapi.editor.Document;
 import com.intellij.openapi.fileEditor.FileDocumentManager;
-import com.intellij.openapi.localVcs.UpToDateLineNumberProvider;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.vcs.annotate.FileAnnotation;
-import com.intellij.openapi.vcs.annotate.LineNumberListener;
+import com.intellij.openapi.vcs.annotate.UpToDateLineNumberListener;
 import com.intellij.openapi.vcs.history.VcsRevisionNumber;
-import com.intellij.openapi.vcs.impl.UpToDateLineNumberProviderImpl;
 import com.intellij.openapi.vfs.VirtualFile;
 import git4idea.GitUtil;
 import git4idea.repo.GitRepository;
@@ -35,7 +33,7 @@ import org.jetbrains.plugins.github.util.GithubUtil;
 /**
  * @author Kirill Likhodedov
  */
-public class GithubShowCommitInBrowserFromAnnotateAction extends GithubShowCommitInBrowserAction implements LineNumberListener {
+public class GithubShowCommitInBrowserFromAnnotateAction extends GithubShowCommitInBrowserAction implements UpToDateLineNumberListener {
 
   private final FileAnnotation myAnnotation;
   private int myLineNumber = -1;
@@ -82,15 +80,13 @@ public class GithubShowCommitInBrowserFromAnnotateAction extends GithubShowCommi
     if (document == null) {
       return null;
     }
-    final UpToDateLineNumberProvider myGetUpToDateLineNumber = new UpToDateLineNumberProviderImpl(document, project);
-    int corrected = myGetUpToDateLineNumber.getLineNumber(lineNumber);
 
     GitRepository repository = GitUtil.getRepositoryManager(project).getRepositoryForFile(virtualFile);
     if (repository == null) {
       return null;
     }
 
-    return new EventData(project, repository, corrected);
+    return new EventData(project, repository, lineNumber);
   }
 
   @Override