// -------------------------------------------------------------------------------------------------
// xsTabla.hpp
// -------------------------------------------------------------------------------------------------

// Se incluye la librería
#include "xsEasyCpp.hpp"

#ifndef __xsTabla_hpp__
#define __xsTabla_hpp__

Clase xsTabla : Publica xsObjeto
{
	Privada:
	    // Modelo para los datos de la Tabla
	    xsListaDatos* listaDatos; 		

		// Función para obtener un dato por lado de acuerdo a separador
		xsCadena fnObtenerDato(xsCadena cadena,Caracter separador,Caracter lado);

		// Función para separar Claves en una cadena de sus valores
		vector<xsCadena> fnObtenerClavesValores(xsCadena cadena, Caracter dato);

	Publica:
		
		// Tipos de celdas para la Vista de la celda
		Numerado tipoVisualizacion {tvTexto,
		                            tvImagen,
									tvProgreso,
									tvSpinner,
									tvPalanca};

        // Tipos de celdas para el modelo de datos de la tabla
		Numerado tipoCelda {Texto, 
		                    Numero,
							Decimal,
							Booleano,
		                    Imagen, 
							Icono,
							Progreso, 
							Spinner, 
							Palanca};
		
		// Celda de la tabla
		Estructura celda
		{
			// Manejo de la Celda
        	tipoCelda        tipo; 
			xsCadena         render;
			Entero           posicion; 			
			xsCadena         valorTexto;        	
			Entero           valorNumero;
			Flotante         valorDecimal;
			Logico           valorBooleano;
			xsPixelesBuffer* valorImagen;
			Entero           valorProgreso;
			Logico           valorSpinner;
			Logico           valorPalanca;
    	};
						
	    // Constructor vacío para variable Global
	    xsTabla();

        // Constructor vacío para variable Global
	    xsTabla(xsListaDatos* lista); 

		// Crear la Tabla
	    Vacio crear(xsListaDatos* lista);

		// Agregar una columna a la Tabla
		Vacio agregarColumna(xsCadena          titulo,
			                 tipoVisualizacion tipo,
			                 Entero            ancho,
							 Entero            alto,
			                 Flotante          alineamiento,
			                 Flotante          xCeldaAlineamiento,
			                 Flotante          yCeldaAlineamiento,
			                 Entero            ordenamiento,
			                 xsCadena          atributos,
							 GtkTreeCellDataFunc funcion);		


		// Insertar un renglon al modelo
		Vacio insertarRenglon();

		// Insertar un renglon al modelo
		Vacio insertarRenglon(vector<celda> renglon);

		// Obtener el Modelo
		xsListaDatos* obtenerListaDatos();

		// Función para visualizar lineas en la Tabla
		Vacio visualizarLineas(Logico visualizar);

        // Función para Seleccionar un Elemento
		Vacio seleccionar(xsCadena elemento);

        // Longitud de la tabla
		Entero longitud();

        // Función para Eliminar
		Vacio eliminar(xsCadena elemento);		

        // Función para limpiar los datos
		Vacio limpiar();

        // Función para eliminar el Seleccionado
		Vacio eliminarRenglonSeleccionado();

		// Modificar el Renglón Seleccionado
		Vacio modificarRenglonSeleccionado(vector<celda> renglon);

		// Modificar el Renglón 
		Vacio modificarRenglon(Entero indice, vector<celda> renglon);

        // Obtener un Renglón
		xsArbolIterador obtenerRenglon(Entero indice);

};

// Fin de la Definición del Archivo
#endif
