使用过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)。
到目前为止,本文介绍的都是如何自定义一个向导(Wizard),那么要想在某一个向导结束后自动打开另一个向导该怎么做呢?这里,就只能通过编码的方式来打开一个向导了。 [codesyntax lang="java"]
protected void openNextWizard(final INewWizard wizard) {
Display.getDefault().asyncExec(new Runnable(){
@Override
public void run() {
IWorkbench workbench = PlatformUI.getWorkbench();
IWorkbenchWindow activeWorkbenWindow = workbench.getActiveWorkbenchWindow();
IViewPart view = getViewPart(activeWorkbenWindow.getActivePage());
ISelection selection = null;
if(view != null) {
selection = view.getSite().getSelectionProvider().getSelection();
}
if(selection instanceof IStructuredSelection) {
wizard.init(workbench, (IStructuredSelection) selection);
} else {
wizard.init(workbench, null);
}
Shell shell = activeWorkbenWindow.getShell();
WizardDialog wizardDialog = new WizardDialog(shell, wizard);
wizardDialog.open();
}
});
}
private IViewPart getViewPart(IWorkbenchPage activePage) {
IViewPart view = activePage.findView("org.eclipse.jdt.ui.PackageExplorer");
if(view == null) {
view = activePage.findView("org.eclipse.ui.navigator.ProjectExplorer");
}
return view;
}
[/codesyntax] 上面的代码片段演示了如何根据当前打开的编辑器查找对应的源文件以及打开一个向导。
在向导结束后,如果需要向文件中写入内容的话,可以参考下面的代码片段: [codesyntax lang="java"]
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IFolder outputRoot = root.getFolder(new Path(output));
IContainer container = (IContainer) outputRoot;
final IFile file = container.getFile(new Path(page.getFileName()));
InputStream stream = new ByteArrayInputStream(content.getBytes("UTF-8"));
if(file.exists()){
file.setContents(stream, true, true, null);
}else{
IFolder jspFolder = (IFolder) file.getParent();
if(!jspFolder.exists()) {
jspFolder.create(true, true, null);
}
file.create(stream, true, null);
file.setCharset("UTF-8", null);
}
stream.close();
[/codesyntax]
看看Eclipse插件的HelloWorld怎么写。
http://blog.itpub.net/13081368/viewspace-374853/
上面的文章中用到了Nature和Builder,详情请看这里。
如果你想让别人可以扩展你的插件的话,可以自定义扩展点。