2009-08-04 13 views
9

Ho una vista in Eclipse (implementata da una classe che estende org.eclipse.ui.part.ViewPart) che ho bisogno di chiudere. Intendo completamente vicino, non solo nascondere. Voglio creare una nuova istanza ViewPart quando l'utente (o il mio codice) chiede di riaprire la vista.Come chiudere un ViewPart in Eclipse?

L'unico metodo che ho trovato era IWorkbenchPage.hideView che nasconde la vista, ma non la elimina completamente. Invocare dispose sulla vista non ha alcun effetto.

BTW, la mia vista è definita come allowMultiple="false" ma ho provato con true e che non ha fatto alcuna differenza.

Qualsiasi aiuto sarà apprezzato.

+0

Aperto un difetto per Cocoa/SWT: https://bugs.eclipse.org/bugs/show_bug.cgi?id=286373 – zvikico

risposta

8

Ho trovato il problema alla fine. Se la vista è aperta su più di una prospettiva, nasconderlo su una prospettiva non la chiuderà. È possibile iterare su tutta la prospettiva aperta e cercare la vista. Nascondendolo su tutte le prospettive lo chiuderà.

+0

Come è possibile iterare su tutte le viste che sono aperte in tutte le prospettive? – Lii

0

org.eclipse.ui.internal.ViewFactory ha un metodo chiamato releaseView che penso chiude completamente la visualizzazione (anche se non ne sono certo). Ci vuole un IViewReference.

È possibile accedere a ViewFactory richiamando Perspective.getViewFactory ed è possibile accedere alla Prospettiva, quindi passarlo a IViewReference per rilasciare 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

il metodo releaseView viene chiamato da quello di hideView. Quindi penso che non sia necessario chiamarlo. –

3

penso che il metodo IWorkbenchPage.hideView() lei ha citato è l'unico disponibile per programmaticaly chiudere una vista. Penso anche che il nome di questo metodo dovrebbe essere closeView() perché può davvero chiudere la visualizzazione.

Utilizzo questo metodo da un po 'di tempo (con le viste allowMultiple=true) e dopo il debug, il metodo view.dispose() viene richiamato ogni volta che invoco hideView().

La prossima volta che apro di nuovo questa vista (intendo dal mio codice e non dall'interfaccia utente), ne viene creato uno nuovo da Eclipse e il metodo createPartControl() viene richiamato di nuovo.

Inoltre, la vista gerarchia di richiamo mi ha detto che il hideView() dovrebbe chiamare il Dispose method() ....

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

Spero che questo possa aiutare ....

Un'ultima domanda, come hai fatto a hai controllato che la tua vista non fosse stata correttamente disposta ??

+0

Il mio problema non era di disporre la vista, ma piuttosto della sua 'creazione'. A un certo punto, ho dovuto chiudere completamente la vista e aprire una nuova istanza. La mia indicazione era semplicemente un punto di interruzione nel metodo createPartControl della vista. Sembra essere un nuovo problema che è iniziato in Eclipse 3.5 (sono su OS X, non sono sicuro riguardo ad altre piattaforme). Ha funzionato bene prima. Neanche lo smaltimento è in corso. Mi stavo chiedendo se c'è un altro modo prima di aprire un bug. – zvikico

+0

Ok. Capisco ora; o) –

0

Ho ignorato il metodo di eliminazione da IWorkbenchPart e ha funzionato. avevo qualcosa come questo nel mio metodo dispose override:

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

Per smaltire ViewPart sulla chiusura Prospettiva abbiamo usato il codice successivo:

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

In conseguenza di page.closePerspective(perspective, false, true);, ViewPart che è stato aperto all'interno prospettiva, sarà disposto.

0

Per chiudere le viste, aperte in prospettiva diversa, ho sovrascritto la prospettivaDeactivated() di 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); 
     } 
    } 
} 

Il mio requisito era chiudere la vista "Registro errori". Sopra il codice può essere modificato per chiudere qualsiasi vista.

Problemi correlati