Cómo usar el Editor de Tipos de Archivos

Como probablemente sepas, el IDE de Xojo incorpora un editor que permite crear conjuntos de tipos de archivo con el objeto de que podamos utilizar posteriormente dichas definiciones a la hora de trabajar con los archivos en nuestras aplicaciones multiplataforma de escritorio. A continuación encontrarás el artículo traducido desde el original en inglés que puedes encontrar en el área de desarrolladores de la web de Xojo.

Probablemente tus aplicaciones de escritorio soliciten al usuario que seleccione archivos. También es probable que las aplicaciones generen sus propios formatos de archivo, con iconos específicos que denoten que son los utilizados por la aplicación. Estos son el tipo de acciones que puedes llevar a cabo mediante la creación de Conjuntos de Tipos de Archivo mediante el Editor File Type Set.

Existen varios tipos de archivos distintos. El tipo de un archivo define un tipo único de datos almacenado en dicho archivo. Por ejemplo, un archivo de texto almacena texto, mientras que un archivo PNG almacena imágenes en formato PNG. Los archivos tienen una extensión de archivo (o sufijo) que define el tipo de archivo. Por ejemplo, un archivo de texto tiene la extensión txt; por tanto, un archivo con el nombre MisNotas.txt es fácilmente reconocible —y reconocido— como archivo de Texto.

En vez de escribir código encargado directamente de gestionar todo esto, se utilizan los Conjuntos de Tipo de Archivo para abstraerte de todos estos detalles. Un Conjunto de Tipo de Archivo contiene uno o más tipos de archivo que representan un tipo de archivo específico y contiene información sobre cómo identificar dicho archivo. Cada tipo de archivo tiene un nombre, que es el utilizado desde el código, cuando se abren y crean los archivos. Esto te permite trabajar con nombres que puedas recordar fácilmente en vez de tener que recordar códigos crípticos. También abstrae a tu código del sistema operativo, haciendo que te resulte más sencillo crear versiones de tu app para otros sistemas operativos.

Lo que se indica en un Conjunto de Tipo de Archivo se utiliza para indicar al SO (Sistema Operativo) como han de actuar tus apps con dichos archivos.

Para crear Tipos de Archivos se utilizan el Editor de Tipos de Archivos o bien la clase FileType. Los atributos proporcionados a los tipos de archivos en el editor se mapean directamente con las propiedades de los objetos de la clase FileType.

Propiedades de Tipo de Archivo

Cuando se crea un tipo de archivo personalizado en el Editor de Conjuntos de Tipo de Archivo tendrás que especificar los valores correspondientes a las propiedades para que tu tipo de archivo sea reconocido por el SO.

