Skip to content

Commit d419df0

Browse files
SougandhSiloveeclipse
authored andcommitted
Add drag & drop support from Variables and Expressions to Debug Shell
Allow variables and expressions to be dragged from their respective views and inserted into the Debug Shell at the caret location.
1 parent 5c70abc commit d419df0

1 file changed

Lines changed: 91 additions & 11 deletions

File tree

  • org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display

org.eclipse.jdt.debug.ui/ui/org/eclipse/jdt/internal/debug/ui/display/DisplayView.java

Lines changed: 91 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2000, 2021 IBM Corporation and others.
2+
* Copyright (c) 2000, 2026 IBM Corporation and others.
33
*
44
* This program and the accompanying materials
55
* are made available under the terms of the Eclipse Public License 2.0
@@ -27,6 +27,10 @@
2727
import org.eclipse.core.commands.ExecutionException;
2828
import org.eclipse.core.commands.IHandler;
2929
import org.eclipse.core.commands.operations.IUndoContext;
30+
import org.eclipse.debug.core.DebugException;
31+
import org.eclipse.debug.core.model.IVariable;
32+
import org.eclipse.debug.core.model.IWatchExpression;
33+
import org.eclipse.debug.internal.ui.DebugUIPlugin;
3034
import org.eclipse.debug.ui.DebugUITools;
3135
import org.eclipse.debug.ui.IDebugUIConstants;
3236
import org.eclipse.jdt.debug.ui.IJavaDebugUIConstants;
@@ -62,14 +66,20 @@
6266
import org.eclipse.jface.text.IUndoManagerExtension;
6367
import org.eclipse.jface.text.source.ISourceViewer;
6468
import org.eclipse.jface.util.IPropertyChangeListener;
69+
import org.eclipse.jface.util.LocalSelectionTransfer;
6570
import org.eclipse.jface.util.PropertyChangeEvent;
71+
import org.eclipse.jface.viewers.ISelection;
6672
import org.eclipse.jface.viewers.ISelectionChangedListener;
73+
import org.eclipse.jface.viewers.IStructuredSelection;
6774
import org.eclipse.jface.viewers.SelectionChangedEvent;
6875
import org.eclipse.swt.SWT;
6976
import org.eclipse.swt.custom.StyledText;
7077
import org.eclipse.swt.dnd.DND;
7178
import org.eclipse.swt.dnd.DragSource;
7279
import org.eclipse.swt.dnd.DragSourceAdapter;
80+
import org.eclipse.swt.dnd.DropTarget;
81+
import org.eclipse.swt.dnd.DropTargetAdapter;
82+
import org.eclipse.swt.dnd.DropTargetEvent;
7383
import org.eclipse.swt.dnd.TextTransfer;
7484
import org.eclipse.swt.dnd.Transfer;
7585
import org.eclipse.swt.widgets.Composite;
@@ -488,17 +498,87 @@ public void init(IViewSite site, IMemento memento) throws PartInitException {
488498
*
489499
* @since 3.4
490500
*/
491-
protected void initDragAndDrop() {
492-
// Drag only
493-
DragSource ds = new DragSource(fSourceViewer.getTextWidget(), DND.DROP_COPY | DND.DROP_MOVE);
494-
ds.setTransfer(new Transfer[] {TextTransfer.getInstance()});
495-
ds.addDragListener(new DragSourceAdapter() {
496-
@Override
501+
protected void initDragAndDrop() {
502+
StyledText text = fSourceViewer.getTextWidget();
503+
// Drag & Drop
504+
DragSource ds = new DragSource(fSourceViewer.getTextWidget(), DND.DROP_COPY | DND.DROP_MOVE);
505+
ds.setTransfer(new Transfer[] { TextTransfer.getInstance() });
506+
ds.addDragListener(new DragSourceAdapter() {
507+
@Override
497508
public void dragSetData(org.eclipse.swt.dnd.DragSourceEvent event) {
498-
event.data = fSourceViewer.getTextWidget().getSelectionText();
499-
}
500-
});
501-
}
509+
event.data = fSourceViewer.getTextWidget().getSelectionText();
510+
}
511+
});
512+
513+
DropTarget dropTarget = new DropTarget(text, DND.DROP_COPY | DND.DROP_MOVE);
514+
dropTarget.setTransfer(new Transfer[] { LocalSelectionTransfer.getTransfer() });
515+
dropTarget.addDropListener(new DropTargetAdapter() {
516+
517+
@Override
518+
public void dragEnter(DropTargetEvent event) {
519+
normalizeDrop(event);
520+
}
521+
522+
@Override
523+
public void dragOver(DropTargetEvent event) {
524+
normalizeDrop(event);
525+
}
526+
527+
@Override
528+
public void drop(DropTargetEvent event) {
529+
normalizeDrop(event);
530+
String dropped = null;
531+
if (TextTransfer.getInstance().isSupportedType(event.currentDataType)) {
532+
dropped = (String) event.data;
533+
}
534+
if (dropped == null && LocalSelectionTransfer.getTransfer().isSupportedType(event.currentDataType)) {
535+
ISelection selection = LocalSelectionTransfer.getTransfer().getSelection();
536+
537+
if (selection instanceof IStructuredSelection sel) {
538+
List<Object> selections = sel.toList();
539+
StringBuilder build = new StringBuilder();
540+
for (Object obj : selections) {
541+
if (obj instanceof IVariable var) {
542+
try {
543+
build.append(var.getName());
544+
} catch (DebugException e) {
545+
DebugUIPlugin.log(e);
546+
}
547+
} else if (obj instanceof IWatchExpression exp) {
548+
build.append(exp.getExpressionText());
549+
}
550+
if (selections.size() > 1) {
551+
build.append(System.lineSeparator());
552+
}
553+
}
554+
dropped = build.toString();
555+
}
556+
}
557+
558+
if (dropped == null || dropped.isEmpty()) {
559+
return;
560+
}
561+
562+
StyledText text = fSourceViewer.getTextWidget();
563+
int start = text.getSelection().x;
564+
int len = text.getSelection().y - start;
565+
text.replaceTextRange(start, len, dropped);
566+
text.setCaretOffset(start + dropped.length());
567+
text.setFocus();
568+
}
569+
570+
private void normalizeDrop(DropTargetEvent event) {
571+
if (event.detail == DND.DROP_NONE) {
572+
event.detail = DND.DROP_COPY;
573+
}
574+
575+
if (LocalSelectionTransfer.getTransfer().isSupportedType(event.currentDataType)) {
576+
return;
577+
}
578+
event.detail = DND.DROP_NONE;
579+
}
580+
});
581+
}
502582

503583
/**
504584
* Returns the entire trimmed contents of the current document.

0 commit comments

Comments
 (0)