Eclipse入门使用指南及开发Eclipse插件(5) |
| http://www.zk168.com.cn 招考学习网 2006-4-11 3:33:46 |
|
| -----------------------------------------------------------[交流]-[打印]-[发送]-[收藏]-- |
|
| Eclipse入门使用指南及开发Eclipse插件(5) 在plugin.xml中一共有四个主要的标签:plugin,requires,runtime,extension。其中plugin标签的属性提供的是我们要开发的Welcome插件的基本信息,除了name,version,provider-name等,最重要的是id,它要求不能和现有的Eclipse插件id有冲突,因此我们用包名作为插件的id。requires标签中所列出的是需要的插件,这里我们要用到Eclipse Workbench和SWT API,因此导入了org.eclipse.ui插件。runtime标签指明的是我们开发的插件所在JAR包的文件名。extension标签是插件扩展点的信息。org.eclipse.ui.views是Eclipse系统提供的观察窗口扩展点,我们的例子是一个观察窗口(View),这表明我们是要在 org.eclipse.ui.views扩展点上进一步开发。 extension中还包括category和view两个标签,在后续的启动Welcome插件步骤中,我们就会知道这两个标签的含义。要注意的是category和view标签的id的唯一性,并且在view的属性中声明了Welcome插件的类名。
在Eclipse中为plugin.xml提供了缺省可视化的编辑器,在编写plugin.xml过程中可以借助这个编辑器完成一些工作。如果你直接录入了plugin.xml文件源代码,还可以用这个编辑器校验你的代码:如果编辑器不能正确读入,就表明你的plugin.xml有一些问题。
在确认Weclome.java和plugin.xml都正确无误之后,可以用Eclipse菜单栏中的Export命令将Weclome.java导出为JAR文件,它的名子应该和plugin.xml中runtime声明的JAR相一致。同时导出plugin.xml。安装Welcome插件的方法和本文第一部分介绍的安装Tomcat插件方法是一样的:首先在"Eclipse的安装路径plugins"路径下面建立一个com.nidapeng.eclipse.plugin路径,然后将Weclome.jar和plugin.xml拷到这个路径下。之后必需重新启动Eclipse,在Eclipse启动的时候,它会搜索所有在插件路径下的插件并注册它们(仅仅是注册,只有在需要某个插件的时候,Eclipse才会启动它)。在重新启动的Eclipse的菜单栏中选择PerspectiveàShow ViewàOthers,在打开的对话框中我们会找到在plugin.xml中extension的category标签中声明的name属性:Welcome。在Welcome的支结点中包含了view标签name属性:Welcome to Eclipse。选中它并确认,Welcome窗口就会显示在Eclipse Workbench上的某个位置 。如果在执行了以上操作,但没有显示新窗口,可以再次打开Show View菜单,此时在菜单中应该有新一顶选择:Welcome to Eclipse,然后选中它。
上面我们完成了一个观察窗口的插件,但这个操作过程对开发稍微复杂一些的插件就显得不太方便了:每次测试都要将代码打包,发布,再重新启动Eclipse系统!为此Eclipse提供了一个专门为开发插件而做插件(有点绕嘴):Plug-in Development Environment(PDE)。本文前面曾提到,目前Eclipse的Release或Stable版本缺省提供了这个插件,因此如果安装的Eclipse是这两个版本中的一个就可以直接进行下面的步骤。下面我们再用PDE环境开发一个稍微复杂一些的插件。
第一步仍然要新建一个项目,只是在向导中不是用Java项目,而是Plug-in Development中的Plug-in Project。在应用向导生成新项目的时候,要注意两点:第一是PDE的项目名称就是plugin的id,因此要保证它的唯一性,这里我们的项目名是com.nidapeng.eclipse.plugin.pde。其次为了进一步说明Eclipse插件的结构,在Plug-in Code Generators中,选择用向导模板生成一个缺省的插件。
这个用缺省方式生成的插件类对于我们将要的代码并不是必需的,也可以用生成空插件的方式建立我们的项目,这样做只是为进一步说明Eclipse的插件结构。项目生成之后,在我们的项目中会包含一个PdePlugin.java文件,它就是以缺省方式生成的插件类。注意到它继承了AbstractUIPlugin类,而AbstractUIPlugin类实现了org.eclipse.ui.plugin接口。事实上,所有的Eclipse插件都会有一个相应的实现plugin接口的类,这个类将是新插件的主类(类似于有main()函数的Java类),它负责管理插件的生存期。在我们的AbstractUIPlugin继承子类中,可以用singleton模式来保存在Eclipse中的生成的该插件的第一个也是唯一实例,一般来说,在该继承子类中也要实现一个getDefault()方法以返回当前插件的实例。而且,当Eclipse首次使用该插件的时候,这个主类将是第一个被调用的类,因此我们也可以在它的代码中执行一些初始化的工作。而且如果插件需要使用Preferences,Dialogs或Images资源,也可以通过这个类中的相应方法来得到它们的实例,如用其中的getDialogSettings(),getPreferenceStore(),getImageRegistry()方法。
但是象前面提到的,PdePlugin.java对下面的例子并不是必需的,我们不用对它进行任何修改。在我们第一个例子中的Weclome插件,根本就没有生成AbstractUIPlugin的继承子类,此时系统会自动为Weclome插件生成一个缺省的主类(类似于Java类构造函数,如果没有声明,系统会指定一个默认的构造函数)。下面的代码是才真正实现了我们新插件的功能,假设这个插件名子是NoticeView:
import org.eclipse.core.resources.*; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.runtime.CoreException; import java.util.ResourceBundle; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.part.ViewPart; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; public class NoticeView extends ViewPart implements Runnable,IResourceChangeListener ,IResourceDeltaVisitor{ private ResourceBundle resourceBundle; private Label label; private Display disp; private String dispTxt; public NoticeView() { ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.PRE_CLOSE | IResourceChangeEvent.PRE_DELETE | IResourceChangeEvent.PRE_AUTO_BUILD | IResourceChangeEvent.POST_AUTO_BUILD | IResourceChangeEvent.POST_CHANGE); } public static IWorkspace getWorkspace() { //ResourcesPlugin插件的主类! return ResourcesPlugin.getWorkspace(); } public void createPartControl(Composite parent) { label = new Label(parent, SWT.WRAP); label.setText("change your project status..."); disp = Display.getDefault(); } public void setFocus() { } // 实现IResourceChangeListener接口中的resourceChanged方法 public void resourceChanged(IResourceChangeEvent event) { IResource res = event.getResource(); switch (event.getType()) { case IResourceChangeEvent.PRE_CLOSE : dispTxt = res.getFullPath() + " is about to closed!"; break; case IResourceChangeEvent.PRE_DELETE : dispTxt = res.getFullPath() + " is about to be deleted!"; break; case IResourceChangeEvent.POST_CHANGE : try { event.getDelta().accept(this); } catch (CoreException e) { e.printStackTrace(); } break; case IResourceChangeEvent.PRE_AUTO_BUILD : try { event.getDelta().accept(this); } catch (CoreException e) { e.printStackTrace(); } break; case IResourceChangeEvent.POST_AUTO_BUILD : try { event.getDelta().accept(this); } catch (CoreException e) { e.printStackTrace(); } break; } disp.syncExec(this); } // 实现IResourceDeltaVisitor接口中的visit方法 public boolean visit(IResourceDelta delta) { IResource res = delta.getResource(); switch (delta.getKind()) { case IResourceDelta.ADDED : dispTxt = "Resource "+res.getFullPath()+" was added."; break; case IResourceDelta.REMOVED: dispTxt = "Resource "+res.getFullPath()+" was removed."; break; case IResourceDelta.CHANGED : dispTxt = "Resource "+res.getFullPath()+" has changed."; break; } return true; // visit the children } // 实现Runnable接口中的run方法 public void run() { try { label.setText(dispTxt); } catch (Exception e) { e.printStackTrace(); } } } | (未完待续)
|
| -----------------------------------------------------------[交流]-[打印]-[发送]-[收藏]-- |
友情提醒:
1.库中的资料大都来自互联网、网友上传、各类书籍,在录入的过程中难免会出现错误,恳请网 友来信指正!
2.如果网友在本库中未能找到所需要的材料,请登陆到我们的论坛《招考学习网》版块!
3.考友想加入招考学习网的编辑部,请发信到XueXiWang#Gmail.com(#改为@)附带个人简历
4.如需转载请注明出处及作者,谢谢合作!
5.如果您有更好的建议或意见请EMAIL:XueXiWang#Gmail.com (#改为@)
6.凡标题中有注有“[NO]”字样均不含答案且答案整理中.
7.如本库中转载文章涉及版权等问题,请相关网站或作者在两周内发邮件通知(EMAIL: XueXiWang#Gmail.com (#改为@))我们,我们接到通知后立即删除该文章及链接! |
|