source: trunk/src/org/expeditee/gio/swing/SwingClipboardManager.java@ 1097

Last change on this file since 1097 was 1097, checked in by davidb, 6 years ago

Newly structured files from Corey's work on logic/graphics separation

File size: 4.7 KB
Line 
1package org.expeditee.gio.swing;
2
3import java.awt.Toolkit;
4import java.awt.datatransfer.DataFlavor;
5import java.awt.datatransfer.Transferable;
6import java.awt.datatransfer.UnsupportedFlavorException;
7import java.io.IOException;
8import java.util.LinkedList;
9import java.util.List;
10
11import org.expeditee.core.Image;
12import org.expeditee.gio.ClipboardManager;
13
14/** TODO: Comment. cts16 */
15public class SwingClipboardManager extends ClipboardManager {
16
17 public static final DataFlavor expediteeDataFlavour = new DataFlavor(Object.class, "expediteeDataFlavour");
18
19 // The return flavour of data in preferential order
20 public static final DataFlavor[] flavours = {
21 SwingClipboardManager.expediteeDataFlavour,
22 DataFlavor.imageFlavor,
23 DataFlavor.stringFlavor
24 };
25
26 private static SwingClipboardManager _instance;
27
28 public static SwingClipboardManager getInstance()
29 {
30 if (_instance == null) {
31 _instance = new SwingClipboardManager();
32 }
33
34 return _instance;
35 }
36
37 @Override
38 public void set(ClipboardData data)
39 {
40 if (data == null) return;
41
42 SwingClipboardGeneralTransferable t = new SwingClipboardGeneralTransferable(data.data);
43 t.addImageRepresentation(SwingMiscManager.getIfUsingSwingImageManager().getBufferedImageForImage(data.imageRepresentation));
44 t.addStringRepresentation(data.stringRepresentation);
45
46 Toolkit.getDefaultToolkit().getSystemClipboard().setContents(t, null);
47 }
48
49 @Override
50 public ClipboardData get()
51 {
52 Transferable content = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
53
54 // No clipboard contents
55 if (content == null) return null;
56
57 ClipboardData ret = new ClipboardData();
58
59 // Try each flavour
60 for (DataFlavor flavour : flavours) {
61 if (content.isDataFlavorSupported(flavour)) {
62 try {
63 handleGet(flavour, content, ret);
64 } catch (IOException e) {
65 // Data stale, just move on to next flavour
66 } catch (UnsupportedFlavorException e) {
67 // Shouldn't get here because we just checked, but just move on anyway
68 }
69 }
70 }
71
72 // No supported content
73 return ret;
74 }
75
76 private void handleGet(DataFlavor flavour, Transferable content, ClipboardData out) throws IOException, UnsupportedFlavorException
77 {
78 if (expediteeDataFlavour.equals(flavour)) {
79 out.data = content.getTransferData(flavour);
80 } else if (DataFlavor.imageFlavor.equals(flavour)) {
81 out.imageRepresentation = handleGetImage(content);
82 } else if (DataFlavor.stringFlavor.equals(flavour)) {
83 out.stringRepresentation = (String) content.getTransferData(flavour);
84 }
85 }
86
87 private Image handleGetImage(Transferable content) throws IOException, UnsupportedFlavorException
88 {
89 Object o = content.getTransferData(DataFlavor.imageFlavor);
90
91 SwingImageManager manager = SwingMiscManager.getIfUsingSwingImageManager();
92
93 if (manager == null) return null;
94
95 return manager.createImage((java.awt.Image) o);
96 }
97
98 /** TODO: Comment. cts16 */
99 private class SwingClipboardGeneralTransferable implements Transferable
100 {
101 Object _data;
102 java.awt.Image _imageRep;
103 String _stringRep;
104
105 private List<DataFlavor> _flavours;
106
107 @SuppressWarnings("unused")
108 public SwingClipboardGeneralTransferable()
109 {
110 this(null);
111 }
112
113 public SwingClipboardGeneralTransferable(Object data)
114 {
115 _flavours = new LinkedList<DataFlavor>();
116
117 addGenericRepresentation(data);
118 }
119
120 public void addGenericRepresentation(Object data)
121 {
122 if (data == null) return;
123
124 _data = data;
125 addDataFlavour(SwingClipboardManager.expediteeDataFlavour);
126 }
127
128 public void addImageRepresentation(java.awt.Image image)
129 {
130 if (image == null) return;
131
132 _imageRep = image;
133 addDataFlavour(DataFlavor.imageFlavor);
134 }
135
136 public void addStringRepresentation(String string)
137 {
138 if (string == null) return;
139
140 _stringRep = string;
141 addDataFlavour(DataFlavor.stringFlavor);
142 }
143
144 public void addDataFlavour(DataFlavor flavour)
145 {
146 _flavours.add(flavour);
147 }
148
149 @Override
150 public DataFlavor[] getTransferDataFlavors()
151 {
152 DataFlavor[] ret = new DataFlavor[_flavours.size()];
153 int i = 0;
154 for (DataFlavor flavour : _flavours) {
155 ret[i] = flavour;
156 i++;
157 }
158 return ret;
159 }
160
161 @Override
162 public boolean isDataFlavorSupported(DataFlavor flavor)
163 {
164 for (DataFlavor flavour : _flavours) {
165 if (flavour.equals(flavor)) return true;
166 }
167 return false;
168 }
169
170 @Override
171 public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException
172 {
173 if (isDataFlavorSupported(flavor)) {
174 if (flavor.equals(DataFlavor.imageFlavor)) {
175 return _imageRep;
176 } else if (flavor.equals(DataFlavor.stringFlavor)) {
177 return _stringRep;
178 } else {
179 return _data;
180 }
181 } else {
182 throw new UnsupportedFlavorException(flavor);
183 }
184 }
185
186 }
187
188
189}
Note: See TracBrowser for help on using the repository browser.