Bug 23762 - NPE - variable details stop showing
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIModelPresentation.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIModelPresentation.java
index 532e849..a495887 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIModelPresentation.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIModelPresentation.java
@@ -21,9 +21,11 @@
 import org.eclipse.debug.core.DebugEvent;
 import org.eclipse.debug.core.DebugException;
 import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunch;
 import org.eclipse.debug.core.model.IBreakpoint;
 import org.eclipse.debug.core.model.IDisconnect;
 import org.eclipse.debug.core.model.IExpression;
+import org.eclipse.debug.core.model.ISourceLocator;
 import org.eclipse.debug.core.model.IStackFrame;
 import org.eclipse.debug.core.model.ITerminate;
 import org.eclipse.debug.core.model.IThread;
@@ -32,6 +34,8 @@
 import org.eclipse.debug.ui.IDebugModelPresentation;
 import org.eclipse.debug.ui.IDebugUIConstants;
 import org.eclipse.debug.ui.IValueDetailListener;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.core.IMember;
 import org.eclipse.jdt.core.IType;
 import org.eclipse.jdt.debug.core.IEvaluationRunnable;
@@ -1394,6 +1398,7 @@
 		private Thread fDetailThread;
 		private IValue fValue;
 		private IJavaThread fJavaThread;
+		private IJavaProject fJavaProject;
 		private IValueDetailListener fListener;
 		private static final int EVAL_TIMEOUT = 3000;		
 		
@@ -1422,6 +1427,7 @@
 			fValue = value;
 			fListener = listener;
 			fJavaThread = thread;
+			fJavaProject= getJavaProject();
 						
 			// check the queue to avoid concurrent evaluations
 			List queue = (List)fgDetailQueue.get(fJavaThread);
@@ -1483,7 +1489,7 @@
 						// try to use the detail formatters system on the object
 						IJavaValue prettyPrinterResult;
 						try {
-							prettyPrinterResult= JavaDetailFormattersManager.getDefault().getValueDetail((IJavaObject)fValue, fJavaThread);
+							prettyPrinterResult= JavaDetailFormattersManager.getDefault().getValueDetail((IJavaObject)fValue, fJavaThread, fJavaProject);
 						} catch (DebugException e) {
 							handleDebugException(e, (IJavaValue)fValue);
 							return;
@@ -1531,6 +1537,35 @@
 			fDetailThread.start();
 
 		}
+
+		private IJavaProject getJavaProject() {
+			IAdaptable context = DebugUITools.getDebugContext();
+			if (context instanceof IThread) {
+				try {
+					context = ((IThread)context).getTopStackFrame();
+				} catch (DebugException e) {
+					JDIDebugUIPlugin.log(e);
+				}
+			}
+			if (context == null) {
+				return null;
+			}
+			IJavaStackFrame stackFrame = (IJavaStackFrame) context.getAdapter(IJavaStackFrame.class);
+			ILaunch launch = stackFrame.getLaunch();
+			if (launch == null) {
+				return null;
+			}
+			ISourceLocator locator= launch.getSourceLocator();
+			if (locator == null)
+				return null;
+			
+			Object sourceElement = locator.getSourceElement(stackFrame);
+			if (sourceElement instanceof IJavaElement) {
+				return ((IJavaElement) sourceElement).getJavaProject();
+			}			
+			return null;
+		}
+	
 				
 		protected void appendJDIPrimitiveValueString(IValue value) {
 			if (value instanceof IJavaValue) {
diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDetailFormattersManager.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDetailFormattersManager.java
index 33c1c94..fe311df 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDetailFormattersManager.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JavaDetailFormattersManager.java
Binary files differ