how to access current Project in eclipse?

来源:互联网 发布:slmmsk软件 编辑:程序博客网 时间:2024/05/21 17:08

  在上篇文章,给出来在eclipse plugin 中访问eclipse workspace 从而访问该workspace下所有project的方案,这篇文章提供了如何访问current project的方案。

I 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",
   "New Action 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;
 }
}

 

 

 

原创粉丝点击