Eclipse源碼閱讀:Go To Resource

來源:互聯網
上載者:User

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);}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.