在popupmenu中选中 一个菜单项时,我期望能够启动 一个wizard,进行简单的配置。
Eclipse PDT提供了NewWizard的模板,它是使用的org.eclipse.ui.newwizards扩展点;它在plugin.xml中定义了一个category和一个wizard。使用模板创建出来的插件必须要用new来启动,这不是我想要的。
查看Eclipseme和FatJar的源码,发现它们启动wizard用的都是同一种方式:
WizardDialog dialog = new WizardDialog(shell, this);
return (dialog.open() == Window.OK);
使用WizardDialog,将shell和Wizard对象的实例传入来构建WizardDialog后启动即可。
这也是NewWizard模板隐藏了的部分。
Wizard实现中需要注意的就是addPages方法,注意它还有一个addpage方法,两个方法之间是调用的关系;还有performFinish方法,当Wizard Finish后,这个方法会被调用;还有dialog.open(),如果Wizard以Finish结束,它是会返回OK的;如果被Cancel掉,则返回FALSE。
而WizardPage实现中的核心方法就是CreateControl了。这个CreateControl的实现很值得研究。因为,在这个方法中,要创建Page上面的很多控件,比如button、Text、Label;消息是怎么传递到这些控件的呢?
一般的实现方法是,先构建父容器,然后用父容器将这些控件add进去。我没有找到add,CreateControl用的是另外一种办法,就是在构建子控件时,直接将父容器的引入传递了进去。这个就是所谓的构建时传入。
AOC有三种方法,set、register和构建时传入,createControl用的是第三种。
这种方法就有点类似于WIN32里面的CreateWindow函数,其实就是把这些操作封装起来了。
CreateControl传入的父容器的引用是Composite类型的。它是org.eclipse.swt.widget包的一个类。它继承自Scrollable,而Scrollable继承自Control;
对Composite的定义是,一个能够容纳Control的Control。
在CreateControl中,并不是直接将传入的Composite作为父。而是构建一个composite,作为中间层。在createControl中的最后一句非常关键:setControl(comp);
本文介绍了如何在Eclipse插件开发中使用WizardDialog启动Wizard,通过分析Eclipseme和FatJar源码,展示了如何创建并启动Wizard。在Wizard实现中,重点讨论了addPages方法、performFinish方法以及dialog.open()的返回值。对于WizardPage,文章聚焦于CreateControl方法,解释了如何构建页面控件,特别是如何利用Composite类作为控件容器,以及创建控件时的构建时传入策略。
400

被折叠的 条评论
为什么被折叠?



