NSWindow

NSWindow, NSDrawer y NSToolbar

En esta página se presentan algunas consideraciones importantes sobre la clase NSWindow, así como algunos ejemplos que muestran como agregar objetos NSDrawer y NSToolbar a las ventanas.

NSWindow

La forma más fácil de crear ventanas es con Gorm. Seleccionando una ventana, en el Inspector podemos establecer algunas características:

El campo Title es, obviamente, el titulo de la ventana. El campo Autosave Name no lo tocamos, ya que esta opción aun no esta implementada. En próximas versiones de Gorm, esta opción permitirá guardar la posición de la ventana en la configuración de la aplicación (esta configuración es mantenida por la clase NSUserDefaults). De tal forma que cuando el usuario arranque nuevamente la aplicación, la ventana aparezca en la posición donde la había dejado anteriormente. Sin embargo, es posible hacer esto desde código con (en algún método -awakeFromNib):

[ventana setFrameAutosaveName: @"VentanaEjemplo"];
[ventana setFrameUsingName: @"VentanaEjemplo"];

El primer método le dice a la ventana que guarde automáticamente (esto es, cada vez que cambie su posición o tamaño) el lienzo de la ventana con el nombre indicado. En este ejemplo “VentanaEjemplo”. El segundo método le dice a la ventana que establezca el lienzo guardado con el nombre “VentanaEjemplo” como el lienzo de la ventana. Si la posición de la ventana no es guardada, la ventana aparecerá siempre en la posición indicada por el correspondiente archivo gorm.

La sección Backing se recomienda establecerla a Buffered, ya que las otras opciones se ofrecen por compatibilidad con antiguos sistemas. En la sección Controls podemos establecer los botones que tendrá la ventana, los cambios hechos aquí solo se observan en tiempo de ejecución o al probar la interfaz desde Gorm, no son visibles en tiempo de edición.

En la sección Options las opciones son:

Release when close: Si se selecciona, la ventana se libera cuando se cierra. De lo contrario permanece en memoria.

Hide on deactivate: Si se selecciona, la ventana desaparece de la pantalla cuando la aplicación se desactiva (porque se ha seleccionado alguna ventana de otra aplicación).

Visible at launch time: Si se selecciona, la ventana sera visible al momento de cargar el archivo gorm. De lo contrario permanecerá oculta.

Deferred: Si se selecciona, el gestor de ventanas retrasa la creación de la ventana hasta que esta aparece en pantalla. Lo que significa que cualquier mensaje enviado a la misma, sera retrasado y se enviara sólo hasta que la ventana sea visible en la pantalla. De lo contrario la ventana podrá responder aun antes de que aparezca en pantalla.

One shot: Si se selecciona, la ventana se libera de la memoria cuando esta se oculta y se crea nuevamente cuando reaparece. De lo contrario, la ventana permanece en memoria cuando se oculta y simplemente se trae al frente cuando reaparece. Esta opción es útil cuando la ventana en cuestión no es muy utilizada.

Dynamic depth limit: Si se selecciona, la ventana cambiara su profundidad (resolución) para ajustarse a la profundidad de la pantalla en la que se despliega.

La sección Background Color nos permite asignarle un color al lienzo de la ventana. Si no se especifica ninguno, se utilizara el color indicado por el tema que este activo. En caso de que se le haya asignado un color a la ventana, pero se desea eliminarlo y utilizar el color del tema, en el panel de colores seleccionamos el botón NAMED y en la casilla que aparece (dando un clic sobre los puntos suspensivos) seleccionamos la opción System. Y luego en los colores desplegados, damos doble clic en el color windowBackgroundColor.

Por último, la opción Miniaturized Window Icon es, obviamente, el icono que aparecerá en el MiniWindow de la ventana. Si no se especifica ninguno, se utilizara el icono de la aplicación.

NSDrawer

Los objetos NSDrawer son pequeñas ventanas adheridas a una ventana, y que pueden ocultarse detrás de la misma. La siguiente imagen muestra un Drawer desplegado:

Para agregar un Drawer a una ventana en Gorm, primero arrastramos un componente Drawer desde la paleta (en la sección WindowsPalette) hasta nuestro archivo gorm:

En el Inspector podemos configurar en que lado se desplegara el drawer. En este ejemplo, configuro el drawer para que se despliegue en el lado derecho:

Ahora creamos una conexión desde el Drawer hasta la ventana donde queremos que aparezca. Y luego en el Inspector seleccionamos el Outlet parentWindow. Esto le indica al drawer a que ventana pertenece:

Ahora podemos agregar un botón a la ventana para desplegar y/o ocultar el drawer. En este ejemplo, configuro el botón para que sea de tipo Toggle, esto con el fin de que pueda desplegar dos títulos. El título inicial es “Mostrar Niveles” ya que el drawer esta inicialmente oculto, y el título alterno es “Ocultar Niveles”:

Ahora realizamos la conexión del botón con el drawer seleccionando el action toggle:

Si queremos utilizar una opción del menú para desplegar y/o ocultar el drawer, deberemos definir algún método para ello, con el fin de cambiar el título de la opción (ya que no es posible tener opciones tipo toggle en el menú). O simplemente ponemos el titulo como “Desplegar/Ocultar Niveles”.

Una ventana puede tener varios drawer, incluso en el mismo lado. En este ejemplo, para agregar componentes al drawer, he creado una subclase de la clase NSDrawer y la he asignado al drawer en cuestión (en el Inspector). Luego en el método awakeFromNib de dicha subclase he agregado el siguiente código (por supuesto, aquí falta realizar las conexiones de los dos componentes NSSlider):

@implementation MyDrawer
- (void) awakeFromNib
{
NSView *content = [self contentView];

NSTextField *label1 = [[NSTextField alloc] initWithFrame: NSMakeRect(20,20,20,20)];
[label1 setAlignment: NSCenterTextAlignment];
[label1 setDrawsBackground: NO];
[label1 setBezeled: NO];
[label1 setStringValue: @"R"];

NSTextField *label2 = [[NSTextField alloc] initWithFrame: NSMakeRect(60,20,20,20)];
[label2 setAlignment: NSCenterTextAlignment];
[label2 setDrawsBackground: NO];
[label2 setBezeled: NO];
[label2 setStringValue: @"Q"];

NSSlider *slider1 = [[NSSlider alloc] initWithFrame: NSMakeRect(20,40,20,240)];
NSSlider *slider2 = [[NSSlider alloc] initWithFrame: NSMakeRect(60,40,20,240)];

[content addSubview: label1];
[content addSubview: label2];
[content addSubview: slider1];
[content addSubview: slider2];

RELEASE(label1);
RELEASE(label2);
RELEASE(slider1);
RELEASE(slider2);
}

@end

NSToolbar

Una barra de herramientas es una colección de opciones desplegadas en la parte superior de una ventana. Puede conformarse de ítems sencillos, consistentes en iconos, así como de elementos NSView mas elaborados. Aquí veremos un ejemplo para crear una sencilla barra de herramientas como la que se muestra en la siguiente imagen:

El espacio entre el ítem del panel de colores y el panel de fuentes es flexible. Es decir que cambia con el ancho de la ventana.

Para tener una barra de herramientas funcional que incluya ítems predefinidos, así como ítems definidos por nosotros, necesitamos establecer como mínimo tres métodos delegados. En este ejemplo, he creado una sub clase de la clase NSWindow y la he asignado a la ventana donde colocaré la barra de herramientas. Primero, en el método awakeFromNib, creo la barra de herramientas y se la adjunto a la ventana. El código es el siguiente:

- (void) awakeFromNib
{
NSToolbar *barra = [[NSToolbar alloc] initWithIdentifier: @"MyToolBar"];
[barra setDelegate: self];
[barra setVisible: YES];
[self setToolbar: barra];
RELEASE(barra);
}

Aquí, primero se crea la barra de herramientas asignándole un identificador, MyToolBar. Es indispensable asignar un identificador, ya que puede darse el caso de que trabajemos con varias barras de herramientas. Seguidamente se establece el objeto delegado para la barra de herramientas, en este caso coloco mi sub clase. Seguidamente establezco la barra de herramientas para que sea visible desde el primer momento, aunque la barra también puede permanecer oculta y aparecer cuando el usuario la solicite. Seguidamente adjunto la barra de herramientas a la ventana en cuestión. Y por ultimo libero la barra creada (ya que la ventana retiene una copia de esta).

En seguida definimos el método delegado toolbarDefaultItemIdentifiers:, que indica cuales serán los ítems que por defecto debe mostrar la barra de herramientas (ya que es posible crear barras de herramientas que el usuario pueda configurar, pero eso no lo veremos en este ejemplo). Los ítems se ordenan de izquierda a derecha. El código es:

