下面的代码是才真正实现了我们新插件的功能,假设这个插件名子是NoticeView:
package com.nidapeng.eclipse.plugin.pde;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(); } }} |
象上面的第一个Welcome插件,这个新插件同样继承了ViewPart,不同的是实现了三个接口:Runnable,IResourceChangeListener ,IResourceDeltaVisitor。其中的Runnable大家应该很熟悉:多线程的接口。而IResourceChangeListener和IResourceDeltaVisitor是Eclipse系统中的资源接口,这里的资源是指Eclipse中的项目或文件等。在下面运行NoticeView插件的过程中你可以通过添加、打开、删除项目或文件来触发这两个接口中的事件,并在我们的观察窗口中显示相关信息。 上一页 下一页