// 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.integration; import com.google.collide.client.Resources; import com.google.collide.client.code.autocomplete.Autocompleter; import com.google.collide.client.code.autocomplete.SignalEventEssence; import com.google.collide.client.codeunderstanding.CubeClient; import com.google.collide.client.documentparser.DocumentParser; import com.google.collide.client.editor.Buffer; import com.google.collide.client.editor.Editor; import com.google.collide.client.util.PathUtil; import com.google.collide.json.shared.JsonArray; import com.google.collide.shared.TaggableLine; import com.google.collide.shared.document.Document; import com.google.collide.shared.document.Line; import com.google.collide.shared.document.TextChange; import com.google.collide.shared.util.JsonCollections; import com.google.collide.shared.util.ListenerRegistrar.RemoverManager; import org.waveprotocol.wave.client.common.util.SignalEvent; /** * This class isolates {@link Autocompleter} from the UI. */ public class AutocompleterFacade { private final Autocompleter autocompleter; private final Editor editor; private final RemoverManager instanceListeners = new RemoverManager(); private final RemoverManager documentListeners = new RemoverManager(); private final Document.LineListener lineListener = new Document.LineListener() { @Override public void onLineAdded(Document document, int lineNumber, JsonArray<Line> addedLines) { // Do nothing. } @Override public void onLineRemoved(Document document, int lineNumber, JsonArray<Line> removedLines) { JsonArray<TaggableLine> deletedLines = JsonCollections.createArray(); for (final Line line : removedLines.asIterable()) { deletedLines.add(line); } autocompleter.getCodeAnalyzer().onLinesDeleted(deletedLines); } }; /** * A listener that receives and translates keyboard events. */ private final Editor.KeyListener keyListener = new Editor.KeyListener() { @Override public boolean onKeyPress(SignalEvent event) { return autocompleter.processKeyPress(new SignalEventEssence(event)); } }; /** * A listener that dismisses the autocomplete box when the editor is scrolled. */ private final Buffer.ScrollListener dismissingScrollListener = new Buffer.ScrollListener() { @Override public void onScroll(Buffer buffer, int scrollTop) { autocompleter.dismissAutocompleteBox(); } }; /** * A listener for user modifications in the editor. */ private final Editor.TextListener textListener = new Editor.TextListener() { @Override public void onTextChange(TextChange textChange) { autocompleter.refresh(); } }; private final DocumentParser.Listener parseListener; public static AutocompleterFacade create( Editor editor, CubeClient cubeClient, Resources resources) { AutocompleteUiController popup = new AutocompleteUiController(editor, resources); Autocompleter autocompleter = Autocompleter.create(editor, cubeClient, popup); return new AutocompleterFacade(editor, autocompleter); } public AutocompleterFacade(Editor editor, Autocompleter autocompleter) { this.editor = editor; this.autocompleter = autocompleter; this.parseListener = new DocumentParserListenerAdapter(autocompleter, editor); instanceListeners.track(editor.getTextListenerRegistrar().add(textListener)); instanceListeners.track(editor.getKeyListenerRegistrar().add(keyListener)); instanceListeners.track( editor.getBuffer().getScrollListenerRegistrar().add(dismissingScrollListener)); } public void cleanup() { pause(); instanceListeners.remove(); autocompleter.cleanup(); } private void pause() { documentListeners.remove(); } public void editorContentsReplaced(PathUtil path, DocumentParser parser) { pause(); documentListeners.track(editor.getDocument().getLineListenerRegistrar().add(lineListener)); documentListeners.track(parser.getListenerRegistrar().add(parseListener)); autocompleter.reset(path, parser); } }