diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaTextAreaUI.java b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaTextAreaUI.java index 294df86da147..de00a8e00bb7 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaTextAreaUI.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaTextAreaUI.java @@ -17,14 +17,12 @@ package com.intellij.ide.ui.laf.darcula.ui; import com.intellij.ide.ui.laf.darcula.DarculaUIUtil; import com.intellij.openapi.util.SystemInfo; +import com.intellij.openapi.util.registry.Registry; import javax.swing.*; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicTextAreaUI; -import javax.swing.text.BadLocationException; -import javax.swing.text.DefaultEditorKit; -import javax.swing.text.JTextComponent; -import javax.swing.text.Position; +import javax.swing.text.*; import java.awt.event.KeyEvent; public class DarculaTextAreaUI extends BasicTextAreaUI{ @@ -51,4 +49,9 @@ public class DarculaTextAreaUI extends BasicTextAreaUI{ int position = DarculaUIUtil.getPatchedNextVisualPositionFrom(t, pos, direction); return position != -1 ? position : super.getNextVisualPositionFrom(t, pos, b, direction, biasRet); } + + @Override + protected Caret createCaret() { + return Registry.is("ide.text.mouse.selection.new") ? new TextFieldWithPopupHandlerUI.MyCaret(getComponent()) : super.createCaret(); + } } diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/TextFieldWithPopupHandlerUI.java b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/TextFieldWithPopupHandlerUI.java index e42dd5f3349d..94ea6706f6d4 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/TextFieldWithPopupHandlerUI.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/TextFieldWithPopupHandlerUI.java @@ -36,10 +36,7 @@ import javax.swing.event.DocumentListener; import javax.swing.plaf.FontUIResource; import javax.swing.plaf.UIResource; import javax.swing.plaf.basic.BasicTextFieldUI; -import javax.swing.text.BadLocationException; -import javax.swing.text.Document; -import javax.swing.text.JTextComponent; -import javax.swing.text.Position; +import javax.swing.text.*; import java.awt.*; import java.awt.event.*; import java.beans.PropertyChangeEvent; @@ -201,6 +198,11 @@ public abstract class TextFieldWithPopupHandlerUI extends BasicTextFieldUI imple return position != -1 ? position : super.getNextVisualPositionFrom(t, pos, b, direction, biasRet); } + @Override + protected Caret createCaret() { + return Registry.is("ide.text.mouse.selection.new") ? new MyCaret(getComponent()) : super.createCaret(); + } + @Override public boolean value(Object o) { if (o instanceof MouseEvent) { @@ -632,4 +634,24 @@ public abstract class TextFieldWithPopupHandlerUI extends BasicTextFieldUI imple return "clear"; } } + + static class MyCaret extends BasicCaret { + private final JTextComponent myComponent; + + public MyCaret(JTextComponent component) { + myComponent = component; + } + + @Override + public void mouseDragged(MouseEvent e) { + if (e.getID() == MouseEvent.MOUSE_DRAGGED && !myComponent.getText().contains("\n")) { + boolean consumed = e.isConsumed(); + e = new MouseEvent(e.getComponent(), e.getID(), e.getWhen(), e.getModifiers() | e.getModifiersEx(), e.getX(), + myComponent.getHeight() / 2, + e.getClickCount(), e.isPopupTrigger(), e.getButton()); + if (consumed) e.consume(); + } + super.mouseDragged(e); + } + } } diff --git a/platform/util/resources/misc/registry.properties b/platform/util/resources/misc/registry.properties index 5d4ff8a59a01..8d2cec5a3301 100644 --- a/platform/util/resources/misc/registry.properties +++ b/platform/util/resources/misc/registry.properties @@ -1079,6 +1079,8 @@ ide.text.effect.new.scale=true ide.text.effect.new.scale.description=Enables scalable effect painter for text ide.text.effect.new.metrics=true ide.text.effect.new.metrics.description=Use line metrics to calculate text offset in the effect painter +ide.text.mouse.selection.new=true +ide.text.mouse.selection.description=Use improved mouse-drag processing in single-line text components when mouse pointer is out of area ide.intellij.laf.win10.ui=true ide.intellij.laf.win10.restartRequired=true