From d700be3620c56891299685b8cd4d286a87f46628 Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Wed, 20 Jul 2016 17:11:41 +0300 Subject: [PATCH] fix paste in text fields (case when selection exists before paste) fixes regression after commit f27254d --- .../textarea/TextComponentCaretModel.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/textarea/TextComponentCaretModel.java b/platform/platform-impl/src/com/intellij/openapi/editor/textarea/TextComponentCaretModel.java index 0c61a42b704c..7390c2c856a9 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/textarea/TextComponentCaretModel.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/textarea/TextComponentCaretModel.java @@ -16,14 +16,14 @@ package com.intellij.openapi.editor.textarea; import com.intellij.openapi.editor.*; +import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.event.CaretListener; import com.intellij.openapi.editor.markup.TextAttributes; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import javax.swing.text.BadLocationException; -import javax.swing.text.JTextComponent; +import javax.swing.text.*; import java.util.Collections; import java.util.List; @@ -65,7 +65,19 @@ public class TextComponentCaretModel implements CaretModel { @Override public void moveToOffset(final int offset, boolean locateBeforeSoftWrap) { - myTextComponent.setCaretPosition(Math.min(offset, myTextComponent.getText().length())); + int targetOffset = Math.min(offset, myTextComponent.getText().length()); + int currentPosition = myTextComponent.getCaretPosition(); + // We try to preserve selection, to match EditorImpl behaviour. + // It's only possible though, if target offset is located at either end of existing selection. + if (targetOffset != currentPosition) { + if (targetOffset == myTextComponent.getCaret().getMark()) { + myTextComponent.setCaretPosition(currentPosition); + myTextComponent.moveCaretPosition(targetOffset); + } + else { + myTextComponent.setCaretPosition(targetOffset); + } + } } @Override