@NotNull private LookupImpl obtainLookup(Editor editor) { CompletionAssertions.checkEditorValid(editor); LookupImpl existing = (LookupImpl) LookupManager.getActiveLookup(editor); if (existing != null && existing.isCompletion()) { existing.markReused(); if (!autopopup) { existing.setFocusDegree(LookupImpl.FocusDegree.FOCUSED); } return existing; } LookupImpl lookup = (LookupImpl) LookupManager.getInstance(editor.getProject()) .createLookup( editor, LookupElement.EMPTY_ARRAY, "", new LookupArranger.DefaultArranger()); if (editor.isOneLineMode()) { lookup.setCancelOnClickOutside(true); lookup.setCancelOnOtherWindowOpen(true); } lookup.setFocusDegree( autopopup ? LookupImpl.FocusDegree.UNFOCUSED : LookupImpl.FocusDegree.FOCUSED); return lookup; }
@Override public void execute(@NotNull final Editor editor, final DataContext dataContext) { final LookupImpl lookup = (LookupImpl) LookupManager.getActiveLookup(editor); if (lookup == null) { throw new AssertionError( "The last lookup disposed at: " + LookupImpl.getLastLookupDisposeTrace() + "\n-----------------------\n"); } if (finishingChar == Lookup.NORMAL_SELECT_CHAR) { if (!lookup.isFocused()) { FeatureUsageTracker.getInstance() .triggerFeatureUsed(CodeCompletionFeatures.EDITING_COMPLETION_CONTROL_ENTER); } } else if (finishingChar == Lookup.COMPLETE_STATEMENT_SELECT_CHAR) { FeatureUsageTracker.getInstance() .triggerFeatureUsed(CodeCompletionFeatures.EDITING_COMPLETION_FINISH_BY_SMART_ENTER); } else if (finishingChar == Lookup.REPLACE_SELECT_CHAR) { FeatureUsageTracker.getInstance() .triggerFeatureUsed(CodeCompletionFeatures.EDITING_COMPLETION_REPLACE); } else if (finishingChar == '.') { FeatureUsageTracker.getInstance() .triggerFeatureUsed(CodeCompletionFeatures.EDITING_COMPLETION_FINISH_BY_CONTROL_DOT); } lookup.finishLookup(finishingChar); }
@Override protected void complete(final int time) { new CodeCompletionHandlerBase(type, false, false, true) .invokeCompletion(getProject(), getEditor(), time, false); Lookup lookup = LookupManager.getActiveLookup(myEditor); myItems = lookup == null ? null : lookup.getItems().toArray(LookupElement.EMPTY_ARRAY); myPrefix = lookup == null ? null : lookup.itemPattern(lookup.getItems().get(0)); }
public void update(final AnActionEvent e) { final EditorEx editor = myLanguageConsole.getConsoleEditor(); final Lookup lookup = LookupManager.getActiveLookup(editor); e.getPresentation() .setEnabled( !editor.isRendererMode() && !myProcessHandler.isProcessTerminated() && (lookup == null || !(lookup.isCompletion() && lookup.isFocused()))); }
public void closeAndFinish(boolean hideLookup) { if (!myLookup.isLookupDisposed()) { Lookup lookup = LookupManager.getActiveLookup(myEditor); LOG.assertTrue(lookup == myLookup, "lookup changed: " + lookup + "; " + this); } myLookup.removeLookupListener(myLookupListener); finishCompletionProcess(true); CompletionServiceImpl.assertPhase(CompletionPhase.NoCompletion.getClass()); if (hideLookup) { LookupManager.getInstance(getProject()).hideActiveLookup(); } }
@Override public void actionPerformed(AnActionEvent e) { FeatureUsageTracker.getInstance() .triggerFeatureUsed(CodeCompletionFeatures.EDITING_COMPLETION_CONTROL_ARROWS); LookupImpl lookup = (LookupImpl) LookupManager.getActiveLookup(CommonDataKeys.EDITOR.getData(e.getDataContext())); assert lookup != null; lookup.hide(); ActionManager.getInstance() .getAction(IdeActions.ACTION_EDITOR_MOVE_CARET_DOWN) .actionPerformed(e); }
@Override protected boolean isAvailable(PsiElement element, Editor editor, PsiFile file) { final PsiElement nameSuggestionContext = file.findElementAt(editor.getCaretModel().getOffset()); if (element == null && LookupManager.getActiveLookup(editor) != null) { element = PsiTreeUtil.getParentOfType(nameSuggestionContext, PsiNamedElement.class); } final RefactoringSupportProvider supportProvider = element != null ? LanguageRefactoringSupport.INSTANCE.forLanguage(element.getLanguage()) : null; return editor.getSettings().isVariableInplaceRenameEnabled() && supportProvider != null && supportProvider.isMemberInplaceRenameAvailable(element, nameSuggestionContext); }
public void perform(final boolean generatePrivate) { final Runnable runnable = new Runnable() { public void run() { final DocumentEx document = (DocumentEx) myEditor.getDocument(); int exprOffset = myExprMarker.getStartOffset(); final int lineOffset = getLineOffset(document, exprOffset); if (generatePrivate) { final Collection<RangeMarker> leftGreedyMarker = ContainerUtil.newArrayList(); final Collection<RangeMarker> emptyMarkers = ContainerUtil.newArrayList(); for (RangeHighlighter rangeHighlighter : myEditor.getMarkupModel().getAllHighlighters()) { collectRangeMarker(rangeHighlighter, lineOffset, leftGreedyMarker, emptyMarkers); } document.processRangeMarkers( new Processor<RangeMarker>() { @Override public boolean process(RangeMarker rangeMarker) { collectRangeMarker(rangeMarker, lineOffset, leftGreedyMarker, emptyMarkers); return true; } }); setLeftGreedy(leftGreedyMarker, false); setRightGreedy(emptyMarkers, true); // workaround for shifting empty ranges to the left document.insertString(lineOffset, " "); document.insertString(lineOffset, PRIVATE); document.deleteString( lineOffset + PRIVATE.length(), lineOffset + PRIVATE.length() + 1); setLeftGreedy(leftGreedyMarker, true); setRightGreedy(emptyMarkers, false); } else { int idx = document.getText().indexOf(PRIVATE, lineOffset); if (idx > -1 && idx < exprOffset) { document.deleteString(idx, idx + PRIVATE.length()); } } PsiDocumentManager.getInstance(myProject).commitDocument(document); } }; final LookupImpl lookup = (LookupImpl) LookupManager.getActiveLookup(myEditor); if (lookup != null) { lookup.performGuardedChange(runnable); } else { runnable.run(); } }
@Override public void execute(Editor editor, Caret caret, DataContext dataContext) { LookupImpl lookup = (LookupImpl) LookupManager.getActiveLookup(editor); if (lookup == null || !lookup.isAvailableToUser() || myRequireFocusedLookup && !lookup.isFocused()) { Project project = editor.getProject(); if (project != null) { LookupManager.getInstance(project).hideActiveLookup(); } myOriginalHandler.executeInCaretContext(editor, caret, dataContext); return; } lookup.markSelectionTouched(); executeInLookup(lookup, dataContext, caret); }
@Override public boolean isEnabled(Editor editor, DataContext dataContext) { LookupImpl lookup = (LookupImpl) LookupManager.getActiveLookup(editor); if (lookup == null) return false; if (!lookup.isAvailableToUser()) return false; if (focusedOnly && !CompletionPreview.hasPreview(lookup) && !lookup.isFocused()) return false; if (finishingChar == Lookup.NORMAL_SELECT_CHAR && hasTemplatePrefix(lookup, TemplateSettings.ENTER_CHAR) || finishingChar == Lookup.REPLACE_SELECT_CHAR && hasTemplatePrefix(lookup, TemplateSettings.TAB_CHAR)) { return false; } if (finishingChar == Lookup.REPLACE_SELECT_CHAR) { if (lookup.isFocused()) { return true; } return !lookup.getItems().isEmpty(); } return true; }
@Override public void invoke( @NotNull final Project project, @NotNull Editor editor, @NotNull PsiFile file) { PsiDocumentManager.getInstance(project).commitAllDocuments(); if (editor instanceof EditorWindow) { editor = ((EditorWindow) editor).getDelegate(); file = InjectedLanguageManager.getInstance(file.getProject()).getTopLevelFile(file); } final LookupEx lookup = LookupManager.getActiveLookup(editor); if (lookup != null) { lookup.showElementActions(); return; } if (HintManagerImpl.getInstanceImpl().performCurrentQuestionAction()) return; // intentions check isWritable before modification: if (!file.isWritable()) return; if (file instanceof PsiCodeFragment) return; TemplateState state = TemplateManagerImpl.getTemplateState(editor); if (state != null && !state.isFinished()) { return; } final DaemonCodeAnalyzerImpl codeAnalyzer = (DaemonCodeAnalyzerImpl) DaemonCodeAnalyzer.getInstance(project); codeAnalyzer.autoImportReferenceAtCursor(editor, file); // let autoimport complete ShowIntentionsPass.IntentionsInfo intentions = new ShowIntentionsPass.IntentionsInfo(); ShowIntentionsPass.getActionsToShow(editor, file, intentions, -1); if (!intentions.isEmpty()) { IntentionHintComponent.showIntentionHint(project, file, editor, intentions, true); } }
@Override public boolean isEnabled(Editor editor, DataContext dataContext) { LookupImpl lookup = (LookupImpl) LookupManager.getActiveLookup(editor); return lookup != null || myOriginalHandler.isEnabled(editor, dataContext); }
@Override public boolean executeInCommand(Editor editor, DataContext dataContext) { return LookupManager.getActiveLookup(editor) == null; }
@Override public void update(AnActionEvent e) { Lookup lookup = LookupManager.getActiveLookup(CommonDataKeys.EDITOR.getData(e.getDataContext())); e.getPresentation().setEnabled(lookup != null); }
@SuppressWarnings("AssignmentToStaticFieldFromInstanceMethod") @Override public Result beforeCharTyped( final char charTyped, Project project, final Editor editor, PsiFile file, FileType fileType) { assert !inside; inside = true; try { final LookupImpl lookup = (LookupImpl) LookupManager.getActiveLookup(editor); if (lookup == null) { return Result.CONTINUE; } if (charTyped == ' ' && ChooseItemReplaceAction.hasTemplatePrefix(lookup, TemplateSettings.SPACE_CHAR)) { return Result.CONTINUE; } final CharFilter.Result result = getLookupAction(charTyped, lookup); if (lookup.isLookupDisposed()) { return Result.CONTINUE; } if (!lookup.performGuardedChange( new Runnable() { @Override public void run() { EditorModificationUtil.deleteSelectedText(editor); } })) { return Result.STOP; } if (result == CharFilter.Result.ADD_TO_PREFIX) { Document document = editor.getDocument(); long modificationStamp = document.getModificationStamp(); if (!lookup.performGuardedChange( new Runnable() { @Override public void run() { EditorModificationUtil.typeInStringAtCaretHonorBlockSelection( editor, String.valueOf(charTyped), true); } })) { return Result.STOP; } lookup.appendPrefix(charTyped); if (lookup.isStartCompletionWhenNothingMatches() && lookup.getItems().isEmpty()) { final CompletionProgressIndicator completion = CompletionServiceImpl.getCompletionService().getCurrentCompletion(); if (completion != null) { completion.scheduleRestart(); } else { AutoPopupController.getInstance(editor.getProject()).scheduleAutoPopup(editor, null); } } AutoHardWrapHandler.getInstance() .wrapLineIfNecessary( editor, DataManager.getInstance().getDataContext(editor.getContentComponent()), modificationStamp); final CompletionProgressIndicator completion = CompletionServiceImpl.getCompletionService().getCurrentCompletion(); if (completion != null) { completion.prefixUpdated(); } return Result.STOP; } if (result == CharFilter.Result.SELECT_ITEM_AND_FINISH_LOOKUP && lookup.isFocused()) { LookupElement item = lookup.getCurrentItem(); if (item != null) { if (completeTillTypedCharOccurrence(charTyped, lookup, item)) { return Result.STOP; } inside = false; ((CommandProcessorEx) CommandProcessor.getInstance()).enterModal(); try { finishLookup(charTyped, lookup); } finally { ((CommandProcessorEx) CommandProcessor.getInstance()).leaveModal(); } return Result.STOP; } } lookup.hide(); TypedHandler.autoPopupCompletion(editor, charTyped, project); return Result.CONTINUE; } finally { inside = false; } }