/********************************************************************
*
*  This library is free software; you can redistribute it and/or
*  modify it under the terms of the GNU Library General Public
*  License as published by the Free Software Foundation; either
*  version 2 of the License, or (at your option) any later version.
*
*  This library is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
*  Library General Public License for more details.
*
*  You should have received a copy of the GNU Library General Public
*  License along with this library; if not, write to the
*  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
*  Boston, MA  02111-1307, USA.
*
*  Copyright (C) Genome Research Limited
*
********************************************************************/

package uk.ac.sanger.artemis.components;

import java.awt.datatransfer.*;

import javax.swing.*;
import java.awt.event.*;
import javax.swing.border.*;

import uk.ac.sanger.artemis.components.database.DatabaseTreeNode;

import java.awt.dnd.*;
import java.awt.*;
import java.io.*;


/**
*
* Extends JTextField to enable pasting & drag and drop into it.
*
*/
public class TextFieldSink extends JTextField implements DropTargetListener
{
  private DatabaseTreeNode dbNode = null;

  public TextFieldSink(String text, int columns)
  {
    super(text, columns);
    //pasting
    addMouseListener(new MouseAdapter()
    {
      public void mouseClicked(MouseEvent e)
      {
        if(e.getClickCount() == 2)
        {
          pasteText();
          e.consume();
        };
      }
    });

    setDropTarget(new DropTarget(this,this));
  }

  public TextFieldSink()
  {
    this("",0);
  }

  public void pasteText()
  {
    Clipboard c = this.getToolkit().getSystemClipboard();
   
    Transferable t = c.getContents(this);
    if(t==null)
    {
      this.getToolkit().beep();
      return;
    }
    try
    {
      if(t.isDataFlavorSupported(DataFlavor.stringFlavor))
      {
        String s = (String) t.getTransferData(DataFlavor.stringFlavor);
        this.replaceSelection(s);
      }
      else
        this.getToolkit().beep();
    }
    catch (UnsupportedFlavorException ex) { this.getToolkit().beep(); }
    catch (IOException ex) { this.getToolkit().beep(); }

  }

  protected static Border dropBorder = new BevelBorder(BevelBorder.LOWERED);
  protected static Border endBorder =
                               BorderFactory.createLineBorder(Color.black);

  public void dragEnter(DropTargetDragEvent e)
  {
    if(e.isDataFlavorSupported(DataFlavor.stringFlavor) ||
       e.isDataFlavorSupported(DatabaseTreeNode.DATABASETREENODE))
    {
      e.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
      this.setBorder(dropBorder);
    }
  }

  public void dragExit(DropTargetEvent e)
  {
    this.setBorder(null);
  }

  public void drop(DropTargetDropEvent e)
  {
    this.setBorder(endBorder);
    Transferable t = e.getTransferable();

    if(t.isDataFlavorSupported(DatabaseTreeNode.DATABASETREENODE))
    {
      try
      {
        setCursor(new Cursor(Cursor.WAIT_CURSOR));
        dbNode = 
          (DatabaseTreeNode)t.getTransferData(DatabaseTreeNode.DATABASETREENODE);
        this.replaceSelection(dbNode.getSchema()+":featureId="+dbNode.getFeatureId());

        e.dropComplete(true);
        setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
      }
      catch(UnsupportedFlavorException e1)
      {
        // TODO Auto-generated catch block
        e1.printStackTrace();
      }
      catch(IOException e1)
      {
        // TODO Auto-generated catch block
        e1.printStackTrace();
      }
    }
    else if(t.isDataFlavorSupported(DataFlavor.stringFlavor))
    {
      e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
      try
      {
        String dropS = (String)t.getTransferData(DataFlavor.stringFlavor);
        this.replaceSelection(dropS);
        e.dropComplete(true);
      }
      catch (Exception ex) {}
    }
    else
    {
      e.rejectDrop();
      return;
    }
    return;
  }

  public void dragOver(DropTargetDragEvent e) 
  {
    if(e.isDataFlavorSupported(DataFlavor.stringFlavor) ||
       e.isDataFlavorSupported(DatabaseTreeNode.DATABASETREENODE))
      e.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
  }
  public void dropActionChanged(DropTargetDragEvent e) {}

  public DatabaseTreeNode getDbNode()
  {
    return dbNode;
  }
}




