diff options
Diffstat (limited to 'libjava/classpath/javax/swing/text/StringContent.java')
| -rw-r--r-- | libjava/classpath/javax/swing/text/StringContent.java | 138 |
1 files changed, 118 insertions, 20 deletions
diff --git a/libjava/classpath/javax/swing/text/StringContent.java b/libjava/classpath/javax/swing/text/StringContent.java index 7db377a1c9b..0a31505f3a6 100644 --- a/libjava/classpath/javax/swing/text/StringContent.java +++ b/libjava/classpath/javax/swing/text/StringContent.java @@ -1,5 +1,5 @@ /* StringContent.java -- - Copyright (C) 2005 Free Software Foundation, Inc. + Copyright (C) 2005, 2006 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -54,7 +54,8 @@ import javax.swing.undo.UndoableEdit; * * <p>Do not use this class for large size.</p> */ -public final class StringContent implements AbstractDocument.Content, Serializable +public final class StringContent + implements AbstractDocument.Content, Serializable { /** The serialization UID (compatible with JDK1.5). */ private static final long serialVersionUID = 4755994433709540381L; @@ -87,7 +88,8 @@ public final class StringContent implements AbstractDocument.Content, Serializab try { StringContent.this.checkLocation(this.start, this.length); - this.redoContent = new String(StringContent.this.content, this.start, this.length); + this.redoContent = new String(StringContent.this.content, this.start, + this.length); StringContent.this.remove(this.start, this.length); } catch (BadLocationException b) @@ -175,11 +177,20 @@ public final class StringContent implements AbstractDocument.Content, Serializab } } + /** + * Creates a new instance containing the string "\n". + */ public StringContent() { this(1); } + /** + * Creates a new instance containing the string "\n". + * + * @param initialLength the initial length of the underlying character + * array used to store the content. + */ public StringContent(int initialLength) { super(); @@ -198,7 +209,7 @@ public final class StringContent implements AbstractDocument.Content, Serializab Iterator iter = this.positions.iterator(); while(iter.hasNext()) { - Position p = (Position)iter.next(); + Position p = (Position) iter.next(); if ((offset <= p.getOffset()) && (p.getOffset() <= (offset + length))) refPos.add(p); @@ -206,6 +217,16 @@ public final class StringContent implements AbstractDocument.Content, Serializab return refPos; } + /** + * Creates a position reference for the character at the given offset. The + * position offset will be automatically updated when new characters are + * inserted into or removed from the content. + * + * @param offset the character offset. + * + * @throws BadLocationException if offset is outside the bounds of the + * content. + */ public Position createPosition(int offset) throws BadLocationException { if (offset < this.count || offset > this.count) @@ -215,11 +236,27 @@ public final class StringContent implements AbstractDocument.Content, Serializab return sp; } + /** + * Returns the length of the string content, including the '\n' character at + * the end. + * + * @return The length of the string content. + */ public int length() { return this.count; } + /** + * Inserts <code>str</code> at the given position and returns an + * {@link UndoableEdit} that enables undo/redo support. + * + * @param where the insertion point (must be less than + * <code>length()</code>). + * @param str the string to insert (<code>null</code> not permitted). + * + * @return An object that can undo the insertion. + */ public UndoableEdit insertString(int where, String str) throws BadLocationException { @@ -235,13 +272,15 @@ public final class StringContent implements AbstractDocument.Content, Serializab if (where > 0) System.arraycopy(this.content, 0, temp, 0, where); System.arraycopy(insert, 0, temp, where, insert.length); - System.arraycopy(this.content, where, temp, (where + insert.length), (temp.length - where - insert.length)); + System.arraycopy(this.content, where, temp, (where + insert.length), + (temp.length - where - insert.length)); if (this.content.length < temp.length) this.content = new char[temp.length]; // Copy the result in the original char array. System.arraycopy(temp, 0, this.content, 0, temp.length); // Move all the positions. - Vector refPos = getPositionsInRange(this.positions, where, temp.length - where); + Vector refPos = getPositionsInRange(this.positions, where, + temp.length - where); Iterator iter = refPos.iterator(); while (iter.hasNext()) { @@ -252,20 +291,35 @@ public final class StringContent implements AbstractDocument.Content, Serializab return iundo; } + /** + * Removes the specified range of characters and returns an + * {@link UndoableEdit} that enables undo/redo support. + * + * @param where the starting index. + * @param nitems the number of characters. + * + * @return An object that can undo the removal. + * + * @throws BadLocationException if the character range extends outside the + * bounds of the content OR includes the last character. + */ public UndoableEdit remove(int where, int nitems) throws BadLocationException { - checkLocation(where, nitems); + checkLocation(where, nitems + 1); char[] temp = new char[(this.content.length - nitems)]; this.count = this.count - nitems; - RemoveUndo rundo = new RemoveUndo(where, new String(this.content, where, nitems)); + RemoveUndo rundo = new RemoveUndo(where, new String(this.content, where, + nitems)); // Copy array. System.arraycopy(this.content, 0, temp, 0, where); - System.arraycopy(this.content, where + nitems, temp, where, this.content.length - where - nitems); + System.arraycopy(this.content, where + nitems, temp, where, + this.content.length - where - nitems); this.content = new char[temp.length]; // Then copy the result in the original char array. System.arraycopy(temp, 0, this.content, 0, this.content.length); // Move all the positions. - Vector refPos = getPositionsInRange(this.positions, where, this.content.length + nitems - where); + Vector refPos = getPositionsInRange(this.positions, where, + this.content.length + nitems - where); Iterator iter = refPos.iterator(); while (iter.hasNext()) { @@ -278,31 +332,75 @@ public final class StringContent implements AbstractDocument.Content, Serializab return rundo; } + /** + * Returns a new <code>String</code> containing the characters in the + * specified range. + * + * @param where the start index. + * @param len the number of characters. + * + * @return A string. + * + * @throws BadLocationException if the requested range of characters extends + * outside the bounds of the content. + */ public String getString(int where, int len) throws BadLocationException { checkLocation(where, len); - return new String (this.content, where, len); + return new String(this.content, where, len); } - public void getChars(int where, int len, Segment txt) throws BadLocationException + /** + * Updates <code>txt</code> to contain a direct reference to the underlying + * character array. + * + * @param where the index of the first character. + * @param len the number of characters. + * @param txt a carrier for the return result (<code>null</code> not + * permitted). + * + * @throws BadLocationException if the requested character range is not + * within the bounds of the content. + * @throws NullPointerException if <code>txt</code> is <code>null</code>. + */ + public void getChars(int where, int len, Segment txt) + throws BadLocationException { checkLocation(where, len); - if (txt != null) - { - txt.array = this.content; - txt.offset = where; - txt.count = len; - } + txt.array = this.content; + txt.offset = where; + txt.count = len; } - // This is package-private to avoid an accessor method. + + /** + * @specnote This method is not very well specified and the positions vector + * is implementation specific. The undo positions are managed + * differently in this implementation, this method is only here + * for binary compatibility. + */ + protected void updateUndoPositions(Vector positions) + { + // We do nothing here. + } + + /** + * A utility method that checks the validity of the specified character + * range. + * + * @param where the first character in the range. + * @param len the number of characters in the range. + * + * @throws BadLocationException if the specified range is not within the + * bounds of the content. + */ void checkLocation(int where, int len) throws BadLocationException { if (where < 0) throw new BadLocationException("Invalid location", 1); else if (where > this.count) throw new BadLocationException("Invalid location", this.count); - else if ((where + len)>this.count) + else if ((where + len) > this.count) throw new BadLocationException("Invalid range", this.count); } |

