使用过Eclipse的人,应该都对向导(wizard)不陌生。创建一个Java工程、导入一个项目等等都会用到向导。向导的作用非常简单,也非常重要——不让你在“阴沟里翻船”。 首先,所有向导做的事情(增加、修改工程配置文件)都可以通过手动做到,但是容易出错。 其次,经常性、重复性的比较麻烦但还有规律的事情,都可以通过向导做到。比如:你们团队对于项目都有一些一致性的配置。 最后呢,把你们团队中的模块开发加上“相对”的话,不是会显得更加专业吗?
增加依赖org.eclipse.ui.ide 在plugin.xml中添加扩展点 [codesyntax lang="xml"]
<extension
point="org.eclipse.ui.newWizards">
<category name="SuRen Project"
id="org.suren.littlebird.category"/>
<wizard class="org.suren.littlebird.wizard.SuRenWizard"
category="org.suren.littlebird.category"
name="SuRen Project Wizard"
id="org.suren.littlebird.wizard"/>
</extension>
[/codesyntax] 继承类Wizard,实现接口INewWizard [codesyntax lang="java"]
package org.suren.littlebird.wizard;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.dialogs.WizardNewProjectCreationPage;
/**
* @author suren
* @date 2015-4-2
* 工程向导
* http://surenpi.com
*/
public class SuRenWizard extends Wizard implements INewWizard
{
private WizardNewProjectCreationPage creationPage;
public SuRenWizard()
{
super();
System.out.println("SuRenWizard");
}
/**
* 增加向导页面
*/
@Override
public void addPages()
{
System.out.println("addPage");
creationPage = new WizardNewProjectCreationPage("Setting");
creationPage.setDescription("SuRen Project Wizard");
creationPage.setTitle("Hi");
addPage(creationPage);
}
/**
* 完成向导时执行
*/
@Override
public boolean performFinish()
{
IProject project = creationPage.getProjectHandle();
try
{
project.create(null);
project.open(null);
IProjectDescription projectDesc = project.getDescription();
String[] natureIds = projectDesc.getNatureIds();
String[] newNatureIds = new String[natureIds.length + 1];
newNatureIds[0] = "suren.nature";
System.arraycopy(natureIds, 0, newNatureIds, 1, natureIds.length);
projectDesc.setNatureIds(newNatureIds);
project.setDescription(projectDesc, null);
return true;
}
catch (CoreException e)
{
e.printStackTrace();
}
return false;
}
@Override
public void init(IWorkbench wordbench, IStructuredSelection selection)
{
System.out.println("init");
}
}
[/codesyntax] 上面的代码,是重新定义了一个Wizard,也可以继承一个现有的(例如:新建Java类文件的类NewClassCreationWizard)。 上面使用的Page类是WizardNewProjectCreationPage,如果需要自定义的话,下面有介绍如何自顶一个Page。
继承org.eclipse.jface.wizard.WizardPage,重写方法public void createControl(Composite parent),在这个方法里一定要记得调用setControl。另外,要注意的是createControl的参数parent的布局管理器,是org.eclipse.jface.wizard.WizardDialog$PageContainerFillLayout。
只要在Wizard类中的addPages方法内,把多个Page实例对象通过addPage添加即可。
在实现Page的时候,有些是必填项——必须填入合法的数据才能点下一步(Next)或者完成(Finish)。我们可以调用方法org.eclipse.jface.wizard.WizardPage.setPageComplete(false),先将下一步(Next)或者完成(Finish)按钮设置为不可用,等数据填写好后在设置为true即可。 那怎么样才能知道数据有没有填写好呢,我这里推荐使用观察者设计模式来做。可以实现一个观察者(java.util.Observer)的子类,再实现一个被观察对象(java.util.Observable)。
看看Eclipse插件的HelloWorld怎么写。
http://blog.itpub.net/13081368/viewspace-374853/
上面的文章中用到了Nature和Builder,详情请看这里。
如果你想让别人可以扩展你的插件的话,可以自定义扩展点。