Package org.eclipse.jface.util

## Class DelegatingDropAdapter

- java.lang.Object
- - org.eclipse.jface.util.DelegatingDropAdapter

All Implemented Interfaces:
  `EventListener`, `DropTargetListener`, `SWTEventListener`

    public class DelegatingDropAdapter
    extends Object
    implements DropTargetListener

A `DelegatingDropAdapter` is a `DropTargetListener` that maintains and delegates to a set of `TransferDropTargetListener`s. Each `TransferDropTargetListener` can then be implemented as if it were the DropTarget's only `DropTargetListener`.

On `dragEnter`, `dragOperationChanged`, `dragOver` and `drop`, a current listener is obtained from the set of all `TransferDropTargetListeners`. The current listener is the first listener to return `true` for `TransferDropTargetListener.isEnabled(DropTargetEvent)`. The current listener is forwarded all `DropTargetEvents` until some other listener becomes the current listener, or the drop terminates.

After adding all `TransferDropTargetListeners` to the `DelegatingDropAdapter` the combined set of `Transfers` should be set in the SWT `DropTarget`. `#getTransfers()` provides the set of `Transfer` types of all `TransferDropTargetListeners`.

The following example snippet shows a `DelegatingDropAdapter` with two `TransferDropTargetListeners`. One supports dropping resources and demonstrates how a listener can be disabled in the isEnabled method. The other listener supports text transfer.

                    final TreeViewer viewer = new TreeViewer(shell, SWT.NONE);
                    DelegatingDropAdapter dropAdapter = new DelegatingDropAdapter();
                    dropAdapter.addDropTargetListener(new TransferDropTargetListener() {
                            public Transfer getTransfer() {
                                    return ResourceTransfer.getInstance();
                            }
                            public boolean isEnabled(DropTargetEvent event) {
                                    // disable drop listener if there is no viewer selection
                                    if (viewer.getSelection().isEmpty())
                                            return false;
                                    return true;
                            }
                            public void dragEnter(DropTargetEvent event) {}
                            public void dragLeave(DropTargetEvent event) {}
                            public void dragOperationChanged(DropTargetEvent event) {}
                            public void dragOver(DropTargetEvent event) {}
                            public void drop(DropTargetEvent event) {
                                    if (event.data == null)
                                            return;
                                    IResource[] resources = (IResource[]) event.data;
                                    if (event.detail == DND.DROP_COPY) {
                                            // copy resources
                                    } else {
                                            // move resources
                                    }

                            }
                            public void dropAccept(DropTargetEvent event) {}
                    });
                    dropAdapter.addDropTargetListener(new TransferDropTargetListener() {
                            public Transfer getTransfer() {
                                    return TextTransfer.getInstance();
                            }
                            public boolean isEnabled(DropTargetEvent event) {
                                    return true;
                            }
                            public void dragEnter(DropTargetEvent event) {}
                            public void dragLeave(DropTargetEvent event) {}
                            public void dragOperationChanged(DropTargetEvent event) {}
                            public void dragOver(DropTargetEvent event) {}
                            public void drop(DropTargetEvent event) {
                                    if (event.data == null)
                                            return;
                                    System.out.println(event.data);
                            }
                            public void dropAccept(DropTargetEvent event) {}
                    });
                    viewer.addDropSupport(DND.DROP_COPY | DND.DROP_MOVE, dropAdapter.getTransfers(), dropAdapter);

Since:
  3.0

### Constructor Summary

Constructors
`DelegatingDropAdapter()`

### Method Summary

