30 |
import java.util.Iterator; |
import java.util.Iterator; |
31 |
import java.util.Random; |
import java.util.Random; |
32 |
|
|
33 |
|
/** |
34 |
|
* An example how datatransfer works for copying and pasting data to |
35 |
|
* and from other programs. |
36 |
|
*/ |
37 |
class Demo |
class Demo |
38 |
extends Frame |
extends Frame |
39 |
implements ActionListener |
implements ActionListener, ItemListener, FlavorListener |
40 |
{ |
{ |
41 |
public static void main(String args[]) |
public static void main(String args[]) |
42 |
{ |
{ |
59 |
private Button copyFiles; |
private Button copyFiles; |
60 |
private Button pasteFiles; |
private Button pasteFiles; |
61 |
|
|
62 |
|
private FlavorsComponent flavors; |
63 |
|
private FlavorDetailsComponent details; |
64 |
|
|
65 |
private Demo() |
private Demo() |
66 |
{ |
{ |
67 |
super("GNU Classpath datatransfer"); |
super("GNU Classpath datatransfer"); |
68 |
setLayout(new GridLayout(4, 1, 5, 5)); |
|
69 |
|
/* Add all the different panel to the main window in one row. */ |
70 |
|
setLayout(new GridLayout(5, 1, 10, 10)); |
71 |
add(createTextPanel()); |
add(createTextPanel()); |
72 |
add(createImagePanel()); |
add(createImagePanel()); |
73 |
add(createObjectPanel()); |
add(createObjectPanel()); |
74 |
add(createFilesPanel()); |
add(createFilesPanel()); |
75 |
|
add(createFlavorsPanel()); |
76 |
|
|
77 |
|
/* Add listeners for the various buttons and events we are |
78 |
|
interested in. */ |
79 |
addWindowListener(new WindowAdapter () |
addWindowListener(new WindowAdapter () |
80 |
{ |
{ |
81 |
public void windowClosing (WindowEvent e) |
public void windowClosing (WindowEvent e) |
83 |
dispose(); |
dispose(); |
84 |
} |
} |
85 |
}); |
}); |
86 |
|
flavors.addItemListener(this); |
87 |
|
Toolkit t = Toolkit.getDefaultToolkit(); |
88 |
|
Clipboard c = t.getSystemClipboard(); |
89 |
|
c.addFlavorListener(this); |
90 |
|
|
91 |
|
/* Show time! */ |
92 |
pack(); |
pack(); |
93 |
show(); |
show(); |
94 |
} |
} |
95 |
|
|
96 |
|
/** |
97 |
|
* The Text Panel will show simple text that can be copied and pasted. |
98 |
|
*/ |
99 |
private Panel createTextPanel() |
private Panel createTextPanel() |
100 |
{ |
{ |
101 |
Panel textPanel = new Panel(); |
Panel textPanel = new Panel(); |
102 |
textPanel.setLayout(new BorderLayout()); |
textPanel.setLayout(new BorderLayout()); |
103 |
text = new TextArea("GNU Everywhere!", |
text = new TextArea("GNU Everywhere!", |
104 |
4, 40, |
2, 80, |
105 |
TextArea.SCROLLBARS_VERTICAL_ONLY); |
TextArea.SCROLLBARS_VERTICAL_ONLY); |
106 |
text.setEditable(false); |
text.setEditable(false); |
107 |
text.setEnabled(true); |
text.setEnabled(true); |
118 |
return textPanel; |
return textPanel; |
119 |
} |
} |
120 |
|
|
121 |
|
/** |
122 |
|
* The Image Panel shows an image that can be copied to another |
123 |
|
* program or be replaced by pasting in an image from another |
124 |
|
* application. |
125 |
|
*/ |
126 |
private Panel createImagePanel() |
private Panel createImagePanel() |
127 |
{ |
{ |
128 |
Panel imagePanel = new Panel(); |
Panel imagePanel = new Panel(); |
143 |
return imagePanel; |
return imagePanel; |
144 |
} |
} |
145 |
|
|
146 |
|
/** |
147 |
|
* The Object Panel holds a simple (Point) object that can be copied |
148 |
|
* and pasted to another program that supports exchanging serialized |
149 |
|
* objects. |
150 |
|
*/ |
151 |
private Panel createObjectPanel() |
private Panel createObjectPanel() |
152 |
{ |
{ |
153 |
Panel objectPanel = new Panel(); |
Panel objectPanel = new Panel(); |
168 |
return objectPanel; |
return objectPanel; |
169 |
} |
} |
170 |
|
|
171 |
|
/** |
172 |
|
* The Files Panel shows the files from the current working |
173 |
|
* directory. They can be copied and pasted between other |
174 |
|
* applications that support the exchange of file lists. |
175 |
|
*/ |
176 |
private Panel createFilesPanel() |
private Panel createFilesPanel() |
177 |
{ |
{ |
178 |
Panel filesPanel = new Panel(); |
Panel filesPanel = new Panel(); |
190 |
return filesPanel; |
return filesPanel; |
191 |
} |
} |
192 |
|
|
193 |
|
/** |
194 |
|
* The Flavors Panel shows the different formats (mime-types) that |
195 |
|
* data on the clipboard is available in. By clicking on a flavor |
196 |
|
* details about the representation class and object is given. |
197 |
|
*/ |
198 |
|
private Panel createFlavorsPanel() |
199 |
|
{ |
200 |
|
Panel flavorsPanel = new Panel(); |
201 |
|
flavorsPanel.setLayout(new BorderLayout()); |
202 |
|
Label flavorsHeader = new Label("Flavors on clipboard:"); |
203 |
|
Toolkit t = Toolkit.getDefaultToolkit(); |
204 |
|
Clipboard c = t.getSystemClipboard(); |
205 |
|
DataFlavor[] dataflavors = c.getAvailableDataFlavors(); |
206 |
|
flavors = new FlavorsComponent(dataflavors); |
207 |
|
details = new FlavorDetailsComponent(null); |
208 |
|
flavorsPanel.add(flavorsHeader, BorderLayout.NORTH); |
209 |
|
flavorsPanel.add(flavors, BorderLayout.CENTER); |
210 |
|
flavorsPanel.add(details, BorderLayout.SOUTH); |
211 |
|
return flavorsPanel; |
212 |
|
} |
213 |
|
|
214 |
|
/** |
215 |
|
* FlavorListener implementation that updates the Flavors Panel |
216 |
|
* whenever a change in the mime-types available has been detected. |
217 |
|
*/ |
218 |
|
public void flavorsChanged(FlavorEvent event) |
219 |
|
{ |
220 |
|
Toolkit t = Toolkit.getDefaultToolkit(); |
221 |
|
Clipboard c = t.getSystemClipboard(); |
222 |
|
DataFlavor[] dataflavors = c.getAvailableDataFlavors(); |
223 |
|
flavors.setFlavors(dataflavors); |
224 |
|
details.setDataFlavor(null); |
225 |
|
} |
226 |
|
|
227 |
|
/** |
228 |
|
* ItemChangeListener implementation that updates the flavor details |
229 |
|
* whenever the user selects a different representation of the data |
230 |
|
* available on the clipboard. |
231 |
|
*/ |
232 |
|
public void itemStateChanged(ItemEvent evt) |
233 |
|
{ |
234 |
|
DataFlavor df = null; |
235 |
|
String s = flavors.getSelectedItem(); |
236 |
|
if (s != null) |
237 |
|
{ |
238 |
|
try |
239 |
|
{ |
240 |
|
df = new DataFlavor(s); |
241 |
|
} |
242 |
|
catch (ClassNotFoundException cnfe) |
243 |
|
{ |
244 |
|
cnfe.printStackTrace(); |
245 |
|
} |
246 |
|
} |
247 |
|
details.setDataFlavor(df); |
248 |
|
} |
249 |
|
|
250 |
|
/** |
251 |
|
* ActionListener implementations that will copy or past data |
252 |
|
* to/from the clipboard when the user requests that for the text, |
253 |
|
* image, object of file component. |
254 |
|
*/ |
255 |
public void actionPerformed (ActionEvent evt) |
public void actionPerformed (ActionEvent evt) |
256 |
{ |
{ |
257 |
Button b = (Button) evt.getSource(); |
Button b = (Button) evt.getSource(); |
315 |
Serializable o = null; |
Serializable o = null; |
316 |
try |
try |
317 |
{ |
{ |
318 |
o = (Serializable) c.getData |
o = (Serializable) c.getData(ObjectSelection.objFlavor); |
|
(new DataFlavor(DataFlavor.javaSerializedObjectMimeType)); |
|
319 |
} |
} |
320 |
catch (UnsupportedFlavorException dfnse) |
catch (UnsupportedFlavorException dfnse) |
321 |
{ |
{ |
326 |
catch (ClassCastException cce) |
catch (ClassCastException cce) |
327 |
{ |
{ |
328 |
} |
} |
|
catch (ClassNotFoundException cnfe) |
|
|
{ |
|
|
} |
|
329 |
if (o == null) |
if (o == null) |
330 |
t.beep(); |
t.beep(); |
331 |
else |
else |
358 |
} |
} |
359 |
} |
} |
360 |
|
|
361 |
|
/** |
362 |
|
* Simple awt component that shows an settable image. |
363 |
|
*/ |
364 |
static class ImageComponent extends Component |
static class ImageComponent extends Component |
365 |
{ |
{ |
366 |
private Image image; |
private Image image; |
367 |
|
|
368 |
ImageComponent(Image image) |
ImageComponent(Image image) |
369 |
{ |
{ |
370 |
setSize(120, 120); |
setSize(20, 20); |
371 |
setImage(image); |
setImage(image); |
372 |
} |
} |
373 |
|
|
388 |
} |
} |
389 |
} |
} |
390 |
|
|
391 |
|
/** |
392 |
|
* Simple awt component that shows a settable Serializable object. |
393 |
|
*/ |
394 |
static class ObjectComponent extends TextArea |
static class ObjectComponent extends TextArea |
395 |
{ |
{ |
396 |
private Serializable object; |
private Serializable object; |
397 |
|
|
398 |
ObjectComponent(Serializable object) |
ObjectComponent(Serializable object) |
399 |
{ |
{ |
400 |
super("", 2, 40, TextArea.SCROLLBARS_NONE); |
super("", 2, 80, TextArea.SCROLLBARS_NONE); |
401 |
setEditable(false); |
setEditable(false); |
402 |
setEnabled(false); |
setEnabled(false); |
403 |
setObject(object); |
setObject(object); |
418 |
} |
} |
419 |
} |
} |
420 |
|
|
421 |
|
/** |
422 |
|
* Simple awt component that shows a settable list of Files. |
423 |
|
*/ |
424 |
static class FilesComponent extends List |
static class FilesComponent extends List |
425 |
{ |
{ |
426 |
private File[] files; |
private File[] files; |
427 |
|
|
428 |
FilesComponent(File[] files) |
FilesComponent(File[] files) |
429 |
{ |
{ |
430 |
super(4, true); |
super(4, true); |
431 |
setFiles(files); |
setFiles(files); |
432 |
} |
} |
433 |
|
|
434 |
File[] getFiles() |
File[] getFiles() |
435 |
{ |
{ |
436 |
String[] strings = getSelectedItems(); |
String[] strings = getSelectedItems(); |
437 |
if (strings == null || strings.length == 0) |
if (strings == null || strings.length == 0) |
438 |
return (File[]) files.clone(); |
return (File[]) files.clone(); |
439 |
|
|
440 |
File[] fs = new File[strings.length]; |
File[] fs = new File[strings.length]; |
441 |
for (int i = 0; i < strings.length; i++) |
for (int i = 0; i < strings.length; i++) |
442 |
fs[i] = new File(strings[i]); |
fs[i] = new File(strings[i]); |
443 |
return fs; |
return fs; |
444 |
} |
} |
445 |
|
|
446 |
void setFiles(File[] files) |
void setFiles(File[] files) |
447 |
{ |
{ |
448 |
this.files = files; |
this.files = files; |
449 |
removeAll(); |
removeAll(); |
450 |
for (int i = 0; i < files.length; i++) |
for (int i = 0; i < files.length; i++) |
451 |
{ |
{ |
452 |
addItem(files[i].toString()); |
addItem(files[i].toString()); |
453 |
select(i); |
select(i); |
454 |
} |
} |
455 |
} |
} |
456 |
|
|
457 |
void setFiles(java.util.List list) |
void setFiles(java.util.List list) |
458 |
{ |
{ |
459 |
File[] fs = new File[list.size()]; |
File[] fs = new File[list.size()]; |
461 |
Iterator it = list.iterator(); |
Iterator it = list.iterator(); |
462 |
while (it.hasNext()) |
while (it.hasNext()) |
463 |
fs[i++] = (File) it.next(); |
fs[i++] = (File) it.next(); |
464 |
|
|
465 |
setFiles(fs); |
setFiles(fs); |
466 |
} |
} |
467 |
} |
} |
468 |
|
|
469 |
|
/** |
470 |
|
* Simple awt component that shows a settable list of DataFlavors. |
471 |
|
*/ |
472 |
|
static class FlavorsComponent extends List |
473 |
|
{ |
474 |
|
FlavorsComponent(DataFlavor[] flavors) |
475 |
|
{ |
476 |
|
super(4); |
477 |
|
setFlavors(flavors); |
478 |
|
} |
479 |
|
|
480 |
|
void setFlavors(DataFlavor[] flavors) |
481 |
|
{ |
482 |
|
removeAll(); |
483 |
|
for (int i = 0; i < flavors.length; i++) |
484 |
|
{ |
485 |
|
addItem(flavors[i].getMimeType()); |
486 |
|
} |
487 |
|
} |
488 |
|
} |
489 |
|
|
490 |
|
/** |
491 |
|
* Simple awt component that shows the details for and an object as |
492 |
|
* found on the system clipboard as represented by a given |
493 |
|
* DataFlavor. |
494 |
|
*/ |
495 |
|
static class FlavorDetailsComponent extends TextArea |
496 |
|
{ |
497 |
|
private DataFlavor df; |
498 |
|
|
499 |
|
FlavorDetailsComponent(DataFlavor df) |
500 |
|
{ |
501 |
|
super("", 2, 80, TextArea.SCROLLBARS_NONE); |
502 |
|
setEditable(false); |
503 |
|
setEnabled(false); |
504 |
|
setDataFlavor(df); |
505 |
|
} |
506 |
|
|
507 |
|
void setDataFlavor(DataFlavor df) |
508 |
|
{ |
509 |
|
if (df == this.df |
510 |
|
|| (df != null && df.equals(this.df))) |
511 |
|
return; |
512 |
|
|
513 |
|
this.df = df; |
514 |
|
|
515 |
|
if (df == null) |
516 |
|
setText("No flavor selected"); |
517 |
|
else |
518 |
|
{ |
519 |
|
Object o = null; |
520 |
|
Throwable exception = null; |
521 |
|
try |
522 |
|
{ |
523 |
|
Toolkit t = Toolkit.getDefaultToolkit(); |
524 |
|
Clipboard c = t.getSystemClipboard(); |
525 |
|
o = c.getData(df); |
526 |
|
} |
527 |
|
catch (Throwable t) |
528 |
|
{ |
529 |
|
exception = t; |
530 |
|
} |
531 |
|
if (o != null) |
532 |
|
{ |
533 |
|
setText("Data: " + o.getClass().getName() |
534 |
|
+ "\n" |
535 |
|
+ o); |
536 |
|
} |
537 |
|
else |
538 |
|
{ |
539 |
|
setText("Error retrieving: " + df |
540 |
|
+ "\n" |
541 |
|
+ exception != null ? exception.toString() : ""); |
542 |
|
} |
543 |
|
} |
544 |
|
repaint(); |
545 |
|
} |
546 |
|
} |
547 |
|
|
548 |
|
/** |
549 |
|
* Helper class to put an Image on a clipboard as |
550 |
|
* DataFlavor.imageFlavor. |
551 |
|
*/ |
552 |
static class ImageSelection implements Transferable |
static class ImageSelection implements Transferable |
553 |
{ |
{ |
554 |
private final Image img; |
private final Image img; |
579 |
} |
} |
580 |
} |
} |
581 |
|
|
582 |
|
/** |
583 |
|
* Helper class to put an Object on a clipboard as Serializable |
584 |
|
* object. |
585 |
|
*/ |
586 |
static class ObjectSelection implements Transferable |
static class ObjectSelection implements Transferable |
587 |
{ |
{ |
588 |
private final Serializable obj; |
private final Serializable obj; |
615 |
} |
} |
616 |
} |
} |
617 |
|
|
618 |
|
/** |
619 |
|
* Helper class to put a List of Files on the clipboard as |
620 |
|
* DataFlavor.javaFileListFlavor. |
621 |
|
*/ |
622 |
static class FilesSelection implements Transferable |
static class FilesSelection implements Transferable |
623 |
{ |
{ |
624 |
private final File[] files; |
private final File[] files; |