blob: a3c79cf7ca321dda716e9c8993e5d8ad4e68e3a0 [file] [log] [blame]
/*
* Copyright 2008-2010 Victor Iacoban
* Copyright 2000-2012 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 org.zmlx.hg4idea.provider.annotate;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vcs.VcsException;
import com.intellij.openapi.vcs.VcsKey;
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;
import org.zmlx.hg4idea.HgFile;
import org.zmlx.hg4idea.HgFileRevision;
import org.zmlx.hg4idea.HgVcs;
import org.zmlx.hg4idea.HgVcsMessages;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
public class HgAnnotation extends FileAnnotation {
private static final Logger LOG = Logger.getInstance(HgAnnotation.class.getName());
public enum FIELD {
USER, REVISION, DATE, LINE, CONTENT
}
private final HgLineAnnotationAspect dateAnnotationAspect = new HgLineAnnotationAspect(FIELD.DATE);
private final HgLineAnnotationAspect userAnnotationAspect = new HgLineAnnotationAspect(FIELD.USER);
private final HgLineAnnotationAspect revisionAnnotationAspect = new HgLineAnnotationAspect(FIELD.REVISION);
@NotNull private final Project myProject;
@NotNull private final List<HgAnnotationLine> myLines;
@NotNull private final List<HgFileRevision> myFileRevisions;
@NotNull private final HgFile myFile;
private final VcsRevisionNumber myCurrentRevision;
public HgAnnotation(@NotNull Project project, @NotNull HgFile hgFile, @NotNull List<HgAnnotationLine> lines,
@NotNull List<HgFileRevision> vcsFileRevisions, VcsRevisionNumber revision) {
super(project);
myProject = project;
myLines = lines;
myFileRevisions = vcsFileRevisions;
myFile = hgFile;
myCurrentRevision = revision;
}
@Override
@Nullable
public AnnotationSourceSwitcher getAnnotationSourceSwitcher() {
return null;
}
@Override
public int getLineCount() {
return myLines.size();
}
@Override
@Nullable
public VcsRevisionNumber originalRevision(int lineNumber) {
return getLineRevisionNumber(lineNumber);
}
@Override
public void dispose() {
}
@Override
public LineAnnotationAspect[] getAspects() {
return new LineAnnotationAspect[] {
revisionAnnotationAspect,
dateAnnotationAspect,
userAnnotationAspect
};
}
@Override
@Nullable
public String getToolTip(int lineNumber) {
if ( myLines.size() <= lineNumber || lineNumber < 0 ) {
return null;
}
HgAnnotationLine info = myLines.get(lineNumber);
if (info == null) {
return null;
}
for (HgFileRevision revision : myFileRevisions) {
if (revision.getRevisionNumber().equals(info.getVcsRevisionNumber())) {
return HgVcsMessages.message("hg4idea.annotation.tool.tip", revision.getRevisionNumber().asString(),
revision.getAuthor(), revision.getRevisionDate(), revision.getCommitMessage());
}
}
return null;
}
@Override
public String getAnnotatedContent() {
try {
return CurrentContentRevision.create(myFile.toFilePath()).getContent();
}
catch (VcsException e) {
LOG.info(e);
return "";
}
}
@Override
@Nullable
public VcsRevisionNumber getLineRevisionNumber(int lineNumber) {
if (lineNumber >= myLines.size() || lineNumber < 0) {
return null;
}
HgAnnotationLine annotationLine = myLines.get(lineNumber);
return annotationLine.getVcsRevisionNumber();
}
@Override
@Nullable
public Date getLineDate(int lineNumber) {
if (lineNumber >= myLines.size() || lineNumber < 0) {
return null;
}
//lines.get(lineNumber).get(HgAnnotation.FIELD.DATE)
// todo : parse date
return null;
}
@Override
@Nullable
public List<VcsFileRevision> getRevisions() {
List<VcsFileRevision> result = new LinkedList<VcsFileRevision>();
result.addAll(myFileRevisions);
return result;
}
@Override
public boolean revisionsNotEmpty() {
return true;
}
@Nullable
private static String id(FIELD field) {
switch (field) {
case USER: return LineAnnotationAspect.AUTHOR;
case REVISION: return LineAnnotationAspect.REVISION;
case DATE: return LineAnnotationAspect.DATE;
default: return null;
}
}
private static boolean isShowByDefault(FIELD aspectType) {
return aspectType == FIELD.DATE || aspectType == FIELD.USER;
}
private class HgLineAnnotationAspect extends LineAnnotationAspectAdapter {
private final FIELD myAspectType;
HgLineAnnotationAspect(FIELD aspectType) {
super(id(aspectType), HgAnnotation.isShowByDefault(aspectType));
this.myAspectType = aspectType;
}
@Override
public String getValue(int lineNumber) {
if (lineNumber >= myLines.size() || lineNumber < 0) {
return "";
}
HgAnnotationLine annotationLine = myLines.get(lineNumber);
return myAspectType == FIELD.REVISION
? annotationLine.getVcsRevisionNumber().asString()
: annotationLine.get(myAspectType).toString();
}
@Override
protected void showAffectedPaths(int lineNum) {
if (lineNum >= 0 && lineNum < myLines.size()) {
HgAnnotationLine line = myLines.get(lineNum);
VirtualFile file = myFile.toFilePath().getVirtualFile();
if (line != null && file != null) {
ShowAllAffectedGenericAction.showSubmittedFiles(myProject, line.getVcsRevisionNumber(), file, HgVcs.getKey());
}
}
}
}
@Nullable
@Override
public VcsRevisionNumber getCurrentRevision() {
return myCurrentRevision;
}
@Override
public VcsKey getVcsKey() {
return HgVcs.getKey();
}
@Override
public VirtualFile getFile() {
return LocalFileSystem.getInstance().refreshAndFindFileByIoFile(myFile.getFile());
}
}