S-JIS[2013-04-06/2015-04-29] 変更履歴

Eclipseプラグイン ウィザードページ

Eclipseプラグイン開発のWizardPageについて。


概要

ウィザード内で実際に表示される各ページはWizardPageクラスを継承して実装する。

WizardPageを直接継承してもよいが、他のウィザードで使われていて自分も使えるWizardPageもある。

クラス名 使途
WizardNewFileCreationPage 新規ファイルを作成する。(ファイル名を入力する)
WizardNewFolderMainPage 新規ディレクトリーを作成する。
WizardNewProjectCreationPage 新規プロジェクトを作成する。
WizardNewProjectReferencePage プロジェクトを選択する。
WizardExportResourcesPage エクスポート(出力)するファイル(リソース)を複数選択する。
WizardResourceImportPage  
NewClassWizardPage 新規クラスを作成する。(クラス名を入力する)

WizardExportResourcesPageの例

WizardExportResourcesPageは、エクスポートするファイル(リソース)を選択するページ。
ワークスペース内のファイルを選択したいなら、これが使えそう。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.ui.dialogs.WizardExportResourcesPage;
public class MySelectFilePage extends WizardExportResourcesPage {
	public MySelectFilePage(IStructuredSelection selection) {
		super("MySelectFilePage", resourceSelection(selection));

		setTitle("ファイルの選択");
		setDescription("ファイルを1つ選択して下さい。");
	}

selectionに指定されているリソース(ファイル)が初期状態で選択される。
ただしIResource以外のものが指定されているとClassCastExceptionが発生する(Eclipse3.7)。
(javaファイル等はIJavaElementであってIResourceではないので要注意)

	private static IStructuredSelection resourceSelection(IStructuredSelection selection) {
		if (selection == null) {
			return selection;
		}

		List<IResource> list = new ArrayList<IResource>();
		for (Iterator<?> i = selection.iterator(); i.hasNext();) {
			Object object = i.next();
			if (object instanceof IResource) {
				list.add((IResource) object);
			} else if (object instanceof IJavaElement) {
				IResource resource = ((IJavaElement) object).getResource();
				list.add(resource);
			}
		}
		return new StructuredSelection(list);
	}
	@Override
	public void handleEvent(Event event) {
	}

	@Override
	protected void createDestinationGroup(Composite parent) {
	}
	@Override
	protected boolean validateSourceGroup() {
		List<?> list = super.getSelectedResources();
		if (list == null || list.size() != 1) {
			setErrorMessage("ファイルを1つだけ選択して下さい。");
			return false;
		}
		return true;
	}

表示されているツリーからファイルを選択したり選択を解除したりすると、validateSourceGroup()(やvalidateDestinationGroup()・validateOptionsGroup())が呼ばれる。
そこで次ページへ遷移していいかどうかチェックする。

	public IFile getSelectedFile() {
		List<?> list = super.getSelectedResources();
		if (list != null && !list.isEmpty()) {
			return (IFile) list.get(0);
		}
		return null;
	}
}

getSelectedFile()は、ウィザードのperformFinish()から呼ぶ想定で用意した。


WizardNewFileCreationPageの例

WizardNewFileCreationPageは、新規に作成するファイル名を入力するページ。
実際のファイルの作成もこのクラスで行われる。

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
public class MyFileCreationPage extends WizardNewFileCreationPage {

	private String contents;
	public MyFileCreationPage(IStructuredSelection selection) {
		super("MyFileCreationPage", selection);

		setTitle("作成ファイル名の指定");
		setDescription("作成するファイルの名前を入力して下さい。");

		setFileExtension("txt");
	}
	public void setInitialContents(String contents) {
		this.contents = contents;
	}
	@Override
	protected InputStream getInitialContents() {
		if (contents == null) {
			return null;
		}

		byte[] buf;
		try {
			buf = contents.getBytes("UTF-8");
		} catch (UnsupportedEncodingException e) {
			throw new RuntimeException(e);
		}
		return new ByteArrayInputStream(buf);
	}
}

getInitialContents()で、ファイル作成時のファイルの中身(初期値)を定義できる。
空のファイルでいい場合はnullを返しておけば良い。

メソッド名 説明 備考
setContainerFullPath(path) 作成するファイルの場所(ディレクトリー)の初期値を指定する。[2013-04-21] 初期ディレクトリーは、コンストラクターのselectionか、当メソッドで指定する。
setFileName("test.txt") 作成するファイル名の初期値を指定する。[2013-04-21]  
setFileExtension("txt") 作成するファイル名の拡張子を指定する。 入力されたファイル名がこの拡張子でない場合、自動的に拡張子が付加される。
setAllowExistingResources(true); 作成するファイルが既存だったときに警告する。[2013-04-21] false(デフォルト)だと、ファイルが既存の場合はエラーとなり、次ページへ進めなくなる。

ファイルを作成するには、WizardクラスのperformFinishメソッド辺りからcreateNewFileメソッドを呼び出す。[2014-11-01]

		IFile file = myFileCreationPage.createNewFile();

このとき、内部でgetInitialContents()(ファイルの初期値(中身)を返すメソッド)が呼び出される。


デフォルトでは(ファイルを作成せずに)ファイル名だけを取得する方法は無い。[2014-11-01]
自分でそういうメソッドを作ることは出来る。

public class MyFileCreationPage extends WizardNewFileCreationPage {
〜
	public IFile getFile() {
		IPath containerPath = getContainerFullPath();
		IPath newFilePath = containerPath.append(getFileName());
		IFile newFileHandle = createFileHandle(newFilePath);
		return newFileHandle;
	}

次ページへの遷移

ウィザードページ内のテーブルやツリー等をダブルクリックした際に次ページへ遷移する方法。[2015-04-29]

ダブルクリックイベントのハンドラーの中で以下のような処理を行う。

MyWizardPage.java:

		if (isPageComplete()) {
			IWizardPage nextPage = getNextPage();
			if (nextPage != null) {
				getContainer().showPage(nextPage);
			} else {
				if (getWizard().performFinish()) {
					((WizardDialog)getContainer()).close();
				}
			}
		}

参考: NewWizardSelectionPage#advanceToNextPageOrFinish()


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