+#ifndef _ITEM_H_
+#define _ITEM_H_
-
-#ifndef GTKMM_EXAMPLE_DRAWINGAREALINES_H
-#define GTKMM_EXAMPLE_DRAWINGAREALINES_H
-
+#include <iostream>
#include <gtkmm/drawingarea.h>
+#include <gtkmm/spinbutton.h>
#include <gtkmm/stock.h>
#include <gtkmm.h>
#include <gdkmm.h>
+#include <libglademm.h>
+#include <gtkmm/entry.h>
+#include "itemptywnd.h"
+#include "workplace.h"
+///Tipo de estado en el que pueden estar los conectores de un item
+typedef enum { UNDEF, IN, OUT } ConnectorType;
+
+///Clase que define un conector del item
+class Connector {
+ public:
+ ///Numero que identifica con quien esta conectado
+ int id_dest;
+ ///Tipo de conector
+ ConnectorType type;
+ ///Sobrecarga del operador = para poder realizar asignaciones entre dos instancias de Connector
+ Connector& operator= (Connector & c) {
+ id_dest = c.id_dest;
+ type = c.type;
+ return *this;
+ }
+};
+//class WorkPlace;
+
class CItem:public Gtk::DrawingArea {
public:
+ ///Constructor
CItem();
+
+ ///Constructor, crea el item indicando cual es la imagen que le corresponde
CItem(const char *filename);
- ~CItem();
+ ///Destructor
+ virtual ~CItem();
+
+ ///Dibuja el item cada vez que este evento es llamado por la ventana que lo contiene.
virtual bool on_expose_event(GdkEventExpose* event);
- virtual void on_menu_file_popup_generic();
+
+ ///Muestra la ventana de propiedades al seleccionarse la opcion en el menu flotante.
+ virtual void on_menu_popup_propiedades();
+
+ ///Rota el item al seleccionarse la opcion en el menu flotante
+ virtual void on_menu_popup_rotar();
+
+ ///Elimina el Item al seleccionarse la opcion en el menu flotante
+ virtual void on_menu_popup_eliminar();
+
+ ///TODO: conectar los items con lineas!!!
+ virtual void on_menu_popup_conectar();
+
+ ///Retorna un puntero a la imagen actual.
Glib::RefPtr<Gdk::Pixbuf> get_image() { return image; }
+
+ ///Funciones para setear y obtener los atributos privados
+ int get_position_x();
+ int get_position_y();
+ int get_id();
+ int get_img_actual();
+ double get_caudal();
+ Glib::ustring get_name();
+ Glib::ustring get_other_name(int _id);
+ void set_position(int _x, int _y);
+ void set_id(int _id);
+ void set_caudal(double _caudal);
+ void set_name(Glib::ustring _name);
+
+ ///Retorna true si las coordenadas (_a, _b) pertenecen a otro item que ya fue colocado en el area de trabajo
+ bool is_occupied_area(int _a, int _b);
+
+ ///Devuelve el tipo de conector de el item que este en (_a, _b) y un puntero a este. Devolvera UNDEF si no hay nada.
+ ConnectorType is_other_connection_area(int _a, int _b, CItem ** _item);
+
+ /**Funcion abstracta que debe ser redefinida en cada clase descendiente.
+ * Cada clase descendiente debe implementar su manera de guardarse en
+ * en el archivo que se pasa por parametro.
+ */
+ virtual void save(FILE *archivo) = 0;
+
+ /**Funcion abstracta que debe ser implementada en las clases descendientes
+ * ya que cada item verifica sus conexione de manera difenrente y todos deben
+ * hacerlo.
+ */
+ virtual bool check_connection()=0;
+
+ ///TODO: hacer abstractas estas funciones... en item no hacen nada....
+ virtual void set_default_connector();
+ virtual ConnectorType get_connector_type( int _a, int _b );
+
+ ///Puntero al area de trabajo de la ventana principal
+ WorkPlace *workplace;
+
+ ///Puntero al cuadro de texto de la ventana principal
+ Gtk::Entry *combo_entry;
+
+ ///Puntero a la lista de items
+ std::list<CItem *> *listaItems;
+
+ ///Puntero a la lista de Items logicos
+ std::list<CItem *> *lista_logic_Items;
+
+ ///TODO poner esto en Union y crear una ventana nueva de propiedades
+ bool is_union;
+
+ ///indica si el item ya esta conectado con sus conectores bien definidos
+ bool is_connected;
+
+ ///Indica si es una compuerta logica
+ bool is_logic;
+
+ ///Indica si puede realizarse la conexion logica con una compuerta
+ static bool logic_connect;
+ static int quien;
+
+ /**Vector de connectores donde se mantiene la siguiente referencia:
+ * indice 0 = "arriba/izquierda" para la exclusa, el tubo, el codo, el empalme y el tanque.
+ * "derecha" para la bomba.
+ * es unico para el drenaje.
+ * indice 1 = "abajo/derecha" para la exclusa, el tubo, el codo, el empalme y el tanque.
+ * "izquierda" para el tanque
+ * indice 2 = "medio" para el empalme.
+ *La referencia se toma para las imagenes iniciales en el orden izquierda-derecha-medio,
+ *excepto el tanque que seria derecha-izquierda.
+ */
+ std::vector<Connector> connect_vec;
protected:
+ ///Indica el numero que le corresponde a la imagen actual del item.
+ int imgActual;
+
+ ///Numero "unico" que identifica al item.
+ int ID;
+
+ ///Nombre del item
+ Glib::ustring name;
+
+ ///Caudal maximo que puede contener un item.
+ double caudal_max;
+
+ ///Menu flotante del item
Gtk::Menu menu_popup;
- Gtk::Image menu_image;
+
+ ///Lista de opciones del menu flotante
+ Gtk::Menu::MenuList menulist;
+
+ ///Imagenes del menu flotante
+ Gtk::Image menu_image_delete, menu_image_rotar, menu_image_propiedades, menu_image_linea;
+
+ ///Puntero a la imagen del item
Glib::RefPtr<Gdk::Pixbuf> image;
+
+ ///Puntero a la ventana de propiedades del item
+ ItemPtyWnd *property_wnd;
+
+ ///Posicion del item en el area de trabajo
+ int x, y;
};
#endif