From c914c43c546c8a24a71ec2e40e4a612a8c746554 Mon Sep 17 00:00:00 2001
From: Keiko Katsuragawa <kkatsuragawa@uwaterloo.ca>
Date: Sun, 4 Mar 2018 23:07:56 -0500
Subject: [PATCH] add 3-5-Clipboard

---
 java/3-5-Clipboard/ClipboardDemo.java         | 161 ++++++++++++
 java/3-5-Clipboard/DragAndDropDemo.java       | 180 +++++++++++++
 java/3-5-Clipboard/makefile                   |  15 ++
 .../transferDemo/DragableImage.java           | 157 +++++++++++
 .../transferDemo/ImageGridPanel.java          | 243 ++++++++++++++++++
 .../transferDemo/ImageTransferHandler.java    |  87 +++++++
 .../transferDemo/ImageTransferable.java       |  33 +++
 .../transferDemo/TransferDemo.java            |  59 +++++
 .../transferDemo/images/angry.jpg             | Bin 0 -> 19465 bytes
 .../transferDemo/images/happy.jpg             | Bin 0 -> 10880 bytes
 .../transferDemo/images/laughing.jpg          | Bin 0 -> 19824 bytes
 .../transferDemo/images/worried.jpg           | Bin 0 -> 19492 bytes
 java/3-5-Clipboard/transferDemo/makefile      |  15 ++
 13 files changed, 950 insertions(+)
 create mode 100644 java/3-5-Clipboard/ClipboardDemo.java
 create mode 100644 java/3-5-Clipboard/DragAndDropDemo.java
 create mode 100644 java/3-5-Clipboard/makefile
 create mode 100644 java/3-5-Clipboard/transferDemo/DragableImage.java
 create mode 100644 java/3-5-Clipboard/transferDemo/ImageGridPanel.java
 create mode 100644 java/3-5-Clipboard/transferDemo/ImageTransferHandler.java
 create mode 100644 java/3-5-Clipboard/transferDemo/ImageTransferable.java
 create mode 100644 java/3-5-Clipboard/transferDemo/TransferDemo.java
 create mode 100644 java/3-5-Clipboard/transferDemo/images/angry.jpg
 create mode 100644 java/3-5-Clipboard/transferDemo/images/happy.jpg
 create mode 100644 java/3-5-Clipboard/transferDemo/images/laughing.jpg
 create mode 100644 java/3-5-Clipboard/transferDemo/images/worried.jpg
 create mode 100644 java/3-5-Clipboard/transferDemo/makefile

