1 package de.uni_hamburg.corpora.swing;
4 import java.awt.datatransfer.DataFlavor;
5 import java.io.BufferedReader;
7 import java.io.IOException;
8 import java.io.PrintStream;
52 private transient javax.swing.border.Border normalBorder;
53 private transient java.awt.dnd.DropTargetListener dropListener;
57 private static Boolean supportsDnD;
60 private static java.awt.Color defaultBorderColor =
new java.awt.Color( 0f, 0f, 1f, 0.25f );
73 final java.awt.Component c,
77 javax.swing.BorderFactory.createMatteBorder( 2, 2, 2, 2, defaultBorderColor ),
96 final java.awt.Component c,
97 final boolean recursive,
101 javax.swing.BorderFactory.createMatteBorder( 2, 2, 2, 2, defaultBorderColor ),
121 final java.io.PrintStream out,
122 final java.awt.Component c,
126 javax.swing.BorderFactory.createMatteBorder( 2, 2, 2, 2, defaultBorderColor ),
151 final java.io.PrintStream out,
152 final java.awt.Component c,
153 final boolean recursive,
157 javax.swing.BorderFactory.createMatteBorder( 2, 2, 2, 2, defaultBorderColor ),
174 final java.awt.Component c,
175 final javax.swing.border.Border dragBorder,
200 final java.awt.Component c,
201 final javax.swing.border.Border dragBorder,
202 final boolean recursive,
228 final java.io.PrintStream out,
229 final java.awt.Component c,
230 final javax.swing.border.Border dragBorder,
259 final java.io.PrintStream out,
260 final java.awt.Component c,
261 final javax.swing.border.Border dragBorder,
262 final boolean recursive,
268 dropListener =
new java.awt.dnd.DropTargetListener()
269 {
public void dragEnter( java.awt.dnd.DropTargetDragEvent evt )
270 { log( out,
"FileDrop: dragEnter event." );
273 if( isDragOk( out, evt ) )
276 if( c instanceof javax.swing.JComponent )
277 { javax.swing.JComponent jc = (javax.swing.JComponent) c;
278 normalBorder = jc.getBorder();
279 log( out,
"FileDrop: normal border saved." );
280 jc.setBorder( dragBorder );
281 log( out,
"FileDrop: drag border set." );
286 evt.acceptDrag( java.awt.dnd.DnDConstants.ACTION_COPY );
287 log( out,
"FileDrop: event accepted." );
292 log( out,
"FileDrop: event rejected." );
296 public void dragOver( java.awt.dnd.DropTargetDragEvent evt )
301 public void drop( java.awt.dnd.DropTargetDropEvent evt )
302 { log( out,
"FileDrop: drop event." );
305 java.awt.datatransfer.Transferable tr = evt.getTransferable();
308 if (tr.isDataFlavorSupported (java.awt.datatransfer.DataFlavor.javaFileListFlavor))
312 evt.acceptDrop ( java.awt.dnd.DnDConstants.ACTION_COPY );
313 log( out,
"FileDrop: file list accepted." );
316 java.util.List fileList = (java.util.List)
317 tr.getTransferData(java.awt.datatransfer.DataFlavor.javaFileListFlavor);
318 java.util.Iterator iterator = fileList.iterator();
321 java.io.File[] filesTemp =
new java.io.File[ fileList.size() ];
322 fileList.toArray( filesTemp );
323 final java.io.File[] files = filesTemp;
326 if( listener != null )
330 evt.getDropTargetContext().dropComplete(
true);
331 log( out,
"FileDrop: drop complete." );
337 DataFlavor[] flavors = tr.getTransferDataFlavors();
338 boolean handled =
false;
339 for (
int zz = 0; zz < flavors.length; zz++) {
340 if (flavors[zz].isRepresentationClassReader()) {
343 evt.acceptDrop(java.awt.dnd.DnDConstants.ACTION_COPY);
344 log(out,
"FileDrop: reader accepted.");
346 Reader reader = flavors[zz].getReaderForText(tr);
348 BufferedReader br =
new BufferedReader(reader);
354 evt.getDropTargetContext().dropComplete(
true);
355 log(out,
"FileDrop: drop complete.");
361 log( out,
"FileDrop: not a file list or reader - abort." );
367 catch ( java.io.IOException io)
368 { log( out,
"FileDrop: IOException - abort:" );
369 io.printStackTrace( out );
372 catch (java.awt.datatransfer.UnsupportedFlavorException ufe)
373 { log( out,
"FileDrop: UnsupportedFlavorException - abort:" );
374 ufe.printStackTrace( out );
380 if( c instanceof javax.swing.JComponent )
381 { javax.swing.JComponent jc = (javax.swing.JComponent) c;
382 jc.setBorder( normalBorder );
383 log( out,
"FileDrop: normal border restored." );
388 public void dragExit( java.awt.dnd.DropTargetEvent evt )
389 { log( out,
"FileDrop: dragExit event." );
391 if( c instanceof javax.swing.JComponent )
392 { javax.swing.JComponent jc = (javax.swing.JComponent) c;
393 jc.setBorder( normalBorder );
394 log( out,
"FileDrop: normal border restored." );
398 public void dropActionChanged( java.awt.dnd.DropTargetDragEvent evt )
399 { log( out,
"FileDrop: dropActionChanged event." );
401 if( isDragOk( out, evt ) )
403 evt.acceptDrag( java.awt.dnd.DnDConstants.ACTION_COPY );
404 log( out,
"FileDrop: event accepted." );
408 log( out,
"FileDrop: event rejected." );
414 makeDropTarget( out, c, recursive );
417 { log( out,
"FileDrop: Drag and drop is not supported with this JVM" );
422 private static boolean supportsDnD()
424 if( supportsDnD == null )
426 boolean support =
false;
428 { Class arbitraryDndClass = Class.forName(
"java.awt.dnd.DnDConstants" );
434 supportsDnD =
new Boolean( support );
436 return supportsDnD.booleanValue();
441 private static String ZERO_CHAR_STRING =
"" + (char)0;
442 private static File[] createFileArray(BufferedReader bReader, PrintStream out)
445 java.util.List list =
new java.util.ArrayList();
446 java.lang.String line = null;
447 while ((line = bReader.readLine()) != null) {
450 if(ZERO_CHAR_STRING.equals(line))
continue;
452 java.io.File file =
new java.io.File(
new java.net.URI(line));
454 }
catch (Exception ex) {
455 log(out,
"Error with " + line +
": " + ex.getMessage());
459 return (java.io.File[]) list.toArray(
new File[list.size()]);
460 }
catch (IOException ex) {
461 log(out,
"FileDrop: IOException");
468 private void makeDropTarget(
final java.io.PrintStream out,
final java.awt.Component c,
boolean recursive )
471 final java.awt.dnd.DropTarget dt =
new java.awt.dnd.DropTarget();
473 { dt.addDropTargetListener( dropListener );
475 catch( java.util.TooManyListenersException e )
476 { e.printStackTrace();
477 log(out,
"FileDrop: Drop will not work due to previous error. Do you have another listener attached?" );
481 c.addHierarchyListener(
new java.awt.event.HierarchyListener()
482 {
public void hierarchyChanged( java.awt.event.HierarchyEvent evt )
483 { log( out,
"FileDrop: Hierarchy changed." );
484 java.awt.Component parent = c.getParent();
486 { c.setDropTarget( null );
487 log( out,
"FileDrop: Drop target cleared from component." );
490 {
new java.awt.dnd.DropTarget(c, dropListener);
491 log( out,
"FileDrop: Drop target added to component." );
495 if( c.getParent() != null )
496 new java.awt.dnd.DropTarget(c, dropListener);
498 if( recursive && (c instanceof java.awt.Container ) )
501 java.awt.Container cont = (java.awt.Container) c;
504 java.awt.Component[] comps = cont.getComponents();
507 for(
int i = 0; i < comps.length; i++ )
508 makeDropTarget( out, comps[i], recursive );
515 private boolean isDragOk(
final java.io.PrintStream out,
final java.awt.dnd.DropTargetDragEvent evt )
516 {
boolean ok =
false;
519 java.awt.datatransfer.DataFlavor[] flavors = evt.getCurrentDataFlavors();
523 while( !ok && i < flavors.length )
527 final DataFlavor curFlavor = flavors[i];
528 if( curFlavor.equals( java.awt.datatransfer.DataFlavor.javaFileListFlavor ) ||
529 curFlavor.isRepresentationClassReader()){
538 {
if( flavors.length == 0 )
539 log( out,
"FileDrop: no data flavors." );
540 for( i = 0; i < flavors.length; i++ )
541 log( out, flavors[i].toString() );
549 private static void log( java.io.PrintStream out, String message )
552 out.println( message );
568 public static boolean remove( java.awt.Component c)
569 {
return remove( null, c, true );
584 public static boolean remove( java.io.PrintStream out, java.awt.Component c,
boolean recursive )
587 { log( out,
"FileDrop: Removing drag-and-drop hooks." );
588 c.setDropTarget( null );
589 if( recursive && ( c instanceof java.awt.Container ) )
590 { java.awt.Component[] comps = ((java.awt.Container)c).getComponents();
591 for(
int i = 0; i < comps.length; i++ )
592 remove( out, comps[i], recursive );
629 public abstract void filesDropped( java.io.File[] files );
650 public static class Event extends java.util.EventObject {
652 private java.io.File[] files;
663 public Event( java.io.File[] files, Object source ) {
736 public final static String MIME_TYPE =
"application/x-net.iharder.dnd.TransferableObject";
748 public final static java.awt.datatransfer.DataFlavor DATA_FLAVOR =
755 private java.awt.datatransfer.DataFlavor customFlavor;
771 this.customFlavor =
new java.awt.datatransfer.DataFlavor( data.getClass(), MIME_TYPE );
787 { this.fetcher = fetcher;
806 { this.fetcher = fetcher;
807 this.customFlavor =
new java.awt.datatransfer.DataFlavor( dataClass, MIME_TYPE );
819 {
return customFlavor;
838 if( customFlavor != null )
839 return new java.awt.datatransfer.DataFlavor[]
842 java.awt.datatransfer.DataFlavor.stringFlavor
845 return new java.awt.datatransfer.DataFlavor[]
847 java.awt.datatransfer.DataFlavor.stringFlavor
865 throws java.awt.datatransfer.UnsupportedFlavorException, java.io.IOException
868 if( flavor.equals( DATA_FLAVOR ) )
869 return fetcher == null ? data : fetcher.
getObject();
872 if( flavor.equals( java.awt.datatransfer.DataFlavor.stringFlavor ) )
873 return fetcher == null ? data.toString() : fetcher.
getObject().toString();
876 throw new java.awt.datatransfer.UnsupportedFlavorException(flavor);
893 if( flavor.equals( DATA_FLAVOR ) )
897 if( flavor.equals( java.awt.datatransfer.DataFlavor.stringFlavor ) )
929 public abstract Object getObject();
abstract void filesDropped(java.io.File[] files)
boolean isDataFlavorSupported(java.awt.datatransfer.DataFlavor flavor)
TransferableObject(Class dataClass, Fetcher fetcher)
java.awt.datatransfer.DataFlavor getCustomDataFlavor()
java.awt.datatransfer.DataFlavor[] getTransferDataFlavors()
FileDrop(final java.awt.Component c, final javax.swing.border.Border dragBorder, final boolean recursive, final Listener listener)
FileDrop(final java.awt.Component c, final boolean recursive, final Listener listener)
FileDrop(final java.io.PrintStream out, final java.awt.Component c, final javax.swing.border.Border dragBorder, final Listener listener)
TransferableObject(Object data)
FileDrop(final java.awt.Component c, final Listener listener)
FileDrop(final java.io.PrintStream out, final java.awt.Component c, final javax.swing.border.Border dragBorder, final boolean recursive, final Listener listener)
abstract Object getObject()
FileDrop(final java.awt.Component c, final javax.swing.border.Border dragBorder, final Listener listener)
TransferableObject(Fetcher fetcher)
FileDrop(final java.io.PrintStream out, final java.awt.Component c, final Listener listener)
Object getTransferData(java.awt.datatransfer.DataFlavor flavor)
Event(java.io.File[] files, Object source)
FileDrop(final java.io.PrintStream out, final java.awt.Component c, final boolean recursive, final Listener listener)
java.io.File[] getFiles()