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