import com.intellij.openapi.fileEditor.FileEditor
import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.progress.ProgressManager
-import com.intellij.openapi.util.Computable
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiJavaFile
import com.intellij.util.Consumer
}
public void testBlockSelection() {
- myFixture.configureByText "a.java", """
+ doTestBlockSelection """
+class Foo {{
+ <caret>tx;
+ tx;
+}}""", '\n', '''
+class Foo {{
+ toString()x;
+ toString()<caret>x;
+}}'''
+ }
+
+ public void testBlockSelectionTab() {
+ doTestBlockSelection """
+class Foo {{
+ <caret>tx;
+ tx;
+}}""", '\t', '''
+class Foo {{
+ toString();
+ toString()<caret>;
+}}'''
+ }
+
+ public void testBlockSelectionBackspace() {
+ doTestBlockSelection """
class Foo {{
<caret>t;
t;
-}}"""
- def caret = ApplicationManager.getApplication().runReadAction(new Computable<LogicalPosition>() {
- public LogicalPosition compute() {
- return myFixture.editor.offsetToLogicalPosition(myFixture.editor.caretModel.offset)
- }});
- edt { myFixture.editor.selectionModel.setBlockSelection(caret, new LogicalPosition(caret.line + 1, caret.column + 1)) }
- type 'toStr'
- assert lookup
- type '\n'
- myFixture.checkResult '''
+}}""", '\b\t', '''
class Foo {{
toString();
toString()<caret>;
}}'''
+ }
+ private doTestBlockSelection(final String textBefore, final String toType, final String textAfter) {
+ myFixture.configureByText "a.java", textBefore
+ edt {
+ def caret = myFixture.editor.offsetToLogicalPosition(myFixture.editor.caretModel.offset)
+ myFixture.editor.selectionModel.setBlockSelection(caret, new LogicalPosition(caret.line + 1, caret.column + 1))
+ }
+ type 'toStr'
+ assert lookup
+ type toType
+ myFixture.checkResult textAfter
def start = myFixture.editor.selectionModel.blockStart
def end = myFixture.editor.selectionModel.blockEnd
assert start.line == end.line - 1
final Editor editor = indicator.getEditor();
+ final int caretOffset = editor.getCaretModel().getOffset();
+ final int idDelta = indicator.getIdentifierEndOffset() - caretOffset;
+
WatchingInsertionContext context = null;
if (editor.getSelectionModel().hasBlockSelection() && editor.getSelectionModel().getBlockSelectionEnds().length > 0) {
List<RangeMarker> insertionPoints = new ArrayList<RangeMarker>();
List<RangeMarker> caretsAfter = new ArrayList<RangeMarker>();
for (RangeMarker insertionPoint : insertionPoints) {
if (insertionPoint.isValid()) {
- context = insertItem(indicator, item, completionChar, items, update, editor, insertionPoint.getStartOffset());
+ context = insertItem(indicator, item, completionChar, items, update, editor, insertionPoint.getStartOffset(), idDelta);
int offset = editor.getCaretModel().getOffset();
caretsAfter.add(editor.getDocument().createRangeMarker(offset, offset));
}
}
} else {
- context = insertItem(indicator, item, completionChar, items, update, editor, editor.getCaretModel().getOffset());
+ context = insertItem(indicator, item, completionChar, items, update, editor, caretOffset, idDelta);
}
final Runnable runnable = context.getLaterRunnable();
final char completionChar,
List<LookupElement> items,
final CompletionLookupArranger.StatisticsUpdate update,
- final Editor editor, final int caretOffset) {
+ final Editor editor, final int caretOffset, final int idDelta) {
editor.getCaretModel().moveToOffset(caretOffset);
final int initialStartOffset = caretOffset - item.getLookupString().length();
assert initialStartOffset >= 0 : "negative startOffset: " + caretOffset + "; " + item.getLookupString();
+ final int idEndOffset = caretOffset + Math.max(idDelta, 0);
+
indicator.getOffsetMap().addOffset(CompletionInitializationContext.START_OFFSET, initialStartOffset);
indicator.getOffsetMap().addOffset(CompletionInitializationContext.SELECTION_END_OFFSET, caretOffset);
+ indicator.getOffsetMap().addOffset(CompletionInitializationContext.IDENTIFIER_END_OFFSET, idEndOffset);
final WatchingInsertionContext context = new WatchingInsertionContext(indicator, completionChar, items, editor);
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
- final int idEndOffset = Math.max(caretOffset, indicator.getIdentifierEndOffset());
- indicator.getOffsetMap().addOffset(CompletionInitializationContext.IDENTIFIER_END_OFFSET, idEndOffset);
- int selEnd = indicator.getSelectionEndOffset();
- if (idEndOffset != selEnd && completionChar == Lookup.REPLACE_SELECT_CHAR) {
- editor.getDocument().deleteString(selEnd, idEndOffset);
+ if (caretOffset != idEndOffset && completionChar == Lookup.REPLACE_SELECT_CHAR) {
+ editor.getDocument().deleteString(caretOffset, idEndOffset);
}
- assert context.getStartOffset() >= 0 : "stale startOffset: was " + initialStartOffset + "; selEnd=" + selEnd + "; idEnd=" + idEndOffset + "; file=" + context.getFile();
- assert context.getTailOffset() >= 0 : "stale tail: was " + initialStartOffset + "; selEnd=" + selEnd + "; idEnd=" + idEndOffset + "; file=" + context.getFile();
+ assert context.getStartOffset() >= 0 : "stale startOffset: was " + initialStartOffset + "; selEnd=" + caretOffset + "; idEnd=" + idEndOffset + "; file=" + context.getFile();
+ assert context.getTailOffset() >= 0 : "stale tail: was " + initialStartOffset + "; selEnd=" + caretOffset + "; idEnd=" + idEndOffset + "; file=" + context.getFile();
item.handleInsert(context);
Project project = indicator.getProject();