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.
3 #ifndef GRAPH_DISPLAYER_CANVAS_H
4 #define GRAPH_DISPLAYER_CANVAS_H
6 class GraphDisplayerCanvas;
8 #include "all_include.h"
10 #include <libgnomecanvasmm.h>
11 #include <libgnomecanvasmm/polygon.h>
14 ///This class is the canvas, on which the graph can be drawn.
15 class GraphDisplayerCanvas : public Gnome::Canvas::CanvasAA
17 friend class BrokenEdge;
19 ///Edge displayer class
21 ///This class is responsible for displaying edges in graph.
22 ///The displayed edge is broken in the middle. The
23 ///aim of this is to be able to indicate direction of edges
24 ///and to be able to display more then one edges between the
25 ///same source and target
26 class BrokenEdge : public Gnome::Canvas::Line
28 ///The edge that the class displays.
30 ///It is needed, because some datas needed from
31 ///graph can be accessed by this or should be sent
32 ///as parameter, but it would be complicated
35 ///Reference to the canvas, on which the graph is drawn.
37 ///It is needed, because some datas needed from
38 ///graph can be accessed by this or should be sent
39 ///as parameter, but it would be complicated
40 GraphDisplayerCanvas & gdc;
42 ///An arrow that indicates the direction of the edges
44 ///in case of directional graph direction can be indicated
45 ///by this polygon. The polygon formulates a red arrow.
46 Gnome::Canvas::Polygon * arrow;
48 ///Indicates whether the button of mouse is pressed or not at the moment.
51 ///At this location was the mousebutton pressed. Horizontal component.
53 ///It helps to calculate the
54 ///distance of dragging.
57 ///At this location was the mousebutton pressed. Vertical component.
59 ///It helps to calculate the
60 ///distance of dragging.
63 ///event handler for forming broken edges
67 bool edgeFormerEventHandler(GdkEvent* event);
70 ///Constructor of broken edge class.
72 ///\param g the group to which the edge belongs
73 ///\param _edge the represented edge
74 ///\param gc the canvas
75 BrokenEdge(Gnome::Canvas::Group & g, Edge _edge, GraphDisplayerCanvas & gc);
77 ///Destructor of broken edge class
83 ///The function that draws the edge based on collected data
87 ///Type of canvas, on which the graph is drawn
88 typedef Gnome::Canvas::CanvasAA Parent;
93 ///\param nbt the tab of the window, in which the graph is displayed
94 GraphDisplayerCanvas(NoteBookTab & nbt);
96 ///destructor of the class
97 virtual ~GraphDisplayerCanvas();
99 ///Changes the width of edge(s) according to the given map.
101 ///\param mapname is the name of the map which contains the values to be set
102 ///\param edge if it is given, only the width of the given edge will be set, instead of all of them.
103 int changeEdgeWidth (std::string mapname, Edge edge=INVALID);
105 ///Resets width of edge(s) to the default value
107 ///\param edge if it is given, only the width of the
108 ///given edge will be reset, instead of all of them.
109 int resetEdgeWidth (Edge edge=INVALID);
111 ///Changes the color of edge(s) according to the given map.
113 ///\param mapname is the name of the map which contains the new values
114 ///\param edge if it is given, only the color of the given edge will be set, instead of all of them.
115 int changeEdgeColor (std::string mapname, Edge edge=INVALID);
117 ///Resets color of edge(s) to the default value
119 ///\param edge if it is given, only the color of the
120 ///given edge will be reset, instead of all of them.
121 int resetEdgeColor (Edge edge=INVALID);
123 ///Changes the label of edge(s) according to the given map.
125 ///\param mapname is the name of the map which contains the new values
126 ///\param edge if it is given, only the label of the given edge will be set, instead of all of them.
127 int changeEdgeText (std::string mapname, Edge edge=INVALID);
129 ///Resets label of edge(s) to the default value
131 ///\param edge if it is given, only the color of the
132 ///given edge will be reset, instead of all of them.
133 int resetEdgeText (Edge edge=INVALID);
135 ///Changes the radius of node(s) according to the given map.
137 ///\param mapname is the name of the map which contains the new values
138 ///\param node if it is given, only the radius of the given node will be set, instead of all of them.
139 int changeNodeRadius (std::string mapname, Node node=INVALID);
141 ///Resets radius of node(s) to the default value
143 ///\param node if it is given, only the radius of the
144 ///given node will be reset, instead of all of them.
145 int resetNodeRadius (Node node=INVALID);
147 ///Changes the color of node(s) according to the given map.
149 ///\param mapname is the name of the map which contains the new values
150 ///\param node if it is given, only the color of the given node will be set, instead of all of them.
151 int changeNodeColor (std::string mapname, Node node=INVALID);
153 ///Resets color of node(s) to the default value
155 ///\param node if it is given, only the color of the
156 ///given node will be reset, instead of all of them.
157 int resetNodeColor (Node node=INVALID);
159 ///Changes the label of node(s) according to the given map.
161 ///\param mapname is the name of the map which contains the new values
162 ///\param node if it is given, only the label of the given node will be set, instead of all of them.
163 int changeNodeText (std::string mapname, Node node=INVALID);
165 ///Resets label of node(s) to the default value
167 ///\param node if it is given, only the label of the
168 ///given node will be reset, instead of all of them.
169 int resetNodeText (Node node=INVALID);
171 ///This function is called, when any of the displayed attributes have to be updated, or changed
173 ///\param itisedge if true, edge property has to be changed, else node property
174 ///\param prop the id of property that has to changed or updated
175 void propertyChange(bool itisedge, int prop);
177 ///updates the given property
179 ///\param edge if it is not INVALID, only the property of the given edge will be updated, instead of all of them
180 ///\param prop the property to update
181 void propertyUpdate(Edge edge, int prop);
183 ///updates the given property
185 ///\param node if it is not INVALID, only the property of the given node will be updated, instead of all of them
186 ///\param prop the property to update
187 void propertyUpdate(Node node, int prop);
189 ///updates all the property for the given edge
190 void propertyUpdate(Edge);
192 ///updates all the property for the given node
193 void propertyUpdate(Node);
195 ///Callback for 'ViewZoomIn' action.
196 virtual void zoomIn();
197 ///Callback for 'ViewZoomOut' action.
198 virtual void zoomOut();
199 ///Callback for 'ViewZoomFit' action.
200 virtual void zoomFit();
201 ///Callback for 'ViewZoom100' action.
202 virtual void zoom100();
203 ///Sets the scroll region of the convas to the bounding box of the graph.
204 void updateScrollRegion();
206 ///This function changes the tool in the graph-editor's hand
207 void changeEditorialTool(int);
211 //maximizing, minimizing, restoring window, etc.
212 virtual bool on_expose_event(GdkEventExpose *);
216 ///This function is responsible for the correct
217 ///reaction of any action happened in the territory
220 bool eventHandler(GdkEvent* e, Node n);
222 ///actual event handler
224 ///Actual event handler should be stored, to be able to disconnect it and later reconnect it.
225 sigc::connection actual_handler;
227 ///event handler for the case when move-tool is active
228 bool moveEventHandler(GdkEvent*);
229 ///event handler for the case when create_node-tool is active
230 bool createNodeEventHandler(GdkEvent*);
231 ///event handler for the case when create_edge-tool is active
232 bool createEdgeEventHandler(GdkEvent*);
233 ///event handler for the case when eraser-tool is active
234 bool eraserEventHandler(GdkEvent*);
235 ///event handler for the case when edge map editor tool is active
236 bool edgeMapEditEventHandler(GdkEvent*);
237 ///event handler for the case when node map editor tool is active
238 bool nodeMapEditEventHandler(GdkEvent*);
241 ///Moves the text to new place
242 void textReposition(xy<double>);
244 ///Activates an edge belonging to a BrokenEdge
246 ///After we have activated an edge this way,
247 ///the GDC object will know, which edge is under forming
248 ///therefore it can redraw the necessary elements on the canvas,
249 ///for example the text belonging to the \ref BrokenEdge can be
250 ///redrawn (\ref textReposition).
251 void toggleEdgeActivity(BrokenEdge*, bool);
255 ///Returns the actual tool in hand
260 ///Called when opening a file.
265 ///It achieves this by deleting all data
266 ///structure used to help handle the displayed graph.
269 ///creates a new Nodemap
271 ///\param init initial value of the map
272 ///\param mapname name of new map
273 int addNewNodeMap(double init,std::string mapname);
274 ///creates a new Edgemap
276 ///\param init initial value of the map
277 ///\param mapname name of new map
278 int addNewEdgeMap(double init,std::string mapname);
281 ///Deletes the given element.
282 void deleteItem(Node);
283 ///Deletes the given element.
284 void deleteItem(Edge);
288 ///Map of nodes of graph
289 Graph::NodeMap<Gnome::Canvas::Ellipse *> nodesmap;
291 ///Map of edges of graph
292 Graph::EdgeMap<BrokenEdge *> edgesmap;
294 ///Map of texts to write on edges
295 Graph::EdgeMap<Gnome::Canvas::Text *> edgetextmap;
297 ///Map of texts to write on nodes
298 Graph::NodeMap<Gnome::Canvas::Text *> nodetextmap;
300 ///Group of graphical elements of displayed_graph
301 Gnome::Canvas::Group displayed_graph;
304 ///Indicates whether the button of mouse is pressed or not
307 ///Stores the actual tool in hand
310 ///At this location was the mousebutton pressed.
311 ///It helps to calculate the distance of dragging.
312 double clicked_x, clicked_y;
314 ///Remembers which Gnome::Canvas::Item was pressed.
316 ///this variable is needed, to work on it after selection
317 Gnome::Canvas::Item * active_item;
319 ///Remembers which Gnome::Canvas::Item was pressed.
321 ///this variable is used at edge creation, it will
322 ///be the secondly selected node. No local variable
323 ///can be used for this purpose inside the function,
324 ///because the node selected by button press, and
325 ///the edge is created by button release. Both of
326 ///them is different function call.
327 Gnome::Canvas::Item * target_item;
329 ///selected node (for any editing)
332 ///selected edge (for any editing)
335 ///the edge that is selected by clicking on the red arrow in the middle of it
337 ///This edge is stored only for the purpose of reshape it.
338 ///That is why it is selected in a different manner.
341 ///Map displayed by label can be edited.
342 std::string nodemap_to_edit;
344 ///Map displayed by label can be edited.
345 std::string edgemap_to_edit;
347 static const int zoom_step = 5;
351 ///reference to the container, in which the canvas is
354 XY calcArrowPos(XY, XY, XY, XY, bool);
357 #endif //GRAPH_DISPLAYER_CANVAS_H