package oracle.forms.fd;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
import javax.swing.event.ChangeListener;
import oracle.ewt.event.AnyEventListener;
import oracle.forms.engine.Main;
import org.jdesktop.jdic.browser.WebBrowser;
import org.jdesktop.jdic.browser.WebBrowserListener;
import org.jdesktop.jdic.browser.*;
import java.awt.*;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.*;
import oracle.forms.handler.IHandler;
import oracle.forms.ui.*;
import oracle.forms.properties.ID;

  /**
   * A Bean to display a full Web Browser
   *
   * @author Francois Degrelle
   * @version 1.0
   */
   
public class EnhancedHTMLBrowser extends VBean {
    //
    protected static final ID pSetUrl        = ID.registerProperty("SET_URL");
    protected static final ID pSetBorder     = ID.registerProperty("SET_BORDER");    
    protected static final ID pSetNavigation = ID.registerProperty("SET_NAVIGATION");     
    protected static final ID pInfoBean      = ID.registerProperty("INFOBEAN");        
    private   oracle.forms.ui.ExtendedFrame ef ;
    private   IHandler      m_handler;  
    private   WebBrowser webBrowser;
    private   JPanel panel;
    private   WebBrowserListener wbListener;
    private   ChangeListener chListener;
    private   Main         formsMain = null;
    private   int  x,y,w,h ;
    

    public void init(IHandler handler)
        {
          super.init(handler);   
          m_handler = handler;
          webBrowser.setBounds(x,y,w,h);
        }
        
    public EnhancedHTMLBrowser() {
        super();
        webBrowser = new WebBrowser();
        Rectangle rec = this.getBounds() ;
        x = (int)rec.getX() ;
        y = (int)rec.getY() ;
        w = (int)rec.getWidth() ;
        h = (int)rec.getHeight() ;
        panel = new JPanel();
        panel.setLayout(new BorderLayout());
        panel.setPreferredSize(this.getPreferredSize());
        panel.add(webBrowser, BorderLayout.CENTER);
        webBrowser.setVisible(false);
        add(panel);

    }


  /******************
   *  Set the URL   *
   *****************/
  public boolean setProperty(ID pId, Object pValue)
  {
    if (pId == pSetUrl) // set the url
    {
      URL url = null ;
      String s = (String)pValue ;
      webBrowser.setVisible(true);
      webBrowser.setBounds(x,y,w,h);
        try {
        	if(! s.startsWith("http"))
          {
            File f = new File(s);
        	  url = new URL("file:///"+f.getAbsolutePath());
          }
          else if( s.startsWith("http"))
          {
            url = new URL(s);
          }
        	else
            System.out.println("protocole not recognized : "+s);
            
        	System.out.println(url);
        	webBrowser.setURL(url);

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
      return true;
    }   
    else if (pId == pSetBorder) // set the url
    {
      String s = (String)pValue ;
      System.out.println("Set Border="+s);
      if(s.equalsIgnoreCase("false"))
      {
        Border emptyBorder = BorderFactory.createEmptyBorder(0, 0, 0, 0);
        panel.setBorder(emptyBorder);
      }
      else if(s.equalsIgnoreCase("true"))
      {
        Border border = BorderFactory.createEtchedBorder() ;
        panel.setBorder(border);
      }      
      return true;
    }
    /***********************
     *  Navigation action  *
     **********************/
    else if (pId == pSetNavigation) // set the navigation action
    {
      String s = (String)pValue ;
      System.out.println("Navigation="+s);
      if(s.equalsIgnoreCase("back")) webBrowser.back();
      else if(s.equalsIgnoreCase("forward")) webBrowser.forward();
      else if(s.equalsIgnoreCase("refresh")) webBrowser.refresh();
      return true;
    }             
    /********************************************
     *   get the window that handle the bean    *
     *******************************************/
    else if (pId == pInfoBean)
    {
      boolean bCont  = true ;    
      Container cont = this.getParent();
      String s = "" ;
      while (cont!=null)
      {
        // search for the window
        s = "" + cont.getClass() ;
        if(s.indexOf("oracle.forms.ui.ExtendedFrame")>-1)
        {
          /*********************
           *   current window  *
           ********************/
          ef = (oracle.forms.ui.ExtendedFrame)cont ;
          System.out.println("------> ExtendedFrame title : "+ef.getTitle());
          // add the listener to the window
          ef.addAnyEventListener(ael);
        }
        cont = cont.getParent() ;
      }
      return true;
    }            
    else
    {
      return super.setProperty(pId, pValue);
    }
  } 
   
   void getRect()
   {
        Rectangle rec = this.getBounds() ;
        x = (int)rec.getX() ;
        y = (int)rec.getY() ;
        w = (int)rec.getWidth() ;
        h = (int)rec.getHeight() ;             
   }

    AnyEventListener ael  = new AnyEventListener() {
      public void actionPerformed(ActionEvent actionEvent) {
        String keyText = actionEvent.getActionCommand();
      }
      public void processEventStart(java.util.EventObject eo) {
        String keyText = eo.toString() ;
        if(keyText.indexOf("COMPONENT_MOVED")> -1)
        {
          getRect();
          webBrowser.setBounds(x,y,w,h);
        }
      }          
      public void processEventEnd(java.util.EventObject eo) {
        String keyText = eo.toString() ;
      }      
    };

}
