1 #include <graph_displayer_canvas.h> |
1 #include "graph_displayer_canvas.h" |
2 #include <broken_edge.h> |
2 #include "broken_edge.h" |
3 #include <math.h> |
3 #include <math.h> |
4 |
4 |
5 GraphDisplayerCanvas::GraphDisplayerCanvas(Graph & gr, CoordinatesMap & cm, MapStorage & ms, MapWin * mw):g(gr),nodesmap(g),edgesmap(g),edgetextmap(g),nodetextmap(g),displayed_graph(*(root()), 0, 0),canvasentrywidget(NULL),mapstorage(ms),isbutton(0),active_item(NULL),target_item(NULL),nodemap_to_edit(""),edgemap_to_edit(""),mapwin(mw) |
5 GraphDisplayerCanvas::GraphDisplayerCanvas(MapStorage & ms, MapWin & mw) : |
|
6 nodesmap(ms.graph), edgesmap(ms.graph), edgetextmap(ms.graph), |
|
7 nodetextmap(ms.graph), displayed_graph(*(root()), 0, 0), |
|
8 canvasentrywidget(NULL), mapstorage(ms), isbutton(0), active_item(NULL), |
|
9 target_item(NULL), nodemap_to_edit(""), edgemap_to_edit(""), mapwin(mw) |
6 { |
10 { |
7 |
11 //base event handler is move tool |
8 //Initializing values. |
12 actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::moveEventHandler), false); |
9 active_node=INVALID; |
13 actual_tool=MOVE; |
10 active_edge=INVALID; |
|
11 forming_edge=INVALID; |
|
12 |
14 |
13 //setting event handler for the editor widget |
15 //setting event handler for the editor widget |
14 entrywidget.signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::entryWidgetChangeHandler), false); |
16 entrywidget.signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::entryWidgetChangeHandler), false); |
15 |
17 |
16 //base event handler is move tool |
18 active_node=INVALID; |
17 actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::moveEventHandler), false); |
19 active_edge=INVALID; |
18 actual_tool=MOVE; |
20 forming_edge=INVALID; |
|
21 } |
19 |
22 |
20 //set_center_scroll_region(true); |
23 GraphDisplayerCanvas::~GraphDisplayerCanvas() |
|
24 { |
|
25 for (NodeIt n(mapstorage.graph); n != INVALID; ++n) |
|
26 { |
|
27 delete nodesmap[n]; |
|
28 delete nodetextmap[n]; |
|
29 } |
21 |
30 |
|
31 for (EdgeIt e(mapstorage.graph); e != INVALID; ++e) |
|
32 { |
|
33 delete edgesmap[e]; |
|
34 delete edgetextmap[e]; |
|
35 } |
|
36 |
|
37 if(canvasentrywidget) |
|
38 { |
|
39 delete(canvasentrywidget); |
|
40 } |
|
41 } |
|
42 |
|
43 void GraphDisplayerCanvas::drawGraph() |
|
44 { |
22 //first edges are drawn, to hide joining with nodes later |
45 //first edges are drawn, to hide joining with nodes later |
23 |
46 |
24 for (EdgeIt i(g); i!=INVALID; ++i) |
47 for (EdgeIt i(mapstorage.graph); i!=INVALID; ++i) |
25 { |
48 { |
26 |
49 |
27 //drawing green lines, coordinates are from cm |
50 //drawing green lines, coordinates are from mapstorage.coords |
28 |
51 |
29 Gnome::Canvas::Points coos; |
52 Gnome::Canvas::Points coos; |
30 coos.push_back(Gnome::Art::Point(cm[g.source(i)].x,cm[g.source(i)].y)); |
53 coos.push_back(Gnome::Art::Point( |
31 coos.push_back(Gnome::Art::Point(cm[g.target(i)].x,cm[g.target(i)].y)); |
54 mapstorage.coords[mapstorage.graph.source(i)].x, |
|
55 mapstorage.coords[mapstorage.graph.source(i)].y)); |
|
56 coos.push_back(Gnome::Art::Point( |
|
57 mapstorage.coords[mapstorage.graph.target(i)].x, |
|
58 mapstorage.coords[mapstorage.graph.target(i)].y)); |
32 |
59 |
33 edgesmap[i]=new BrokenEdge(displayed_graph, coos, *this); |
60 edgesmap[i]=new BrokenEdge(displayed_graph, coos, *this); |
34 *(edgesmap[i]) << Gnome::Canvas::Properties::fill_color("green"); |
61 *(edgesmap[i]) << Gnome::Canvas::Properties::fill_color("green"); |
35 edgesmap[i]->property_width_units().set_value(10); |
62 edgesmap[i]->property_width_units().set_value(10); |
36 |
63 |
44 edgetextmap[i]->signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::edgeMapEditEventHandler), false); |
71 edgetextmap[i]->signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::edgeMapEditEventHandler), false); |
45 } |
72 } |
46 |
73 |
47 //afterwards nodes come to be drawn |
74 //afterwards nodes come to be drawn |
48 |
75 |
49 NodeIt i(g); |
76 for (NodeIt i(mapstorage.graph); i!=INVALID; ++i) |
50 int maxx=0, maxy=0, minx=(int)cm[i].x, miny=(int)cm[i].y; |
|
51 |
|
52 for (; i!=INVALID; ++i) |
|
53 { |
77 { |
54 //minimum and maximum is gathered to be able to zoom to the graph correctly (whole figure should be seen) |
|
55 |
|
56 if(cm[i].x>maxx)maxx=(int)cm[i].x; |
|
57 if(cm[i].y>maxy)maxy=(int)cm[i].y; |
|
58 if(cm[i].x<minx)minx=(int)cm[i].x; |
|
59 if(cm[i].y<miny)miny=(int)cm[i].y; |
|
60 |
|
61 //drawing bule nodes, with black line around them |
78 //drawing bule nodes, with black line around them |
62 |
79 |
63 nodesmap[i]=new Gnome::Canvas::Ellipse(displayed_graph, cm[i].x-20, cm[i].y-20, cm[i].x+20, cm[i].y+20); |
80 nodesmap[i]=new Gnome::Canvas::Ellipse( |
|
81 displayed_graph, |
|
82 mapstorage.coords[i].x-20, |
|
83 mapstorage.coords[i].y-20, |
|
84 mapstorage.coords[i].x+20, |
|
85 mapstorage.coords[i].y+20); |
64 *(nodesmap[i]) << Gnome::Canvas::Properties::fill_color("blue"); |
86 *(nodesmap[i]) << Gnome::Canvas::Properties::fill_color("blue"); |
65 *(nodesmap[i]) << Gnome::Canvas::Properties::outline_color("black"); |
87 *(nodesmap[i]) << Gnome::Canvas::Properties::outline_color("black"); |
66 |
88 |
67 //initializing edge-text as well, to empty string |
89 //initializing edge-text as well, to empty string |
68 |
90 |
69 xy<double> text_pos((cm[i].x+node_property_defaults[N_RADIUS]+5),(cm[i].y+node_property_defaults[N_RADIUS]+5)); |
91 xy<double> text_pos( |
|
92 (mapstorage.coords[i].x+node_property_defaults[N_RADIUS]+5), |
|
93 (mapstorage.coords[i].y+node_property_defaults[N_RADIUS]+5)); |
70 |
94 |
71 nodetextmap[i]=new Gnome::Canvas::Text(displayed_graph, text_pos.x, text_pos.y, ""); |
95 nodetextmap[i]=new Gnome::Canvas::Text(displayed_graph, |
|
96 text_pos.x, text_pos.y, ""); |
72 nodetextmap[i]->property_fill_color().set_value("darkblue"); |
97 nodetextmap[i]->property_fill_color().set_value("darkblue"); |
73 nodetextmap[i]->signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::nodeMapEditEventHandler), false); |
98 nodetextmap[i]->signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::nodeMapEditEventHandler), false); |
74 } |
99 } |
75 |
100 |
76 updateScrollRegion(); |
101 updateScrollRegion(); |
77 } |
102 } |
78 |
103 |
79 GraphDisplayerCanvas::~GraphDisplayerCanvas() |
104 void GraphDisplayerCanvas::clear() |
80 { |
105 { |
81 if(canvasentrywidget) |
106 active_node=INVALID; |
82 { |
107 active_edge=INVALID; |
83 delete(canvasentrywidget); |
108 forming_edge=INVALID; |
84 } |
|
85 |
109 |
86 //writing out the end state of the graph |
110 for (NodeIt n(mapstorage.graph); n != INVALID; ++n) |
87 //\todo all the maps has to be write out! |
|
88 |
|
89 Graph::NodeMap <int> id(g); |
|
90 Graph::NodeMap <double> xc(g); |
|
91 Graph::NodeMap <double> yc(g); |
|
92 |
|
93 int j=1; |
|
94 |
|
95 for (NodeIt i(g); i!=INVALID; ++i) |
|
96 { |
111 { |
97 double x1,y1,x2,y2; |
112 delete nodesmap[n]; |
98 nodesmap[i]->get_bounds(x1, y1, x2, y2); |
113 delete nodetextmap[n]; |
99 |
|
100 id[i]=j++; |
|
101 xc[i]=(x1+x2)/2; |
|
102 yc[i]=(y1+y2)/2; |
|
103 } |
114 } |
104 |
115 |
105 GraphWriter<Graph> writer(std::cout,g); |
116 for (EdgeIt e(mapstorage.graph); e != INVALID; ++e) |
106 |
117 { |
107 writer.writeNodeMap("id", id); |
118 delete edgesmap[e]; |
108 writer.writeNodeMap("coordinates_x", xc); |
119 delete edgetextmap[e]; |
109 writer.writeNodeMap("coordinates_y", yc); |
120 } |
110 writer.run(); |
|
111 } |
121 } |