Class DelegatingDragAdapter
- All Implemented Interfaces:
EventListener
,DragSourceListener
,SWTEventListener
DelegatingDragAdapter
is a DragSourceListener
that maintains and delegates to a set of TransferDragSourceListener
s.
Each TransferDragSourceListener can then be implemented as if it were the
DragSource's
only DragSourceListener.
When a drag is started, a subset of all
TransferDragSourceListeners
is generated and stored in a list of
active listeners. This subset is calculated by forwarding
DragSourceListener.dragStart(DragSourceEvent)
to every listener, and
checking if the doit
field is left set to
true
.
DragSource
's set of supported Transfer types
(DragSource.setTransfer(Transfer[])
) is updated to reflect the
Transfer types corresponding to the active listener subset.
If and when dragSetData(DragSourceEvent)
is called, a single
TransferDragSourceListener
is chosen, and only it is allowed to
set the drag data. The chosen listener is the first listener in the subset of
active listeners whose Transfer supports
(Transfer.isSupportedType(TransferData)
) the dataType
in
the DragSourceEvent
.
The following example snippet shows a DelegatingDragAdapter
with
two TransferDragSourceListeners
. One implements drag of text
strings, the other supports file transfer and demonstrates how a listener can
be disabled using the dragStart method.
final TreeViewer viewer = new TreeViewer(shell, SWT.NONE);
DelegatingDragAdapter dragAdapter = new DelegatingDragAdapter();
dragAdapter.addDragSourceListener(new TransferDragSourceListener() {
public Transfer getTransfer() {
return TextTransfer.getInstance();
}
public void dragStart(DragSourceEvent event) {
// always enabled, can control enablement based on selection etc.
}
public void dragSetData(DragSourceEvent event) {
event.data = "Transfer data";
}
public void dragFinished(DragSourceEvent event) {
// no clean-up required
}
});
dragAdapter.addDragSourceListener(new TransferDragSourceListener() {
public Transfer getTransfer() {
return FileTransfer.getInstance();
}
public void dragStart(DragSourceEvent event) {
// enable drag listener if there is a viewer selection
event.doit = !viewer.getSelection().isEmpty();
}
public void dragSetData(DragSourceEvent event) {
File file1 = new File("C:/temp/file1");
File file2 = new File("C:/temp/file2");
event.data = new String[] {file1.getAbsolutePath(), file2.getAbsolutePath()};
}
public void dragFinished(DragSourceEvent event) {
// no clean-up required
}
});
viewer.addDragSupport(DND.DROP_COPY | DND.DROP_MOVE, dragAdapter.getTransfers(), dragAdapter);
- Since:
- 3.0
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionvoid
Adds the givenTransferDragSourceListener
.void
dragFinished
(DragSourceEvent event) The drop has successfully completed.void
dragSetData
(DragSourceEvent event) The drop data is requested.void
dragStart
(DragSourceEvent event) A drag operation has started.Transfer[]
Returns theTransfer
s from everyTransferDragSourceListener
.boolean
isEmpty()
Returnstrue
if there are no listeners to delegate drag events to.void
Removes the givenTransferDragSourceListener
.
-
Constructor Details
-
DelegatingDragAdapter
public DelegatingDragAdapter()
-
-
Method Details
-
addDragSourceListener
Adds the givenTransferDragSourceListener
.- Parameters:
listener
- the new listener
-
dragFinished
The drop has successfully completed. This event is forwarded to the current drag listener. Doesn't update the current listener, since the current listener is already the one that completed the drag operation.- Specified by:
dragFinished
in interfaceDragSourceListener
- Parameters:
event
- the drag source event- See Also:
-
dragSetData
The drop data is requested. Updates the current listener and then forwards the event to it.- Specified by:
dragSetData
in interfaceDragSourceListener
- Parameters:
event
- the drag source event- See Also:
-
dragStart
A drag operation has started. Forwards this event to each listener. A listener must setevent.doit
tofalse
if it cannot handle the drag operation. If a listener can handle the drag, it is added to the list of active listeners. The drag is aborted if there are no listeners that can handle it.- Specified by:
dragStart
in interfaceDragSourceListener
- Parameters:
event
- the drag source event- See Also:
-
getTransfers
Returns theTransfer
s from everyTransferDragSourceListener
.- Returns:
- the combined
Transfer
s
-
isEmpty
public boolean isEmpty()Returnstrue
if there are no listeners to delegate drag events to.- Returns:
true
if there are noTransferDragSourceListeners
false
otherwise.
-
removeDragSourceListener
Removes the givenTransferDragSourceListener
. Listeners should not be removed while a drag and drop operation is in progress.- Parameters:
listener
- theTransferDragSourceListener
to remove
-