Gtk.FileChooserDialog: Abrir y Guardar archivos de Texto


MonoDevelopEn este artículo vamos a crear un editor de texto muy simple, con el cual podremos abrir archivos de texto, modificarlos y guardarlos. Para lograr nuestro objetivo, aprenderemos a usar el Gtk.FileChooserDialog, y de paso aprenderemos un poco más sobre Gtk.TextView y Gtk.ScrolledWindow.

El Gtk.FileChooserDialog (Ver Documentación) es un cuadro de diálogo que nos permite navegar por el sistema de archivos y seleccionar archivos o directorios. Adecuado para acciones de tipo abrir y guardar.

Para este ejemplo estoy usando MonoDevelop 0.14 en un Debian Inestable y como siempre, empezaremos en el menú "Archivo" y "Nuevo proyecto...". Seleccionaremos "Proyecto Gtk# 2.0" y le pondremos un nombre, por ejemplo: "EditorTexto".


Para crear nuestro editor de texto vamos a usar un Gtk.TextView donde podremos ver y editar texto, sin embargo este widget no maneja un "Scroll" en si mismo. Esta es una de las tantas peculiaridades de Gtk. Para solventar este detalle se usa Gtk.ScrolledWindow el cual se debe incluir antes del TextView. Para demostrarlo he preparado un video que se muestra al dar un click sobre la siguiente imagen.


En la imagen anterior vemos el orden jerárquico y de estructura de los widgets usados en este proyecto, cuyas propiedades son:

Gtk.ScrolledWindow
Nombre del widget scrolledwindowEditor

Gtk.TextView
Nombre del widget textviewEditor

Gtk.Button
Nombre del widget buttonOpen
Button Type Stock button
Stock item gtk-open

Gtk.Button
Nombre del widget buttonSave
Button Type Stock button
Stock item gtk-save

Muy bien ya tenemos los elementos gráficos de nuestro editor de texto, ahora lo único que debemos hacer es definir las señales de los botones. Para ello solo es necesario seleccionar el botón de "Abrir", vamos a la pestaña de "Señales" y por último doble click en la señal "Clicked", de esta forma se va a crear el nombre "OnButtonOpenClicked" de la señal automáticamente. Hacemos lo mismo para el botón "Guardar".


Después de todo lo anterior deberá quedarnos un código fuente similar al siguiente:

using System;
using Gtk;

public partial class MainWindow: Gtk.Window
{	
	public MainWindow (): base (Gtk.WindowType.Toplevel)
	{
		Build ();
	}
	
	protected void OnDeleteEvent (object sender, DeleteEventArgs a)
	{
		Application.Quit ();
		a.RetVal = true;
	}

	protected virtual void OnButtonOpenClicked (object sender, System.EventArgs e)
	{
	}

	protected virtual void OnButtonSaveClicked (object sender, System.EventArgs e)
	{
	}
}

Abrir un archivo de Texto

Empezaremos por abrir un archivo de texto, por medio de Gtk.FileChooserDialog. Para ello trabajaremos dentro de la señal "OnButtonOpenClicked".

// Creamos un FileChooserDialog
FileChooserDialog chooser = new FileChooserDialog ("Abrir Archivo", this, FileChooserAction.Open);
chooser.AddButton (Gtk.Stock.Cancel, ResponseType.Cancel);
chooser.AddButton (Gtk.Stock.Open, ResponseType.Ok);

Como podemos ver, en la variable chooser asignamos el FileChooserDialog al que le mandamos los parametros:

  • title: Titulo de la ventana de diálogo
  • parent: Padre de la Ventana de diálogo
  • action: La acción a ejecutar definida en Gtk.FileChooserAction

Un FileChooserDialog no es mas que un Gtk.Dialog con un Gtk.FileChooserWidget agregado, por lo que el FileChooserDialog hereda los métodos de Gtk.Dialog, es por eso que podemos usar "chooser.AddButton" para agregar dos botones de stock: un "cancel" que nos responderá con un "cancel" y un "open" que nos responderá con un "OK".

Nota: Para los que hayan leído mi otro artículo llamado "Gtk.Dialog: Ventanas de Dialogo Modales" podrán notar que el uso es muy parecido.

Ok, ya viene lo interesante, como volcar un archivo de texto en el TextView. Para ello usaremos las librerías de System.IO la cual debemos de incluir en nuestro proyecto de esta forma:

using System;
using Gtk;
using System.IO;

Ahora sí, ya todo esta preparado para continuar dentro de OnButtonOpenClicked agregando las siguientes líneas:

// Abrir un archivo de texto y ponerlo en el TextView
if ((ResponseType) chooser.Run () == ResponseType.Ok) {
	Uri uri = new Uri (chooser.Uri);
	if (File.Exists(uri.AbsolutePath)){
		try {
			StreamReader sr = new StreamReader (uri.AbsolutePath);
			string content = sr.ReadToEnd ();
			sr.Close ();
			textviewEditor.Buffer.Text = content;
		}
		catch (Exception ex){
			Console.WriteLine (ex.Message);
		}
	}
}
chooser.Destroy ();

Me parece que el código se entiende bastante bien, solo hay algunos puntos a resaltar por su importancia.

El archivo seleccionado se puede capturar por medio de chooser.Uri y por medio de un StreamReader se puede leer el archivo para después asignarlo al buffer del textviewEditor.


Guardar un Archivo de Texto

Llegamos a la última parte, como guardar un archivo de texto; para ello trabajaremos en la señal OnButtonSaveClicked.Tal como pasó con la apertura de un archivo de texto, debemos crear el onjeto Gtk.FileChooserWidget, sin embargo, ahora con una pequeño agregado.

