Eclipse插件开发资源查找

  • 介绍
我们在开发Eclipse插件的时候,需要查找类、接口等资源的时候,怎么办呢?本文介绍如何使用Eclipse自带的查找对话框来获取类路径。
  • 查找类
[codesyntax lang="java"]
/**
* http://surenpi.com
*/
package org.surenpi.dev.plugin.utill;

import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.ui.IJavaElementSearchConstants;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.dialogs.SelectionDialog;

/**
 * @author surenpi.com
 * @since jdk1.6
 * 2015年9月24日
 */
public class SearchDialog {
	/**
	 * 查找类
	 * @param shell
	 * @param multipleSelection
	 * @param title 对话框标题
	 * @param message
	 * @return
	 */
	public static Object[] searchType(Shell shell, int type, boolean multipleSelection,
			String title, String message){
		try {
			SelectionDialog dialog = JavaUI.createTypeDialog(shell,
					new ProgressMonitorDialog(shell),
					SearchEngine.createWorkspaceScope(), type,
					multipleSelection);
			
			dialog.setTitle(title);
			dialog.setMessage(message);
			
			if(dialog.open() == IDialogConstants.CANCEL_ID){
				return null;
			}
			
			return dialog.getResult();
		} catch (JavaModelException e) {
			e.printStackTrace();
		}
		
		return null;
	}
	
	public static Object[] searchClass(Shell shell, boolean multipleSelection,
			String title, String message){
		return searchType(shell, IJavaElementSearchConstants.CONSIDER_CLASSES,
				multipleSelection, title, message);
	}
	
	public static IType searchClass(Shell shell, String title, String message){
		Object[] result = searchClass(shell, false, title, message);
		
		if(result != null && result.length > 0){
			return (IType) result[0];
		}
		
		return null;
	}
	
	/**
	 * 查找Action中的Module类
	 * @param shell
	 * @return
	 */
	public static IType searchModuleClass(Shell shell){
		String title = "查找Module类";
		String message = "请选择PO或者VO作为Action的Module(ListModule)";
		
		return searchClass(shell, title, message);
	}
	
	public static Object[] searchInterface(Shell shell, boolean multipleSelection,
			String title, String message){
		return searchType(shell, IJavaElementSearchConstants.CONSIDER_INTERFACES,
				multipleSelection, title, message);
	}
	
	public static IType searchInterface(Shell shell, String title, String message){
		Object[] result = searchType(shell, IJavaElementSearchConstants.CONSIDER_INTERFACES,
				false, title, message);
		
		if(result != null && result.length > 0){
			return (IType) result[0];
		}
		
		return null;
	}
	
	/**
	 * 查找Action中的Module类
	 * @param shell
	 * @return
	 */
	public static IType searchInjectClass(Shell shell){
		String title = "查找依赖类";
		String message = "请选择服务";
		
		return searchInterface(shell, title, message);
	}
}
[/codesyntax]
  • 查找所有的工程(project)
[codesyntax lang="java"]
/**
* Copyright © 1998-2015, surenpi.com. All Rights Reserved.
*/

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.dialogs.ListSelectionDialog;

/**
 * @author surenpi
 * @since jdk1.6
 * 2015年11月17日
 */
public class ProjectDialog {
	/**
	 * 从当前工作空间(workspace)中选择工程(project)
	 * @param shell
	 * @param selection
	 * @return
	 */
	public static Object[] getSelectProjects(Shell shell, SelectionAdapter selection){
		IProject[] allProjects = ResourcesPlugin.getWorkspace().getRoot().getProjects();

		ILabelProvider labelProvider = new LabelProvider(){
			public String getText(Object element){
				if(element instanceof IProject){
					return ((IProject) element).getName();
				}else{
					return element.toString();
				}
			}
		};
		
		SimpleListContentProvider contentsProvider = new SimpleListContentProvider();
		contentsProvider.setElements(allProjects);
		
		ListSelectionDialog dialog = new ListSelectionDialog(shell, selection,
				contentsProvider, labelProvider, "从列表中选择工程"){
			protected int getShellStyle(){
				return super.getShellStyle() | SWT.LONG;
			}
		};
		
		if(dialog.open() != 0){
			return null;
		}else{
			return dialog.getResult();
		}
	}
	
