ToDo List Parte 2 :D

Sip, está terminado😉 (terminado en el buen sentido de la palabra)
Funcionalmente, corre… ahora falta arreglar detalles y cosas.

Lo que más me costó, es lo que voy a postear a continuación. De todas formas, pueden descargar el código fuente😀 Recuerda2 (renombrar la extensión de .doc a .7z y luego descomprimir)

Entonces vamos por parte😀

El programa tiene 2 ventanas: Ingreso de datos / Lectura de datos
Para entrar a la primera… es solo cosa de ejecutar recuerda.exe. Para la segunda, solo agrego un argumento al .exe quedando algo asi: Recuerda.exe leer De este modo, si viene el argumento “leer” abrimos la otra ventana🙂

Para hacer esto, se necesita usar

Environment.GetCommandLineArgs().Length

y tenemos el largo del ejecutable. En nuestro caso, tenemos un largo de 2:

  1. Recuerda.exe
  2. leer

Entonces, en el main de la clase main(😯 ) tendríamos esto:

Application.Init ();
if (Environment.GetCommandLineArgs().Length >1) {
   String s = Environment.GetCommandLineArgs()[1];
   switch (s) {
      case "leer": {
         LectorXML LWin = new LectorXML();
         LWin.Show();
      } break;
   }
}else{
   MainWindow MWin = new MainWindow();
   MWin.Show();
}
Application.Run ();

Donde LectorXML y MainWindow son las clases ventana y, LWin yMWin las instancias.

Enviroment.GetCommandLineArgs()[1] 

tiene en este caso “leer”. Si quisiéramos agregar más argumentos, avanzamos en el array.

Ahora, veamos el código de LectorXML (en la primera parte vimos como escribir XML)
LectorXML es una simple ventana, que “adentro” tiene un TreeView. Éste control tiene 3 columnas:

  1. Nivel
  2. Actividad
  3. Fecha

Estuve buscando en Tooodo Google tratando de encontrar una forma “visual” para llenar los datos del TreeView, pero solamente lo encontré por código. Existen varias formas de hacerlo, pero yo seguí la más corta😀
Primero, los “using”😛

using System;
using Gtk;
using System.Xml;
using System.Collections;
using System.IO;

En el constructor de la clase, llamamos a una función “LlenaArbol()” para que llene el TV:

public LectorXML () : base(Gtk.WindowType.Toplevel)
{
   this.Build();
   LlenaArbol();
}

Que a su vez tiene el siguiente código:

private void LlenaArbol()
   {
      tree.AppendColumn("Nivel", new CellRendererPixbuf(), "pixbuf", 0);
      tree.AppendColumn("Actividad", new CellRendererText(), "text", 1);
      tree.AppendColumn("Fecha", new CellRendererText(), "text", 2);
      LeeXML();
      tree.Model=Tareas;
   }

“tree” es el nombre del TreeView. El código trata así:

  1. Creamos una nueva columna: se llama “Nivel”, el contenido de la celda se va a tratar como una imagen (un ícono),  recibe un pixbuf, y es la primera columna.
  2. La siguiente columna se llama “Actividad”, trata y recibe un text, es la segunda.
  3. Igual al de arriba😀
  4. Ahora, llamamos a la función LeeXML() -más rato lo vemos😉 -y luego le damos al tree la estructura de “Tareas”. Tareas es una variable de clase que definimos asi:
private ListStore Tareas = new ListStore
     (typeof(Gdk.Pixbuf), typeof(string), typeof(string));

Los ListStore se usan para darle la estructura a los TV, de esta forma, tendríamos lo mismo que definimos en las columnas (ok vale, algo parecido ¬¬), solo que ahora pedimos y definimos los datos😛

Ahora, veamos LeeXML():

private void LeeXML()
{
      StreamReader reader = new StreamReader("cosasAhacer.xml", System.Text.Encoding.UTF8);
      XmlTextReader lector = new XmlTextReader(reader);
      String todo = "";
      while (lector.Read ())
        {
           switch (lector.NodeType)
              {
                case XmlNodeType.Element:
		switch (lector.Name)
                          {
			case "Cosiacos": break;
			case "Actividad": break;
			case "Nivel": todo = lector.ReadString(); break;
			case "Nombre": todo = todo +"@"+ lector.ReadString(); break;
			case "Fecha": todo = todo +"@"+ lector.ReadString(); break;
			case "Estado": {
			    char[] r = {'@'};
 			    String [] temp = todo.Split(r);
			    respuesta(temp);
			    break;
			}
		   }
	      break;
           }
        }
    lector.Close ();
}

Uff Vamos por parte😉

  1. Creamos un reader para darle la ruta del XML y como tiene que tratarlo.
  2. Ahora el lector y le damos el reader.
  3. Creamos la variable todo, en ella  se guardarán los datos leídos desde el XML.
  4. Iniciamos la lectura en un while. Mientras el lector “tenga que leer” hacemos lo de adentro😀 y cuando se acabe el contenido, cerramos el lector.
  5. Esta parte nunca la entendí… El primer Switch y Case no se que hacen… pero en todas partes es igual xD así que cópienlo tal cual.
  6. El segundo switch lee el nodo. Y en los “cases” tenemos todos los nodos del xml.
    Cosiacos y Actividad son los padres, así que cuando el lector los lea, no hacemos nada.
  7. Cuando entre a nivel, nombre, o fecha; tomamos su valor interior y lo guardamos en la variable. Si es el primer nodo (nivel) sobreEscribimos lo que tenemos antes, si no, lo concatenamos con un ‘@’ entremedio de cada valor😀 quedando con un valor algo así: “nivelActividad@nombreActividad@fechaActividad”
  8. Cuando llegamos al último nodo “Estado”, separamos el String y guardamos cada “pedazo” por separado en un array. Ahora enviamos el array a la función respuesta().

respuesta() se encarga de escribir los valores que leímos en el XML, en el ListStore. El código es el siguiente:

private void respuesta(String[] array)
{
   Tareas.AppendValues(new Gdk.Pixbuf (array[0]), array[1], array[2]);
}

Un ejemplo sería:

Tareas.AppendValues
       (new Gdk.Pixbuf ("warning.png", "Bañar a Tutymon", "27-06-2010");

Y eso sería todo😀

Un SS de mi ventana sería algo así

Ventana del Lector

Listo😉
Me falta pulir algunos detalles, por ejemplo: si la actividad ya se cumplió, no listarla.
Cosillas que con tiempo realizaré😉

Acerca de MaritoCares

Ingeniero Informático. Con tendencias a la programación en [C#, VB].NET, Java(Web principalmente...), PHP, JavaScript, algo mínimo de [ruby, python], y el clásico C.
Esta entrada fue publicada en Aplicación, ArchLinux, C#, Tutoriales, Windows y etiquetada , , . Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s