// Creamos un FileChooserDialog
FileChooserDialog chooser = new FileChooserDialog ("Guardar Archivo", this, FileChooserAction.Save);
chooser.DoOverwriteConfirmation = true;
chooser.AddButton (Gtk.Stock.Cancel, ResponseType.Cancel);
chooser.AddButton (Gtk.Stock.Save, ResponseType.Ok);

Como estamos trabajando en el guardado de un archivo, es importante que el mismo diálogo verifique si el archivo que vamos a escribir ya existe previamente, por lo que usamos DoOverwriteConfirmation para que esta revisión se haga de forma automática y le pregunte al usuario si desea reescribir ese archivo.


Y ya por último solo falta el código para crear o reescribir el archivo de texto.

// Se seleciona un archivo de texto y se guarda
if ((ResponseType) chooser.Run () == ResponseType.Ok) {
	Uri uri = new Uri (chooser.Uri);
	try {
		StreamWriter sr = new StreamWriter (uri.AbsolutePath, false);
		sr.Write (textviewEditor.Buffer.Text);
		sr.Close ();
	}
	catch (Exception ex){
		Console.WriteLine (ex.Message);
	}
}
chooser.Destroy ();

Al final deberíamos de tener nuestro Editor de Texto básico corriendo y se vería más o menos así:


Por el momento eso es todo, espero que este artículo les sea de utilidad y como siempre el proyecto y código relacionado a este artículo, están disponibles para su descarga en los siguientes archivos.

AdjuntoTamaño
EditorTexto.tar.gz3.98 KB



Imagen de Churrus

Como me alegro que sigas haciendo estos minitutoriales para manejar MonoDevelop ya que no hay páginas donde encontrar información.
Espero que haya una continuidad en los artículos y tutoriales y que la gente se anime en los foros para crear una pequeña comunidad.

Gracias de un principiante de MonoDevelop.

Imagen de Anónimo

Me gusto muchisimo este tutorial y todos los demas.
Muy Sencillo (gracias a las graficas) y muy funcional.

Recomendaciones para proximos Articulos; Tocar los Temas de:
1. Ambiente Web (desarrollo ASPX)
2. XML

Vengo de Trabajar con Visual Studio; Ahora me estoy "dando puñal" con linux y la verdad que los websites (Foros, Comunidades) de ejemplos practicos de MonoDevelop son muy pocos; creo que este es uno de los mejores, por sus excelentes articulos. Me gustaria algun dia empezar a aportar en estos temos e ir a la vanguardia en temas tan relevantes como toolkit(widgets) de AJAX y mas...

Imagen de Anónimo
Hola estaba mirando el código y donde pones:

FileChooserDialog chooser = new FileChooserDialog ("Abrir Archivo", this, FileChooserAction.Open);
chooser.AddButton (Gtk.Stock.Cancel, ResponseType.Cancel);
chooser.AddButton (Gtk.Stock.Open, ResponseType.Ok);

falta el * a chooser

FileChooserDialog *chooser = new FileChooserDialog ("Abrir Archivo", this, FileChooserAction.Open);
Imagen de nexus
Hola, muchas gracias por tu aporte, sin embargo me gustaría que nos amplíes tus razones y/o ventajas que nos ofrece el redefinir la variable normal (chooser) a una variable puntero (*chooser).

Saludos
Imagen de Anónimo

hOLA, COMO TE DIJE ANTES, ESTAN MUY BUENOS TUS TUTOS PERO HACEN FALTA MAS MAS MAS MAS!!! :-) JEJE

EN SERIO, POR FAVOR PONE MAS, ME ESTA GUSTANDO MUCHO ESTO DE PROGRAMAR CON MONO, AHI UN TUTO QUE ME GUSTARIA QUE HICIERA Y CREO QUE NO ES MUY LARGO: "COMO INSTALAR Y EJECUTAR LAS APLICACIONES CREADAS CON MONO EN WINDOWS"

TRATE DE PROBAR UNOS PROGRAMITAS QUE HABIA HECHO CON EL MONO PERO NO LOS PUDE EJECUTAR EN WINDOWS, XQ SERA?

Imagen de nexus

Muchísimas gracias por tus comentarios, a veces mi chamba no me deja mucho tiempo libre, pero trataré de hacer mas artículos.

Por otro lado para que corra en Windows es fácil, necesitas el .NET framework de la versión en que programaste y necesitas instalar además el GtK# que puedes descargar de aqui:

http://forge.novell.com/modules/xfmod/project/?gtks-inst4win

En teoría solo con eso deberías de ver tu aplicacion corriendo en windows.

Saludos

Imagen de Anónimo

Muy buenos los tutos, creo que en la Web es el mas ilustrativo. Aver cuando sacas uno en desarrollo WEB com monodevelop 1.0, con coneccion a base de Datos(Npgsql con postgresql) con una estructura MVC(Utilizando Nhibernate).

Como sabras no hay mucha informacion, este comentario es muy avanzado para lo que vi hasta ahora en los tutos, me gustaria mucho que pongas algo sobre esto, de antemano muchas gracias que servira para mi investigacion de mi tesis.

Saludos para todos los desarrolladores en estas tecnologias vanguardistas.

Enviar un comentario nuevo

  • Etiquetas HTML permitidas: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <pre>
  • Saltos automáticos de líneas y de párrafos.
Más información sobre opciones de formato

Captcha Image: you will need to recognize the text in it.
Igrese las letras que puede ver en la imagen superior