package oracle.forms.fd;

import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
import java.util.StringTokenizer;
import javax.swing.ImageIcon;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import oracle.forms.handler.IHandler;
import oracle.forms.ui.FormMouseGrabProvider;
import oracle.forms.ui.VBean;
import oracle.forms.properties.ID;
import oracle.forms.ui.CustomEvent;
import oracle.forms.engine.Main;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

  /**
   * A Bean to handle window frames at runtime
   *
   * @author Francois Degrelle
   * @version 1.1
   */
   
public class FormFrame extends VBean
{
  // variables
  public final static ID InfoBean       = ID.registerProperty("INFO");      
  public final static ID setProp        = ID.registerProperty("SET");        
  public final static ID setResizeMDI   = ID.registerProperty("SET_RESIZE_MDI");          
  public final static ID setIcon        = ID.registerProperty("SETICON");          
  public final static ID setOnTop       = ID.registerProperty("SETONTOP");          
  public final static ID setMax         = ID.registerProperty("SETMAXSIZE");  
  private IHandler    m_handler;  
  private oracle.forms.ui.ExtendedFrame ef ;
  private oracle.ewt.swing.JBufferedFrame jb ;
  private Main        formsMain = null;   // Forms main class  
      
  public void init(IHandler handler)
  {
    m_handler = handler;
    super.init(handler);
    try
    {
      UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
      SwingUtilities.updateComponentTreeUI(this);
    }
    catch (Exception ex)
    {
      ex.printStackTrace();
    } 
  }  

  
  /**********************************
   *  Set some standard properties  *
   *********************************/
  public boolean setProperty(ID property, Object value)
  {
    /****************************
     *  set several properties  *
     ***************************/
    if (property == setProp)   
    {
      String s="", sProp="", sFlag="" ;
      boolean bFlag = false ;
      s = value.toString();
      StringTokenizer st = new StringTokenizer(s,",");
      sProp      = st.nextToken() ;
      if (st.hasMoreTokens())
        sFlag      = st.nextToken() ;
      if(sFlag.equalsIgnoreCase("true"))
        bFlag = true ;
      if(sProp.equalsIgnoreCase("move"))    ef.setMovable(bFlag);
      if(sProp.equalsIgnoreCase("close"))   ef.setClosable(bFlag);
      if(sProp.equalsIgnoreCase("max"))     ef.setMaximizable(bFlag);
      if(sProp.equalsIgnoreCase("min"))     ef.setMinimizable(bFlag);
      if(sProp.equalsIgnoreCase("size"))    ef.setResizable(bFlag);
      if(sProp.equalsIgnoreCase("disable")) ef.disable(); 

      return true ;
    }
    else if (property == setResizeMDI)   
    {
      String s = value.toString();
      if(s.equalsIgnoreCase("true")) jb.setResizable(true);
      else jb.setResizable(false);

      return true ;
    }
    /**********************
     * set the frame icon *
     *********************/
    else if (property == setIcon)    
    {
      String s="", sWin="", sIcon="" ;
      s = value.toString();
      StringTokenizer st = new StringTokenizer(s,",");
      sWin      = st.nextToken() ;
      sIcon     = st.nextToken() ;
      if(sWin.equalsIgnoreCase("MDI"))
      {
        ImageIcon icon = new ImageIcon(loadImage(sIcon));
        jb.setIconImage(icon.getImage());
      }
      else
        {
          ImageIcon icon = new ImageIcon(loadImage(sIcon));
          ef.setIcon(icon.getImage());     
        }      
      return true ;
    }
    
    /*****************************************
     * set MDI window always on top (SE 5.0) *
     ****************************************/
    /*
    else if (property == setOnTop)    
    {
      jb.setAlwaysOnTop(true);    
      return true ;      
    }
    */
    /****************************************
     * set the MDI in maximum size (SE 4.0) *
     ***************************************/
    if (property == setMax)   
    {
      String s = value.toString();
      System.out.println("SETMAXIMIZE : "+s) ;      
      if(s.equalsIgnoreCase("true"))
         jb.setExtendedState(Frame.MAXIMIZED_BOTH);
      else
         jb.setExtendedState(Frame.NORMAL);      
      return true ;
    }       
    /********************************************
     *  get the frames handle and display info  *
     *******************************************/
    else if (property == InfoBean)
    {
      boolean bCont  = true ;
      System.out.println("------------------------") ;      
      System.out.println("-- Layers found --") ;      
      System.out.println("------------------------") ;      
      Container cont = this.getParent();
      String s = "" ;
      while (cont!=null)
      {
        // output the layer hierarchy
        s = "" + cont.getClass() ;
        System.out.println("--> "+cont.getName()+" ["+s+"]") ;
        if(s.indexOf("oracle.forms.ui.ExtendedFrame")>-1)
        {
          /*********************
           *   current window  *
           ********************/
          ef = (oracle.forms.ui.ExtendedFrame)cont ;
          System.out.println("------> ExtendedFrame title : "+ef.getTitle());
          ef.setToolTipValue("Tooltip");
        }
        if(s.indexOf("JBufferedFrame")>-1)
        {
          /****************
           *   MDI frame  *
           ***************/
           jb = (oracle.ewt.swing.JBufferedFrame)cont ;
           System.out.println("------> JBufferedFrame title : "+jb.getTitle());
           // Get the size of the default screen
           // and center the frames
           Dimension dimScreen = Toolkit.getDefaultToolkit().getScreenSize();
           int xMdi=0, yMdi=0, xWin=0, yWin=0 ;
           xMdi = (int)dimScreen.getWidth()/2 ;
           yMdi = (int)dimScreen.getHeight()/2 ;
           if( ef != null )
           {
             Dimension dimWin = ef.getSize() ;          
             xWin = (int)dimWin.getWidth()/2 ;
             yWin = (int)dimWin.getHeight()/2 ;   
             jb.setLocation(xMdi-(jb.getWidth()/2),yMdi-jb.getHeight()/2);
             ef.setLocation((jb.getWidth()/2)-xWin,(jb.getHeight()/2)-yWin);          
           }
        }        
        cont = cont.getParent() ;
      }
      return true;
    }        
    else
    {
     return super.setProperty(property, value);
    }
  }  

  /************************
   *  Get the properties  *
   ***********************/
   public Object getProperty(ID pId)
   {
     return super.getProperty(pId);
   } 

  /*********************************************
   *  Load an image from the current JAR file  *
   ********************************************/
  private Image loadImage(String imageName)
   {
     URL imageURL = null;
     boolean loadSuccess = false;
     Image img = null ;

     imageURL = getClass().getResource(imageName);
     if (imageURL != null)
     {
       try
       {
         img = Toolkit.getDefaultToolkit().getImage(imageURL);
         loadSuccess = true;
       }
       catch (Exception ilex)
       {
         System.out.println("Error loading image from JAR: " + ilex.toString());
       }
     }
     else
     {
       System.out.println("Unable to find " + imageName + " in JAR");
     }
     return img ;
   }
  
    ActionListener actionListener = new ActionListener() {
      public void actionPerformed(ActionEvent actionEvent) {
        String keyText = actionEvent.getActionCommand();
        System.out.println(keyText);
      }
    };
  
}
