/*******************************************************************************
* Copyright (c) 2012-2015 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.jseditor.java.client.editor;
import elemental.dom.Element;
import org.eclipse.che.ide.api.icon.Icon;
import org.eclipse.che.ide.collections.Array;
import org.eclipse.che.ide.ext.java.client.editor.JavaParserWorker;
import org.eclipse.che.ide.ext.java.messages.Change;
import org.eclipse.che.ide.ext.java.messages.ProposalAppliedMessage;
import org.eclipse.che.ide.jseditor.client.codeassist.Completion;
import org.eclipse.che.ide.jseditor.client.codeassist.CompletionProposal;
import org.eclipse.che.ide.jseditor.client.document.EmbeddedDocument;
import org.eclipse.che.ide.jseditor.client.text.LinearRange;
/**
* @author <a href="mailto:evidolob@codenvy.com">Evgen Vidolob</a>
*/
public class JavaCompletionProposal implements CompletionProposal {
private final String id;
private final String display;
private final Icon icon;
private final JavaParserWorker worker;
public JavaCompletionProposal(final String id, final String display, final Icon icon, final JavaParserWorker worker) {
this.id = id;
this.display = display;
this.icon = icon;
this.worker = worker;
}
/** {@inheritDoc} */
@Override
public Element getAdditionalProposalInfo() {
return null;
}
/** {@inheritDoc} */
@Override
public String getDisplayString() {
return display;
}
/** {@inheritDoc} */
@Override
public Icon getIcon() {
return icon;
}
@Override
public void getCompletion(final CompletionCallback callback) {
worker.applyCAProposal(id, new JavaParserWorker.Callback<ProposalAppliedMessage>() {
@Override
public void onCallback(final ProposalAppliedMessage message) {
callback.onCompletion(new CompletionImpl(message.changes(), message.selectionRegion()));
}
});
}
private class CompletionImpl implements Completion {
private final Array<Change> changes;
private final org.eclipse.che.ide.ext.java.messages.Region region;
private CompletionImpl(final Array<Change> changes, final org.eclipse.che.ide.ext.java.messages.Region region) {
this.changes = changes;
this.region = region;
}
/** {@inheritDoc} */
@Override
public void apply(final EmbeddedDocument document) {
for (final Change change : changes.asIterable()) {
document.replace(change.offset(), change.length(), change.text());
}
}
/** {@inheritDoc} */
@Override
public LinearRange getSelection(final EmbeddedDocument document) {
if (region == null) {
return null;
} else {
return LinearRange.createWithStart(region.getOffset()).andLength(region.getLength());
}
}
}
}