/*******************************************************************************
* 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.ext.java.worker;
import org.eclipse.che.ide.collections.js.JsoArray;
import org.eclipse.che.ide.collections.js.JsoStringMap;
import org.eclipse.che.ide.ext.java.jdt.codeassistant.api.JavaCompletionProposal;
import org.eclipse.che.ide.ext.java.messages.ApplyProposalMessage;
import org.eclipse.che.ide.ext.java.messages.Change;
import org.eclipse.che.ide.ext.java.messages.RoutingTypes;
import org.eclipse.che.ide.ext.java.messages.impl.MessagesImpls;
import org.eclipse.che.ide.ext.java.jdt.text.Document;
import org.eclipse.che.ide.ext.java.jdt.text.DocumentEvent;
import org.eclipse.che.ide.ext.java.jdt.text.DocumentListener;
import org.eclipse.che.ide.api.text.Region;
import com.google.gwt.webworker.client.messages.MessageFilter;
public class WorkerProposalApplier {
private final JavaParserWorker worker;
private JsoStringMap<JavaCompletionProposal> caProposalMap = JsoStringMap.create();
private JsoStringMap<JavaCompletionProposal> quickProposalMap = JsoStringMap.create();
private Document caDocument;
private Document quickDocument;
public WorkerProposalApplier(JavaParserWorker worker, MessageFilter messageFilter) {
this.worker = worker;
messageFilter.registerMessageRecipient(RoutingTypes.APPLY_CA_PROPOSAL, new MessageFilter.MessageRecipient<ApplyProposalMessage>() {
@Override
public void onMessageReceived(ApplyProposalMessage message) {
handleApply(message.id());
}
});
}
void handleApply(String id) {
if (caProposalMap.containsKey(id)) {
JavaCompletionProposal proposal = caProposalMap.get(id);
apply(id, proposal, caDocument);
} else if (quickProposalMap.containsKey(id)) {
JavaCompletionProposal proposal = quickProposalMap.get(id);
apply(id, proposal, quickDocument);
}
}
private void apply(String id, JavaCompletionProposal proposal, Document document) {
final JsoArray<Change> changes = JsoArray.create();
document.addDocumentListener(new DocumentListener() {
@Override
public void documentAboutToBeChanged(DocumentEvent event) {
}
@Override
public void documentChanged(DocumentEvent event) {
MessagesImpls.ChangeImpl change = MessagesImpls.ChangeImpl.make();
change.setOffset(event.getOffset()).setLength(event.getLength()).setText(event.getText());
changes.add(change);
}
});
proposal.apply(document);
MessagesImpls.ProposalAppliedMessageImpl message = MessagesImpls.ProposalAppliedMessageImpl.make();
message.setChanges(changes);
Region selection = proposal.getSelection(document);
if (selection != null) {
MessagesImpls.RegionImpl region = MessagesImpls.RegionImpl.make();
region.setLength(selection.getLength()).setOffset(selection.getOffset());
message.setSelectionRegion(region);
}
message.setId(id);
worker.sendMessage(message.serialize());
}
void setCaDocument(Document caDocument){
this.caDocument = caDocument;
}
void setQuickDocument(Document quickDocument) {
this.quickDocument = quickDocument;
}
public void setCaProposalMap(JsoStringMap<JavaCompletionProposal> caProposalMap) {
this.caProposalMap = caProposalMap;
}
public void setQuickProposalMap(JsoStringMap<JavaCompletionProposal> quickProposalMap) {
this.quickProposalMap = quickProposalMap;
}
}