| Artículos | 01 MAY 1995

Arrastrar y soltar en aplicaciones OS/2

Tags: Histórico
OS/ 2 Warp evita tareas de manejo de opciones
Jaime Peña.

La programación de aplicaciones OS/2, mediante la biblioteca ICLUI de IBM C Set++, permite integrar facilidades de arrastrar y soltar (Direct Manipulation) en WorkPlace Shell. Veremos cómo implementar un ejemplo simple de carga de archivos en un editor.

La versatilidad del entorno del sistema operativo OS/2 Warp 3.0, denominado WorkPlace Shell, se manifiesta de múltiples maneras. Una de las prestaciones que más agrada a los usuarios es la capacidad de arrastrar elementos y soltarlos, de manera que se eviten tediosas tareas de manejo de opciones de menús flotantes.

Arrastrar y soltar es una funcionalidad ya conocida en muchos programas trabajando aisladamente y en casos más genéricos como el Administrador de archivos de Windows para Trabajo en Grupo (recordemos que también será un pilar básico de Windows 95). Aunque el término inglés para la técnica de arrastrar y soltar es drag & drop, se denomina Direct Manipulation en el ámbito de la programación OS/2 con la biblioteca ICLUI (siglas de IBM User Interface Class Library), que acompaña al compilador IBM C Set++.

OS/2 Warp 3.0, además de ser conocido como sistema operativo de 32 bits, está plenamente enfocado a objetos. Objetos son cualquiera de los elementos que pueden permanecer sobre WorkPlace Shell, bien sean carpetas, subcarpetas o archivos (de ejecutables o documentos). Desde el punto de vista de WorkPlace Shell no hay diferencia en cuanto a su consideración y su funcionalidad viene determinada por sus propiedades.

Este será un punto esencial a tener en cuenta, ya que todos son susceptibles de ser arrastrados y soltados en otro lugar; pero, las aplicaciones que trabajen con archivos de datos, deberán tener conocimiento del tipo de objeto que se suelta y discernir si son o no capaces de gestionar su contenido.

Así, en nuestro ejemplo, trataremos de implementar una maqueta de un editor de textos, que tendrá la funcionalidad de Direct Manipulation de archivos que contengan datos legibles. En otros casos, como en un ejemplo que acompaña al compilador IBM C Set++, se trataría de un visor de archivos gráficos bitmap.

Nuestro ejemplo es algo diferente al respecto, ya que dota de funcionalidad a un control de edición multilínea, que actúa como ventana principal de la aplicación, algo que sólo se trata de pasada en la documentación del compilador y de la biblioteca ICLUI.

Con el fin de no alargar en exceso el código fuente y de fijarnos estrictamente en el diseño de una aplicación tipo arrastrar y soltar, el programa final no contempla ninguna otra posibilidad habitual (y mucho más fácil de programar) de un editor de textos. Tal sería el caso de abrir, guardar, cortar, copiar, deshacer, etc. Todo esto último es directamente programable, siempre a partir de las funciones miembro de la clase que es capaz de crear un MLE (MultiLine Editor), denominada IMultiLineEdit.

Principales conceptos

La biblioteca ICLUI contempla cuatro tipos de objetos base, con la finalidad de dar soporte de arrastrar y soltar a las aplicaciones OS/2. Cuando un objeto de WorkPlace Shell se arrastra (con el botón derecho del ratón) y se suelta, acontecen toda una serie de eventos que, de forma bastante automatizada, dan información de y rigen el comportamiento de la aplicación receptora (target).

En definitiva, la biblioteca ICLUI da soporte a la gestión de los eventos transmitidos, tanto a la fuente del objeto (Source) como al destino (Target). Eso se realizará mediante un Event Handler, que ha de ser debidamente programado. Otro objeto base se refiere a un Renderer. Se trata del modo en que se transferirá la representación del objeto de la fuente al destino. Un tercer objeto (en términos de lenguaje OOP de C++) a considerar es el objeto (o si lo prefiere, el elemento) que se arrastra y que ha de ser debidamente accedido y recuperado por la aplicación destino. Finalmente, para acceder y recuperar el elemento, nos basaremos en un objeto tipo proveedor (Provider); aquí se gestiona el método de recuperación en sí.

