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

Eclipseプラグイン 新規ウィザード

Eclipseプラグイン開発の新規ウィザードについて。


概要

ファイルやクラス等を新規作成するウィザードにはINewWizardを使う。
これを定義すると、メニューバーの「ファイル(F)」→「新規(N)」→「その他(O)」で開く「新規」ダイアログ内のメニューになる。


新規ウィザードを作るには、INewWizardを実装したクラスと、その内部で実際に表示されるWizardPageクラスを用意する必要がある。
それと、plugin.xmlにウィザードを登録する必要がある。


WizardPage実装クラス

import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
public class MyPage extends WizardPage {

	private Text text;
	public MyPage() {
		super("MyPage");
		setTitle("タイトル111");
		setDescription("desc111");
	}

親クラスのコンストラクター(super(pageName))にはシステム内部で使うページ名を渡す。ユーザーの目に直接触れるものではないようなので、クラス名と同じ文字列にしておけば良さそう。
setTitle()はページ内に表示されるタイトル。
setDescription()はページ内に表示される説明文。
setErrorMessage()によってエラーメッセージをセットすると、説明文が一旦消えてエラーメッセージが表示される。

	@Override
	public void createControl(Composite parent) {
		Composite composite = new Composite(parent, SWT.NONE);
		composite.setLayout(new GridLayout(2, false));

		{
			Label label = new Label(composite, SWT.NONE);
			label.setText("ラベル");

			text = new Text(composite, SWT.NONE);
			text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
			text.addModifyListener(new ModifyListener() {
				@Override
				public void modifyText(ModifyEvent e) {
					refresh();
				}
			});
		}

		setControl(composite);
	}

createControl()で、ページ内に表示するラベルや入力エリアを用意する。(これはSWTを使う)
入力エリアでは入力(変更)イベントのリスナーを登録しておき、内容のチェックを行う。

	void refresh() {
		if (text.getText().isEmpty()) {
			setErrorMessage("何か入れてちょ");
			setPageComplete(false);
			return;
		}

		setErrorMessage(null);
		setPageComplete(true);
	}
}

内容のチェックを行ってエラーメッセージをセットする。
エラーがあったらsetPageComplete()にfalseをセットし、次のページへ遷移できないようにする。(Nextボタンが使用不可状態になる)
(デフォルトでは、ウィザード内の全ページのpageCompleteがtrueにならないとFinishボタンも押せない)

なお、エラーが無かった場合はsetErrorMessage()にnullを渡してクリアしないと、ずっとエラーメッセージが出た状態のままになる。
setPageComplete()にtrueをセットするのも同様。セットしないと、Nextボタンが使えない(笑)


INewWizard実装クラス

import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
public class MyNewWizard extends Wizard implements INewWizard {
	public MyNewWizard() {
		setWindowTitle("新規作成ウィザードサンプル");
	}

setWindowTitle()でウィンドウのタイトルを設定する。
これはページが遷移してもずっと変わらず表示される。

	@Override
	public void init(IWorkbench workbench, IStructuredSelection selection) {
	}

init()はINewWizardで宣言されているメソッド。
selectionには、新規ウィザード起動時に選択されていたファイルが入ってくる。
workbenchやselectionを別の場所で使いたい場合は、ここでフィールドに移しておけば良い。

	@Override
	public void addPages() {
		addPage(new MyPage());
	}

addPage()で、ウィザード内のページを登録する。
複数ページある場合は(デフォルトでは)addPage()した順番で遷移していく。

	@Override
	public boolean performFinish() {
		System.out.println("ウィザード完了");
		return true;
	}
}

Finishボタンが押されるとperformFinish()が呼ばれる。


plugin.xml

メニューバーの「ファイル(F)」→「新規(N)」→「その他(O)」で開く「新規」ダイアログに自分の新規ウィザードを出すには、plugin.xmlを記述する必要がある。

   <extension
         point="org.eclipse.ui.newWizards">
      <category
            id="example.category.new-wizard"
            name="サンプルウィザード">
      </category>
      <wizard
            category="example.category.new-wizard"
            class="com.example.wizard.MyNewWizard"
            id="example.wizard.new-example"
            name="バッチ.atoad">
      </wizard>
   </extension>

これで、メニューバーの「ファイル(F)」→「新規(N)」→「その他(O)」で開く『新規ダイアログ』に該当ウィザードのメニューが表示される。
新規メニュー直下へのメニューの配置


サブカテゴリー(カテゴリーの下に別のカテゴリーを作る)を使いたい場合は以下のようにする。[2013-09-19]

   <extension
         point="org.eclipse.ui.newWizards">
      <category
            id="example.category.new-wizard"
            name="親カテゴリー">
      </category>
      <category
            id="example.category.new-wizard.sub"
            name="サブカテゴリー"
            parentCategory="example.category.new-wizard">
      </category>
      <wizard
            category="example.category.new-wizard/example.category.new-wizard.sub"
            class="com.example.wizard.MyNewWizard"
            id="example.wizard.new-example"
            name="バッチ.atoad">
      </wizard>
   </extension>

サブカテゴリーの定義方法は普通のカテゴリーとほぼ同じで、parentCategoryで親カテゴリーを示す。

そして、ウィザード側でカテゴリーを指定する際に、スラッシュ区切りで「親カテゴリー/サブカテゴリー」を指定する。

※カテゴリーの指定が間違っている場合、「Other(その他)」というカテゴリーの下に表示される。


ウィザードを起動するメニュー

コンテキストメニュー(ポップアップメニュー)等でウィザードを起動させることが出来る。[2013-06-05]

参考: wiki.eclipse.orgのMenu Contributions/Workbench wizard contribution

plugin.xml:

   <extension
         point="org.eclipse.ui.menus">
      <menuContribution
            locationURI="popup:org.eclipse.ui.popup.any?after=additions">
         <menu
            label="example">
〜
            <command
                  commandId="org.eclipse.ui.newWizard"
                  style="push">
               <parameter
                     name="newWizardId"
                     value="example.wizard.new-example">
               </parameter>
            </command>
〜

メニュー定義でコマンドID「org.eclipse.ui.newWizard」を指定し、そのパラメーターとしてウィザードIDを指定する。


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