diff --git a/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreview.java b/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreview.java index 2a29c1bae5ef..327d86e5b636 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreview.java +++ b/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreview.java @@ -137,10 +137,9 @@ public class LivePreview extends DocumentAdapter implements ReplacementView.Dele Editor editor = mySearchResults.getEditor(); if (cursor != null) { ArrayList dummy = new ArrayList(); - highlightRange(cursor.getPrimaryRange(), new TextAttributes(null, null, null, null, 0), dummy); + highlightRange(cursor.getPrimaryRange(), new TextAttributes(null, null, Color.BLACK, EffectType.ROUNDED_BOX, 0), dummy); if (!dummy.isEmpty()) { myCursorHighlighter = dummy.get(0); - myCursorHighlighter.setCustomRenderer(new CursorRenderer()); } if (!SearchResults.insideVisibleArea(editor, cursor.getPrimaryRange()) && scroll) { @@ -263,37 +262,6 @@ public class LivePreview extends DocumentAdapter implements ReplacementView.Dele } - - private static class CursorRenderer implements CustomHighlighterRenderer { - @Override - public void paint(Editor editor, RangeHighlighter highlighter, Graphics g) { - Document document = editor.getDocument(); - int offset = highlighter.getStartOffset(); - while (offset < highlighter.getEndOffset()) { - int line = document.getLineNumber(offset); - int newOffset = document.getLineEndOffset(line); - newOffset = Math.min(highlighter.getEndOffset(), newOffset); - drawSegment(editor, new TextRange(offset, newOffset), g); - offset = newOffset+1; - } - } - - private static void drawSegment(Editor editor, Segment highlighter, Graphics g) { - Graphics2D g2d = (Graphics2D)g; - VisualPosition startVp = editor.offsetToVisualPosition(highlighter.getStartOffset()); - VisualPosition endVp = editor.offsetToVisualPosition(highlighter.getEndOffset()); - Point start = editor.visualPositionToXY(startVp); - Point end = editor.visualPositionToXY(endVp); - g2d.setColor(new Color(50, 50, 50)); - g2d.translate(0, start.y - 4); - Color c1 = new Color(220, 200, 130); - Color c2 = new Color(220, 170, 30); - int endX = start.x != end.x ? end.x : end.x + 2; - UIUtil.drawSearchMatch(g2d, start.x - 1, endX + 1, editor.getLineHeight() + 2 * 4, c1, c2); - g2d.translate(0, -start.y + 4); - } - } - private class ReplacementBalloonPositionTracker extends PositionTracker { private final Editor myEditor; private final int myStartOffset; diff --git a/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreviewControllerBase.java b/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreviewControllerBase.java index 9e2b7a31a736..f1f49b5fed2b 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreviewControllerBase.java +++ b/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreviewControllerBase.java @@ -133,6 +133,9 @@ public class LivePreviewControllerBase implements LivePreview.Delegate, FindUtil @Override public String getStringToReplace(Editor editor, LiveOccurrence liveOccurrence) { + if (liveOccurrence == null) { + return null; + } String foundString = editor.getDocument().getText(liveOccurrence.getPrimaryRange()); String documentText = editor.getDocument().getText(); FindModel currentModel = mySearchResults.getFindModel(); diff --git a/platform/platform-api/src/com/intellij/openapi/editor/markup/EffectType.java b/platform/platform-api/src/com/intellij/openapi/editor/markup/EffectType.java index eaf8ef34428a..bdf07a97dd67 100644 --- a/platform/platform-api/src/com/intellij/openapi/editor/markup/EffectType.java +++ b/platform/platform-api/src/com/intellij/openapi/editor/markup/EffectType.java @@ -22,5 +22,6 @@ public enum EffectType { STRIKEOUT, BOLD_LINE_UNDERSCORE, BOLD_DOTTED_LINE, - SEARCH_MATCH + SEARCH_MATCH, + ROUNDED_BOX } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/BorderEffect.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/BorderEffect.java index 8b59c528c319..b1e1c7abe0e0 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/BorderEffect.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/BorderEffect.java @@ -40,13 +40,13 @@ public class BorderEffect { EffectType effectType = attributes1.getEffectType(); return effectColor != null && effectColor.equals(attributes2.getEffectColor()) - && EffectType.BOXED == effectType && + && (EffectType.BOXED == effectType || EffectType.ROUNDED_BOX == effectType) && effectType == attributes2.getEffectType(); } }; private static final Condition BOX_FILTER = new Condition() { public boolean value(TextAttributes attributes) { - return attributes.getEffectColor() != null && attributes.getEffectType() == EffectType.BOXED; + return isBorder(attributes); } }; @@ -78,17 +78,18 @@ public class BorderEffect { private static boolean isBorder(TextAttributes textAttributes) { return textAttributes != null && textAttributes.getEffectColor() != null && - EffectType.BOXED == textAttributes.getEffectType(); + (EffectType.BOXED == textAttributes.getEffectType() || EffectType.ROUNDED_BOX == textAttributes.getEffectType()); } private void paintBorder(RangeHighlighterEx rangeHighlighter) { paintBorder(rangeHighlighter.getTextAttributes().getEffectColor(), rangeHighlighter.getAffectedAreaStartOffset(), - rangeHighlighter.getAffectedAreaEndOffset()); + rangeHighlighter.getAffectedAreaEndOffset(), + rangeHighlighter.getTextAttributes().getEffectType()); } - private void paintBorder(Color color, int startOffset, int endOffset) { - paintBorder(myGraphics, myEditor, startOffset, endOffset, color); + private void paintBorder(Color color, int startOffset, int endOffset, EffectType effectType) { + paintBorder(myGraphics, myEditor, startOffset, endOffset, color, effectType); } private boolean intersectsRange(RangeHighlighterEx rangeHighlighter) { @@ -106,7 +107,7 @@ public class BorderEffect { while (!iterator.atEnd()) { iterator.advance(); paintBorder(myGraphics, myEditor, iterator.getStart(), iterator.getEnd(), - iterator.getTextAttributes().getEffectColor()); + iterator.getTextAttributes().getEffectColor(), iterator.getTextAttributes().getEffectType()); } } @@ -116,14 +117,14 @@ public class BorderEffect { return myEditor.getDocument().getLineStartOffset(line); } - private static void paintBorder(Graphics g, EditorImpl editor, int startOffset, int endOffset, Color color) { + private static void paintBorder(Graphics g, EditorImpl editor, int startOffset, int endOffset, Color color, EffectType effectType) { Color savedColor = g.getColor(); g.setColor(color); - paintBorder(g, editor, startOffset, endOffset); + paintBorder(g, editor, startOffset, endOffset, effectType); g.setColor(savedColor); } - private static void paintBorder(Graphics g, EditorImpl editor, int startOffset, int endOffset) { + private static void paintBorder(Graphics g, EditorImpl editor, int startOffset, int endOffset, EffectType effectType) { Point startPoint = offsetToXY(editor, startOffset); Point endPoint = offsetToXY(editor, endOffset); int height = endPoint.y - startPoint.y; @@ -132,10 +133,14 @@ public class BorderEffect { int endX = endPoint.x; if (height == 0) { int width = endX == startX ? 1 : endX - startX - 1; - g.drawRect(startX, startY, width, editor.getLineHeight() - 1); + if (effectType == EffectType.ROUNDED_BOX) { + UIUtil.drawRectPickedOut((Graphics2D)g, startX, startY, width, editor.getLineHeight() - 1); + } else { + g.drawRect(startX, startY, width, editor.getLineHeight() - 1); + } return; } - BorderGraphics border = new BorderGraphics(g, startX, startY); + BorderGraphics border = new BorderGraphics(g, startX, startY, effectType); border.horizontalTo(editor.getMaxWidthInRange(startOffset, endOffset) - 1); border.verticalRel(height - 1); border.horizontalTo(endX); @@ -181,12 +186,14 @@ public class BorderEffect { private int myX; private int myY; + private EffectType myEffectType; - public BorderGraphics(Graphics graphics, int startX, int stIntY) { + public BorderGraphics(Graphics graphics, int startX, int stIntY, EffectType effectType) { myGraphics = graphics; myX = startX; myY = stIntY; + myEffectType = effectType; } public void horizontalTo(int x) { @@ -198,7 +205,11 @@ public class BorderEffect { } private void lineTo(int x, int y) { - UIUtil.drawLine(myGraphics, myX, myY, x, y); + if (myEffectType == EffectType.ROUNDED_BOX) { + UIUtil.drawLinePickedOut(myGraphics, myX, myY, x, y); + } else { + UIUtil.drawLine(myGraphics, myX, myY, x, y); + } myX = x; myY = y; } diff --git a/platform/util/src/com/intellij/util/ui/UIUtil.java b/platform/util/src/com/intellij/util/ui/UIUtil.java index 31dbad86bead..d99b1c06be9d 100644 --- a/platform/util/src/com/intellij/util/ui/UIUtil.java +++ b/platform/util/src/com/intellij/util/ui/UIUtil.java @@ -26,13 +26,11 @@ import com.intellij.ui.ColorUtil; import com.intellij.ui.SideBorder; import com.intellij.util.ArrayUtil; import com.intellij.util.ReflectionUtil; -import com.intellij.util.WeakListener; import org.intellij.lang.annotations.Language; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; -import sun.security.action.GetPropertyAction; import javax.swing.*; import javax.swing.border.Border; @@ -51,7 +49,6 @@ import java.lang.ref.WeakReference; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.net.URL; -import java.security.AccessController; import java.util.*; import java.util.List; import java.util.concurrent.BlockingQueue; @@ -92,6 +89,20 @@ public class UIUtil { private UIUtil() { } + public static void drawLinePickedOut(Graphics graphics, int x, int y, int x1, int y1) { + if (x == x1) { + int minY = Math.min(y, y1); + int maxY = Math.max(y, y1); + graphics.drawLine(x, minY+1, x1, maxY-1); + } else if (y == y1) { + int minX = Math.min(x, x1); + int maxX = Math.max(x, x1); + graphics.drawLine(minX+1, y, maxX-1, y1); + } else { + drawLine(graphics, x, y, x1, y1); + } + } + public static boolean isReallyTypedEvent(KeyEvent e) { char c = e.getKeyChar(); if (!(c >= 0x20 && c != 0x7F)) return false; @@ -785,6 +796,13 @@ public class UIUtil { } } + public static void drawRectPickedOut(Graphics2D g, int x, int y, int w, int h) { + g.drawLine(x+1, y, x+w-1, y); + g.drawLine(x+w, y+1, x+w, y+h-1); + g.drawLine(x+w-1, y+h, x+1, y+h); + g.drawLine(x, y+1, x, y+h-1); + } + private static void drawBoringDottedLine(final Graphics2D g, final int startX, final int endX,