1 /******************************************************************************* 2 * Copyright (c) 2000, 2011 IBM Corporation and others. 3 * 4 * This program and the accompanying materials 5 * are made available under the terms of the Eclipse Public License 2.0 6 * which accompanies this distribution, and is available at 7 * https://www.eclipse.org/legal/epl-2.0/ 8 * 9 * SPDX-License-Identifier: EPL-2.0 10 * 11 * Contributors: 12 * IBM Corporation - initial API and implementation 13 * Patrick Chuong (Texas Instruments) - Improve usability of the breakpoint view (Bug 238956) 14 *******************************************************************************/ 15 package org.eclipse.debug.internal.ui.views.breakpoints; 16 17 import org.eclipse.core.runtime.Assert; 18 import org.eclipse.jface.util.LocalSelectionTransfer; 19 import org.eclipse.jface.util.TransferDragSourceListener; 20 import org.eclipse.jface.viewers.AbstractTreeViewer; 21 import org.eclipse.jface.viewers.ISelection; 22 import org.eclipse.jface.viewers.ITreeSelection; 23 import org.eclipse.jface.viewers.TreePath; 24 import org.eclipse.swt.dnd.DND; 25 import org.eclipse.swt.dnd.DragSourceAdapter; 26 import org.eclipse.swt.dnd.DragSourceEvent; 27 import org.eclipse.swt.dnd.Transfer; 28 import org.eclipse.swt.widgets.Item; 29 30 /** 31 * A drag adapter for the breakpoints viewer 32 */ 33 public class BreakpointsDragAdapter extends DragSourceAdapter implements TransferDragSourceListener { 34 35 /** 36 * the associated viewer for the adapter 37 */ 38 private AbstractTreeViewer fViewer; 39 private Item[] fItems = null; 40 41 private BreakpointsView fView; 42 private TreePath[] fTreePaths = null; 43 44 /** 45 * Constructor 46 * @param viewer the associated viewer, which acts as the selection provider and therefore <b>must</b> implement <code>ISelectionProvider</code> 47 */ BreakpointsDragAdapter(BreakpointsViewer viewer)48 public BreakpointsDragAdapter(BreakpointsViewer viewer) { 49 Assert.isNotNull(viewer); 50 fViewer = viewer; 51 } BreakpointsDragAdapter(AbstractTreeViewer viewer, BreakpointsView view)52 public BreakpointsDragAdapter(AbstractTreeViewer viewer, BreakpointsView view) { 53 Assert.isNotNull(view); 54 fViewer = viewer; 55 fView = view; 56 } 57 58 @Override getTransfer()59 public Transfer getTransfer() { 60 return LocalSelectionTransfer.getTransfer(); 61 } 62 63 @Override dragStart(DragSourceEvent event)64 public void dragStart(DragSourceEvent event) { 65 ISelection selection = fViewer.getSelection(); 66 LocalSelectionTransfer.getTransfer().setSelection(selection); 67 LocalSelectionTransfer.getTransfer().setSelectionSetTime(event.time & 0xFFFFFFFFL); 68 if (fViewer instanceof BreakpointsViewer) { 69 BreakpointsViewer viewer = (BreakpointsViewer)fViewer; 70 fItems = viewer.getSelectedItems(); 71 event.doit = viewer.canDrag(fItems); 72 } else { 73 if (selection instanceof ITreeSelection) { 74 fTreePaths = ((ITreeSelection) selection).getPaths(); 75 } else { 76 fTreePaths = new TreePath[0]; 77 } 78 event.doit = fView.canDrag(fTreePaths); 79 } 80 } 81 82 /* non Java-doc 83 * @see org.eclipse.swt.dnd.DragSourceListener#dragSetData 84 */ 85 @Override dragSetData(DragSourceEvent event)86 public void dragSetData(DragSourceEvent event) { 87 // For consistency set the data to the selection even though 88 // the selection is provided by the LocalSelectionTransfer 89 // to the drop target adapter. 90 event.data = LocalSelectionTransfer.getTransfer().getSelection(); 91 } 92 93 /* non Java-doc 94 * @see org.eclipse.swt.dnd.DragSourceListener#dragFinished 95 */ 96 @Override dragFinished(DragSourceEvent event)97 public void dragFinished(DragSourceEvent event) { 98 if (event.detail == DND.DROP_MOVE) { 99 // remove from source on move operation 100 if (fViewer instanceof BreakpointsViewer) { 101 BreakpointsViewer viewer = (BreakpointsViewer)fViewer; 102 viewer.performDrag(fItems); 103 } else { 104 fView.performDrag(fTreePaths); 105 } 106 } 107 fItems = null; 108 LocalSelectionTransfer.getTransfer().setSelection(null); 109 LocalSelectionTransfer.getTransfer().setSelectionSetTime(0); 110 } 111 } 112