Class DelegatingDragAdapter

  • All Implemented Interfaces:
    EventListener, DragSourceListener, SWTEventListener

    public class DelegatingDragAdapter
    extends Object
    implements DragSourceListener
    A DelegatingDragAdapter is a DragSourceListener that maintains and delegates to a set of TransferDragSourceListeners. 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.

    The 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 Detail

      • DelegatingDragAdapter

        public DelegatingDragAdapter()
    • Method Detail

      • addDragSourceListener

        public void addDragSourceListener​(TransferDragSourceListener listener)
        Adds the given TransferDragSourceListener.
        Parameters:
        listener - the new listener
      • dragStart

        public void dragStart​(DragSourceEvent event)
        A drag operation has started. Forwards this event to each listener. A listener must set event.doit to false 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 interface DragSourceListener
        Parameters:
        event - the drag source event
        See Also:
        DragSourceListener.dragStart(DragSourceEvent)
      • getTransfers

        public Transfer[] getTransfers()
        Returns the Transfers from every TransferDragSourceListener.
        Returns:
        the combined Transfers
      • isEmpty

        public boolean isEmpty()
        Returns true if there are no listeners to delegate drag events to.
        Returns:
        true if there are no TransferDragSourceListeners false otherwise.
      • removeDragSourceListener

        public void removeDragSourceListener​(TransferDragSourceListener listener)
        Removes the given TransferDragSourceListener. Listeners should not be removed while a drag and drop operation is in progress.
        Parameters:
        listener - the TransferDragSourceListener to remove