@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);
    }
Esempio n. 3
0
  @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);
 }
Esempio n. 8
0
  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;
    }
  }