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.ItsNatHTMLButton;
017: import org.itsnat.comp.ui.ItsNatButtonUI;
018: import org.itsnat.comp.ui.ItsNatComponentUI;
019: import org.itsnat.impl.comp.ItsNatButtonBasedSharedImpl;
020: import org.itsnat.impl.comp.html.ui.ItsNatHTMLButtonUIImpl;
021: import javax.swing.ButtonModel;
022: import javax.swing.DefaultButtonModel;
023: import javax.swing.event.ChangeEvent;
024: import org.itsnat.core.NameValue;
025: import org.itsnat.core.ItsNatException;
026: import org.itsnat.impl.comp.ItsNatButtonInternal;
027: import org.w3c.dom.Document;
028: import org.w3c.dom.Node;
029: import org.w3c.dom.events.Event;
030: import org.w3c.dom.html.HTMLButtonElement;
031: import org.w3c.dom.html.HTMLFormElement;
032:
033: /**
034: * El atributo type de un HTMLButtonElement puede ser "button","reset","submit"
035: * pero en todos los casos el comportamiento, modelo y visualización es el mismo
036: * (salvo la acción que generan) por lo que no derivamos nuevas clases.
037: * Aunque un tipo "reset" o "submit" generen un reset o submit ante un click dicho evento
038: * no es recogido por el propio botón, es decir onreset y onsubmit no son llamados
039: * (es el <form> el que lo recibe)
040: * No es el caso de HTMLInputElement en donde type="text" es totalmente diferente a
041: * type="button"
042: *
043: * @author jmarranz
044: */
045: public abstract class ItsNatHTMLButtonImpl extends
046: ItsNatHTMLFormCompValueBasedImpl implements ItsNatHTMLButton,
047: ItsNatButtonInternal {
048: /** Creates a new instance of ItsNatHTMLButtonImpl */
049: public ItsNatHTMLButtonImpl(HTMLButtonElement element,
050: NameValue[] artifacts,
051: ItsNatHTMLComponentManagerImpl componentMgr) {
052: super (element, artifacts, componentMgr);
053: }
054:
055: public boolean hasDefaultBehaviorChangeEvent() {
056: return false;
057: }
058:
059: public void enableEventListeners() {
060: super .enableEventListeners();
061:
062: enableEventListener("click"); // Por defecto se procesa, pues es lo importante
063: }
064:
065: public HTMLButtonElement getHTMLButtonElement() {
066: return (HTMLButtonElement) getHTMLElement();
067: }
068:
069: public HTMLFormElement getHTMLFormElement() {
070: return getHTMLButtonElement().getForm(); // Puede ser null, puede no estar dentro de un formulario
071: }
072:
073: public ItsNatButtonUI createDefaultItsNatHTMLButtonUI() {
074: return new ItsNatHTMLButtonUIImpl(this );
075: }
076:
077: public ItsNatComponentUI createDefaultItsNatComponentUI() {
078: return createDefaultItsNatHTMLButtonUI();
079: }
080:
081: public void bindDataModel() {
082: ItsNatButtonBasedSharedImpl.bindDataModel(this );
083: }
084:
085: public void unbindDataModel() {
086: ItsNatButtonBasedSharedImpl.unbindDataModel(this );
087: }
088:
089: public void syncUIWithDataModel() {
090: ItsNatButtonBasedSharedImpl.syncUIWithDataModel(this );
091: }
092:
093: public void stateChanged(ChangeEvent e) {
094: ItsNatButtonBasedSharedImpl.stateChanged(this , e);
095: }
096:
097: public ButtonModel getButtonModel() {
098: return (ButtonModel) dataModel;
099: }
100:
101: public void setButtonModel(ButtonModel dataModel) {
102: setDataModel(dataModel);
103: }
104:
105: public void setNewValueOnChange(String newValue, Event evt) {
106: throw new ItsNatException("INTERNAL ERROR"); // Nunca es llamado, no hay comportamiento por defecto en el caso "change" y botones
107:
108: /*
109: HTMLButtonElement elem = getHTMLButtonElement();
110: elem.setValue(newValue); // Sincroniza el atributo value cuando se cambia desde JavaScript
111: // Yo creo que nunca se llamará porque el value no se cambia visualmente que es cuando se genera el evento change
112: **/
113: }
114:
115: public void setNewValueOnKeyUp(String newValue, Event evt) {
116: // No tiene sentido en botones pues si se pulsa ENTER encima de un botón
117: // de todas formas se genera un click
118: }
119:
120: public boolean isEnabled() {
121: // Está propiedad está en el modelo no sólo en el DOM
122: // el modelo modifica el DOM via listeners pues es el modelo el que manda
123: return getButtonModel().isEnabled();
124: }
125:
126: public void setEnabled(boolean b) {
127: // Está propiedad está en el modelo no sólo en el DOM
128: // el modelo modificará el DOM via listeners pues es el modelo el que manda
129: getButtonModel().setEnabled(b);
130: }
131:
132: public void processDOMEvent(Event evt) {
133: if (!ItsNatHTMLFormCompButtonSharedImpl.handleEvent(
134: getButtonModel(), evt, this ))
135: return;
136:
137: super .processDOMEvent(evt);
138: }
139:
140: public Object createDefaultModelInternal() {
141: return createDefaultButtonModel();
142: }
143:
144: public ButtonModel createDefaultButtonModel() {
145: return new DefaultButtonModel();
146: }
147:
148: public ItsNatButtonUI getItsNatButtonUI() {
149: return (ItsNatButtonUI) compUI;
150: }
151:
152: public Node createDefaultNode() {
153: Document doc = getItsNatDocument().getDocument();
154: HTMLButtonElement elem = (HTMLButtonElement) doc
155: .createElement("button");
156: return elem;
157: }
158: }
|