8.2 Mecanismo general

En Una breve introducción a los inspectores, explicamos cómo configurar las propiedades de una instancia morph individual para gestionar un evento específico. En este caso, una propiedad informaba a Cuis-Smalltalk de que nos interesaba un evento determinado (#handlesMouseDown), mientras que una segunda propiedad definía el comportamiento con un bloque de código que se ejecutaba cada vez que se producía este evento.

Alternativamente, para gestionar eventos en una clase morph determinada, definimos el comportamiento con métodos de instancia. En la clase Morph, observa las categorías de métodos event y event handling testing.

La categoría de métodos event handling testing (prueba de gestión de eventos) enumera los métodos que devuelven un valor booleano para indicar si se debe notificar a la instancia sobre determinados eventos. Echemos un vistazo a uno de estos métodos, handlesMouseDown:, cuyo comentario merece la pena leer:

Morph>>handlesMouseDown: aMouseButtonEvent
"Do I want to receive mouseButton messages ?
- #mouseButton1Down:localPosition:
- #mouseButton1Up:localPosition:
- #mouseButton2Down:localPosition:
- #mouseButton2Up:localPosition:
- #mouseButton3Down:localPosition:
- #mouseButton3Up:localPosition:
- #mouseMove:localPosition:
- #mouseButton2Activity
NOTE: The default response is false. Subclasses that implement these
messages directly should override this one to return true.
Implementors could query the argument, and only answer true for (for
example) button 2 up only."
"Use a property test to allow individual instances to dynamically
specify this."

   ^ self hasProperty: #'handlesMouseDown:'

Tal y como se define por defecto, este método y los demás controladores comprueban si una instancia ha definido una propiedad con el mismo nombre que el método estándar. De este modo, cada instancia individual puede añadir su propio comportamiento.

En una clase morph en la que queremos que todas las instancias gestionen los eventos de pulsación del ratón, simplemente sobrescribimos el método adecuado para que devuelva true:

MyMorph>>>>handlesMouseDown: aMouseButtonEvent
   ^ true

Ahora, en la categoría del método events de la clase Morph, encontramos los controladores enumerados en el comentario anterior. Una ScrollBar, un tipo de Morph que representa el control de posición de una lista, desplaza el contenido de la lista cuando se pulsa el botón 1 del ratón:

ScrollBar>>mouseButton1Down: aMouseBtnEvent position: eventPosition
"Update visual feedback"
   self setNextDirectionFromEvent: aMouseBtnEvent.
   self scrollByPage

Para descubrir otros eventos disponibles para tu morph, explora con el Browser del sistema como se ha descrito anteriormente.