diff options
Diffstat (limited to 'libjava/javax/swing/text/DefaultHighlighter.java')
-rw-r--r-- | libjava/javax/swing/text/DefaultHighlighter.java | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/libjava/javax/swing/text/DefaultHighlighter.java b/libjava/javax/swing/text/DefaultHighlighter.java index 003d17d1a8e..234fcad60ff 100644 --- a/libjava/javax/swing/text/DefaultHighlighter.java +++ b/libjava/javax/swing/text/DefaultHighlighter.java @@ -38,7 +38,9 @@ exception statement from your version. */ package javax.swing.text; +import java.awt.Color; import java.awt.Graphics; +import java.awt.Rectangle; import java.awt.Shape; import java.util.Vector; @@ -48,6 +50,87 @@ import javax.swing.text.View; public class DefaultHighlighter extends LayeredHighlighter { + public static class DefaultHighlightPainter + extends LayerPainter + { + private Color color; + + public DefaultHighlightPainter(Color c) + { + super(); + color = c; + } + + public Color getColor() + { + return color; + } + + private void paintHighlight(Graphics g, Rectangle rect) + { + g.fillRect(rect.x, rect.y, rect.width, rect.height); + } + + public void paint(Graphics g, int p0, int p1, Shape bounds, + JTextComponent c) + { + Rectangle r0 = null; + Rectangle r1 = null; + Rectangle rect = bounds.getBounds(); + + try + { + r0 = c.modelToView(p0); + r1 = c.modelToView(p1); + } + catch (BadLocationException e) + { + // This should never occur. + return; + } + + if (r0 == null || r1 == null) + return; + + if (color == null) + g.setColor(c.getSelectionColor()); + else + g.setColor(color); + + // Check if only one line to highlight. + if (r0.y == r1.y) + { + r0.width = r1.x - r0.x; + paintHighlight(g, r0); + return; + } + + // First line, from p0 to end-of-line. + r0.width = rect.x + rect.width - r0.x; + paintHighlight(g, r0); + + // FIXME: All the full lines in between, if any (assumes that all lines + // have the same height -- not a good assumption with JEditorPane/JTextPane). + r0.y += r0.height; + r0.x = rect.x; + + while (r0.y < r1.y) + { + paintHighlight(g, r0); + r0.y += r0.height; + } + + // Last line, from beginnin-of-line to p1. + paintHighlight(g, r1); + } + + public Shape paintLayer(Graphics g, int p0, int p1, Shape bounds, + JTextComponent c, View view) + { + throw new InternalError(); + } + } + private class HighlightEntry { int p0; @@ -77,6 +160,12 @@ public class DefaultHighlighter extends LayeredHighlighter } } + /** + * @specnote final as of 1.4 + */ + public static final LayeredHighlighter.LayerPainter DefaultPainter = + new DefaultHighlightPainter(null); + private JTextComponent textComponent; private Vector highlights = new Vector(); @@ -146,5 +235,16 @@ public class DefaultHighlighter extends LayeredHighlighter public void paint(Graphics g) { + // Check if there are any highlights. + if (highlights.size() == 0) + return; + + Shape bounds = textComponent.getBounds(); + + for (int index = 0; index < highlights.size(); ++index) + { + HighlightEntry entry = (HighlightEntry) highlights.get(index); + entry.painter.paint(g, entry.p0, entry.p1, bounds, textComponent); + } } } |