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;
015:
016: import org.itsnat.comp.ItsNatButton;
017: import org.itsnat.comp.ui.ItsNatButtonUI;
018: import javax.swing.ButtonModel;
019: import javax.swing.event.ChangeEvent;
020: import org.w3c.dom.events.Event;
021:
022: /**
023: *
024: * @author jmarranz
025: */
026: public class ItsNatButtonBasedSharedImpl {
027:
028: /**
029: * Creates a new instance of ItsNatButtonBasedSharedImpl
030: */
031: public ItsNatButtonBasedSharedImpl() {
032: }
033:
034: public static void bindDataModel(ItsNatButtonInternal comp) {
035: // A partir de ahora los cambios los repercutimos en el DOM por eventos
036: // No se debe cambiar el DOM por otra vía que por el objeto dataModel
037: ButtonModel dataModel = comp.getButtonModel();
038: dataModel.addChangeListener(comp);
039: }
040:
041: public static void unbindDataModel(ItsNatButtonInternal comp) {
042: ButtonModel dataModel = comp.getButtonModel();
043: dataModel.removeChangeListener(comp);
044: }
045:
046: public static void syncUIWithDataModel(ItsNatButtonInternal comp) {
047: ButtonModel dataModel = comp.getButtonModel();
048: ItsNatButtonUI compUI = comp.getItsNatButtonUI();
049: compUI.setEnabled(dataModel.isEnabled()); // Valor actual, cualquier cambio se notificará via listeners
050: }
051:
052: public static void stateChanged(ItsNatButtonInternal comp,
053: ChangeEvent e) {
054: ((ItsNatComponentInternal) comp).syncWithDataModel();
055: }
056:
057: public static boolean handleEvent(ButtonModel dataModel, Event evt) {
058: // Ejecutado como respuesta a eventos del navegador
059: // No hay problemas de provocar mutation events no deseados, no hace falta inhibir, que lo haga el usuario si añade listeners
060: // Se ha comprobado que pulsando un JButton nunca se hace un setSelection(true),
061: // la selección es cosa de los toggle buttons y se hace indirectamente a través del setPressed por lo que
062: // no usamos setSelection explícitamente (no se necesita).
063: // De acuerdo con la experiencia de Swing:
064: // Armed es true cuando el botón se ha pulsado y el ratón está dentro, viene a decir que si se suelta el botón ahora el click será completo
065: // Pressed es true cuando el botón fue pulsado hasta que se deja de pulsar (aunque el ratón esté fuera)
066:
067: if (!dataModel.isEnabled())
068: return false; // Sirve sobre todo para los "free buttons" que no son elementos de formulario y no pueden ser disabled por DOM, emulamos así que el elemento no está activo (ya que el GUI no evita enviar el evento pues un elemento cualquiera no es desactivable)
069:
070: String type = evt.getType();
071:
072: if (type.equals("click")) {
073: // La suma de mousedown y mouseup
074: // NO es en absoluto aconsejable procesar click y mousedown/mouseup
075: // pues es como si se hubiera pulsado dos veces el botón (desastre en el caso de botones seleccionables)
076: // En el caso de pulsar el botón soltando fuera del mismo el navegador no se genera el evento "click" lo cual es lo deseable en botones seleccionables pues no cambia el estado (lo mismo ocurre en Swing)
077: dataModel.setArmed(true);
078: dataModel.setPressed(true); // lanzará el evento por el que podemos saber que ha sido pulsado
079: dataModel.setPressed(false); // idem, sabremos que ha dejado de estar pulsado.
080: dataModel.setArmed(false); // "
081: } else if (type.equals("mousedown")) {
082: dataModel.setArmed(true); // Debe ir antes de que Pressed
083: dataModel.setPressed(true);
084: } else if (type.equals("mouseup")) {
085: dataModel.setPressed(false); // Debe ir antes de que Armed
086: dataModel.setArmed(false);
087: } else if (type.equals("mouseover")) {
088: dataModel.setRollover(true);
089: } else if (type.equals("mouseout")) {
090: dataModel.setRollover(false);
091: dataModel.setArmed(false); // pues fuera del botón aunque el botón esté pulsado no está "armado" para disparar (cerrar el click)
092: }
093:
094: // No hacemos nada con mousemove pues con este evento no
095: // podemos saber cuando hacer setRollover(false); y cuando
096: // se saliera del botón quedaría como true si no está definido el over/out
097:
098: return true;
099: }
100: }
|