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;
}