|
ファイルやクラス等を新規作成するウィザードにはINewWizardを使う。
これを定義すると、メニューバーの「ファイル(F)」→「新規(N)」→「その他(O)」で開く「新規」ダイアログ内のメニューになる。
新規ウィザードを作るには、INewWizardを実装したクラスと、その内部で実際に表示されるWizardPageクラスを用意する必要がある。
それと、plugin.xmlにウィザードを登録する必要がある。
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ボタンが使えない(笑)
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()が呼ばれる。
メニューバーの「ファイル(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
<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を指定する。