2009-07-30 14 views

risposta

25

Questo GMF class ha una risposta semplice, se si ha accesso al nome ResourcesPlugin:

IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(myBundleName); 

La risposta generica (da un potentially outdated code) potrebbe essere come (se si dispone di un editore aperto):

IEditorPart editorPart = 
getSite().getWorkbenchWindow().getActivePage().getActiveEditor(); 

if(editorPart != null) 
{ 
    IFileEditorInput input = (IFileEditorInput)editorPart.getEditorInput() ; 
    IFile file = input.getFile(); 
    IProject activeProject = file.getProject(); 
    String activeProjectName = activeProject.getName(); 
    //... use activeProjectName 
} 

Se nessun editor è aperto:

IViewPart [] parts = 
     MyPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage().getViews(); 
    IProject activeProject = null; 

    for(int i=0;i<parts.length;i++) 
    { 
     if(parts[i] instanceof ResourceNavigator) 
     { 
      ResourceNavigator navigator = (ResourceNavigator)parts[i]; 
      StructuredSelection sel = 
       (StructuredSelection)navigator.getTreeViewer().getSelection(); 
      IResource resource = (IResource)sel.getFirstElement(); 
      activeProject = resource.getProject(); 
      break; 
     } 
    } 
    String activeProjectName = activeProject .getName(); 
+0

Per GMF cambiare la parte myplugin a:.... 'IViewPart [] parti = {} yourPluginName DiagramEditorPlugin.getInstance() getWorkbench() getActiveWorkbenchWindow() getActivePage() getViews();' Il tuo nome del plugin GMF può essere trovato nel tuo .genmodel. – Ring

7

L'utilizzo del servizio di selezione ti darà l'oggetto attualmente selezionato, puoi quindi controllare il tipo di selezione e ottenere il progetto in base alla selezione.

Se si crea un ISelectionListener e si registra come listener su ISelectionService, verrà notificato ogni volta che la selezione attiva cambia e viene fornito un riferimento alla selezione e alla parte proprietaria.

ISelectionListener listener = new ISelectionListener() { 
    public void selectionChanged(IWorkbenchPart sourcePart, ISelection selection) { 
     setSourcePart(sourcePart); 
     setSelection(selection); 
    } 
}; 

... 
//register the listener 
selectionService.addSelectionListener(listener); 

... 
//either get the selection service and get the selection, or use the stored version from the listener 
ISelectionService selectionService = 
    Workbench.getInstance().getActiveWorkbenchWindow().getSelectionService(); 

ISelection selection = selectionService.getSelection(); 

if(selection instanceof IStructuredSelection) { 
    Object element = ((IStructuredSelection)selection).getFirstElement(); 

    IProject project; 
    if (element instanceof IResource) { 
     project= ((IResource)element).getProject(); 
    } else if (element instanceof PackageFragmentRootContainer) { 
     IJavaProject jProject = 
      ((PackageFragmentRootContainer)element).getJavaProject(); 
     project = jProject.getProject(); 
    } else if (element instanceof IJavaElement) { 
     IJavaProject jProject= ((IJavaElement)element).getJavaProject(); 
     project = jProject.getProject(); 
    } 
} else if (selection instanceof ITextSelection) { 
    if(sourcePart instanceof JavaEditor) { 
     IJavaElement element = SelectionConverter.resolveEnclosingElement(sourcePart, selection); 
     project = element.getJavaProject().getProject(); 
    } 
} 

Vedere questo article on the Eclipse selection service per ulteriori dettagli.

+0

Probabilmente una risposta più accurata della mia. +1 – VonC

+1

+1 ma meglio usare PlatformUI.getWorkbench() invece di Workbench.getInstance(). –

2

Rich Seller e VonC hanno entrambi fornito buone risposte ma non sembravano abbastanza complete/utilizzate classi interne. Sono venuto con il seguente.

@Override 
public void createPartControl(Composite parent) 
{ 
    .... 

    // Register to be notified about selections 
    getSite().getWorkbenchWindow().getSelectionService() 
     .addPostSelectionListener(this); 

    // Detect the current selection 
    detectCurrentSelection(); 
} 

@Override 
public void selectionChanged(IWorkbenchPart part, ISelection selection) 
{ 
    IProject project = convertSelection(part, selection); 
    setProject(project); 
} 

