diff --git a/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/WatchHandler.java b/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/WatchHandler.java
index a45587081a2..600384046ca 100644
--- a/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/WatchHandler.java
+++ b/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/expressions/WatchHandler.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008, 2015 Wind River Systems and others.
+ * Copyright (c) 2008, 2026 Wind River Systems and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,16 +10,16 @@
*
* Contributors:
* Wind River Systems - initial API and implementation
+ * IBM Corporation - Improved expression creation
*******************************************************************************/
package org.eclipse.debug.internal.ui.actions.expressions;
-import java.util.Iterator;
-
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.model.IDebugElement;
@@ -33,6 +33,8 @@
import org.eclipse.debug.ui.actions.IWatchExpressionFactoryAdapter2;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreePath;
+import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
@@ -49,13 +51,41 @@ public class WatchHandler extends AbstractHandler {
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
ISelection selection = HandlerUtil.getCurrentSelection(event);
- if (selection instanceof IStructuredSelection) {
- Iterator> iter = ((IStructuredSelection)selection).iterator();
- while (iter.hasNext()) {
- Object element = iter.next();
- createExpression(element);
+ if (selection instanceof IStructuredSelection structuredSelection) {
+ if (structuredSelection instanceof TreeSelection treeSelection) {
+ for (TreePath path : treeSelection.getPaths()) {
+ if (path.getSegmentCount() > 1) {
+ StringBuilder expressionString = new StringBuilder();
+ boolean hasError = false;
+ for (int e = 0; e < path.getSegmentCount(); e++) {
+ IVariable variable = (IVariable) path.getSegment(e);
+ try {
+ expressionString.append(variable.getName());
+ expressionString.append("."); //$NON-NLS-1$
+ } catch (DebugException e1) {
+ DebugUIPlugin.log(e1);
+ hasError = true;
+ break;
+ }
+ }
+ if (hasError || expressionString.length() == 0) {
+ continue;
+ }
+ expressionString.deleteCharAt(expressionString.length() - 1);
+ createWatchExpression(expressionString.toString());
+ } else {
+ Object element = path.getFirstSegment();
+ createExpression(element);
+ }
+ }
+ } else {
+ for (Object element : structuredSelection.toArray()) {
+ createExpression(element);
+ }
}
+ showExpressionsView();
}
+
return null;
}
@@ -96,9 +126,13 @@ private void createExpression(Object element) {
DebugUIPlugin.errorDialog(DebugUIPlugin.getShell(), ActionMessages.WatchAction_0, ActionMessages.WatchAction_1, e); //
return;
}
+ createWatchExpression(expressionString);
+ showExpressionsView();
+ }
+ private void createWatchExpression(String expressionString) {
IWatchExpression expression;
- expression = DebugPlugin.getDefault().getExpressionManager().newWatchExpression(expressionString);
+ expression = DebugPlugin.getDefault().getExpressionManager().newWatchExpression(expressionString);
DebugPlugin.getDefault().getExpressionManager().addExpression(expression);
IAdaptable object = DebugUITools.getDebugContext();
IDebugElement context = null;
@@ -108,10 +142,8 @@ private void createExpression(Object element) {
context = ((ILaunch) object).getDebugTarget();
}
expression.setExpressionContext(context);
- showExpressionsView();
}
-
/**
* Returns the factory adapter for the given variable or null if none.
*
diff --git a/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/expression/ExpressionDropAdapter.java b/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/expression/ExpressionDropAdapter.java
index 7df7c13b770..16970cb1a48 100644
--- a/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/expression/ExpressionDropAdapter.java
+++ b/debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/views/expression/ExpressionDropAdapter.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2013 IBM Corporation and others.
+ * Copyright (c) 2007, 2026 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -23,6 +23,7 @@
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.IExpressionManager;
import org.eclipse.debug.core.ILaunch;
@@ -40,6 +41,8 @@
import org.eclipse.debug.ui.actions.IWatchExpressionFactoryAdapterExtension;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeSelection;
+import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.ViewerDropAdapter;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTargetEvent;
@@ -373,19 +376,45 @@ private boolean performExpressionDrop(IStructuredSelection selection) {
*/
private boolean performVariableOrWatchAdaptableDrop(IStructuredSelection selection) {
List expressions = new ArrayList<>(selection.size());
- for (Iterator> itr = selection.iterator(); itr.hasNext();) {
- Object element = itr.next();
- String expressionText = createExpressionString(element);
- if (expressionText != null){
- IExpression expression = createExpression(expressionText);
- if (expression != null){
- expressions.add(expression);
+ IExpression expression;
+ if (selection instanceof ITreeSelection treeSelection) {
+ for (TreePath path : treeSelection.getPaths()) {
+ expression = null;
+ if (path.getSegmentCount() > 1) {
+ boolean failed = false;
+ StringBuilder expressionString = new StringBuilder();
+ for (int e = 0; e < path.getSegmentCount(); e++) {
+ IVariable variable = (IVariable) path.getSegment(e);
+ try {
+ expressionString.append(variable.getName());
+ expressionString.append("."); //$NON-NLS-1$
+ } catch (DebugException e1) {
+ DebugUIPlugin.log(e1);
+ failed = true;
+ break;
+ }
+ }
+ if (!failed && expressionString.length() > 0) {
+ expressionString.deleteCharAt(expressionString.length() - 1);
+ expression = createExpression(expressionString.toString());
+ }
} else {
- DebugUIPlugin.log(new Status(IStatus.ERROR,DebugUIPlugin.getUniqueIdentifier(),"Drop failed. Watch expression could not be created for the text " + expressionText)); //$NON-NLS-1$
- return false;
+ Object element = path.getFirstSegment();
+ String expressionText = createExpressionString(element);
+ if (expressionText == null) {
+ return false;
+ }
+ expression = createExpression(expressionText);
}
- } else {
- return false;
+ if (expression != null) {
+ expressions.add(expression);
+ }
+ }
+ } else {
+ for (Object element : selection) {
+ String expressionText = createExpressionString(element);
+ expression = createExpression(expressionText);
+ expressions.add(expression);
}
}
if (expressions.size() == selection.size()){