打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
eclipse插件开发中容器选择器的显示内容能否被指定
摘要:

  在开发eclipse pluin的时候,某些情况下我们需要访问eclipse workspace,例如:在插件中以编程的方式调用ant命令、访问eclipse workspace中的project等。一次在网上偶遇到本文的原创者kobye,此人正在进行jsports项目的开发,对此颇有心地,故在此行文与众人共同探讨之。

  一、基础工作-在插件中以编程的方式调用ant命令:

  在开发eclipse pluin的时候,某些情况下我们需要访问eclipse workspace,例如:在插件中以编程的方式调用ant命令等。

  如何做到这一点?

  public void execute(){

  IWorkspace ws = ResourcesPlugin.getWorkspace();

  IProject[] ps = ws.getRoot().getProjects();

  System.out.println(ws.getRoot().getFullPath().makeAbsolute().toOSString());

  for(int i=0;i<ps.length;i++){

  IProject p = ps[i];

  IPath location = p.getLocation();

  IFile ifile = p.getFile("build.xml");

  System.out.println(ifile.getLocation().toFile().getAbsolutePath());

  File f =

  new File(ifile.getLocation().toFile().getAbsolutePath());

  if(!f.exists()){

  continue;

  }

  Project pro = new Project();

  pro.setBasedir(location.toFile().getAbsolutePath());

  pro.init();

  ProjectHelper helper = ProjectHelper.getProjectHelper();

  helper.parse(pro, f);

  Hashtable tars = pro.getTargets();

  System.out.println("name==="+name);

  Target t = (Target) tars.get(name);

  if(t==null){

  return;

  }

  DefaultLogger consoleLogger = new DefaultLogger();

  consoleLogger.setErrorPrintStream(System.err);

  consoleLogger.setOutputPrintStream(System.out);

  consoleLogger.setMessageOutputLevel(Project.MSG_INFO);

  pro.addBuildListener(consoleLogger);

  pro.executeTarget(this.name);

  break;

  }

  }

  以上代码(单独编译不会通过,请把 name换位ant 的target)可以放到插件的代码中。

  以上代码的含义:

  获得eclipse workspace的引用,对workspace下的pronjects进行循环,如果该project下有build.xml并且该文件中有name的target那么就以ant的方式调用,并把ant运行的输出输出到eclipse的console。

  二、如何访问current project:

  上一节给出来在eclipse plugin 中访问eclipse workspace, 从而访问该workspace下所有project的方案,WorkSpace以及相关的类不提供直接访问current project的方法,所以只能走其他途径.

  在我们的plugin中,我们要提供界面入口,比如 PopMenu

  ActionMenu 等之类的,

  这些界面入口是要实现一些接口的,例如:PopMenu要实现IObjectActionDelegate,

  这个接口有几个方法,其中 public void selectionChanged(IAction action, ISelection

  selection) ;

  这个方法很早重要,可以通过ISelection获得当前选择中的Project.

  ISelection共有三个子接口,分别对应三个实现类,那么通过判断ISelection的实际类型可以获得其子接口的引用,

  然后对其遍历,通过getAdaptor方法获得所有的选择的IResource的引用,

  再进一步对IResource进行类型识别,得到IResource.PROJECT类型的元素即为IProject的引用.

  下面是程序:

  import java.lang.reflect.Array;import java.util.ArrayList;

  import java.util.Iterator;import org.eclipse.core.resources.IProject;

  import org.eclipse.core.resources.IResource;

  import org.eclipse.core.runtime.IAdaptable;

  import org.eclipse.jface.action.IAction;

  import org.eclipse.jface.dialogs.MessageDialog;

  import org.eclipse.jface.viewers.ISelection;

  import org.eclipse.jface.viewers.IStructuredSelection;import org.eclipse.swt.widgets.Shell;import org.eclipse.ui.IObjectActionDelegate;

  import org.eclipse.ui.IWorkbenchPart;

  /** * @author Kobye */public class TestPopMenu implements IObjectActionDelegate {

  private IStructuredSelection selection;

  /** * Constructor for Action1.

  */ public TestPopMenu () { super();

  } /** * @see IObjectActionDelegate#setActivePart(IAction IWorkbenchPart)

  */ public void setActivePart(IAction action, IWorkbenchPart targetPart) { }

  /**

  * @see IActionDelegate#run(IAction) */ public void run(IAction action) { Shell shell = new Shell();

  MessageDialog.openInformation(

  shell,

  "Pop Plug-in",

  "NewAction was executed.");

  } public static Object getAdapter(Object adaptable, Class c) { if (c.isInstance(adaptable)) {

  return adaptable; } if (adaptable instanceof IAdaptable) {

  IAdaptable a = (IAdaptable) adaptable;

  Object adapter = a.getAdapter(c);

  if (c.isInstance(adapter)) {

  return adapter;

  } } return null;

  } /*** * 这个方法和下面的方法很重要。

  * @param selection * @param c * @return */ private Object[] getSelectedResources(IStructuredSelection selection,Class c) { return getSelectedAdaptables(selection, c);

  } private static Object[] getSelectedAdaptables(ISelection selection, Class c) { ArrayList result = null;

  if (!selection.isEmpty()) {

  result = new ArrayList();

  Iterator elements = ((IStructuredSelection) selection).iterator();

  while (elements.hasNext()) {

  Object adapter = getAdapter(elements.next(), c);

  if (c.isInstance(adapter)) {

  result.add(adapter);

  }

  } } if (result != null && !result.isEmpty()) {

  return result.toArray((Object[])Array.newInstance(c, result.size())); } return (Object[])Array.newInstance(c, 0);

  } /** * 这个方法保存了ISelection的引用, * 请注意:ISelection的实际类型因不同的应用,其实际类型可能不同, * 共有三种可能,请查阅eclipse API。 * * @see IActionDelegate#selectionChanged(IAction, ISelection) */ public void selectionChanged(IAction action, ISelection selection) {

  this.selection = (IStructuredSelection) selection;

  System.out.println("current project name==="+this.getProject().getName());

  } /** * 这个方法可以得到current project。 * * @return */ private IProject getProject(){

  IResource[]rs =(IResource[])getSelectedResources((IStructuredSelection)selection,IResource.class);

  IProject project = null;

  for(int i =0;i<rs.length;i++){

  IResource r = rs[i];

  if(r.getType()==IResource.PROJECT){

  project = (IProject) r;

  break;

  }

  }

  return project; }}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
使用Eclipse RCP创建视图并实现视图间消息传递(二)
GitHub上gitee码云上下载的项目如何导入Eclipse中使用
Eclipse中从svn中检出maven项目
Checkstyle使用参考
android uiautomator学习(一)创建工程
Android 图解向 Android Studio 中导入 Eclipse 工程的步骤
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服