@Override void handleRepeatedInvocation() { cancelFutures(); fFutures= buildCompletionFuturesOrJobs(fInvocationOffset); runFutures(fInvocationOffset, null, false, false, false); }
@Override public String incrementalComplete() { cancelFutures(); if (Helper.okToUse(fProposalShell) && fFilteredProposals != null) { return super.incrementalComplete(); } final Control control= fContentAssistSubjectControlAdapter.getControl(); if (fKeyListener == null) fKeyListener= new ProposalSelectionListener(); if (!Helper.okToUse(fProposalShell) && !control.isDisposed()) fContentAssistSubjectControlAdapter.addKeyListener(fKeyListener); fInvocationOffset= fContentAssistSubjectControlAdapter.getSelectedRange().x; fFilterOffset= fInvocationOffset; fLastCompletionOffset= fFilterOffset; fFutures= buildCompletionFuturesOrJobs(fInvocationOffset); fFilteredProposals= runFutures(fInvocationOffset, (List<ICompletionProposal> proposals) -> { ensureDocumentListenerInstalled(); if (proposals.size() > 0 && completeCommonPrefix()) { hide(); } else { fFilteredProposals= proposals; setProposals(proposals, false); displayProposals(); } }, true, false, true); return getErrorMessage(); }
if (stillRemainingThreeshold > 0) { // everything ready in time, go synchronous int count= computedProposals.size(); if (count == 0 && hideWhenNoProposals(autoActivated)) return computedProposals; if (autoInsert && count == 1 && !autoActivated && canAutoInsert(computedProposals.get(0))) { insertProposal(computedProposals.get(0), (char) 0, 0, offset); hide(); } else { if (createSelector) { createProposalSelector(); setProposals(computedProposals, false); displayProposals(); createProposalSelector(); setProposals(fComputedProposals, false); Set<CompletableFuture<Void>> remaining= Collections.synchronizedSet(new HashSet<>(populateFutures)); for (CompletableFuture<Void> populateFuture : populateFutures) { fComputedProposals= newProposals; Display.getDefault().asyncExec(() -> { if (autoInsert && !autoActivated && remaining.isEmpty() && newProposals.size() == 1 && canAutoInsert(newProposals.get(0))) { if (Helper.okToUse(fProposalShell)) { insertProposal(newProposals.get(0), (char) 0, 0, offset); hide(); callback.accept(newProposals);
/** * This methods differs from its super as it will show the list of proposals that * gets augmented as the {@link IContentAssistProcessor#computeCompletionProposals(ITextViewer, int)} * complete. All computations operation happen in a non-UI Thread so they're not blocking UI. */ @Override public String showProposals(boolean autoActivated) { if (fKeyListener == null) fKeyListener= new ProposalSelectionListener(); final Control control= fContentAssistSubjectControlAdapter.getControl(); if (!Helper.okToUse(fProposalShell) && control != null && !control.isDisposed()) { // add the listener before computing the proposals so we don't move the caret // when the user types fast. fContentAssistSubjectControlAdapter.addKeyListener(fKeyListener); fInvocationOffset= fContentAssistSubjectControlAdapter.getSelectedRange().x; fFilterOffset= fInvocationOffset; fLastCompletionOffset= fFilterOffset; // start invocation of processors as Futures, and make them populate the proposals upon completion fFutures= buildCompletionFuturesOrJobs(fInvocationOffset); runFutures(fInvocationOffset, null, true, autoActivated, true); } else { fLastCompletionOffset= fFilterOffset; handleRepeatedInvocation(); } return getErrorMessage(); }
@Override public void hide() { super.hide(); cancelFutures(); }
/** * Creates and returns a completion proposal popup for the given content assistant. * * @param contentAssistant the content assistant * @param controller the additional info controller, or <code>null</code> * @param asynchronous <true> if this content assistant should present the proposals * asynchronously, <code>false</code> otherwise * @return the completion proposal popup */ CompletionProposalPopup createCompletionProposalPopup(ContentAssistant contentAssistant, AdditionalInfoController controller, boolean asynchronous) { if (asynchronous) { if (fContentAssistSubjectControl != null) return new AsyncCompletionProposalPopup(contentAssistant, fContentAssistSubjectControl, controller); return new AsyncCompletionProposalPopup(contentAssistant, fViewer, controller); } else { if (fContentAssistSubjectControl != null) return new CompletionProposalPopup(contentAssistant, fContentAssistSubjectControl, controller); return new CompletionProposalPopup(contentAssistant, fViewer, controller); } }
@Override protected List<ICompletionProposal> computeFilteredProposals(int offset, DocumentEvent event) { if(fComputedProposals != null && fComputedProposals.size() > 0 && fComputedProposals.get(0) instanceof ComputingProposal) { Set<CompletableFuture<List<ICompletionProposal>>> remaining = Collections.synchronizedSet(new HashSet<>(fFutures)); for (CompletableFuture<List<ICompletionProposal>> future : fFutures) { future.thenRun(() -> { remaining.removeIf(CompletableFuture::isDone); if (remaining.isEmpty()) { filterProposals(); } }); } return fComputedProposals; } return super.computeFilteredProposals(offset, event); }
@Override void createProposalSelector() { super.createProposalSelector(); fProposalShell.addDisposeListener(e -> cancelFutures()); }