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);
	}

}

実行はこんなかんじ。