Package org.itsnat.impl.comp.mgr

Source Code of org.itsnat.impl.comp.mgr.ItsNatStfulDocComponentManagerImpl

/*
  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.mgr;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.WeakHashMap;
import org.itsnat.comp.ItsNatComponent;
import org.itsnat.comp.ItsNatHTMLComponentManager;
import org.itsnat.comp.ItsNatHTMLForm;
import org.itsnat.comp.button.normal.ItsNatHTMLAnchor;
import org.itsnat.comp.button.normal.ItsNatHTMLAnchorLabel;
import org.itsnat.comp.button.normal.ItsNatHTMLButton;
import org.itsnat.comp.button.normal.ItsNatHTMLButtonLabel;
import org.itsnat.comp.button.normal.ItsNatHTMLInputButton;
import org.itsnat.comp.button.normal.ItsNatHTMLInputImage;
import org.itsnat.comp.button.normal.ItsNatHTMLInputReset;
import org.itsnat.comp.button.normal.ItsNatHTMLInputSubmit;
import org.itsnat.comp.button.toggle.ItsNatHTMLInputCheckBox;
import org.itsnat.comp.button.toggle.ItsNatHTMLInputRadio;
import org.itsnat.comp.iframe.ItsNatHTMLIFrame;
import org.itsnat.comp.label.ItsNatHTMLLabel;
import org.itsnat.comp.label.ItsNatLabelEditor;
import org.itsnat.comp.list.ItsNatHTMLSelectComboBox;
import org.itsnat.comp.list.ItsNatHTMLSelectMult;
import org.itsnat.comp.list.ItsNatListCellEditor;
import org.itsnat.comp.table.ItsNatHTMLTable;
import org.itsnat.comp.table.ItsNatTableCellEditor;
import org.itsnat.comp.table.ItsNatTableStructure;
import org.itsnat.comp.text.ItsNatHTMLInputFile;
import org.itsnat.comp.text.ItsNatHTMLInputHidden;
import org.itsnat.comp.text.ItsNatHTMLInputPassword;
import org.itsnat.comp.text.ItsNatHTMLInputText;
import org.itsnat.comp.text.ItsNatHTMLInputTextFormatted;
import org.itsnat.comp.text.ItsNatHTMLTextArea;
import org.itsnat.comp.tree.ItsNatTreeCellEditor;
import org.itsnat.core.NameValue;
import org.itsnat.impl.comp.ItsNatComponentImpl;
import org.itsnat.impl.comp.ItsNatHTMLFormImpl;
import org.itsnat.impl.comp.factory.FactoryItsNatComponentImpl;
import org.itsnat.impl.comp.factory.FactoryItsNatHTMLComponentImpl;
import org.itsnat.impl.comp.factory.FactoryItsNatHTMLFormImpl;
import org.itsnat.impl.comp.factory.FactoryItsNatHTMLIFrameImpl;
import org.itsnat.impl.comp.factory.FactoryItsNatHTMLInputImpl;
import org.itsnat.impl.comp.factory.button.normal.FactoryItsNatHTMLAnchorDefaultImpl;
import org.itsnat.impl.comp.factory.button.normal.FactoryItsNatHTMLAnchorLabelImpl;
import org.itsnat.impl.comp.factory.button.normal.FactoryItsNatHTMLButtonDefaultImpl;
import org.itsnat.impl.comp.factory.button.normal.FactoryItsNatHTMLButtonLabelImpl;
import org.itsnat.impl.comp.factory.button.normal.FactoryItsNatHTMLInputButtonImpl;
import org.itsnat.impl.comp.factory.button.normal.FactoryItsNatHTMLInputImageImpl;
import org.itsnat.impl.comp.factory.button.normal.FactoryItsNatHTMLInputResetImpl;
import org.itsnat.impl.comp.factory.button.normal.FactoryItsNatHTMLInputSubmitImpl;
import org.itsnat.impl.comp.factory.button.toggle.FactoryItsNatHTMLInputCheckBoxImpl;
import org.itsnat.impl.comp.factory.button.toggle.FactoryItsNatHTMLInputRadioImpl;
import org.itsnat.impl.comp.factory.label.FactoryItsNatHTMLLabelImpl;
import org.itsnat.impl.comp.factory.list.FactoryItsNatHTMLSelectImpl;
import org.itsnat.impl.comp.factory.table.FactoryItsNatHTMLTableImpl;
import org.itsnat.impl.comp.factory.text.FactoryItsNatHTMLInputFileImpl;
import org.itsnat.impl.comp.factory.text.FactoryItsNatHTMLInputHiddenImpl;
import org.itsnat.impl.comp.factory.text.FactoryItsNatHTMLInputPasswordImpl;
import org.itsnat.impl.comp.factory.text.FactoryItsNatHTMLInputTextDefaultImpl;
import org.itsnat.impl.comp.factory.text.FactoryItsNatHTMLInputTextFormattedImpl;
import org.itsnat.impl.comp.factory.text.FactoryItsNatHTMLTextAreaImpl;
import org.itsnat.impl.comp.label.ItsNatLabelEditorDefaultImpl;
import org.itsnat.impl.comp.layer.ItsNatModalLayerImpl;
import org.itsnat.impl.comp.list.ItsNatListCellEditorDefaultImpl;
import org.itsnat.impl.comp.table.ItsNatTableCellEditorDefaultImpl;
import org.itsnat.impl.comp.tree.ItsNatTreeCellEditorDefaultImpl;
import org.itsnat.impl.core.clientdoc.ClientDocumentAttachedClientImpl;
import org.itsnat.impl.core.doc.ItsNatStfulDocumentImpl;
import org.w3c.dom.Element;
import org.w3c.dom.html.HTMLAnchorElement;
import org.w3c.dom.html.HTMLButtonElement;
import org.w3c.dom.html.HTMLElement;
import org.w3c.dom.html.HTMLFormElement;
import org.w3c.dom.html.HTMLIFrameElement;
import org.w3c.dom.html.HTMLInputElement;
import org.w3c.dom.html.HTMLLabelElement;
import org.w3c.dom.html.HTMLSelectElement;
import org.w3c.dom.html.HTMLTableElement;
import org.w3c.dom.html.HTMLTextAreaElement;

/**
* Actualmente los namespaces con eventos no X/HTML como son SVG y XUL soportan
* XHTML embebido en los principales navegadores (FireFox, Opera, Chrome y Safari).
*
* @author jmarranz
*/
public abstract class ItsNatStfulDocComponentManagerImpl extends ItsNatDocComponentManagerImpl implements ItsNatHTMLComponentManager
{
    protected static final Map<String,FactoryItsNatHTMLComponentImpl> HTMLFACTORIES = new HashMap<String,FactoryItsNatHTMLComponentImpl>(); // No sincronizamos porque va a ser siempre usada en modo lectura

