001: /*
002: ItsNat Java Web Application Framework
003: Copyright (C) 2007 Innowhere Software Services S.L., Spanish Company
004: Author: Jose Maria Arranz Santamaria
005:
006: This program is free software: you can redistribute it and/or modify
007: it under the terms of the GNU Affero General Public License as published by
008: the Free Software Foundation, either version 3 of the License, or
009: (at your option) any later version. See the GNU Affero General Public
010: License for more details. See the copy of the GNU Affero General Public License
011: included in this program. If not, see <http://www.gnu.org/licenses/>.
012: */
013:
014: package org.itsnat.impl.comp.html;
015:
016: import org.itsnat.comp.html.ItsNatHTMLForm;
017: import org.itsnat.comp.html.ItsNatHTMLFormComponent;
018: import org.itsnat.core.ClientDocument;
019: import org.itsnat.core.NameValue;
020: import org.itsnat.core.event.DOMEvent;
021: import org.itsnat.impl.core.ItsNatServletRequestImpl;
022: import org.w3c.dom.events.Event;
023: import org.w3c.dom.events.EventListener;
024: import org.w3c.dom.html.HTMLElement;
025: import org.w3c.dom.html.HTMLFormElement;
026:
027: /**
028: *
029: * @author jmarranz
030: */
031: public abstract class ItsNatHTMLFormComponentImpl extends
032: ItsNatHTMLElementComponentImpl implements
033: ItsNatHTMLFormComponent, EventListener {
034: protected DOMEvent currentEvent;
035: protected ItsNatHTMLForm formComp;
036:
037: /**
038: * Creates a new instance of ItsNatHTMLFormComponentImpl
039: */
040: public ItsNatHTMLFormComponentImpl(HTMLElement element,
041: NameValue[] artifacts,
042: ItsNatHTMLComponentManagerImpl componentMgr) {
043: super (element, artifacts, componentMgr);
044: }
045:
046: public abstract boolean hasDefaultBehaviorChangeEvent();
047:
048: public void enableEventListeners() {
049: if (hasDefaultBehaviorChangeEvent())
050: enableEventListener("change"); // Para algunos tipos de controles (ej botones no toggle) no sirve para nada pues via GUI no puede cambiarse la propiedad "value" y por JavaScript no genera evento (el evento se genera al perder el foco o cambio del item, siempre por algo visual)
051: }
052:
053: public abstract HTMLFormElement getHTMLFormElement();
054:
055: public ItsNatHTMLForm getItsNatHTMLForm() {
056: HTMLFormElement formElem = getHTMLFormElement(); // puede ser null (el elemento puede no estar dentro de un <form>
057: if (formElem == null)
058: return null;
059: if ((formComp == null)
060: || (formComp.getHTMLFormElement() != formElem)) {
061: ItsNatHTMLComponentManagerImpl componentMgr = getItsNatHTMLComponentManagerImpl();
062: this .formComp = componentMgr.getItsNatHTMLForm(formElem);
063: }
064: return formComp;
065: }
066:
067: public abstract void handleEventOnChange(Event evt);
068:
069: public void postHandleEventOnChange(Event evt) {
070: // Derivar si se necesita
071: }
072:
073: public void processDOMEvent(Event evt) {
074: String type = evt.getType();
075: if (type.equals("change") && hasDefaultBehaviorChangeEvent()) // Si hasDefaultBehaviorChangeEvent() es false no hay comportamiento por defecto pero el "change" puede haberlo añadido el usuario
076: {
077: // Ejecutado como respuesta al evento "change" en el navegador
078:
079: handleEventOnChange(evt);
080:
081: // Oportunidad para los componentes derivados
082: // de modificar el DOM en el servidor para que se manifieste
083: // en el cliente pues no está en modo "server updating from client",
084: // por ejemplo para rechazar el cambio y restaurar el valor original
085: // propagando al cliente.
086: // El usuario puede hacer esto con un listener normal, pero necesitamos
087: // ejecutar antes el posible rechazo antes de que se ejecuten los listeners
088: // del usuario para que el usuario vea ya el DOM con el valor rechazado
089:
090: postHandleEventOnChange(evt);
091: }
092:
093: super .processDOMEvent(evt);
094: }
095:
096: public boolean isServerUpdatingFromClient() {
097: return currentEvent != null;
098: }
099:
100: public void setServerUpdatingFromClient(DOMEvent currentEvent) {
101: this .currentEvent = currentEvent;
102: }
103:
104: public boolean disableSendCodeToRequesterIfServerUpdating() {
105: if (currentEvent != null) {
106: ItsNatServletRequestImpl itsNatRequest = (ItsNatServletRequestImpl) currentEvent
107: .getItsNatServletRequest();
108: ClientDocument requester = itsNatRequest
109: .getClientDocument();
110: if (requester.isSendCodeEnabled()) {
111: requester.disableSendCode(); // Desactivamos, será temporal
112: return true; // Hemos desactivado, es el recordatorio de que debemos activar de nuevo porque estaba activo (para restaurar el estado)
113: }
114: }
115:
116: return false;
117: }
118:
119: public void enableSendCodeToRequester() {
120: ItsNatServletRequestImpl itsNatRequest = (ItsNatServletRequestImpl) currentEvent
121: .getItsNatServletRequest();
122: ClientDocument requester = itsNatRequest.getClientDocument();
123: requester.enableSendCode(); // Restauramos como estaba
124: }
125: }
|