package oracle.forms.fd;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import oracle.forms.engine.Main;
import oracle.forms.ui.CustomEvent;
import oracle.forms.ui.VBean;
import oracle.forms.handler.IHandler;
import oracle.forms.properties.ID;

    /**
     * A Java Bean that returns each key pressed
     * in TextFields and TextAreas 
     * 
     * @author Francois Degrelle
     * @version 1.0
     *
     */

    public class KeyPressed   extends VBean
    {

      private static final ID INIT              = ID.registerProperty("INIT");   
      private static final ID KEYTYPED          = ID.registerProperty("KEY_PRESSED");   
      private static final ID KEYCODE           = ID.registerProperty("KEY_CODE");   
      private static final ID KEYCHAR           = ID.registerProperty("KEY_CHAR");   
      private static final ID KEYMOD            = ID.registerProperty("KEY_MODIFIER");         
      
      private   IHandler    m_handler; 
      private   boolean     bLog = false ;
      private   boolean     bImg = false ;
      private   KeyListener kl ;     
      public    Main         formsMain = null;
      private   char        cChar ;
      private   int         iModifier = 0 ;
      private   String      sModifier = "" ;      
      
      
      public KeyPressed()
      {
         super();
      }
       
      public void init(IHandler handler)
      {
        m_handler = handler;
        super.init(handler);
        setKeyListener();
        formsMain  =  (Main) m_handler.getApplet();
      }     
  
 
      /**----------------------------------*
       *  set the properties of the bean   *
       *-----------------------------------*/
      public boolean setProperty(ID property, Object value)
      {
        if(property == INIT)
        {
          getTextItems(formsMain.getFrame(),0);
          return true ;
        }        
        else
        {
         return super.setProperty(property, value);
        }
      }

  
  public void log( String sMessage )
  {
    if( bLog) System.out.println( sMessage ) ;
  }   


  /*-------------------------------------
   *   Find all TexField and TextArea
   *   to add a Key Listener
   *------------------------------------*/
  protected void getTextItems(Component component, int iter)
  {    
      if (component.getClass().getName().equals("oracle.forms.ui.VTextField"))
       {
        oracle.forms.ui.VTextField vt = (oracle.forms.ui.VTextField)component ;
        vt.addKeyListener(kl);
       }
      else if (component.getClass().getName().equals("oracle.forms.ui.VTextArea"))
       {
        oracle.forms.ui.VTextArea ta = (oracle.forms.ui.VTextArea)component ;
        ta.addKeyListener(kl);
       }     
    if (component instanceof Container)
        { 
        Component components[] = ((Container)component).getComponents(); 
        iter++;
        for (int i = 0; i < components.length; i++)
            { if (components[i] != null)
                 { getTextItems(components[i],iter);}
            }
         }
  }

   /*---------------------------------------*
    *   create a KeyListener for the items
    *---------------------------------------*/
   void setKeyListener()
   {
        kl = new KeyListener(){
	       public void keyPressed(KeyEvent e) {
            // get the code
            int iKey = e.getKeyCode() ;
            // get the character
            cChar = e.getKeyChar() ;
            // get the modifier
            iModifier = e.getModifiers();
            sModifier = KeyEvent.getKeyModifiersText(iModifier);
            /*
             * Inform Forms that a character was typed
             */

             try{
               m_handler.setProperty(KEYCODE, ""+iKey);
               m_handler.setProperty(KEYCHAR, ""+cChar);
               m_handler.setProperty(KEYMOD, sModifier);
               CustomEvent ce = new CustomEvent(m_handler, KEYTYPED);
               dispatchCustomEvent(ce);                 
             }
             catch (Exception ex) 
              {
                System.out.println("DispatchKeyEvent -> exception while dispatching");
                //ex.printStackTrace();                
              }           
             switch(iKey)
             {
                case KeyEvent.VK_BACK_SPACE:
                case KeyEvent.VK_TAB:
                case KeyEvent.VK_CANCEL:
                case KeyEvent.VK_CLEAR:
                case KeyEvent.VK_SHIFT:
                case KeyEvent.VK_CONTROL:
                case KeyEvent.VK_ALT:
                case KeyEvent.VK_PAUSE:
                case KeyEvent.VK_CAPS_LOCK:
                case KeyEvent.VK_ESCAPE:
                case KeyEvent.VK_PAGE_UP:
                case KeyEvent.VK_PAGE_DOWN:
                case KeyEvent.VK_UP:
                case KeyEvent.VK_DOWN:
                case KeyEvent.VK_F1:
                case KeyEvent.VK_F2:
                case KeyEvent.VK_F3:
                case KeyEvent.VK_F4:
                case KeyEvent.VK_F5:
                case KeyEvent.VK_F6:
                case KeyEvent.VK_F7:
                case KeyEvent.VK_F8:
                case KeyEvent.VK_F9:
                case KeyEvent.VK_F10:
                case KeyEvent.VK_F11:
                case KeyEvent.VK_F12:            
                case KeyEvent.VK_F13:
                case KeyEvent.VK_F14:
                case KeyEvent.VK_F15:
                case KeyEvent.VK_F16:
                case KeyEvent.VK_F17:
                case KeyEvent.VK_F18:            
                case KeyEvent.VK_F19:
                case KeyEvent.VK_F20:
                case KeyEvent.VK_F21:
                case KeyEvent.VK_F22:
                case KeyEvent.VK_F23:
                case KeyEvent.VK_F24:                        
                try
                   {
                     m_handler.setProperty(KEY_EVENT, e);
                   }
                catch ( Exception ex ){ System.out.println("Unable to send key to Forms");}                        
             }
              if(e.getSource().getClass().getName().equals("oracle.forms.ui.VTextField") && iKey==KeyEvent.VK_ENTER)                 
              {
                try
                   {
                     m_handler.setProperty(KEY_EVENT, e);
                   }
                catch ( Exception ex ){ System.out.println("Unable to send key to Forms");}                        
              }
           }
           public void keyReleased(KeyEvent e) {
           }
           public void keyTyped(KeyEvent e) {
           }
        };             
   }    

}     