Estas son las propiedades utilizadas por un Tipo de Archivo:

  • Nombre. [Requerido]. El nombre del tipo de archivo. Utilizarás este para indicar o hacer referencia a un tipo de archivo concreto en tu código.
  • Indicador Rojo/Verde. El indicador es rojo por omisión y cambia a verde cuando se hayan configurado correctmaente los iconos para el Tipo de Archivo, lo que comprende añadir tanto los diferentes tamaños de icono y máscara al Conjunto de Imágenes. No se requieren todos los iconos, sin embargo, pero todos los añadidos han de contar tanto con la imagen de icono como la máscara correspondiente. En el caso de que cualquiera de los iconos esté parcialmente completo, se mostrará de color naranja con un número indicando la cantidad de imágenes que han de corregirse. Mantén el apuntador sobre el indicador para mantener una descripción más detalladas sobre los aspectos a solucionar.
  • Conjunto de imágenes (sólo macOS). [Opcional]. El Conjunto de Imágenes contiene todos los tamaños de icono (y máscaras) requeridos para un tipo de archivo. Arrastra la imagen que quieras utilizar como icono para el tipo de archivo sobre el área de imagen del tipo de archivo, y este se escalará automáticamente para ajustarse a todos los tamaños. Esta será la imagen utilizada como icono de archivo en el Finder del macOS. Cuando cuentes con todas las imágens y máscaras indicadas para el tipo de archivo, el “Indicador de Círculo” cambiará de color rojo a verde. Una ve hayas arrastrado una imagen sobre el tipo de archivo podrás hacer clic sobre ella para acceder a la ventana de Edición de Icono, la cual mostrará todos los tamaños diferentes junto con sus imágenes y máscaras. Puedes arrastrar imágenes alternativas sobre este editor. No es obligatorio completar todas las imágenes, pero las añadidas han de contar también con su máscara. El Conjunto de Imágenes sólo se utiliza en las apps de macOS.

  • Mostrar Nombre. [Opcional]. Este se muestra en los cuadros de diálogo de archivo de Windows.
  • Descripción [Opcional]. Una descripción sobre el tipo de archivo que permite recordar su propósito.
  • Identificador UTI (sólo macOS). (Requerido para macOS). El Uniform Type Identifier es un identificador único utilizado por macOS para identificar un archivo. Se crea utilizando la notación de DNS inverso comenzando con com.nombreEmpresa.miNombreDeTipo asegurando así su unicidad. Un ejemplo de UTI podría ser com.ejemplo.datocontacto.
  • De acuerdo a (sólo macOS). Requerido para macOS cuando el tipo UTI es Exportado (o es un tipo de archivo común). El UTI con el que se corresponde el Identificador UTI anterior. Este debe dejarse en blanco para tus propios tipos de archivo cuando el Tipo de UTI es Importado. Los UTI son jerárquicos, de modo que necesitas proporcionar un “padre” o “tipo base” para tus UTI de tipo de archivo. Apple mantiene un completo listado de Identificadores de Tipo Uniformes Declarados en el Sistema que puedes utilizar. Si no quieres identificar el contenido de tu archivo con otras apps, puedes utilizar el tipo base public.data. Si quieres que otras apps puedan reconocer el contenido de tu tipo de archivo, entonces puedes utilizar un tipo más específico. Por ejemplo, si tu archivo de datos contiene cualquier tipo de texto puedes utilizar public.text para permitir que otras apps que trabajen con texto puedan abrir tu archivo. También puedes listar múltiples UTI separándolos con comas. Algunos UTI útiles son:
    • public.data: Tipo físico base para flujos de bytes (archivos planos, datos del portapapeles, etc).
    • public.database: Tipo funcional base para bases de datos.
    • public.text: Tipo base para todo el texto, incluyendo texto con información de marcado (HTML, RTF, etc).
    • public.html: Texto HTML.
    • public.xml: Texto XML.
  • Extensiones. [Requerido] Las extensiones de archivo para el tipo de archivo (el prefijo “.” es opcional). Cuando tienes múltiples extensiones, sepáralas utilizando el símbolo punto y coma.
  • Tipos MIME (sólo macOS). [Opcional] Usado sólo por macOS, los tipos MIME son tipos de formato de archivo y medios estándar. La IANA mantiene un listado con todos los tipos MIME. Por ejemplo, JPEG tiene este tipo MIME: image/jpeg. Probablemente tus tipos de archivo personalizados carezcan de tipo MIME dado que no se tratan de formatos de archivo estándares. Se puede proporcionar un tipo MIME para proporcionar información adicional a otras apps que puedan utilizar el archivo.
  • Tipos OS (sólo macOS). El ostype de cuatro caracteres de macOS utilizado para el tipo de archivo. Un ejemplo podría ser “JPEG”. Este se mantiene por cuestiones de compatibilidad hacia atrás, pero no es necesario en las actuales versiones de macOS.
  • Tipo UTI (sólo macOS). Este puede ser Importado o Exportado. Un tipo UTI importado (por omisión) crea un tipo de archivo del que tu app no es propietario, pero que querría utilizar. Un ejemplo sería si quieres que tu aplicación pueda abrir los archivos de imagen PNG. Los Tipos de Archivos Comunes que añadas a tu proyecto deberían de definirse como Importados.Un tipo UTI exportado crea un tipo de archivo del que tu app es propietario (el tipo también está disponible para su uso por otras aplicaciones del sistema). Por ejemplo, una app que utiliza (deine o crea) un formato de documento propietario debería de declararlo como un tipo de UTI Exportado. No declares un tipo de archivo estándar (como pueda ser PDF o PNG) como tipo de archivo exportado, dado que esto podría alterar el comportamiento estándar del sistema.Cuando cambias este ajuste, el icono junto al nombre en la parte superior del tipo de archivo cambia para indicar Imported o Exported.

