A estas alturas todos sabemos ya que Mac OS X tiene dos entornos de aplicación nativos interrelacionados en parte: Carbon, o “cómo mantener la calma ante el cambio del sistema” y Cocoa, o “NeXTStep para Macintosh”. El primer entorno es el que permite que una misma aplicación funcione, con poca o ninguna modificación, en modo nativo, en Mac OS 8 y 9 y Mac OS X. El segundo es el que se supone ha de ser el futuro entorno de ejecución. Basado en Objective-C, al igual que el resto de herramientas de NeXT, se puede programar usando dicho lenguaje o el más extendido Java.

Después de juguetear con el Interface Builder (objeto de este mini tutorial) y con la escasa documentación de las clases de Cocoa, conseguí acabar una especie de aplicación que demuestra algunas de las características del entorno de desarrollo. Cocoa es un entorno potente, flexible y que proporciona un conjunto amplio de clases para que los desarrolladores tengan gran parte del trabajo resuelto. Pero, como toda herramienta nueva (al menos para los desarrolladores que no vienen de NextStep o de WebObjects) tiene una curva de aprendizaje muy acusada, es decir, es complicado aprender desde cero. Este mini curso pretende ayudar a solucionar uno de los primeros escollos, cómo manejar Interface Builder para generar una interfaz y, sobre todo, cómo hacer que esa interfaz haga lo que realmente queremos que haga.

Cómo conseguir las herramientas de programación

En el CD de la Beta Pública del Mac OS X no se incluyen las herramientas de programación para el sistema. Es preciso descargarlas del servidor web de Apple Developer Connection, y para ello hay que estar registrado como desarrollador. La buena noticia es que para tener el nivel más bajo de desarrollador (Online) no hay que pagar nada. Cualquiera puede acceder a la la dirección de Internet correspondiente (ver cuadro “Algunos enlaces útiles”) y darse de alta. Aparte de las herramientas de programación, en ese servidor se encuentran siempre las últimas versiones del kit de desarrollo de Carbon y otras herramientas útiles.

Qué es Interface Builder

Interface Builder (IB) se puede comparar, en cierta manera con un RealBasic, JBuilder, PowerPlant Constructor o cualquier otra herramienta similar que permita definir una interfaz y relacionarla, de alguna manera, con el código de la aplicación. En el caso que nos ocupa, Interface Builder edita archivos .nib. Estos archivos, utilizados tanto desde Carbon como desde Cocoa, contienen la definición de los objetos de interfaz y la relación entre éstos y los objetos de la aplicación. Más habitual, como veremos ahora, es que se cree la interfaz y el objeto que lo controla desde dentro del Interface Builder y que luego se modifique usando Project Builder (PB).

Cómo se crea una interfaz sencilla con el Interface Builder

1. Para empezar, hay que crear un proyecto de tipo “Cocoa application” con Project Builder. En el panel de la izquierda de la ventana del proyecto están los archivos que forman parte del proyecto. Aún no se ha creado ninguna clase, pero la plantilla del proyecto incluye el main(), en Objective-C (todos los programas de Cocoa, aunque se escriban en Java, están basados en la versión en Objetive-C del entorno), y un .nib que se utilizará como base para el proyecto.

2. Haciendo doble clic sobre el archivo MainMenu.nib se abre el Interface Builder. El .nib que se ha creado por defecto contiene algunos recursos ya predefinidos para que este archivo se cargue al lanzar la aplicación, se prepare y rellene una barra de menú y se abra una ventana.

3. El primer paso, en cualquier caso, es configurar la ventana de la aplicación, añadiendo los elementos que se vayan a necesitar. En el ejemplo, se buscó una complicación adicional (no fue intencional buscar dicha complicación): crear una aplicación que tuviese un TabView, una vista con “tabs” o pestañas para mostrar distintos datos de una misma imagen.

Para crear este TabView, el primer paso es arrastrarlo desde la paleta correspondiente. Una vez dimensionada en la ventana, hay que hacer doble clic sobre el tab (la pestaña con el título) que se quiera modificar. El objeto completo queda seleccionado con un marco más grueso. Para añadir elementos a este panel, se arrastran como se arrastrarían normalmente a la ventana. Una vez añadidos los objetos para el primer tab, haciendo doble clic sobre el segundo tab, los elementos añadidos al primer panel desaparecen, y se pueden añadir los elementos de este panel. Tan sólo hay que repetir tantas veces como sea necesario.

Este es un buen momento para recordar que algunos de los objetos que se pueden incluir desde las paletas del Interface Builder son objetos “complejos” formados por dos o tres clases, y que es posible desde el Interface Builder actuar sobre alguna de esas clases. El caso del TabView es un buen ejemplo, ya que aunque arrastramos un único objeto TabView, luego editamos cada uno de los TabViewItems por separado. Es importante recordar esto más tarde, cuando relacionemos nuestra interfaz con el código.

En el ejemplo que nos ocupa, se añadirá un objeto de tipo NSImageView en el primer panel, y un elemento de tipo NSScrollView (que contiene un objeto de tipo NSTextView) y un botón en el segundo panel. En el primero pretendemos mostrar una imagen. NSImageView permite abrir y mostrar los formatos más populares de imagen en Mac OS X (jpg, tiff, eps, pdf). En las preferencias del objeto es posible definir si queremos que recorte la imagen, la reduzca, la amplíe, incluso si deseamos que se pueda editar (aunque en este ejemplo no se añadirán las herramientas para editar imágenes).

El objeto NSTextView, desciende del objeto NSText, que tiene un par de métodos interesantes: writeRTFDToFile y readRTFDFromFile, que se utilizarán para grabar y leer a un archivo de tipo RTFD el texto que el usuario añada a la foto. El formato RTFD es una extensión del RTF, que permite añadir, aparte de texto, imágenes. En cuanto a archivo se comporta como un directorio (para descubrir esto se demostró muy útil el Terminal del Mac OS X).

Unir las piezas

Para leer esta parte es aconsejable descargarse el ejemplo (www.abstrakt.com/files /cocoa.sea.hqx). Para los muy curiosos, aquí se muestra el código de la aplicación. Sí, esto es todo lo que hay que escribir. En el archivo imago.java se encuentra el mismo código, comentado línea a línea.

import java.net.*;

import com.apple.cocoa.foundation.*;

import com.apple.cocoa.application.*;

public class iMago {

NSImageView canvas; // la zona donde dibujaré la imagen

NSTextField path; // el campo de edición para el path

NSTextView texto; // el texto que acompaña a la imagen

NSTabView panel; // el tabView. lo uso sólo para pasar al primer panel al abrir la imagen.

public void saveText(Object sender){

NSPathUtilities miPath = new NSPathUtilities();

String miText = new String(

miPath.stringByAppendingPathExtension(

miPath.stringByDeletingPathExtension(path.stringValue()), “rtfd”));

texto.writeRTFDToFile(miText, false);

}

public void readText(){

NSPathUtilities miPath = new NSPathUtilities();

String miText = new String(

miPath.stringByAppendingPathExtension(

miPath.stringByDeletingPathExtension(path.stringValue()), “rt