[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[cp-patches] FYI: Small swing text painting fixes from libgcj gui
From: |
Mark Wielaard |
Subject: |
[cp-patches] FYI: Small swing text painting fixes from libgcj gui |
Date: |
Thu, 11 Nov 2004 23:18:39 +0100 |
Hi,
This patch improves the swing text components' ability to cope with
focus transfers, caret movement, and the painting of multiple lines and
tabs in general.
2004-11-11 Graydon Hoare <address@hidden>
* javax/swing/plaf/basic/BasicTextUI.java:
Listen to focus events, indicate focus via caret.
* javax/swing/text/GapContent.java (getString): Return substring.
* javax/swing/text/PlainDocument.java (reindex): New method.
(createDefaultRoot): Call it.
(insertUpdate): Likewise.
(removeUpdate): Likewise.
* javax/swing/text/Utilities.java (drawTabbedText): Always advance
on tab and newline, even if no painting happens.
Improves textfield handling in jfreechart a bit.
Committed,
Mark
--- javax/swing/plaf/basic/BasicTextUI.java 10 Nov 2004 07:19:49 -0000
1.4.16.16
+++ javax/swing/plaf/basic/BasicTextUI.java 11 Nov 2004 07:48:35 -0000
@@ -45,6 +45,8 @@
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Shape;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
@@ -228,9 +230,20 @@
caret.setBlinkRate(defaults.getInt(prefix + ".caretBlinkRate"));
}
+ private FocusListener focuslistener = new FocusListener() {
+ public void focusGained(FocusEvent e)
+ {
+ textComponent.repaint();
+ }
+ public void focusLost(FocusEvent e)
+ {
+ textComponent.repaint();
+ }
+ };
+
protected void installListeners()
{
- // Do nothing here.
+ textComponent.addFocusListener(focuslistener);
}
protected String getKeymapName()
@@ -328,7 +341,7 @@
protected void uninstallListeners()
{
- // Do nothing here.
+ textComponent.removeFocusListener(focuslistener);
}
protected void uninstallKeyboardActions()
@@ -367,7 +380,7 @@
rootView.paint(g, getVisibleEditorRect());
- if (caret != null)
+ if (caret != null && textComponent.hasFocus())
caret.paint(g);
}
--- javax/swing/text/GapContent.java 16 Jun 2004 10:06:47 -0000 1.2.8.2
+++ javax/swing/text/GapContent.java 11 Nov 2004 07:48:35 -0000
@@ -93,7 +93,7 @@
public String getString(int where, int len) throws BadLocationException
{
- return buf.toString();
+ return buf.substring(where, where+len);
}
public void getChars(int where, int len, Segment txt)
--- javax/swing/text/PlainDocument.java 20 Jun 2004 15:27:41 -0000 1.1.52.3
+++ javax/swing/text/PlainDocument.java 11 Nov 2004 07:48:35 -0000
@@ -37,6 +37,8 @@
package javax.swing.text;
+import java.util.ArrayList;
+
public class PlainDocument extends AbstractDocument
{
private static final long serialVersionUID = 4758290289196893664L;
@@ -59,14 +61,53 @@
rootElement = createDefaultRoot();
}
- protected AbstractDocument.AbstractElement createDefaultRoot()
+ protected void reindex()
+ {
+ Element[] lines;
+ try
+ {
+ String str = content.getString(0, content.length());
+
+ ArrayList elts = new ArrayList();
+ int j = 0;
+ for (int i = str.indexOf('\n', 0); i != -1; i = str.indexOf('\n', i+1))
+ {
+ elts.add(createLeafElement(rootElement, null, j, i));
+ j = i;
+ }
+
+ if (j < content.length())
+ elts.add(createLeafElement(rootElement, null, j, content.length()));
+
+ lines = new Element[elts.size()];
+ for (int i = 0; i < elts.size(); ++i)
+ lines[i] = (Element) elts.get(i);
+
+ }
+ catch (BadLocationException e)
{
- BranchElement rootElement =
- (BranchElement) createBranchElement(null, null);
- Element[] lines = new Element[1];
+ lines = new Element[1];
lines[0] = createLeafElement(rootElement, null, 0, 1);
- rootElement.replace(0, 0, lines);
- return rootElement;
+ }
+
+ ((BranchElement) rootElement).replace(0, rootElement.getElementCount(),
lines);
+ }
+
+ protected AbstractDocument.AbstractElement createDefaultRoot()
+ {
+ rootElement = createBranchElement(null, null);
+ reindex();
+ return (AbstractElement) rootElement;
+ }
+
+ protected void insertUpdate(DefaultDocumentEvent chng, AttributeSet attr)
+ {
+ reindex();
+ }
+
+ protected void removeUpdate(DefaultDocumentEvent chng)
+ {
+ reindex();
}
public Element getDefaultRootElement()
--- javax/swing/text/Utilities.java 4 Oct 2004 16:45:49 -0000 1.1.2.6
+++ javax/swing/text/Utilities.java 11 Nov 2004 07:48:35 -0000
@@ -98,11 +98,13 @@
for (int offset = s.offset; offset < (s.offset + s.count); ++offset)
{
char c = buffer[offset];
- if (len > 0 && (c == '\t' || c == '\n'))
+ if (c == '\t' || c == '\n')
{
+ if (len > 0) {
g.drawChars(buffer, pos, len, pixelX, pixelY + ascent);
pixelX += pixelWidth;
pixelWidth = 0;
+ }
pos = offset+1;
len = 0;
}
signature.asc
Description: This is a digitally signed message part
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [cp-patches] FYI: Small swing text painting fixes from libgcj gui,
Mark Wielaard <=