/*******************************************************************************
* Copyright (c) 2005, 2012 eBay Inc.
* 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
*
*******************************************************************************/
package org.eclipse.vjet.eclipse.internal.ui.templates;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.vjet.eclipse.codeassist.CodeassistUtils;
import org.eclipse.vjet.eclipse.codeassist.keywords.IVjoCompletionData;
import org.eclipse.vjet.eclipse.codeassist.keywords.VjoKeywordFactory;
import org.eclipse.vjet.eclipse.ui.text.completion.VjoTemplateProposal;
import org.eclipse.dltk.mod.core.DLTKLanguageManager;
import org.eclipse.dltk.mod.core.IDLTKLanguageToolkit;
import org.eclipse.dltk.mod.core.IMethod;
import org.eclipse.dltk.mod.core.IModelElement;
import org.eclipse.dltk.mod.core.IScriptProject;
import org.eclipse.dltk.mod.core.ISourceModule;
import org.eclipse.dltk.mod.core.ModelException;
import org.eclipse.dltk.mod.internal.core.IJSInitializer;
import org.eclipse.dltk.mod.internal.core.VjoSourceType;
import org.eclipse.dltk.mod.internal.ui.editor.ScriptEditor;
import org.eclipse.dltk.mod.ui.DLTKUIPlugin;
import org.eclipse.dltk.mod.ui.templates.ScriptTemplateAccess;
import org.eclipse.dltk.mod.ui.templates.ScriptTemplateCompletionProcessor;
import org.eclipse.dltk.mod.ui.templates.TemplateInformationControlCreator;
import org.eclipse.dltk.mod.ui.text.completion.ScriptContentAssistInvocationContext;
import org.eclipse.jface.text.IInformationControlCreator;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.text.templates.Template;
import org.eclipse.jface.text.templates.TemplateContext;
import org.eclipse.jface.text.templates.TemplateProposal;
import org.eclipse.jface.window.Window;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.part.IWorkbenchPartOrientation;
public class VjoTemplateCompletionProcessor extends
ScriptTemplateCompletionProcessor {
public VjoTemplateCompletionProcessor(
ScriptContentAssistInvocationContext cntx) {
super(cntx);
}
@Override
protected String getContextTypeId() {
return VjoTemplateContextType.VJO_CONTEXT_TYPE_ID;
}
@Override
protected char[] getIgnore() {
return new char[] {};
}
@Override
protected ScriptTemplateAccess getTemplateAccess() {
return VjoTemplateAccess.getInstance();
}
public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer,
int offset) {
ICompletionProposal[] proposals = super.computeCompletionProposals(
viewer, offset);
try {
ISourceModule module = getContext().getSourceModule();
if (!CodeassistUtils.isVjoSourceModule(module)) {
return new ICompletionProposal[0];
}
IScriptProject project = module.getScriptProject();
if (project == null || !project.exists()) {
return proposals;
}
boolean isMethodScope = (module != null);
if (isMethodScope) {
isMethodScope = !project.isOnBuildpath(module);
if (!isMethodScope) {
IModelElement e = module.getElementAt(offset);
isMethodScope = (e instanceof IMethod) ||
(e instanceof VjoSourceType) ||
(e instanceof IJSInitializer);
}
}
if (isMethodScope) {
// show all templates
return proposals;
} else {
// do not show templates like for, if, etc*
List<ICompletionProposal> scopeFiltered = new ArrayList<ICompletionProposal>();
for (ICompletionProposal completionProposal : proposals) {
String displayName = completionProposal.getDisplayString();
if (!(displayName.startsWith(VjoKeywordFactory.KWD_DO
.getName())
|| displayName.startsWith(VjoKeywordFactory.KWD_FOR
.getName())
|| displayName.startsWith(VjoKeywordFactory.KWD_IF
.getName())
|| displayName
.startsWith(VjoKeywordFactory.KWD_SWITCH
.getName())
|| displayName.startsWith(VjoKeywordFactory.KWD_TRY
.getName()) || displayName
.startsWith(VjoKeywordFactory.KWD_WHILE.getName()))) {
scopeFiltered.add(completionProposal);
}
}
return scopeFiltered.toArray(new ICompletionProposal[] {});
}
} catch (ModelException me) {
// TODO log this error
me.printStackTrace();
}
return proposals;
}
// TODO call super instead
// public ICompletionProposal[] computeCompletionProposals(ITextViewer
// viewer,
// int offset) {
//
// ICompletionProposal[] templates = super.computeCompletionProposals(
// viewer, offset);
//
// VjoKeywordCompletionResult keywordResults = SimpleKeywordCompletionEngine
// .getJustObtainedResult();
// ICompletionProposal[] result;
// if (keywordResults != null) {
// result = filter(templates, keywordResults.getKeywords());
// } else {
// result = new ICompletionProposal[0];
// }
//
// return result;
// }
private ICompletionProposal[] filter(ICompletionProposal[] allTemplates,
List<IVjoCompletionData> allowedKeywords) {
List<ICompletionProposal> filteredTemplates = new ArrayList<ICompletionProposal>();
for (int iter = 0; iter < allTemplates.length; iter++) {
Iterator<IVjoCompletionData> keywordIterator = allowedKeywords
.iterator();
while (keywordIterator.hasNext()) {
IVjoCompletionData keyword = keywordIterator.next();
if (allTemplates[iter].getDisplayString().toLowerCase()
.startsWith(keyword.toString())
&& !keyword.isComplementedPart()) {
filteredTemplates.add(allTemplates[iter]);
break;
}
}
}
return (ICompletionProposal[]) filteredTemplates
.toArray(new ICompletionProposal[] {});
}
protected IInformationControlCreator getInformationControlCreator() {
int orientation = Window.getDefaultOrientation();
IEditorPart editor = getContext().getEditor();
if (editor == null)
editor = DLTKUIPlugin.getActivePage().getActiveEditor();
if (editor instanceof IWorkbenchPartOrientation)
orientation = ((IWorkbenchPartOrientation) editor).getOrientation();
IDLTKLanguageToolkit toolkit = null;
toolkit = DLTKLanguageManager.getLanguageToolkit(getContext()
.getLanguageNatureID());
if ((toolkit == null) && (editor instanceof ScriptEditor))
toolkit = ((ScriptEditor) editor).getLanguageToolkit();
return new TemplateInformationControlCreator(orientation, toolkit);
}
protected ICompletionProposal createProposal(Template template,
TemplateContext context, IRegion region, int relevance) {
TemplateProposal proposal = new VjoTemplateProposal(template, context,
region, getImage(template), relevance);
proposal.setInformationControlCreator(getInformationControlCreator());
return proposal;
}
}