我们在开发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]
[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] 上面是包查找的一个代码片段。
[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] 和其他资源查找类似的,同样可以对要查找的内容进行过滤以及设置初始选择值。