    static
    {
        addHTMLFactory(FactoryItsNatHTMLAnchorDefaultImpl.SINGLETON);
        addHTMLFactory(FactoryItsNatHTMLAnchorLabelImpl.SINGLETON);
        addHTMLFactory(FactoryItsNatHTMLButtonDefaultImpl.SINGLETON);
        addHTMLFactory(FactoryItsNatHTMLButtonLabelImpl.SINGLETON);
        addHTMLFactory(FactoryItsNatHTMLFormImpl.SINGLETON);
        addHTMLFactory(FactoryItsNatHTMLIFrameImpl.SINGLETON);
        addHTMLFactory(FactoryItsNatHTMLInputButtonImpl.SINGLETON);
        addHTMLFactory(FactoryItsNatHTMLInputCheckBoxImpl.SINGLETON);
        addHTMLFactory(FactoryItsNatHTMLInputFileImpl.SINGLETON);
        addHTMLFactory(FactoryItsNatHTMLInputHiddenImpl.SINGLETON);
        addHTMLFactory(FactoryItsNatHTMLInputImageImpl.SINGLETON);
        addHTMLFactory(FactoryItsNatHTMLInputPasswordImpl.SINGLETON);
        addHTMLFactory(FactoryItsNatHTMLInputRadioImpl.SINGLETON);
        addHTMLFactory(FactoryItsNatHTMLInputResetImpl.SINGLETON);
        addHTMLFactory(FactoryItsNatHTMLInputSubmitImpl.SINGLETON);
        addHTMLFactory(FactoryItsNatHTMLInputTextDefaultImpl.SINGLETON);
        addHTMLFactory(FactoryItsNatHTMLInputTextFormattedImpl.SINGLETON);
        addHTMLFactory(FactoryItsNatHTMLLabelImpl.SINGLETON);
        addHTMLFactory(FactoryItsNatHTMLSelectImpl.SINGLETON);
        addHTMLFactory(FactoryItsNatHTMLTableImpl.SINGLETON);
        addHTMLFactory(FactoryItsNatHTMLTextAreaImpl.SINGLETON);
    }

