blob: b3dbdefea516d3c21ca0a31d002d38e5ecdbbd32 [file] [log] [blame]
package com.intellij.vcs.log.printmodel.impl;
import com.intellij.vcs.log.graph.elements.Edge;
import com.intellij.vcs.log.graph.elements.GraphElement;
import com.intellij.vcs.log.printmodel.layout.LayoutModel;
import com.intellij.vcs.log.printmodel.layout.LayoutRow;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static com.intellij.vcs.log.printmodel.impl.GraphElementsVisibilityController.VisibilityType.*;
/**
* @author erokhins
*/
class GraphElementsVisibilityController {
private static final int LONG_EDGE = 20;
private static final int EDGE_PART_SHOW = 3;
private final LayoutModel layoutModel;
private boolean hideLongEdge;
public GraphElementsVisibilityController(boolean hideLongEdge, LayoutModel layoutModel) {
this.hideLongEdge = hideLongEdge;
this.layoutModel = layoutModel;
}
public void setHideLongEdge(boolean hideLongEdge) {
this.hideLongEdge = hideLongEdge;
}
@NotNull
public VisibilityType visibilityTypeEdge(Edge edge, int rowIndex) {
if (!hideLongEdge) {
return USUAL;
}
int upRowIndex = edge.getUpNode().getRowIndex();
int downRowIndex = edge.getDownNode().getRowIndex();
if (downRowIndex - upRowIndex < LONG_EDGE) {
return USUAL;
}
final int upDelta = rowIndex - upRowIndex;
final int downDelta = downRowIndex - rowIndex;
if (upDelta < EDGE_PART_SHOW || downDelta < EDGE_PART_SHOW) {
return USUAL;
}
if (upDelta == EDGE_PART_SHOW) {
return LAST_VISIBLE;
}
if (downDelta == EDGE_PART_SHOW) {
return FIRST_VISIBLE;
}
return HIDE;
}
@NotNull
public List<GraphElement> visibleElements(int rowIndex) {
if (rowIndex < 0 || rowIndex >= layoutModel.getLayoutRows().size()) {
return Collections.emptyList();
}
LayoutRow cellRow = layoutModel.getLayoutRows().get(rowIndex);
List<GraphElement> cells = cellRow.getOrderedGraphElements();
if (!hideLongEdge) {
return cells;
}
List<GraphElement> visibleElements = new ArrayList<GraphElement>();
for (GraphElement cell : cells) {
if (cell.getNode() != null) {
visibleElements.add(cell);
}
else {
Edge edge = cell.getEdge();
if (edge == null) {
throw new IllegalStateException();
}
if (visibilityTypeEdge(edge, rowIndex) != HIDE) {
visibleElements.add(cell);
}
}
}
return Collections.unmodifiableList(visibleElements);
}
public static enum VisibilityType {
USUAL,
LAST_VISIBLE,
FIRST_VISIBLE,
HIDE
}
}