blob: 085b9ae468b8d75cb988451e40b9a01285fb1dde [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
******************************************************************************/
package org.eclipse.ui.navigator;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.dnd.TransferData;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.navigator.NavigatorContentService;
import org.eclipse.ui.part.PluginTransfer;
/**
* Assist the {@link CommonDragAdapter} by providing new TransferTypes and the
* logic to handle setting up the transfer data. Clients must extend this class
* as part of the <b>org.eclipse.ui.navigator.viewer/dragAssistant</b>
* extension. By default, the Common Navigator supports
* {@link LocalSelectionTransfer} and {@link PluginTransfer}.
*
* <p>
* Clients may extend this class.
* </p>
*
* @see INavigatorDnDService
* @see CommonDragAdapter
* @see CommonDropAdapter
* @see CommonDropAdapterAssistant
* @see CommonViewer
* @see <a
* href="http://www.eclipse.org/articles/Article-SWT-DND/DND-in-SWT.html">Drag
* and Drop: Adding Drag and Drop to an SWT Application</a>
* @see <a
* href="http://www.eclipse.org/articles/Article-Workbench-DND/drag_drop.html">Drag
* and Drop in the Eclipse UI (Custom Transfer Types)</a>
*
* @since 3.2
*
*/
public abstract class CommonDragAdapterAssistant {
private INavigatorContentService contentService;
/**
* Extra TransferTypes allow the Navigator to generate different kinds of
* payloads for DND clients. By default, the {@link CommonDragAdapter}
* supports {@link LocalSelectionTransfer} and {@link PluginTransfer}.
*
* <p>
* CommonDragAdapterAssistants can extend the available TransferTypes that a
* Common Navigator Viewer can generate. Clients should return the set of
* Transfer Types they support. When a drop event occurs, the available drag
* assistants will be searched for a <i>enabled</i> assistants for the
* {@link DragSourceEvent}. Only if the drop event occurs will
* {@link #setDragData(DragSourceEvent, IStructuredSelection)} be called. If
* the drop event is cancelled,
* {@link #setDragData(DragSourceEvent, IStructuredSelection)} will not be
* called.
* </p>
*
* @return The added transfer types. (e.g. FileTransfer.getInstance()).
*/
public abstract Transfer[] getSupportedTransferTypes();
/**
* Set the value of the {@link org.eclipse.swt.widgets.Event#data} field using the given selection.
* Clients will only have an opportunity to set the drag data if they have
* returned a matching Transfer Type from
* {@link #getSupportedTransferTypes()} for the
* {@link DragSourceEvent#dataType}.
* <p>
* Clients will only have an opportunity to set the data when the drop event
* occurs. If the drop operation is cancelled, then this method will not be
* called.
* </p>
*
* @param anEvent
* The event object should have its {@link Event#data} field set
* to a value that matches a supported {@link TransferData} type.
* @param aSelection
* The current selection from the viewer.
* @return True if the data could be set; false otherwise.
*/
public abstract boolean setDragData(DragSourceEvent anEvent,
IStructuredSelection aSelection);
/**
* Accept and remember the content service this assistant is associated
* with.
*
* @param aContentService
*/
public final void setContentService(INavigatorContentService aContentService) {
contentService = aContentService;
}
/**
*
* @return The associated content service.
*/
public INavigatorContentService getContentService() {
return contentService;
}
/**
*
* @return The shell for the viewer this assistant is associated with or the
* shell of the active workbench window.
*/
public final Shell getShell() {
if (contentService != null) {
((NavigatorContentService) contentService).getShell();
}
return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
}
}