2009-08-04 9 views
9

Tengo una vista en Eclipse (implementado por una clase que se extiende org.eclipse.ui.part.ViewPart) que necesito cerrar. Quiero decir completamente cerca, no solo esconderse. Quiero que se cree una nueva instancia de ViewPart cuando el usuario (o mi código) solicite volver a abrir la vista.¿Cómo cerrar una ViewPart en Eclipse?

El único método que encontré fue IWorkbenchPage.hideView que oculta la vista, pero no la elimina por completo. Invocar dispose en la vista no tiene ningún efecto, tampoco.

Por cierto, mi opinión se define como allowMultiple="false" pero probé con true y eso no hizo ninguna diferencia.

Cualquier ayuda será apreciada.

+0

Se abrió un defecto para Cocoa/SWT: https://bugs.eclipse.org/bugs/show_bug.cgi?id=286373 – zvikico

Respuesta

8

Finalmente encontré el problema. Si la vista está abierta en más de una perspectiva, ocultarla en una perspectiva no la cerrará. Es posible iterar sobre toda la perspectiva abierta y buscar la vista. Ocultarlo en todas las perspectivas lo cerrará.

+0

¿Cómo es posible iterar sobre todas las vistas que están abiertas en todas las perspectivas? – Lii

0

org.eclipse.ui.internal.ViewFactory tiene un método llamado releaseView que creo que cierra la vista por completo (aunque no estoy seguro). Se necesita una IViewReference.

Puede acceder a ViewFactory llamando a Perspective.getViewFactory, y puede acceder a la Perspectiva, luego pasarlo una IViewReference para liberar la vista.

IWorkbenchPage page = 
Workbench.getInstance().getActiveWorkbenchWindow().getActivePage() 

Perspective perspective = page.getPerspective(); 

String viewId = "myViewId"; //defined by you 

//get the reference for your viewId 
IViewReference ref = page.findViewReference(viewId); 

//release the view 
perspective.getViewFactory.releaseView(ref); 
+0

se llama al método ReleaseView desde el de hideView. Por lo tanto, creo que no es necesario llamarlo. –

3

creo que el método IWorkbenchPage.hideView() usted ha mencionado es el único disponible para programmaticaly cerrar una vista. También creo que este nombre de método debe ser closeView() porque realmente cierra la vista.

He estado usando este método durante un tiempo (con vistas allowMultiple=true) y después de la depuración Parece que mi método view.dispose() se invoca cada vez que invoco hideView().

La próxima vez que vuelva a abrir esta vista (quiero decir desde mi código y no desde la interfaz de usuario), se crea una nueva por Eclipse y se invoca de nuevo el método createPartControl().

Por otra parte, la vista de jerarquía llamada me dijo que el hideView() deben llamar al disponer method() ....

hideView() >> releaseView() >> partRemoved() >> disposePart() >> dispose() >> doDisposePart() >> doDisposePart() >> dispose() 

Esperamos que esto pueda ayudar ....

Una última pregunta, ¿cómo se hizo verificó que su vista no se eliminó correctamente?

+0

Mi problema no fue deshacerme de la vista, sino más bien con su creación. En algún momento, tuve que cerrar por completo la vista y abrir una nueva instancia. Mi indicación fue simplemente un punto de interrupción en el método viewPartControl view. Parece ser un nuevo problema que comenzó en Eclipse 3.5 (estoy en OS X, no estoy seguro con respecto a otras plataformas). Funcionó bien antes. La disposición no está sucediendo tampoco. Me preguntaba si hay otra forma de abrir un error. – zvikico

+0

Ok. Entiendo ahora; o) –

0

Anulé el método de eliminación de IWorkbenchPart y funcionó. que tenían algo como esto en mi método dispose reemplazado:

public void dispose() { 
    super.dispose(); 
    IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); 
    if (page != null) { 
     IViewReference[] viewReferences = page.getViewReferences(); 
     for (IViewReference ivr : viewReferences) { 
      if (ivr.getId().equalsIgnoreCase("your view id") 
        || ivr.getId().equalsIgnoreCase("more view id if you want to close more than one at a time")) { 
       page.hideView(ivr); 
      } 
     } 
    } 
} 
0

Con el fin de disponer ViewPart en el cierre de la perspectiva se utilizó el siguiente código:

IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); 
if (workbenchWindow != null) { 
    workbenchWindow.addPerspectiveListener(new PerspectiveAdapter() { 
     @Override 
     public void perspectiveActivated(IWorkbenchPage page, 
       IPerspectiveDescriptor perspectiveDescriptor) { 
      super.perspectiveActivated(page, perspectiveDescriptor); 
     } 
     @Override 
     public void perspectiveDeactivated(IWorkbenchPage page, 
       IPerspectiveDescriptor perspective) { 
      super.perspectiveDeactivated(page, perspective); 
      page.closePerspective(perspective, false, true); 
     } 
    }); 
} 

En consecuencia de page.closePerspective(perspective, false, true);, ViewPart que se abre dentro de perspectiva, será eliminada.

0

Para cerrar las vistas, abierto en una perspectiva diferente, anulo la perspectiva Deshabilitada() de org.eclipse.ui.PerspectiveAdapter.

public void perspectiveDeactivated(IWorkbenchPage page, 
     IPerspectiveDescriptor perspective) { 
    super.perspectiveDeactivated(page, perspective); 
    boolean myPerspective = MyPerspective.PERSPECTIVE_ID.equals(perspective.getId()); 
    if(!myPerspective) { 
     //close Error Log view if it is opened in any perspective except My perspective. 
     IViewPart errorView = page.findView("org.eclipse.pde.runtime.LogView"); 
     if(errorView != null) { 
      page.hideView(errorView); 
     } 
    } 
} 

Mi requisito era cerrar la vista "Error Log". El código anterior se puede modificar para cerrar cualquier vista.

Cuestiones relacionadas