IDEA-131263 Visual issues with editor gutters

This commit is contained in:
Sergey Ignatov
2014-10-29 16:29:48 +03:00
parent f0fc85674e
commit bf3ef3eb09
5 changed files with 25 additions and 52 deletions
@@ -76,7 +76,6 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
private static final int FREE_PAINTERS_AREA_WIDTH = 5; private static final int FREE_PAINTERS_AREA_WIDTH = 5;
private static final int GAP_BETWEEN_ICONS = 3; private static final int GAP_BETWEEN_ICONS = 3;
private static final TooltipGroup GUTTER_TOOLTIP_GROUP = new TooltipGroup("GUTTER_TOOLTIP_GROUP", 0); private static final TooltipGroup GUTTER_TOOLTIP_GROUP = new TooltipGroup("GUTTER_TOOLTIP_GROUP", 0);
private static final Color COLOR_F0F0 = new Color(0xF0F0F0);
public static final TIntFunction ID = new TIntFunction() { public static final TIntFunction ID = new TIntFunction() {
@Override @Override
public int execute(int value) { public int execute(int value) {
@@ -96,7 +95,7 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
private TIntArrayList myTextAnnotationGutterSizes = new TIntArrayList(); private TIntArrayList myTextAnnotationGutterSizes = new TIntArrayList();
private ArrayList<TextAnnotationGutterProvider> myTextAnnotationGutters = new ArrayList<TextAnnotationGutterProvider>(); private ArrayList<TextAnnotationGutterProvider> myTextAnnotationGutters = new ArrayList<TextAnnotationGutterProvider>();
private final Map<TextAnnotationGutterProvider, EditorGutterAction> myProviderToListener = new HashMap<TextAnnotationGutterProvider, EditorGutterAction>(); private final Map<TextAnnotationGutterProvider, EditorGutterAction> myProviderToListener = new HashMap<TextAnnotationGutterProvider, EditorGutterAction>();
private static final int GAP_BETWEEN_ANNOTATIONS = 6; private static final int GAP_BETWEEN_ANNOTATIONS = 5;
private Color myBackgroundColor = null; private Color myBackgroundColor = null;
private String myLastGutterToolTip = null; private String myLastGutterToolTip = null;
private int myLastPreferredHeight = -1; private int myLastPreferredHeight = -1;
@@ -227,7 +226,7 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
private void paintEditorBackgrounds(Graphics g, Rectangle clip, int firstVisibleOffset, int lastVisibleOffset) { private void paintEditorBackgrounds(Graphics g, Rectangle clip, int firstVisibleOffset, int lastVisibleOffset) {
Color defaultBackgroundColor = myEditor.getBackgroundColor(); Color defaultBackgroundColor = myEditor.getBackgroundColor();
int startX = getWhitespaceSeparatorOffset() + 1; int startX = getWhitespaceSeparatorOffset() + (isFoldingOutlineShown() ? 1 : 0);
IterationState state = new IterationState(myEditor, firstVisibleOffset, lastVisibleOffset, false, true); IterationState state = new IterationState(myEditor, firstVisibleOffset, lastVisibleOffset, false, true);
while (!state.atEnd()) { while (!state.atEnd()) {
VisualPosition visualStart = myEditor.offsetToVisualPosition(state.getStartOffset()); VisualPosition visualStart = myEditor.offsetToVisualPosition(state.getStartOffset());
@@ -329,19 +328,12 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
x += myTextAnnotationGutterSizes.get(i); x += myTextAnnotationGutterSizes.get(i);
} }
if (!myEditor.isInDistractionFreeMode()) {
UIUtil.drawVDottedLine((Graphics2D)g, getAnnotationsAreaOffset() + w - 1, clip.y, clip.y + clip.height, null, getOutlineColor(false));
}
} }
private void paintFoldingTree(Graphics g, Rectangle clip, int firstVisibleOffset, int lastVisibleOffset) { private void paintFoldingTree(Graphics g, Rectangle clip, int firstVisibleOffset, int lastVisibleOffset) {
if (isFoldingOutlineShown()) { if (isFoldingOutlineShown()) {
doPaintFoldingTree((Graphics2D)g, clip, firstVisibleOffset, lastVisibleOffset); doPaintFoldingTree((Graphics2D)g, clip, firstVisibleOffset, lastVisibleOffset);
} }
else {
UIUtil.drawVDottedLine((Graphics2D)g, clip.x + clip.width - 1, clip.y, clip.y + clip.height, null, getOutlineColor(false));
}
} }
private void paintLineMarkers(Graphics g, Rectangle clip, int firstVisibleOffset, int lastVisibleOffset) { private void paintLineMarkers(Graphics g, Rectangle clip, int firstVisibleOffset, int lastVisibleOffset) {
@@ -378,8 +370,6 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
private void paintLineNumbers(Graphics g, Rectangle clip) { private void paintLineNumbers(Graphics g, Rectangle clip) {
if (isLineNumbersShown()) { if (isLineNumbersShown()) {
int x = getLineNumberAreaOffset() + getLineNumberAreaWidth() - 2;
UIUtil.drawVDottedLine((Graphics2D)g, x, clip.y, clip.y + clip.height, null, getOutlineColor(false));
doPaintLineNumbers(g, clip); doPaintLineNumbers(g, clip);
} }
} }
@@ -396,7 +386,7 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
EditorColorsScheme colorsScheme = myEditor.getColorsScheme(); EditorColorsScheme colorsScheme = myEditor.getColorsScheme();
boolean distractionMode = myEditor.isInDistractionFreeMode(); boolean distractionMode = myEditor.isInDistractionFreeMode();
Color color = distractionMode ? colorsScheme.getDefaultBackground() : colorsScheme.getColor(EditorColors.GUTTER_BACKGROUND); Color color = distractionMode ? colorsScheme.getDefaultBackground() : colorsScheme.getColor(EditorColors.GUTTER_BACKGROUND);
myBackgroundColor = color == null ? COLOR_F0F0 : color; myBackgroundColor = color == null ? EditorColors.GUTTER_BACKGROUND.getDefaultColor() : color;
} }
return myBackgroundColor; return myBackgroundColor;
} }
@@ -648,9 +638,7 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
} }
}); });
myLineMarkerAreaWidth = myIconsAreaWidth + FREE_PAINTERS_AREA_WIDTH + myLineMarkerAreaWidth = myIconsAreaWidth + FREE_PAINTERS_AREA_WIDTH;
// if folding outline is shown, there will be enough place for change markers, otherwise add place for it.
(isFoldingOutlineShown() ? 0 : getFoldingAnchorWidth() / 2);
} }
private void paintGutterRenderers(final Graphics g, int firstVisibleOffset, int lastVisibleOffset) { private void paintGutterRenderers(final Graphics g, int firstVisibleOffset, int lastVisibleOffset) {
@@ -739,7 +727,7 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
int height = endY - startY; int height = endY - startY;
int w = FREE_PAINTERS_AREA_WIDTH; int w = FREE_PAINTERS_AREA_WIDTH;
int x = getLineMarkerAreaOffset() + myIconsAreaWidth; int x = getLineMarkerAreaOffset() + myIconsAreaWidth - 1;
return new Rectangle(x, startY, w, height); return new Rectangle(x, startY, w, height);
} }
@@ -770,7 +758,7 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
final int leftSize = x - getLineMarkerAreaOffset(); final int leftSize = x - getLineMarkerAreaOffset();
x = getLineMarkerAreaOffset() + myIconsAreaWidth; x = getLineMarkerAreaOffset() + myIconsAreaWidth - 2; // because of 2px LineMarkerRenderers
for (GutterMark r : row) { for (GutterMark r : row) {
if (((GutterIconRenderer)r).getAlignment() == GutterIconRenderer.Alignment.RIGHT) { if (((GutterIconRenderer)r).getAlignment() == GutterIconRenderer.Alignment.RIGHT) {
Icon icon = r.getIcon(); Icon icon = r.getIcon();
@@ -780,7 +768,7 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
} }
} }
int rightSize = myIconsAreaWidth + getLineMarkerAreaOffset() - x; int rightSize = myIconsAreaWidth + getLineMarkerAreaOffset() - x + 1;
if (middleCount > 0) { if (middleCount > 0) {
middleSize -= GAP_BETWEEN_ICONS; middleSize -= GAP_BETWEEN_ICONS;
@@ -845,7 +833,9 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
private void paintFoldingLines(final Graphics2D g, final Rectangle clip) { private void paintFoldingLines(final Graphics2D g, final Rectangle clip) {
if (!isFoldingOutlineShown()) return; if (!isFoldingOutlineShown()) return;
UIUtil.drawVDottedLine(g, getWhitespaceSeparatorOffset(), clip.y, clip.y + clip.height, null, getOutlineColor(false)); g.setColor(getOutlineColor(false));
int x = getWhitespaceSeparatorOffset();
UIUtil.drawLine(g, x, clip.y, x, clip.y + clip.height);
final int anchorX = getFoldingAreaOffset(); final int anchorX = getFoldingAreaOffset();
final int width = getFoldingAnchorWidth(); final int width = getFoldingAnchorWidth();
@@ -981,14 +971,11 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
} }
public int getFoldingAreaOffset() { public int getFoldingAreaOffset() {
return getLineMarkerAreaOffset() + return getLineMarkerAreaOffset() + getLineMarkerAreaWidth();
getLineMarkerAreaWidth();
} }
public int getFoldingAreaWidth() { public int getFoldingAreaWidth() {
return isFoldingOutlineShown() return getFoldingAnchorWidth() + (isFoldingOutlineShown() ? 2 : 0);
? getFoldingAnchorWidth() + 2
: 0;
} }
@Override @Override
@@ -1347,7 +1334,7 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
} }
@Override @Override
public void actionPerformed(AnActionEvent e) { public void actionPerformed(@NotNull AnActionEvent e) {
closeAllAnnotations(); closeAllAnnotations();
} }
} }
@@ -303,7 +303,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
private final TIntFunction myLineNumberAreaWidthFunction = new TIntFunction() { private final TIntFunction myLineNumberAreaWidthFunction = new TIntFunction() {
@Override @Override
public int execute(int lineNumber) { public int execute(int lineNumber) {
return getFontMetrics(Font.PLAIN).stringWidth(Integer.toString(lineNumber + 1)) + 6; return getFontMetrics(Font.PLAIN).stringWidth(Integer.toString(lineNumber + 1)) + 5;
} }
}; };
@@ -6771,10 +6771,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
g.setColor(ButtonlessScrollBarUI.getTrackBackground()); g.setColor(ButtonlessScrollBarUI.getTrackBackground());
g.fillRect(0, 0, width, height); g.fillRect(0, 0, width, height);
int shortner = 0; int shortner = myGutterComponent.getFoldingAreaWidth() / 2;
if (myGutterComponent.isFoldingOutlineShown()) {
shortner = myGutterComponent.getFoldingAreaWidth() / 2;
}
g.setColor(myGutterComponent.getBackground()); g.setColor(myGutterComponent.getBackground());
g.fillRect(0, 0, width - shortner, height); g.fillRect(0, 0, width - shortner, height);
@@ -36,7 +36,6 @@ import com.intellij.openapi.util.Pair;
import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.FocusWatcher; import com.intellij.openapi.wm.FocusWatcher;
import com.intellij.ui.PrevNextActionsDescriptor; import com.intellij.ui.PrevNextActionsDescriptor;
import com.intellij.ui.SideBorder;
import com.intellij.ui.TabbedPaneWrapper; import com.intellij.ui.TabbedPaneWrapper;
import com.intellij.ui.tabs.UiDecorator; import com.intellij.ui.tabs.UiDecorator;
import com.intellij.util.SmartList; import com.intellij.util.SmartList;
@@ -351,7 +350,7 @@ public abstract class EditorComposite implements Disposable {
if (remove) { if (remove) {
container.remove(component.getParent()); container.remove(component.getParent());
} else { } else {
container.add(new TopBottomComponentWrapper(component, top)); container.add(new TopBottomComponentWrapper(component));
} }
container.revalidate(); container.revalidate();
} }
@@ -474,19 +473,10 @@ public abstract class EditorComposite implements Disposable {
private static class TopBottomComponentWrapper extends JPanel { private static class TopBottomComponentWrapper extends JPanel {
private final JComponent myWrappee; private final JComponent myWrappee;
public TopBottomComponentWrapper(JComponent component, boolean top) { public TopBottomComponentWrapper(JComponent component) {
super(new BorderLayout()); super(new BorderLayout());
myWrappee = component; myWrappee = component;
setOpaque(false); setOpaque(false);
setBorder(new SideBorder(null, top ? SideBorder.BOTTOM : SideBorder.TOP, true) {
@Override
public Color getLineColor() {
Color result = EditorColorsManager.getInstance().getGlobalScheme().getColor(EditorColors.TEARLINE_COLOR);
return result == null ? Color.black : result;
}
});
add(component); add(component);
} }
@@ -18,10 +18,10 @@
<option name="ANNOTATIONS_COLOR" value="000080" /> <option name="ANNOTATIONS_COLOR" value="000080" />
<option name="ANNOTATIONS_MERGED_COLOR" value="008080" /> <option name="ANNOTATIONS_MERGED_COLOR" value="008080" />
<option name="CARET_COLOR" value="0"/> <option name="CARET_COLOR" value="0"/>
<option name="RIGHT_MARGIN_COLOR" value="c0c0c0"/> <option name="RIGHT_MARGIN_COLOR" value="E0E0E0"/>
<option name="SOFT_WRAP_SIGN_COLOR" value="c0c0c0"/> <option name="SOFT_WRAP_SIGN_COLOR" value="c0c0c0"/>
<option name="TEARLINE_COLOR" value="808080"/> <option name="TEARLINE_COLOR" value="D0D0D0"/>
<option name="SELECTED_TEARLINE_COLOR" value="000000"/> <option name="SELECTED_TEARLINE_COLOR" value="9C9C9C"/>
<option name="READONLY_FRAGMENT_BACKGROUND" value="cfe7ff"/> <option name="READONLY_FRAGMENT_BACKGROUND" value="cfe7ff"/>
<option name="ADDED_LINES_COLOR" value="CBE3CA"/> <option name="ADDED_LINES_COLOR" value="CBE3CA"/>
@@ -72,19 +72,18 @@ public class LineStatusTrackerDrawing {
final EditorGutterComponentEx gutter = ((EditorEx)editor).getGutterComponentEx(); final EditorGutterComponentEx gutter = ((EditorEx)editor).getGutterComponentEx();
Color stripeColor = getDiffGutterColor(range); Color stripeColor = getDiffGutterColor(range);
boolean foldingOutlineShown = ((EditorEx)editor).getGutterComponentEx().isFoldingOutlineShown();
int triangle = 4; int triangle = 4;
if (range.getInnerRanges() == null) { // actual painter if (range.getInnerRanges() == null) { // actual painter
g.setColor(stripeColor); g.setColor(stripeColor);
final int endX = gutter.getWhitespaceSeparatorOffset(); final int endX = gutter.getWhitespaceSeparatorOffset();
final int x = r.x + r.width - 4; final int x = r.x + r.width - 3;
final int width = endX - x; final int width = endX - x;
if (r.height > 0) { if (r.height > 0) {
g.fillRect(x, r.y, width, r.height); // todo: intersection with dotted gutter outline g.fillRect(x, r.y, width, r.height);
} }
else { else {
final int[] xPoints = new int[]{x, x, endX - (foldingOutlineShown ? -1 : triangle + 1)}; final int[] xPoints = new int[]{x, x, endX};
final int[] yPoints = new int[]{r.y - triangle, r.y + triangle, r.y}; final int[] yPoints = new int[]{r.y - triangle, r.y + triangle, r.y};
g.fillPolygon(xPoints, yPoints, 3); g.fillPolygon(xPoints, yPoints, 3);
} }
@@ -97,7 +96,7 @@ public class LineStatusTrackerDrawing {
if (range.getType() == Range.DELETED) { if (range.getType() == Range.DELETED) {
final int y = lineToY(editor, range.getLine1()); final int y = lineToY(editor, range.getLine1());
final int[] xPoints = new int[]{x, x, endX - (foldingOutlineShown ? 0 : triangle + 1)}; final int[] xPoints = new int[]{x, x, endX + 1};
final int[] yPoints = new int[]{y - triangle, y + triangle, y}; final int[] yPoints = new int[]{y - triangle, y + triangle, y};
g.setColor(stripeColor); g.setColor(stripeColor);
@@ -215,7 +214,7 @@ public class LineStatusTrackerDrawing {
toolbar.setBackground(background); toolbar.setBackground(background);
toolbar toolbar
.setBorder(new ColoredSideBorder(foreground, foreground, (range.getType() != Range.INSERTED) ? null : foreground, foreground, 1)); .setBorder(new ColoredSideBorder(foreground, foreground, range.getType() != Range.INSERTED ? null : foreground, foreground, 1));
final JPanel component = new JPanel(new BorderLayout()); final JPanel component = new JPanel(new BorderLayout());
component.setOpaque(false); component.setOpaque(false);