move remaining painting code from EditorImpl to EditorPainter

This commit is contained in:
Dmitry Batrak
2016-12-06 14:54:43 +03:00
parent 26f0b5cd61
commit 792b87a57d
2 changed files with 40 additions and 46 deletions
@@ -82,7 +82,6 @@ import com.intellij.util.*;
import com.intellij.util.concurrency.EdtExecutorService;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.ContainerUtilRt;
import com.intellij.util.text.CharArrayUtil;
import com.intellij.util.ui.ButtonlessScrollBarUI;
import com.intellij.util.ui.JBSwingUtilities;
import com.intellij.util.ui.JBUI;
@@ -1651,9 +1650,6 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
return new JBColor(new Color(128, 255, 128), new Color(128, 255, 128));
}
private static final char IDEOGRAPHIC_SPACE = '\u3000'; // http://www.marathon-studios.com/unicode/U3000/Ideographic_Space
private static final String WHITESPACE_CHARS = " \t" + IDEOGRAPHIC_SPACE;
@NotNull
@Override
public IndentsModel getIndentsModel() {
@@ -4513,44 +4509,4 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
myView.drawChars(g, data, start, end, x, y, color, fontInfo);
}
}
private interface WhitespacePaintingStrategy {
boolean showWhitespaceAtOffset(int offset);
}
// Strategy, controlled by current editor settings. Usable only for the current line.
public class LineWhitespacePaintingStrategy implements WhitespacePaintingStrategy {
private final boolean myWhitespaceShown = mySettings.isWhitespacesShown();
private final boolean myLeadingWhitespaceShown = mySettings.isLeadingWhitespaceShown();
private final boolean myInnerWhitespaceShown = mySettings.isInnerWhitespaceShown();
private final boolean myTrailingWhitespaceShown = mySettings.isTrailingWhitespaceShown();
// Offsets on current line where leading whitespace ends and trailing whitespace starts correspondingly.
private int currentLeadingEdge;
private int currentTrailingEdge;
// Updates the state, to be used for the line, iterator is currently at.
public void update(CharSequence chars, LineIterator iterator) {
int lineStart = iterator.getStart();
int lineEnd = iterator.getEnd() - iterator.getSeparatorLength();
update(chars, lineStart, lineEnd);
}
public void update(CharSequence chars, int lineStart, int lineEnd) {
if (myWhitespaceShown
&& (myLeadingWhitespaceShown || myInnerWhitespaceShown || myTrailingWhitespaceShown)
&& !(myLeadingWhitespaceShown && myInnerWhitespaceShown && myTrailingWhitespaceShown)) {
currentTrailingEdge = CharArrayUtil.shiftBackward(chars, lineStart, lineEnd - 1, WHITESPACE_CHARS) + 1;
currentLeadingEdge = CharArrayUtil.shiftForward(chars, lineStart, currentTrailingEdge, WHITESPACE_CHARS);
}
}
@Override
public boolean showWhitespaceAtOffset(int offset) {
return myWhitespaceShown
&& (offset < currentLeadingEdge ? myLeadingWhitespaceShown :
offset >= currentTrailingEdge ? myTrailingWhitespaceShown :
myInnerWhitespaceShown);
}
}
}
@@ -34,6 +34,7 @@ import com.intellij.ui.ColorUtil;
import com.intellij.ui.paint.EffectPainter;
import com.intellij.ui.Gray;
import com.intellij.ui.JBColor;
import com.intellij.util.text.CharArrayUtil;
import com.intellij.util.ui.JBUI;
import com.intellij.util.ui.UIUtil;
import gnu.trove.TFloatArrayList;
@@ -56,6 +57,9 @@ class EditorPainter implements TextDrawingCallback {
private static final Stroke IME_COMPOSED_TEXT_UNDERLINE_STROKE = new BasicStroke(1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 0,
new float[]{0, 2, 0, 2}, 0);
private static final int CARET_DIRECTION_MARK_SIZE = 5;
private static final char IDEOGRAPHIC_SPACE = '\u3000'; // http://www.marathon-studios.com/unicode/U3000/Ideographic_Space
private static final String WHITESPACE_CHARS = " \t" + IDEOGRAPHIC_SPACE;
private final EditorView myView;
private final EditorImpl myEditor;
@@ -326,7 +330,7 @@ class EditorPainter implements TextDrawingCallback {
private void paintTextWithEffects(Graphics2D g, Rectangle clip, int startVisualLine, int endVisualLine,
IterationState.CaretData caretData) {
final CharSequence text = myDocument.getImmutableCharSequence();
final EditorImpl.LineWhitespacePaintingStrategy whitespacePaintingStrategy = myEditor.new LineWhitespacePaintingStrategy();
final LineWhitespacePaintingStrategy whitespacePaintingStrategy = new LineWhitespacePaintingStrategy(myEditor.getSettings());
boolean paintAllSoftWraps = myEditor.getSettings().isAllSoftWrapsShown();
int lineCount = myEditor.getVisibleLineCount();
final int whiteSpaceStrokeWidth = JBUI.scale(1);
@@ -462,7 +466,7 @@ class EditorPainter implements TextDrawingCallback {
}
private void paintWhitespace(Graphics2D g, CharSequence text, float x, int y, int start, int end,
EditorImpl.LineWhitespacePaintingStrategy whitespacePaintingStrategy,
LineWhitespacePaintingStrategy whitespacePaintingStrategy,
VisualLineFragmentsIterator.Fragment fragment, Stroke stroke, int strokeWidth) {
Stroke oldStroke = g.getStroke();
try {
@@ -1015,4 +1019,38 @@ class EditorPainter implements TextDrawingCallback {
float xStart, float xEnd, int y);
void paintAfterLineEnd(Graphics2D g, Rectangle clip, IterationState iterationState, int columnStart, float x, int y);
}
private static class LineWhitespacePaintingStrategy {
private final boolean myWhitespaceShown;
private final boolean myLeadingWhitespaceShown;
private final boolean myInnerWhitespaceShown;
private final boolean myTrailingWhitespaceShown;
// Offsets on current line where leading whitespace ends and trailing whitespace starts correspondingly.
private int currentLeadingEdge;
private int currentTrailingEdge;
public LineWhitespacePaintingStrategy(EditorSettings settings) {
myWhitespaceShown = settings.isWhitespacesShown();
myLeadingWhitespaceShown = settings.isLeadingWhitespaceShown();
myInnerWhitespaceShown = settings.isInnerWhitespaceShown();
myTrailingWhitespaceShown = settings.isTrailingWhitespaceShown();
}
private void update(CharSequence chars, int lineStart, int lineEnd) {
if (myWhitespaceShown
&& (myLeadingWhitespaceShown || myInnerWhitespaceShown || myTrailingWhitespaceShown)
&& !(myLeadingWhitespaceShown && myInnerWhitespaceShown && myTrailingWhitespaceShown)) {
currentTrailingEdge = CharArrayUtil.shiftBackward(chars, lineStart, lineEnd - 1, WHITESPACE_CHARS) + 1;
currentLeadingEdge = CharArrayUtil.shiftForward(chars, lineStart, currentTrailingEdge, WHITESPACE_CHARS);
}
}
private boolean showWhitespaceAtOffset(int offset) {
return myWhitespaceShown
&& (offset < currentLeadingEdge ? myLeadingWhitespaceShown :
offset >= currentTrailingEdge ? myTrailingWhitespaceShown :
myInnerWhitespaceShown);
}
}
}