Go To Resource是Eclipse的Navigate菜單下的一個子功能表的功能,如下所示:
Go To Resource Action是一個RetargetAction,在org.eclipse.ui.ide外掛程式中定義,plugin.xml中關於此action的定義內容為:
<action definitionId="org.eclipse.ui.navigate.goToResource" label="%GoToResourceAction.label" icon="$nl$/icons/full/elcl16/gotoobj_tsk.gif" menubarPath="navigate/goTo/" retarget="true"//是Retarget Action id="goToResource"></action>
當Package Explorer視圖啟用時,其真實對應的Action為org.eclipse.wst.jsdt.internal.ui.packageview.GotoResourceAction,它可以選中某資源然後在Packge Explorer視圖的樹結構中進行定位.觸發後的UI效果可能是這樣的,其觸發後的UI效果可能是如這樣的:
Go To Resource對話方塊對應的類為GotoResourceDialog(是一個靜態內部類),我們先關注一下此類的實現吧,本質上它是org.eclipse.ui.dialogs.FilteredResourcesSelectionDialog的變種(擴充了此類)FilteredResourcesSelectionDialog在Eclipse中有大量的應用.
private static class GotoResourceDialog extends FilteredResourcesSelectionDialog {private IJavaModel fJavaModel;public GotoResourceDialog(Shell parentShell, IContainer container, StructuredViewer viewer) { //IResource.FILE | IResource.FOLDER | IResource.PROJECT表示要顯示的類型包括IFile,IFolder,IProjectsuper(parentShell, false, container, IResource.FILE | IResource.FOLDER | IResource.PROJECT);fJavaModel= JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());//JDT的RootsetTitle(PackagesMessages.GotoResource_dialog_title);//對話方塊的標題PlatformUI.getWorkbench().getHelpSystem().setHelp(parentShell, IJavaHelpContextIds.GOTO_RESOURCE_DIALOG);}protected ItemsFilter createFilter() {return new GotoResourceFilter();}private class GotoResourceFilter extends ResourceFilter {/* * (non-Javadoc) * * @see org.eclipse.ui.dialogs.FilteredResourcesSelectionDialog.ResourceFilter#matchItem(java.lang.Object) */public boolean matchItem(Object item) {IResource resource = (IResource) item;return super.matchItem(item) && select(resource);}/** * This is the orignal <code>select</code> method. Since * <code>GotoResourceDialog</code> needs to extend * <code>FilteredResourcesSelectionDialog</code> result of this * method must be combined with the <code>matchItem</code> method * from super class (<code>ResourceFilter</code>). * * @param resource * A resource * @return <code>true</code> if item matches against given * conditions <code>false</code> otherwise */private boolean select(IResource resource) {IProject project= resource.getProject();try {if (project.getNature(JavaCore.NATURE_ID) != null)return fJavaModel.contains(resource);} catch (CoreException e) {// do nothing. Consider resource;}return true;}public boolean equalsFilter(ItemsFilter filter) {if (!super.equalsFilter(filter)) {return false;}if (!(filter instanceof GotoResourceFilter)) {return false;}return true;}}}
再看看GoToResourceAction的核心實現.
public void run() {TreeViewer viewer= fPackageExplorer.getTreeViewer();//構造GoToResourceDialog執行個體,傳入模型ResourcesPlugin.getWorkspace().getRoot()GotoResourceDialog dialog= new GotoResourceDialog(fPackageExplorer.getSite().getShell(),ResourcesPlugin.getWorkspace().getRoot(), viewer); dialog.open(); Object[] result = dialog.getResult(); if (result == null || result.length == 0 || !(result[0] instanceof IResource)) return; StructuredSelection selection= null;IJavaElement element = JavaCore.create((IResource)result[0]);//將選中的modle封裝為StructuredSelection,因為TreeViewer需要的正是StructuredSelection類型if (element != null && element.exists())selection= new StructuredSelection(element);elseselection= new StructuredSelection(result[0]);viewer.setSelection(selection, true);}