JSPエディタの拡張
たけぞうさんの本やブログをみてたらなんとなくできたのでメモ。
使う拡張ポイントはorg.eclipse.wst.sse.ui.editorConfiguration
以下は、org.eclipse.jst.jsp.ui_1.1.201.v200709061102のplugin.xml
<extension point="org.eclipse.wst.sse.ui.editorConfiguration"> <sourceViewerConfiguration class="org.eclipse.jst.jsp.ui.StructuredTextViewerConfigurationJSP" target="org.eclipse.jst.jsp.core.jspsource" /> <contentOutlineConfiguration class="org.eclipse.jst.jsp.ui.views.contentoutline.JSPContentOutlineConfiguration" target="org.eclipse.jst.jsp.core.jspsource" /> <propertySheetConfiguration class="org.eclipse.wst.xml.ui.views.properties.XMLPropertySheetConfiguration" target="org.eclipse.jst.jsp.core.jspsource" /> <provisionalConfiguration type="sourceeditingtexttools" class="org.eclipse.jst.jsp.ui.internal.editor.JSPSourceEditingTextTools" target="org.eclipse.jst.jsp.core.jspsource" /> <provisionalConfiguration type="characterpairmatcher" class="org.eclipse.jst.jsp.ui.internal.text.JSPDocumentRegionEdgeMatcher" target="org.eclipse.jst.jsp.core.jspsource" /> <provisionalConfiguration type="structuredtextfoldingprovider" class="org.eclipse.jst.jsp.ui.internal.projection.StructuredTextFoldingProviderJSP" target="org.eclipse.jst.jsp.core.jspsource" /> <provisionalDefinition type="preferencepages" value="org.eclipse.wst.sse.ui.preferences.jsp, org.eclipse.wst.sse.ui.preferences.jsp.source, org.eclipse.wst.sse.ui.preferences.jsp.templates, org.eclipse.wst.sse.ui.preferences.jsp.styles" target="org.eclipse.jst.jsp.core.jspsource" /> <provisionalDefinition type="showintarget" value="org.eclipse.jdt.ui.PackageExplorer" target="org.eclipse.jst.jsp.core.jspsource" /> <provisionalDefinition type="spellingregions" value="XML_COMMENT_TEXT, JSP_COMMENT_TEXT, XML_CONTENT, HTML_CONTENT" target="org.eclipse.jst.jsp.core.jspsource" /> </extension>
org.eclipse.jst.jsp.ui.StructuredTextViewerConfigurationJSPがコンフィギュレーションクラスでorg.eclipse.wst.sse.ui.StructuredTextViewerConfigurationを継承している。
XMLの場合はorg.eclipse.wst.xml.ui.StructuredTextViewerConfigurationXMLね。
JSPエディタを拡張するには独自のIContentAssistProcessorを提供するSourceViewerConfigurationをコントリビュートします。
<extension point="org.eclipse.wst.sse.ui.editorConfiguration"> <sourceViewerConfiguration class="org.seasar.sastrutsplugin.ui.editor.configuration.JSPConfiguration" target="org.eclipse.jst.jsp.core.jspsource.source"> </sourceViewerConfiguration> </extension>
コンフィギュレーションクラスの実装は下記のとおり。
package org.seasar.sastrutsplugin.ui.editor.configuration; import org.eclipse.jface.text.contentassist.IContentAssistProcessor; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.jst.jsp.core.text.IJSPPartitions; import org.eclipse.jst.jsp.ui.StructuredTextViewerConfigurationJSP; import org.eclipse.wst.html.core.text.IHTMLPartitions; import org.eclipse.wst.xml.core.text.IXMLPartitions; import org.seasar.sastrutsplugin.ui.editor.contentassist.JSPAssistProcessor; public class JSPConfiguration extends StructuredTextViewerConfigurationJSP { protected IContentAssistProcessor[] getContentAssistProcessors( ISourceViewer sourceViewer, String partitionType) { if ((partitionType == IXMLPartitions.XML_DEFAULT) || (partitionType == IHTMLPartitions.HTML_DEFAULT) || (partitionType == IHTMLPartitions.HTML_COMMENT) || (partitionType == IJSPPartitions.JSP_DEFAULT) || (partitionType == IJSPPartitions.JSP_DIRECTIVE) || (partitionType == IJSPPartitions.JSP_CONTENT_DELIMITER) || (partitionType == IJSPPartitions.JSP_CONTENT_JAVASCRIPT) || (partitionType == IJSPPartitions.JSP_COMMENT)) { return new IContentAssistProcessor[] { new JSPAssistProcessor() }; } return super.getContentAssistProcessors(sourceViewer, partitionType); } }
以下はJSPAssistProcessorの実装です。こちらもWTP付属のJSPContentAssistProcessorを継承し、属性値の補完候補を1つだけ追加しています。
package org.seasar.sastrutsplugin.ui.editor.contentassist; import org.eclipse.jface.text.contentassist.CompletionProposal; import org.eclipse.jst.jsp.ui.internal.contentassist.JSPContentAssistProcessor; import org.eclipse.wst.xml.ui.internal.contentassist.ContentAssistRequest; public class JSPAssistProcessor extends JSPContentAssistProcessor { protected void addAttributeValueProposals( ContentAssistRequest contentAssistRequest) { String value="\"テスト\""; contentAssistRequest.addProposal(new CompletionProposal(value, contentAssistRequest.getReplacementBeginPosition(), contentAssistRequest.getReplacementLength(), value.length())); super.addAttributeNameProposals(contentAssistRequest); } }