MOTIF
Es
un conjunto de normas propuesto por OSF que especifican un modo de
presentación y comportamiento de los interfaces de usuario
gráficos. El modelo elegido está basado en MS-Windows y
Presentation Manager.
Un
programador podría construir una aplicación que cumpla las
"guías de estilo" de Motif pero, normalmente, usará una
biblioteca de objetos de diálogo que cumplan con los requisitos de la
especificación, como el conjunto de widgets definido por OSF.
Además
de la guía de estilo y la biblioteca de widgets, en Motif también
se incluyen un gestor de ventanas (mwm) y un lenguaje de especificación
de interfaces de usuario (UIL).
Widgets simples
La
clase Primitive de Motif es una subclase de Core que actúa
también como metaclase y de ella se derivan todas las widgets de tipo
simple (no compuesto). Incluye recursos que, entre otras cosas, controlan la
clásica apariencia tridimensional de las ventanas de Motif. A
continuación se describen algunas de las subclases de Primitive:
Label: Etiqueta que incluye un texto o
un pixmap.
PushButton: Subclase de Label.
Botón de diálogo que cambia de aspecto cuando el usuario lo
"empuja".
ToggleButton: Subclase de
Label. Botón de diálogo con dos estados entre los que va
cambiando alternativamente cada vez que el usuario lo activa.
CascadeButton: Subclase de
Label. Un tipo especial de botón al que se le asocia una widget que
actuará como un menú que se desplegará de forma
automática cuando se active el botón.
DrawnButton: Subclase de
Label. Muy similar a PushButton pero usado por aplicaciones que quieren dibujar
la imagen que hay dentro del botón.
ArrowButton: Botón con
una flecha apuntando en una dirección (arriba, abajo, a la derecha o a
la izquierda).
Separator: Actúa como
separador entre dos zonas.
List: Permite construir una
lista de elementos de texto que el usuario puede seleccionar.
ScrollBar: Clásica
barra de scroll.
Text: Gestiona un editor de
texto completo de una (clase TextField) o varias líneas.
Otro
tipo de widget simple son los gadgets. Se trata de una widget sin ventana
asociada (la entrada y salida gráfica de la widget se lleva a cabo sobre
la ventana asociada a la widget padre). Por lo tanto, no es una subclase de
Core sino de RectObj. Motif proporciona versiones gadget de las widgets
más simples. Existe, por ejemplo, la clase PushButtonGadget.
Widgets compuestas
La clase Manager de Motif es una subclase de Constraint que actúa
también como metaclase y de ella se derivan todas las widgets de tipo
compuesto (widgets contenedoras). Incluye recursos que, entre otras cosas,
controlan la clásica apariencia tridimensional de las ventanas de Motif.
La principal diferencia entre las distintas subclases de Manager es como
gestionan la posición y tamaño de las widgets hijas. A continuación
se describen algunas de las subclases de Manager:
BulletinBoard: Permite colocar a los hijos en
posiciones absolutas dentro de la ventana padre.
Form: Subclase de
BulletinBoard. Permite un control muy fino de las posiciones y tamaños
de las widgets hijas y su comportamiento ante un cambio de tamaño de la
ventana padre.
SelectionBox: Subclase de
BulletinBoard. Se trata de una widget muy específica orientada a la
selección de elementos de una lista, ya sea usando el ratón o
escribiendo el nombre del elemento. Contiene una lista con barra de scroll, un
campo para la entrada de una línea de texto (clase TextField) y tres
botones (clase PushButton) etiquetados, por defecto, como: Ok, Cancel y Help.
MessageBox: Subclase de
BulletinBoard. Se trata de una widget muy específica orientada a mostrar
un mensaje (de información, de aviso, de error, etc.). Además del
mensaje contiene tres botones (clase PushButton) etiquetados, por defecto,
como: Ok, Cancel y Help.
DrawingArea: Proporciona un
área en la que la aplicación puede dibujar gráficos. Los
eventos expose se propagan a la aplicación como callbacks.
Frame: Proporciona un marco
con aspecto tridimensional para widgets que normalmente no tienen borde.
PanedWindow: Gestiona sus
hijos organizándolos en regiones verticales ofreciendo al usuario una
manera de controlar el tamaño de cada región.
RowColumn: Organiza sus hijos
en filas y columnas. Orientado a la construcción de menús.
Scale: Proporciona un objeto
similar a una barra de scroll que permite al usuario introducir valores en un
determinado rango.
ScrolledWindow: Proporciona
dos barras de scroll (horizontal y vertical) que permiten ver una determinada
parte de un objeto de gran tamaño.
MainWindow: Subclase de
ScrolledWindow. Proporciona un marco adecuado para ser la widget base de una
aplicación típica.
Menús
En un interfaz de usuario hay diferentes tipos de menús:
Barras
de menús con menús pulldown (se despliegan al activar la
opción de la barra de menús)
Menús en cascada
Menús popup (aparecen encima del resto de las ventanas)
En Motif existen numerosas funciones de conveniencia que facilitan la
creación de los diferentes tipos de menús. La estructura
básica de un menú es la siguiente:
Una
widget de tipo MenuShell (subclase de OverrideShell) que le proporciona
independencia del resto de la aplicación.
Una widget de tipo RowColumn para organizar las opciones del menú.
Widgets
de tipo Label que sirvan como nombre del menú o sus secciones.
Widgets
de tipo Separator que sirvan para separar las posibles secciones del
menú.
Widgets
de tipo PushButton para aquellas opciones del menú que no despliegan a
su vez otro menú.
Widgets
de tipo CascadeButton para aquellas opciones que desplieguen otro menú.
Diálogos
En
muchas ocasiones la aplicación quiere mostrar una ventana temporal para,
por ejemplo, mostrar un mensaje de error o pedir al usuario que introduzca una
determinada información. En estos casos, lo normal es mostrar esta
ventana con el estilo popup (aparecerá encima del resto de las
ventanas). A este tipo de comportamiento se le denomina diálogo.
En
Motif existen numerosas funciones de conveniencia que facilitan la
creación de diferentes tipos de diálogos. La estructura
básica de un diálogo es la siguiente:
Una
widget de tipo DialogShell (subclase de TransientShell) que le proporciona
independencia del resto de la aplicación.
La
widget que se quiere mostrar. Podría ser de alguna de las siguientes
clases: BulletinBoard, SelectionBox, Form, MessageBox, etc.