001/*
002 * Copyright (c) 2010 The Regents of the University of California.
003 * All rights reserved.
004 *
005 * '$Author: barseghian $'
006 * '$Date: 2011-02-10 20:02:55 +0000 (Thu, 10 Feb 2011) $' 
007 * '$Revision: 27080 $'
008 * 
009 * Permission is hereby granted, without written agreement and without
010 * license or royalty fees, to use, copy, modify, and distribute this
011 * software and its documentation for any purpose, provided that the above
012 * copyright notice and the following two paragraphs appear in all copies
013 * of this software.
014 *
015 * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
016 * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
017 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
018 * THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF
019 * SUCH DAMAGE.
020 *
021 * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
022 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
023 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
024 * PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
025 * CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
026 * ENHANCEMENTS, OR MODIFICATIONS.
027 *
028 */
029
030package org.kepler.reporting.gui;
031
032import java.awt.datatransfer.DataFlavor;
033import java.awt.datatransfer.Transferable;
034import java.io.ByteArrayInputStream;
035import java.io.IOException;
036import java.io.OutputStreamWriter;
037
038import javax.swing.JLabel;
039
040import org.apache.commons.io.output.ByteArrayOutputStream;
041
042public class JLabelTransferable implements Transferable {
043        private JLabel staticitemlabel;
044
045        // A flavor that transfers a copy of the JLabel
046
047        private static final DataFlavor jlabelFlavor = new DataFlavor(JLabel.class,
048                        "Swing JLabel");
049
050        private static final DataFlavor[] flavors = new DataFlavor[] {
051                        DataFlavor.stringFlavor,
052                        new DataFlavor("text/plain; charset=ascii", "ASCII text"),
053                        jlabelFlavor };
054
055        // Create the transferable label
056
057        public JLabelTransferable(JLabel label) {
058                this.staticitemlabel = label;
059        }
060
061        public Object getTransferData(DataFlavor fl) {
062                if (!isDataFlavorSupported(fl)) {
063                        return null;
064                }
065
066                if (fl.equals(DataFlavor.stringFlavor)) {
067                        // return the value of the text as a String
068                        return staticitemlabel.getText();
069                } else if (fl.equals(jlabelFlavor)) {
070                        return staticitemlabel;
071                } else {
072                        // Plain test = return an InputStream
073                        try {
074                                String targetText = staticitemlabel.getText();
075                                int length = targetText.length();
076                                ByteArrayOutputStream os = new ByteArrayOutputStream();
077                                OutputStreamWriter w = new OutputStreamWriter(os);
078                                w.write(targetText, 0, length);
079                                w.flush();
080                                byte[] bytes = os.toByteArray();
081                                w.close();
082                                return new ByteArrayInputStream(bytes);
083                        } catch (IOException e) {
084                                return null;
085                        }
086                }
087        }
088
089        public synchronized DataFlavor[] getTransferDataFlavors() {
090                return flavors;
091        }
092
093        public boolean isDataFlavorSupported(DataFlavor flavor) {
094                int i;
095
096                for (i = 0; i < flavors.length; i++) {
097                        if (flavors[i].equals(flavor)) {
098                                return true;
099                        }
100                }
101
102                return false;
103        }
104}