org.eclipse.ui.newWizards 拡張ポイントを 使用すると、ウィザードをワークベンチの 「ファイル (File)」->「新規作成 (New)」メニュー・オプションに追加することができます。 readme ツールの例では、この拡張ポイント定義を使用して、次のように Readme File ウィザードを追加します。
<extension
point = "org.eclipse.ui.newWizards">
<category
id = "org.eclipse.ui.examples.readmetool.new"
name="Example Creation Wizards">
</category>
<wizard
id = "org.eclipse.ui.examples.readmetool.wizards.new.file"
name = "Readme File"
class="org.eclipse.ui.examples.readmetool.ReadmeCreationWizard"
category="org.eclipse.ui.examples.readmetool.new"
icon="icons/basic/obj16/newreadme_wiz.gif">
<description>An example of a wizard that creates sample Readme
file
</description>
<selection class="org.eclipse.core.resources.IResource"/>
</wizard>
</extension>
category は、ウィザード選択ダイアログを使用してウィザードを探し出し、 それを起動したときに、ウィザードをグループ化する場所を記述します。 category の name ("Example Creation Wizards") は、このウィザードで使用されるラベルを定義します。 このウィザード自体は、その category に割り当てられています。 name、icon、および description はすべて、以下に示す新規作成ウィザードの選択ダイアログに表示されます。
これはすべて、plugin.xml ファイルのマークアップに基づいて表示されます。 ユーザーが「次へ (Next)」ボタンを押すまでは、プラグイン・コードのどの部分も実行されません。 このボタンが押されると、ワークベンチは、マークアップで指定されている wizard の class のインスタンスを生成し、 それを期待される selection の class に渡します。
この拡張で識別されるクラス (ReadmeCreationWizard) は、 INewWizard インターフェースを インプリメントしなければなりません。 ほとんどのウィザードは、プラットフォームの Wizard クラスを拡張することによって これをインプリメントしています。ただし、これはインプリメンテーションのメカニズムであって、 拡張ポイントがこれを要求しているわけではありません。
ウィザード自体は、内部にページを作成すること以外ほとんど何も行いません。 最初に、ページのインプリメンテーションについて説明します。次に、このウィザードに戻ります。
ワークベンチは、ウィザードの拡張ポイントごとに実行される処理のタイプをサポートする、 基本ウィザード・ページ・クラスを提供しています。 これらのページを使用するか、拡張して、処理を追加することができます。
ReadmeCreationWizard の目標は、新規のファイルを作成し、必要な内容をファイルに追加し、 オプションとして、そのファイルに対してエディターを開くことです。 このページでは、ファイルに追加する内容と、 エディターを起動する必要があるのかどうかをユーザーに指定させるコントロールを定義する必要があります。
ここでは、WizardNewFileCreationPage を 拡張することにより、ウィザード・ページ CreateReadmePage1 を作成します。 ウィザード・ページのコントロールは、ビューまたはエディターのコントロールの定義に似た方法で定義されます。 このページは createControl メソッドをインプリメントし、 提供されている Composite の子として、 必要な SWT ウィジェットを作成します。 スーパークラスは、新規ファイルの処理をサポートするウィジェットをすでに追加しているので、 必要なことは、このウィザード・ページの createControl メソッドを拡張し、 エディターのセクションおよび開くの生成をコントロールするチェック・ボックスを追加することだけです。
public void createControl(Composite parent) {
// inherit default container and name specification widgets
super.createControl(parent);
Composite composite = (Composite)getControl();
...
// sample section generation group
Group group = new Group(composite,SWT.NONE);
group.setLayout(new GridLayout());
group.setText("Automatic sample section generation");
group.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL |
GridData.HORIZONTAL_ALIGN_FILL));
...
// sample section generation checkboxes
sectionCheckbox = new Button(group,SWT.CHECK);
sectionCheckbox.setText("Generate sample section titles");
sectionCheckbox.setSelection(true);
sectionCheckbox.addListener(SWT.Selection,this);
subsectionCheckbox = new Button(group,SWT.CHECK);
subsectionCheckbox.setText("Generate sample subsection titles");
subsectionCheckbox.setSelection(true);
subsectionCheckbox.addListener(SWT.Selection,this);
...
// open file for editing checkbox
openFileCheckbox = new Button(composite,SWT.CHECK);
openFileCheckbox.setText("Open file for editing when done");
openFileCheckbox.setSelection(true);
...
}
「標準ウィジェット・ツールキット」の概念を理解していると、 このコードをたどることができます。
ページのインプリメントのための基本パターンには、以下のものがあります。
ページの動的振る舞いに影響を与えるすべてのコントロールにリスナーを追加します。 たとえば、リストから項目を選択する、あるいはボックスにチェックを入れると、 そのページの他のコントロールの状態に影響する場合、そのページの状態を変更できるようリスナーを追加します。
ウィザードが起動した時点での選択に基づくデータを使用して、コントロールを充てんします。 データの一部は、他のコントロールの値に依存していることもあります。 コントロールの一部は、ダイアログの設定値を使用して、そのコントロールの値を初期化する場合もあります。
ユーザーが十分な情報を提供して、そのページを終了 (その後、次のページに移動するか、ウィザードを終了) するときに setPageComplete(true) を使用します。
ReadmeCreationPage クラスは、この振る舞いの多くを WizardNewFileCreationPage から 継承しています。 これらのクラスのインプリメンテーションをブラウズし、さらに情報がないか調べてください。
ページの実行内容を理解したところで、もう一度ウィザードを見てみましょう。
ウィザードは、ページを作成し、「終了 (Finish)」のロジックを提供します。
ウィザードのインプリメントのための基本パターンには、以下のものがあります。
ワークベンチや現行の選択などのコンテキスト情報を得るためのローカル変数をセットアップする init メソッドをインプリメントします。
public void init(IWorkbench workbench,IStructuredSelection selection) {
this.workbench = workbench;
this.selection = selection;
setWindowTitle("New Readme File");
setDefaultPageImageDescriptor(ReadmeImages.README_WIZARD_BANNER);
}
ページのインスタンスを作成し、addPages をインプリメントします。
public void addPages() {
mainPage = new ReadmeCreationPage(workbench, selection);
addPage(mainPage);
}
タスクを終了するための performFinish をインプリメントします。
タスクをどのようにインプリメントするかを決定する情報は、各ページで提供されるので、 マルチページ・ウィザードは、通常、ウィザード自体の終了ロジックを処理します。 単一ページのウィザードは、ウィザード内にロジックをインプリメントするか、ページにジョブを終了するよう要求します。 どのアプローチをとるかは、重要な状態が保管されている場所によって大きく異なります。 readme ウィザードの場合は、ページに終了処理を行うように要求します。
public boolean performFinish() {
return mainPage.finish();
}
完成したウィザードは、次のようになります。