	private static class SimpleListContentProvider implements IStructuredContentProvider{

		private Object[] elements;
		
		@Override
		public void dispose() {
		}

		@Override
		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
		}

		@Override
		public Object[] getElements(Object inputElement) {
			return this.elements;
		}
		
		public void setElements(Object[] items){
			this.elements = items;
		}
	}
}
[/codesyntax] 注意:上面的对话框,返回的结果集是IProject对象。
  • 查找工程(Project)下的包(Package)
[codesyntax lang="java"]
**
 * @see #searchPackage(Shell, String, String, String, IJavaProject)
 * @param shell
 * @param project
 * @return
 */
public static IPackageFragment searchPackage(Shell shell, IJavaProject project) {
	return searchPackage(shell, "Package Selection", "Choose a folder", "", project);
}

/**
 * 查找某个Project下的Package
 * @param shell
 * @param title
 * @param message
 * @param emptyMsg
 * @param project
 * @return
 */
public static IPackageFragment searchPackage(Shell shell, String title, String message, String emptyMsg, IJavaProject project) {
	IPackageFragmentRoot packageFragmentRoot = null;

	try {
	    for(IPackageFragmentRoot root  : project.getPackageFragmentRoots()) {
	        if(root.getKind() == 1) {
	            packageFragmentRoot = root;
	            break;
	        }
	    }
	} catch (JavaModelException e) {
	    e.printStackTrace();
	}
	
    IJavaElement[] packages = null;
    try {
      if ((packageFragmentRoot != null) && (packageFragmentRoot.exists()))
        packages = packageFragmentRoot.getChildren();
    } catch (JavaModelException e) {
    	e.printStackTrace();
    }
    
    if(packages == null){
      packages = new IJavaElement[0];
    }
    
    ElementListSelectionDialog dialog = new ElementListSelectionDialog(shell,
    		new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT));
    dialog.setIgnoreCase(false);
    dialog.setTitle(title);
    dialog.setMessage(message);
    dialog.setEmptyListMessage(emptyMsg);
    dialog.setElements(packages);
    dialog.setHelpAvailable(true);
    
    if(dialog.open() == 0) {
    	return (IPackageFragment) dialog.getFirstResult();
    } else {
    	return null;
    }
}
[/codesyntax] 上面是包查找的一个代码片段。
  • 查找文件夹(Folder)
[codesyntax lang="java"]
/**
 * 文件夹查找
 * @param shell
 * @param title
 * @param message
 * @return
 */
public static IPackageFragmentRoot searchFolder(Shell shell, String title, String message) {
	StandardJavaElementContentProvider provider = new StandardJavaElementContentProvider();
	ILabelProvider labelProvider = new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT);
	IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();

	Class<?>[] acceptedClasses = new Class[] { IJavaModel.class, IPackageFragmentRoot.class, IJavaProject.class };
	ViewerFilter filter = new TypedViewerFilter(acceptedClasses) {
		public boolean select(Viewer viewer, Object parent, Object element) {
			if ((element instanceof IPackageFragmentRoot)) {
				try {
					return ((IPackageFragmentRoot) element).getKind() == 1;
				} catch (JavaModelException e) {
					return false;
				}
			}

			return super.select(viewer, parent, element);
		}
	};

	ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(shell, labelProvider, provider);
	dialog.setComparator(new JavaElementComparator());
	dialog.setTitle(title);
	dialog.setMessage(message);
	dialog.addFilter(filter);
	dialog.setInput(JavaCore.create(workspaceRoot));
	dialog.setHelpAvailable(true);

	if (dialog.open() == IDialogConstants.CANCEL_ID) {
		return null;
	}

	Object element = dialog.getFirstResult();
	if ((element instanceof IJavaProject)) {
		IJavaProject jproject = (IJavaProject) element;
		return jproject.getPackageFragmentRoot(jproject.getProject());
	}

	if ((element instanceof IPackageFragmentRoot)) {
		return (IPackageFragmentRoot) element;
	}

	return null;
}
[/codesyntax] 和其他资源查找类似的,同样可以对要查找的内容进行过滤以及设置初始选择值。

转载于:https://my.oschina.net/surenpi/blog/817003

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值