IDEA-178622 Column selection mode is too slow

avoid unnecessary (intermediate) updates of system selection
This commit is contained in:
Dmitry Batrak
2017-09-11 19:15:01 +03:00
parent 1c983e3606
commit 37ff01edd4
2 changed files with 19 additions and 14 deletions
@@ -41,15 +41,12 @@ import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.DocumentUtil;
import com.intellij.util.diff.FilesTooBigForDiffException;
import com.intellij.util.text.CharArrayUtil;
import com.intellij.util.ui.EmptyClipboardOwner;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.TestOnly;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.util.List;
public class CaretImpl extends UserDataHolderBase implements Caret, Dumpable {
@@ -1195,20 +1192,11 @@ public class CaretImpl extends UserDataHolderBase implements Caret, Dumpable {
}
if (updateSystemSelection) {
updateSystemSelection();
myEditor.getCaretModel().updateSystemSelection();
}
});
}
private void updateSystemSelection() {
if (GraphicsEnvironment.isHeadless()) return;
final Clipboard clip = myEditor.getComponent().getToolkit().getSystemSelection();
if (clip != null) {
clip.setContents(new StringSelection(myEditor.getSelectionModel().getSelectedText(true)), EmptyClipboardOwner.INSTANCE);
}
}
@Override
public void removeSelection() {
if (myEditor.isStickySelection()) {
@@ -31,14 +31,19 @@ import com.intellij.openapi.editor.markup.TextAttributes;
import com.intellij.openapi.util.Disposer;
import com.intellij.util.EventDispatcher;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.EmptyClipboardOwner;
import gnu.trove.TIntArrayList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.TestOnly;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.*;
import java.util.List;
public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener, Disposable, Dumpable, InlayModel.Listener {
private final EditorImpl myEditor;
@@ -508,7 +513,7 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener,
myEditor.logicalPositionToOffset(caretState.getSelectionStart()),
myEditor.logicalToVisualPosition(caretState.getSelectionEnd()),
myEditor.logicalPositionToOffset(caretState.getSelectionEnd()),
true, updateSystemSelection, false);
true, false, false);
selectionStartsAfter.add(caret.getSelectionStart());
selectionEndsAfter.add(caret.getSelectionEnd());
}
@@ -522,6 +527,9 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener,
fireCaretRemoved(caret);
Disposer.dispose(caret);
}
if (updateSystemSelection) {
updateSystemSelection();
}
if (selectionStartsBefore != null) {
SelectionEvent event = new SelectionEvent(myEditor, selectionStartsBefore.toNativeArray(), selectionEndsBefore.toNativeArray(),
selectionStartsAfter.toNativeArray(), selectionEndsAfter.toNativeArray());
@@ -545,6 +553,15 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener,
}
}
void updateSystemSelection() {
if (GraphicsEnvironment.isHeadless()) return;
final Clipboard clip = myEditor.getComponent().getToolkit().getSystemSelection();
if (clip != null) {
clip.setContents(new StringSelection(myEditor.getSelectionModel().getSelectedText(true)), EmptyClipboardOwner.INSTANCE);
}
}
void fireCaretPositionChanged(CaretEvent caretEvent) {
myCaretListeners.getMulticaster().caretPositionChanged(caretEvent);
}