Swing JFC Java

/*
Core SWING Advanced Programming 
By Kim Topley
ISBN: 0 13 083292 8       
Publisher: Prentice Hall  
*/
import java.awt.Font;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragSource;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceDropEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.dnd.DragSourceListener;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Iterator;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.UIManager;
public class JLabelDragSource implements DragGestureListener,
    DragSourceListener {
  public JLabelDragSource(JLabel label) {
    this.label = label;
    // Use the default DragSource
    DragSource dragSource = DragSource.getDefaultDragSource();
    // Create a DragGestureRecognizer and
    // register as the listener
    dragSource.createDefaultDragGestureRecognizer(label,
        DnDConstants.ACTION_COPY_OR_MOVE, this);
  }
  // Implementation of DragGestureListener interface.
  public void dragGestureRecognized(DragGestureEvent dge) {
    if (DnDUtils.isDebugEnabled()) {
      DnDUtils.debugPrintln("Initiating event is "
          + dge.getTriggerEvent());
      DnDUtils.debugPrintln("Complete event set is:");
      Iterator iter = dge.iterator();
      while (iter.hasNext()) {
        DnDUtils.debugPrintln("\t" + iter.next());
      }
    }
    Transferable transferable = new JLabelTransferable(label);
    dge.startDrag(null, transferable, this);
  }
  // Implementation of DragSourceListener interface
  public void dragEnter(DragSourceDragEvent dsde) {
    DnDUtils.debugPrintln("Drag Source: dragEnter, drop action = "
        + DnDUtils.showActions(dsde.getDropAction()));
  }
  public void dragOver(DragSourceDragEvent dsde) {
    DnDUtils.debugPrintln("Drag Source: dragOver, drop action = "
        + DnDUtils.showActions(dsde.getDropAction()));
  }
  public void dragExit(DragSourceEvent dse) {
    DnDUtils.debugPrintln("Drag Source: dragExit");
  }
  public void dropActionChanged(DragSourceDragEvent dsde) {
    DnDUtils.debugPrintln("Drag Source: dropActionChanged, drop action = "
        + DnDUtils.showActions(dsde.getDropAction()));
  }
  public void dragDropEnd(DragSourceDropEvent dsde) {
    DnDUtils.debugPrintln("Drag Source: drop completed, drop action = "
        + DnDUtils.showActions(dsde.getDropAction()) + ", success: "
        + dsde.getDropSuccess());
  }
  public static void main(String[] args) {
    try {
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    } catch (Exception evt) {}
  
    JFrame f = new JFrame("Draggable JLabel");
    JLabel label = new JLabel("Drag this text", JLabel.CENTER);
    label.setFont(new Font("Serif", Font.BOLD, 32));
    f.getContentPane().add(label);
    f.pack();
    f.setVisible(true);
    // Attach the drag source
    JLabelDragSource dragSource = new JLabelDragSource(label);
  }
  protected JLabel label; // The associated JLabel
}
class DnDUtils {
  public static String showActions(int action) {
    String actions = "";
    if ((action & (DnDConstants.ACTION_LINK | DnDConstants.ACTION_COPY_OR_MOVE)) == 0) {
      return "None";
    }
    if ((action & DnDConstants.ACTION_COPY) != 0) {
      actions += "Copy ";
    }
    if ((action & DnDConstants.ACTION_MOVE) != 0) {
      actions += "Move ";
    }
    if ((action & DnDConstants.ACTION_LINK) != 0) {
      actions += "Link";
    }
    return actions;
  }
  public static boolean isDebugEnabled() {
    return debugEnabled;
  }
  public static void debugPrintln(String s) {
    if (debugEnabled) {
      System.out.println(s);
    }
  }
  private static boolean debugEnabled = (System
      .getProperty("DnDExamples.debug") != null);
}
class JLabelTransferable implements Transferable {
  public JLabelTransferable(JLabel label) {
    this.label = label;
  }
  // Implementation of the Transferable interface
  public DataFlavor[] getTransferDataFlavors() {
    return flavors;
  }
  public boolean isDataFlavorSupported(DataFlavor fl) {
    for (int i = 0; i < flavors.length; i++) {
      if (fl.equals(flavors[i])) {
        return true;
      }
    }
    return false;
  }
  public Object getTransferData(DataFlavor fl) {
    if (!isDataFlavorSupported(fl)) {
      return null;
    }
    if (fl.equals(DataFlavor.stringFlavor)) {
      // String - return the text as a String
      return label.getText() + " (DataFlavor.stringFlavor)";
    } else if (fl.equals(jLabelFlavor)) {
      // The JLabel itself - just return the label.
      return label;
    } else {
      // Plain text - return an InputStream
      try {
        String targetText = label.getText() + " (plain text flavor)";
        int length = targetText.length();
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        OutputStreamWriter w = new OutputStreamWriter(os);
        w.write(targetText, 0, length);
        w.flush();
        byte[] bytes = os.toByteArray();
        w.close();
        return new ByteArrayInputStream(bytes);
      } catch (IOException e) {
        return null;
      }
    }
  }
  // A flavor that transfers a copy of the JLabel
  public static final DataFlavor jLabelFlavor = new DataFlavor(JLabel.class,
      "Swing JLabel");
  private JLabel label; // The label being transferred
  private static final DataFlavor[] flavors = new DataFlavor[] {
      DataFlavor.stringFlavor,
      new DataFlavor("text/plain; charset=ascii", "ASCII text"),
      jLabelFlavor };
}