All Methods Instance Methods Concrete Methods
`void` `addDropTargetListener​(TransferDropTargetListener listener)` Adds the given `TransferDropTargetListener`.
`void` `dragEnter​(DropTargetEvent event)` The cursor has entered the drop target boundaries.
`void` `dragLeave​(DropTargetEvent event)` The cursor has left the drop target boundaries.
`void` `dragOperationChanged​(DropTargetEvent event)` The operation being performed has changed (usually due to the user changing a drag modifier key while dragging).
`void` `dragOver​(DropTargetEvent event)` The cursor is moving over the drop target.
`void` `drop​(DropTargetEvent event)` Forwards this event to the current listener, if there is one.
`void` `dropAccept​(DropTargetEvent event)` Forwards this event to the current listener if there is one.
`Transfer[]` `getTransfers()` Returns the combined set of `Transfer` types of all `TransferDropTargetListeners`.
`boolean` `isEmpty()` Returns `true` if there are no listeners to delegate events to.
`void` `removeDropTargetListener​(TransferDropTargetListener listener)` Removes the given `TransferDropTargetListener`.

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Constructor Detail

#### DelegatingDropAdapter

    public DelegatingDropAdapter()

### Method Detail

#### addDropTargetListener

    public void addDropTargetListener​(TransferDropTargetListener listener)

Adds the given `TransferDropTargetListener`.

Parameters:
  `listener` - the new listener

#### dragEnter

    public void dragEnter​(DropTargetEvent event)

The cursor has entered the drop target boundaries. The current listener is updated, and `#dragEnter()` is forwarded to the current listener.

Specified by:
  `dragEnter` in interface `DropTargetListener`
Parameters:
  `event` - the drop target event
See Also:
  `DropTargetListener.dragEnter(DropTargetEvent)`

#### dragLeave

    public void dragLeave​(DropTargetEvent event)

The cursor has left the drop target boundaries. The event is forwarded to the current listener.

Specified by:
  `dragLeave` in interface `DropTargetListener`
Parameters:
  `event` - the drop target event
See Also:
  `DropTargetListener.dragLeave(DropTargetEvent)`

#### dragOperationChanged

    public void dragOperationChanged​(DropTargetEvent event)

The operation being performed has changed (usually due to the user changing a drag modifier key while dragging). Updates the current listener and forwards this event to that listener.

Specified by:
  `dragOperationChanged` in interface `DropTargetListener`
Parameters:
  `event` - the drop target event
See Also:
  `DropTargetListener.dragOperationChanged(DropTargetEvent)`

#### dragOver

    public void dragOver​(DropTargetEvent event)

The cursor is moving over the drop target. Updates the current listener and forwards this event to that listener. If no listener can handle the drag operation the `event.detail` field is set to `DND.DROP_NONE` to indicate an invalid drop.

Specified by:
  `dragOver` in interface `DropTargetListener`
Parameters:
  `event` - the drop target event
See Also:
  `DropTargetListener.dragOver(DropTargetEvent)`

#### drop

    public void drop​(DropTargetEvent event)

Forwards this event to the current listener, if there is one. Sets the current listener to `null` afterwards.

Specified by:
  `drop` in interface `DropTargetListener`
Parameters:
  `event` - the drop target event
See Also:
  `DropTargetListener.drop(DropTargetEvent)`

#### dropAccept

    public void dropAccept​(DropTargetEvent event)

Forwards this event to the current listener if there is one.

Specified by:
  `dropAccept` in interface `DropTargetListener`
Parameters:
  `event` - the drop target event
See Also:
  `DropTargetListener.dropAccept(DropTargetEvent)`

#### getTransfers

    public Transfer[] getTransfers()

Returns the combined set of `Transfer` types of all `TransferDropTargetListeners`.

Returns:
  the combined set of `Transfer` types

#### isEmpty

    public boolean isEmpty()

Returns `true` if there are no listeners to delegate events to.

Returns:
  `true` if there are no `TransferDropTargetListeners` `false` otherwise

#### removeDropTargetListener

    public void removeDropTargetListener​(TransferDropTargetListener listener)

Removes the given `TransferDropTargetListener`. Listeners should not be removed while a drag and drop operation is in progress.

Parameters:
  `listener` - the listener to remove