1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-15 21:15:23 +02:00

[243263] NPE on expanding a filter

This commit is contained in:
Martin Oberhuber 2008-08-19 13:54:13 +00:00
parent 065c58167f
commit 6fa782f068
2 changed files with 188 additions and 111 deletions

View file

@ -40,6 +40,7 @@ import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWindowListener;
import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI; import org.eclipse.ui.PlatformUI;
@ -61,6 +62,13 @@ public abstract class SystemBasePlugin extends AbstractUIPlugin
*/ */
protected static Logger log = null; protected static Logger log = null;
/**
* Active workbench window
*/
private static volatile IWorkbenchWindow activeWindow = null;
private static volatile IWorkbenchWindow previousActiveWindow = null;
private static IWindowListener windowListener = null;
// instance variables // instance variables
private Hashtable imageDescriptorRegistry = null; private Hashtable imageDescriptorRegistry = null;
@ -112,7 +120,7 @@ public abstract class SystemBasePlugin extends AbstractUIPlugin
if (Display.getCurrent() != null) { if (Display.getCurrent() != null) {
return wb.getActiveWorkbenchWindow(); return wb.getActiveWorkbenchWindow();
} }
// otherwise, get a list of all the windows, and simply return the first one // otherwise, get a list of all the windows, and try to guess which one is right
// KM: why do we need this?? // KM: why do we need this??
else { else {
// for bug 244454, this ends up returning the wrong window // for bug 244454, this ends up returning the wrong window
@ -126,18 +134,80 @@ public abstract class SystemBasePlugin extends AbstractUIPlugin
// will fail if we make the change now // will fail if we make the change now
// //
IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows(); IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
if (windows != null && windows.length > 0) { if (windows != null && windows.length > 0) {
if (windows.length == 1) {
return windows[0]; return windows[0];
} else {
IWorkbenchWindow bestCandidate = windows[0];
int candidateRank = 0;
for (int i = 0; i < windows.length; i++) {
if (windows[i] == activeWindow) {
return activeWindow;
} else if (windows[i] == previousActiveWindow) {
//Windows get deactivated when a sub-dialog is opened or user switches
//to another application. Such action still makes the previous window
//the best candidate for the active one.
bestCandidate = previousActiveWindow;
candidateRank=10;
} else if (windows[i].getActivePage()!= null && candidateRank==0) {
bestCandidate = windows[i];
candidateRank = 1;
}
}
return bestCandidate;
}
}
}
} }
else {
return null; return null;
} }
private static class WindowListener implements IWindowListener {
public void windowActivated(IWorkbenchWindow window) {
activeWindow = window;
previousActiveWindow = null; // not needed any more, allow gc
}
public void windowDeactivated(IWorkbenchWindow window) {
if (window == activeWindow) {
previousActiveWindow = activeWindow;
activeWindow = null;
}
} }
public void windowClosed(IWorkbenchWindow window) {
windowDeactivated(window);
}
public void windowOpened(IWorkbenchWindow window) {
}
}
private static void addWindowListener() {
synchronized (WindowListener.class) {
if (windowListener == null) {
try {
IWorkbench wb = PlatformUI.getWorkbench();
windowListener = new WindowListener();
wb.addWindowListener(windowListener);
} catch (IllegalStateException e) {
/* will try again later when workbench becomes available */
System.out.println("Workbench not yet available"); //$NON-NLS-1$
}
}
}
}
private static void removeWindowListener() {
synchronized (WindowListener.class) {
if (windowListener != null) {
try {
IWorkbench wb = PlatformUI.getWorkbench();
wb.removeWindowListener(windowListener);
} finally {
windowListener = null;
}
} }
else {
return null;
} }
} }
@ -541,12 +611,15 @@ public abstract class SystemBasePlugin extends AbstractUIPlugin
log = LoggerFactory.getLogger(this); log = LoggerFactory.getLogger(this);
log.logInfo("Loading " + this.getClass()); //$NON-NLS-1$ log.logInfo("Loading " + this.getClass()); //$NON-NLS-1$
} }
addWindowListener();
} }
/** /**
* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
*/ */
public void stop(BundleContext context) throws Exception { public void stop(BundleContext context) throws Exception {
removeWindowListener();
logDebugMessage(this.getClass().getName(), "SHUTDOWN"); //$NON-NLS-1$ logDebugMessage(this.getClass().getName(), "SHUTDOWN"); //$NON-NLS-1$
LoggerFactory.freeLogger(this); LoggerFactory.freeLogger(this);
super.stop(context); super.stop(context);
@ -569,6 +642,8 @@ public abstract class SystemBasePlugin extends AbstractUIPlugin
IWorkbench wb = null; IWorkbench wb = null;
try { try {
wb = PlatformUI.getWorkbench(); wb = PlatformUI.getWorkbench();
if (windowListener == null)
addWindowListener();
} }
catch (Exception exc) catch (Exception exc)
{ {

View file

@ -303,16 +303,17 @@ public class SystemFetchOperation extends JobChangeAdapter implements IRunnableW
Object[] children = null; Object[] children = null;
// we first test to see if this is an expand-to filter in effect for this // we first test to see if this is an expand-to filter in effect for this
// object, and if so use it... // object, and if so use it...
if (_adapter instanceof ISystemRemoteElementAdapter) if ((_part==null || _part instanceof SystemViewPart) && _adapter instanceof ISystemRemoteElementAdapter)
{ {
class GetExpandToFilter implements Runnable class GetExpandToFilter implements Runnable
{ {
private String expandToFilter = null; private String expandToFilter = null;
public void run() public void run()
{ {
// fetching part here ourselves, because right now there's no guarantee that _part will be the correct one // fetching part here ourselves, because the correct part can not always be determined from a background Thread
// see bug 244454 for details // see bug 244454 for details
IWorkbenchPart activePart = null; IWorkbenchPart activePart = _part;
if (activePart==null) {
IWorkbenchWindow win = SystemBasePlugin.getActiveWorkbenchWindow(); IWorkbenchWindow win = SystemBasePlugin.getActiveWorkbenchWindow();
if (win != null){ if (win != null){
IWorkbenchPage page = win.getActivePage(); IWorkbenchPage page = win.getActivePage();
@ -323,6 +324,7 @@ public class SystemFetchOperation extends JobChangeAdapter implements IRunnableW
} }
} }
} }
}
if (activePart instanceof SystemViewPart){ if (activePart instanceof SystemViewPart){
SystemView viewer = ((SystemViewPart)activePart).getSystemView(); SystemView viewer = ((SystemViewPart)activePart).getSystemView();