blob: 80ed236cb3306042d11607cfb0bba6cebc7cf96d [file] [log] [blame]
package com.intellij.vcs.log.ui.tables;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.vcs.log.Hash;
import com.intellij.vcs.log.VcsRef;
import com.intellij.vcs.log.VcsShortCommitDetails;
import com.intellij.vcs.log.data.DataPack;
import com.intellij.vcs.log.data.LoadMoreStage;
import com.intellij.vcs.log.data.VcsLogDataHolder;
import com.intellij.vcs.log.ui.render.GraphCommitCell;
import com.intellij.vcs.log.impl.VcsLogUtil;
import com.intellij.vcs.log.ui.VcsLogUiImpl;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class GraphTableModel extends AbstractVcsLogTableModel<GraphCommitCell> {
private static final Logger LOG = Logger.getInstance(GraphTableModel.class);
@NotNull private final DataPack myDataPack;
@NotNull private final VcsLogDataHolder myDataHolder;
public GraphTableModel(@NotNull DataPack dataPack, @NotNull VcsLogDataHolder dataHolder, @NotNull VcsLogUiImpl UI,
@NotNull LoadMoreStage loadMoreStage) {
super(dataHolder, UI, dataPack, loadMoreStage);
myDataPack = dataPack;
myDataHolder = dataHolder;
}
@Override
public int getRowCount() {
return myDataPack.getGraphFacade().getVisibleCommitCount();
}
@Override
public void requestToLoadMore(@NotNull Runnable onLoaded) {
if (!myDataHolder.isFullLogShowing()) {
myDataHolder.showFullLog(onLoaded);
}
else if (!myUi.getFilters().isEmpty()) {
super.requestToLoadMore(onLoaded);
}
}
@Override
public boolean canRequestMore() {
return !myDataHolder.isFullLogShowing() || super.canRequestMore();
}
@NotNull
@Override
public VirtualFile getRoot(int rowIndex) {
int head = myDataPack.getGraphFacade().getInfoProvider().getRowInfo(rowIndex).getOneOfHeads();
Collection<VcsRef> refs = myDataPack.getRefsModel().refsToCommit(head);
if (refs.isEmpty()) {
LOG.error("No references pointing to head " + head + " identified for commit at row " + rowIndex);
// take the first root: it is the right choice in one-repo case, though it will likely fail in multi-repo case
return myDataPack.getLogProviders().keySet().iterator().next();
}
return refs.iterator().next().getRoot();
}
@NotNull
@Override
protected GraphCommitCell getCommitColumnCell(int rowIndex, @Nullable VcsShortCommitDetails details) {
String message = "";
List<VcsRef> refs = Collections.emptyList();
if (details != null) {
message = details.getSubject();
refs = (List<VcsRef>)myDataPack.getRefsModel().refsToCommit(details.getId());
}
return new GraphCommitCell(message, refs);
}
@NotNull
@Override
protected Class<GraphCommitCell> getCommitColumnClass() {
return GraphCommitCell.class;
}
@Nullable
@Override
public Hash getHashAtRow(int row) {
return myDataHolder.getHash(myDataPack.getGraphFacade().getCommitAtRow(row));
}
@Override
public int getRowOfCommit(@NotNull final Hash hash) {
final int commitIndex = myDataHolder.getCommitIndex(hash);
return ContainerUtil.indexOf(VcsLogUtil.getVisibleCommits(myDataPack.getGraphFacade()), new Condition<Integer>() {
@Override
public boolean value(Integer integer) {
return integer == commitIndex;
}
});
}
@Override
public int getRowOfCommitByPartOfHash(@NotNull String partialHash) {
Hash hash = myDataHolder.findHashByString(partialHash);
return hash != null ? getRowOfCommit(hash) : -1;
}
}