// Copyright 2012 Google Inc. All Rights Reserved. // // 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.google.collide.client.code.autocomplete; import com.google.collide.client.code.autocomplete.AutocompleteProposals.ProposalWithContext; import com.google.collide.client.editor.selection.SelectionModel; import com.google.common.base.Preconditions; /** * Mediator that encapsulates data of the current autocomplete session and * provides an interface to populate autocompletion <b>asynchronously</b>. */ public class AutocompleteController { /** * Instance that performs all language specific logic. */ private LanguageSpecificAutocompleter languageAutocompleter; /** * Callback to {@link Autocompleter} instance methods, */ private AutocompleterCallback autocompleterCallback; public AutocompleteController(LanguageSpecificAutocompleter languageAutocompleter, AutocompleterCallback callback) { Preconditions.checkNotNull(languageAutocompleter); Preconditions.checkNotNull(callback); this.languageAutocompleter = languageAutocompleter; this.autocompleterCallback = callback; } /** * @return the language-specific autocontroller */ public LanguageSpecificAutocompleter getLanguageSpecificAutocompleter() { return languageAutocompleter; } /** * Calculates the completion result for the selected proposal. * * @param proposal proposal item selected by user */ AutocompleteResult finish(ProposalWithContext proposal) { AutocompleteResult result = languageAutocompleter.computeAutocompletionResult(proposal); pause(); return result; } boolean isAttached() { return languageAutocompleter != null; } /** * This method execution is scheduled from UI when it needs to * show completions. * * @param trigger event that triggered autocomplete request * (typically Ctrl+Space press) */ AutocompleteProposals start(SelectionModel selection, SignalEventEssence trigger) { Preconditions.checkNotNull(languageAutocompleter); languageAutocompleter.start(); return languageAutocompleter.findAutocompletions(selection, trigger); } /** * Stops language specific autocompleter and unbounds it from this controller. * * <p>{@link #languageAutocompleter} and {@link #autocompleterCallback} * are assigned {@code null} to avoid further interaction. */ void detach() { languageAutocompleter.detach(); languageAutocompleter = null; autocompleterCallback = null; } /** * Pauses language specific autocompleter. * * <p>This should be called after the dismission of the autocomplete box. */ void pause() { languageAutocompleter.pause(); } /** * Transfers request for updating proposals list. */ void scheduleRequestForUpdatedProposals() { autocompleterCallback.rescheduleCompletionRequest(); } }