1 /*
   2  * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package java.awt.datatransfer;
  27 
  28 import java.io.*;
  29 
  30 
  31 /**
  32  * A <code>Transferable</code> which implements the capability required
  33  * to transfer a <code>String</code>.
  34  *
  35  * This <code>Transferable</code> properly supports
  36  * <code>DataFlavor.stringFlavor</code>
  37  * and all equivalent flavors. Support for
  38  * <code>DataFlavor.plainTextFlavor</code>
  39  * and all equivalent flavors is <b>deprecated</b>. No other
  40  * <code>DataFlavor</code>s are supported.
  41  *
  42  * @see java.awt.datatransfer.DataFlavor#stringFlavor
  43  * @see java.awt.datatransfer.DataFlavor#plainTextFlavor
  44  */
  45 public class StringSelection implements Transferable, ClipboardOwner {
  46 
  47     private static final int STRING = 0;
  48     private static final int PLAIN_TEXT = 1;
  49 
  50     @SuppressWarnings("deprecation")
  51     private static final DataFlavor[] flavors = {
  52         DataFlavor.stringFlavor,
  53         DataFlavor.plainTextFlavor // deprecated
  54     };
  55 
  56     private String data;
  57 
  58     /**
  59      * Creates a <code>Transferable</code> capable of transferring
  60      * the specified <code>String</code>.
  61      * @param data the string to be transferred
  62      */
  63     public StringSelection(String data) {
  64         this.data = data;
  65     }
  66 
  67     /**
  68      * Returns an array of flavors in which this <code>Transferable</code>
  69      * can provide the data. <code>DataFlavor.stringFlavor</code>
  70      * is properly supported.
  71      * Support for <code>DataFlavor.plainTextFlavor</code> is
  72      * <b>deprecated</b>.
  73      *
  74      * @return an array of length two, whose elements are <code>DataFlavor.
  75      *         stringFlavor</code> and <code>DataFlavor.plainTextFlavor</code>
  76      */
  77     public DataFlavor[] getTransferDataFlavors() {
  78         // returning flavors itself would allow client code to modify
  79         // our internal behavior
  80         return flavors.clone();
  81     }
  82 
  83     /**
  84      * Returns whether the requested flavor is supported by this
  85      * <code>Transferable</code>.
  86      *
  87      * @param flavor the requested flavor for the data
  88      * @return true if <code>flavor</code> is equal to
  89      *   <code>DataFlavor.stringFlavor</code> or
  90      *   <code>DataFlavor.plainTextFlavor</code>; false if <code>flavor</code>
  91      *   is not one of the above flavors
  92      * @throws NullPointerException if flavor is <code>null</code>
  93      */
  94     public boolean isDataFlavorSupported(DataFlavor flavor) {
  95         // JCK Test StringSelection0003: if 'flavor' is null, throw NPE
  96         for (int i = 0; i < flavors.length; i++) {
  97             if (flavor.equals(flavors[i])) {
  98                 return true;
  99             }
 100         }
 101         return false;
 102     }
 103 
 104     /**
 105      * Returns the <code>Transferable</code>'s data in the requested
 106      * <code>DataFlavor</code> if possible. If the desired flavor is
 107      * <code>DataFlavor.stringFlavor</code>, or an equivalent flavor,
 108      * the <code>String</code> representing the selection is
 109      * returned. If the desired flavor is
 110      * <code>DataFlavor.plainTextFlavor</code>,
 111      * or an equivalent flavor, a <code>Reader</code> is returned.
 112      * <b>Note:</b> The behavior of this method for
 113      * <code>DataFlavor.plainTextFlavor</code>
 114      * and equivalent <code>DataFlavor</code>s is inconsistent with the
 115      * definition of <code>DataFlavor.plainTextFlavor</code>.
 116      *
 117      * @param flavor the requested flavor for the data
 118      * @return the data in the requested flavor, as outlined above
 119      * @throws UnsupportedFlavorException if the requested data flavor is
 120      *         not equivalent to either <code>DataFlavor.stringFlavor</code>
 121      *         or <code>DataFlavor.plainTextFlavor</code>
 122      * @throws IOException if an IOException occurs while retrieving the data.
 123      *         By default, StringSelection never throws this exception, but a
 124      *         subclass may.
 125      * @throws NullPointerException if flavor is <code>null</code>
 126      * @see java.io.Reader
 127      */
 128     public Object getTransferData(DataFlavor flavor)
 129         throws UnsupportedFlavorException, IOException
 130     {
 131         // JCK Test StringSelection0007: if 'flavor' is null, throw NPE
 132         if (flavor.equals(flavors[STRING])) {
 133             return (Object)data;
 134         } else if (flavor.equals(flavors[PLAIN_TEXT])) {
 135             return new StringReader(data == null ? "" : data);
 136         } else {
 137             throw new UnsupportedFlavorException(flavor);
 138         }
 139     }
 140 
 141     public void lostOwnership(Clipboard clipboard, Transferable contents) {
 142     }
 143 }