blob: b8f01f32cc0c05e7c08741a4e21fada53da5d7a0 [file] [log] [blame]
package com.intellij.execution.console;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.JBColor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.awt.*;
public class BasicGutterContentProvider extends GutterContentProvider {
public static final String EVAL_OUT_MARKER = "\u200C";
public static final String EVAL_IN_MARKER = EVAL_OUT_MARKER + EVAL_OUT_MARKER;
protected final boolean isLineRelationshipComputable;
public BasicGutterContentProvider() {
this(true);
}
/**
* @param isLineRelationshipComputable true if you can compute line relationship for all lines (override {@link #doIsShowSeparatorLine})
*/
public BasicGutterContentProvider(boolean isLineRelationshipComputable) {
this.isLineRelationshipComputable = isLineRelationshipComputable;
}
@Override
public boolean hasText() {
return false;
}
@Nullable
@Override
public String getText(int line, @NotNull Editor editor) {
return null;
}
@Nullable
@Override
public String getToolTip(int line, @NotNull Editor editor) {
return null;
}
@Override
public void doAction(int line, @NotNull Editor editor) {
}
@Override
public void beforeEvaluate(@NotNull Editor editor) {
Document document = editor.getDocument();
document.insertString(document.getTextLength(), EVAL_IN_MARKER);
}
@Override
public boolean drawIcon(int line, @NotNull Graphics g, int y, @NotNull Editor editor) {
int markerCount = getMarkerCount(line, editor.getDocument());
if (markerCount == EVAL_OUT_MARKER.length() || markerCount == EVAL_IN_MARKER.length()) {
g.setColor(JBColor.GRAY);
g.drawString(markerCount == EVAL_IN_MARKER.length() ? ">" : "<", 3, y);
return true;
}
return false;
}
@Override
public final boolean isShowSeparatorLine(int line, @NotNull Editor editor) {
Document document = editor.getDocument();
if ((line + 1) >= document.getLineCount()) {
return true;
}
int markerCount = getMarkerCount(line, document);
if (markerCount == EVAL_IN_MARKER.length()) {
return getMarkerCount(line + 1, document) != EVAL_OUT_MARKER.length();
}
else if (!isLineRelationshipComputable && markerCount == EVAL_OUT_MARKER.length()) {
return getMarkerCount(line + 1, document) == EVAL_IN_MARKER.length();
}
else if (!isLineRelationshipComputable && markerCount == 0) {
return getMarkerCount(line + 1, document) != 0 || (line != 0 && getMarkerCount(line - 1, document) != 0);
}
else {
return doIsShowSeparatorLine(line, editor, document);
}
}
protected boolean doIsShowSeparatorLine(int line, @NotNull Editor editor, @NotNull Document document) {
return isLineRelationshipComputable;
}
private static int getMarkerCount(int line, @NotNull Document document) {
return StringUtil.countChars(document.getImmutableCharSequence(), EVAL_IN_MARKER.charAt(0), document.getLineStartOffset(line), true);
}
}