IDEA-177568 Weird mouse selection

This commit is contained in:
Vassiliy.Kudryashov
2017-08-15 16:42:18 +03:00
parent 375f882a51
commit 2f92fb6e96
3 changed files with 35 additions and 8 deletions
@@ -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();
}
}
@@ -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);
}
}
}
@@ -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