-(NSArray *) toolbarDefaultItemIdentifiers: (NSToolbar *) toolbar
{
return [NSArray arrayWithObjects:
NSToolbarPrintItemIdentifier,
NSToolbarSeparatorItemIdentifier,
NSToolbarShowColorsItemIdentifier,
NSToolbarFlexibleSpaceItemIdentifier,
@"fontItem", nil];
}

Este método devuelve un array que contiene los identificadores de los ítems que contendrá la barra de herramientas. Aquí agrego varios ítems predefinidos NSToolbarPrintItemIdentifier (panel de impresión), NSToolbarSeparatorItemIdentifier (separador, la linea vertical punteada),
NSToolbarShowColorsItemIdentifier (panel de colores),
NSToolbarFlexibleSpaceItemIdentifier (un espacio flexible). Otro ítem predefinido, que no utilizo aquí, es NSToolbarSpaceItemIdentifier, que consiste en un simple espacio que no es flexible. El ítem fontItem, es un ítem que se definirá más adelante y que se corresponderá con el panel de fuentes. Todos los ítems que queramos agregar (y que no sean predefinidos) debemos identificarlos como una cadena de texto (única) en este array. En este caso he agregado @”fontItem” al array.

El siguiente método delegado es el método toolbarAllowedItemIdentifiers:. Aquí debemos agregar los ítems permitidos en nuestra barra de herramientas. Esto incluye a los ítems por defecto, y aquellos que pueden ser agregados posteriormente a la misma (aunque en este ejemplo no trataremos esa parte). Este método, igual que el anterior, devuelve un array conteniendo los identificadores de los ítems permitidos. Y en este caso se trata de los mismos ítems:

- (NSArray *) toolbarAllowedItemIdentifiers: (NSToolbar *) toolbar
{
return [NSArray arrayWithObjects:
NSToolbarPrintItemIdentifier,
NSToolbarShowColorsItemIdentifier,
@"fontItem",
NSToolbarFlexibleSpaceItemIdentifier,
NSToolbarSeparatorItemIdentifier, nil];
}

El siguiente método delegado es toolbar:itemForItemIdentifier:willBeInsertedIntoToolbar:. Aquí es donde se definen nuestro ítems personales, en este caso itemFont:

- (NSToolbarItem*) toolbar: (NSToolbar*)toolbar itemForItemIdentifier: (NSString*)itemIdentifier willBeInsertedIntoToolbar: (BOOL)flag
{
NSToolbarItem *toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier: itemIdentifier] autorelease];

if([itemIdentifier isEqual: @"fontItem"])
{
[toolbarItem setLabel:@"Fuentes"];
[toolbarItem setImage:[NSImage imageNamed:@"common_ToolbarShowFontsItem"]];
[toolbarItem setTarget:self];
[toolbarItem setAction:@selector(fontPanel:)];
}

return toolbarItem;
}

Aquí mediante sentencias if podemos establecer todos nuestros items personales. Para mi ítem fontItem utilizo una imagen del sistema de gnustep, common_ToolbarShowFontsItem. Aunque pueden utilizarse imágenes propias que se encuentren en la carpeta Resources de nuestra app. El método que ejecutara este ítem es fontPanel:, el cual defino en mi sub clase.

Falta definir el método fontPanel:, y el método printDocument: (sin el cual nuestro ítem de impresión no funcionara; este método debe definirse en el objeto donde se encuentran los métodos delegados). Asumiendo que text es el outlet hacia el view que queremos imprimir, tenemos:

-(void) fontPanel: (id)sender
{
[[NSFontPanel sharedFontPanel] orderFront: self];
}

-(void) printDocument: (id)sender
{
NSPrintOperation *imprimir = [NSPrintOperation printOperationWithView: [text self] ] ;

[imprimir runOperation] ;
}

Todos estos métodos, excepto awakeFromNib, deben agregarse a la interfaz de la sub clase.

Podemos agregar un ítem al menú de nuestra app para ocultar/desplegar la barra de herramientas. Primero, en Gorm, arrastremos un nuevo ítem a nuestro menú. Y coloquemosle el titulo de “Ocultar Barra”, ya que la barra es inicialmente visible:

Seguidamente conectemos dicho ítem con el objeto NSFirst al método toggleToolbarShown:.

Al probar nuestra aplicación notaremos que GNUstep se encarga de conmutar, automáticamente, el titulo del ítem de nuestro menú de “Ocultar Barra” a “Mostrar Barra”: