El editor de textos explicado en los capítulos anteriores carece de una funcionalidad básica importante; el poder guardar y recuperar textos con estilos, ya que si bien en ocasiones es interesante el disponer de esta opción, por ejemplo para los propios programas que usted cree en Python, en la mayoría de los casos el poder conservar las negritas, cursivas, tamaños, tipos de letra, etc . es imprescindible para las cartas y otros documentos que se crean . Por tanto el primer paso es poder grabar y leer los estilos junto con el texto en el documento .

Grabación de estilos

El formato con el que TextEdit almacena internamente los estilos es muy complejo, pero esto es lógico si se piensa en las múltiples combinaciones que se pueden realizar . Por ejemplo, puede cambiar el tipo de letra de parte del texto, estando parte de este en negrita pero además parte del texto en negrita y la continuación que sigue en estilo normal también pueden ser de otro tamaño . Estas y otras combinaciones provocan una complejidad extraordinaria .

Afortunadamente para las operaciones que quieren realizarse ahora ( distinto caso sería si usted quisiera averiguar el estilo, tamaño o tipo de letra de una selección ) no es necesario manejar esta estructura interna, basta con recuperar un bloque de datos que contiene toda esta información y grabarlo . Al recuperarlo el proceso es inverso, es decir se recupera todo este bloque de datos y se asocia automáticamente al texto . Además de esta operación el programa debe, al igual que antes, recuperar y guardar el texto puro .

En una aplicación de proceso de textos convencional estas operaciones de almacenar y recuperar el texto con estilo serían las que se consideran estándar y por tanto aparecerían con los títulos “Abrir” y “Guardar” en el menú, mientras que la opción de hacerlo como texto ASCII puro se consideraría Exportación e Importación . En este caso, y dado que el programa únicamente se hace por motivos didácticos, a estas nuevas opciones se les van a etiquetar “Guardar con estilo” y “Abrir con estilo” .

En primer lugar es necesario añadir la opción de guardar correspondiente al menú Archivo . Para ello en el objeto MiPrograma, en el archivo miprograma . py, debe añadir la línea en la función makeusermenus . Esta línea será:

self . itemGuardarEstilo = MenuItem ( self . menuArchivo, " Guardar con Estilo… " , " " ,self . GuardaVentanaEstilo )

Y asocia la opción del menú “Guardar con Estilo…” a la función GuardaVentanaEstilo del propio objeto MiPrograma . El segundo paso será crear esta función .

Para ello puede copiar la definición de GuardaVentanaASCII, ya que las operaciones a realizar son las mismas: mostrar un diálogo pidiendo el nombre y situación del archivo a guardar y llamar a una función del objeto Ventana pasándole el nombre del archivo . Lo único que cambia en este caso es el nombre de dicha función, que en lugar de ser guardaASCII será guardaEstilo . La función queda, por tanto:

def GuardaVentanaEstilo ( self,*args ) :

nombre,ok = macfs . StandardPutFile ( 'Nombre del archivo:' )

if ok:

self . ventana . guardaEstilo ( nombre . as¬ _pathname ( ) )

El grueso de las operaciones a realizar recae, evidentemente, sobre dicha función guardaEstilo . En primer lugar abra el archivo ventana . py y añada esta función guardaEstilo con los mismos parámetros que guardaASCII, self y el nombre del archivo . Pero no es esta la única coincidencia; como se ha indicado previamente, para guardar un texto con estilo, en primer lugar hay que almacenar el texto de la misma forma que se hizo previamente en guardaASCII, por lo que puede copiar y pegar todas las líneas de dicha función en esta . Otra opción hubiera sido llamar a guardarASCII desde guardaEstilo, pasándole como parámetro el nombre del archivo que ha recibido desde MiPrograma y añadir detrás las operaciones de manejo de estilo .

En cualquiera de los dos casos el proceso ya conocido consiste en abrir el archivo para escritura, recuperar el texto, grabarlo y cerrar el archivo . Este último paso también hay que realizarlo aunque parezca contradictorio, ya que se cierra antes de almacenar los estilos . Para comprender el porqué, es necesario recordar cómo funcionan los recursos . Cada archivo de Macintosh puede contener datos, como el texto en este caso, recursos, como las definiciones de diálogos, ventanas y dibujos que se han realizado en algunos ejemplos, y ambas tipos de elementos, como ocurre en muchas ocasiones . Las funciones open y close que se han manejado hasta ahora permiten manejar el área de datos de un archivo, es decir open abre el área de datos para lectura o escritura, write escribe en dicho área, close la cierra, etc . y son las que se emplean para almacenar el texto .

Pero los estilos asociados a dicho texto no sólo no se almacenan junto con él, sino que ni siquiera se almacenan en el área de datos, sino que lo hacen en el área de recursos . Para manejar esta también existen funciones que permiten abrirla, leer y escribir y cerrarla, pero son distintas a las vistas hasta ahora . Por estos motivos, una vez escrito el texto sí debe cerrarse el archivo, ya que para los estilos se van a utilizar estas nuevas llamadas .

Para recuperar los estilos se emplea una función con un nombre difícil de recordar: TEGetStyleScrapHandle . El único problema que plantea es que devuelve los estilos asociados al texto que esté seleccionado en ese momento, y no resulta muy cómodo decirle al usuario que debe seleccionar todo el texto antes de guardar el documento . La opción evidente es hacer dicha selección automáticamente desde el programa, pero además debe recordarse el texto que estuviera seleccionado previamente, o la situación de la barra de inserción si no hay ningún texto seleccionado, para devolver dicha selección a su estado anterior y que el usuario no vea cambiado el documento después de guardarlo .

Además puede ser interesante saber cómo se selecciona texto o cómo averiguar qué texto tiene seleccionado el usuario si desea incluir algunas opciones más avanzadas, como buscar un texto y seleccionarlo o crear un corrector ortográfico .

Para saber qué texto hay seleccionado se puede acceder directamente a dos variables del objeto self . ted . selStart contiene el principio de la selección y selEnd contiene el final; si ambas son iguales significa que no hay selección y ambas señalan a la posición de la barra de inserción . Otra variable útil es teLength, que da el número de caracteres en el documento . Puede obtener el valor de todas ellas simplemente haciendo referencia a self . ted . variable . Por ejemplo, el inicio de la selección se obtiene con self . ted . selStart .

Para seleccionar el texto se emplea la función TESetSelect con dos parámetros: el primero es el principio de la selección y el segundo es el final . Para seleccionar todo el texto el primero debe ser cero y el último la cantidad de caracteres que hay en el documento . Por tanto, las siguientes operaciones que hay que realizar en la función guardaEstilo son recuperar las posiciones anteriores y seleccionar todo el texto:

inicioSel = self . ted . selStart

finSel = self . ted . selEnd

self . ted . TESetSelect ( 0,self . ted . teLength )

A continuación se recuperan los estilos del texto con la ya mencionada función TEGetStyleScrapHandle, que no necesita ningún parámetro:

estilos = self . ted . TEGetStyleScrapHandle ( )

Una vez recuperados estos estilos puede devolverse la selección del texto a su situación original, que está almacenada en las variables inicioSel y finSel:

self . ted . TESetSelect ( inicioSel,finSel )

A continuación hay que escribir esta inf