    protected LinkedList<ItsNatModalLayerImpl> modalLayers;

    /** Creates a new instance of ItsNatStfulDocComponentManagerImpl */
    public ItsNatStfulDocComponentManagerImpl(ItsNatStfulDocumentImpl itsNatDoc)
    {
        super(itsNatDoc);
    }

    protected static void addHTMLFactory(FactoryItsNatHTMLComponentImpl factory)
    {
        HTMLFACTORIES.put(factory.getKey(),factory);
    }

    protected static FactoryItsNatHTMLComponentImpl getHTMLFactoryStatic(HTMLElement elem,String compType)
    {
        String key;
        if (elem instanceof HTMLInputElement)
            key = FactoryItsNatHTMLInputImpl.getKeyHTMLInput((HTMLInputElement)elem,compType);
        else
            key = FactoryItsNatHTMLComponentImpl.getKey(elem,compType);

        return HTMLFACTORIES.get(key);
    }

    @Override
    protected FactoryItsNatComponentImpl getFactoryItsNatComponent(Element elem,String compType)
    {
        FactoryItsNatComponentImpl factory = super.getFactoryItsNatComponent(elem,compType);
        if (factory != null) return factory;

        if (!(elem instanceof HTMLElement))
            return null;

        return getHTMLFactoryStatic((HTMLElement)elem,compType);
    }

    public static boolean declaredAsHTMLComponent(Element element)
    {
        if (!(element instanceof HTMLElement))
            return false;

        boolean decAsComp = declaredAsComponent(element);
        if (decAsComp) return true;

        // Buscamos por tag name
        FactoryItsNatHTMLComponentImpl factory = getHTMLFactoryStatic((HTMLElement)element,null);
        if (factory == null)
            return false;

        return factory.declaredAsHTMLComponent(element);
    }

    public ItsNatHTMLFormImpl getItsNatHTMLForm(HTMLFormElement formElem)
    {
        ItsNatHTMLFormImpl form = (ItsNatHTMLFormImpl)findItsNatComponent(formElem);
        //if (form == null)
        //    form = (ItsNatHTMLFormImpl)addItsNatHTMLForm(formElem,null);
        return form;
    }

    public ItsNatHTMLForm addItsNatHTMLForm(HTMLFormElement element,NameValue[] artifacts)
    {
        // NO SE USA
        ItsNatHTMLForm component = createItsNatHTMLForm(element,artifacts);
        addItsNatComponent(component);
        return component;
    }

    public ItsNatStfulDocumentImpl getItsNatStfulDocument()
    {
        return (ItsNatStfulDocumentImpl)itsNatDoc;
    }

    public boolean hasItsNatModalLayers()
    {
        if (modalLayers == null) return false;
        return !modalLayers.isEmpty();
    }

    public LinkedList<ItsNatModalLayerImpl> getItsNatModalLayers()
    {
        if (modalLayers == null) this.modalLayers = new LinkedList<ItsNatModalLayerImpl>();
        return modalLayers;
    }

    public void addClientDocumentAttachedClient(ClientDocumentAttachedClientImpl clientDoc)
    {
        if (hasItsNatModalLayers())
        {
            // Es el caso de modal layers ya mostrados, es �til notificar
            // para que tambi�n en este caso se redimensionen los modal layers
            // en los observadores cuando cambia el tama�o de la ventana
            // o el layout y en MSIE v6 para ocultar tambi�n los HTML select
            // que est�n "detr�s".
            LinkedList<ItsNatModalLayerImpl> modalLayers = getItsNatModalLayers();
            for(ItsNatModalLayerImpl comp : modalLayers)
            {
                comp.addClientDocumentAttachedClient(clientDoc);
            }
        }

        if (hasItsNatComponents())
        {
            WeakHashMap<ItsNatComponent,Object> compMap = getItsNatComponentWeakMap();
            for(Map.Entry<ItsNatComponent,Object> entry : compMap.entrySet())
            {
                ItsNatComponent comp = entry.getKey();
                if (comp instanceof ItsNatModalLayerImpl) continue; // Evitamos llamar dos veces, los modal layer deben llamarse en el orden de creaci�n
                else if (!(comp instanceof ItsNatComponentImpl)) continue; // Componente del usuario

                ((ItsNatComponentImpl)comp).addClientDocumentAttachedClient(clientDoc);
            }
        }
    }

