-現在のプロジェクト
Eclipse上で現在アクティブなプロジェクトを取るのに苦労しました。既存でいまアクティブなプロジェクトが何か提供したうえで、アクティブなプロジェクトが変わったときにイベント発火してくれる仕組みがDiconツリービューを作るのに必要だったのです。
やり方としては、IWorkbenchPage.addPartListener(listener)でIWorkbenchPartの動きを追うIPartListenerリスナーを用意します。IPartListenerには、以下のメソッドがあります。
public interface IPartListener { public void partActivated(IWorkbenchPart part); public void partBroughtToTop(IWorkbenchPart part); public void partClosed(IWorkbenchPart part); public void partDeactivated(IWorkbenchPart part); public void partOpened(IWorkbenchPart part); }
このpartActivated(part)で、現在アクティブなパートがわかります。たとえばPackageExplorerがアクティブになればそれが渡されてきます。
private ISelectionProvider selectionProvider; private IWorkbenchPart focusPart; public void partActivated(IWorkbenchPart part) { if(part != focusPart) { if (selectionProvider != null) { selectionProvider.removeSelectionChangedListener(this); selectionProvider = null; } focusPart = part; if (focusPart != null) { selectionProvider = focusPart.getSite().getSelectionProvider(); if (selectionProvider != null) {selectionProvider.addSelectionChangedListener(this); setInput(selectionProvider.getSelection()); } else { viewer.setInput(null); } } } }
ISelectionProvider#addSelectionChangedListener(this)によってそのパートで何が選択されているかを取得します。パートは選択する機能が無いものであれば、IWorkbenchPartSite#getSelectionProvider()でnullを返されます。ですからnullチェックを絡めながらより新鮮なISelectionProviderを取得していきます。
public static IProject getCurrentProject(ISelection selection) { if (selection instanceof IStructuredSelection) { for(Iterator it = ((IStructuredSelection)selection).iterator(); it.hasNext();) { Object obj = it.next(); if (obj instanceof IAdaptable) { IAdaptable adaptable = (IAdaptable)obj; IResource resource = (IResource)adaptable.getAdapter(IResource.class); if(resource != null) { return resource.getProject(); } } } } return null; }
ISelectionさえ取れるようになれば、そこからIProjectを取得するのは上記のとおりです。こんなの、標準のプラグインの機能で用意してくれててよさそうなものなのに。TasksビューやProblemsビューなど、様々なカレントプロジェクトの変更にセンシティブな機能においてそれぞれ実装しています。KijimunaUIではプラグインで手軽に取れるようにしておきます。