
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.awt.event.*;
import java.awt.event.*;
import java.net.*;
import java.util.*;

import javax.swing.*;


public class FooText extends JTextArea
    implements DnDable
{
    private JTextArea _myText = this;

    // What flavors can we accept
    private final DataFlavor[]  _acceptableFlavors  =
        {
            FooDataFlavors.fooTreeDataFlavor,
            FooDataFlavors.fooTableDataFlavor,
            FooDataFlavors.URLFlavor,
            FooDataFlavors.fileListFlavor,
            FooDataFlavors.stringFlavor
        };

    // what flavors of data can we provide
    private final DataFlavor[]  _transferableFlavors =
        {
            FooDataFlavors.stringFlavor
        };

    //-------------------------------------------------------------------------|

    public FooText( String name)
    {
        _myText.setName( name);
        _myText.setTransferHandler( new FooTransferHandler( (DnDable)_myText,
                                                            _acceptableFlavors));
    }

    //-------------------------------------------------------------------------|

    public String getData()
    {
        return _myText.getSelectedText();
    }

    //-------------------------------------------------------------------------|

    public void setData( String data)
    {
        _myText.setText( data);
    }

    //--< DNDable methods >----------------------------------------------------|

    public boolean canImport(DataFlavor[] transferFlavors)
    {
        prn( "\nChecking what " + _myText.getName() + " accepts from ...");
        prnDataFlavors( transferFlavors);

        int i = 0, j = 0, n = _acceptableFlavors.length;
        for( i = 0; i < n; ++i)
        {
            for( j = 0; j < transferFlavors.length; ++j)
            {
                if( _acceptableFlavors[i].equals( transferFlavors[j]))
                {
                    prn( "Acceptable flavor = " +
                         transferFlavors[j].getRepresentationClass() + "(" +
                         transferFlavors[j].getHumanPresentableName() + ")");
                    return true;
                }
            }
        }

        return false;
    }

    //-------------------------------------------------------------------------|

    public Transferable createTransferable()
    {
        return new StringSelection( getData());
    }

    //-------------------------------------------------------------------------|

    public void exportDone(Transferable data, int action)
    {
    }

    //-------------------------------------------------------------------------|

    public boolean importData(Transferable t)
    {
//        prn( _myText.getName() + ".importData()");

        try
        {
            if( t.isDataFlavorSupported( FooDataFlavors.stringFlavor))
            {
                String data = (String)t.getTransferData( FooDataFlavors.stringFlavor);

                _myText.setText( data);
                return true;
            }
            else
            if( t.isDataFlavorSupported( FooDataFlavors.URLFlavor))
            {
                URL data = (URL)t.getTransferData( FooDataFlavors.URLFlavor);

                _myText.setText( data.toString());
                return true;
            }
            else
            if( t.isDataFlavorSupported( FooDataFlavors.fileListFlavor))
            {
                java.util.List fileList = (java.util.List)t.getTransferData( FooDataFlavors.fileListFlavor);

                Iterator fileListIter = fileList.iterator();
                StringBuffer list = new StringBuffer( fileList.size() * 128);
                while( fileListIter.hasNext())
                {
                    list.append( fileListIter.next().toString() + "\r\n");
                }

                _myText.setText( list.toString());
                return true;
            }
        }
        catch (UnsupportedFlavorException e)
        {
            prn( e.toString());
        }
        catch (Exception e)
        {
            prn( e);
        }

        prn( _myText.getName() + " didnt find any acceptable flavors");

        return false;
    }

    //-------------------------------------------------------------------------|

    public int getSourceActions()
    {
        return (TransferHandler.COPY_OR_MOVE | DnDConstants.ACTION_LINK);
    }

    //-------------------------------------------------------------------------|

    private void prn( Object msg)
    {
        System.out.println( msg);
    }

    private void prnDataFlavors( DataFlavor[] arr)
    {
        if( null == arr) return;

        DataFlavor df = null;
        for( int i = 0, n = arr.length; i < n && i < 5; ++i)
        {
            prn( " -[" + i + "] " + arr[i].getRepresentationClass().getName());
        }
    }
}

//--< FooText ends here >------------------------------------------------------|

