S-JIS[2013-01-04/2013-09-06] 変更履歴

EclipseプラグインActionSetサンプル

Eclipseプラグイン開発の最初のサンプル。


サンプル

Eclipseのメニューバー(およびツールバー)にメニューを表示し、そのメニューをクリックしたらメッセージダイアログが表示されるプラグインを作ってみる。
対象はWindows7上のEclipse3.7。

Eclipse3.3以降ではメニューを実行するには「コマンド」を使うが、Eclipse3.2以前の「アクション」の方が拡張ポイントは1つだけなので、アクションを使ってみる。
(メニューへの追加方法はコマンドの方が統一的だし、クラスもコマンド(ハンドラー)の方がシンプル。[2013-01-13]


プラグインプロジェクトの作成

最初に、Eclipseプラグインを開発する為のプロジェクトを作成する。
※余計なプラグイン(Scalaプラグインとか)の入っていない初期状態のEclipseを使った方が良さそう

  1. メニューバーの「ファイル(F)」→「新規(N)」→「プロジェクト(R)」で「新規プロジェクト」ダイアログを開く。
  2. 「プラグイン・プロジェクト」(プラグイン開発の下にある)を選択して、次へ。
  3. プロジェクト名に適当な名前を入力して、次へ。
    内容 説明
    プロジェクト名 プロジェクト(ディレクトリー)名。 plugin-example1
    ソース・フォルダー   src
    出力フォルダー   classes
    Eclipseバージョン プラグインの実行対象となるEclipseのバージョン。 3.7
  4. IDやアクティベーターのクラス名を変更し、次へ。
    内容 説明
    ID プラグインのID。
    Javaのパッケージ名の様に世界でユニーク(単一)になるような名前を付ける。
    com.example.eclipse.plugin.hello
    アクティベーター プラグインの各種情報にアクセスする為のクラス。
    このクラスは自分で用意する必要があるが、ここで指定しておくと自動生成してくれる。
    Hello Worldくらいのサンプルでは使わないが、一応用意しておく。
    com.example.eclipse.plugin.hello.Activator
  5. テンプレートを選択して、次へ。
    今回は「Hello, World」を選択する。
  6. 「Hello, World」テンプレートで生成するパッケージ名やクラス名を指定して、完了。
    内容 説明
    Javaパッケージ名 生成するパッケージ名。 com.example.eclipse.plugin.hello.actions
    アクション・クラス名 生成クラス名。 HelloAction
    メッセージ・ボックス・テキスト 今回のサンプルでメッセージダイアログに表示される内容。 Hello, Eclipse world

これで、plugin-example1というプロジェクトが作られる。
内容は以下のようになっている。

内容 説明
src HelloAction.java
Activator.java
ソースディレクトリー。
生成されたJavaソースファイルが置かれている。
icons sample.gif アイコンのディレクトリー。
ツールバーにはこのアイコンが表示される。
META-INF MANIFEST.MF プラグインの情報
プラグインのバージョンや依存ライブラリーが記述されている。
build.properties プラグインのビルド情報
plugin.xml プラグインの設定内容。
ここにextension(拡張内容)を記述して、自分のクラスを実行させるようにする。

プラグインの実行方法

「Hello, World」テンプレートで生成されたプロジェクトは、そのままで実行させることが出来る。

  1. パッケージエクスプローラーからMANIFEST.MFをダブルクリックし、エディターを開く。
  2. 「概要」タブを選択する。
  3. 「テスト」という段落の「Eclipseアプリケーションの起動」をクリックする。

これで、作成したプラグインの含まれた新しいEclipseが起動する。
(この方法によって一度起動すれば、以降はメニューバーやツールバーの「実行」メニューから再実行することが出来る)

今回は、新しいEclipseのメニューバーに「サンプル・メニュー(M)」が追加されているはず。
この「サンプル・メニュー(M)」→「サンプル・アクション(S)」を実行すると、メッセージダイアログが表示される。
あるいは、ツールバーの「Hello, Eclipse world」アイコンをクリックすることでも実行される。


Eclipseプラグインを実行中に「java.lang.OutOfMemoryError: PermGen space」が発生することがある。[2013-09-06]
この場合、Run/Debugの起動オプションのVM引数に「-XX:MaxPermSize=256m」を付けると直る。


plugin.xml

プラグインにどういう拡張を行うか(自分独自の動作をさせるか)は、plugin.xmlに記述されている。

パッケージエクスプローラーでplugin.xmlをダブルクリックすると、拡張エディターが開く。
設定内容の確認や修正はこのエディターで行うのが楽そうだが、
右クリックしてテキストエディターで開くと、XMLとして内容を表示できる。

plugin.xml:

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>

   <extension
         point="org.eclipse.ui.actionSets">
      <actionSet
            label="サンプルのアクション・セット"
            visible="true"
            id="com.example.eclipse.plugin.hello.actionSet">
         <menu
               label="サンプル・メニュー(&amp;M)"
               id="sampleMenu">
            <separator
                  name="sampleGroup">
            </separator>
         </menu>
         <action
               label="サンプル・アクション(&amp;S)"
               icon="icons/sample.gif"
               class="com.example.eclipse.plugin.hello.actions.HelloAction"
               tooltip="Hello, Eclipse world"
               menubarPath="sampleMenu/sampleGroup"
               toolbarPath="sampleGroup"
               id="com.example.eclipse.plugin.hello.actions.HelloAction">
         </action>
      </actionSet>
   </extension>

</plugin>

今回はアクションを追加しているので、extensionorg.eclipse.ui.actionSetsを指定している。
そして、その内容としてactionSetを入れている。

タグ 属性 設定値 説明
menu label サンプル・メニュー(&amp;M) メニューバーに表示される文言。
id sampleMenu メニューのID。
action label サンプル・アクション(&amp;S) アクションの文言。メニューに表示される。
icon icons/sample.gif ツールバーに表示されるアイコンのパス。
class com.example.eclipse.plugin.hello.actions.HelloAction メニューやツールバーのアイコンがクリックされた時に実行されるクラス。
tooltip Hello, Eclipse world ツールバーのアイコンにマウスを当てた際に表示される文言。
menubarPath sampleMenu/sampleGroup メニューの配置(位置)。menuのidとseparatorのnameを指定している。
toolbarPath sampleGroup  
id com.example.eclipse.plugin.hello.actions.HelloAction アクションのID。デフォルトではクラス名と同じ。

アクションクラス

実行される内容はアクションクラスに記述されている。

src/com/example/eclipse/plugin/hello/actions/HelloAction.java:

package com.example.eclipse.plugin.hello.actions;

import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.jface.dialogs.MessageDialog;
/**
 * Our sample action implements workbench action delegate.
 * The action proxy will be created by the workbench and
 * shown in the UI. When the user tries to use the action,
 * this delegate will be created and execution will be 
 * delegated to it.
 * @see IWorkbenchWindowActionDelegate
 */
public class HelloAction implements IWorkbenchWindowActionDelegate {
	private IWorkbenchWindow window;
	/**
	 * The constructor.
	 */
	public HelloAction() {
	}
	/**
	 * We will cache window object in order to
	 * be able to provide parent shell for the message dialog.
	 * @see IWorkbenchWindowActionDelegate#init
	 */
	public void init(IWorkbenchWindow window) {
		this.window = window;
	}

インスタンスが生成された後にinit()が呼ばれるので、windowオブジェクトをフィールドに保持している。

	/**
	 * The action has been activated. The argument of the
	 * method represents the 'real' action sitting
	 * in the workbench UI.
	 * @see IWorkbenchWindowActionDelegate#run
	 */
	public void run(IAction action) {
		MessageDialog.openInformation(
			window.getShell(),
			"Plugin-example1",
			"Hello, Eclipse world");
	}

メニューやツールバーのアイコンがクリックされると、run()が実行される。
今回はこの中でMessageDialogクラスを使ってダイアログを表示している。
openInformation()の第1引数は親ウィンドウ(シェル)、第2引数はダイアログのタイトル、第3引数はメッセージ本体。

	/**
	 * Selection in the workbench has been changed. We 
	 * can change the state of the 'real' action here
	 * if we want, but this can only happen after 
	 * the delegate has been created.
	 * @see IWorkbenchWindowActionDelegate#selectionChanged
	 */
	public void selectionChanged(IAction action, ISelection selection) {
	}

selectionChanged()は今は特に何も実装されていないが、Eclipse上で何かがクリックされて選択対象が変わる度に呼ばれる。
(パッケージエクスプローラー内のツリーやエディター内の文字列を選択した時でも呼ばれるので、かなりの頻度になる)

	/**
	 * We can use this method to dispose of any system
	 * resources we previously allocated.
	 * @see IWorkbenchWindowActionDelegate#dispose
	 */
	public void dispose() {
	}
}

dispose()は、最後(Eclipseが終了するときとか)に呼ばれる。


Eclipseプラグインへ戻る / Eclipseへ戻る / 技術メモへ戻る
メールの送信先:ひしだま