View Javadoc
1   /*
2    * Copyright (c) 1996, 2013, 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      private static final DataFlavor[] flavors = {
51          DataFlavor.stringFlavor,
52          DataFlavor.plainTextFlavor // deprecated
53      };
54  
55      private String data;
56  
57      /**
58       * Creates a <code>Transferable</code> capable of transferring
59       * the specified <code>String</code>.
60       */
61      public StringSelection(String data) {
62          this.data = data;
63      }
64  
65      /**
66       * Returns an array of flavors in which this <code>Transferable</code>
67       * can provide the data. <code>DataFlavor.stringFlavor</code>
68       * is properly supported.
69       * Support for <code>DataFlavor.plainTextFlavor</code> is
70       * <b>deprecated</b>.
71       *
72       * @return an array of length two, whose elements are <code>DataFlavor.
73       *         stringFlavor</code> and <code>DataFlavor.plainTextFlavor</code>
74       */
75      public DataFlavor[] getTransferDataFlavors() {
76          // returning flavors itself would allow client code to modify
77          // our internal behavior
78          return (DataFlavor[])flavors.clone();
79      }
80  
81      /**
82       * Returns whether the requested flavor is supported by this
83       * <code>Transferable</code>.
84       *
85       * @param flavor the requested flavor for the data
86       * @return true if <code>flavor</code> is equal to
87       *   <code>DataFlavor.stringFlavor</code> or
88       *   <code>DataFlavor.plainTextFlavor</code>; false if <code>flavor</code>
89       *   is not one of the above flavors
90       * @throws NullPointerException if flavor is <code>null</code>
91       */
92      public boolean isDataFlavorSupported(DataFlavor flavor) {
93          // JCK Test StringSelection0003: if 'flavor' is null, throw NPE
94          for (int i = 0; i < flavors.length; i++) {
95              if (flavor.equals(flavors[i])) {
96                  return true;
97              }
98          }
99          return false;
100     }
101 
102     /**
103      * Returns the <code>Transferable</code>'s data in the requested
104      * <code>DataFlavor</code> if possible. If the desired flavor is
105      * <code>DataFlavor.stringFlavor</code>, or an equivalent flavor,
106      * the <code>String</code> representing the selection is
107      * returned. If the desired flavor is
108      * <code>DataFlavor.plainTextFlavor</code>,
109      * or an equivalent flavor, a <code>Reader</code> is returned.
110      * <b>Note:</b> The behavior of this method for
111      * <code>DataFlavor.plainTextFlavor</code>
112      * and equivalent <code>DataFlavor</code>s is inconsistent with the
113      * definition of <code>DataFlavor.plainTextFlavor</code>.
114      *
115      * @param flavor the requested flavor for the data
116      * @return the data in the requested flavor, as outlined above
117      * @throws UnsupportedFlavorException if the requested data flavor is
118      *         not equivalent to either <code>DataFlavor.stringFlavor</code>
119      *         or <code>DataFlavor.plainTextFlavor</code>
120      * @throws IOException if an IOException occurs while retrieving the data.
121      *         By default, StringSelection never throws this exception, but a
122      *         subclass may.
123      * @throws NullPointerException if flavor is <code>null</code>
124      * @see java.io.Reader
125      */
126     public Object getTransferData(DataFlavor flavor)
127         throws UnsupportedFlavorException, IOException
128     {
129         // JCK Test StringSelection0007: if 'flavor' is null, throw NPE
130         if (flavor.equals(flavors[STRING])) {
131             return (Object)data;
132         } else if (flavor.equals(flavors[PLAIN_TEXT])) {
133             return new StringReader(data == null ? "" : data);
134         } else {
135             throw new UnsupportedFlavorException(flavor);
136         }
137     }
138 
139     public void lostOwnership(Clipboard clipboard, Transferable contents) {
140     }
141 }