The graph adadptors can be alteration observed.
In most cases it uses the adapted graph alteration notifiers.
Only special case is now the UndirGraphAdaptor, where
we have to proxy the signals from the graph.
The SubBidirGraphAdaptor is removed, because it doest not
gives more feature than the EdgeSubGraphAdaptor<UndirGraphAdaptor<Graph>>.
The ResGraphAdaptor is based on this composition.
1 #include "graph_displayer_canvas.h"
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)
10 //base event handler is move tool
11 actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::moveEventHandler), false);
19 GraphDisplayerCanvas::~GraphDisplayerCanvas()
21 for (NodeIt n((mytab.mapstorage).graph); n != INVALID; ++n)
24 delete nodetextmap[n];
27 for (EdgeIt e((mytab.mapstorage).graph); e != INVALID; ++e)
30 delete edgetextmap[e];
34 void GraphDisplayerCanvas::propertyChange(bool itisedge, int prop)
38 propertyUpdate(Edge(INVALID), prop);
42 propertyUpdate(Node(INVALID), prop);
46 void GraphDisplayerCanvas::propertyUpdate(Edge edge)
48 for(int i=0;i<EDGE_PROPERTY_NUM;i++)
50 propertyUpdate(edge, i);
54 void GraphDisplayerCanvas::propertyUpdate(Node node)
56 for(int i=0;i<NODE_PROPERTY_NUM;i++)
58 propertyUpdate(node, i);
62 void GraphDisplayerCanvas::propertyUpdate(Node node, int prop)
66 std::string mapname=mytab.getActiveNodeMap(prop);
70 if( ( ((mytab.mapstorage).nodemap_storage).find(mapname) != ((mytab.mapstorage).nodemap_storage).end() ) )
75 changeNodeRadius(mapname, node);
78 changeNodeColor(mapname, node);
81 changeNodeText(mapname, node);
94 resetNodeRadius(node);
103 std::cerr<<"Error\n";
109 void GraphDisplayerCanvas::propertyUpdate(Edge edge, int prop)
113 std::string mapname=mytab.getActiveEdgeMap(prop);
117 if( ( ((mytab.mapstorage).edgemap_storage).find(mapname) != ((mytab.mapstorage).edgemap_storage).end() ) )
122 changeEdgeWidth(mapname, edge);
125 changeEdgeColor(mapname, edge);
128 changeEdgeText(mapname, edge);
131 std::cerr<<"Error\n";
140 resetEdgeWidth(edge);
143 resetEdgeColor(edge);
149 std::cerr<<"Error\n";
154 void GraphDisplayerCanvas::drawGraph()
156 //first edges are drawn, to hide joining with nodes later
158 for (EdgeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
161 //drawing green lines, coordinates are from mapstorage.coords
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));
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();
176 //initializing edge-text as well, to empty string
178 XY text_pos=mytab.mapstorage.arrow_pos[i];
179 text_pos+=(XY(10,10));
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();
187 //afterwards nodes come to be drawn
189 for (NodeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
191 //drawing bule nodes, with black line around them
193 nodesmap[i]=new Gnome::Canvas::Ellipse(
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();
203 //initializing edge-text as well, to empty string
206 ((mytab.mapstorage).coords[i].x+node_property_defaults[N_RADIUS]+5),
207 ((mytab.mapstorage).coords[i].y+node_property_defaults[N_RADIUS]+5));
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();
216 updateScrollRegion();
219 void GraphDisplayerCanvas::clear()
223 forming_edge=INVALID;
225 for (NodeIt n((mytab.mapstorage).graph); n != INVALID; ++n)
228 delete nodetextmap[n];
231 for (EdgeIt e((mytab.mapstorage).graph); e != INVALID; ++e)
234 delete edgetextmap[e];