Index: javax/swing/JTextPane.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/JTextPane.java,v retrieving revision 1.10 diff -u -r1.10 JTextPane.java --- javax/swing/JTextPane.java 25 Aug 2005 20:53:05 -0000 1.10 +++ javax/swing/JTextPane.java 30 Sep 2005 19:48:26 -0000 @@ -179,8 +179,6 @@ doc.setCharacterAttributes(start, contentLength, getInputAttributes(), true); - // Set dot to new position. - setCaretPosition(start + contentLength); } catch (BadLocationException e) { Index: javax/swing/text/DefaultCaret.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/text/DefaultCaret.java,v retrieving revision 1.14 diff -u -r1.14 DefaultCaret.java --- javax/swing/text/DefaultCaret.java 13 Sep 2005 23:44:50 -0000 1.14 +++ javax/swing/text/DefaultCaret.java 30 Sep 2005 19:48:26 -0000 @@ -45,10 +45,14 @@ import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.util.EventListener; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; import javax.swing.event.EventListenerList; /** @@ -60,6 +64,80 @@ public class DefaultCaret extends Rectangle implements Caret, FocusListener, MouseListener, MouseMotionListener { + /** + * Listens for changes in the text component's document and updates the + * caret accordingly. + * + * @author Roman Kennke (address@hidden) + */ + private class DocumentHandler implements DocumentListener + { + /** + * Receives notification that some text attributes have changed. No action + * is taken here. + * + * @param event the document event + */ + public void changedUpdate(DocumentEvent event) + { + // Nothing to do here. + } + + /** + * Receives notification that some text has been removed from the text + * component. The caret is moved backwards accordingly. + * + * @param event the document event + */ + public void insertUpdate(DocumentEvent event) + { + int dot = getDot(); + setDot(dot + event.getLength()); + } + + /** + * Receives notification that some text has been inserte into the text + * component. The caret is moved forwards accordingly. + * + * @param event the document event + */ + public void removeUpdate(DocumentEvent event) + { + int dot = getDot(); + setDot(dot - event.getLength()); + } + } + + /** + * Listens for property changes on the text document. This is used to add and + * remove our document listener, if the document of the text component has + * changed. + * + * @author Roman Kennke (address@hidden) + */ + private class PropertyChangeHandler implements PropertyChangeListener + { + + /** + * Receives notification when a property has changed on the text component. + * This adds/removes our document listener from the text component's + * document when the document changes. + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) + { + if (e.getPropertyName().equals("document")) + { + Document oldDoc = (Document) e.getOldValue(); + oldDoc.removeDocumentListener(documentListener); + Document newDoc = (Document) e.getNewValue(); + newDoc.addDocumentListener(documentListener); + } + } + + } + /** The serialization UID (compatible with JDK1.5). */ private static final long serialVersionUID = 4325555698756477346L; @@ -74,6 +152,16 @@ protected EventListenerList listenerList = new EventListenerList(); /** + * Our document listener. + */ + DocumentListener documentListener; + + /** + * Our property listener. + */ + PropertyChangeListener propertyChangeListener; + + /** * The text component in which this caret is installed. */ private JTextComponent textComponent; @@ -251,6 +339,10 @@ textComponent.removeFocusListener(this); textComponent.removeMouseListener(this); textComponent.removeMouseMotionListener(this); + textComponent.getDocument().removeDocumentListener(documentListener); + documentListener = null; + textComponent.removePropertyChangeListener(propertyChangeListener); + propertyChangeListener = null; textComponent = null; } @@ -267,6 +359,10 @@ textComponent.addFocusListener(this); textComponent.addMouseListener(this); textComponent.addMouseMotionListener(this); + propertyChangeListener = new PropertyChangeHandler(); + textComponent.addPropertyChangeListener(propertyChangeListener); + documentListener = new DocumentHandler(); + textComponent.getDocument().addDocumentListener(documentListener); repaint(); } Index: javax/swing/text/JTextComponent.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/text/JTextComponent.java,v retrieving revision 1.37 diff -u -r1.37 JTextComponent.java --- javax/swing/text/JTextComponent.java 13 Sep 2005 23:44:50 -0000 1.37 +++ javax/swing/text/JTextComponent.java 30 Sep 2005 19:48:27 -0000 @@ -1414,6 +1414,7 @@ public synchronized void replaceSelection(String content) { + System.err.println("replaceSelection"); int dot = caret.getDot(); int mark = caret.getMark(); Index: javax/swing/text/DefaultEditorKit.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/text/DefaultEditorKit.java,v retrieving revision 1.21 diff -u -r1.21 DefaultEditorKit.java --- javax/swing/text/DefaultEditorKit.java 20 Sep 2005 19:22:14 -0000 1.21 +++ javax/swing/text/DefaultEditorKit.java 30 Sep 2005 19:48:27 -0000 @@ -222,9 +222,6 @@ { t.getDocument().insertString(t.getCaret().getDot(), event.getActionCommand(), null); - t.getCaret().setDot(Math.min(t.getCaret().getDot() + 1, - t.getDocument().getEndPosition() - .getOffset())); } catch (BadLocationException be) { Index: javax/swing/plaf/basic/BasicTextUI.java =================================================================== RCS file: /cvsroot/classpath/classpath/javax/swing/plaf/basic/BasicTextUI.java,v retrieving revision 1.42 diff -u -r1.42 BasicTextUI.java --- javax/swing/plaf/basic/BasicTextUI.java 29 Sep 2005 12:41:57 -0000 1.42 +++ javax/swing/plaf/basic/BasicTextUI.java 30 Sep 2005 19:48:29 -0000 @@ -381,9 +381,6 @@ Dimension size = textComponent.getSize(); rootView.insertUpdate(ev, new Rectangle(0, 0, size.width, size.height), rootView.getViewFactory()); - int caretPos = textComponent.getCaretPosition(); - if (caretPos >= ev.getOffset()) - textComponent.setCaretPosition(caretPos + ev.getLength()); } /** @@ -396,9 +393,6 @@ Dimension size = textComponent.getSize(); rootView.removeUpdate(ev, new Rectangle(0, 0, size.width, size.height), rootView.getViewFactory()); - int caretPos = textComponent.getCaretPosition(); - if (caretPos >= ev.getOffset()) - textComponent.setCaretPosition(ev.getOffset()); } }