2009-08-04 7 views
9

J'ai une vue dans Eclipse (implémentée par une classe qui s'étend org.eclipse.ui.part.ViewPart) dont j'ai besoin de fermer. Je veux dire complètement proche, pas seulement cacher. Je veux qu'une nouvelle instance ViewPart soit créée lorsque l'utilisateur (ou mon code) demande à ouvrir à nouveau la vue.Comment fermer un ViewPart dans Eclipse?

La seule méthode que j'ai trouvée était IWorkbenchPage.hideView qui masque la vue, mais ne la supprime pas complètement. L'appel de dispose sur la vue n'a pas d'incidence non plus. BTW, ma vue est définie comme allowMultiple="false" mais j'ai essayé avec true et cela n'a fait aucune différence.

Toute aide sera appréciée.

+0

Ouverture d'un défaut pour Cocoa/SWT: https://bugs.eclipse.org/bugs/show_bug.cgi?id=286373 – zvikico

Répondre

8

J'ai finalement trouvé le problème. Si la vue est ouverte sur plus d'une perspective, la cacher sur une perspective ne la ferme pas. Il est possible d'itérer sur toute la perspective ouverte et de chercher la vue. Le cacher sur toutes les perspectives le fermera.

+0

Comment est-il possible de parcourir toutes les vues ouvertes dans toutes les perspectives? – Lii

0

L'org.eclipse.ui.internal.ViewFactory a une méthode appelée releaseView qui, je pense, ferme complètement la vue (bien que je ne sois pas certain). Cela prend une IViewReference.

Vous pouvez accéder à ViewFactory en appelant Perspective.getViewFactory, et vous pouvez accéder à la perspective, vous lui passez ensuite un IViewReference pour libérer la vue.

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

la méthode releaseView est appelée à partir de celle de hideView. Donc je pense qu'il n'est pas nécessaire de l'appeler. –

3

Je pense que la méthode IWorkbenchPage.hideView() vous avez mentionné est le seul disponible pour programmaticaly fermer une vue. Je pense aussi que ce nom de méthode devrait être closeView() car il ferme vraiment la vue.

J'utilise cette méthode pendant un certain temps (avec allowMultiple=true vues) et après le débogage, il semble ma méthode view.dispose() est invoqué chaque fois que j'invoque hideView().

La prochaine fois que j'ouvrirai cette vue à nouveau (je veux dire à partir de mon code et non de l'interface utilisateur), un nouveau est créé par Eclipse et la méthode createPartControl() est invoquée à nouveau.

De plus, la vue de la hiérarchie d'appel m'a dit que le hideView() devrait appeler le Éliminez method() ....

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

Hope this peut aider ....

Une dernière question, comment avez-vous vérifié que votre vue n'était pas correctement disposée?

+0

Mon problème n'était pas de disposer la vue, mais plutôt avec sa création. À un moment donné, j'ai dû fermer complètement la vue et ouvrir une nouvelle instance. Mon indication était simplement un point d'arrêt dans la méthode viewPartControl. Il semble que ce soit un nouveau problème qui a commencé dans Eclipse 3.5 (je suis sur OS X, je ne suis pas sûr des autres plateformes). A travaillé très bien avant. La disposition ne se produit pas non plus. Je me demandais juste s'il y avait un autre moyen avant d'ouvrir un bug. – zvikico

+0

Ok. Je comprends maintenant; o) –

0

J'ai écrasé la méthode de disposition de IWorkbenchPart et qui a fonctionné. j'avais quelque chose comme ça dans ma méthode de Éliminez surchargée:

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

Afin de disposer ViewPart à la fermeture perspective, nous avons utilisé le code suivant:

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 raison de page.closePerspective(perspective, false, true);, ViewPart qui a été ouvert dans perspective, sera éliminé.

0

Pour fermer les vues, ouvertes dans une perspective différente, j'ai remplacé outlookDeactivated() 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); 
     } 
    } 
} 

Mon exigence était de fermer la vue "Error Log". Au-dessus du code peut être modifié pour fermer n'importe quelle vue.

Questions connexes