    public void removeClientDocumentAttachedClient(ClientDocumentAttachedClientImpl clientDoc)
    {
        if (hasItsNatModalLayers())
        {
            LinkedList<ItsNatModalLayerImpl> modalLayers = getItsNatModalLayers();
            for(ItsNatModalLayerImpl comp : modalLayers)
            {
                // Da igual el orden en que se itere pues total el cliente se est� cerrando
                // NO deber�a hacerse nada m�s que desregistrar pues el cliente puede
                // estar ya invalidado.
                comp.removeClientDocumentAttachedClient(clientDoc);
            }
        }

        if (hasItsNatComponents())
        {
            WeakHashMap<ItsNatComponent,Object> compMap = getItsNatComponentWeakMap();
            for(Map.Entry<ItsNatComponent,Object> entry : compMap.entrySet())
            {
                ItsNatComponent comp = entry.getKey();
                if (comp instanceof ItsNatModalLayerImpl) continue; // Evitamos llamar dos veces, los modal layer deben llamarse en el orden de creaci�n
                else if (!(comp instanceof ItsNatComponentImpl)) continue; // Componente del usuario

                ((ItsNatComponentImpl)comp).removeClientDocumentAttachedClient(clientDoc);
            }
        }
    }

    public ItsNatHTMLLabel createItsNatHTMLLabel(HTMLLabelElement element,NameValue[] artifacts)
    {
        return FactoryItsNatHTMLLabelImpl.SINGLETON.createItsNatHTMLLabel(element,artifacts,true,this);
    }

    public ItsNatHTMLAnchor createItsNatHTMLAnchor(HTMLAnchorElement element,NameValue[] artifacts)
    {
        return FactoryItsNatHTMLAnchorDefaultImpl.SINGLETON.createItsNatHTMLAnchorDefault(element,artifacts,true,this);
    }

    public ItsNatHTMLAnchorLabel createItsNatHTMLAnchorLabel(HTMLAnchorElement element,NameValue[] artifacts)
    {
        return FactoryItsNatHTMLAnchorLabelImpl.SINGLETON.createItsNatHTMLAnchorLabel(element,artifacts,true,this);
    }

    public ItsNatHTMLForm createItsNatHTMLForm(HTMLFormElement element,NameValue[] artifacts)
    {
        return FactoryItsNatHTMLFormImpl.SINGLETON.createItsNatHTMLForm(element,artifacts,true,this);
    }

    public ItsNatHTMLInputText createItsNatHTMLInputText(HTMLInputElement element,NameValue[] artifacts)
    {
        return FactoryItsNatHTMLInputTextDefaultImpl.SINGLETON.createItsNatHTMLInputTextDefault(element,artifacts,true,this);
    }

    public ItsNatHTMLInputTextFormatted createItsNatHTMLInputTextFormatted(HTMLInputElement element,NameValue[] artifacts)
    {
        return FactoryItsNatHTMLInputTextFormattedImpl.SINGLETON.createItsNatHTMLInputTextFormatted(element,artifacts,true,this);
    }

    public ItsNatHTMLInputPassword createItsNatHTMLInputPassword(HTMLInputElement element,NameValue[] artifacts)
    {
        return FactoryItsNatHTMLInputPasswordImpl.SINGLETON.createItsNatHTMLInputPassword(element,artifacts,true,this);
    }

    public ItsNatHTMLInputCheckBox createItsNatHTMLInputCheckBox(HTMLInputElement element,NameValue[] artifacts)
    {
        return FactoryItsNatHTMLInputCheckBoxImpl.SINGLETON.createItsNatHTMLInputCheckBox(element,artifacts,true,this);
    }

    public ItsNatHTMLInputRadio createItsNatHTMLInputRadio(HTMLInputElement element,NameValue[] artifacts)
    {
        return FactoryItsNatHTMLInputRadioImpl.SINGLETON.createItsNatHTMLInputRadio(element,artifacts,true,this);
    }

    public ItsNatHTMLInputSubmit createItsNatHTMLInputSubmit(HTMLInputElement element,NameValue[] artifacts)
    {
        return FactoryItsNatHTMLInputSubmitImpl.SINGLETON.createItsNatHTMLInputSubmit(element,artifacts,true,this);
    }