Información macOS adicional

En macOS, la información de Tipo de Archivo indicada anteriormente se utiliza para crear un UTI que se incluye en el `Info.plist` para la app. macOS también requiere de un paso adicional en el que se indican los roles para cada uno de los tipos de archivo. Para definir los roles, selecciona macOS en los Ajustes de Compilación y haz clic en el botón Tipos de Archivo (File Types) para acceder a la ventana con todos los tipos de archivo definidos en el proyecto. Aquí podrás seleccionar los tipos que quieres que reconozca tu app, así como elegir el rol para cada tipo. Este es el listado de todos los tipos que puede comprender la app, junto con las acciones sobre si puede editar, sólo ver (leer) o la posibilidad de escribir archivos de ciertos tipos (entre bastidores este configura CFBundleTypeRole en Info.plist). Los Roles son:

  • None: No se usa el tipo de archivo en tu app.
  • Editor: Tu app puede leer, editar y escribir archivos de este tipo, y te proporcionará el comportamiento habitual de documento. Utiliza este para los archivos que sean propietarios de tu app o que pueda crear.
  • Viewer: Tu app puede abrir y leer un formato de archivo específico, pero no puede guardar en este formato de archivo. Utiliza este pra los archivos que pueda abrir tu app, pero que no pueda crear o de los que no sea propietaria.
  • Shell: No documentado por Apple.

Un tipo de archivo y rol correctamente configurados activa estas características del SO:

  • Los diálogos de selección de archivos pueden limitar la selección de los archivos.
  • Al abrir un archivo se ejecutará automáticamente la aplicación y le pasará el archivo.
  • El icono de Tipo de Archivo aparecerá en el Finder para los archivos creados por la app.
  • Se ejecutará la app al arrastrar un archivo sobre el icono del Dock de la app, en el caso de que no esté funcionando ya, y se le pasará el archivo.

Puedes obtener más información sobre el modo en el que macOS utiliza los UTI en estos artículos:

Información sobre Windows

En Windows sólo es necesario indicar las extensiones para limitar la selección de archivos en los diálogos de navegación.

El instalador de la app de Windows necesitará crear entradas en el Registro para configurar un icono de archivo asociado y permitir la apertura de documentos que ejecuten automáticamente la aplicación. Para obtener información adicional sobre esto, puedes consultar la documentación sobre los Scripts Inno Setup de ejemplo para apps de 32 y 64 bits.

Usar Tipos de Archivos Comunes

Un tipo de archivo común es un tipo de archivo estándar utilizado por tu app, pero del que no es propietario. Estos pueden ser tipos de archivos como los PNG o los archivos de texto estándar. Puede que tu app abra o incluso cree estos tipos de archivos, pero no es en ningún caso el propietario del archivo.

Para añadir un tipo de archivo común a un Conjunto de Tipos de Archivo, selecciona el botón Common File Type en la barra de comandos para el Conjunto de Tipos de Archivo y selecciona el deseado. Esta acción poblará el tipo de archivo con la información necesaria que no tendría por qué ser modificada.

Este es un ejemplo de tun tipo de archivo PNG (en un Conjunto de Tipos de Archivo denominado ImageFileTypeSet) que puede utilizarse para abrir y guardar archivos PNG (para crearlo, selecciona image/png en el botón Add Common File Type):

Ahora puedes referirte al tipo de archivo para indicar al usuario que abra un archivo PNG. Este código solicita un archivo al usuario, asignándolo a continuación a la propiedad Picture para mostrarlo en un Canvas:

Dim pngFile As FolderItem
pngFile = GetOpenFolderItem(ImageFileTypeSet.Png)
If pngFile <> Nil Then
  PNGImage = Picture.Open(pngFile)
  ImageCanvas.Invalidate
End If

También puedes crear tus propios archivos PNG. Este código guarda un archivo PNG que contiene un círculo de color rojo:

Dim redCircle As New Picture(100, 100)
redCircle.Graphics.ForeColor = &cff0000
redCircle.Graphics.FillOval(0, 0, 100, 100)

Dim savePNG As FolderItem
savePNG = GetSaveFolderItem(ImageFileTypeSet.Png, "RedCircle.png")
If savePNG <> Nil Then
  redCircle.Save(savePNG, Picture.SaveAsPNG)
