</child>
<child>
- <widget class="GtkImageMenuItem" id="open1">
+ <widget class="GtkImageMenuItem" id="main_menu_open">
<property name="visible">True</property>
<property name="label">gtk-open</property>
<property name="use_stock">True</property>
</widget>
</child>
- <child>
- <widget class="GtkImageMenuItem" id="save_as1">
- <property name="visible">True</property>
- <property name="label">gtk-save-as</property>
- <property name="use_stock">True</property>
- <signal name="activate" handler="on_save_as1_activate" last_modification_time="Tue, 14 Oct 2003 11:17:30 GMT"/>
- </widget>
- </child>
-
<child>
<widget class="GtkMenuItem" id="separatormenuitem1">
<property name="visible">True</property>
<property name="title" translatable="yes">Propiedades del Tanque</property>
<property name="type">GTK_WINDOW_TOPLEVEL</property>
<property name="window_position">GTK_WIN_POS_CENTER</property>
- <property name="modal">False</property>
+ <property name="modal">True</property>
<property name="resizable">False</property>
<property name="destroy_with_parent">False</property>
<property name="has_separator">True</property>
<property name="title" translatable="yes">Propiedades del </property>
<property name="type">GTK_WINDOW_TOPLEVEL</property>
<property name="window_position">GTK_WIN_POS_CENTER</property>
- <property name="modal">False</property>
+ <property name="modal">True</property>
<property name="resizable">False</property>
<property name="destroy_with_parent">False</property>
<property name="has_separator">True</property>
<widget class="GtkFileSelection" id="file_selection">
<property name="border_width">10</property>
- <property name="title" translatable="yes">Select File</property>
+ <property name="title" translatable="yes">Guardar ...</property>
<property name="type">GTK_WINDOW_TOPLEVEL</property>
<property name="window_position">GTK_WIN_POS_CENTER</property>
- <property name="modal">False</property>
+ <property name="modal">True</property>
<property name="resizable">True</property>
<property name="destroy_with_parent">False</property>
<property name="show_fileops">True</property>
<property name="title" translatable="yes">Propiedades de la Exclusa</property>
<property name="type">GTK_WINDOW_TOPLEVEL</property>
<property name="window_position">GTK_WIN_POS_CENTER</property>
- <property name="modal">False</property>
+ <property name="modal">True</property>
<property name="resizable">False</property>
<property name="destroy_with_parent">False</property>
<property name="has_separator">True</property>
<property name="title" translatable="yes">Seleccionar Color</property>
<property name="type">GTK_WINDOW_TOPLEVEL</property>
<property name="window_position">GTK_WIN_POS_CENTER</property>
- <property name="modal">False</property>
+ <property name="modal">True</property>
<property name="resizable">False</property>
<property name="destroy_with_parent">False</property>
<property name="title" translatable="yes">Propiedades de la Bomba</property>
<property name="type">GTK_WINDOW_TOPLEVEL</property>
<property name="window_position">GTK_WIN_POS_CENTER</property>
- <property name="modal">False</property>
+ <property name="modal">True</property>
<property name="resizable">False</property>
<property name="destroy_with_parent">False</property>
<property name="has_separator">True</property>
</child>
</widget>
+<widget class="GtkFileSelection" id="file_open_selection">
+ <property name="border_width">10</property>
+ <property name="title" translatable="yes">Abrir ...</property>
+ <property name="type">GTK_WINDOW_TOPLEVEL</property>
+ <property name="window_position">GTK_WIN_POS_CENTER</property>
+ <property name="modal">True</property>
+ <property name="resizable">True</property>
+ <property name="destroy_with_parent">False</property>
+ <property name="show_fileops">True</property>
+
+ <child internal-child="cancel_button">
+ <widget class="GtkButton" id="cancel_button2">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ </widget>
+ </child>
+
+ <child internal-child="ok_button">
+ <widget class="GtkButton" id="ok_button2">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ </widget>
+ </child>
+</widget>
+
</glade-interface>
#include "and.h"
#include "or.h"
#include "not.h"
+#include "libxml/parser.h"
class Constructor : public Gtk::Window {
public:
int id;
// / defino los elementos de la ventana.
Gtk::Button *btn_canio, *btn_codo, *btn_y, *btn_tanque, *btn_bomba, *btn_exclusa, *btn_drain, *btn_file_ok, *btn_file_cancel, *btn_check, *btn_dlg_close,
- *btn_and, *btn_or, *btn_not;
- Gtk::ImageMenuItem *main_menu_quit, *edit_menu_del, *main_menu_save;
+ *btn_and, *btn_or, *btn_not, *btn_open_ok, *btn_open_cancel;
+ Gtk::ImageMenuItem *main_menu_quit, *edit_menu_del, *main_menu_save, *main_menu_open;
Gtk::CheckButton *chk_btn_logica;
- Gtk::FileSelection *file_selection;
+ Gtk::FileSelection *file_selection, *file_open_selection;
Gtk::Entry *combo_entry;
Gtk::Dialog *dlg_connect;
Gtk::Label *dlg_label;
virtual void on_btn_or_drag_get(const Glib::RefPtr<Gdk::DragContext>& context, GtkSelectionData* selection_data, guint info, guint time);
virtual void on_btn_not_drag_get(const Glib::RefPtr<Gdk::DragContext>& context, GtkSelectionData* selection_data, guint info, guint time);
virtual void on_main_menu_quit();
+ virtual void on_main_menu_open();
virtual void on_main_menu_save();
virtual void on_edit_menu_del();
virtual void on_chk_btn_clicked();
+ virtual void on_btn_open_cancel_clicked();
virtual void on_btn_file_ok_clicked();
virtual void on_btn_file_cancel_clicked();
virtual void on_btn_check_clicked();
virtual void on_btn_dlg_connect_clicked();
-
+ virtual void on_load_from_xml();
+
// señales para cambiar el icono.
virtual void on_canio_drag_begin(const Glib::RefPtr<Gdk::DragContext>& context);
virtual void on_y_drag_begin(const Glib::RefPtr<Gdk::DragContext>& context);
virtual void on_item_drag_data_get(const Glib::RefPtr<Gdk::DragContext>& context, GtkSelectionData* selection_data, guint info, guint time);
virtual void on_item_drop_drag_received(const Glib::RefPtr<Gdk::DragContext>& context, int x, int y, GtkSelectionData* selection_data, guint info, guint time);
+
+ // Carga desde un XML
+ Pump *loadBomba(xmlNodePtr nodo);
+ Conduct *loadConduct(xmlNodePtr nodo);
+ Exclusa *loadExclusa(xmlNodePtr nodo);
+ Cistern *loadTank(xmlNodePtr nodo);
+ Union *loadUnion(xmlNodePtr nodo);
+ Drain *loadDrain(xmlNodePtr nodo);
+ Splitter *loadCodo(xmlNodePtr nodo);
};
#endif
refGlade->get_widget("btn_or", btn_or);
refGlade->get_widget("btn_not", btn_not);
refGlade->get_widget("main_menu_quit",main_menu_quit);
+ refGlade->get_widget("main_menu_open",main_menu_open);
refGlade->get_widget("main_menu_save",main_menu_save);
refGlade->get_widget("edit_menu_del",edit_menu_del);
refGlade->get_widget("chk_btn_logica",chk_btn_logica);
+ refGlade->get_widget("file_open_selection",file_open_selection);
refGlade->get_widget("file_selection",file_selection);
refGlade->get_widget("combo_entry",combo_entry);
refGlade->get_widget("btn_check",btn_check);
chk_btn_logica->signal_clicked().connect(SigC::slot(*this, &Constructor::on_chk_btn_clicked));
main_menu_quit->signal_activate().connect(SigC::slot(*this, &Constructor::on_main_menu_quit));
+ main_menu_open->signal_activate().connect(SigC::slot(*this, &Constructor::on_main_menu_open));
main_menu_save->signal_activate().connect(SigC::slot(*this, &Constructor::on_main_menu_save));
edit_menu_del->signal_activate().connect(SigC::slot(*this,&Constructor::on_edit_menu_del));
btn_file_cancel = file_selection->get_cancel_button();
btn_file_ok = file_selection->get_ok_button();
- btn_file_cancel->signal_clicked().connect(SigC::slot(*this,&Constructor::on_btn_file_cancel_clicked));
btn_file_ok->signal_clicked().connect(SigC::slot(*this,&Constructor::on_btn_file_ok_clicked));
+ btn_file_cancel->signal_clicked().connect(SigC::slot(*this,&Constructor::on_btn_file_cancel_clicked));
+ btn_open_cancel = file_open_selection->get_cancel_button();
+ btn_open_ok = file_open_selection->get_ok_button();
+ btn_open_ok->signal_clicked().connect(SigC::slot(*this,&Constructor::on_load_from_xml));
+ btn_open_cancel->signal_clicked().connect(SigC::slot(*this,&Constructor::on_btn_open_cancel_clicked));
+
// Señales para cambiar el icono cuando empieza el drag.
btn_canio->signal_drag_begin().connect( SigC::slot(*this, &Constructor::on_canio_drag_begin));
btn_y->signal_drag_begin().connect( SigC::slot(*this, &Constructor::on_y_drag_begin));
//hide();
}
+void Constructor::on_main_menu_open()
+{
+ // Conecto el boton OK para llamar al cargar del XML
+ file_open_selection->show();
+}
+
void Constructor::on_main_menu_save()
{
+ // Conecto el boton OK para llamar al salvar
file_selection->show();
}
logica = !logica;
}
+void Constructor::on_load_from_xml()
+{
+ std::string file_name = file_open_selection->get_filename();
+
+ /* Parseo de ejemplo de un XML desde archivo */
+ xmlDocPtr document;
+ document = xmlParseFile(file_name.c_str());
+ if (document == NULL) {
+ // TODO : dar un aviso de que no se pudo abrir el archivo!!
+ return;
+ }
+
+ /* bien, el archivo se parseo bien! */
+ xmlNodePtr nodo, items;
+ nodo = document->children;
+
+ // Recorro los items
+ CItem *current;
+ if (strcmp((char *)nodo->name, "planta") == 0) {
+ items = nodo->children;
+ while (items != NULL) {
+ current = NULL;
+ if (items->type == XML_ELEMENT_NODE) {
+ std::cout << "ITEM" << std::endl;
+ if (xmlStrcmp(items->name, BAD_CAST"bomba")==0) {
+ current = loadBomba(items);
+ } else if (xmlStrcmp(items->name, BAD_CAST"tubo")==0) {
+ current = loadConduct(items);
+ } else if (xmlStrcmp(items->name, BAD_CAST"codo")==0) {
+ current = loadCodo(items);
+ } else if (xmlStrcmp(items->name, BAD_CAST"exclusa")==0) {
+ current = loadExclusa(items);
+ } else if (xmlStrcmp(items->name, BAD_CAST"tanque")==0) {
+ current = loadTank(items);
+ } else if (xmlStrcmp(items->name, BAD_CAST"empalme")==0) {
+ current = loadUnion(items);
+ } else if (xmlStrcmp(items->name, BAD_CAST"drenaje")==0) {
+ current = loadDrain(items);
+ }
+
+ if (current != NULL) {
+ // Agrego y conecto la bomba
+ listaItems.push_back(current);
+ current->drag_source_set(listTargets);
+ workplace->put(*current, current->get_position_x(), current->get_position_y());
+ //Apunto al workplace
+ current->workplace= workplace;
+ //Apunto a la lista.
+ current->combo_entry = combo_entry;
+ //Apunto a la listaItems.
+ current->listaItems = &listaItems;
+ //Apunto a la lista de items logicos
+ current->lista_logic_Items = &lista_logic_Items;
+ // Conecto las señales
+ current->signal_drag_data_get().connect( SigC::slot(*this, &Constructor::on_item_drag_data_get));
+ current->signal_drag_begin().connect(SigC::bind( SigC::slot(*this, &Constructor::on_item_drag_begin), current));
+ current->show();
+ }
+ }
+ items = items->next;
+ }
+ } else {
+ // TODO : avisar que el XML no es valido!!
+ }
+ std::cout << "CARGA COMPLETA" << std::endl;
+ file_open_selection->hide();
+}
void Constructor::on_btn_file_ok_clicked()
{
std::list<CItem *>::iterator i = listaItems.begin();
file_selection->hide();
}
+void Constructor::on_btn_open_cancel_clicked()
+{
+ file_open_selection->hide();
+}
+
void Constructor::on_btn_dlg_connect_clicked()
{
dlg_connect->hide();
dlg_connect->show();
}
}
+
+Pump *Constructor::loadBomba(xmlNodePtr nodo)
+{
+ std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
+ std::string id = (char *)xmlGetProp(nodo, BAD_CAST"id");
+ int orientacion=0, x, y;
+ float flujo;
+
+ nodo = nodo->children;
+ while (nodo != NULL) {
+ if (nodo->type == XML_ELEMENT_NODE) {
+ if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) {
+ orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) );
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) {
+ x = atoi( (char *)XML_GET_CONTENT(nodo->children) );
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) {
+ y = atoi( (char *)XML_GET_CONTENT(nodo->children) );
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"entrega") == 0) {
+ flujo = atof( (char *)XML_GET_CONTENT(nodo->children) );
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"color") == 0) {
+ // FIXME !
+ }
+ }
+ nodo = nodo->next;
+ }
+
+ Pump *p = new Pump(orientacion);
+ p->set_position(x,y);
+ p->set_entrega(flujo);
+ p->set_id( atoi(id.c_str()) );
+ p->set_name(name);
+
+ return p;
+}
+
+Conduct *Constructor::loadConduct(xmlNodePtr nodo)
+{
+ std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
+ std::string id = (char *)xmlGetProp(nodo, BAD_CAST"id");
+ int orientacion=0, x, y;
+ float flujo;
+
+ nodo = nodo->children;
+ while (nodo != NULL) {
+ if (nodo->type == XML_ELEMENT_NODE) {
+ if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) {
+ orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) );
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) {
+ x = atoi( (char *)XML_GET_CONTENT(nodo->children) );
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) {
+ y = atoi( (char *)XML_GET_CONTENT(nodo->children) );
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"caudal") == 0) {
+ flujo = atof( (char *)XML_GET_CONTENT(nodo->children) );
+ }
+ }
+ nodo = nodo->next;
+ }
+
+ Conduct *p = new Conduct(orientacion);
+ p->set_position(x,y);
+ p->set_caudal(flujo);
+ p->set_id( atoi(id.c_str()) );
+ p->set_name(name);
+
+ return p;
+}
+
+Exclusa *Constructor::loadExclusa(xmlNodePtr nodo)
+{
+ std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
+ std::string id = (char *)xmlGetProp(nodo, BAD_CAST"id");
+ std::string estado;
+ int orientacion=0, x, y;
+ float flujo;
+
+ nodo = nodo->children;
+ while (nodo != NULL) {
+ if (nodo->type == XML_ELEMENT_NODE) {
+ if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) {
+ orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) );
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) {
+ x = atoi( (char *)XML_GET_CONTENT(nodo->children) );
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) {
+ y = atoi( (char *)XML_GET_CONTENT(nodo->children) );
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"estado") == 0) {
+ estado = (char *)XML_GET_CONTENT(nodo->children);
+ }
+ }
+ nodo = nodo->next;
+ }
+
+ Exclusa *p = new Exclusa(orientacion);
+ p->set_position(x,y);
+ p->set_id( atoi(id.c_str()) );
+ p->set_name(name);
+ p->set_estado( estado == "1" );
+
+ return p;
+}
+
+Cistern *Constructor::loadTank(xmlNodePtr nodo)
+{
+ std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
+ std::string id = (char *)xmlGetProp(nodo, BAD_CAST"id");
+ int orientacion=0, x, y;
+ float liquido,capacidad;
+
+ nodo = nodo->children;
+ while (nodo != NULL) {
+ if (nodo->type == XML_ELEMENT_NODE) {
+ if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) {
+ orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) );
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) {
+ x = atoi( (char *)XML_GET_CONTENT(nodo->children) );
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) {
+ y = atoi( (char *)XML_GET_CONTENT(nodo->children) );
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"capacidad") == 0) {
+ capacidad = atof ((char *)XML_GET_CONTENT(nodo->children) );
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"inicial") == 0) {
+ liquido = atof ((char *)XML_GET_CONTENT(nodo->children) );
+ }
+ }
+ nodo = nodo->next;
+ }
+
+ Cistern *p = new Cistern(orientacion);
+ p->set_position(x,y);
+ p->set_id( atoi(id.c_str()) );
+ p->set_name(name);
+ p->set_capacidad(capacidad);
+ p->set_contenido_inicial(liquido);
+
+ return p;
+}
+
+Union *Constructor::loadUnion(xmlNodePtr nodo)
+{
+ std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
+ std::string id = (char *)xmlGetProp(nodo, BAD_CAST"id");
+ std::string tipo;
+ int orientacion=0, x, y;
+ float caudal;
+
+ nodo = nodo->children;
+ while (nodo != NULL) {
+ if (nodo->type == XML_ELEMENT_NODE) {
+ if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) {
+ orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) );
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) {
+ x = atoi( (char *)XML_GET_CONTENT(nodo->children) );
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) {
+ y = atoi( (char *)XML_GET_CONTENT(nodo->children) );
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"caudal") == 0) {
+ caudal = atof ((char *)XML_GET_CONTENT(nodo->children) );
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"tipo") == 0) {
+ tipo = (char *)XML_GET_CONTENT(nodo->children);
+ }
+ }
+ nodo = nodo->next;
+ }
+
+ Union *p = new Union(orientacion);
+ p->set_position(x,y);
+ p->set_id( atoi(id.c_str()) );
+ p->set_name(name);
+ p->set_caudal(caudal);
+ p->is_union = (tipo == "union");
+
+ return p;
+}
+
+Drain *Constructor::loadDrain(xmlNodePtr nodo)
+{
+ std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
+ std::string id = (char *)xmlGetProp(nodo, BAD_CAST"id");
+ int orientacion=0, x, y;
+
+ nodo = nodo->children;
+ while (nodo != NULL) {
+ if (nodo->type == XML_ELEMENT_NODE) {
+ if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) {
+ orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) );
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) {
+ x = atoi( (char *)XML_GET_CONTENT(nodo->children) );
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) {
+ y = atoi( (char *)XML_GET_CONTENT(nodo->children) );
+ }
+ }
+ nodo = nodo->next;
+ }
+
+ Drain *p = new Drain(orientacion);
+ p->set_position(x,y);
+ p->set_id( atoi(id.c_str()) );
+ p->set_name(name);
+
+ return p;
+}
+
+Splitter *Constructor::loadCodo(xmlNodePtr nodo)
+{
+ std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
+ std::string id = (char *)xmlGetProp(nodo, BAD_CAST"id");
+ int orientacion=0, x, y;
+ float caudal;
+
+ nodo = nodo->children;
+ while (nodo != NULL) {
+ if (nodo->type == XML_ELEMENT_NODE) {
+ if (xmlStrcmp(nodo->name, BAD_CAST"orientacion") == 0) {
+ orientacion = atoi( (char *)XML_GET_CONTENT(nodo->children) );
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"x") == 0) {
+ x = atoi( (char *)XML_GET_CONTENT(nodo->children) );
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"y") == 0) {
+ y = atoi( (char *)XML_GET_CONTENT(nodo->children) );
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"caudal") == 0) {
+ caudal = atof( (char *)XML_GET_CONTENT(nodo->children) );
+ }
+ }
+ nodo = nodo->next;
+ }
+
+ Splitter *p = new Splitter(orientacion);
+ p->set_position(x,y);
+ p->set_id( atoi(id.c_str()) );
+ p->set_name(name);
+ p->set_caudal(caudal);
+
+ return p;
+}
+