    public ItsNatHTMLInputReset createItsNatHTMLInputReset(HTMLInputElement element,NameValue[] artifacts)
    {
        return FactoryItsNatHTMLInputResetImpl.SINGLETON.createItsNatHTMLInputReset(element,artifacts,true,this);
    }

    public ItsNatHTMLInputButton createItsNatHTMLInputButton(HTMLInputElement element,NameValue[] artifacts)
    {
        return FactoryItsNatHTMLInputButtonImpl.SINGLETON.createItsNatHTMLInputButton(element,artifacts,true,this);
    }

    public ItsNatHTMLInputImage createItsNatHTMLInputImage(HTMLInputElement element,NameValue[] artifacts)
    {
        return FactoryItsNatHTMLInputImageImpl.SINGLETON.createItsNatHTMLInputImage(element,artifacts,true,this);
    }

    public ItsNatHTMLInputHidden createItsNatHTMLInputHidden(HTMLInputElement element,NameValue[] artifacts)
    {
        return FactoryItsNatHTMLInputHiddenImpl.SINGLETON.createItsNatHTMLInputHidden(element,artifacts,true,this);
    }

    public ItsNatHTMLInputFile createItsNatHTMLInputFile(HTMLInputElement element,NameValue[] artifacts)
    {
        return FactoryItsNatHTMLInputFileImpl.SINGLETON.createItsNatHTMLInputFile(element,artifacts,true,this);
    }

    public ItsNatHTMLSelectMult createItsNatHTMLSelectMult(HTMLSelectElement element,NameValue[] artifacts)
    {
        return FactoryItsNatHTMLSelectImpl.SINGLETON.createItsNatHTMLSelectMult(element,artifacts,true,this);
    }

    public ItsNatHTMLSelectComboBox createItsNatHTMLSelectComboBox(HTMLSelectElement element,NameValue[] artifacts)
    {
        return FactoryItsNatHTMLSelectImpl.SINGLETON.createItsNatHTMLSelectComboBox(element,artifacts,true,this);
    }

    public ItsNatHTMLTextArea createItsNatHTMLTextArea(HTMLTextAreaElement element,NameValue[] artifacts)
    {
        return FactoryItsNatHTMLTextAreaImpl.SINGLETON.createItsNatHTMLTextArea(element,artifacts,true,this);
    }

    public ItsNatHTMLButton createItsNatHTMLButton(HTMLButtonElement element,NameValue[] artifacts)
    {
        return FactoryItsNatHTMLButtonDefaultImpl.SINGLETON.createItsNatHTMLButtonDefault(element,artifacts,true,this);
    }

    public ItsNatHTMLButtonLabel createItsNatHTMLButtonLabel(HTMLButtonElement element,NameValue[] artifacts)
    {
        return FactoryItsNatHTMLButtonLabelImpl.SINGLETON.createItsNatHTMLButtonLabel(element,artifacts,true,this);
    }

    public ItsNatHTMLTable createItsNatHTMLTable(HTMLTableElement element,ItsNatTableStructure structure,NameValue[] artifacts)
    {
        return FactoryItsNatHTMLTableImpl.SINGLETON.createItsNatHTMLTable(element,structure,artifacts,true,this);
    }

    public ItsNatHTMLIFrame createItsNatHTMLIFrame(HTMLIFrameElement element,NameValue[] artifacts)
    {
        return FactoryItsNatHTMLIFrameImpl.SINGLETON.createItsNatHTMLIFrame(element,artifacts,true,this);
    }

    public ItsNatLabelEditor createDefaultItsNatLabelEditor(ItsNatComponent compEditor)
    {
        return new ItsNatLabelEditorDefaultImpl(compEditor,this);
    }

    public ItsNatListCellEditor createDefaultItsNatListCellEditor(ItsNatComponent compEditor)
    {
        return new ItsNatListCellEditorDefaultImpl(compEditor,this);
    }

    public ItsNatTableCellEditor createDefaultItsNatTableCellEditor(ItsNatComponent compEditor)
    {
        return new ItsNatTableCellEditorDefaultImpl(compEditor,this);
    }

    public ItsNatTreeCellEditor createDefaultItsNatTreeCellEditor(ItsNatComponent compEditor)
    {
        return new ItsNatTreeCellEditorDefaultImpl(compEditor,this);
    }
}
TOP

Related Classes of org.itsnat.impl.comp.mgr.ItsNatStfulDocComponentManagerImpl

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.