可以使用 org.eclipse.ui.newWizards 扩展点来将向导添加到工作台中的文件 -> 新建菜单选项中。自述文件工具示例使用此扩展点定义来添加“自述文件”向导:
<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)描述当使用向导选择对话框来查找和启动向导时,要将向导分组到何处。类别名称(name)(“示例创建向导”)定义在向导中所使用的标号。向导本身也被分配给类别。 它的名称(name)、图标(icon)和描述(description)全部都显示在下面的新建向导选择对话框中。
所有这些都是根据 plugin.xml 文件中的标记显示的。在用户选择下一步按钮之前,任何插件代码都不会运行。一旦按了此按钮,工作台就将实例化在标记中指定的向导类, 并将它作为期望的选择类来传送。
在此扩展中标识的类(ReadmeCreationWizard)必须实现 INewWizard 接口。尽管这是一种实现机制,并且并不是扩展点所必需的,但是, 大多数向导还是通过扩展平台向导类来执行该操作。
向导本身很少执行操作,只是在其中创建页面。让我们首先考察页面的实现,然后再返回到该向导。
工作台提供了基本向导页面类,它们支持对每个向导扩展点执行的处理类型。可以使用这些页面,或者扩展它们以添加附加处理。
ReadmeCreationWizard 的目的是创建新文件、 向文件中添加必需的内容以及在文件上打开编辑器(可选)。页面需要定义一些控件来让用户指定文件中应包含哪些内容,以及是否应该启动编辑器。
通过扩展 WizardNewFileCreationPage 来创建向导页面 CreateReadmePage1。向导页面的控件的定义类似于视图或编辑器的控件的定义。该页面实现 createControl 方法, 创建必需的 SWT 小窗口来作为提供的组合体的子代。由于超类已经添加了支持新文件处理的小窗口, 因此只需要扩展向导页面中的 createControl 方法, 就可以添加用来控制生成小节和打开编辑器的附加复选框。
public void createControl(Composite parent) {
// 继承缺省容器和命名规范小窗口
super.createControl(parent);
Composite composite = (Composite)getControl();
...
// 样本小节生成组
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));
...
// 样本小节生成复选框
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);
...
// 打开文件以进行编辑复选框
openFileCheckbox = new Button(composite,SWT.CHECK);
openFileCheckbox.setText("Open file for editing when done");
openFileCheckbox.setSelection(true);
...
}
如果您理解了标准小窗口工具箱中的概念, 就应该能够理解此代码。
实现页面的基本模式包括:
将侦听器添加到影响页面的动态行为的所有控件中。例如,如果选择列表中的某项或者选择某个框会影响页面中的其他控件的状态, 则添加侦听器,以便您可以更改该页面的状态。
如果启动了向导,则根据当前数据来填充控件。某些数据可能取决于其他控件中的值。某些控件可能使用对话框设置来初始化它们的值。
如果用户提供了足够的信息,则使用 setPageComplete(true) 来退出该页面(并移到下一页或者完成向导)。
ReadmeCreationPage 类从 WizardNewFileCreationPage 中继承了许多这种行为。浏览这些类的实现以获取进一步的信息。
既然已经了解了页面所执行的任务,让我们再了解一下向导。
向导负责创建页面和提供“完成”逻辑。
实现向导的基本模式包括:
实现 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 来完成任务。
多页面向导通常在向导本身中处理完成逻辑,因为每个页面将添加用来确定任务是如何实现的信息。单页面向导可以实现向导中的逻辑或者请求页面完成作业。您采用的方法很大程度上取决于您的重要状态保存在何处。在自述文件向导中,我们将请求页面来进行完成处理。
public boolean performFinish() {
return mainPage.finish();
}
完成的向导应为如下所示: