/* * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.intellij.openapi.editor; import com.intellij.openapi.actionSystem.IdeActions; import com.intellij.openapi.actionSystem.MouseShortcut; import com.intellij.openapi.editor.ex.EditorSettingsExternalizable; import com.intellij.openapi.editor.impl.AbstractEditorTest; import com.intellij.openapi.keymap.Keymap; import com.intellij.openapi.keymap.KeymapManager; import com.intellij.testFramework.EditorTestUtil; import com.intellij.testFramework.TestFileType; import java.awt.event.InputEvent; public class EditorMultiCaretTest extends AbstractEditorTest { private boolean myStoredVirtualSpaceSetting; public void setUp() throws Exception { super.setUp(); myStoredVirtualSpaceSetting = EditorSettingsExternalizable.getInstance().isVirtualSpace(); EditorSettingsExternalizable.getInstance().setVirtualSpace(false); } public void tearDown() throws Exception { EditorSettingsExternalizable.getInstance().setVirtualSpace(myStoredVirtualSpaceSetting); super.tearDown(); } public void testCaretAddingAndRemoval() throws Exception { init("some text\n" + "another line", TestFileType.TEXT); mouse().alt().shift().clickAt(1,1); // alt-shift-click in a 'free space' checkResultByText("some text\n" + "another line"); mouse().alt().shift().clickAt(0, 8); // alt-shift-click in existing selection checkResultByText("some text\n" + "another line"); mouse().alt().shift().clickAt(0, 6); // alt-shift-click at existing caret with selection checkResultByText("some text\n" + "another line"); mouse().alt().shift().clickAt(1, 1); // alt-shift-click at the sole caret checkResultByText("some text\n" + "another line"); mouse().alt().shift().clickAt(0, 30); // alt-shift-click in virtual space checkResultByText("some text\n" + "another line"); mouse().clickAt(0, 0); // plain mouse click checkResultByText("some text\n" + "another line"); } public void testCustomShortcut() throws Exception { Keymap keymap = KeymapManager.getInstance().getActiveKeymap(); MouseShortcut shortcut = new MouseShortcut(1, InputEvent.ALT_DOWN_MASK, 1); try { keymap.addShortcut(IdeActions.ACTION_EDITOR_ADD_OR_REMOVE_CARET, shortcut); init("text", TestFileType.TEXT); mouse().alt().clickAt(0, 2); checkResultByText("text"); } finally { keymap.removeShortcut(IdeActions.ACTION_EDITOR_ADD_OR_REMOVE_CARET, shortcut); } } public void testAltDragStartingFromWithinLine() throws Exception { init("line\n" + "long line\n" + "very long line\n" + "long line\n" + "line", TestFileType.TEXT); setEditorVisibleSize(1000, 1000); mouse().alt().pressAt(1, 6); checkResultByText("line\n" + "long line\n" + "very long line\n" + "long line\n" + "line"); mouse().alt().dragTo(4, 6); checkResultByText("line\n" + "long line\n" + "very long line\n" + "long line\n" + "line"); mouse().alt().dragTo(4, 8); checkResultByText("line\n" + "long line\n" + "very long line\n" + "long line\n" + "line"); mouse().alt().dragTo(4, 10).release(); checkResultByText("line\n" + "long line\n" + "very long line\n" + "long line\n" + "line"); } public void testMiddleButtonDragStartingFromVirtualSpace() throws Exception { init("line\n" + "long line\n" + "very long line\n" + "long line\n" + "line", TestFileType.TEXT); setEditorVisibleSize(1000, 1000); mouse().middle().pressAt(1, 17); checkResultByText("line\n" + "long line\n" + "very long line\n" + "long line\n" + "line"); mouse().middle().dragTo(2, 16); checkResultByText("line\n" + "long line\n" + "very long line\n" + "long line\n" + "line"); mouse().middle().dragTo(3, 12); checkResultByText("line\n" + "long line\n" + "very long line\n" + "long line\n" + "line"); mouse().middle().dragTo(3, 6).release(); checkResultByText("line\n" + "long line\n" + "very long line\n" + "long line\n" + "line"); } public void testAltOnOffWhileDragging() throws Exception { init("line1\n" + "line2\n" + "line3", TestFileType.TEXT); setEditorVisibleSize(1000, 1000); mouse().clickAt(0, 1).dragTo(1, 2); checkResultByText("line1\n" + "line2\n" + "line3"); mouse().alt().dragTo(1, 3); checkResultByText("line1\n" + "line2\n" + "line3"); mouse().dragTo(2, 4).release(); checkResultByText("line1\n" + "line2\n" + "line3"); } public void testTyping() throws Exception { init("some text\n" + "some other text\n" + "another line", TestFileType.TEXT ); type('A'); checkResultByText("someA textA\n" + "some A A\n" + "A line"); } public void testCopyPaste() throws Exception { init("one two \n" + "three four ", TestFileType.TEXT); executeAction("EditorCopy"); executeAction("EditorLineEnd"); executeAction("EditorPaste"); checkResultByText("one twoone \n" + "three fourthree "); } public void testCutAndPaste() throws Exception { init("one two \n" + "three four ", TestFileType.TEXT ); executeAction("EditorCut"); executeAction("EditorLineEnd"); executeAction("EditorPaste"); checkResultByText(" twoone \n" + " fourthree "); } public void testPasteSingleItem() throws Exception { init("one two \n" + "three four ", TestFileType.TEXT); executeAction("EditorCopy"); executeAction("EditorCloneCaretBelow"); executeAction("EditorLineEnd"); executeAction("EditorPaste"); checkResultByText("one twoone \n" + "three fourone "); } public void testCutAndPasteMultiline() throws Exception { init("one two \n" + "three four \n" + "five six \n" + "seven eight", TestFileType.TEXT ); executeAction("EditorCut"); executeAction("EditorLineEnd"); executeAction("EditorPaste"); checkResultByText("one fourtwo \n" + "three \n" + "five eightsix \n" + "seven"); } public void testEscapeAfterDragDown() throws Exception { init("line1\n" + "line2", TestFileType.TEXT ); setEditorVisibleSize(1000, 1000); mouse().alt().clickAt(0, 1).dragTo(1, 2).release(); executeAction("EditorEscape"); checkResultByText("line1\n" + "line2"); } public void testEscapeAfterDragUp() throws Exception { init("line1\n" + "line2", TestFileType.TEXT); setEditorVisibleSize(1000, 1000); mouse().alt().clickAt(1, 1).dragTo(0, 2).release(); executeAction("EditorEscape"); checkResultByText("line1\n" + "line2"); } public void testAltShiftDoubleClick() throws Exception { init("quick brown fox", TestFileType.TEXT); mouse().alt().shift().doubleClickAt(0, 8); checkResultByText("quick brown fox"); } public void testAltShiftDoubleClickAtExistingCaret() throws Exception { init("quick brown fox", TestFileType.TEXT); mouse().alt().shift().doubleClickAt(0, 8); checkResultByText("quick brown fox"); } public void testAltShiftTripleClick() throws Exception { init("quick\n" + "brown\n" + "fox", TestFileType.TEXT ); mouse().alt().shift().tripleClickAt(1, 2); checkResultByText("quick\n" + "brown\n" + "fox"); } public void testAltShiftTripleClickAtExistingCaret() throws Exception { init("quick\n" + "brown\n" + "fox", TestFileType.TEXT); mouse().alt().shift().tripleClickAt(1, 2); checkResultByText("quick\n" + "brown\n" + "fox"); } public void testCaretPositionsRecalculationOnDocumentChange() throws Exception { init("\n" + "word\n" + "some long prefix word-suffix", TestFileType.TEXT); EditorTestUtil.configureSoftWraps(myEditor, 17); // wrapping right before 'word-suffix' delete(); checkResultByText("\n" + "\n" + "some long prefix -suffix"); verifySoftWrapPositions(19); } }