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.core.event.CustomParamTransport;
017: import org.itsnat.core.event.ParamTransport;
018: import org.itsnat.core.NameValue;
019: import org.itsnat.core.event.DOMEvent;
020: import org.w3c.dom.events.Event;
021: import org.w3c.dom.html.HTMLElement;
022:
023: /**
024: *
025: * @author jmarranz
026: */
027: public abstract class ItsNatHTMLFormCompValueBasedImpl extends
028: ItsNatHTMLFormComponentImpl {
029:
030: /** Creates a new instance of ItsNatHTMLFormCompValueBasedImpl */
031: public ItsNatHTMLFormCompValueBasedImpl(HTMLElement element,
032: NameValue[] artifacts,
033: ItsNatHTMLComponentManagerImpl componentMgr) {
034: super (element, artifacts, componentMgr);
035: }
036:
037: protected ParamTransport[] getParamTransports(String type) {
038: if (type.equals("change") || type.equals("keyup")) {
039: // Redefinimos porque es un poco más complicado que el código por defecto
040: CustomParamTransport value = new CustomParamTransport(
041: "value", "this.getCurrentTarget().value");
042: return new ParamTransport[] { value };
043: } else
044: return null;
045: }
046:
047: public void processDOMEvent(Event evt) {
048: String type = evt.getType();
049: if (type.equals("keyup")) {
050: // Ejecutado como respuesta al evento "keyup" en el navegador
051: // No usamos ni keydown ni keypress porque ambos son cancelable y en el cliente
052: // no se cambia el control hasta que el evento termina pues puede ser
053: // cancelado y la finalidad aquí es el de cambiar el DOM para ir sincronizando
054: // respecto a los cambios del cliente, cuando se emite keyup el control ya ha sido
055: // cambiado y value tiene el valor actualizado aunque se cancele keyup
056:
057: handleEventOnKeyUp(evt);
058:
059: // Idem razones que el evento "change"
060:
061: postHandleEventOnKeyUp(evt);
062: }
063:
064: super .processDOMEvent(evt);
065: }
066:
067: public void handleEventOnChange(Event evt) {
068: DOMEvent itsNatEvent = (DOMEvent) evt;
069: String newValue = (String) itsNatEvent.getExtraParam("value");
070:
071: setServerUpdatingFromClient(itsNatEvent); // Pues el evento viene del navegador y no se necesita enviar actualizaciones (salvo observers para que vean el cambio del cliente)
072:
073: try {
074: setNewValueOnChange(newValue, evt);
075: } finally {
076: setServerUpdatingFromClient(null);
077: }
078: }
079:
080: public abstract void setNewValueOnChange(String newValue, Event evt);
081:
082: public void handleEventOnKeyUp(Event evt) {
083: // Si se activó el evento "keyup" el DOM se actualizará para cada tecla
084: DOMEvent itsNatEvent = (DOMEvent) evt;
085: String newValue = (String) itsNatEvent.getExtraParam("value");
086:
087: setServerUpdatingFromClient(itsNatEvent); // Pues el evento viene del navegador y no se necesita enviar actualizaciones (salvo observers para que vean el cambio del cliente)
088:
089: try {
090: setNewValueOnKeyUp(newValue, evt);
091: } finally {
092: setServerUpdatingFromClient(null);
093: }
094: }
095:
096: public abstract void setNewValueOnKeyUp(String newValue, Event evt);
097:
098: public void postHandleEventOnKeyUp(Event evt) {
099: // Derivar si hace falta
100: }
101: }
|