End If

Se utiliza el icono por defecto del sistema para los archivos PNG, siendo el que se muestra cuando se ve el PNG en el navegador de archivos del sistema.

Usar Tipos de Archivos Personalizados

Un tipo de archivo personalizado es un tipo de archivo en el que especificas todas sus propiedades. Para los tipos de archivo estándar deberías utilizar un tipo de archivo común en vez de crear tu propio tipo de archivo personalizado. Normalmente, crearás tipos de archivos personalizados para los tipos de archivo que son propietarios para tu app. Estos son los archivos que tu app crea y que también puede abrir y editar.

Una vez has indicado un Tipo de Archivo personalizado, los archivos guardados por tu app para dicho tipo de archivo mostrarán el icono personalizado que hayas indicado. Tu app también se ejecutará cuando el usuario abra el tipo de archivo (generalmente haciendo doble clic sobre el icono), pero el usuario puede cambiar dicho comportamiento mediante el SO propiamente dicho.

Este Tipo de Archivo de ejemplo (en un Conjunto de Tipo de Archivo denominado XojoTextFileTypeSet) es el utilizado por el siguiente código:

Los campos UTI Identifier, Conforms To, Mime Types y OS Types sólo se utilizan por macOS.

Para tus apps de Mac también has de configurar los Tipos de Archivo en los Ajustes de Compilación de macOS. Haz clic en macOS en los Ajustes de Compilación y haz clic a continuación en el botón Tipos de Archivo del Inspector. Esto mostrará la ventana de selector de Tipo de Archivo, donde tendrás que indicar que el anterior tipo de archivo tiene el rol de Editor:

Guardar Archivos

Arhora que ya has indicado correctamente el tipo de archivo, pueses usarlo para guardar archivos de dicho tipo. Cuando preguntas al usuario sobre el archivo a guardar, incluye el tipo de archivo anteiror. Este código está en el manejador de evento Action del botón Guardar en una ventana:

Dim f As FolderItem
Dim output As TextOutputStream
f = GetSaveFolderItem(XojoTextFileTypeSet.XojoText, "SampleFile.xojotext")
If f <> Nil then
  output = TextOutputStream.Create(f)
  output.Write(EditArea.Text)
  output.Close
End if

En Mac, el archivo guardado utilizará el icono correspondiente al tipo de archivo.

También puedes utilizar la clases SaveAsDialog para tener mayor control sobre el diálogo de guardado mostrado al usuario.

En Mac es posible que el icono no aparezca de inmediato para el tipo de archivo asociado. El Finder no siempre tiene tiempo de inspeccionar la app para hallar los tipos de archivo cuando se está ejecutando directamente desde el IDE. Siempre puedes dejar en funcionamiento la app en depuración durante una mayor cantidad de tiempo, o bien tratar de compilar la app y navegar hasta su carpeta.

En Windows, el instalador ha de crear entradas en el Registro para configurar el icono con el archivo asociado y permitir que la apartura de documentos ejecute automáticamente la app.

Abrir Archivos

Cuando solicitas al usuario que abra un archivo puedes incluir el tipo de archivo, de modo que el usuario solo pueda seleccionar los archivos de tu app. Este método carga el texto de un archivo y lo muestra en un TextField:

Sub LoadFile(f As FolderItem = Nil)
  Dim file As FolderItem = f
  Dim input As TextInputStream

  If file Is Nil Then
    ' Prompt user for file to open
    file = GetOpenFolderItem(XojoTextFileTypeSet.XojoText)
  End If

  If file <> Nil Then
    input = TextInputStream.Open(file)
    EditArea.Text = input.ReadAll
    input.Close
  End If
End Sub

Este se ejecuta desde el manejador de evento Action de un botón “Abrir” en la ventana:

LoadFile

También puedes utilizar la clase `OpenDialog` para obtener mayor control sobre el diálogo mostrado al usuario.

Si necesitas indicar múltiples tipos de archvo, puedes concatenarlos de la siguiente forma:

MySet.Type1 + MySet.Type2

