S-JIS[2014-06-14] 変更履歴

Xtextクリップボードコピー

Xtextでクリップボードにコピーするメニューのメモ。

 

概要

Xtextで作ったエディターでは、右クリックして出るコンテキストメニューに「Copy Qualified Name」というメニューがある。
これはEditorCopyQualifiedNameHandler(アウトラインページの場合はOutlineCopyQualifiedNameHandler)で実装されている。(Xtext2.4)
また、これらのハンドラーを呼び出す為の記述は、uiプロジェクトのplugin.xmlに(最初に生成されたときに)書かれている。

したがって、これらの記述を真似すると、自分独自のコピーメニューを実装できる。


EditorCopyQualifiedNameHandler

Xtextで作ったエディター用の「Copy Qualified Name」メニューのハンドラー。

DMDL EditorXの場合、以下のようになっている。

uiプロジェクト/plugin.xml:

    <extension
            point="org.eclipse.ui.handlers">
〜
        <!-- copy qualified name -->
        <handler
                class="jp.hishidama.xtext.dmdl_editor.ui.DMDLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedNameHandler"
                commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName">
            <activeWhen>
                <reference definitionId="jp.hishidama.xtext.dmdl_editor.DMDL.Editor.opened" />
            </activeWhen>
        </handler>
〜
    </extension>

Xtextのplugin.xmlにちょくちょく出てくるのが、「jp.hishidama.xtext.dmdl_editor.ui.DMDLExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedNameHandler」といった、コロン「:」で区切ったクラス名指定。
前半部が実際に呼ばれるファクトリークラスで、後半部はインスタンスを生成したいクラス。
前半部のファクトリークラス(のソース)は自動生成されている。
このファクトリークラスを使って後半部のクラスのインスタンスが生成される。その際、後半部クラスのインジェクションの初期設定をしてくれる。
(したがって、インジェクションを使っていない場合はファクトリークラスを経由する必要は無く、インスタンス生成したいクラス名のみを書けばよい)

    <extension
            point="org.eclipse.ui.commands">
〜
        <!-- copy qualified name -->
        <command
                id="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName"
                categoryId="org.eclipse.ui.category.edit"
                description="Copy the qualified name for the selected element"
                name="Copy Qualified Name">
        </command>
〜
    </extension>
    <extension point="org.eclipse.ui.menus">
〜
        <!-- copy qualified name -->
        <menuContribution locationURI="popup:#TextEditorContext?after=copy">
            <command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName" 
                    style="push" tooltip="Copy Qualified Name">
                <visibleWhen checkEnabled="false">
                    <reference definitionId="jp.hishidama.xtext.dmdl_editor.DMDL.Editor.opened" />
                </visibleWhen>
            </command> 
        </menuContribution>
        <menuContribution locationURI="menu:edit?after=copy">
            <command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName"
                    style="push" tooltip="Copy Qualified Name">
                <visibleWhen checkEnabled="false">
                    <reference definitionId="jp.hishidama.xtext.dmdl_editor.DMDL.Editor.opened" />
                </visibleWhen>
            </command> 
        </menuContribution>
〜
    </extension>

メニューは2種類定義されている。

locationURI 説明
popup:#TextEditorContext?after=copy エディター上で右クリックして出るコンテキストメニュー。
「Copy」メニューの後ろに追加される。
menu:edit?after=copy メニューバーの「Edit」メニュー。
「Copy」メニューの後ろに追加される。

OutlineCopyQualifiedNameHandler

Xtextのアウトラインページ用の「Copy Qualified Name」メニューのハンドラー。

plugin.xml上のほとんどの定義はEditorCopyQualifiedNameHandlerと同様で、メニュー定義部分だけ明確に異なる。

uiプロジェクト/plugin.xml:

    <extension point="org.eclipse.ui.menus">
〜
        <menuContribution locationURI="popup:org.eclipse.xtext.ui.outline?after=additions">
            <command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName" 
                    style="push" tooltip="Copy Qualified Name">
                <visibleWhen checkEnabled="false">
                    <and>
                        <reference definitionId="jp.hishidama.xtext.dmdl_editor.DMDL.XtextEditor.opened" />
                        <iterate>
                            <adapt type="org.eclipse.xtext.ui.editor.outline.IOutlineNode" />
                        </iterate>
                    </and>
                </visibleWhen>
            </command>
        </menuContribution>
    </extension>

AbstractCopyQualifiedNameHandler

EditorCopyQualifiedNameHandlerおよびOutlineCopyQualifiedNameHandlerの共通の親クラス。

基本的には非常にシンプル。

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
public abstract class AbstractCopyQualifiedNameHandler extends AbstractHandler {
〜
	// @Override
	public Object execute(ExecutionEvent event) throws ExecutionException {
		String qualifiedName = getQualifiedName(event);
		return ClipboardUtil.copy(qualifiedName);
	}

	protected abstract String getQualifiedName(ExecutionEvent event);
〜
}

ここに出てくるClipboardUtilはXtext専用のクラスだが、内部ではSWTのClipboard機構を使っている。


Xtext目次へ戻る / Eclipseへ戻る / 技術メモへ戻る
メールの送信先:ひしだま