Java资源网

| JAVA基础 | 环境配置 | JDBC | 线程技术 | Socket编程 | JavaMail | JAVA与XML | 设计模式 | 技术新闻 | Java认证 | 程序人生 软件下载
| JSP&Servlet | Spring | Struts | Hibernate | JBuilder | Eclipse | WebService | EJB技术 | J2ME开发 | 应用服务器 | JXTA | Ajax
Articles search文章搜索
   关键字:
   类 别:
       
New download 最新下载
· [组件]HTML Parser 1.5
· [教程]WebSphere Studio应用教程
· [组件]JDom 1.0
· [工具]Junit3.8.1
· [教程]EJB编程及J2EE系统架构和设计
· [教程]EJB教程
· [教程]J2EE Tutorial中文版
· [教程]Java编程思想2(英文)
· [教程]java编程思想(完整版)
· [教程]Java网络编程
New articles 最新文章
· 设计移动 Web 服务
· 解析XML的时候完全忽略DTD
· 理解XML Schema XML Schema 初步
· 标签库的深入研究
· 提升JSP应用程序的七大绝招
· 如何使用JDOM对XML文件进行操作
· 处理XML字符串中特殊字符
· 利用Digester把XML转换成为Java对象
· 使用WebService 和RMI远程协作
· 使用Axis开发Web Service程序
Articles top 热门文章
· Eclipse基础--plugin插件安装(6644)
· eclipse+tomcat+lomboz的安装配置说明(4774)
· Java程序员就业前景(4584)
· Windows下JAVA环境变量的设置祥解(3788)
· Tomcat下JSP、Servlet和JavaBean环境的配置(3716)
· 使用links方式安装Eclipse插件(3698)
· 一个老程序员的心理话(3533)
· linux下jdk的安装与配置(3459)
· 初学者入门:Structs中基本配置入门(3334)
· Eclipse 运行命令行参数大全(3084)
您的位置:首页>>Eclipse>>如何加入到eclipse workspace方式
如何加入到eclipse workspace方式
2006-04-04   来源:ChinaITLab  作者:ChinaITLab
  摘要:
  
  在开发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; }}
  --相关文章--
· 解决运行eclipse内存不足的问题 (2007-04-17)
· 用 Eclipse 插件提高代码质量 (2007-04-17)
· 开源技术:在Eclipse中构建备忘单 (2007-04-17)
· 开源技术:Eclipse 插件功能研究 (2007-04-17)
· 开源技术:Eclipse 3.2冒险之旅 (2007-04-17)
· 开源技术 Eclipse使用技巧 (2007-04-17)

版权所有©2005-2006 JAVA资源网 渝ICP备05007591号 虚拟主机 | 关于我们 | 联系方式 | 广告业务 | 网站地图 | 友情链接