Mercurial > hg > release > icedtea8-forest-3.0 > jdk
changeset 1703:ff468ef27959
6699856: Creating text in a JTextPane using Chinese text causes undesired behavior
Reviewed-by: peterz
author | gsm |
---|---|
date | Mon, 07 Sep 2009 12:27:53 +0400 |
parents | 281fbd82a971 |
children | 01c46cb72eb7 |
files | src/share/classes/javax/swing/JEditorPane.java src/share/classes/javax/swing/JTextPane.java src/share/classes/javax/swing/text/JTextComponent.java |
diffstat | 3 files changed, 31 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/javax/swing/JEditorPane.java Wed Sep 02 17:47:19 2009 +0400 +++ b/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 <code>null</code> */ + @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); }
--- a/src/share/classes/javax/swing/JTextPane.java Wed Sep 02 17:47:19 2009 +0400 +++ b/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); }
--- a/src/share/classes/javax/swing/text/JTextComponent.java Wed Sep 02 17:47:19 2009 +0400 +++ b/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(),