1 #include "graph_displayer_canvas.h" |
|
2 #include <cmath> |
|
3 |
|
4 GraphDisplayerCanvas::GraphDisplayerCanvas(NoteBookTab & mainw) : |
|
5 nodesmap(mainw.mapstorage.graph), edgesmap(mainw.mapstorage.graph), edgetextmap(mainw.mapstorage.graph), |
|
6 nodetextmap(mainw.mapstorage.graph), displayed_graph(*(root()), 0, 0), |
|
7 isbutton(0), active_item(NULL), target_item(NULL), nodemap_to_edit(""), |
|
8 edgemap_to_edit(""), mytab(mainw) |
|
9 { |
|
10 //base event handler is move tool |
|
11 actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::moveEventHandler), false); |
|
12 actual_tool=MOVE; |
|
13 |
|
14 active_node=INVALID; |
|
15 active_edge=INVALID; |
|
16 forming_edge=INVALID; |
|
17 } |
|
18 |
|
19 GraphDisplayerCanvas::~GraphDisplayerCanvas() |
|
20 { |
|
21 for (NodeIt n((mytab.mapstorage).graph); n != INVALID; ++n) |
|
22 { |
|
23 delete nodesmap[n]; |
|
24 delete nodetextmap[n]; |
|
25 } |
|
26 |
|
27 for (EdgeIt e((mytab.mapstorage).graph); e != INVALID; ++e) |
|
28 { |
|
29 delete edgesmap[e]; |
|
30 delete edgetextmap[e]; |
|
31 } |
|
32 } |
|
33 |
|
34 void GraphDisplayerCanvas::propertyChange(bool itisedge, int prop) |
|
35 { |
|
36 if(itisedge) |
|
37 { |
|
38 propertyUpdate(Edge(INVALID), prop); |
|
39 } |
|
40 else |
|
41 { |
|
42 propertyUpdate(Node(INVALID), prop); |
|
43 } |
|
44 } |
|
45 |
|
46 void GraphDisplayerCanvas::propertyUpdate(Edge edge) |
|
47 { |
|
48 for(int i=0;i<EDGE_PROPERTY_NUM;i++) |
|
49 { |
|
50 propertyUpdate(edge, i); |
|
51 } |
|
52 } |
|
53 |
|
54 void GraphDisplayerCanvas::propertyUpdate(Node node) |
|
55 { |
|
56 for(int i=0;i<NODE_PROPERTY_NUM;i++) |
|
57 { |
|
58 propertyUpdate(node, i); |
|
59 } |
|
60 } |
|
61 |
|
62 void GraphDisplayerCanvas::propertyUpdate(Node node, int prop) |
|
63 { |
|
64 //dummy=dummy; |
|
65 |
|
66 std::string mapname=mytab.getActiveNodeMap(prop); |
|
67 |
|
68 if(mapname!="") |
|
69 { |
|
70 if( ( ((mytab.mapstorage).nodemap_storage).find(mapname) != ((mytab.mapstorage).nodemap_storage).end() ) ) |
|
71 { |
|
72 switch(prop) |
|
73 { |
|
74 case N_RADIUS: |
|
75 changeNodeRadius(mapname, node); |
|
76 break; |
|
77 case N_COLOR: |
|
78 changeNodeColor(mapname, node); |
|
79 break; |
|
80 case N_TEXT: |
|
81 changeNodeText(mapname, node); |
|
82 break; |
|
83 default: |
|
84 std::cerr<<"Error\n"; |
|
85 } |
|
86 } |
|
87 } |
|
88 else //mapname=="" |
|
89 { |
|
90 Node node=INVALID; |
|
91 switch(prop) |
|
92 { |
|
93 case N_RADIUS: |
|
94 resetNodeRadius(node); |
|
95 break; |
|
96 case N_COLOR: |
|
97 resetNodeColor(node); |
|
98 break; |
|
99 case N_TEXT: |
|
100 resetNodeText(node); |
|
101 break; |
|
102 default: |
|
103 std::cerr<<"Error\n"; |
|
104 } |
|
105 } |
|
106 |
|
107 } |
|
108 |
|
109 void GraphDisplayerCanvas::propertyUpdate(Edge edge, int prop) |
|
110 { |
|
111 //dummy=dummy; |
|
112 |
|
113 std::string mapname=mytab.getActiveEdgeMap(prop); |
|
114 |
|
115 if(mapname!="") |
|
116 { |
|
117 if( ( ((mytab.mapstorage).edgemap_storage).find(mapname) != ((mytab.mapstorage).edgemap_storage).end() ) ) |
|
118 { |
|
119 switch(prop) |
|
120 { |
|
121 case E_WIDTH: |
|
122 changeEdgeWidth(mapname, edge); |
|
123 break; |
|
124 case E_COLOR: |
|
125 changeEdgeColor(mapname, edge); |
|
126 break; |
|
127 case E_TEXT: |
|
128 changeEdgeText(mapname, edge); |
|
129 break; |
|
130 default: |
|
131 std::cerr<<"Error\n"; |
|
132 } |
|
133 } |
|
134 } |
|
135 else //mapname=="" |
|
136 { |
|
137 switch(prop) |
|
138 { |
|
139 case E_WIDTH: |
|
140 resetEdgeWidth(edge); |
|
141 break; |
|
142 case E_COLOR: |
|
143 resetEdgeColor(edge); |
|
144 break; |
|
145 case E_TEXT: |
|
146 resetEdgeText(edge); |
|
147 break; |
|
148 default: |
|
149 std::cerr<<"Error\n"; |
|
150 } |
|
151 } |
|
152 } |
|
153 |
|
154 void GraphDisplayerCanvas::drawGraph() |
|
155 { |
|
156 //first edges are drawn, to hide joining with nodes later |
|
157 |
|
158 for (EdgeIt i((mytab.mapstorage).graph); i!=INVALID; ++i) |
|
159 { |
|
160 |
|
161 //drawing green lines, coordinates are from mapstorage.coords |
|
162 |
|
163 Gnome::Canvas::Points coos; |
|
164 coos.push_back(Gnome::Art::Point( |
|
165 (mytab.mapstorage).coords[(mytab.mapstorage).graph.source(i)].x, |
|
166 (mytab.mapstorage).coords[(mytab.mapstorage).graph.source(i)].y)); |
|
167 coos.push_back(Gnome::Art::Point( |
|
168 (mytab.mapstorage).coords[(mytab.mapstorage).graph.target(i)].x, |
|
169 (mytab.mapstorage).coords[(mytab.mapstorage).graph.target(i)].y)); |
|
170 |
|
171 edgesmap[i]=new BrokenEdge(displayed_graph, i, *this); |
|
172 *(edgesmap[i]) << Gnome::Canvas::Properties::fill_color("green"); |
|
173 edgesmap[i]->property_width_units().set_value(10); |
|
174 edgesmap[i]->lower_to_bottom(); |
|
175 |
|
176 //initializing edge-text as well, to empty string |
|
177 |
|
178 XY text_pos=mytab.mapstorage.arrow_pos[i]; |
|
179 text_pos+=(XY(10,10)); |
|
180 |
|
181 edgetextmap[i]=new Gnome::Canvas::Text(displayed_graph, text_pos.x, text_pos.y, ""); |
|
182 edgetextmap[i]->property_fill_color().set_value("darkgreen"); |
|
183 edgetextmap[i]->signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::edgeMapEditEventHandler), false); |
|
184 edgetextmap[i]->raise_to_top(); |
|
185 } |
|
186 |
|
187 //afterwards nodes come to be drawn |
|
188 |
|
189 for (NodeIt i((mytab.mapstorage).graph); i!=INVALID; ++i) |
|
190 { |
|
191 //drawing bule nodes, with black line around them |
|
192 |
|
193 nodesmap[i]=new Gnome::Canvas::Ellipse( |
|
194 displayed_graph, |
|
195 (mytab.mapstorage).coords[i].x-20, |
|
196 (mytab.mapstorage).coords[i].y-20, |
|
197 (mytab.mapstorage).coords[i].x+20, |
|
198 (mytab.mapstorage).coords[i].y+20); |
|
199 *(nodesmap[i]) << Gnome::Canvas::Properties::fill_color("blue"); |
|
200 *(nodesmap[i]) << Gnome::Canvas::Properties::outline_color("black"); |
|
201 nodesmap[i]->raise_to_top(); |
|
202 |
|
203 //initializing edge-text as well, to empty string |
|
204 |
|
205 xy<double> text_pos( |
|
206 ((mytab.mapstorage).coords[i].x+node_property_defaults[N_RADIUS]+5), |
|
207 ((mytab.mapstorage).coords[i].y+node_property_defaults[N_RADIUS]+5)); |
|
208 |
|
209 nodetextmap[i]=new Gnome::Canvas::Text(displayed_graph, |
|
210 text_pos.x, text_pos.y, ""); |
|
211 nodetextmap[i]->property_fill_color().set_value("darkblue"); |
|
212 nodetextmap[i]->signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::nodeMapEditEventHandler), false); |
|
213 nodetextmap[i]->raise_to_top(); |
|
214 } |
|
215 |
|
216 updateScrollRegion(); |
|
217 } |
|
218 |
|
219 void GraphDisplayerCanvas::clear() |
|
220 { |
|
221 active_node=INVALID; |
|
222 active_edge=INVALID; |
|
223 forming_edge=INVALID; |
|
224 |
|
225 for (NodeIt n((mytab.mapstorage).graph); n != INVALID; ++n) |
|
226 { |
|
227 delete nodesmap[n]; |
|
228 delete nodetextmap[n]; |
|
229 } |
|
230 |
|
231 for (EdgeIt e((mytab.mapstorage).graph); e != INVALID; ++e) |
|
232 { |
|
233 delete edgesmap[e]; |
|
234 delete edgetextmap[e]; |
|
235 } |
|
236 } |
|