熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

如何加入到eclipse workspace方式

2013-11-23 20:33:09  來源: Java開源技術 

  摘要
  
  在開發eclipse pluin的時候某些情況下我們需要訪問eclipse workspace例如在插件中以編程的方式調用ant命令訪問eclipse workspace中的project等一次在網上偶遇到本文的原創者kobye此人正在進行jsports項目的開發對此頗有心地故在此行文與眾人共同探討之
  
  基礎工作在插件中以編程的方式調用ant命令
  
  在開發eclipse pluin的時候某些情況下我們需要訪問eclipse workspace例如在插件中以編程的方式調用ant命令等
  
  如何做到這一點?
  
  public void execute(){
  IWorkspace ws = ResourcesPlugingetWorkspace();
  IProject[] ps = wsgetRoot()getProjects();
  Systemoutprintln(wsgetRoot()getFullPath()makeAbsolute()toOSString());
  for(int i=;i<pslength;i++){
  IProject p = ps[i];
  IPath location = pgetLocation();
  IFile ifile = pgetFile(buildxml);
  Systemoutprintln(ifilegetLocation()toFile()getAbsolutePath());
  File f = new File(ifilegetLocation()toFile()getAbsolutePath());
  if(!fexists()){
  continue;
  }
  Project pro = new Project();
  prosetBasedir(locationtoFile()getAbsolutePath());
  proinit();
  ProjectHelper helper = ProjectHelpergetProjectHelper();
  helperparse(pro f);
  Hashtable tars = progetTargets();
  Systemoutprintln(name===+name);
  Target t = (Target) tarsget(name);
  if(t==null){
  return;
  }
  DefaultLogger consoleLogger = new DefaultLogger();
  consoleLoggersetErrorPrintStream(Systemerr);
  consoleLoggersetOutputPrintStream(Systemout);
  consoleLoggersetMessageOutputLevel(ProjectMSG_INFO);
  proaddBuildListener(consoleLogger);
  proexecuteTarget(thisname);
  break;
  }
  }
  
  以上代碼(單獨編譯不會通過請把 name換位ant 的target)可以放到插件的代碼中
  
  以上代碼的含義
  
  獲得eclipse workspace的引用對workspace下的pronjects進行循環如果該project下有buildxml並且該文件中有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進行類型識別得到IResourcePROJECT類型的元素即為IProject的引用
  
  下面是程序:
  
  import javalangreflectArray;import javautilArrayList;
  import javautilIterator;import reresourcesIProject;
  import reresourcesIResource;
  import reruntimeIAdaptable;
  import orgeclipsejfaceactionIAction;
  import orgeclipsejfacedialogsMessageDialog;
  import orgeclipsejfaceviewersISelection;
  import orgeclipsejfaceviewersIStructuredSelection;import orgeclipseswtwidgetsShell;import orgeclipseuiIObjectActionDelegate;
  import orgeclipseuiIWorkbenchPart;
  /** * @author Kobye */public class TestPopMenu implements IObjectActionDelegate {
  private IStructuredSelection selection;
  /** * Constructor for Action
  */ 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();
  MessageDialogopenInformation( shell Pop Plugin NewAction was executed);
  } public static Object getAdapter(Object adaptable Class c) { if (cisInstance(adaptable)) { return adaptable; } if (adaptable instanceof IAdaptable) { IAdaptable a = (IAdaptable) adaptable;
  Object adapter = agetAdapter(c);
  if (cisInstance(adapter)) {  return adapter;
  } } return null;
  } /*** * 這個方法和下面的方法很重要
  * @param selection * @param c * @return */ private Object[] getSelectedResources(IStructuredSelection selectionClass c) { return getSelectedAdaptables(selection c);
  } private static Object[] getSelectedAdaptables(ISelection selection Class c) { ArrayList result = null;
  if (!selectionisEmpty()) { result = new ArrayList();
  Iterator elements = ((IStructuredSelection) erator();
  while (elementshasNext()) {  Object adapter = getAdapter(elementsnext() c);
  if (cisInstance(adapter)) {  resultadd(adapter);
  } } } if (result != null && !resultisEmpty()) { return resulttoArray((Object[])ArraynewInstance(c resultsize())); } return (Object[])ArraynewInstance(c );
  } /** * 這個方法保存了ISelection的引用 * 請注意ISelection的實際類型因不同的應用其實際類型可能不同 * 共有三種可能請查閱eclipse API * * @see IActionDelegate#selectionChanged(IAction ISelection) */ public void selectionChanged(IAction action ISelection selection) {  thisselection = (IStructuredSelection) selection;
  Systemoutprintln(current project name===+thisgetProject()getName());
  } /** * 這個方法可以得到current project * * @return */ private IProject getProject(){  IResource[]rs =(IResource[])getSelectedResources((IStructuredSelection)selectionIResourceclass);
  IProject project = null;
  for(int i =;i<rslength;i++){
  IResource r = rs[i];
  if(rgetType()==IResourcePROJECT){
  project = (IProject) r;
  break;
  }
  }
  return project; }}
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28648.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.