Estoy convencido de que todos los que programamos con Xojo para plataformas de escritorio hemos creado en alguna ocasión una subclase a partir del control Label para que actúe como un detector de enlace. Ya sabes, el típico control en el que cuando pasas el apuntador del ratón sobre él te muestra la palabra o combinación de palabras como un elemento activo y que, una vez que pulsas sobre dicho control, te lleva a la página web enlazada para mostrarla en tu navegador por defecto. ¿Pero y si quieres ir más allá?
Esto es lo que te presento en este proyecto. Se trata de una subclase creada a partir del control TextArea disponible por omisión en el framework de Xojo y que nos permite establecer las palabras o combinación de palabras que deseamos mostrar como “activas” en el texto mostrado por el control. Además, como parte de su funcionamiento, cada una de las palabras “activas” lleva asociado un texto (que puede ser perfectamente un enlace o cualquier otro fragmento que consideremos), y que será el pasado a cualquier objeto que quiera actuar como observador cuando el usuario haga clic sobre la palabra en cuestión.
Encuentra el repositorio de este proyecto Open Source en GitHub en este enlace.
De este modo, manteniendo abierta la “acción” a realizar como consecuencia de que el usuario haga clic sobre cada una de estas palabras activas, e incluso la capacidad de desencadenar múltiples acciones a partir de dicho clic, también logramos que la funcionalidad de esta subclase sea mayor, y no sólo la de mostrar un URL en el navegador; por ejemplo.
En el momento de escribir esta entrada, el proyecto tiene varias limitaciones (es una versión 0.1), si bien ya aporta una funcionalidad que puedes aprovechar en tus proyectos de escritorio. Para ello sólo tienes que descargar el código fuente, en el que se incluye una pequeña aplicación de ejemplo, desde el repositorio de GitHub. Y puedes ver las capacidades que aporta en el siguiente vídeo:
Implementar el patrón Observador
Uno de los aspectos interesantes en la construcción de esta clases es que permite notificar a cuantos objetos estén interesados sobre el hecho de que el usuario ha hecho clic sobre cualquiera de las palabras activas; y esto es lo que se conoce como patrón Observador: los objetos interesados se registran en nuestra instancia de clase y se “sientan a esperar” hasta que reaccionan cuando se produce la acción para la que se han registrado.
En muchas de las implementaciones del patrón Observador se puede indicar incluso las acciones en las que podemos estar interesados. En este caso, sólo se admite una acción y, por tanto, no se contempla el uso de dicho parámetro.
¿Qué necesitan nuestras clases de Xojo para proporcionar esta capacidad? Bastante simple: un método público que suponga el punto de entrada para que los objetos puedan registrarse como observadores, otro método para desregistrarse cuando ya no estén interesados en continuar recibiendo notificaciones, una propiedad de tipo Colección (Array o Dictionary, por ejemplo) en los cuales vayamos guardando las referencias a todos aquellos objetos interesados (en este caso sólo almacenamos el método que deseamos invocar de cada objeto interesado), y un tipo de dato que actúe de signatura de método común para cualquier objeto independientemente de cuál sea su clase.
De este modo, el comportamiento de nuestra clase establece que como acción se llama al método registrado por los observadores pasando como parámetro una instancia del tipo de dato Pair que incluye tanto la palabra detectada como el texto de “acción”.
Delegate: el tipo de dato que apunta a funciones
Y dado que no todos los objetos pueden compartir un método común (o sería muy costoso y poco flexible), el mejor modo que tenemos a nuestro alcance en Xojo de implementar dicha signatura es con la creación de un tipo de dato Delegate.
Así, en este proyecto se define el tipo de dato ActionDelegate como un puntero a una función en la que se espera recibir un parámetro con el tipo de dato Pair.
Así, cualquier objeto que desee registrarse como observador de una instancia creada a partir de la clase sólo tendrá que pasar la dirección a un método que coincida con dicha signatura. Cuando llegue el momento, la instancia de la clase LinkDetectorTextArea recorrerá todos los elementos de la colección e invocará cada uno de dichos métodos pasando los datos de interés. ¡Sencillo!
¿Y como puedes pasar la dirección de un método? El lenguaje de Xojo también dispone de las herramientas para ello; y de hecho puedes utilizar cualquiera de las siguientes fórmulas:
Siendo más recomendable la segunda para evitar referencias circulares en las que no se llegue a liberar correctamente la memoria.
¿Quieres aprender o comprender mejor el lenguaje de programación Xojo y sacar el máximo provecho? Entonces no dudes de echar un ojo a mi libro electrónico “Programación Multiplataforma Xojo“!