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

Last change on this file since 1436 was 1436, checked in by bnemhaus, 5 years ago

Added the ability to copy/paste recognised files (mostly images) into Expeditee. This functionality already existed when drag n dropping, but now also works when using copy/paste.

At this stage, recognised files get imported as a approapriate Text Item. For example, a image will create a @i Text Item and attach it to your cursor. Ideally this would be the image directly. Unfortunately, items attached to the cursor (FreeItems) are not currently parsed. This is something I will discuss with David as there are confounding issues to consider. For example: surrogates...

Attached to the bottom of this commit message are my current thoughts.

Also made it so when creating a @i through DND or Copy/Paste, that @i is as relative as possible. The users image directories setting is used to achieve this.


  • FreeItems need to be parsed...we would need to deal with primaries/surrogates in them...
  • Do we want FreeItems to be parsed? If I attach an item to my cursor and then enter surrogate mode, should it change?
  • My gut says no. Both because it would be work, and also because it kind of feels like a free win if we do not.
  • But we do want to replace @i with images etc. Therefore, we want an old style parse for FreeItems?
File size: 5.1 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.File;
8import java.io.IOException;
9import java.util.LinkedList;
10import java.util.List;
11
12import org.expeditee.core.Image;
13import org.expeditee.core.Point;
14import org.expeditee.gio.ClipboardManager;
15import org.expeditee.gio.DragAndDropManager;
16import org.expeditee.gio.EcosystemManager;
17import org.expeditee.gui.DisplayController;
18
19/** TODO: Comment. cts16 */
20public class SwingClipboardManager extends ClipboardManager {
21
22 public static final DataFlavor expediteeDataFlavour = new DataFlavor(Object.class, "expediteeDataFlavour");
23
24 // The return flavour of data in preferential order
25 public static final DataFlavor[] flavours = {
26 SwingClipboardManager.expediteeDataFlavour,
27 DataFlavor.imageFlavor,
28 DataFlavor.stringFlavor,
29 DataFlavor.javaFileListFlavor
30 };
31
32 private static SwingClipboardManager _instance;
33
34 public static SwingClipboardManager getInstance()
35 {
36 if (_instance == null) {
37 _instance = new SwingClipboardManager();
38 }
39
40 return _instance;
41 }
42
43 @Override
44 public void set(ClipboardData data)
45 {
46 if (data == null) return;
47
48 SwingClipboardGeneralTransferable t = new SwingClipboardGeneralTransferable(data.data);
49 t.addImageRepresentation(SwingMiscManager.getIfUsingSwingImageManager().getBufferedImageForImage(data.imageRepresentation));
50 t.addStringRepresentation(data.stringRepresentation);
51
52 Toolkit.getDefaultToolkit().getSystemClipboard().setContents(t, null);
53 }
54
55 @Override
56 public ClipboardData get()
57 {
58 Transferable content = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
59
60 // No clipboard contents
61 if (content == null) return null;
62
63 ClipboardData ret = new ClipboardData();
64
65 // Try each flavour
66 for (DataFlavor flavour : flavours) {
67 if (content.isDataFlavorSupported(flavour)) {
68 try {
69 handleGet(flavour, content, ret);
70 } catch (IOException e) {
71 // Data stale, just move on to next flavour
72 } catch (UnsupportedFlavorException e) {
73 // Shouldn't get here because we just checked, but just move on anyway
74 }
75 }
76 }
77
78 // No supported content
79 return ret;
80 }
81
82 private void handleGet(DataFlavor flavour, Transferable content, ClipboardData out) throws IOException, UnsupportedFlavorException
83 {
84 if (expediteeDataFlavour.equals(flavour)) {
85 out.data = content.getTransferData(flavour);
86 } else if (DataFlavor.imageFlavor.equals(flavour)) {
87 out.imageRepresentation = handleGetImage(content);
88 } else if (DataFlavor.stringFlavor.equals(flavour)) {
89 out.stringRepresentation = (String) content.getTransferData(flavour);
90 } else if (DataFlavor.javaFileListFlavor.equals(flavour)) {
91 @SuppressWarnings("unchecked")
92 List<File> transferData = (List<File>) content.getTransferData(flavour);
93 out.fileRepresentation = transferData;
94 }
95 }
96
97 private Image handleGetImage(Transferable content) throws IOException, UnsupportedFlavorException
98 {
99 Object o = content.getTransferData(DataFlavor.imageFlavor);
100
101 SwingImageManager manager = SwingMiscManager.getIfUsingSwingImageManager();
102
103 if (manager == null) return null;
104
105 return manager.createImage((java.awt.Image) o);
106 }
107
108 /** TODO: Comment. cts16 */
109 private class SwingClipboardGeneralTransferable implements Transferable
110 {
111 Object _data;
112 java.awt.Image _imageRep;
113 String _stringRep;
114
115 private List<DataFlavor> _flavours;
116
117 @SuppressWarnings("unused")
118 public SwingClipboardGeneralTransferable()
119 {
120 this(null);
121 }
122
123 public SwingClipboardGeneralTransferable(Object data)
124 {
125 _flavours = new LinkedList<DataFlavor>();
126
127 addGenericRepresentation(data);
128 }
129
130 public void addGenericRepresentation(Object data)
131 {
132 if (data == null) return;
133
134 _data = data;
135 addDataFlavour(SwingClipboardManager.expediteeDataFlavour);
136 }
137
138 public void addImageRepresentation(java.awt.Image image)
139 {
140 if (image == null) return;
141
142 _imageRep = image;
143 addDataFlavour(DataFlavor.imageFlavor);
144 }
145
146 public void addStringRepresentation(String string)
147 {
148 if (string == null) return;
149
150 _stringRep = string;
151 addDataFlavour(DataFlavor.stringFlavor);
152 }
153
154 public void addDataFlavour(DataFlavor flavour)
155 {
156 _flavours.add(flavour);
157 }
158
159 @Override
160 public DataFlavor[] getTransferDataFlavors()
161 {
162 DataFlavor[] ret = new DataFlavor[_flavours.size()];
163 int i = 0;
164 for (DataFlavor flavour : _flavours) {
165 ret[i] = flavour;
166 i++;
167 }
168 return ret;
169 }
170
171 @Override
172 public boolean isDataFlavorSupported(DataFlavor flavor)
173 {
174 for (DataFlavor flavour : _flavours) {
175 if (flavour.equals(flavor)) return true;
176 }
177 return false;
178 }
179
180 @Override
181 public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException
182 {
183 if (isDataFlavorSupported(flavor)) {
184 if (flavor.equals(DataFlavor.imageFlavor)) {
185 return _imageRep;
186 } else if (flavor.equals(DataFlavor.stringFlavor)) {
187 return _stringRep;
188 } else {
189 return _data;
190 }
191 } else {
192 throw new UnsupportedFlavorException(flavor);
193 }
194 }
195
196 }
197
198
199}
Note: See TracBrowser for help on using the repository browser.