# HG changeset patch # User gsm # Date 1252312073 -14400 # Node ID 4195b035138ffbf7bf16db59834297c9b3d93d22 # Parent d0ecbd7075b156e1542c40f23633a085b6a6c306 6699856: Creating text in a JTextPane using Chinese text causes undesired behavior Reviewed-by: peterz diff -r d0ecbd7075b1 -r 4195b035138f jdk/src/share/classes/javax/swing/JEditorPane.java --- a/jdk/src/share/classes/javax/swing/JEditorPane.java Wed Sep 02 17:47:19 2009 +0400 +++ b/jdk/src/share/classes/javax/swing/JEditorPane.java Mon Sep 07 12:27:53 2009 +0400 @@ -1125,6 +1125,7 @@ * @param content the content to replace the selection with. This * value can be null */ + @Override public void replaceSelection(String content) { if (! isEditable()) { UIManager.getLookAndFeel().provideErrorFeedback(JEditorPane.this); @@ -1135,6 +1136,7 @@ try { Document doc = getDocument(); Caret caret = getCaret(); + boolean composedTextSaved = saveComposedText(caret.getDot()); int p0 = Math.min(caret.getDot(), caret.getMark()); int p1 = Math.max(caret.getDot(), caret.getMark()); if (doc instanceof AbstractDocument) { @@ -1150,6 +1152,9 @@ getInputAttributes()); } } + if (composedTextSaved) { + restoreComposedText(); + } } catch (BadLocationException e) { UIManager.getLookAndFeel().provideErrorFeedback(JEditorPane.this); } diff -r d0ecbd7075b1 -r 4195b035138f jdk/src/share/classes/javax/swing/JTextPane.java --- a/jdk/src/share/classes/javax/swing/JTextPane.java Wed Sep 02 17:47:19 2009 +0400 +++ b/jdk/src/share/classes/javax/swing/JTextPane.java Mon Sep 07 12:27:53 2009 +0400 @@ -170,6 +170,7 @@ * * @param content the content to replace the selection with */ + @Override public void replaceSelection(String content) { replaceSelection(content, true); } @@ -183,6 +184,7 @@ if (doc != null) { try { Caret caret = getCaret(); + boolean composedTextSaved = saveComposedText(caret.getDot()); int p0 = Math.min(caret.getDot(), caret.getMark()); int p1 = Math.max(caret.getDot(), caret.getMark()); AttributeSet attr = getInputAttributes().copyAttributes(); @@ -197,6 +199,9 @@ doc.insertString(p0, content, attr); } } + if (composedTextSaved) { + restoreComposedText(); + } } catch (BadLocationException e) { UIManager.getLookAndFeel().provideErrorFeedback(JTextPane.this); } diff -r d0ecbd7075b1 -r 4195b035138f jdk/src/share/classes/javax/swing/text/JTextComponent.java --- a/jdk/src/share/classes/javax/swing/text/JTextComponent.java Wed Sep 02 17:47:19 2009 +0400 +++ b/jdk/src/share/classes/javax/swing/text/JTextComponent.java Mon Sep 07 12:27:53 2009 +0400 @@ -4815,7 +4815,18 @@ new AttributedString(text, composedIndex, text.getEndIndex())); } - private boolean saveComposedText(int pos) { + /** + * Saves composed text around the specified position. + * + * The composed text (if any) around the specified position is saved + * in a backing store and removed from the document. + * + * @param pos document position to identify the composed text location + * @return {@code true} if the composed text exists and is saved, + * {@code false} otherwise + * @see #restoreComposedText + */ + protected boolean saveComposedText(int pos) { if (composedTextExists()) { int start = composedTextStart.getOffset(); int len = composedTextEnd.getOffset() - @@ -4830,7 +4841,15 @@ return false; } - private void restoreComposedText() { + /** + * Restores composed text previously saved by {@code saveComposedText}. + * + * The saved composed text is inserted back into the document. This method + * should be invoked only if {@code saveComposedText} returns {@code true}. + * + * @see #saveComposedText + */ + protected void restoreComposedText() { Document doc = getDocument(); try { doc.insertString(caret.getDot(),