]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blob - Constructor/src/exclusa.cpp
Se ponen flags del compilador para libxml2 con pkg-config.
[z.facultad/75.42/plaqui.git] / Constructor / src / exclusa.cpp
1 #include "exclusa.h"
2 #include "exclusaptywnd.h"
3
4 Exclusa::Exclusa(int orientacion)
5 {
6         imageN = Gdk::Pixbuf::create_from_file(PACKAGE_DATA_DIR"/plaqui-constructor/pixmaps/exclusa_h.png");
7         imageS = Gdk::Pixbuf::create_from_file(PACKAGE_DATA_DIR"/plaqui-constructor/pixmaps/exclusa_s.png");
8         null = Gdk::Pixbuf::create_from_file(PACKAGE_DATA_DIR"/plaqui-constructor/pixmaps/null.png");
9         imgActual = orientacion;
10         switch (imgActual) {
11                 case 1:
12                         image = imageS;
13                         break;
14                 default: 
15                         imgActual = 0;
16                         image = imageN;                 
17         }
18         set_size_request(image->get_width(), image->get_height());
19         
20         Glib::RefPtr<Gnome::Glade::Xml> ref = Gnome::Glade::Xml::create(PACKAGE_DATA_DIR"/plaqui-constructor/dialogs/constructor.glade", "exclusa_pty_wnd");
21         ref->get_widget_derived("exclusa_pty_wnd",exclusa_pty_wnd);
22         exclusa_pty_wnd->exclusa = this;
23         name = "exclusa";
24         
25         Connector temp;
26         temp.id_dest = -1;
27         temp.type = UNDEF;
28         connect_vec.push_back(temp);
29         connect_vec.push_back(temp);
30 }
31
32 Exclusa::~Exclusa()
33 {
34 }
35
36 bool Exclusa::on_button_press_event(GdkEventButton *event)
37 {
38         GdkEventExpose e;
39         t_line tmp_line;
40         if ((event->type == GDK_BUTTON_PRESS) && ( event->button == 1)) {
41                 combo_entry->set_text(name);
42                 if (CItem::logic_connect) {
43                         tmp_line.logic =  workplace->get_logic_item(CItem::quien);
44                         tmp_line.store = this;
45                         workplace->lista_lineas.push_back(tmp_line);
46                         workplace->on_expose_event(&e);
47                 }
48                 CItem::logic_connect = false;   
49         }
50         
51         if ((event->type == GDK_BUTTON_PRESS) && ( event->button ==2)){
52                 image = null; 
53                 image->render_to_drawable(get_window(),get_style()->get_black_gc(),0,0,0,0,image->get_width(),image->get_height(),Gdk::RGB_DITHER_NONE,0,0);
54                 imgActual++;
55                 switch (imgActual) {
56                         case 1:
57                                 image = imageS;
58                                 break;
59                         default: 
60                                 imgActual = 0;
61                                 image = imageN;                 
62                 }
63                 set_size_request(image->get_width(),image->get_height());               
64                 image->render_to_drawable(get_window(),get_style()->get_black_gc(),0,0,0,0,image->get_width(),image->get_height(),Gdk::RGB_DITHER_NONE,0,0);
65         }
66         if ((event->type == GDK_BUTTON_PRESS) && ( event->button == 3)){
67                 menu_popup.popup(event->button, event->time);
68                  return true; //It has been handled.
69         }
70         
71         if ((event->type == GDK_2BUTTON_PRESS) && (event->button ==1)){
72                 exclusa_pty_wnd->txt_exclusa_name->set_text( name);
73                 if (estado) exclusa_pty_wnd->rd_btn_open->set_active(true);
74                 exclusa_pty_wnd->show();
75         }
76         return true;
77 }
78
79 void Exclusa::set_estado(bool _state)
80 {
81         estado = _state;
82 }
83
84 bool Exclusa::get_estado()
85 {
86         return estado;
87 }
88
89 void Exclusa::on_menu_popup_rotar()
90 {
91         GdkEventButton event; 
92                 event.type = GDK_BUTTON_PRESS;
93                 event.button = 2;
94         Exclusa::on_button_press_event(&event);
95 }
96
97 void Exclusa::on_menu_popup_propiedades()
98 {
99         GdkEventButton event;
100         event.type = GDK_2BUTTON_PRESS;
101         event.button = 1;
102         Exclusa::on_button_press_event(&event);
103 }
104
105 void Exclusa::save(FILE *archivo)
106 {
107         char c_id[50], c_est[50], c_x[50], c_y[50], c_img[50];
108         int est;
109         Glib::ustring  con0, con1;
110         if (connect_vec[0].type == IN)
111                 con0 = "\t\t\t<entrada>"+get_other_name(connect_vec[0].id_dest)+"</entrada>\n";
112         else
113                 con0 = "\t\t\t<salida>"+get_other_name(connect_vec[0].id_dest)+"</salida>\n";
114         if (connect_vec[1].type == IN) 
115                 con1 = "\t\t\t<entrada>"+get_other_name(connect_vec[1].id_dest)+"</entrada>\n";
116         else
117                 con1 = "\t\t\t<salida>"+get_other_name(connect_vec[1].id_dest)+"</salida>\n";
118         sprintf(c_x,"\t\t<x>%d</x>\n",x);
119         sprintf(c_y,"\t\t<y>%d</y>\n",y);
120         sprintf(c_id,"%d",ID);
121         if (estado) est = 1;
122         else est = 0;
123         sprintf(c_est,"\t\t<estado>%d</estado>\n", est);
124         sprintf(c_img,"\t\t<orientacion>%d</orientacion>\n",imgActual);
125         Glib::ustring dato;
126         dato = "\t<exclusa nombre=\""+name+"\" id=\"";
127         dato += c_id;
128         dato += "\">\n";
129         dato += "\t\t<conector>\n"+con0 + con1+"\t\t</conector>\n";
130         dato += c_img;
131         dato += c_est;
132         dato += c_x; 
133         dato += c_y;
134         dato += "\t</exclusa>\n";
135         fprintf(archivo,dato.c_str());  
136 }
137
138 bool Exclusa::check_connection()
139 {
140         ConnectorType aux;
141         CItem *_item0, *_item1;
142         switch (get_img_actual()) {
143                         case 0:
144                                 connect_vec[0].type = is_other_connection_area( get_position_x()-5, get_position_y()+16, &_item0); //izquierda
145                                 connect_vec[1].type = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y()+16,& _item1); //derecha
146                         break;          
147                         case 1:
148                                 connect_vec[0].type =  is_other_connection_area( get_position_x()+16, get_position_y()-5, &_item0); // arriba
149                                 connect_vec[1].type = is_other_connection_area( get_position_x()+16, get_position_y()+get_image()->get_height() +5, &_item1); //abajo
150         }
151         if ( connect_vec[0].type != UNDEF && connect_vec[1].type != UNDEF ) {
152                 aux = connect_vec[0].type; 
153                 connect_vec[0].type = connect_vec[1].type;
154                 connect_vec[1].type = aux;
155                 connect_vec[0].id_dest = _item0->get_id();
156                 connect_vec[1].id_dest = _item1->get_id();
157                 return ( is_connected = (connect_vec[0].type != connect_vec[1].type) );
158         }
159         else return is_connected;
160 }
161
162 ConnectorType Exclusa::get_connector_type(int _a, int _b)
163 {
164         CItem * _item;
165         if ( ! is_connected ) {
166                 switch (imgActual) {
167                         case 0:
168                                 if ((_a <= x+10 )&&(_a > 0) && (_b <= y+image->get_height()-10) &&(_b >= y+10 )) //izquierda
169                                         return is_other_connection_area(get_position_x()+get_image()->get_width()+5, get_position_y()+16, &_item);//pregunto por la derecha
170                                 if ((_a <= x+image->get_width()-1)&&(_a >= x+image->get_width()-10) && (_b <= y+image->get_height()-10) &&(_b >= y +10 )) //derecha
171                                         return is_other_connection_area(get_position_x()-5, get_position_y()+16, &_item); //pregunto por la izquierda.
172                                 break;
173                         case 1: 
174                                 if ( (_a <= x+image->get_width()-10 )&&(_a >= x + 10) && (_b <= y+10) &&(_b > 0 ) )  //arriba
175                                         return is_other_connection_area(get_position_x()+16, get_position_y()+get_image()->get_height() +5, &_item); //pregunto que hay abajo
176                                 if ((_a <= x+22 )&&(_a >= x + 10) && (_b <= y+image->get_height()-1) &&(_b >= y+image->get_height()-10 ))//abajo
177                                         return is_other_connection_area( get_position_x()+16, get_position_y()-5, &_item);//pregunto que hay arriba.
178                 }
179         } else {
180                 switch (imgActual) {
181                         case 0: 
182                                 if ((_a <= x+10 )&&(_a > 0) && (_b <= y+image->get_height()-10) &&(_b >= y+10 )) //izquierda
183                                         return connect_vec[0].type;
184                                 if ((_a <= x+image->get_width()-1)&&(_a >= x+image->get_width()-10) && (_b <= y+image->get_height()-10) &&(_b >= y +10 )) //derecha
185                                         return connect_vec[1].type;
186                                 break;
187                         case 1:
188                                 if ( (_a <= x+image->get_width()-10 )&&(_a >= x + 10) && (_b <= y+10) &&(_b > 0 ) ) //arriba
189                                         return connect_vec[0].type;
190                                 if ((_a <= x+22 )&&(_a >= x + 10) && (_b <= y+image->get_height()-1) &&(_b >= y+image->get_height()-10 )) //abajo
191                                         return connect_vec[1].type;
192                 }
193         }
194         return UNDEF;
195 }
196
197 void Exclusa::set_default_connector()
198 {
199         connect_vec[0].type = UNDEF;
200         connect_vec[1].type = UNDEF;
201 }