Eclipseのプラグイン開発のWizardPageについて。
|
|
ウィザード内で実際に表示される各ページはWizardPageクラスを継承して実装する。
WizardPageを直接継承してもよいが、他のウィザードで使われていて自分も使えるWizardPageもある。
クラス名 | 使途 |
---|---|
WizardNewFileCreationPage | 新規ファイルを作成する。(ファイル名を入力する) |
WizardNewFolderMainPage | 新規ディレクトリーを作成する。 |
WizardNewProjectCreationPage | 新規プロジェクトを作成する。 |
WizardNewProjectReferencePage | プロジェクトを選択する。 |
WizardExportResourcesPage | エクスポート(出力)するファイル(リソース)を複数選択する。 |
WizardResourceImportPage | |
NewClassWizardPage | 新規クラスを作成する。(クラス名を入力する) |
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は、新規に作成するファイル名を入力するページ。
実際のファイルの作成もこのクラスで行われる。
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]
ダブルクリックイベントのハンドラーの中で以下のような処理を行う。
if (isPageComplete()) { IWizardPage nextPage = getNextPage(); if (nextPage != null) { getContainer().showPage(nextPage); } else { if (getWizard().performFinish()) { ((WizardDialog)getContainer()).close(); } } }
参考: NewWizardSelectionPage#advanceToNextPageOrFinish()