Package test.shared

Source Code of test.shared.TestIFrameBoundHTML

/*
* OnClickFireEventFromServerTest.java
*
* Created on 6 de agosto de 2007, 15:19
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/

package test.shared;


import java.io.Serializable;
import java.lang.reflect.Method;
import org.itsnat.core.ClientDocument;
import org.itsnat.core.ItsNatDocument;
import org.itsnat.core.ItsNatNode;
import org.itsnat.core.event.ItsNatEvent;
import org.itsnat.core.event.ItsNatUserEvent;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.Text;
import org.w3c.dom.events.Event;
import org.w3c.dom.events.EventListener;
import org.w3c.dom.events.EventTarget;
import org.w3c.dom.html.HTMLIFrameElement;

/**
*
* @author jmarranz
*/
public class TestIFrameBoundHTML implements EventListener,Serializable
{
    protected ItsNatDocument itsNatDoc;
    protected HTMLIFrameElement iframe;

    /** Creates a new instance of TestIFrameInsertion */
    public TestIFrameBoundHTML(ItsNatDocument itsNatDoc)
    {
        this.itsNatDoc = itsNatDoc;
        load();
    }

    public void load()
    {
        final Document doc = itsNatDoc.getDocument();
        this.iframe = (HTMLIFrameElement)doc.getElementById("testIFrameBoundId");

        itsNatDoc.addUserEventListener(null,"update",this);

        Element reinsertElem = doc.getElementById("testIFrameBoundReinsertId");

        EventListener reinsListener = new EventListenerSerial()
        {
            public void handleEvent(Event evt)
            {
                removeButton(); // Por si estuviera arriba de una prueba

                HTMLIFrameElement newIFrame = (HTMLIFrameElement)iframe.cloneNode(true); // El objeto "bind" interno obviamente NO se clonar�
                Node parentNode = iframe.getParentNode();
                parentNode.replaceChild(newIFrame, iframe);

                iframe = newIFrame;
            }
        };
        ((EventTarget)reinsertElem).addEventListener("click",reinsListener,false);

        Element changeSrcElem = doc.getElementById("testIFrameBoundChangeSrcId");

        EventListener changeSrcListener = new EventListenerSerial()
        {
            public void handleEvent(Event evt)
            {
                removeButton(); // Por si estuviera arriba de una prueba

                String src = iframe.getSrc();
                iframe.setSrc("http://www.google.com"); // Hace perder el actual
                iframe.setSrc(src); // Restauramos
            }
        };
        ((EventTarget)changeSrcElem).addEventListener("click",changeSrcListener,false);

        Element checkServerElem = doc.getElementById("testIFrameBoundCheckServerId");

        EventListener checkServerListener = new EventListenerSerial()
        {
            public void handleEvent(Event evt)
            {
                // Para actualizar el cliente. Util en full remote control
            }
        };
        ((EventTarget)checkServerElem).addEventListener("click",checkServerListener,false);
    }

    public void handleEvent(Event evt)
    {
        if (evt instanceof ItsNatUserEvent) // Button received
        {
            prepareButtonToSend();
        }
        else // Button clicked
        {
            sendToIFrame(evt);
        }
    }

    public void prepareButtonToSend()
    {
        Document doc = itsNatDoc.getDocument();
        Element button = doc.getElementById("buttonId");

        Text text = (Text)button.getFirstChild();
        text.setData("Send to IFrame");

        ((EventTarget)button).addEventListener("click",this,false);
    }

    public void sendToIFrame(Event evt)
    {
        Element button = removeButton();

        Document iframeDoc;
        try
        {
            iframeDoc = iframe.getContentDocument();
        }
        catch(NoSuchMethodError ex) // Cause: Xerces compatibility package of Tomcat 5.5
        {
            try
            {
                Method method = iframe.getClass().getMethod("getContentDocument",(Class[])null); // El cast es para evitar un warnning en Java 1.5+
                iframeDoc = (Document)method.invoke(iframe,(Object[])null);
            }
            catch(Exception ex2) { throw new RuntimeException(ex2); }
        }

        ItsNatDocument iframeItsNatDoc = ((ItsNatNode)iframeDoc).getItsNatDocument(); // This method is multithread
        if (iframeItsNatDoc == null)
        {
            itsNatDoc.addCodeToSend("alert('Not loaded yet');");
            return;
        }

        synchronized(iframeItsNatDoc) // NEEDED
        {
            Element buttonInParent = (Element)iframeDoc.importNode(button,true);
            Element contElem = iframeDoc.getElementById("testIFrameChildPutHereId");
            contElem.appendChild(buttonInParent);

            // Notify child document
            String ref = itsNatDoc.getScriptUtil().getNodeReference(iframe);
            StringBuilder code = new StringBuilder();
            code.append("var elem = " + ref + ";");
            code.append("var doc = elem.contentDocument ? elem.contentDocument : elem.contentWindow.document;"); // contentWindow in MSIE
            code.append("doc.getItsNatDoc().fireUserEvent(null,'update');");

            ClientDocument clientDoc = ((ItsNatEvent)evt).getClientDocument();
            clientDoc.addCodeToSend(code.toString());
        }
    }

    public Element removeButton()
    {
        Document doc = itsNatDoc.getDocument();
        Element button = doc.getElementById("buttonId");
        if (button == null) return null;
        ((EventTarget)button).removeEventListener("click",this,false);
        button.getParentNode().removeChild(button);
        return button;
    }
}
TOP

Related Classes of test.shared.TestIFrameBoundHTML

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.