Wizards的学习与创建
第一章 wizard了解
一个Wizard主要由Wizard Dialog、Wizard、Wizard Page三部分组成,如图。
其中Wizard Dialog定义了Wizard中的按钮并管理所提供的向导项页面;Wizard用于控制向导中的外观和行为;Wizard Page定义了向导项页面显示内容的控制机制。
Eclipse提供的三个扩展点:
新建向导 org.eclipse.ui.newWizard
导入向导 org.eclipse.ui.importWizard
导出向导 org.eclipse.ui.exportWizard
第二章 wizard的创建实例
下面将以org.eclipse.ui.newWizardsd的使用为例,创建wizard。
通过FileàNewàProjectàPlug-in DevelopmentàPlug-in Projectà输入项目名—>模板选择Coustom plug-in wizard—>可选模板都不用àfinish。
创建plugin.xml和如图所示的类。
主要包括向导类(MyNewWizard)和向导页面(可多个,实例中FirstWizardPage和SecondWizardPage)。
向导类继承Wizard类并实现INewWizard接口。
想到页面类主要是继承WizardPage类。
这两个类的常用方法见附录
plugin.xml 内容如下所示
id要求唯一,category的显示参考下图。
MyNewWizard的代码如图所示
public class MyNewWizard extends Wizard implements INewWizard{
private FirstWizardPage newItemWizardPage; private SecondWizardPage editListsConfigPage; private ISelection selection; public MyNewWizard(){
super(); setNeedsProgressMonitor(true); } @Override public void init(IWorkbench arg0, IStructuredSelection selection) { // TODO Auto-generated method stub this.selection = selection; }
@Override public void addPages() { // TODO Auto-generated method stub newItemWizardPage=new FirstWizardPage( selection); addPage(newItemWizardPage); editListsConfigPage=new SecondWizardPage(selection); addPage(editListsConfigPage);
} @Override public boolean performFinish() { System.out.println("完成按钮被按下!"); try { Thread.sleep(5000); } catch (InterruptedException e) { // 执行到这里的机率非常低 }
return true; }
} |
FirstWizardPage的代码如下
public class FirstWizardPage extends WizardPage{
private ISelection selection; private String name;
public FirstWizardPage(ISelection selection){ super("wizardPage"); setTitle("创建新元素"); setDescription("这里是描述"); //还可以在这里设定页面图像:setImageDescription setPageComplete(false); this.selection = selection; }
@Override public void createControl(Composite parent) { Composite container=new Composite(parent,SWT.NULL); GridLayout layout=new GridLayout(); layout.numColumns=1; container.setLayout(layout);
// TODO Auto-generated method stub Text text=new Text(container,SWT.BORDER); text.setText("设定名称"); text.addModifyListener(new ModifyListener() {
@Override public void modifyText(ModifyEvent e) { // TODO Auto-generated method stub Text text=(Text)e.getSource(); name=text.getText(); if(name==null||name=="") updateStatus("请输入名字"); else updateStatus(null);
}
}); Combo combo = new Combo(container,SWT.NONE); combo.setText("设定类别"); combo.add("普通"); combo.add("同事"); combo.add("商业"); combo.add("朋友"); setControl(container);
} private void updateStatus(String message) { setErrorMessage(message); setPageComplete(message == null); }
} |
SecondWizardPage的内容和FirstWizardPage的内容大体相似,可以稍作改动,用于在点击下一步操作时发现不同。
运行结果:
1.
2.
3.
4.
附录
3.1 关于生命期的方法
我们需要重写这些方法来加入关于那些初始化和销毁定制的向导代码。
● 构造器。这个方法将在向导进行实例化的时候、并且Eclispe向它传送信息之前调用。是向导的常规信息初始化的实现。通常情况下你会调用“美化方法”(见下面)来给对话框做默认设置。
● init(IWorkbench workbench, IStructuredSelection editorSelection):这个方法由Eclipse调用,它给向导提供一些工作取信息。重写这个方法来处理Iworkbench和之后将使用的对象。如果这是个编辑向导而不是新建向导,我们需要将当前编辑器的选择项也作为一个参数。
● dispose():由Eclipse调用来处理回收。重写这个方法来回收向导所占用的资源。
● finalize():对于回收处理,建议采用dispose()方法调用。
3.2 美化方法
以下的方法将装饰这个向导窗口:
● setWindowTitle(String title):调用这个方法来取得标题栏字符。
● setDefaultPageImageDescriptor(ImageDescriptor image):调用这个方法来取得显示在所有向导页右上角的图片。
● setTitleBarColor(RGB color):调用这个方法来来定义标题栏的颜色。
3.3 按钮的常用方法。
● boolean canFinish():重写这个方法,根据向导的状态来指明Finish按钮是否可用。
● boolean performFinish():重写这个方法,实现这个向导最根本的业务逻辑。如果向导不能完成(产生错误)则返回false。
● boolean performCancel():重写这个方法,当用户单击Cancel按钮的时候做清除操作。如果这个向导不能取消,返回false。
● boolean isHelpAvailable():重写这个方法,定义Help按钮是否可见。
● boolean needsPreviousAndNextButtons():重写这个方法,定义Previous和Next按钮是否可见。
● boolean needsProgressMonitor():重写这个方法,指明过程监听器控件是否可见。它将在单击“Finish”按钮后调用performFinish()方法的时候出现。
3.4 页面的常用方法
● addPages():当向导框出现的时候调用。重写这个方法给向导添加新页面。
● createPageControls(Composite pageContainer):Eclipse调用这个方法将向导中所有页面(由上面的addPages()方法添加的)实例化。重写这个方法,添加向导中一直可见的控件(不仅仅是页面)。
● IWizardPage getStartingPage():重写这个方法来定义向导的第一个页面。
● IWizardPage getNextPage(IWizardPage nextPage):在默认情况下,单击Next按钮将得到addPages()方法提供的页面数组中下一页。你可能需要根据用户的选择而转向不同的页面。重写这个方法来得到下个页面。
● IWizardPage getPreviousPage(IWizardPage previousPage):与getNextPage()方法类似,用来计算得到前一个页面。
● int getPageCount():返回使用addPages()方法添加的页面个数。你不需要重写这个方法,除非你想显示和页面实际数量不一致的数量。
3.5 其他方法
这里有很多有用的辅助性方法:
● setDialogSettings(IDialogSettings settings):你可以加载对话框的设置并调用init()方法来发布其中的数据。典型的,向导中的题设置是默认的,在这里(DialogSettings)察看更多的信息。
● IDialogSettings getDialogSettings():使用这个方法可以找回需要的数据。在performFinish()方法的最后,你可以将数据再次存入文件。
● IWizardContainer getContainer():可以得到Shell对象,运行后台线程,刷新窗口,等等。
3.6 向导页方法
我们已经看到,一个向导是一个或者多个页面的组合。这些页面继承WizardPage类并实现了IwizardPage接口。为了定制一个个性化的向导,还有很多方法是必须掌握的。这里介绍一些比较重要的方法:
● 构造器:初始化页面
● dispose():重写这个方法,实现清除代码。
● createControl(Composite parent):重写这个方法,为这个页面添加控制器。
● IWizard getWizard():用来得到向导对象。在调用getDialogSettings()方法的时候有用。
● setTitle(String title):为向导的标题区提供显示的文字。
● setDescription(String description):提供显在在标题文字下的信息。
● setImageDescriptor(ImageDescriptor image):得到一个图片,用来取代西安在在向导右上角的默认图片。
● setMessage(String message):在描述信息的下方显示的文本信息,一般用来提示或者警告用户。
● setErrorMessage(String error):在描述信息的下面高亮度显示一个字符串。它表示向导在处理完错误信息之前不能做下一步的操作。
● setPageComplete(boolean complete):如果输入参数是true,那么Next按钮可以使用。
● performHelp():重写这个方法,提供内容敏感的帮助。这个将在Help按钮被按下的时候被向导调用。