COIN-OR::LEMON - Graph Library

source: glemon-0.x/graph_displayer_canvas.h @ 126:e682395d45f7

gui
Last change on this file since 126:e682395d45f7 was 118:cfd49e5c8723, checked in by Hegyi Péter, 18 years ago

If default value of a new map is constant, the newly created elements will get that value as well. Documentation is added to BrokenEdge?, MapStorage? and GraphDisplazCanvas? classes.

File size: 11.2 KB
RevLine 
[6]1// -*- C++ -*- //
2
3#ifndef GRAPH_DISPLAYER_CANVAS_H
4#define GRAPH_DISPLAYER_CANVAS_H
5
[21]6class GraphDisplayerCanvas;
7
[53]8#include "all_include.h"
[96]9#include "nbtab.h"
[6]10#include <libgnomecanvasmm.h>
11#include <libgnomecanvasmm/polygon.h>
[89]12#include <lemon/xy.h>
[6]13
14///This class is the canvas, on which the graph can be drawn.
15class GraphDisplayerCanvas : public Gnome::Canvas::CanvasAA
16{
[98]17  friend class BrokenEdge;
18
[118]19  ///Edge displayer class
20
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
[89]26  class BrokenEdge : public Gnome::Canvas::Line
27  {
[118]28    ///The edge that the class displays.
29
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
[98]33    Edge edge;
[118]34
35    ///Reference to the canvas, on which the graph is drawn.
36
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
[89]40    GraphDisplayerCanvas & gdc;
[118]41
42    ///An arrow that indicates the direction of the edges
43
44    ///in case of directional graph direction can be indicated
45    ///by this polygon. The polygon formulates a red arrow.
[89]46    Gnome::Canvas::Polygon * arrow;
47
[118]48    ///Indicates whether the button of mouse is pressed or not at the moment.
[89]49    bool isbutton;
50
[118]51    ///At this location was the mousebutton pressed. Horizontal component.
[89]52
[118]53    ///It helps to calculate the
54    ///distance of dragging.
55    double clicked_x;
56
57    ///At this location was the mousebutton pressed. Vertical component.
58
59    ///It helps to calculate the
60    ///distance of dragging.
61    double clicked_y;
62
63    ///event handler for forming broken edges
64
65    ///\param event the
66    ///event to handle
67    bool edgeFormerEventHandler(GdkEvent* event);
[89]68  public:
[118]69
70    ///Constructor of broken edge class.
71
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);
76
77    ///Destructor of broken edge class
78
79    ///Frees up
80    ///reserved memory
[89]81    ~BrokenEdge();
[118]82
83    ///The function that draws the edge based on collected data
[98]84    void draw();
[89]85  };
[118]86
87  ///Type of canvas, on which the graph is drawn
[6]88  typedef Gnome::Canvas::CanvasAA Parent;
89
90public:
[118]91  ///Constructor
92
93  ///\param nbt the tab of the window, in which the graph is displayed
94  GraphDisplayerCanvas(NoteBookTab & nbt);
95
96  ///destructor of the class
[6]97  virtual ~GraphDisplayerCanvas();
98
[118]99  ///Changes the width of edge(s) according to the given map.
100
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);
104
105  ///Resets width of edge(s) to the default value
106
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);
110
111  ///Changes the color of edge(s) according to the given map.
112
[6]113  ///\param mapname is the name of the map which contains the new values
[118]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);
[6]116
[118]117  ///Resets color of edge(s) to the default value
118
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);
122
123  ///Changes the label of edge(s) according to the given map.
124
[6]125  ///\param mapname is the name of the map which contains the new values
[118]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);
[6]128
[118]129  ///Resets label of edge(s) to the default value
130
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);
134
135  ///Changes the radius of node(s) according to the given map.
136
[6]137  ///\param mapname is the name of the map which contains the new values
[118]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);
[28]140
[118]141  ///Resets radius of node(s) to the default value
142
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);
146
147  ///Changes the color of node(s) according to the given map.
148
[28]149  ///\param mapname is the name of the map which contains the new values
[118]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);
[28]152
[118]153  ///Resets color of node(s) to the default value
154
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);
158
159  ///Changes the label of node(s) according to the given map.
160
[28]161  ///\param mapname is the name of the map which contains the new values
[118]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);
[28]164
[118]165  ///Resets label of node(s) to the default value
[6]166
[118]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);
[94]170
[118]171  ///This function is called, when any of the displayed attributes have to be updated, or changed
172
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);
176
177  ///updates the given property
178
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);
182
183  ///updates the given property
184
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);
188
189  ///updates all the property for the given edge
[94]190  void propertyUpdate(Edge);
[118]191
192  ///updates all the property for the given node
[94]193  void propertyUpdate(Node);
194
[6]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();
205
[9]206  ///This function changes the tool in the graph-editor's hand
207  void changeEditorialTool(int);
208
[6]209protected:
210
[118]211  //maximizing, minimizing, restoring window, etc.
[6]212  virtual bool on_expose_event(GdkEventExpose *);
213
214private:
215
216  ///This function is responsible for the correct
217  ///reaction of any action happened in the territory
218  ///of the canvas
[25]219  ///DEPRECATED!!!!
[30]220  bool eventHandler(GdkEvent* e, Node n);
[6]221
[9]222  ///actual event handler
223  ///
224  ///Actual event handler should be stored, to be able to disconnect it and later reconnect it.
225  sigc::connection actual_handler;
226
227  ///event handler for the case when move-tool is active
[30]228  bool moveEventHandler(GdkEvent*);
[9]229  ///event handler for the case when create_node-tool is active
[30]230  bool createNodeEventHandler(GdkEvent*);
[9]231  ///event handler for the case when create_edge-tool is active
[30]232  bool createEdgeEventHandler(GdkEvent*);
[13]233  ///event handler for the case when eraser-tool is active
[30]234  bool eraserEventHandler(GdkEvent*);
[32]235  ///event handler for the case when edge map editor tool is active
[30]236  bool edgeMapEditEventHandler(GdkEvent*);
[32]237  ///event handler for the case when node map editor tool is active
238  bool nodeMapEditEventHandler(GdkEvent*);
[13]239
[21]240public:
[25]241  ///Moves the text to new place
[30]242  void textReposition(xy<double>);
[118]243
[25]244  ///Activates an edge belonging to a BrokenEdge
[118]245
[35]246  ///After we have activated an edge this way,
247  ///the GDC object will know, which edge is under forming
[118]248  ///therefore it can redraw the necessary elements on the canvas,
[35]249  ///for example the text belonging to the \ref BrokenEdge can be
250  ///redrawn (\ref textReposition).
[30]251  void toggleEdgeActivity(BrokenEdge*, bool);
[25]252
253public:
[118]254
255  ///Returns the actual tool in hand
[30]256  int getActualTool();
[21]257
[118]258  ///draws the graph
259
260  ///Called when opening a file.
[53]261  void drawGraph();
[118]262
263  ///Clears the canvas
264
265  ///It achieves this by deleting all data
266  ///structure used to help handle the displayed graph.
[53]267  void clear();
268
[37]269  ///creates a new Nodemap
[118]270
271  ///\param init initial value of the map
272  ///\param mapname name of new map
273  int addNewNodeMap(double init,std::string mapname);
[37]274  ///creates a new Edgemap
[118]275
276  ///\param init initial value of the map
277  ///\param mapname name of new map
278  int addNewEdgeMap(double init,std::string mapname);
[37]279
[21]280private:
[14]281  ///Deletes the given element.
[62]282  void deleteItem(Node);
[14]283  ///Deletes the given element.
[62]284  void deleteItem(Edge);
[9]285
[21]286private:
287
[6]288  ///Map of nodes of graph
289  Graph::NodeMap<Gnome::Canvas::Ellipse *> nodesmap;
290
291  ///Map of edges of graph
[19]292  Graph::EdgeMap<BrokenEdge *> edgesmap;
[6]293
294  ///Map of texts to write on edges
295  Graph::EdgeMap<Gnome::Canvas::Text *> edgetextmap;
296
[28]297  ///Map of texts to write on nodes
298  Graph::NodeMap<Gnome::Canvas::Text *> nodetextmap;
299
[6]300  ///Group of graphical elements of displayed_graph
301  Gnome::Canvas::Group displayed_graph;
302
[88]303private:
[6]304  ///Indicates whether the button of mouse is pressed or not
[20]305  int isbutton;
[6]306
[21]307  ///Stores the actual tool in hand
308  int actual_tool;
309
[6]310  ///At this location was the mousebutton pressed.
311  ///It helps to calculate the distance of dragging.
312  double clicked_x, clicked_y;
313
314  ///Remembers which Gnome::Canvas::Item was pressed.
[118]315
316  ///this variable is needed, to work on it after selection
317  Gnome::Canvas::Item * active_item;
318
319  ///Remembers which Gnome::Canvas::Item was pressed.
320
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;
328
329  ///selected node (for any editing)
[62]330  Node active_node;
[118]331
332  ///selected edge (for any editing)
[62]333  Edge active_edge;
[118]334
335  ///the edge that is selected by clicking on the red arrow in the middle of it
336
337  ///This edge is stored only for the purpose of reshape it.
338  ///That is why it is selected in a different manner.
[62]339  Edge forming_edge;
[35]340
[118]341  ///Map displayed by label can be edited.
342  std::string nodemap_to_edit;
343
344  ///Map displayed by label can be edited.
345  std::string edgemap_to_edit;
[6]346
347  static const int zoom_step = 5;
[19]348
[88]349private:
350
[118]351  ///reference to the container, in which the canvas is
[96]352  NoteBookTab & mytab;
[55]353
[98]354  XY GraphDisplayerCanvas::calcArrowPos(XY, XY, XY, XY, bool);
[6]355};
356
357#endif //GRAPH_DISPLAYER_CANVAS_H
Note: See TracBrowser for help on using the repository browser.