Swing JFC Java

/*
 * This example is from the book "Java Foundation Classes in a Nutshell".
 * Written by David Flanagan. Copyright (c) 1999 by O'Reilly & Associates.  
 * You may distribute this source code for non-commercial purposes only.
 * You may study, modify, and use this example for any purpose, as long as
 * this notice is retained.  Note that this example is provided "as is",
 * WITHOUT WARRANTY of any kind either expressed or implied.
 */
import java.awt.*;
import java.awt.event.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import javax.swing.*;
import javax.swing.border.*;
import java.io.*;
import java.util.List;
/** 
 * This simple JTextArea subclass allows TransferableColor objects to
 * be pasted or dropped into it.  It also supports the pasting of
 * text, and the dropping of File objects.  
 */
public class ColorSink extends JTextArea implements DropTargetListener {
  /** Create a new ColorSink object */
  public ColorSink() {
    // Listen for double clicks.  Use them to trigger a paste action.
    addMouseListener(new MouseAdapter() {
      public void mouseClicked(MouseEvent e) {
        if (e.getClickCount() == 2) { pastecolor(); e.consume(); }
      }
    });
    
    // We have to create a DropTarget object to support Drag-and-Drop
    // It will listen for drops on top of us, and notify our DropTargetListener
    // methods when drag-and-drop related events occur.
    setDropTarget(new DropTarget(this, this));
  }
  // This method is invoked when the user double-clicks on us.  It attempts
  // to paste a color or text.  Note that the JTextArea we extend
  // already supports cut-and-paste of text through the Ctrl-V keystroke.
  // This adds a different kind of cut-and-paste for demonstration purposes.
  public void pastecolor() {
    // Get the clipboard, and read its contents
    Clipboard c = this.getToolkit().getSystemClipboard();
    Transferable t = c.getContents(this);
    if (t == null) {             // If nothing to paste
      this.getToolkit().beep();  // then beep and do nothing
      return;
    }
    try {
      // If the clipboard contained a color, use it as the background color
      if (t.isDataFlavorSupported(TransferableColor.colorFlavor)) {
        Color color = (Color) t.getTransferData(TransferableColor.colorFlavor);
        this.setBackground(color);
      }
      // If the clipboard contained text, insert it.
      else if (t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
        String s = (String) t.getTransferData(DataFlavor.stringFlavor);
        this.replaceSelection(s);
      }
      // Otherwise, we don't know how to paste the data, so just beep.
      else this.getToolkit().beep();
    }
    catch (UnsupportedFlavorException ex) { this.getToolkit().beep(); }
    catch (IOException ex) { this.getToolkit().beep(); }
  }
  // The methods below are the methods of DropTargetListener.
  // They are invoked at various times when something is being
  // dragged over us, and allow us an opportunity to respond to the drag
  // This is the border we display when the user is dragging over us.
  protected static Border dropBorder = new BevelBorder(BevelBorder.LOWERED);
  // Something is being dragged over us.  If we can support this data type
  // tell the drag-and-drop system that we are interested, and display
  // a special border to tell the user that we're intereted.
  public void dragEnter(DropTargetDragEvent e) {
    if (e.isDataFlavorSupported(TransferableColor.colorFlavor) ||
        e.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
      e.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
      this.setBorder(dropBorder);
    }
  }
  /** The user is no longer dragging over us, so restore the default border */
  public void dragExit(DropTargetEvent e) { this.setBorder(null); }
  
  /** This method is invoked when the user drops something on us */
  public void drop(DropTargetDropEvent e){
    this.setBorder(null);                  // Restore the default border
    Transferable t = e.getTransferable();  // Get the data that was dropped
    // Check for types of data that we support
    if (t.isDataFlavorSupported(TransferableColor.colorFlavor)) {
      // If it was a color, accept it, and use it as the background color
      e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
      try {
        Color c = (Color) t.getTransferData(TransferableColor.colorFlavor);
        this.setBackground(c);
        e.dropComplete(true);
      }
      catch (Exception ex) { e.dropComplete(false); }
    }
    else if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
      // If it was a file list, accept it, read the first file in the list
      // and display the file contents
      e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
      try {
        List files = (List) t.getTransferData(DataFlavor.javaFileListFlavor);
        File f = (File) files.get(0);
        BufferedReader in = new BufferedReader(new FileReader(f));
        String s;
        this.setText("");
        while((s = in.readLine()) != null) this.append(s);
        e.dropComplete(true);
      }
      catch (Exception ex) { e.dropComplete(false); }
    }
    else {  // If it wasn't a color or a file list, reject it.
      e.rejectDrop();
      return;
    }
  }
  // These are unused DropTargetListener methods
  public void dragOver(DropTargetDragEvent e) {}
  public void dropActionChanged(DropTargetDragEvent e) {}
  /** This is a simple test program for ColorSource and ColorSink */
  public static void main(String[] args) {
    // Create a window
    JFrame f = new JFrame("ColorSourceTest");
    f.getContentPane().setLayout(new BorderLayout());
    // Add some ColorSources
    JPanel panel = new JPanel();
    f.getContentPane().add(panel, BorderLayout.NORTH);
    panel.add(new ColorSource(Color.yellow));
    panel.add(new ColorSource(Color.pink));
    panel.add(new ColorSource(Color.white));
    panel.add(new ColorSource(Color.gray));
    // Add a ColorSink
    ColorSink sink = new ColorSink();
    f.getContentPane().add(sink, BorderLayout.CENTER);
    // Pop it all up
    f.setSize(400, 300);
    f.show();
  }
}