Bug 19159 - ObjectActionDelegate hierarchy memory leak
diff --git a/org.eclipse.jdt.debug.ui/plugin.xml b/org.eclipse.jdt.debug.ui/plugin.xml
index e07870a..3e2e7ac 100644
--- a/org.eclipse.jdt.debug.ui/plugin.xml
+++ b/org.eclipse.jdt.debug.ui/plugin.xml
@@ -316,6 +316,7 @@
 	<objectContribution

 		id="org.eclipse.jdt.debug.DropToFrameActions"

 		objectClass="org.eclipse.jdt.debug.core.IJavaStackFrame">

+		<filter name="DropToFrameActionFilter" value="supportsDropToFrame"/>

 		<action

 			id="org.eclipse.jdt.ui.actions.DropToFrame"

 			label="%dropFrameAction.label"

diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIDebugUIPlugin.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIDebugUIPlugin.java
index 12d9c5e..7eb2f27 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIDebugUIPlugin.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/JDIDebugUIPlugin.java
@@ -34,6 +34,7 @@
 import org.eclipse.jdt.core.JavaModelException;

 import org.eclipse.jdt.debug.core.IJavaDebugTarget;

 import org.eclipse.jdt.debug.core.IJavaHotCodeReplaceListener;

+import org.eclipse.jdt.debug.core.IJavaStackFrame;

 import org.eclipse.jdt.debug.core.JDIDebugModel;

 import org.eclipse.jdt.debug.eval.IAstEvaluationEngine;

 import org.eclipse.jdt.debug.ui.IJavaDebugUIConstants;

@@ -241,6 +242,7 @@
 		IAdapterManager manager= Platform.getAdapterManager();

 		manager.registerAdapters(new JDIDebugUIAdapterFactory(), IJavaSourceLocation.class);

 		manager.registerAdapters(new MethodAdapterFactory(), IMethod.class);

+		manager.registerAdapters(new JavaStackFrameAdapterFactory(), IJavaStackFrame.class);

 		

 		fEvaluationEngineManager= new JavaEvaluationEngineManager();

 		fJavaModelListener= new JavaModelListener();

diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/BreakpointHitCountAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/BreakpointHitCountAction.java
index 7e0673f..3bd68c9 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/BreakpointHitCountAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/BreakpointHitCountAction.java
@@ -8,8 +8,6 @@
 import java.util.Iterator;

 

 import org.eclipse.core.runtime.CoreException;

-import org.eclipse.debug.core.DebugPlugin;

-import org.eclipse.debug.core.IBreakpointManager;

 import org.eclipse.jdt.debug.core.IJavaBreakpoint;

 import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin;

 import org.eclipse.jface.action.IAction;

@@ -101,21 +99,17 @@
 		protected void setHitCountEnabled(boolean hitCountEnabled) {

 			fHitCountEnabled = hitCountEnabled;

 		}

-

-}

-

-	/**

-	 * Returns the plugin's breakpoint manager

-	 */

-	protected IBreakpointManager getBreakpointManager() {

-		return DebugPlugin.getDefault().getBreakpointManager();

 	}

 