diff --git a/java/3-5-Clipboard/ClipboardDemo.java b/java/3-5-Clipboard/ClipboardDemo.java
new file mode 100644
index 0000000..3539dde
--- /dev/null
+++ b/java/3-5-Clipboard/ClipboardDemo.java
@@ -0,0 +1,161 @@
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.Toolkit;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.ClipboardOwner;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.IOException;
+
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+
+public class ClipboardDemo extends JPanel implements ClipboardOwner {
+
+    private JTextArea textArea;
+    
+    public ClipboardDemo() {
+        
+        this.setLayout(new FlowLayout());
+
+        // Create a text area for copy and paste tests
+        // Note that by default, text widgets will support keyboard shortcuts
+        // for copy/paste
+        textArea = new JTextArea();
+        textArea.setMinimumSize(new Dimension(300, 150));
+        textArea.setPreferredSize(textArea.getMinimumSize());
+        textArea.setLineWrap(true);
+        textArea.setWrapStyleWord(true);
+        this.add(textArea);
+
+        textArea.setText("Lorem ipsum dolor sit amet, semper dissentiet concludaturque an has, " +
+                         "case vivendo vix an. Probo tempor laoreet quo ad.");
+
+        // Create copy/cut/paste buttons to support manual copying and pasting
+        JButton copyButton = new JButton("Copy");
+        JButton cutButton = new JButton("Cut");
+        JButton pasteButton = new JButton("Paste");
+        this.add(copyButton);
+        this.add(cutButton);
+        this.add(pasteButton);
+
+        // Add action listeners to perform the clipboard operations
+        copyButton.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                doCopy();
+            }
+        });
+
+        cutButton.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                doCut();
+            }
+        });
+
+        pasteButton.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                doPaste();
+            }
+        });
+    }
+    
+    private void doCopy() {
+
+        System.out.println(String.format("COPY: `%s`", textArea.getSelectedText()));
+        
+        // Get the system clipboard
+        Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
+
+        // Create a transferable object encapsulating all the info for the copy
+        Transferable transferObject = new Transferable() {
+
+            private String text = textArea.getSelectedText();
+            
+            // Returns the copy data
+            public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException ,IOException {
+                System.out.println("  Transferable.getTransferData as " + flavor);
+                if (flavor.equals(DataFlavor.stringFlavor)) {
+                    return text;
+                }
+                throw new UnsupportedFlavorException(flavor);
+            }
+            
+            // Returns the set of data formats we can provide
+            public DataFlavor[] getTransferDataFlavors() {
+                System.out.println("  Transferable.getTransferDataFlavors");
+                return new DataFlavor[] { DataFlavor.stringFlavor };
+            }
+            
+            // Indicates whether we can provide data in the specified format
+            public boolean isDataFlavorSupported(DataFlavor flavor) {
+                System.out.println("  Transferable.isDataFlavorSupported: " + flavor);
+                return flavor.equals(DataFlavor.stringFlavor);
+            }
+        };
+        
+        // Now set the contents of the clipboard to our transferable object
+        // NOTE: The second argument "this" tells the system that this 
+        //       object would like to be the owner of the clipboard.
+        //       As such, this object must implement the ClipboardOwner interface
+        System.out.println("COPY: set system clipboard to Transferable");
+        cb.setContents(transferObject, this);
+    }
+
+    private void doCut() {
+
+        System.out.println("CUT");
+
+        // cut is just a copy that also removes data from document
+        doCopy();
+        textArea.replaceSelection("");
+    }
+    
+    private void doPaste() {
+
+        System.out.println("PASTE");
+        
+        // Grab system clipboard
+        Clipboard systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
+
+        System.out.println(String.format("PASTE: %d available flavours ... ",
+                systemClipboard.getAvailableDataFlavors().length));
+        for (DataFlavor f: systemClipboard.getAvailableDataFlavors()) {
+            System.out.println("  " + f.getHumanPresentableName() + "  " + f.toString());
+        }
+
+        // Check if we can get the data as a string
+        if (systemClipboard.isDataFlavorAvailable(DataFlavor.stringFlavor)) {
+            System.out.println("PASTE: DataFlavor.stringFlavor available");
+            try {
+                // Grab the data, set our text area to the data
+                String theText = (String)systemClipboard.getData(DataFlavor.stringFlavor);
+                textArea.replaceSelection(theText);
+                System.out.println("PASTE: '" + theText + "'");
+            } catch (UnsupportedFlavorException e) {
+                e.printStackTrace();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        } else {
+            System.out.println("PASTE: DataFlavor.stringFlavor NOT available");
+        }
+    }
+
+    // Implement the ClipboardOwner interface
+    public void lostOwnership(Clipboard clipboard, Transferable contents) {
+        System.out.println("ClipboardOwner: lost clipboard ownership");
+    }
+
+    public static void main(String[] args) {
+        JFrame f = new JFrame("Clipboard");
+        f.getContentPane().add(new ClipboardDemo());
+        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+        f.pack();
+        f.setVisible(true);
+    }
+}
diff --git a/java/3-5-Clipboard/DragAndDropDemo.java b/java/3-5-Clipboard/DragAndDropDemo.java
new file mode 100644
index 0000000..3e7521b
--- /dev/null
+++ b/java/3-5-Clipboard/DragAndDropDemo.java
@@ -0,0 +1,180 @@
+import java.awt.*;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.io.IOException;
+import java.io.File;
+
+import javax.swing.*;
+import javax.swing.event.MouseInputAdapter;
+import java.awt.event.MouseEvent;
+
+public class DragAndDropDemo extends JPanel {
+
+    private JLabel imageLabel;
+    private Image image;
+
+    public DragAndDropDemo() {
+
+        setLayout(new GridLayout());
+
+        // drag target
+        imageLabel = new JLabel("", SwingConstants.CENTER);
+        imageLabel.setBackground(Color.WHITE);
+        imageLabel.setOpaque(true);
+        add(imageLabel);
+
+        imageLabel.setTransferHandler(new ImageTransferHandler());
+
+        // create a drag gesture
+        DragGesture dg = new DragGesture();
+        imageLabel.addMouseListener(dg); // For mouseDragged
+        imageLabel.addMouseMotionListener(dg); // For mouseReleased
+    }
+
+    // create an image transfer handler
+    private class ImageTransferHandler extends TransferHandler {
+
+        protected Transferable createTransferable(JComponent c) {
+
+            System.out.println("Creating Transferable");
+
+
+            return new Transferable() {
+
+                public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
+                    if (flavor.equals(DataFlavor.imageFlavor)) {
+                        System.out.println("getTransferData: " + image);
+                        ImageIcon icon = (ImageIcon)imageLabel.getIcon();
+                        if(icon != null){                            
+                            return icon.getImage();
+                        }else{
+                            return null;
+                        }
+                    }
+                    throw new UnsupportedFlavorException(flavor);
+                }
+
+                public DataFlavor[] getTransferDataFlavors() {
+                    return new DataFlavor[] { DataFlavor.imageFlavor };
+                }
+
+                public boolean isDataFlavorSupported(DataFlavor flavor) {
+                    return flavor.equals(DataFlavor.imageFlavor);
+                }
+            };
+        }
+
+
+        public int getSourceActions(JComponent c) {
+            return TransferHandler.COPY;
+        }
+
+        public boolean importData(JComponent c, Transferable t) {
+            System.out.print("importData: ");
+            JLabel label = (JLabel)c;
+
+            imageLabel.setBackground(Color.WHITE);
+
+            if (t.isDataFlavorSupported(DataFlavor.imageFlavor)) {
+
+                System.out.println("imageFlavour");
+
+                try {
+                    // Get the data and set our label's image icon to the new image.
+                    // Save a copy of the image so we can support dragging it out
+                    image = (Image)t.getTransferData(DataFlavor.imageFlavor);
+
+                    label.setIcon(new ImageIcon(image));
+                } catch (UnsupportedFlavorException e) {
+                    e.printStackTrace();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+                return true;
+
+            } else if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
+                System.out.println("javaFileListFlavour");
+
+                try {
+                    // Get the data and set our label's image icon to the new image.
+                    java.util.List<File> files = (java.util.List<File>) t.getTransferData(DataFlavor.javaFileListFlavor);
+                    File f = files.get(0);
+
+                    System.out.println("filePath: " + f.getAbsolutePath());
+                    ImageIcon iIcon = new ImageIcon(f.getAbsolutePath());
+                    image = iIcon.getImage();
+                    imageLabel.setIcon(iIcon);
+                } catch (UnsupportedFlavorException e) {
+                    e.printStackTrace();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+                return true;
+            }
+
+            System.out.println("rejecting");
+            return false;
+        }
+
+        public boolean canImport(JComponent c, DataFlavor[] transferFlavors) {
+
+            for(int i = 0; i < transferFlavors.length; i++) {
+                DataFlavor df = transferFlavors[i];
+                if (df.equals(DataFlavor.imageFlavor) || 
+                    df.equals(DataFlavor.javaFileListFlavor)) {
+                    // feedback to show CAN drag into widget
+                    imageLabel.setBackground(Color.GREEN.brighter());
+                    return true;
+                }
+            }
+            // feedback to show CAN'T drag into widget
+            imageLabel.setBackground(Color.RED.brighter());
+            return false;
+        }
+
+        protected void exportDone(JComponent c, Transferable data, int action) {
+            imageLabel.setBackground(Color.WHITE);
+            System.out.println("exportDone");
+        }
+
+    }
+
+    // A simple recognizer for the drag gesture
+    // The mouseDragged method is called whenever the mouse button is down and
+    // the mouse is moving. We only want to initiate drag & drop, for each drag
+    // gesture. As such, we only take action the first time mouseDragged is called,
+    // resetting whenever the mouse button is released.
+    private class DragGesture extends MouseInputAdapter {
+
+        private boolean armed = true;
+
+        public void mouseDragged(MouseEvent e) {
+
+            // Enter the conditional only once, at the start of the drag
+            if (armed) {
+                System.out.println("Drag starting");
+
+                // Initiate drag and drop
+                JComponent c = (JComponent)e.getSource();
+                TransferHandler handler = c.getTransferHandler();
+                handler.exportAsDrag(c, e, TransferHandler.COPY);
+
+                armed = false;
+            }
+        }
+
+        public void mouseReleased(MouseEvent e) {
+            // Get ready for the next drag
+            armed = true;
+        }
+    }
+
+    public static void main(String[] args) {
+        JFrame f = new JFrame("DragAndDropDemo");
+        f.setSize(200, 200);
+        f.getContentPane().add(new DragAndDropDemo());
+        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+        f.setVisible(true);
+    }
+}
diff --git a/java/3-5-Clipboard/makefile b/java/3-5-Clipboard/makefile
new file mode 100644
index 0000000..ba8e39c
--- /dev/null
+++ b/java/3-5-Clipboard/makefile
@@ -0,0 +1,15 @@
+# super simple makefile
+# call it using 'make NAME=name_of_code_file_without_extension'
+# (assumes a .java extension)
+NAME = "ClipboardDemo"
+
+all:
+	@echo "Compiling..."
+	javac *.java
+
+run: all
+	@echo "Running..."
+	java $(NAME)
+
+clean:
+	rm -rf *.class
diff --git a/java/3-5-Clipboard/transferDemo/DragableImage.java b/java/3-5-Clipboard/transferDemo/DragableImage.java
new file mode 100644
index 0000000..485d8ff
--- /dev/null
+++ b/java/3-5-Clipboard/transferDemo/DragableImage.java
@@ -0,0 +1,157 @@
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+import javax.swing.event.MouseInputAdapter;
+
+/*
+ * A DragableImage displays an image and handles drag-and-drop data transfer.
+ */
+class DragableImage extends JComponent {
+
+	private Image image;
+
+	/* Create a image using either getImageFromFile or getEmptyImage */
+    private DragableImage(Image image) {
+        super();
+		this.image = image;
+		this.setFocusable(true);
+		
+		DragGesture dg = new DragGesture();
+		this.addMouseListener(dg);
+        this.addMouseMotionListener(dg);
+		this.addFocusListener(new HighlightWhenFocusedListener());
+    }
+    
+    /* Get an empty image (displays nothing) */
+    public static DragableImage getEmptyImage() {
+    	return new DragableImage(null);
+    }
+    
+    /* Get a image from an image file. */
+    public static DragableImage getImageFromFile(String path) {
+    	if (path == null) {
+    		return new DragableImage(null);
+    	}
+    	
+        java.net.URL imageURL = TransferDemo.class.getResource(path);
+
+        if (imageURL == null) {
+            System.err.println("Resource not found: " + path);
+            return new DragableImage(null);
+        } else {
+            return new DragableImage(new ImageIcon(imageURL, path).getImage());
+        }
+    }
+
+    public void setImage(Image image) {
+        this.image = image;
+        this.repaint();
+    }
+
+    public Image getImage() {
+        return this.image;
+    }
+    
+
+	protected void paintComponent(Graphics graphics) {
+		Graphics g = graphics.create();
+
+		// Draw in our entire space, even if isOpaque is false.
+		g.setColor(Color.WHITE);
+		g.fillRect(0, 0, image == null ? 125 : image.getWidth(this),
+				image == null ? 125 : image.getHeight(this));
+
+		if (image != null) {
+			// Draw image at its natural size of 125x125.
+			g.drawImage(image, 0, 0, this);
+		}
+
+		// Add a border, red if image currently has focus
+		if (this.isFocusOwner()) {
+			g.setColor(Color.RED);
+		} else {
+			g.setColor(Color.BLACK);
+		}
+		g.drawRect(0, 0, image == null ? 125 : image.getWidth(this),
+				image == null ? 125 : image.getHeight(this));
+		g.dispose();
+	}
+	
+	class HighlightWhenFocusedListener implements FocusListener {
+		public void focusGained(FocusEvent e) {
+			// Draw the component with a red border
+			// indicating that it has focus.
+			DragableImage.this.repaint();
+		}
+
+		public void focusLost(FocusEvent e) {
+			// Draw the component with a black border
+			// indicating that it doesn't have focus.
+			DragableImage.this.repaint();
+		}
+
+	}
+	
+	/*---------------------- Drag and Drop support ----------------------*/
+	
+	// MouseInputAdapter implements and provides default methods for 
+	// both MouseListener and MouseMotionListener interfaces.
+	class DragGesture extends MouseInputAdapter {
+	    private MouseEvent firstMouseEvent = null;
+
+	    public void mouseClicked(MouseEvent e) {
+			// Since the user clicked on us, let's get focus!
+			requestFocusInWindow();
+		}	
+		
+	    public void mousePressed(MouseEvent e) {
+
+	        // Don't bother to drag if there is no image.
+	        if (DragableImage.this.image == null) return;
+
+	        firstMouseEvent = e;
+
+	        // prevent any other listeners from acting on this event
+	        e.consume();
+	    }
+	    
+	    public void mouseReleased(MouseEvent e) {
+	        firstMouseEvent = null;
+	    }
+
+	    public void mouseDragged(MouseEvent e) {
+
+            // Don't bother to drag if the component displays no image.
+            if (DragableImage.this.image == null) return;
+
+            if (firstMouseEvent != null) {
+            	// prevent other listeners from acting on this event
+                e.consume();
+
+                int dx = Math.abs(e.getX() - firstMouseEvent.getX());
+                int dy = Math.abs(e.getY() - firstMouseEvent.getY());
+
+                // Arbitrarily define a 5-pixel shift as the
+                // official beginning of a drag.
+                if (dx > 5 || dy > 5) {
+                    // This is a drag, not a click.
+
+                    // If they are holding down the control key, COPY rather than MOVE
+                    int ctrlMask = InputEvent.CTRL_DOWN_MASK;
+                    int action = ((e.getModifiersEx() & ctrlMask) == ctrlMask) ?
+                          TransferHandler.COPY : TransferHandler.MOVE;
+
+                    // drag transfer setup
+                    JComponent c = (JComponent)e.getSource();
+                    TransferHandler handler = c.getTransferHandler();
+                    
+                    // Tell the transfer handler to initiate the drag.
+                    handler.exportAsDrag(c, firstMouseEvent, action);
+
+                    firstMouseEvent = null;
+                }
+            }
+        }	
+	}
+
+}
diff --git a/java/3-5-Clipboard/transferDemo/ImageGridPanel.java b/java/3-5-Clipboard/transferDemo/ImageGridPanel.java
new file mode 100644
index 0000000..b391829
--- /dev/null
+++ b/java/3-5-Clipboard/transferDemo/ImageGridPanel.java
@@ -0,0 +1,243 @@
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.GridLayout;
+import java.awt.Image;
+import java.awt.Toolkit;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.ClipboardOwner;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.KeyEvent;
+import java.io.IOException;
+
+import javax.swing.BorderFactory;
+import javax.swing.JButton;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.JPanel;
+import javax.swing.KeyStroke;
+
+public class ImageGridPanel extends JPanel implements ClipboardOwner {
+
+	// Show up to 12 images
+	private DragableImage[] pics = new DragableImage[12];
+
+	// Data to load images into some of the 12 images.
+	private String[] picNames =
+			new String[] { "angry", "happy", "worried",  "laughing" };
+
+	// currently selected image index (-1 if none selected)
+	private int selectedPic = -1;
+	
+	// Buttons to make Cut/Copy/Paste visible
+	private JButton cutButton = new JButton("Cut");
+	private JButton copyButton = new JButton("Copy");
+	private JButton pasteButton = new JButton("Paste");
+
+	public ImageGridPanel() {
+		super(new BorderLayout());
+		this.layoutComponent();
+		this.registerControllers();
+	}
+	
+	private void layoutComponent() {
+
+		JPanel images = new JPanel(new GridLayout(3, 4));
+
+		for (int i = 0; i < this.pics.length; i++) {
+			if (i < this.picNames.length) {
+				this.pics[i] = DragableImage.getImageFromFile("images/"
+						+ picNames[i] + ".jpg");
+			} else {
+				this.pics[i] = DragableImage.getEmptyImage();
+			}
+			images.add(this.pics[i]);
+		}
+		this.add(images, BorderLayout.CENTER);
+
+		this.setPreferredSize(new Dimension(630, 520));
+		this.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
+
+		// out cut/copy/paste buttons into bottom panel
+		JPanel buttons = new JPanel(new FlowLayout(FlowLayout.LEFT));
+
+		buttons.add(cutButton);
+		buttons.add(copyButton);
+		buttons.add(pasteButton);
+
+		this.add(buttons, BorderLayout.NORTH);
+		
+	}
+	
+	private void registerControllers() {
+		// The transfer handler handles the drag-drop and cut-paste
+		// infrastructure
+		ImageTransferHandler picHandler = new ImageTransferHandler();
+		// This maintains the index of the currently selected image
+		// (this.selectedPic)
+		FocusListener fl = new PicFocusListener();
+		
+		for (int i = 0; i < this.pics.length; i++) {
+			this.pics[i].setTransferHandler(picHandler);
+			this.pics[i].addFocusListener(fl);
+		}
+		
+		cutButton.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent e) {
+				doCut();
+			}
+		});
+		
+		copyButton.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent e) {
+				doCopy();
+			}
+		});
+		
+		pasteButton.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent e) {
+				doPaste();
+			}
+		});
+
+	}
+	
+	// Called when this component no longer owns the clipboard
+	public void lostOwnership(Clipboard clipboard, Transferable contents) {
+		System.out.println("Lost clipboard ownership for " + selectedPic);
+	}
+	
+
+	/*
+	 * Copy the currently selected image.
+	 */
+	private void doCopy() {
+
+		// Get the system clipboard
+		Clipboard systemClipboard = Toolkit.getDefaultToolkit()
+				.getSystemClipboard();
+
+		// Create a transferable object encapsulating all the info for the copy
+		Transferable transferObject = new ImageTransferable(pics[selectedPic]);
+
+		// Now set the contents of the clipboard to our transferable object
+		systemClipboard.setContents(transferObject, this);
+		
+	}
+
+	private void doCut() {
+		this.doCopy(); // most of a cut is the same as a copy
+		this.pics[selectedPic].setImage(null);
+	}
+
+	private void doPaste() {
+
+		// Grab system clipboard
+		Clipboard systemClipboard = Toolkit.getDefaultToolkit()
+				.getSystemClipboard();
+
+		// For our own edification, print out the data formats available on the
+		// clipboard
+		for (DataFlavor flavor : systemClipboard.getAvailableDataFlavors()) {
+			System.out.println("Flavor: " + flavor);
+		}
+
+		// Check if we can get the data as an image
+		if (systemClipboard.isDataFlavorAvailable(DataFlavor.imageFlavor)) {
+			try {
+				// Grab the data, set the selected image to the provided image
+				Image img = (Image) systemClipboard
+						.getData(DataFlavor.imageFlavor);
+				assert img != null;
+				this.pics[selectedPic].setImage(img);
+			} catch (UnsupportedFlavorException e) {
+				e.printStackTrace();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+	/*
+	 * A listener to help us keep track of which image has been selected.
+	 */
+	class PicFocusListener implements FocusListener {
+		public void focusGained(FocusEvent e) {
+			Component c = e.getComponent();
+			for (int i = 0; i < pics.length; i++) {
+				if (pics[i] == c) {
+					selectedPic = i;
+					return;
+				}
+			}
+			assert false;
+		}
+
+		public void focusLost(FocusEvent e) {
+		}
+	}
+
+
+	/*
+	 * Create a set of cut/copy/paste menus. They call doCopyOrCut and doPaste.
+	 */
+	public JMenuBar createMenuBar() {
+		JMenuBar menubar = new JMenuBar();
+
+		JMenu file = new JMenu("File");
+
+		JMenuItem quit = new JMenuItem("Quit");
+		quit.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent e) {
+				System.exit(0);
+			}
+		});
+		quit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,
+				ActionEvent.META_MASK));
+		file.add(quit);
+
+		JMenu edit = new JMenu("Edit");
+		JMenuItem cut = new JMenuItem("Cut");
+		cut.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent e) {
+				doCut();
+			}
+		});
+		cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,
+				ActionEvent.META_MASK));
+
+		JMenuItem copy = new JMenuItem("Copy");
+		copy.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent e) {
+				doCopy();
+			}
+		});
+		copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,
+				ActionEvent.META_MASK));
+
+		JMenuItem paste = new JMenuItem("Paste");
+		paste.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent e) {
+				doPaste();
+			}
+		});
+		paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,
+				ActionEvent.META_MASK));
+
+		edit.add(cut);
+		edit.add(copy);
+		edit.add(paste);
+
+		menubar.add(file);
+		menubar.add(edit);
+		return menubar;
+	}
+}
diff --git a/java/3-5-Clipboard/transferDemo/ImageTransferHandler.java b/java/3-5-Clipboard/transferDemo/ImageTransferHandler.java
new file mode 100644
index 0000000..fe31ebd
--- /dev/null
+++ b/java/3-5-Clipboard/transferDemo/ImageTransferHandler.java
@@ -0,0 +1,87 @@
+import java.io.*;
+import java.awt.*;
+import java.awt.datatransfer.*;
+import javax.swing.*;
+import java.util.List;
+
+class ImageTransferHandler extends TransferHandler {
+
+    DragableImage sourceImage;
+    boolean shouldRemove;
+
+    /* 
+     * Can we import one of the flavors provided? 
+     */
+    public boolean canImport(JComponent c, DataFlavor[] flavors) {
+        for (int i = 0; i < flavors.length; i++) {
+            if (flavors[i].equals(DataFlavor.imageFlavor) ||
+                    flavors[i].equals(DataFlavor.javaFileListFlavor)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /* 
+     * Import the data from the transferable to the component.
+     */
+    public boolean importData(JComponent c, Transferable t) {
+        Image image;
+        if (canImport(c, t.getTransferDataFlavors())) {
+            DragableImage dragableImage = (DragableImage)c;
+            //Don't drop on myself.
+            if (sourceImage == dragableImage) {
+                shouldRemove = false;
+                return true;
+            }
+            
+            try {
+            	if (t.isDataFlavorSupported(DataFlavor.imageFlavor)) {
+            		image = (Image)t.getTransferData(DataFlavor.imageFlavor);
+            	} else if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
+                	List<File> files = (List<File>) t.getTransferData(DataFlavor.javaFileListFlavor);
+                    File f = files.get(0);
+                	ImageIcon iIcon = new ImageIcon(f.getAbsolutePath());
+                    image = iIcon.getImage();
+            	} else {
+            		image = null;	// assure compiler everything was initialized
+            		assert false;
+            	}
+                //Set the component to the new image.
+                dragableImage.setImage(image);
+                return true;
+            } catch (UnsupportedFlavorException ufe) {
+                System.out.println("importData: unsupported data flavor");
+            } catch (IOException ioe) {
+                System.out.println("importData: I/O exception");
+            }
+        }
+        return false;
+    }
+
+    /* 
+     * What kinds of drag actions can we support?
+     */
+    public int getSourceActions(JComponent c) {
+        return COPY_OR_MOVE;
+    }
+
+    /*
+     * Create a transferable to drag somewhere else.
+     */
+    protected Transferable createTransferable(JComponent c) {
+        sourceImage = (DragableImage)c;
+        shouldRemove = true;
+        return new ImageTransferable(sourceImage);
+    }
+
+    /*
+     * Finish the export.
+     */
+    protected void exportDone(JComponent c, Transferable data, int action) {
+        if (shouldRemove && (action == MOVE)) {
+            sourceImage.setImage(null);
+        }
+        sourceImage = null;
+    }
+}
diff --git a/java/3-5-Clipboard/transferDemo/ImageTransferable.java b/java/3-5-Clipboard/transferDemo/ImageTransferable.java
new file mode 100644
index 0000000..93db694
--- /dev/null
+++ b/java/3-5-Clipboard/transferDemo/ImageTransferable.java
@@ -0,0 +1,33 @@
+import java.awt.Image;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+
+/*
+ * Transfer an image from one source to another.
+ */
+public class ImageTransferable implements Transferable {
+
+    private Image image;
+
+    ImageTransferable(DragableImage pic) {
+        image = pic.getImage();
+    }
+
+    public Object getTransferData(DataFlavor flavor)
+        throws UnsupportedFlavorException {
+        if (!isDataFlavorSupported(flavor)) {
+            throw new UnsupportedFlavorException(flavor);
+        } 
+        return image;
+    }
+
+    public DataFlavor[] getTransferDataFlavors() {
+        return new DataFlavor[] { DataFlavor.imageFlavor };
+    }
+
+    public boolean isDataFlavorSupported(DataFlavor flavor) {
+        return flavor.equals(DataFlavor.imageFlavor);
+    }
+}
+
diff --git a/java/3-5-Clipboard/transferDemo/TransferDemo.java b/java/3-5-Clipboard/transferDemo/TransferDemo.java
new file mode 100644
index 0000000..9fe21f1
--- /dev/null
+++ b/java/3-5-Clipboard/transferDemo/TransferDemo.java
@@ -0,0 +1,59 @@
+/*
+ * This demo started life as part of Sun's Java Tutorial for Drag and Drop/Cut and Paste.
+ * The tutorial had already been updated to Java 6 (which includes changes to
+ * TransferHandler that I didn't want to use yet), so a cached version was found
+ * at http://mockus.us/optimum/JavaTutorial/mustang/uiswing/dnd/examples/index.html#DragPictureDemo
+ * (retrieved June 17, 2009).
+ * 
+ * It was modified by Byron Weber Becker as follows:
+ * -- code to initialize the pictures was simplified with an array and loop
+ * -- removed unused imports 
+ * -- used inner classes for listeners rather than exposing the
+ *    methods in a class's public interface
+ * -- there were funny inheritance interactions between DragablePicture and Picture
+ *    in the mouse and mousemotion listeners, so combined the two classes
+ * -- added support for the javaFileList data flavor, enabling drag 'n drop
+ *    from the desktop and to other applications such as image editors
+ * -- removed the copy/cut/paste magic using action maps and the automatic 
+ *    stuff in TransferHandler and replaced it with direct and easier to
+ *    understand implementations.
+ */
+
+import javax.swing.*;
+
+public class TransferDemo  {
+
+    /**
+     * Create the GUI and show it.  For thread safety,
+     * this method should be invoked from the
+     * event-dispatching thread.
+     */
+    private static void createAndShowGUI() {
+
+        //Create and set up the window.
+        JFrame frame = new JFrame("TransferDemo");
+        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+        //Create and set up the menu bar and content pane.
+        ImageGridPanel demo = new ImageGridPanel();
+        frame.setContentPane(demo);
+        frame.setJMenuBar(demo.createMenuBar());
+        
+        //Display the window.
+        frame.pack();
+        frame.setVisible(true);
+    }
+
+    public static void main(String[] args) {
+    	System.out.println("You may need to copy the images directory from the");
+    	System.out.println("source code directory to the same directory as TransferDemo.class.");
+
+        //Schedule a job for the event-dispatching thread:
+        //creating and showing this application's GUI.
+        javax.swing.SwingUtilities.invokeLater(new Runnable() {
+            public void run() {
+                createAndShowGUI();
+            }
+        });
+    }
+}
diff --git a/java/3-5-Clipboard/transferDemo/images/angry.jpg b/java/3-5-Clipboard/transferDemo/images/angry.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..8286039b09faa546c59143feb6ffcfe59f04e9da
GIT binary patch
literal 19465
zcmeIacUV(P_b9wmNa$UPAcQ7ZD4~Nuq(~8w4t5Mls38eSs0vt75kUa~1wp{x6;xDE
z0TC2L5y65YT|q>Opw!&iq3Aj9`MuwHp8MVV&vo<cnKf(HtXZ?B?3tA{aNcm*1n;hj
z4D^E_Cnsnr1VOwI79kFy0E7U45Mm+3!-XNp7a=zf2O%_OX^?;h4}lO;1uqk!%Y`KY
zoW3s*LeG}H1mZUk|Ktt`QWu?zEy;9W3eF{f&Ze^h=nR~-HBMItZ-mouB9a1WFmee5
zBTVslQyoJb2=z@&bqxV42z3%MQ$L3TK_`*(^~9V+{eoda@L&+ASy?f^w+FHKS9=gz
zzqbd8nB##kM9%XT*gnG!vIjBH%uLLA!}$sca$DkK?F1n>{g5y>1(A2abev{r4<yLT
z%ge_r$j2urCcrNswm?KsP-KCOgv0^~2^ld#?lT+BB>o;EgaibHgoQ+fg+(QWg@q;I
zKv;67h}gejz<CIX@j@|B3<{wPA;l0VF$CuWXe2M^5rP1u<Uw#BATa!(AOsT4gTeCh
z@e6=K@YhTPghb6{ib4o90)<2)d9WB>9+aRS$P`1NmBjHpmaaqz<<OnF7|A1f*R51k
z7r2%A>gh9g)mvlLQrrjH21zUfsr(ze7u%$IkXMx#unnbOdbU%B3inhrgmnzts;8aW
zTXgi%tIqGIZ&o&Tjd=Nm$ETmU^|+~f)X2`;KVo0T+1pjGKm8DckVqgcnky3)!(+e|
zK?yI81`>oSOYrFKJR%88Q07)Ypr`8F#@v-+?Y@A-(jQdAzye?w8<f8ULKH}oS9uz;
zDedzj{Ld1o{}O@o4iZFh>lA|s(1=HhgW3|+6o=IgtG-b}w6B*PqMfeO!PZ_9<Um(8
zTkKmnxR9AcFuAKY$${!zJ8P0<?o`{2h5J?1_|*nW3QoL!N+?y&b6~9Z*?9L^XF_&u
zcusAA`sAm659*giTRxsW7Wh+!1D*Gz3@*3sN<7Vh3|{Oj(>ub-R%+`#5~Hcs9X7J%
zqR)$(qU~!qP~)=9j~niOK+|sCE@CbZ;6NArUa1T&x9d*a_g2lhHL9v6MSNgn)pvA;
z-tLj+1)X}P1(t+1xqkYz1KWe_n!4`RLAelG+cR8p*~ZFT1?QBNKVvg~UKX6ZvK>2e
z4gXcMJ+9n7#bJqzWQv38S<Z`@*87jpZti<|{$tb!(u1ti4;(6;FOIA>^%5BBZ_>Yf
z;(f>Wb<)|Ll+I6Nf}UpcmBO8GFHbh%J-f%Q`WY<p3!lDvuwdZZzNz+2tn2aWUrb{A
zHpaML`V{8KSK7QJmm*|QKSlq@EEsT5JG5lA%~PA|oYOr@yrlhmlvTuvtbiQST=jeD
zm?rtJz1{feTH*RIf3Fqe&pcn+>f&*`ZKzgiGEW!lB3)NJ-mvdQw7SpZ-kV>igVlC_
zPfO)M4!I?j7fNnqUCHnEu|BAIsYYJ<BwL}-$Mew$PIr9jws&h>)PrhfQ|H)&h<d^&
zEa=85zE81g1K&s^#Wx?VEtst5Kqc&#4r*aFah!Ufk@a!wO?UQ8DNG#qeQnfmas2sc
z|MXMpDHREoqE%O`5<9bri@I&>8apfsN4&!<F05-9zqQ2R)e7mjJ=a}Up0eJTthQ)t
z_p$8Sq)*=0DiVyZSINh&OA?#(NI5<F!#k~)DR(_Lvx^~WbI7taFI94IU{FXEoo{>H
zsQtDGKG{fg=WF>yb%~yAiem4T6o<unGlNsjQRSS}yLX`vuXk3INDTVsxVuPiNFB#3
zHl+&3k`#Cc$p-%MxahMc3P+NAj6Ca(yt>qLY^1YjI`Kq?QRO}kr1br${`>udPKk+R
zH3{3r6{>Brk6jKIS2L<3r5o3cmLA%+=H^4u?FlL6<9XT4yDsOusg)6D;x2yAyzMnm
zE3C+l?Ku&}j#|QeZ1(!YlY)N1h^ZbAG6&+k9PzB?K#2m$rw=5*{l=>PcCtRKCVqU}
z`K!F^8xQC9i^K8P93Ss%Z~5s#&)PR)15bfZOUDDM4P>HqD|5cNF3P@tHZmq>Kk9AG
zz300wd;VxVP1jVA-|K&_eVwL}4lVe88j~Mmq4|1UebLQSt<a4!!eTXc>jrq=7vCI-
zO;5%@t2%Dh_jwID?V{}7s*$+73XSPxf#At2gW{0+cdzTqs;?B6PJGZcJMwTR>W18q
z#-)lD#Lr7ly3<|D<Qd66jTNu@JG%0AZRs2CJaS<w+}ZX)<Cy2R<uO_zYu^l49L2R<
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

literal 0
HcmV?d00001

diff --git a/java/3-5-Clipboard/transferDemo/images/happy.jpg b/java/3-5-Clipboard/transferDemo/images/happy.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..b090961235515ac0abf7531a1b66c6dc83b198b5
GIT binary patch
literal 10880
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
A4gdfE

literal 0
HcmV?d00001

diff --git a/java/3-5-Clipboard/transferDemo/images/laughing.jpg b/java/3-5-Clipboard/transferDemo/images/laughing.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..f61710e418ed865e9b205f28cbb0c34b15f7697b
GIT binary patch
literal 19824
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
Oiz~qoWal=vFa8&o$FyMp

literal 0
HcmV?d00001

diff --git a/java/3-5-Clipboard/transferDemo/images/worried.jpg b/java/3-5-Clipboard/transferDemo/images/worried.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..4e71289d3de7fe3691244ddddb4caa17edd77747
GIT binary patch
literal 19492
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
J^P9`A{{x{kx%mJ9

literal 0
HcmV?d00001

diff --git a/java/3-5-Clipboard/transferDemo/makefile b/java/3-5-Clipboard/transferDemo/makefile
new file mode 100644
index 0000000..5c951d0
--- /dev/null
+++ b/java/3-5-Clipboard/transferDemo/makefile
@@ -0,0 +1,15 @@
+# super simple makefile
+# call it using 'make NAME=name_of_code_file_without_extension'
+# (assumes a .java extension)
+NAME = "TransferDemo"
+
+all:
+	@echo "Compiling..."
+	javac $(NAME).java
+
+run: all
+	@echo "Running..."
+	java $(NAME)
+
+clean:
+	rm -rf *.class
-- 
GitLab