diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/navigator/CNavigatorDragAdapterAssistant.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/navigator/CNavigatorDragAdapterAssistant.java index 26a1f242abe..2e7ed473e03 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/navigator/CNavigatorDragAdapterAssistant.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/navigator/CNavigatorDragAdapterAssistant.java @@ -10,11 +10,15 @@ *******************************************************************************/ package org.eclipse.cdt.internal.ui.navigator; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; +import org.eclipse.core.runtime.IPath; import org.eclipse.jface.util.LocalSelectionTransfer; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.dnd.DragSourceEvent; +import org.eclipse.swt.dnd.FileTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.ui.navigator.CommonDragAdapterAssistant; @@ -23,22 +27,25 @@ import org.eclipse.cdt.core.model.ISourceReference; import org.eclipse.cdt.core.model.ITranslationUnit; /** - * A Common Navigator drag assistant for ICElements being also - * ISourceReferences. + * A Common Navigator drag assistant supporting LocalSelectionTransfer of + * ICElements being also ISourceReferences and + * FileTransfer for external translation units. * * @see org.eclipse.cdt.internal.ui.cview.SelectionTransferDragAdapter */ public class CNavigatorDragAdapterAssistant extends CommonDragAdapterAssistant { + private static final Transfer[] TRANSFERS = new Transfer[] { + LocalSelectionTransfer.getTransfer(), + FileTransfer.getInstance() + }; + /* * @see org.eclipse.ui.navigator.CommonDragAdapterAssistant#getSupportedTransferTypes() */ @Override public Transfer[] getSupportedTransferTypes() { - Transfer[] transfers= new Transfer[] { - LocalSelectionTransfer.getTransfer() - }; - return transfers; + return TRANSFERS; } /* @@ -47,22 +54,40 @@ public class CNavigatorDragAdapterAssistant extends CommonDragAdapterAssistant { @Override public boolean setDragData(DragSourceEvent event, IStructuredSelection selection) { if (selection != null) { - boolean applicable= false; - for (Iterator iter= (selection).iterator(); iter.hasNext();) { - Object element= iter.next(); - if (element instanceof ICElement) { - if (element instanceof ITranslationUnit) { - continue; + if (LocalSelectionTransfer.getTransfer().isSupportedType(event.dataType)) { + boolean applicable= false; + for (Iterator iter= (selection).iterator(); iter.hasNext();) { + Object element= iter.next(); + if (element instanceof ICElement) { + if (element instanceof ITranslationUnit) { + continue; + } + if (!(element instanceof ISourceReference)) { + return false; + } + applicable= true; } - if (!(element instanceof ISourceReference)) { - return false; - } - applicable= true; } - } - if (applicable) { - event.data = selection; - return true; + if (applicable) { + event.data = selection; + return true; + } + } else if (FileTransfer.getInstance().isSupportedType(event.dataType)) { + List files= new ArrayList(); + for (Iterator iter= (selection).iterator(); iter.hasNext();) { + Object element= iter.next(); + if (element instanceof ITranslationUnit) { + ITranslationUnit tu= (ITranslationUnit) element; + IPath location= tu.getLocation(); + if (location != null) { + files.add(location.toOSString()); + } + } + } + if (!files.isEmpty()) { + event.data = files.toArray(new String[files.size()]); + return true; + } } } return false;