--- /dev/null
+/*
+ * 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> {
+}
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;
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;
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;
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;
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;
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;
}
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
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;
final FileAnnotation fileAnnotation,
final AbstractVcs vcs,
final boolean onCurrentRevision) {
- final UpToDateLineNumberProvider getUpToDateLineNumber = new UpToDateLineNumberProviderImpl(editor.getDocument(), project);
editor.getGutter().closeAllAnnotations();
fileAnnotation.setCloser(new Runnable() {
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 =
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()) {
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;
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();
}
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;
}
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));
@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);
}
*/
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;
/**
* @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;
@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);
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;
/**
* @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;
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