Wie kann man auf das Schließen einer View reagieren?

Crai

Mitglied
Hallo zusammen,

ich habe folgendes kleines Problem:
Wenn in Eclipse meine View geschlossen wird, möchte ich darauf reagieren können.

Nun hab ich das Problem, dass ich keinen Punkt finde, an dem ich da einsteigen könnte.
Gibt es keinen Listener der reagiert, wenn die View "geschlossen" (=setVisible(false)) wird?

Mit der setFocus() Methode der View das leider net.

Für jeden Tipp dankbar,
Gruß,
Crai
 
Hallo!

Du koenntest deine View das org.eclipse.ui.ISaveablePart/org.eclipse.ui.ISaveablePart2 Interface implementieren lassen. Damit bekommst du Moeglichkeiten das Speichern der View beim schliessen zu steuern.

Du koenntest auch einen PartListener in createPartControl implementieren:
Code:
    /**
     * This is a callback that will allow us
     * to create the viewer and initialize it.
     */
    public void createPartControl(Composite parent) {
        viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
        viewer.setContentProvider(new ViewContentProvider());
        viewer.setLabelProvider(new ViewLabelProvider());
        viewer.setSorter(new NameSorter());
        viewer.setInput(getViewSite());
        makeActions();
        hookContextMenu();
        hookDoubleClickAction();
        contributeToActionBars();
        
        getViewSite().
        getPage().
        addPartListener(new IPartListener(){
            public void partActivated(IWorkbenchPart part) {
                System.out.println("partActivated");                
            }

            public void partBroughtToTop(IWorkbenchPart part) {
                System.out.println("partBroughtToTop");
            }

            public void partClosed(IWorkbenchPart part) {
                System.out.println("partClosed");
            }

            public void partDeactivated(IWorkbenchPart part) {
                System.out.println("partDeactivated");
            }

            public void partOpened(IWorkbenchPart part) {
                System.out.println("partOpened");
            }
        });
    }

Gruss Tom
 
Hallo,

danke an dich Thomas für deinen Tipp!
Mein Problem etwas konkreter:
In der View ist ein TreeViewer, dessen ContentProvider per Listener benachrichtigt wird,
wenn sich Ressourcen im Workspace ändern. Dieser sollte aber nur benachrichtigt werden, wenn die View wirklich sichtbar ist(also nicht geschlossen wurde).

Deine Lösung mit dem PartListener hörte sich auch echt recht gut an:

Code:
        public void partDeactivated(IWorkbenchPart part) 
        {
            IViewPart fbStudioView = getViewSite().getWorkbenchWindow().getActivePage().findView(FbstudioPlugin.PLUGIN_VIEW_ID);
            if ((part instanceof FBStudioView) && !getViewSite().getWorkbenchWindow().getActivePage().isPartVisible(part))
            {
            	TreeViewer treeViewer = ((FBStudioView)part).getViewer();
            	try 
            	{
					System.err.println("Listener removed!");
            		ResourcesPlugin.getWorkspace().removeResourceChangeListener((FBStudioContentProvider)treeViewer.getContentProvider());
				} 
            	catch (Exception e) 
				{
            		System.out.println("FBStudioView#createPartControl(...): ResourceChangeListener already be removed!");
				}
            }
		}

Nur ist die View zum Zeitpunkt, wenn ich mit isPartVisible abfrage noch sichtbar.
Aber dieser Part sollte doch schon deactivated sein, oder

Ein anderer Lösungweg war eine Modifikation der resourceChanged() Methode im ContentProvider:

Code:
	public void resourceChanged(IResourceChangeEvent event) 
	{
		IViewPart dcbStudioView = null;
		IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
		for (int i=0;i<windows.length;i++)
		{
			IWorkbenchWindow window = windows[i];
			dcbStudioView = window.getActivePage().findView(FbstudioPlugin.PLUGIN_VIEW_ID);	
			if (dcbStudioView != null)
			{
				boolean isVisible = window.getActivePage().isPartVisible(window.getActivePage().findView(FbstudioPlugin.PLUGIN_VIEW_ID));
				if (isVisible)
				{
					processDelta(event.getDelta());
				}
			}
		}
	}

Dies löst aber in der Zeile
Code:
window.getActivePage().isPartVisible(window.getActivePage().findView(FbstudioPlugin.PLUGIN_VIEW_ID));

eine SWT Exception [org.eclipse.swt.SWTException: Invalid thread access] aus. Aber warum, wie wechsle ich den Thread, damit das nicht passiert?

Gruß,
Crai
 
Hallo!

eine SWT Exception [org.eclipse.swt.SWTException: Invalid thread access] aus. Aber warum, wie wechsle ich den Thread, damit das nicht passiert?
Kann leider jetzt nicht danach schauen, aber du koenntest duese Anweisung auch innerhab eines
Code:
Display.getCurrent().asyncExec(new Runnable(){
                public void run() {
                    // TODO your code...
                }
            });
Code-Blocks ausfuehren.

Aber weshalb musst du denn nochmal die passende View suchen? Bist du denn dort nicht innerhalb der View?

Gruss Tom
 
Vielen Dank Thomas,

mit dem Display.asyncExec.... klappts! :) :)
Ich bin in meinem ContentProvider, nicht in meiner View.

Gruß,
Crai
 
Zurück