+

 	/**

 	 * @see IActionDelegate#run(IAction)

 	 */

 	public void run(IAction action) {

-		IStructuredSelection selection= getStructuredSelection();

+		IStructuredSelection selection= getCurrentSelection();

+		if (selection == null) {

+			return;

+		}

 		Iterator enum= selection.iterator();

 		if (!enum.hasNext()) {

 			return;

diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/DropToFrameAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/DropToFrameAction.java
index 51e1065..3449553 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/DropToFrameAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/DropToFrameAction.java
@@ -11,11 +11,11 @@
 import org.eclipse.jdt.debug.core.IJavaStackFrame;

 import org.eclipse.jdt.internal.debug.ui.ExceptionHandler;

 import org.eclipse.jface.action.IAction;

+import org.eclipse.jface.viewers.IStructuredSelection;

 

 public class DropToFrameAction extends ObjectActionDelegate {

 

-

-	public boolean isEnabledFor(Object element) {

+	protected boolean isEnabledFor(Object element) {

 		IJavaStackFrame frame= (IJavaStackFrame)element;

 		return frame != null && frame.isSuspended() && frame.supportsDropToFrame();

 	}

@@ -24,9 +24,12 @@
 	 * @see IActionDelegate#run(IAction)

 	 */

 	public void run(IAction action) {

-		Iterator enum= getStructuredSelection().iterator();

-		// selectionChanged has already checked for correct selection

-

+		IStructuredSelection selection= getCurrentSelection();

+		if (selection == null) {

+			return;

+		}

+		Iterator enum= selection.iterator();

+		

 		while (enum.hasNext()) {

 			IJavaStackFrame frame= (IJavaStackFrame)enum.next();

 			try {

@@ -37,6 +40,5 @@
 				ExceptionHandler.handle(de, title, message);

 			}

 		}

-		update(action);

 	}

 }

diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ObjectActionDelegate.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ObjectActionDelegate.java
index 8c5806d..d5a11b6 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ObjectActionDelegate.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/ObjectActionDelegate.java
@@ -5,38 +5,53 @@
  * All Rights Reserved.
  */

 

-import org.eclipse.jface.action.IAction;

-import org.eclipse.jface.viewers.ISelection;

+import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
 import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IObjectActionDelegate;

+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.IWorkbenchPart;

 

 public abstract class ObjectActionDelegate implements IObjectActionDelegate {

-
-	protected IStructuredSelection fCurrentSelection;
 	

 	/**

 	 * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)

 	 */

-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {

+	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+		update(action, targetPart);

 	}
 	
-	protected abstract boolean isEnabledFor(Object element);

+	protected abstract boolean isEnabledFor(Object element);
+	

 	/**
 	 * @see IActionDelegate#selectionChanged(IAction, ISelection)
 	 */
 	public void selectionChanged(IAction action, ISelection sel) {
-		if (sel instanceof IStructuredSelection) {
-			fCurrentSelection= (IStructuredSelection)sel;
-			update(action);
+	}
+	
+	protected void update(IAction action, IWorkbenchPart targetPart) {
+		ISelectionProvider sp= targetPart.getSite().getSelectionProvider();
+		boolean enable= false;
+		if (sp != null) {
+			ISelection selection= sp.getSelection();
+			if (selection instanceof IStructuredSelection) {
+				IStructuredSelection ss= (IStructuredSelection)selection;
+				enable= ss.size() == 1 && isEnabledFor(ss.getFirstElement());
+			}
 		}
+		action.setEnabled(enable);
 	}
 	
-	protected void update(IAction action) {
-		action.setEnabled(fCurrentSelection.size() == 1 && isEnabledFor(fCurrentSelection.getFirstElement()));
-	}
-	
-	protected IStructuredSelection getStructuredSelection() {
-		return fCurrentSelection;
+	protected IStructuredSelection getCurrentSelection() {
+		IWorkbenchPage page= JDIDebugUIPlugin.getActivePage();
+		if (page != null) {
+			ISelection selection= page.getSelection();
+			if (selection instanceof IStructuredSelection) {
+				return (IStructuredSelection)selection;
+			}	
+		}
+		return null;
 	}

 }

diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenOnVariableAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenOnVariableAction.java
index 6a9b1d6..7e27f7a 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenOnVariableAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenOnVariableAction.java
@@ -43,7 +43,7 @@
 		return typeName;

 	}

 	

-	public boolean isEnabledFor(Object o){

+	protected boolean isEnabledFor(Object o){

 		if (!(o instanceof IAdaptable)) {

 			return false;

 		}

diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenTypeAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenTypeAction.java
index 362ab33..a49b815 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenTypeAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/OpenTypeAction.java
@@ -25,18 +25,20 @@
 import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin;

 import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility;

 import org.eclipse.jface.action.IAction;

-import org.eclipse.jface.viewers.StructuredViewer;

+import org.eclipse.jface.viewers.IStructuredSelection;

 import org.eclipse.ui.IEditorPart;

 

 public abstract class OpenTypeAction extends ObjectActionDelegate {

-	private StructuredViewer fViewer;

-

+	

 	/**

 	 * @see IActionDelegate#run(IAction)

 	 */

 	public void run(IAction action) {

-		Iterator enum= getStructuredSelection().iterator();

-		//selectionChanged has already checked for correct selection

+		IStructuredSelection selection= getCurrentSelection();

+		if (selection == null) {

+			return;

+		}

+		Iterator enum= selection.iterator();

 		try {

 			while (enum.hasNext()) {

 				Object element= enum.next();

diff --git a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/StackFrameAction.java b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/StackFrameAction.java
index 1763d1f..a40c903 100644
--- a/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/StackFrameAction.java
+++ b/org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/actions/StackFrameAction.java
@@ -11,7 +11,7 @@
 

 public abstract class StackFrameAction extends OpenTypeAction {

 	

-	public boolean isEnabledFor(Object element) {

+	protected boolean isEnabledFor(Object element) {

 		return element instanceof IAdaptable && ((IAdaptable) element).getAdapter(IJavaStackFrame.class) != null;

 	}