Eclipseを使っていて日常的に利用する機能の1つにウィザードがあります。ウィザードとはプロジェクトやファイルを作成する際に使用するダイアログのことで、必要な情報を順に入力していくことでプロジェクトやクラスのひな型を生成することができます。ウィザードの中でもJavaプロジェクトやJava クラスを作成するためのウィザードは普段皆さんもよく利用されていることと思います。前回と前々回でXMLエディタを作成しましたので、今回はXMLファイルを作成するためのウィザードを実装してみようと思います。
実装に取り掛かる前にウィザードの基本構造について軽く触れておきましょう。ウィザードは複数のウィザードページから成り、ウィザードダイアログ下部の[次へ][前へ]をクリックすることで前のページや次のページへ遷移することができます(簡単なウィザードの場合はページが1つしかない場合もあります)。また、[終了]をクリックすると入力された情報を基にファイルやプロジェクトの作成を行います。
こういったウィザードをゼロから実装しようとすると、ページ間での遷移(ウィザードでの入力内容に応じて遷移するページが変わる場合など)や、どのページで[終了]ボタンをクリックすることができるのか、など考えなければいけないことが多々あります。JFaceにはウィザードの実装を支援するフレームワークが用意されており、これを利用することで面倒な部分をフレームワーク側に任せることができ、ウィザードページの実装に集中することができます。
図1 ウィザードの動き
まずは第1ステップということで、ウィザードページを1つだけ持ち、ファイル名を入力すると以下のようなXML宣言を含むXMLファイルを作成するウィザードを作成してみます。
<?xml version="1.0" encoding="プロジェクトの文字コード"?> |
いつもどおりプラグインプロジェクトを作成し、マニフェストエディタの[依存関係]タブで以下のプラグインを追加します。
- org.eclipse.core.resources
- org.eclipse.ui.ide
追加後の様子は以下のようになります。
図2 依存関係を追加したところ (クリックすると拡大)
次に[拡張]タブでウィザードの宣言を追加します。使用する拡張ポイントはorg.eclipse.ui.newWizardsです。拡張ポイントを追加後、さらに右クリックから[新規]→[wizard]を選び、ウィザードの情報を以下のように入力します。
図3 ウィザードを追加したところ (クリックすると拡大)
このときのplugin.xmlは以下のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
<plugin>
<extension
point="org.eclipse.ui.newWizards">
<wizard
class="jp.sf.amateras.xmlwizard.XMLNewWizard"
icon="icons/sample.gif"
id="jp.sf.amateras.xmlwizard.wizard"
name="XMLファイル"/>
</extension>
</plugin>
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
<plugin>
<extension
point="org.eclipse.ui.newWizards">
<wizard
class="jp.sf.amateras.xmlwizard.XMLNewWizard"
icon="icons/sample.gif"
id="jp.sf.amateras.xmlwizard.wizard"
name="XMLファイル"/>
</extension>
</plugin> |
wizard タグのclass属性で指定しているクラスがウィザードの実装クラスになります。マニフェストエディタでclassの部分のリンクをクリックすると、クラスのひな型を作成することができますので、以下のように実装します。
package jp.sf.amateras.xmlwizard;
import org.eclipse.core.resources.IFile;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
public class XMLNewWizard extends Wizard implements INewWizard {
private IStructuredSelection selection;
private XMLNewWizardPage page1; …(1)
public XMLNewWizard() {
super();
setNeedsProgressMonitor(true);
setWindowTitle("新規XMLファイル");
}
public void init(IWorkbench workbench, IStructuredSelection selection)
{
this.selection = selection;
}
/** ウィザードページの作成 */
public void addPages() { …(2)
this.page1 = new XMLNewWizardPage("page1", this.selection);
this.page1.setFileName("newfile.xml");
this.page1.setTitle("新規XMLファイル");
this.page1.setDescription("新規XMLファイルを作成します。");
addPage(this.page1);
}
/** 終了ボタンがクリックされたときの処理 */
public boolean performFinish() { …(3)
IFile file = this.page1.createNewFile();
if(file==null){
return false;
}
try {
IWorkbenchPage page =
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IDE.openEditor(page, file, true);
} catch(PartInitException ex){
ex.printStackTrace();
return false;
}
return true;
}
} |
(1)のXMLNewWizardPageが実際にファイル名の入力を行うウィザードページになります。ウィザードページは(2)のaddPages()メソッド内で初期化され、addPage()メソッドでウィザードに追加されています。もしウィザードが複数のページを持つのであれば同じようにインスタンスを生成してaddPage()で追加してやればOKです。
(3)ではウィザードで[終了]ボタンがクリックされたときの処理を実装しています。XMLファイルの作成処理そのものはウィザードページ内に実装するので、ここでは単にcreateNewFile()メソッドを呼び出し、作成が成功したらエディタで開くという処理を行っています。
次にウィザードページを実装します。Eclipseでは標準で汎用的なウィザードページがいくつか用意されており、簡単なものであればそれらを拡張して利用することが可能です。ここではファイルの作成に利用できる.org.eclipse.ui.dialogs.WizardNewFileCreationPage.というウィザードページを継承して作成してみることにします。
package jp.sf.amateras.xmlwizard;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
public class XMLNewWizardPage extends WizardNewFileCreationPage
{
public XMLNewWizardPage(String pageName, IStructuredSelection selection)
{
super(pageName, selection);
}
/** 新規作成するファイルの内容を作成します */
protected InputStream getInitialContents() { …(1)
try {
// 文字コードを取得
String projectName = getContainerFullPath().segment(0);
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
String charset = project.getDefaultCharset();
// 作成するXMLファイルの内容を作成
StringBuffer sb = new StringBuffer();
sb.append("<?xml version=\"1.0\"");
if(charset!=null){
sb.append(" encoding=\"" + charset + "\"");
}
sb.append("?>\n");
return new ByteArrayInputStream(sb.toString().getBytes());
} catch(Exception ex){
ex.printStackTrace();
}
return null;
}
/** 入力値のバリデーション */
protected boolean validatePage() { …(2)
boolean valid = super.validatePage();
if(valid){
// 拡張子はxmlのみ許可
if(!getFileName().endsWith(".xml")){
setMessage("拡張子がxmlではありません。", ERROR);
return false;
}
}
return valid;
}
} |
通常、ウィザードページではcreateControl()メソッドをオーバーライドしてユーザー・インターフェイスを作成するのですが、ここではスーパークラスである WizardNewFileCreationPage で実装されているためオーバーライドする必要はありません。(1)のgetInitialContents()メソッドでファイルの内容を作成し、(2)のvalidatePage()メソッドでは入力されたファイル名の拡張子をチェックする処理を行っています。なお、このほかにもすぐに利用可能なウィザードページの実装として表1のようなものが用意されています(JDTによって提供されているものも含みます)。また、このほかにもプロジェクトのインポート/エクスポートを行うものなどさまざまなウィザードページが用意されていますので、必要に応じて利用を検討してください。
クラス名 |
用途 |
org.eclipse.ui.dialogs.WizardNewFileCreationPage |
ファイルを作成 |
org.eclipse.ui.dialogWizardNewFolderMainPages |
フォルダを作成 |
org.eclipse.ui.dialogs.WizardNewProjectCreationPage |
プロジェクトを作成 |
org.eclipse.jdt.ui.wizards.NewJavaProjectWizardPage |
Javaプロジェクトを作成 |
org.eclipse.jdt.ui.wizards.NewPackageWizardPage |
Javaパッケージを作成 |
org.eclipse.jdt.ui.wizards.NewClassWizardPage |
Java クラスを作成 |
org.eclipse.jdt.ui.wizards.NewInterfaceWizardPage |
Javaインターフェイスを作成 |
org.eclipse.jdt.ui.wizards.NewAnnotationWizardPage |
Javaアノテーションを作成 |
org.eclipse.jdt.ui.wizards.NewEnumWizardPage |
Java列挙型を作成 |
表1 再利用可能なウィザードページ |
では作成したXMLファイル作成ウィザードの動作を確認してみましょう。ランタイムワークベンチを起動後、適当なプロジェクトを作成したうえで[ファイル]→[新規]→[その他]からウィザードの一覧を表示し、[その他]→[XML ファイル]を選択してください。以下のようなウィザードが起動するはずです。
図4 作成したXMLウィザード