COIN-OR::LEMON - Graph Library

source: glemon-0.x/graph_displayer_canvas.h @ 149:930e838ad5b6

Last change on this file since 149:930e838ad5b6 was 149:930e838ad5b6, checked in by Hegyi Péter, 18 years ago

Node and edge editor button are the same furthermore.

File size: 11.8 KB
Line 
1// -*- C++ -*- //
2
3#ifndef GRAPH_DISPLAYER_CANVAS_H
4#define GRAPH_DISPLAYER_CANVAS_H
5
6class GraphDisplayerCanvas;
7
8#include "all_include.h"
9#include "nbtab.h"
10#include <libgnomecanvasmm.h>
11#include <libgnomecanvasmm/polygon.h>
12#include <lemon/xy.h>
13
14///This class is the canvas, on which the graph can be drawn.
15class GraphDisplayerCanvas : public Gnome::Canvas::CanvasAA
16{
17  friend class BrokenEdge;
18  friend class LoopEdge;
19
20  class EdgeBase : public Gnome::Canvas::Group
21  {
22    protected:
23      ///Reference to the canvas, on which the graph is drawn.
24
25      ///It is needed, because some datas needed from
26      ///graph can be accessed by this or should be sent
27      ///as parameter, but it would be complicated
28      GraphDisplayerCanvas& canvas;
29
30      ///The edge that the class displays.
31
32      ///It is needed, because some datas needed from
33      ///graph can be accessed by this or should be sent
34      ///as parameter, but it would be complicated
35      Edge edge;
36
37      Gnome::Canvas::Polygon arrow;
38
39      void drawArrow(XY);
40    public:
41      EdgeBase(Gnome::Canvas::Group&, Edge, GraphDisplayerCanvas&);
42      virtual ~EdgeBase();
43      virtual void draw() = 0;
44      virtual void setLineWidth(int) = 0;
45      virtual void setFillColor(Gdk::Color) = 0;
46      virtual Gnome::Canvas::Item * getLine() = 0;
47  };
48
49  ///Edge displayer class
50
51  ///This class is responsible for displaying edges in graph.
52  ///The displayed edge is broken in the middle. The
53  ///aim of this is to be able to indicate direction of edges
54  ///and to be able to display more then one edges between the
55  ///same source and target
56  class BrokenEdge : public EdgeBase
57  {
58    private:
59      Gnome::Canvas::Line line;
60
61      ///Indicates whether the button of mouse is pressed or not at the moment.
62      bool isbutton;
63
64      ///At this location was the mousebutton pressed. Horizontal component.
65
66      ///It helps to calculate the
67      ///distance of dragging.
68      double clicked_x;
69
70      ///At this location was the mousebutton pressed. Vertical component.
71
72      ///It helps to calculate the
73      ///distance of dragging.
74      double clicked_y;
75
76      ///event handler for forming broken edges
77
78      ///\param event the
79      ///event to handle
80      bool edgeFormerEventHandler(GdkEvent* event);
81
82    public:
83      ///Constructor of broken edge class.
84
85      ///\param g the group to which the edge belongs
86      ///\param _edge the represented edge
87      ///\param gc the canvas
88      BrokenEdge(Gnome::Canvas::Group&, Edge, GraphDisplayerCanvas&);
89
90      ///Destructor of broken edge class
91
92      ///Frees up
93      ///reserved memory
94      ~BrokenEdge();
95
96      ///The function that draws the edge based on collected data
97      void draw();
98
99      void setLineWidth(int);
100      void setFillColor(Gdk::Color);
101
102      Gnome::Canvas::Item * getLine() { return (Gnome::Canvas::Item *)(&line); };
103  };
104
105  class LoopEdge : public EdgeBase
106  {
107    private:
108      Gnome::Canvas::Ellipse line;
109    public:
110      LoopEdge(Gnome::Canvas::Group&, Edge, GraphDisplayerCanvas&);
111      ~LoopEdge();
112      void draw();
113      void setLineWidth(int);
114      void setFillColor(Gdk::Color);
115      Gnome::Canvas::Item * getLine() { return (Gnome::Canvas::Item *)(&line); };
116  };
117
118  ///Type of canvas, on which the graph is drawn
119  typedef Gnome::Canvas::CanvasAA Parent;
120
121public:
122  ///Constructor
123
124  ///\param nbt the tab of the window, in which the graph is displayed
125  GraphDisplayerCanvas(NoteBookTab & nbt);
126
127  ///destructor of the class
128  virtual ~GraphDisplayerCanvas();
129
130  ///Changes the width of edge(s) according to the given map.
131
132  ///\param mapname is the name of the map which contains the values to be set
133  ///\param edge if it is given, only the width of the given edge will be set, instead of all of them.
134  int changeEdgeWidth (std::string mapname, Edge edge=INVALID);
135
136  ///Resets width of edge(s) to the default value
137
138  ///\param edge if it is given, only the width of the
139  ///given edge will be reset, instead of all of them.
140  int resetEdgeWidth (Edge edge=INVALID);
141
142  ///Changes the color of edge(s) according to the given map.
143
144  ///\param mapname is the name of the map which contains the new values
145  ///\param edge if it is given, only the color of the given edge will be set, instead of all of them.
146  int changeEdgeColor (std::string mapname, Edge edge=INVALID);
147
148  ///Resets color of edge(s) to the default value
149
150  ///\param edge if it is given, only the color of the
151  ///given edge will be reset, instead of all of them.
152  int resetEdgeColor (Edge edge=INVALID);
153
154  ///Changes the label of edge(s) according to the given map.
155
156  ///\param mapname is the name of the map which contains the new values
157  ///\param edge if it is given, only the label of the given edge will be set, instead of all of them.
158  int changeEdgeText (std::string mapname, Edge edge=INVALID);
159
160  ///Resets label of edge(s) to the default value
161
162  ///\param edge if it is given, only the color of the
163  ///given edge will be reset, instead of all of them.
164  int resetEdgeText (Edge edge=INVALID);
165
166  ///Changes the radius of node(s) according to the given map.
167
168  ///\param mapname is the name of the map which contains the new values
169  ///\param node if it is given, only the radius of the given node will be set, instead of all of them.
170  int changeNodeRadius (std::string mapname, Node node=INVALID);
171
172  ///Resets radius of node(s) to the default value
173
174  ///\param node if it is given, only the radius of the
175  ///given node will be reset, instead of all of them.
176  int resetNodeRadius (Node node=INVALID);
177
178  ///Changes the color of node(s) according to the given map.
179
180  ///\param mapname is the name of the map which contains the new values
181  ///\param node if it is given, only the color of the given node will be set, instead of all of them.
182  int changeNodeColor (std::string mapname, Node node=INVALID);
183
184  ///Resets color of node(s) to the default value
185
186  ///\param node if it is given, only the color of the
187  ///given node will be reset, instead of all of them.
188  int resetNodeColor (Node node=INVALID);
189
190  ///Changes the label of node(s) according to the given map.
191
192  ///\param mapname is the name of the map which contains the new values
193  ///\param node if it is given, only the label of the given node will be set, instead of all of them.
194  int changeNodeText (std::string mapname, Node node=INVALID);
195
196  ///Resets label of node(s) to the default value
197
198  ///\param node if it is given, only the label of the
199  ///given node will be reset, instead of all of them.
200  int resetNodeText (Node node=INVALID);
201
202  ///This function is called, when any of the displayed attributes have to be updated, or changed
203
204  ///\param itisedge if true, edge property has to be changed, else node property
205  ///\param prop the id of property that has to changed or updated
206  void propertyChange(bool itisedge, int prop);
207
208  ///updates the given property
209
210  ///\param edge if it is not INVALID, only the property of the given edge will be updated, instead of all of them
211  ///\param prop the property to update
212  void propertyUpdate(Edge edge, int prop);
213
214  ///updates the given property
215
216  ///\param node if it is not INVALID, only the property of the given node will be updated, instead of all of them
217  ///\param prop the property to update
218  void propertyUpdate(Node node, int prop);
219
220  ///updates all the property for the given edge
221  void propertyUpdate(Edge);
222
223  ///updates all the property for the given node
224  void propertyUpdate(Node);
225
226  ///Callback for 'ViewZoomIn' action.
227  virtual void zoomIn();
228  ///Callback for 'ViewZoomOut' action.
229  virtual void zoomOut();
230  ///Callback for 'ViewZoomFit' action.
231  virtual void zoomFit();
232  ///Callback for 'ViewZoom100' action.
233  virtual void zoom100();
234  ///Sets the scroll region of the convas to the bounding box of the graph.
235  void updateScrollRegion();
236
237  ///This function changes the tool in the graph-editor's hand
238  void changeEditorialTool(int);
239
240protected:
241
242  //maximizing, minimizing, restoring window, etc.
243  virtual bool on_expose_event(GdkEventExpose *);
244
245private:
246
247  ///This function is responsible for the correct
248  ///reaction of any action happened in the territory
249  ///of the canvas
250  ///DEPRECATED!!!!
251  bool eventHandler(GdkEvent* e, Node n);
252
253  ///actual event handler
254  ///
255  ///Actual event handler should be stored, to be able to disconnect it and later reconnect it.
256  sigc::connection actual_handler;
257
258  ///event handler for the case when move-tool is active
259  bool moveEventHandler(GdkEvent*);
260  ///event handler for the case when create_node-tool is active
261  bool createNodeEventHandler(GdkEvent*);
262  ///event handler for the case when create_edge-tool is active
263  bool createEdgeEventHandler(GdkEvent*);
264  ///event handler for the case when eraser-tool is active
265  bool eraserEventHandler(GdkEvent*);
266  ///event handler for the case when map editor tool is active
267  bool mapEditEventHandler(GdkEvent*);
268
269public:
270  ///Moves the text to new place
271  void textReposition(xy<double>);
272
273  ///Activates an edge belonging to an EdgeBase
274
275  ///After we have activated an edge this way,
276  ///the GDC object will know, which edge is under forming
277  ///therefore it can redraw the necessary elements on the canvas,
278  ///for example the text belonging to the \ref EdgeBase can be
279  ///redrawn (\ref textReposition).
280  void toggleEdgeActivity(EdgeBase*, bool);
281
282public:
283
284  ///Returns the actual tool in hand
285  int getActualTool();
286
287  ///draws the graph
288
289  ///Called when opening a file.
290  void drawGraph();
291
292  ///Clears the canvas
293
294  ///It achieves this by deleting all data
295  ///structure used to help handle the displayed graph.
296  void clear();
297
298  ///creates a new Nodemap
299
300  ///\param init initial value of the map
301  ///\param mapname name of new map
302  int addNewNodeMap(double init,std::string mapname);
303  ///creates a new Edgemap
304
305  ///\param init initial value of the map
306  ///\param mapname name of new map
307  int addNewEdgeMap(double init,std::string mapname);
308
309private:
310  ///Deletes the given element.
311  void deleteItem(Node);
312  ///Deletes the given element.
313  void deleteItem(Edge);
314
315private:
316
317  ///Map of nodes of graph
318  Graph::NodeMap<Gnome::Canvas::Ellipse *> nodesmap;
319
320  ///Map of edges of graph
321  Graph::EdgeMap<EdgeBase*> edgesmap;
322
323  ///Map of texts to write on edges
324  Graph::EdgeMap<Gnome::Canvas::Text *> edgetextmap;
325
326  ///Map of texts to write on nodes
327  Graph::NodeMap<Gnome::Canvas::Text *> nodetextmap;
328
329  ///Group of graphical elements of displayed_graph
330  Gnome::Canvas::Group displayed_graph;
331
332private:
333  ///Indicates whether the button of mouse is pressed or not
334  int isbutton;
335
336  ///Stores the actual tool in hand
337  int actual_tool;
338
339  ///At this location was the mousebutton pressed.
340  ///It helps to calculate the distance of dragging.
341  double clicked_x, clicked_y;
342
343  ///Remembers which Gnome::Canvas::Item was pressed.
344
345  ///this variable is needed, to work on it after selection
346  Gnome::Canvas::Item * active_item;
347
348  ///Remembers which Gnome::Canvas::Item was pressed.
349
350  ///this variable is used at edge creation, it will
351  ///be the secondly selected node. No local variable
352  ///can be used for this purpose inside the function,
353  ///because the node selected by button press, and
354  ///the edge is created by button release. Both of
355  ///them is different function call.
356  Gnome::Canvas::Item * target_item;
357
358  ///selected node (for any editing)
359  Node active_node;
360
361  ///selected edge (for any editing)
362  Edge active_edge;
363
364  ///the edge that is selected by clicking on the red arrow in the middle of it
365
366  ///This edge is stored only for the purpose of reshape it.
367  ///That is why it is selected in a different manner.
368  Edge forming_edge;
369
370  ///Map displayed by label can be edited.
371  std::string nodemap_to_edit;
372
373  ///Map displayed by label can be edited.
374  std::string edgemap_to_edit;
375
376  static const int zoom_step = 5;
377
378private:
379
380  ///reference to the container, in which the canvas is
381  NoteBookTab & mytab;
382
383  XY calcArrowPos(XY, XY, XY, XY, int);
384};
385
386#endif //GRAPH_DISPLAYER_CANVAS_H
Note: See TracBrowser for help on using the repository browser.