/*
* 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);
}
}