package tk.eclipse.plugin.jspeditor.editors;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.ui.IFileEditorInput;
import tk.eclipse.plugin.htmleditor.HTMLPlugin;
import tk.eclipse.plugin.htmleditor.HTMLUtil;
import tk.eclipse.plugin.htmleditor.ICustomTagAttributeAssist;
import tk.eclipse.plugin.htmleditor.assist.AssistInfo;
import tk.eclipse.plugin.htmleditor.assist.AttributeInfo;
import tk.eclipse.plugin.htmleditor.assist.HTMLAssistProcessor;
import tk.eclipse.plugin.htmleditor.assist.TagDefinition;
import tk.eclipse.plugin.htmleditor.assist.TagInfo;
import tk.eclipse.plugin.htmleditor.assist.TextInfo;
import tk.eclipse.plugin.htmleditor.editors.HTMLSourceEditor;
import tk.eclipse.plugin.xmleditor.editors.ClassNameAssistProcessor;
/**
* This is an implementation of the AssistProcessor
* for the <code>JSPSourceEditor</code>.
*
* @author Naoki Takezoe
*/
public class JSPAssistProcessor extends HTMLAssistProcessor {
private static final int SCOPE = 100;
private static final int CLASS = 101;
private List<TagInfo> _tagList = new ArrayList<TagInfo>(TagDefinition.getTagInfoAsList());
private List<TagInfo> _cunstomTagList = new ArrayList<TagInfo>();
private HashMap<String, String> _namespace = new HashMap<String, String>();
private ClassNameAssistProcessor _classNameProcessor = new ClassNameAssistProcessor();
private JSPScriptletAssistProcessor _scriptletProcessor = new JSPScriptletAssistProcessor();
private IFile _file = null;
public JSPAssistProcessor() {
// JSP actions
TagInfo useBean = new TagInfo("jsp:useBean", true);
useBean.addAttributeInfo(new AttributeInfo("id", true));
useBean.addAttributeInfo(new AttributeInfo("scope", true, SCOPE));
useBean.addAttributeInfo(new AttributeInfo("class", true, CLASS));
_tagList.add(useBean);
TagInfo setProperty = new TagInfo("jsp:setProperty", false);
setProperty.addAttributeInfo(new AttributeInfo("name", true));
setProperty.addAttributeInfo(new AttributeInfo("param", true));
setProperty.addAttributeInfo(new AttributeInfo("property", true));
_tagList.add(setProperty);
TagInfo include = new TagInfo("jsp:include", false);
include.addAttributeInfo(new AttributeInfo("page", true));
_tagList.add(include);
TagInfo forward = new TagInfo("jsp:forward", true);
forward.addAttributeInfo(new AttributeInfo("page", true));
_tagList.add(forward);
TagInfo param = new TagInfo("jsp:param", false);
param.addAttributeInfo(new AttributeInfo("name", true));
param.addAttributeInfo(new AttributeInfo("value", true));
_tagList.add(param);
TagInfo attribute = new TagInfo("jsp:attribute", true);
attribute.addAttributeInfo(new AttributeInfo("name", true));
_tagList.add(attribute);
TagInfo body = new TagInfo("jsp:body", true);
_tagList.add(body);
TagInfo element = new TagInfo("jsp:element", true);
element.addAttributeInfo(new AttributeInfo("name", true));
_tagList.add(element);
TagInfo text = new TagInfo("jsp:text", true);
_tagList.add(text);
// JSP directives
_tagList.add(new TextInfo("<% %>", 3));
_tagList.add(new TextInfo("<%= %>", 4));
_tagList.add(new TextInfo("<%@ page %>", 9));
_tagList.add(new TextInfo("<%@ include %>", "<%@ include file=\"\" %>", 18));
_tagList.add(new TextInfo("<%@ taglib %>", "<%@ taglib prefix=\"\" %>", 19));
}
@Override
public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int documentOffset) {
// Java code completion for partitions which are not parted as HTMLPartitionScanner#HTML_SCRIPT.
String rawText = viewer.getDocument().get();
rawText = HTMLUtil.comment2space(rawText, false);
String text = rawText.substring(0, documentOffset);
int begin = text.lastIndexOf("<%");
if (begin >= 0) {
int end = rawText.indexOf("%>", begin);
if (end >= 0 && documentOffset < end) {
return _scriptletProcessor.computeCompletionProposals(viewer, documentOffset);
}
}
return super.computeCompletionProposals(viewer, documentOffset);
}
@Override
protected AssistInfo[] getAttributeValues(String tagName, String value, TagInfo tagInfo, AttributeInfo attrInfo) {
if (tagName.indexOf(":") != -1) {
String[] dim = tagName.split(":");
String uri = getUri(dim[0]);
ICustomTagAttributeAssist[] assists = HTMLPlugin.getDefault().getCustomTagAttributeAssists();
for (int i = 0; i < assists.length; i++) {
AssistInfo[] values = assists[i].getAttributeValues(dim[1], uri, value, attrInfo);
if (values != null) {
return values;
}
}
}
if (attrInfo.getAttributeType() == SCOPE) {
return new AssistInfo[] { new AssistInfo("application"), new AssistInfo("page"), new AssistInfo("request"), new AssistInfo("session") };
}
if (attrInfo.getAttributeType() == CLASS && this._file != null) {
return _classNameProcessor.getClassAttributeValues(this._file, value);
}
return super.getAttributeValues(tagName, value, tagInfo, attrInfo);
}
@Override
protected TagInfo getTagInfo(String name) {
List<TagInfo> tagList = getTagList();
for (int i = 0; i < tagList.size(); i++) {
TagInfo info = tagList.get(i);
if (info.getTagName() != null) {
if (name.equals(info.getTagName().toLowerCase())) {
return info;
}
}
}
return null;
}
@Override
protected List<TagInfo> getTagList() {
List<TagInfo> list = new ArrayList<TagInfo>();
list.addAll(_tagList);
list.addAll(_cunstomTagList);
return list;
}
/** Returns URI from taglib prefix. */
private String getUri(String prefix) {
return _namespace.get(prefix);
}
/**
* Updates informations about code completion.
*
* @param input the <code>HTMLSourceEditor</code> instance
* @param source JSP source code
*/
@Override
public void update(HTMLSourceEditor editor, String source) {
super.update(editor, source);
this._scriptletProcessor.update((JSPSourceEditor) editor);
if (editor.getEditorInput() instanceof IFileEditorInput) {
IFileEditorInput input = (IFileEditorInput) editor.getEditorInput();
_cunstomTagList.clear();
_namespace.clear();
JSPInfo jspInfo = JSPInfo.getJSPInfo(input.getFile(), source);
TLDInfo[] tlds = jspInfo.getTLDInfo();
for (int i = 0; i < tlds.length; i++) {
_namespace.put(tlds[i].getPrefix(), tlds[i].getTaglibUri());
_cunstomTagList.addAll(tlds[i].getTagInfo());
}
this._file = input.getFile();
}
}
}