CVSROOT: /cvsroot/classpath Module name: classpath Changes by: Roman Kennke <rabbit78> 06/06/21 17:04:41
Modified files: . : ChangeLog javax/swing/text: AbstractDocument.java JTextComponent.java PlainDocument.java javax/swing/text/rtf: RTFParser.java RTFScanner.java Log message: 2006-06-21 Roman Kennke <[EMAIL PROTECTED]> * javax/swing/text/AbstractDocument.java (BranchElement.numChildren): New field. (BranchElement.BranchElement): Initialize children array with one element (that's the least number of elements that makes sense). Initialize numChildren. (BranchElement.children): Use numChildren as boundary. (BranchElement.getElement): Use numChildren as boundary. (BranchElement.getElementCount): Use numChildren as boundary. (BranchElement.getElementIndex): Use numChildren as boundary. (BranchElement.getEndOffset): Use numChildren as boundary. (BranchElement.getStartOffset): Use numChildren as boundary. (BranchElement.positionToElement): Use numChildren as boundary. (BranchElement.replace): Handle the children array more efficiently by growing in blocks > 1, and reusing space from removed elements. (LeafElement.startDelta): Removed. (LeafElement.endDelta): Removed. (LeafElement.LeafElement): Removed handling of deltas. (LeafElement.getEndOffset): Likewise. (LeafElement.getStartOffset): Likewise. * javax/swing/text/JTextComponent.java (setDocument): Added locking of the old document to avoid dangling notification beeing delivered while the document is beeing disconnected. (getScrollableTracksViewportWidth): Fixed condition. * javax/swing/text/PlainDocument.java (createDefaultRoot): Create elements without AttributeSet. * javax/swing/text/rtf/RTFParser.java (parseFile): Handle slightly incorrect RTF gracefully. * javax/swing/text/rtf/RTFScanner.java (lastToken): New field. (readTokenImpl): New method. (peekToken): New method. (readToken): Changed to call readTokenImpl or return the lastToken if there's one present. CVSWeb URLs: http://cvs.savannah.gnu.org/viewcvs/classpath/ChangeLog?cvsroot=classpath&r1=1.7904&r2=1.7905 http://cvs.savannah.gnu.org/viewcvs/classpath/javax/swing/text/AbstractDocument.java?cvsroot=classpath&r1=1.57&r2=1.58 http://cvs.savannah.gnu.org/viewcvs/classpath/javax/swing/text/JTextComponent.java?cvsroot=classpath&r1=1.59&r2=1.60 http://cvs.savannah.gnu.org/viewcvs/classpath/javax/swing/text/PlainDocument.java?cvsroot=classpath&r1=1.21&r2=1.22 http://cvs.savannah.gnu.org/viewcvs/classpath/javax/swing/text/rtf/RTFParser.java?cvsroot=classpath&r1=1.3&r2=1.4 http://cvs.savannah.gnu.org/viewcvs/classpath/javax/swing/text/rtf/RTFScanner.java?cvsroot=classpath&r1=1.3&r2=1.4 Patches: Index: ChangeLog =================================================================== RCS file: /cvsroot/classpath/classpath/ChangeLog,v retrieving revision 1.7904 retrieving revision 1.7905 diff -u -b -r1.7904 -r1.7905 --- ChangeLog 21 Jun 2006 16:11:37 -0000 1.7904 +++ ChangeLog 21 Jun 2006 17:04:41 -0000 1.7905 @@ -1,3 +1,40 @@ +2006-06-21 Roman Kennke <[EMAIL PROTECTED]> + + * javax/swing/text/AbstractDocument.java + (BranchElement.numChildren): New field. + (BranchElement.BranchElement): Initialize children array with + one element (that's the least number of elements that makes sense). + Initialize numChildren. + (BranchElement.children): Use numChildren as boundary. + (BranchElement.getElement): Use numChildren as boundary. + (BranchElement.getElementCount): Use numChildren as boundary. + (BranchElement.getElementIndex): Use numChildren as boundary. + (BranchElement.getEndOffset): Use numChildren as boundary. + (BranchElement.getStartOffset): Use numChildren as boundary. + (BranchElement.positionToElement): Use numChildren as boundary. + (BranchElement.replace): Handle the children array more efficiently + by growing in blocks > 1, and reusing space from removed elements. + (LeafElement.startDelta): Removed. + (LeafElement.endDelta): Removed. + (LeafElement.LeafElement): Removed handling of deltas. + (LeafElement.getEndOffset): Likewise. + (LeafElement.getStartOffset): Likewise. + * javax/swing/text/JTextComponent.java + (setDocument): Added locking of the old document to avoid dangling + notification beeing delivered while the document is beeing + disconnected. + (getScrollableTracksViewportWidth): Fixed condition. + * javax/swing/text/PlainDocument.java + (createDefaultRoot): Create elements without AttributeSet. + * javax/swing/text/rtf/RTFParser.java + (parseFile): Handle slightly incorrect RTF gracefully. + * javax/swing/text/rtf/RTFScanner.java + (lastToken): New field. + (readTokenImpl): New method. + (peekToken): New method. + (readToken): Changed to call readTokenImpl or return the lastToken + if there's one present. + 2006-06-21 Tania Bento <[EMAIL PROTECTED]> * javax/swing/JMenu.java Index: javax/swing/text/AbstractDocument.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/text/AbstractDocument.java,v retrieving revision 1.57 retrieving revision 1.58 diff -u -b -r1.57 -r1.58 --- javax/swing/text/AbstractDocument.java 13 May 2006 23:11:13 -0000 1.57 +++ javax/swing/text/AbstractDocument.java 21 Jun 2006 17:04:41 -0000 1.58 @@ -1674,8 +1674,15 @@ /** The serialization UID (compatible with JDK1.5). */ private static final long serialVersionUID = -6037216547466333183L; - /** The child elements of this BranchElement. */ - private Element[] children = new Element[0]; + /** + * The child elements of this BranchElement. + */ + private Element[] children;; + + /** + * The number of children in the branch element. + */ + private int numChildren; /** * The cached startOffset value. This is used in the case when a @@ -1700,6 +1707,8 @@ public BranchElement(Element parent, AttributeSet attributes) { super(parent, attributes); + children = new Element[1]; + numChildren = 0; startOffset = -1; endOffset = -1; } @@ -1716,7 +1725,7 @@ Vector tmp = new Vector(); - for (int index = 0; index < children.length; ++index) + for (int index = 0; index < numChildren; ++index) tmp.add(children[index]); return tmp.elements(); @@ -1743,7 +1752,7 @@ */ public Element getElement(int index) { - if (index < 0 || index >= children.length) + if (index < 0 || index >= numChildren) return null; return children[index]; @@ -1756,7 +1765,7 @@ */ public int getElementCount() { - return children.length; + return numChildren; } /** @@ -1777,7 +1786,7 @@ // XXX: There is surely a better algorithm // as beginning from first element each time. - for (int index = 0; index < children.length - 1; ++index) + for (int index = 0; index < numChildren - 1; ++index) { Element elem = children[index]; @@ -1814,13 +1823,13 @@ */ public int getEndOffset() { - if (children.length == 0) + if (numChildren == 0) { if (endOffset == -1) throw new NullPointerException("BranchElement has no children."); } else - endOffset = children[children.length - 1].getEndOffset(); + endOffset = children[numChildren - 1].getEndOffset(); return endOffset; } @@ -1848,7 +1857,7 @@ */ public int getStartOffset() { - if (children.length == 0) + if (numChildren == 0) { if (startOffset == -1) throw new NullPointerException("BranchElement has no children."); @@ -1884,7 +1893,7 @@ { // XXX: There is surely a better algorithm // as beginning from first element each time. - for (int index = 0; index < children.length; ++index) + for (int index = 0; index < numChildren; ++index) { Element elem = children[index]; @@ -1905,15 +1914,28 @@ */ public void replace(int offset, int length, Element[] elements) { - Element[] target = new Element[children.length - length - + elements.length]; + if (numChildren + elements.length - length > children.length) + { + // Gotta grow the array. + int newSize = Math.max(2 * children.length, + numChildren + elements.length - length); + Element[] target = new Element[newSize]; System.arraycopy(children, 0, target, 0, offset); System.arraycopy(elements, 0, target, offset, elements.length); System.arraycopy(children, offset + length, target, offset + elements.length, - children.length - offset - length); + numChildren - offset - length); children = target; } + else + { + System.arraycopy(children, offset + length, children, + offset + elements.length, + numChildren - offset - length); + System.arraycopy(elements, 0, children, offset, elements.length); + } + numChildren += elements.length - length; + } /** * Returns a string representation of this element. @@ -2165,18 +2187,6 @@ private Position endPos; /** - * This gets possible added to the startOffset when a startOffset - * outside the document range is requested. - */ - private int startDelta; - - /** - * This gets possible added to the endOffset when a endOffset - * outside the document range is requested. - */ - private int endDelta; - - /** * Creates a new <code>LeafElement</code>. * * @param parent the parent of this <code>LeafElement</code> @@ -2188,17 +2198,10 @@ int end) { super(parent, attributes); - int len = content.length(); - startDelta = 0; - if (start > len) - startDelta = start - len; - endDelta = 0; - if (end > len) - endDelta = end - len; try { - startPos = createPosition(start - startDelta); - endPos = createPosition(end - endDelta); + startPos = createPosition(start); + endPos = createPosition(end); } catch (BadLocationException ex) { @@ -2281,7 +2284,7 @@ */ public int getEndOffset() { - return endPos.getOffset() + endDelta; + return endPos.getOffset(); } /** @@ -2307,7 +2310,7 @@ */ public int getStartOffset() { - return startPos.getOffset() + startDelta; + return startPos.getOffset(); } /** Index: javax/swing/text/JTextComponent.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/text/JTextComponent.java,v retrieving revision 1.59 retrieving revision 1.60 diff -u -b -r1.59 -r1.60 --- javax/swing/text/JTextComponent.java 20 Jun 2006 18:24:14 -0000 1.59 +++ javax/swing/text/JTextComponent.java 21 Jun 2006 17:04:41 -0000 1.60 @@ -42,6 +42,7 @@ import java.awt.AWTEvent; import java.awt.Color; +import java.awt.Container; import java.awt.Dimension; import java.awt.Insets; import java.awt.Point; @@ -1179,8 +1180,19 @@ public void setDocument(Document newDoc) { Document oldDoc = doc; + try + { + if (oldDoc instanceof AbstractDocument) + ((AbstractDocument) oldDoc).readLock(); + doc = newDoc; firePropertyChange("document", oldDoc, newDoc); + } + finally + { + if (oldDoc instanceof AbstractDocument) + ((AbstractDocument) oldDoc).readUnlock(); + } revalidate(); repaint(); } @@ -1657,10 +1669,12 @@ public boolean getScrollableTracksViewportWidth() { - if (getParent() instanceof JViewport) - return getParent().getWidth() > getPreferredSize().width; + boolean res = false;; + Container c = getParent(); + if (c instanceof JViewport) + res = ((JViewport) c).getExtentSize().width > getPreferredSize().width; - return false; + return res; } /** Index: javax/swing/text/PlainDocument.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/text/PlainDocument.java,v retrieving revision 1.21 retrieving revision 1.22 diff -u -b -r1.21 -r1.22 --- javax/swing/text/PlainDocument.java 6 Mar 2006 10:51:19 -0000 1.21 +++ javax/swing/text/PlainDocument.java 21 Jun 2006 17:04:41 -0000 1.22 @@ -105,10 +105,10 @@ protected AbstractDocument.AbstractElement createDefaultRoot() { BranchElement root = - (BranchElement) createBranchElement(null, SimpleAttributeSet.EMPTY); + (BranchElement) createBranchElement(null, null); Element[] array = new Element[1]; - array[0] = createLeafElement(root, SimpleAttributeSet.EMPTY, 0, 1); + array[0] = createLeafElement(root, null, 0, 1); root.replace(0, 0, array); return root; Index: javax/swing/text/rtf/RTFParser.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/text/rtf/RTFParser.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -b -r1.3 -r1.4 --- javax/swing/text/rtf/RTFParser.java 2 Jul 2005 20:32:51 -0000 1.3 +++ javax/swing/text/rtf/RTFParser.java 21 Jun 2006 17:04:41 -0000 1.4 @@ -140,9 +140,17 @@ parseHeader(); parseDocument(); - Token t2 = scanner.readToken(); - if (t2.type != Token.RCURLY) - throw new RTFParseException("expected right curly braces"); + Token t2 = scanner.peekToken(); + if (t2.type == Token.RCURLY) + { + // Eat the token. + scanner.readToken(); + } + else + { + // Ignore this for maximum robustness when file is broken. + System.err.println("RTF warning: expected right curly braces"); + } } Index: javax/swing/text/rtf/RTFScanner.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/text/rtf/RTFScanner.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -b -r1.3 -r1.4 --- javax/swing/text/rtf/RTFScanner.java 2 Jul 2005 20:32:51 -0000 1.3 +++ javax/swing/text/rtf/RTFScanner.java 21 Jun 2006 17:04:41 -0000 1.4 @@ -71,6 +71,11 @@ private StringBuffer buffer; /** + * Lookahead token. + */ + private Token lastToken; + + /** * Constructs a new RTFScanner without initializing the [EMAIL PROTECTED] Reader}. */ private RTFScanner() @@ -120,7 +125,7 @@ * * @throws IOException if the underlying stream has problems */ - public Token readToken() + private Token readTokenImpl() throws IOException { Token token = null; @@ -156,6 +161,27 @@ return token; } + Token peekToken() + throws IOException + { + lastToken = readTokenImpl(); + return lastToken; + } + + Token readToken() + throws IOException + { + Token token; + if (lastToken != null) + { + token = lastToken; + lastToken = null; + } + else + token = readTokenImpl(); + return token; + } + /** * Reads in a control word and optional parameter. *