This commit is contained in:
Alexey Kudravtsev
2016-06-20 14:21:39 +03:00
parent 238b05de58
commit 4996aefb60
@@ -40,6 +40,7 @@ import com.intellij.openapi.editor.actionSystem.DocCommandGroupId;
import com.intellij.openapi.editor.colors.EditorFontType;
import com.intellij.openapi.editor.ex.*;
import com.intellij.openapi.editor.ex.util.EditorUIUtil;
import com.intellij.openapi.editor.ex.util.EditorUtil;
import com.intellij.openapi.editor.markup.ErrorStripeRenderer;
import com.intellij.openapi.editor.markup.RangeHighlighter;
import com.intellij.openapi.fileEditor.impl.EditorWindowHolder;
@@ -79,8 +80,6 @@ import java.util.List;
import java.util.Queue;
import java.util.concurrent.atomic.AtomicReference;
import static com.intellij.openapi.editor.ex.util.EditorUtil.isRealFileEditor;
public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMarkupModel {
private static final TooltipGroup ERROR_STRIPE_TOOLTIP_GROUP = new TooltipGroup("ERROR_STRIPE_TOOLTIP_GROUP", 0);
@@ -121,11 +120,11 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark
private int myMinMarkHeight;// height for horizontal, width for vertical stripes
private static final int myPreviewLines = Math.max(2, Math.min(25, Integer.getInteger("preview.lines", 5)));// Actually preview has myPreviewLines * 2 + 1 lines (above + below + current one)
private static final int myCachePreviewLines = 100;// Actually cache image has myCachePreviewLines * 2 + 1 lines (above + below + current one)
@Nullable private LightweightHint myEditorPreviewHint = null;
@Nullable private LightweightHint myEditorPreviewHint;
@NotNull private final EditorFragmentRenderer myEditorFragmentRenderer;
private int myRowAdjuster = 0;
private int myWheelAccumulator = 0;
private int myLastVisualLine = 0;
private int myRowAdjuster;
private int myWheelAccumulator;
private int myLastVisualLine;
EditorMarkupModelImpl(@NotNull EditorImpl editor) {
super(editor.getDocument());
@@ -194,9 +193,8 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark
int visualY = myEditor.getLineHeight() * visualLine;
boolean isVisible = area.contains(area.x, visualY) && myWheelAccumulator == 0;
TooltipRenderer bigRenderer;
if (UIUtil.uiParents(myEditor.getComponent(), false).filter(EditorWindowHolder.class).isEmpty() || isVisible || !UISettings.getInstance().SHOW_EDITOR_TOOLTIP) {
final Set<RangeHighlighter> highlighters = new THashSet<RangeHighlighter>();
final Set<RangeHighlighter> highlighters = new THashSet<>();
getNearestHighlighters(this, me.getY(), highlighters);
getNearestHighlighters(((EditorEx)getEditor()).getFilteredDocumentMarkupModel(), me.getY(), highlighters);
if (highlighters.isEmpty()) return false;
@@ -211,7 +209,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark
}
me = new MouseEvent(e.getComponent(), e.getID(), e.getWhen(), e.getModifiers(), me.getX(), y + 1, e.getClickCount(),
e.isPopupTrigger());
bigRenderer = myTooltipRendererProvider.calcTooltipRenderer(highlighters);
TooltipRenderer bigRenderer = myTooltipRendererProvider.calcTooltipRenderer(highlighters);
if (bigRenderer != null) {
showTooltip(me, bigRenderer, createHint(me));
return true;
@@ -221,7 +219,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark
float rowRatio = (float)visualLine /(myEditor.getVisibleLineCount() - 1);
int y = myRowAdjuster != 0 ? (int)(rowRatio * myEditor.getVerticalScrollBar().getHeight()) : me.getY();
me = new MouseEvent(me.getComponent(), me.getID(), me.getWhen(), me.getModifiers(), me.getX(), y, me.getClickCount(), me.isPopupTrigger());
final List<RangeHighlighterEx> highlighters = new ArrayList<RangeHighlighterEx>();
final List<RangeHighlighterEx> highlighters = new ArrayList<>();
collectRangeHighlighters(this, visualLine, highlighters);
collectRangeHighlighters(myEditor.getFilteredDocumentMarkupModel(), visualLine, highlighters);
myEditorFragmentRenderer.update(visualLine, highlighters, me.isAltDown());
@@ -267,7 +265,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark
@Nullable
private RangeHighlighter getNearestRangeHighlighter(@NotNull final MouseEvent e) {
List<RangeHighlighter> highlighters = new ArrayList<RangeHighlighter>();
List<RangeHighlighter> highlighters = new ArrayList<>();
getNearestHighlighters(this, e.getY(), highlighters);
getNearestHighlighters(myEditor.getFilteredDocumentMarkupModel(), e.getY(), highlighters);
RangeHighlighter nearestMarker = null;
@@ -459,7 +457,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark
}
if (myErrorStripeRenderer != null) {
int x = isMirrored() ? 0 : (getThinGap() + myMinMarkHeight);
int x = isMirrored() ? 0 : getThinGap() + myMinMarkHeight;
final Rectangle b = new Rectangle(x, 0, getErrorIconWidth(), getErrorIconHeight());
myErrorStripeRenderer.paint(this, g, b);
}
@@ -477,7 +475,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark
}
private boolean transparent() {
return Registry.is("editor.transparent.scrollbar", false) && isRealFileEditor(myEditor);
return Registry.is("editor.transparent.scrollbar", false) && EditorUtil.isRealFileEditor(myEditor);
}
private class MyErrorPanel extends ButtonlessScrollBarUI implements MouseMotionListener, MouseListener, MouseWheelListener, UISettingsListener {
@@ -500,7 +498,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark
@Override
protected boolean isMacScrollbarHiddenAndXcodeLikeScrollbar() {
return super.isMacScrollbarHiddenAndXcodeLikeScrollbar() && isRealFileEditor(myEditor);
return super.isMacScrollbarHiddenAndXcodeLikeScrollbar() && EditorUtil.isRealFileEditor(myEditor);
}
@Override
@@ -603,7 +601,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark
@Override
protected boolean alwaysPaintThumb() {
if (scrollbar.getOrientation() == Adjustable.VERTICAL) return !(xcodeLikeScrollbar() && isRealFileEditor(myEditor));
if (scrollbar.getOrientation() == Adjustable.VERTICAL) return !(xcodeLikeScrollbar() && EditorUtil.isRealFileEditor(myEditor));
return super.alwaysPaintThumb();
}
@@ -619,8 +617,8 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark
@Override
protected void paintMaxiThumb(@NotNull Graphics2D g, @NotNull Rectangle thumbBounds) {
int arc = 3;
g.setColor(adjustColor(getGradientDarkColor()));
int arc = 3;
g.fillRoundRect(isMirrored() ? -3 : 2, 0, thumbBounds.width, thumbBounds.height, arc, arc);
}
@@ -701,7 +699,6 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark
final Rectangle clip = new Rectangle(0, yrange.getStartOffset(), gutterWidth, yrange.getLength() + myMinMarkHeight);
paintTrackBasement(g, clip);
Document document = myEditor.getDocument();
int startOffset = yPositionToOffset(clip.y - myMinMarkHeight, true);
int endOffset = yPositionToOffset(clip.y + clip.height, false);
@@ -715,11 +712,11 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark
}
private void drawMarkup(@NotNull final Graphics g, int startOffset, int endOffset, @NotNull MarkupModelEx markup1, @NotNull MarkupModelEx markup2) {
final Queue<PositionedStripe> thinEnds = new PriorityQueue<PositionedStripe>(5, (o1, o2) -> o1.yEnd - o2.yEnd);
final Queue<PositionedStripe> wideEnds = new PriorityQueue<PositionedStripe>(5, (o1, o2) -> o1.yEnd - o2.yEnd);
final Queue<PositionedStripe> thinEnds = new PriorityQueue<>(5, (o1, o2) -> o1.yEnd - o2.yEnd);
final Queue<PositionedStripe> wideEnds = new PriorityQueue<>(5, (o1, o2) -> o1.yEnd - o2.yEnd);
// sorted by layer
final List<PositionedStripe> thinStripes = new ArrayList<PositionedStripe>(); // layer desc
final List<PositionedStripe> wideStripes = new ArrayList<PositionedStripe>(); // layer desc
final List<PositionedStripe> thinStripes = new ArrayList<>(); // layer desc
final List<PositionedStripe> wideStripes = new ArrayList<>(); // layer desc
final int[] thinYStart = new int[1]; // in range 0..yStart all spots are drawn
final int[] wideYStart = new int[1]; // in range 0..yStart all spots are drawn
@@ -906,7 +903,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark
int inc = e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL ? e.getUnitsToScroll() * e.getScrollAmount() :
e.getWheelRotation() < 0 ? -e.getScrollAmount() : e.getScrollAmount();
// Stop accumulating when the last or the first line has been reached as 'adjusted' position to show lens.
if ((myLastVisualLine < myEditor.getVisibleLineCount() - 1 && inc > 0) || (myLastVisualLine > 0 && inc < 0)) {
if (myLastVisualLine < myEditor.getVisibleLineCount() - 1 && inc > 0 || myLastVisualLine > 0 && inc < 0) {
myWheelAccumulator += inc;
}
myRowAdjuster = myWheelAccumulator / myEditor.getLineHeight();
@@ -993,7 +990,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark
ContainerUtil.add(listener, myErrorMarkerListeners, parent);
}
public void markDirtied(@NotNull ProperTextRange yPositions) {
private void markDirtied(@NotNull ProperTextRange yPositions) {
if (myDirtyYPositions != WHOLE_DOCUMENT) {
int start = Math.max(0, yPositions.getStartOffset() - myEditor.getLineHeight());
int end = myEditorScrollbarTop + myEditorTargetHeight == 0 ? yPositions.getEndOffset() + myEditor.getLineHeight()
@@ -1033,7 +1030,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark
final String text = tooltipObject.toString();
if (tooltips == null) {
tooltips = new THashSet<String>();
tooltips = new THashSet<>();
}
if (tooltips.add(text)) {
if (bigRenderer == null) {
@@ -1115,13 +1112,11 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark
else if (start == end || offsetToLine(start, document) == endLineNumber) {
endY = startY; // both offsets are on the same line, no need to recalc Y position
}
else if (myEditorSourceHeight < editorTargetHeight) {
endY = myEditorScrollbarTop + endLineNumber * myEditor.getLineHeight();
}
else {
if (myEditorSourceHeight < editorTargetHeight) {
endY = myEditorScrollbarTop + endLineNumber * myEditor.getLineHeight();
}
else {
endY = myEditorScrollbarTop + (int)((float)endLineNumber / lineCount * editorTargetHeight);
}
endY = myEditorScrollbarTop + (int)((float)endLineNumber / lineCount * editorTargetHeight);
}
if (endY < startY) endY = startY;
return new ProperTextRange(startY, endY);
@@ -1161,7 +1156,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark
private class EditorFragmentRenderer implements TooltipRenderer {
private int myVisualLine;
private boolean myShowInstantly;
private final List<RangeHighlighterEx> myHighlighters = new ArrayList<RangeHighlighterEx>();
private final List<RangeHighlighterEx> myHighlighters = new ArrayList<>();
@Nullable private BufferedImage myCacheLevel1;
@Nullable private BufferedImage myCacheLevel2;
private int myCacheStartLine;
@@ -1169,13 +1164,13 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark
private int myStartVisualLine;
private int myEndVisualLine;
private int myRelativeY;
private boolean myDelayed = false;
private boolean isDirty = false;
private final AtomicReference<Point> myPointHolder = new AtomicReference<Point>();
private final AtomicReference<HintHint> myHintHolder = new AtomicReference<HintHint>();
private boolean myDelayed;
private boolean isDirty;
private final AtomicReference<Point> myPointHolder = new AtomicReference<>();
private final AtomicReference<HintHint> myHintHolder = new AtomicReference<>();
private EditorFragmentRenderer() {
update(-1, Collections.<RangeHighlighterEx>emptyList(), false);
update(-1, Collections.emptyList(), false);
}
void update(int visualLine, @NotNull Collection<RangeHighlighterEx> rangeHighlighters, boolean showInstantly) {
@@ -1325,11 +1320,11 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark
//Add glass effect
Shape s = new Rectangle(0, 0, size.width, size.height);
double cx = size.width / 2;
double cy = 0;
double rx = size.width / 10;
int ry = myEditor.getLineHeight() * 3 / 2;
g2.setPaint(new GradientPaint(0, 0, Gray._255.withAlpha(75), 0, ry, Gray._255.withAlpha(10)));
double pseudoMajorAxis = size.width - rx * 9 / 5;
double cy = 0;
Shape topShape1 = new Ellipse2D.Double(cx - rx - pseudoMajorAxis / 2, cy - ry, 2 * rx, 2 * ry);
Shape topShape2 = new Ellipse2D.Double(cx - rx + pseudoMajorAxis / 2, cy - ry, 2 * rx, 2 * ry);
Area topArea = new Area(topShape1);