Por último, cuando el usuario hace doble clic sobre uno de los archivo de tu aplicación esta se ejecutará y obtendrá un FolderItem con el archivo. Accederás a esta información en el manejador de evento App.OpenDocument, donde puedes procesar el archivo. Tendrás que compilar la app para que el SO la ejecute de modo que puedas probar esta funcionalidad. Este código crea una nueva ventana y carga el archivo de texto en ella llamando al método mostrado a anteriormente:

Dim win As New DocWindow
win.LoadFile(item)
win.Show

También se invoca el método OpenDocument cuando se arrastra el archivo sobre el icono de la aplicación (ejecutando por tanto la app) o sobre el icono del Dock (en macOS).

En Windows, el instalador de tu app tendrá que crear entradas en el registro para configurar la asociación del icono de archivo y permitir que la apertura de los documentos ejecuten automáticamente la app.

Cómo Referirse a los Tipos de Archivo

Además de las formas directas de referirse a un tipo de archivo específico, tal y como se ha mostrado en los anteriores ejemplo, también existen otros modos en los que puedes referirte a múltiples tipos de archivos. Pongamos por caso que creas un Conjunto de Tipos de Archivos denominado ImageTypes en el que indicas todas las imágenes válidas que puede abrir tu aplicación. Puedes indicar toda la lista de tipos de imágenes con una línea como la siguiente:

Dim f As FolderItem
f = GetOpenFolderItem(ImageTypes.All)

Si necesitas añadir o eliminar tipos de arhivo de imagen, sólo has de modificar el Conjunto de Tipos de archivo y esta línea de código hará referencia automáticamente a los nuevos miembros del grupo.

Si sólo tienes un tipo de archivo, puedes hacer referencia directamente a su nombre:

Dim f As FolderItem
f = GetOpenFolderItem(ImageTypes.PNG)

Si tu Conjunto de Tipos de Archivo tiene múltiples tipos de archivo, puedes concatenarlos:

Dim f As FolderItem
f = GetOpenFolderItem(ImageTypes.JPEG + ImageTypes.PNG)

Solución de problemas

En macOS, Apple proporciona algunos consejos para resolver los ajustes de los Tipos de Archivo (UTI):

En concreto, algunos comandos útiles son:

  • mdimport -d1 . Te indica a qué UTI cree que se corresponde el archivo.
  • mdimport -d2 . Muestra los metadatos importados para el archivo. Examina kMDItemContentTypeTree para ver la jerarquía con la que cree que se corresponde este archivo.

Para cualquiera que tenga múltiples versiones de Xojo instaladas, habrá un montón de entradas dado que algunas se habrán importado por el antiguo Spotlight Importer y otras características. Para probarlo es generalmente mejor crear una nueva cuenta de usuario en la que nunca se haya instalado Xojo y utilizar dichos comandos.

Launch Services

Para que macOS conozca las aplicaciones estas han de estar registradas, de modo que funcionen correctamente los ajustes de sus tipos de archivo. Por lo general esto se realiza automáticamente en estas situaciones:

  • Una herramienta de serie en segundo plano, funciona cuando se arranca el sistema o se conecta un nuevo usuario, buscando automáticamente las carpetas Aplicaciones en los dominios de sistema, red, local y de usuario, registrando cualquier nueva aplicación que encuentre.
  • El Finder registra automáticamente todas las apps en cuanto es consciente de ellas, como cuando se arrastran sobre el disco del usuario o cuando el usuario navega a una carpeta que las contiene.
  • Cuando el usuario intanta abrir un documento para el cual no se encuentra una aplicación favorita en la base de datos de Launch Services, el Finder presenta un diálogo preguntando al usuario que seleccione la app que desea para abrir el documento. Entonces registra dicha app antes de ejecutarla.

Puedes obtener más información en el documento oficial Apple Launch Services Concepts.

Notas sobre Linux

Crea un tipo MIME:

sudo -H gedit /etc/mime.types and add the line application/x-xojotext xojotext

Añade el icono (que ha de llamarse application-x-xojotext.svg):

sudo cp PathToIcon/application-x-xojotext.svg /usr/share/icons/gnome/scalable/mimetypes

(No olvides sustituir PathToIcon con la ruta actual a tu icono)

Puedes encontar más información sobre este tema en la documentación oficial de Ubuntu.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *