001/* ===========================================================
002 * JFreeChart : a free chart library for the Java(tm) platform
003 * ===========================================================
004 *
005 * (C) Copyright 2000-2009, by Object Refinery Limited and Contributors.
006 *
007 * Project Info:  http://www.jfree.org/jfreechart/index.html
008 *
009 * This library is free software; you can redistribute it and/or modify it
010 * under the terms of the GNU Lesser General Public License as published by
011 * the Free Software Foundation; either version 2.1 of the License, or
012 * (at your option) any later version.
013 *
014 * This library is distributed in the hope that it will be useful, but
015 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
016 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
017 * License for more details.
018 *
019 * You should have received a copy of the GNU Lesser General Public
020 * License along with this library; if not, write to the Free Software
021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
022 * USA.
023 *
024 * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
025 * in the United States and other countries.]
026 *
027 * -------------------
028 * ChartSelection.java
029 * -------------------
030 * (C) Copyright 2009, by Object Refinery Limited.
031 *
032 * Original Author:  David Gilbert (for Object Refinery Limited);
033 * Contributor(s):   -;
034 *
035 * Changes
036 * -------
037 * 08-Apr-2009 : Version 1, with inspiration from patch 1460845 (DG);
038 *
039 */
040
041package org.jfree.chart;
042
043import java.awt.datatransfer.DataFlavor;
044import java.awt.datatransfer.Transferable;
045import java.awt.datatransfer.UnsupportedFlavorException;
046import java.io.IOException;
047
048/**
049 * A class used to represent a chart on the clipboard.
050 *
051 * @since 1.0.13
052 */
053public class ChartTransferable implements Transferable {
054
055    /** The data flavor. */
056    final DataFlavor imageFlavor = new DataFlavor(
057            "image/x-java-image; class=java.awt.Image", "Image");    
058    
059    /** The chart. */
060    private JFreeChart chart;
061
062    /** The width of the chart on the clipboard. */
063    private int width;
064
065    /** The height of the chart on the clipboard. */
066    private int height;
067
068    /**
069     * Creates a new chart selection.
070     *
071     * @param chart  the chart.
072     * @param width  the chart width.
073     * @param height  the chart height.
074     */
075    public ChartTransferable(JFreeChart chart, int width, int height) {
076        this(chart, width, height, true);
077    }
078
079    /**
080     * Creates a new chart selection.
081     *
082     * @param chart  the chart.
083     * @param width  the chart width.
084     * @param height  the chart height.
085     * @param cloneData  clone the dataset(s)?
086     */
087    public ChartTransferable(JFreeChart chart, int width, int height,
088            boolean cloneData) {
089
090        // we clone the chart because presumably there can be some delay
091        // between putting this instance on the system clipboard and
092        // actually having the getTransferData() method called...
093        try {
094            this.chart = (JFreeChart) chart.clone();
095        }
096        catch (CloneNotSupportedException e) {
097            this.chart = chart;
098        }
099        this.width = width;
100        this.height = height;
101        // FIXME: we've cloned the chart, but the dataset(s) aren't cloned
102        // and we should do that
103    }
104
105    /**
106     * Returns the data flavors supported.
107     * 
108     * @return The data flavors supported.
109     */
110    public DataFlavor[] getTransferDataFlavors() {
111        return new DataFlavor[] {this.imageFlavor};
112    }
113
114    /**
115     * Returns <code>true</code> if the specified flavor is supported.
116     *
117     * @param flavor  the flavor.
118     *
119     * @return A boolean.
120     */
121    public boolean isDataFlavorSupported(DataFlavor flavor) {
122        return this.imageFlavor.equals(flavor);
123    }
124
125    /**
126     * Returns the content for the requested flavor, if it is supported.
127     *
128     * @param flavor  the requested flavor.
129     *
130     * @return The content.
131     *
132     * @throws java.awt.datatransfer.UnsupportedFlavorException
133     * @throws java.io.IOException
134     */
135    public Object getTransferData(DataFlavor flavor)
136            throws UnsupportedFlavorException, IOException {
137        
138        if (this.imageFlavor.equals(flavor)) {
139            return this.chart.createBufferedImage(width, height);
140        }
141        else {
142            throw new UnsupportedFlavorException(flavor);
143        }
144    }
145
146}