package oracle.forms.fd;

import java.awt.Component;
import java.awt.Cursor;
import java.awt.event.InputEvent;

import oracle.forms.handler.IHandler;
import oracle.forms.ui.FormMouseGrabProvider;
import oracle.forms.ui.VBean;
import oracle.forms.engine.Main;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

/**
   * A Bean to allow drag and drop
   * with text fields, text areas and images
   *
   * @author Francois Degrelle
   * @version 1.0
   */
   
public class DnD extends VBean
{
  // variables

  private IHandler     m_handler;  
  private Main         formsMain = null;
  private boolean      bDrag = false ;
  private boolean      bDragMove = true ;
  private int          iStatus = 0 ;
  private Component    cpSource=null;
  private String       sSourceType = "" ;
  private String       sTargetType = "" ;
  
  public void init(IHandler handler)
  {
    m_handler = handler;
    super.init(handler);
    formsMain  =  (Main) handler.getApplet();
    _addMouseListeners(formsMain.getCursorGrabProvider());
  }  
  
    public void _addMouseListeners (FormMouseGrabProvider c)
    {
      c.addMouseMotionGrab(new MouseMotionListener(){

      public void mouseMoved(MouseEvent me)
      {
        if(iStatus==2)
        {
          Component cp = me.getComponent();
          sTargetType = cp.getClass().getName() ;
          System.out.println("source="+sSourceType);
          System.out.println("target="+sTargetType);
          iStatus = 0 ;
          bDrag = false ;
          /* 1.4
          int ctrlmask = InputEvent.CTRL_DOWN_MASK;
          if (me.getModifiersEx()  == ctrlmask) bDragMove = false ;
          */
          // 1.3
          int ctrlmask = 2 ;
          if (me.getModifiers()  == ctrlmask) bDragMove = false ;

          cpSource.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
          /*
           * VTextArea
           */
          if(sTargetType.startsWith("oracle.ewt.lwAWT.lwText.LWTextArea"))
          {
            cpSource.setCursor(new Cursor(Cursor.TEXT_CURSOR));
            // target object
            if(sTargetType.equals(sSourceType))
            {
              oracle.ewt.lwAWT.lwText.LWTextArea vts = (oracle.ewt.lwAWT.lwText.LWTextArea)cpSource ;
              oracle.ewt.lwAWT.lwText.LWTextArea vtc = (oracle.ewt.lwAWT.lwText.LWTextArea)me.getComponent() ;
              vtc.setText(vts.getText());
              if(bDragMove) vts.setText("");
            }
            else if(sSourceType.equals("oracle.forms.ui.VTextField"))
            {
              oracle.forms.ui.VTextField vts = (oracle.forms.ui.VTextField)cpSource ;
              oracle.ewt.lwAWT.lwText.LWTextArea vtc = (oracle.ewt.lwAWT.lwText.LWTextArea)me.getComponent() ;
              vtc.setText(vts.getText());   
              if(bDragMove) vts.setText("");
            }
          }          
          /*
           * VTextField
           */
          else if(sTargetType.startsWith("oracle.forms.ui.VTextField"))
          {
            if(sTargetType.equals(sSourceType))
            {
              oracle.forms.ui.VTextField vts = (oracle.forms.ui.VTextField)cpSource ;
              oracle.forms.ui.VTextField vtc = (oracle.forms.ui.VTextField)me.getComponent() ;
              vtc.setText(vts.getText());
              if(bDragMove) vts.setText("");
            }
            else if(sSourceType.equals("oracle.ewt.lwAWT.lwText.LWTextArea"))
            {
              oracle.ewt.lwAWT.lwText.LWTextArea vts = (oracle.ewt.lwAWT.lwText.LWTextArea)cpSource ;
              oracle.forms.ui.VTextField vtc = (oracle.forms.ui.VTextField)me.getComponent() ;
              vtc.setText(vts.getText());
              if(bDragMove) vts.setText("");
            }            
            
          }    
          /*
           * Image
           */
          else if(sTargetType.startsWith("oracle.ewt.imageCanvas.ScalingImageCanvas"))
          {
            if(sTargetType.equals(sSourceType))
            {
              oracle.ewt.imageCanvas.ScalingImageCanvas vts = (oracle.ewt.imageCanvas.ScalingImageCanvas)cpSource ;
              oracle.ewt.imageCanvas.ScalingImageCanvas vtc = (oracle.ewt.imageCanvas.ScalingImageCanvas)me.getComponent() ;
              vtc.setImage(vts.getImage());
              if(bDragMove) vts.setImage(null);
            }
          }          

        }
      }
      public void mouseDragged(MouseEvent me)
      {
        cpSource = me.getComponent() ;
        sSourceType = me.getComponent().getClass().getName() ;
        if( !bDrag ) 
        { 
             bDrag = true ; 
             iStatus = 1 ; 
             bDragMove = true ;
             me.getComponent().setCursor(new Cursor(Cursor.MOVE_CURSOR));
        }
      }
    });

    c.addMouseGrab(new MouseListener(){

        public void mouseExited(MouseEvent me)
        {
        }
        public void mouseEntered(MouseEvent me)
        {
        }
        public void mousePressed(MouseEvent me)
        {
        }
        public void mouseReleased(MouseEvent me)
        {
          if(bDrag) 
          {
            iStatus = 2 ;
          }
        }
        public void mouseClicked(MouseEvent me)
        {
        }
    });
  }  

}

