Hi, this patch makes the highlight painting flexible enough to handle lines of different sizes. It is an adaption of the code in BasicTextUI.damageRange().
2006-03-02 Robert Schuster <[EMAIL PROTECTED]> * javax/swing/text/DefaultHighlighter.java: (DefaultHighlighter.DefaultHighlightPainter.paint): Rewritten. cya Robert
Index: javax/swing/text/DefaultHighlighter.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/text/DefaultHighlighter.java,v retrieving revision 1.8 diff -u -r1.8 DefaultHighlighter.java --- javax/swing/text/DefaultHighlighter.java 22 Feb 2006 13:33:27 -0000 1.8 +++ javax/swing/text/DefaultHighlighter.java 21 Mar 2006 18:08:01 -0000 @@ -71,60 +71,88 @@ } public void paint(Graphics g, int p0, int p1, Shape bounds, - JTextComponent c) + JTextComponent t) { - 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 (p0 == p1) + return; - if (r0 == null || r1 == null) - return; + Rectangle rect = bounds.getBounds(); if (color == null) - g.setColor(c.getSelectionColor()); + g.setColor(t.getSelectionColor()); else - g.setColor(color); + 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; - } + TextUI ui = t.getUI(); - // 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; - r0.width = rect.width; - - while (r0.y < r1.y) - { - paintHighlight(g, r0); - r0.y += r0.height; - } - - // Last line, from beginning-of-line to p1. - // The "-1" is neccessary else we would paint one pixel column more - // than in the case where the selection is only on one line. - r0.width = r1.x + r1.width - 1; - paintHighlight(g, r0); + try + { + + Rectangle l0 = ui.modelToView(t, p0, null); + Rectangle l1 = ui.modelToView(t, p1, null); + + if (l0.y == l1.y) + paintHighlight(g, l0.union(l1)); + else + { + // 1. The line of p0 is painted from the position of p0 + // to the right border. + // 2. All lines between the ones where p0 and p1 lie on + // are completely highlighted. The allocation area is used to find + // out the bounds. + // 3. The final line is painted from the left border to the + // position of p1. + + // Highlight first line until the end. + l0.width = rect.width - l0.x; + paintHighlight(g, l0); + + int posBelow = Utilities.getPositionBelow(t, p0, l0.x); + int p1RowStart = Utilities.getRowStart(t, p1); + if (posBelow != -1 + && posBelow != p0 + && Utilities.getRowStart(t, posBelow) + != p1RowStart) + { + Rectangle grow = ui.modelToView(t, posBelow); + grow.x = rect.x; + grow.width = rect.width; + + // Find further lines which have to be highlighted completely. + int nextPosBelow = posBelow; + while (nextPosBelow != -1 + && Utilities.getRowStart(t, nextPosBelow) != p1RowStart) + { + posBelow = nextPosBelow; + nextPosBelow = Utilities.getPositionBelow(t, posBelow, l0.x); + + if (nextPosBelow == posBelow) + break; + } + // Now posBelow is an offset on the last line which has to be painted + // completely. (newPosBelow is on the same line as p1) + + // Retrieve the rectangle of posBelow and use its y and height + // value to calculate the final height of the multiple line + // spanning rectangle. + Rectangle end = ui.modelToView(t, posBelow); + grow.height = end.y + end.height - grow.y; + + paintHighlight(g, grow); + } + + // Paint last line from its beginning to the position of p1. + l1.width = l1.x + l1.width - rect.x; + l1.x = rect.x; + paintHighlight(g, l1); + } + } + catch (BadLocationException ex) + { + AssertionError err = new AssertionError("Unexpected bad location exception"); + err.initCause(ex); + throw err; + } } public Shape paintLayer(Graphics g, int p0, int p1, Shape bounds,
signature.asc
Description: OpenPGP digital signature