Next Previous Up Contents
Next: Table Load Dialogues
Up: GUI Support
Previous: GUI Support

### 5.1 Drag and Drop

From a user's point of view dragging is done by clicking down a mouse button on some visual component (the "drag source") and moving the mouse until it is over a second component (the "drop target") at which point the button is released. The semantics of this are defined by the application, but it usually signals that the dragged object (in this case a table) has been moved or copied from the drag source to the drop target; it's an intuitive and user-friendly way to offer transfer of an object from one place (application window) to another. STIL's generic I/O classes provide methods to make drag and drop of tables very straightforward.

Dragging and dropping are handled separately but in either case, you will need to construct a new `javax.swing.TransferHandler` object (subclassing `TransferHandler` itself and overriding some methods as below) and install it on the Swing `JComponent` which is to do be the drag source/drop target using its `setTransferHandler` method.

To allow a Swing component to accept tables that are dropped onto it, implement `TransferHandler`'s `canImport` and `importData` methods like this:

        class TableDragTransferHandler extends TransferHandler {
            StarTableFactory factory = new StarTableFactory();

            public boolean canImport( JComponent comp, DataFlavor[] flavors ) {
                return factory.canImport( flavors );
            }

            public boolean importData( JComponent comp, Transferable dropped ) {
                try {
                    StarTable table = factory.makeStarTable( dropped );
                    processDroppedTable( table );
                    return true;
                }
                catch ( IOException e ) {
                    e.printStackTrace();
                    return false;
                }
            }
        }

Then any time a table is dropped on that window, your `processDroppedTable` method will be called on it.

To allow tables to be dragged off of a component, implement the `createTransferable` method like this:

        class TableDropTransferHandler extends TransferHandler {
            StarTableOutput writer = new StarTableOutput();

            protected Transferable createTransferable( JComponent comp ) {
                StarTable table = getMyTable();
                return writer.transferStarTable( table );
            }
        }

(you may want to override `getSourceActions` and `getVisualRepresentation` as well. For some Swing components (see the Swing Data Transfer documentation for a list), this is all that is required. For others, you will need to arrange to recognise the drag gesture and trigger the `TransferHandler`'s `exportAsDrag` method as well; you can use a `DragListener` for this or see its source code for an example of how to do it.

Because of the way that Swing's Drag and Drop facilities work, this is not restricted to transferring tables between windows in the same application; if you incorporate one or other of these capabilities into your application, it will be able to exchange tables with any other application that does the same, even if it's running in a different Java Virtual Machine or on a different host - it just needs to have windows open on the same display device. TOPCAT is an example; you can drag tables off of or onto the Table List in the Control Window.

Next Previous Up Contents
Next: Table Load Dialogues
Up: GUI Support
Previous: GUI Support

STIL - Starlink Tables Infrastructure Library
Starlink User Note252
STIL web page: http://www.starlink.ac.uk/stil/
Author email: m.b.taylor@bristol.ac.uk