PlainDocument.insertUpdate needs to explicitly handle the special case
of an insertion happening right after a newline.  Apparently this worked
by accident before, and a recent patch that Lillian and I made to
GapContent exposed the weakness.  This is fixed and committed now.

2006-01-09  Anthony Balkissoon  <[EMAIL PROTECTED]>

        * javax/swing/text/PlainDocument.java:
        (insertUpdate): Handle special case of an insertion immediately 
        following a newline character.

--Tony
? include/gnu_java_net_PlainDatagramSocketImpl.h
? include/gnu_java_net_PlainSocketImpl.h
Index: javax/swing/text/PlainDocument.java
===================================================================
RCS file: /cvsroot/classpath/classpath/javax/swing/text/PlainDocument.java,v
retrieving revision 1.18
diff -u -r1.18 PlainDocument.java
--- javax/swing/text/PlainDocument.java	16 Nov 2005 18:31:42 -0000	1.18
+++ javax/swing/text/PlainDocument.java	9 Jan 2006 21:53:51 -0000
@@ -113,6 +113,46 @@
     int elementIndex = rootElement.getElementIndex(offset);
     Element firstElement = rootElement.getElement(elementIndex);
     
+    // If we're inserting immediately after a newline we have to fix the 
+    // Element structure.
+    if (offset > 0)
+      {
+        try
+        {
+          String s = getText(offset - 1, 1);
+          if (s.equals("\n"))
+            {
+              int newEl2EndOffset = end;
+              boolean replaceNext = false;
+              if (rootElement.getElementCount() > elementIndex + 1)
+                {
+                  replaceNext = true;
+                  newEl2EndOffset = 
+                    rootElement.getElement(elementIndex + 1).getEndOffset();
+                }
+              Element newEl1 = 
+                createLeafElement(rootElement, firstElement.getAttributes(), 
+                                  firstElement.getStartOffset(), offset);
+              Element newEl2 = 
+                createLeafElement (rootElement, firstElement.getAttributes(), 
+                                   offset, newEl2EndOffset);
+              if (replaceNext)
+                rootElement.replace(elementIndex, 2, new Element[] { newEl1, newEl2 });
+              else
+                rootElement.replace(elementIndex, 1, new Element[] { newEl1, newEl2 });
+              firstElement = newEl2;
+              elementIndex ++;
+            }
+        }
+        catch (BadLocationException ble)
+        {          
+          // This shouldn't happen.
+          AssertionError ae = new AssertionError();
+          ae.initCause(ble);
+          throw ae;
+        }        
+      }
+
     // added and removed are Element arrays used to add an ElementEdit
     // to the DocumentEvent if there were entire lines added or removed.
     Element[] removed = new Element[1];
_______________________________________________
Classpath-patches mailing list
Classpath-patches@gnu.org
http://lists.gnu.org/mailman/listinfo/classpath-patches

Reply via email to