|
ファイルやクラス等を新規作成するウィザードには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を指定する。