private void detectCurrentSelection() 
{ 
    IProject project = null; 

    IWorkbenchWindow window = getSite().getWorkbenchWindow(); 
    IWorkbenchPage activePage = window.getActivePage(); 

    if (activePage != null) 
    { 
    IEditorPart part = activePage.getActiveEditor(); 

    if (part != null) 
    { 
     project = convertSelection(part); 
    } 
    else 
    { 
     IViewReference[] viewReferences = activePage.getViewReferences(); 

     for (IViewReference viewRef : viewReferences) 
     { 
     IViewPart view = viewRef.getView(false); 
     ISelection selection = null; 

     if (view instanceof IPackagesViewPart) 
     { 
      IPackagesViewPart viewPart = (IPackagesViewPart) view; 
      TreeViewer treeViewer = viewPart.getTreeViewer(); 
      selection = treeViewer.getSelection(); 
     } 
     else if (view instanceof CommonNavigator) 
     { 
      CommonNavigator navigator = (CommonNavigator) view; 
      CommonViewer commonViewer = navigator.getCommonViewer(); 
      selection = commonViewer.getSelection(); 
     } 

     if (selection instanceof IStructuredSelection) 
     { 
      IStructuredSelection structuredSelection = (IStructuredSelection) selection; 

      project = convertSelection(structuredSelection); 

      if (project != null) 
      break; 
     } 
     } 
    } 
    } 

    setProject(project); 
} 

private IProject convertSelection(IWorkbenchPart part, ISelection selection) 
{ 
    IProject project = null; 
    if (selection instanceof IStructuredSelection) 
    { 
    IStructuredSelection structuredSelection = (IStructuredSelection) selection; 
    project = convertSelection(structuredSelection); 
    } 
    else if (selection instanceof ITextSelection) 
    { 
    if (part instanceof IEditorPart) 
    { 
     IEditorPart editorPart = (IEditorPart) part; 
     IResource resource = (IResource)editorPart.getEditorInput().getAdapter(IResource.class); 
     if (resource != null) 
     { 
     project = resource.getProject(); 
     } 
    } 
    } 

    return project; 
} 

private IProject convertSelection(IEditorPart part) 
{ 
    IProject project = null; 
    IResource resource = (IResource)part.getEditorInput().getAdapter(IResource.class); 
    if (resource != null) 
    { 
    project = resource.getProject(); 
    } 
    return project; 
} 

private IProject convertSelection(IStructuredSelection structuredSelection) 
{ 
    IProject project = null; 
    Object element = structuredSelection.getFirstElement(); 

    if (element instanceof IResource) 
    { 
    project = ((IResource) element).getProject(); 
    } 
    else if (element instanceof IJavaElement) 
    { 
    IJavaElement javaElement = (IJavaElement) element; 
    project = javaElement.getJavaProject().getProject(); 
    } 
    else if (element instanceof IAdaptable) 
    { 
    IAdaptable adaptable = (IAdaptable) element; 
    IWorkbenchAdapter adapter = (IWorkbenchAdapter) adaptable.getAdapter(IWorkbenchAdapter.class); 
    if (adapter != null) 
    { 
     Object parent = adapter.getParent(adaptable); 
     if (parent instanceof IJavaProject) 
     { 
     IJavaProject javaProject = (IJavaProject) parent; 
     project = javaProject.getProject(); 
     } 
    } 
    } 

    return project; 
} 
5

Ho creato una bella funzione dai post precedenti, più aggiunti alcuni aggiornamenti. Funziona con l'eclissi corrente.

public static IProject getCurrentSelectedProject() { 
    IProject project = null; 
    ISelectionService selectionService = 
     PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService(); 

    ISelection selection = selectionService.getSelection(); 

    if(selection instanceof IStructuredSelection) { 
     Object element = ((IStructuredSelection)selection).getFirstElement(); 

     if (element instanceof IResource) { 
      project= ((IResource)element).getProject(); 
     } else if (element instanceof PackageFragmentRoot) { 
      IJavaProject jProject = 
       ((PackageFragmentRoot)element).getJavaProject(); 
      project = jProject.getProject(); 
     } else if (element instanceof IJavaElement) { 
      IJavaProject jProject= ((IJavaElement)element).getJavaProject(); 
      project = jProject.getProject(); 
     } 
    } 
    return project; 
} 
Problemi correlati