Package org.itsnat.impl.comp

Source Code of org.itsnat.impl.comp.ItsNatHTMLFormCompChangeBasedSharedImpl

/*
  ItsNat Java Web Application Framework
  Copyright (C) 2007-2011 Jose Maria Arranz Santamaria, Spanish citizen

  This software is free software; you can redistribute it and/or modify it
  under the terms of the GNU Lesser General Public License as
  published by the Free Software Foundation; either version 3 of
  the License, or (at your option) any later version.
  This software is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  Lesser General Public License for more details. You should have received
  a copy of the GNU Lesser General Public License along with this program.
  If not, see <http://www.gnu.org/licenses/>.
*/

package org.itsnat.impl.comp;

import java.io.Serializable;
import org.itsnat.core.event.ItsNatEvent;
import org.itsnat.impl.comp.listener.ItsNatCompDOMListenersByClientImpl;
import org.itsnat.impl.core.browser.Browser;
import org.itsnat.impl.core.browser.webkit.BrowserWebKit;
import org.itsnat.impl.core.clientdoc.ClientDocumentImpl;
import org.itsnat.impl.core.event.server.ServerItsNatDOMEventImpl;
import org.w3c.dom.events.Event;
import org.w3c.dom.html.HTMLElement;

/**
*
* @author jmarranz
*/
public abstract class ItsNatHTMLFormCompChangeBasedSharedImpl implements Serializable
{
    protected ItsNatHTMLFormCompChangeBased comp;

    public ItsNatHTMLFormCompChangeBasedSharedImpl(ItsNatHTMLFormCompChangeBased comp)
    {
        this.comp = comp;
    }

    public ItsNatHTMLFormComponentImpl getItsNatHTMLFormComponent()
    {
        return (ItsNatHTMLFormComponentImpl)comp;
    }

    public void init()
    {
    }

    public boolean isChangeEvent(String type,ClientDocumentImpl clientDoc)
    {
        if (type.equals("change"))
        {
            if (isIgnoreChangeEvent(clientDoc)) return false;
            else return true;
        }
        else if (type.equals("blur"))
        {
            if (isBlurIsChangeEvent(clientDoc)) return true;
            else return false;
        }

        return false;
    }

    public boolean isChangeEvent(Event evt)
    {
        String type = evt.getType();
        if ((evt instanceof ServerItsNatDOMEventImpl) && type.equals("blur"))
            return false; // Al ser generado desde el servidor, el programador deber� lanzar primero el change y luego el blur, es decir, hacerlo BIEN, hay que tener en cuenta que con el evento del blur no habr� un par�metro "value" con el texto

        ClientDocumentImpl clientDoc = (ClientDocumentImpl)((ItsNatEvent)evt).getClientDocument();
        return isChangeEvent(type,clientDoc);
    }

    public void enableEventListenersByDoc()
    {
        ItsNatHTMLFormComponentImpl comp = getItsNatHTMLFormComponent();
        comp.enableEventListener("change");
    }

    public void enableEventListenersByClient(ItsNatCompDOMListenersByClientImpl clientListeners)
    {
        if (isBlurIsChangeEvent(clientListeners.getClientDocument()))
        {
            ItsNatHTMLFormComponentImpl comp = getItsNatHTMLFormComponent();
            comp.enableEventListener("blur",clientListeners);
        }
    }

    public void processDOMEvent(Event evt)
    {
        if (isChangeEvent(evt))
        {
            // Ejecutado como respuesta al evento "change" en el navegador

            comp.handleEventOnChange(evt);

            // Oportunidad para los componentes derivados
            // de modificar el DOM en el servidor para que se manifieste
            // en el cliente pues no est� en modo "server updating from client",
            // por ejemplo para rechazar el cambio y restaurar el valor original
            // propagando al cliente.
            // El usuario puede hacer esto con un listener normal, pero necesitamos
            // ejecutar antes el posible rechazo antes de que se ejecuten los listeners
            // del usuario para que el usuario vea ya el DOM con el valor rechazado

            comp.postHandleEventOnChange(evt);
        }
    }

    public boolean isBlurIsChangeEvent(ClientDocumentImpl clientDoc)
    {
        // En el caso de blur lanzado antes que el change hacemos que
        // el blur sea como un change actualizando el servidor
        // desde el cliente.
        // Esto es muy �til en componentes editores "inplace"
        // pues el blur da la orden de quitar el elemento del �rbol (se quitar�a sin actualizar el servidor evitando lanzar el change).
        // Este problema ocurre (o nos importa) en <textarea> y en <input type="text|password|file"> (y en un caso especial de <select>),
        // es decir en los componentes asociados a este objeto "shared, en varios navegadores.
        // No es necesario obviamente en "hidden" pero en ese caso los eventos nunca se lanza.

        // Tambi�n se ha comprobado la necesidad de considerar blur como change en el caso de InputTextFormatted
        // cuando al editar cambia el formato (ej. en una fecha) tal que el blur
        // (que lo normal es que se ejecutara despu�s del change) cambia el formato
        // sin esto el blur restaura el formato del campo y se enviar�a despu�s via change
        // el valor en el formato inesperado (no el de edici�n). El change en estos casos es posible
        // que de error (valor rechazado) pero al menos el blur ha puesto el valor bueno, o bien el valor
        // se define dos veces.

        HTMLElement elem = comp.getHTMLElement();
        Browser browser = clientDoc.getBrowser();
        if (browser.isBlurBeforeChangeEvent(elem))
            return true;
        else if ((browser instanceof BrowserWebKit) && ((BrowserWebKit)browser).isChangeEventNotFiredUseBlur(elem))
            return true;
        return false;
    }

    public abstract boolean isIgnoreChangeEvent(ClientDocumentImpl clientDoc);

}
TOP

Related Classes of org.itsnat.impl.comp.ItsNatHTMLFormCompChangeBasedSharedImpl

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.