Con todo ello, la estrategia a seguir en el diseño de la aplicación receptora es del todo simple: recibir el mensaje de que un objeto ha sido descargado sobre ella (drop), identificarlo y, en su caso, determinar si es del tipo adecuado (o esperado). Si lo es, se hará uso del proveedor para acceder a él e insertarlo (en nuestro ejemplo, abrir el archivo) en la aplicación destino.

Algunas de las tareas de diseño se realizan por medio de plantillas (templates), de manera que la declaración de las funciones miembro sea independiente del tipo de objeto transferido y éste sea identificado en tiempo de ejecución y se realicen sobre él las labores oportunas en cada caso. Normalmente, se declara un constructor por defecto para las labores de trabajo con el elemento y se usará un Handler y un Renderer predefinidos (ya incluidos por defecto en la biblioteca ICLUI).

Es necesario programar las funciones miembro targetDrop y provideEnterSupport, ya que dependen estrictamente del tipo de objeto con que trabajemos.

Programación de Direct Manipulation

Resulta interesante dotar a los controles de edición de la posibilidad de arrastrar sobre ello archivos de texto, de forma que se abra cargando automáticamente ese documento de texto. Fundamentalmente, si se trata de ventanas principales de edición multilínea (MLE). En nuestro ejemplo, ya lo adelantamos más arriba en este artículo, programaremos una aplicación OS/2 Presentation Manager bastante simple en funcionalidad general, pero creemos que muy ilustrativa de cómo podemos crear un editor de textos con capacidades drag & drop.

Si nos fijamos en el listado que acompaña este artículo (código fuente en C++ de la aplicación ejemplo), vemos un primer apartado de archivos incluidos. Nada nuevo en ello, al margen de los archivos de cabecera extra que hemos de incluir para trabajar con el mecanismo de Direct Manipulation (IDMPROV.HPP, IDMITEM.HPP Y IDMEVENT.HPP).

Seguidamente, observamos las declaraciones base para implementar un mecanismo genérico. Se trata de la clase ItemTexto, derivada del objeto ICLUI denominado IDMItem (IBM Direct Manipulation Item). Contiene un constructor y la función miembro targetDrop, de la que nos ocuparemos más adelante.

Por el momento, fijémonos en la clase ATextProvider (tomada directamente del modo de declaración sugerida en la documentación de IBM C Set++ 2.01). Se trata de una declaración basada en plantillas, cómo anticipábamos; así que su estructura general servirá para Direct Manipulation de cualquier tipo de objeto que se arrastre y suelte sobre una aplicación. Si desea ver otro ejemplo basado en visualización de bitmaps, repase el programa DMSAMP2, en el directorio SAMPLES\ICLUI de su instalación de IBM C Set++ 2.01.

La función miembro providerEnterSupport trata de validar el tipo de elemento que se arrastra y suelta sobre la aplicación. Como se aprecia, primeramente se coge el handle de lo que se suelta; a partir de ahí, se comprueba que el primer elemento arrastrado (dado que pudiera darse un arrastre múltiple) es un archivo que contiene texto. Esta comprobación es bastante inestable, ya que, en realidad, se comprueba que no es una carpeta o similar y el hecho de que su estilo sea de texto, no implica que sea de texto ASCII. Si no se trata de una carpeta de un archivo, se pone el indicador de soltar con el valor NO (IDM::notOk) y no se seguirá con el proceso.

Entre tanto, nos hemos saltado (como advertíamos) la función miembro targetDrop; se alcanzará su código si la función anterior comprobó que el elemento arrastrado era del tipo adecuado. Esta función miembro de la clase IDMItem es, de alguna manera, el núcleo del proceso de soltar el elemento y recuperar su información en nuestra aplicación (recordemos que se trata de un editor multilíneas). Usaremos para ello la funció

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información