IDEA-167746 Carry completion list over to the next line on Shift+Enter

This commit is contained in:
peter
2017-05-12 22:54:22 +02:00
parent 32be586eee
commit fb4599a4f0
5 changed files with 72 additions and 0 deletions
@@ -1840,4 +1840,16 @@ ita<caret>
assert lookup
}
void "test don't close lookup when starting a new line"() {
myFixture.configureByText 'a.java', 'class Foo {{ "abc"<caret> }}'
type '.'
assert lookup
edt {
myFixture.performEditorAction(IdeActions.ACTION_EDITOR_START_NEW_LINE)
assert lookup
assert lookup.lookupStart == myFixture.editor.caretModel.offset
assert myFixture.editor.document.text.contains('\n')
}
}
}
@@ -376,6 +376,11 @@ public class LookupImpl extends LightweightHint implements LookupEx, Disposable
return true;
}
void moveToCaretPosition() {
myOffsets.destabilizeLookupStart();
refreshUi(false, true);
}
private boolean updateList(boolean onExplicitAction, boolean reused) {
if (!ApplicationManager.getApplication().isUnitTestMode()) {
ApplicationManager.getApplication().assertIsDispatchThread();
@@ -86,6 +86,10 @@ public class LookupOffsets implements DocumentListener {
return true;
}
void destabilizeLookupStart() {
myStableStart = false;
}
void checkMinPrefixLengthChanges(Collection<LookupElement> items, LookupImpl lookup) {
if (myStableStart) return;
if (!lookup.isCalculating() && !items.isEmpty()) {
@@ -0,0 +1,50 @@
/*
* Copyright 2000-2017 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.codeInsight.lookup.impl;
import com.intellij.codeInsight.lookup.LookupManager;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorActionHandler;
import org.jetbrains.annotations.Nullable;
/**
* @author peter
*/
public class StartNewLineHandler extends EditorActionHandler {
private final EditorActionHandler myOriginalHandler;
public StartNewLineHandler(EditorActionHandler originalHandler) {
myOriginalHandler = originalHandler;
}
@Override
protected void doExecute(Editor editor, @Nullable Caret caret, DataContext dataContext) {
Runnable callOriginal = () -> {
if (myOriginalHandler != null) {
myOriginalHandler.execute(editor, caret, dataContext);
}
};
LookupImpl lookup = (LookupImpl)LookupManager.getActiveLookup(editor);
if (lookup != null && lookup.getLookupStart() == lookup.getLookupOriginalStart()) {
lookup.performGuardedChange(callOriginal);
lookup.moveToCaretPosition();
} else {
callOriginal.run();
}
}
}
@@ -723,6 +723,7 @@
<editorActionHandler action="EditorLeft" implementationClass="com.intellij.codeInsight.lookup.impl.LookupActionHandler$LeftHandler"/>
<editorActionHandler action="EditorRight" implementationClass="com.intellij.codeInsight.lookup.impl.LookupActionHandler$RightHandler"/>
<editorActionHandler action="EditorBackSpace" implementationClass="com.intellij.codeInsight.lookup.impl.BackspaceHandler" id="backspace.lookup"/>
<editorActionHandler action="EditorStartNewLine" implementationClass="com.intellij.codeInsight.lookup.impl.StartNewLineHandler" id="backspace.lookup"/>
<!-- CodeInsightSettings -->
<editorActionHandler action="EditorEnter" implementationClass="com.intellij.codeInsight.editorActions.EnterHandler" id="editorEnter"/>