COIN-OR::LEMON - Graph Library

source: lemon-0.x/gui/graph_displayer_canvas.h @ 1641:77f6ab7ad66f

Last change on this file since 1641:77f6ab7ad66f was 1614:350c1d8bb7cc, checked in by Hegyi Péter, 19 years ago

Alpar had the key, focus can be set in the window class. But it is not enough, the focused widget has to be activated, as well! Was a hard task to find out... By the way, two compilation warnings are removed.

File size: 6.1 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 "mapstorage.h"
10#include "broken_edge.h"
11#include "map_win.h"
12#include <libgnomecanvasmm.h>
13#include <libgnomecanvasmm/polygon.h>
14
15///This class is the canvas, on which the graph can be drawn.
16class GraphDisplayerCanvas : public Gnome::Canvas::CanvasAA
17{
18  typedef Gnome::Canvas::CanvasAA Parent;
19
20public:
21  GraphDisplayerCanvas(MapStorage &, MapWin &, Gtk::Window *);
22  virtual ~GraphDisplayerCanvas();
23
24  ///Changes the linewidth attribute according to the given map.
25  ///\param mapname is the name of the map which contains the new values
26  int changeEdgeWidth (std::string mapname, Graph::Edge new_item=INVALID);
27
28  ///Changes the linecolor attribute according to the given map.
29  ///\param mapname is the name of the map which contains the new values
30  int changeEdgeColor (std::string mapname, Graph::Edge new_item=INVALID);
31
32  ///Changes the text of line attribute according to the given map.
33  ///\param mapname is the name of the map which contains the new values
34  int changeEdgeText (std::string mapname, Graph::Edge new_item=INVALID);
35
36  ///Changes the linewidth attribute according to the given map.
37  ///\param mapname is the name of the map which contains the new values
38  int changeNodeRadius (std::string mapname, Graph::Node new_item=INVALID);
39
40  ///Changes the linecolor attribute according to the given map.
41  ///\param mapname is the name of the map which contains the new values
42  int changeNodeColor (std::string mapname, Graph::Node new_item=INVALID);
43
44  ///Changes the text of line attribute according to the given map.
45  ///\param mapname is the name of the map which contains the new values
46  int changeNodeText (std::string mapname, Graph::Node new_item=INVALID);
47
48  ///Callback for 'ViewZoomIn' action.
49  virtual void zoomIn();
50  ///Callback for 'ViewZoomOut' action.
51  virtual void zoomOut();
52  ///Callback for 'ViewZoomFit' action.
53  virtual void zoomFit();
54  ///Callback for 'ViewZoom100' action.
55  virtual void zoom100();
56  ///Sets the scroll region of the convas to the bounding box of the graph.
57  void updateScrollRegion();
58
59  ///This function changes the tool in the graph-editor's hand
60  void changeEditorialTool(int);
61
62protected:
63
64  //maximizing, minimizing, restoring window, etc.
65  virtual bool on_expose_event(GdkEventExpose *);
66
67private:
68
69  ///This function is responsible for the correct
70  ///reaction of any action happened in the territory
71  ///of the canvas
72  ///DEPRECATED!!!!
73  bool eventHandler(GdkEvent* e, Node n);
74
75  ///actual event handler
76  ///
77  ///Actual event handler should be stored, to be able to disconnect it and later reconnect it.
78  sigc::connection actual_handler;
79
80  ///event handler for the case when move-tool is active
81  bool moveEventHandler(GdkEvent*);
82  ///event handler for the case when create_node-tool is active
83  bool createNodeEventHandler(GdkEvent*);
84  ///event handler for the case when create_edge-tool is active
85  bool createEdgeEventHandler(GdkEvent*);
86  ///event handler for the case when eraser-tool is active
87  bool eraserEventHandler(GdkEvent*);
88  ///event handler for the case when edge map editor tool is active
89  bool edgeMapEditEventHandler(GdkEvent*);
90  ///event handler for the case when node map editor tool is active
91  bool nodeMapEditEventHandler(GdkEvent*);
92
93  ///event handler for the case when the entry widget is changed
94  bool entryWidgetChangeHandler(GdkEvent*);
95
96public:
97  ///Moves the text to new place
98  void textReposition(xy<double>);
99  ///Activates an edge belonging to a BrokenEdge
100  ///
101  ///After we have activated an edge this way,
102  ///the GDC object will know, which edge is under forming
103  ///therefore it can redraw the necessarz elementy on the canvas,
104  ///for example the text belonging to the \ref BrokenEdge can be
105  ///redrawn (\ref textReposition).
106  void toggleEdgeActivity(BrokenEdge*, bool);
107
108public:
109  ///\return the actual tool in hand
110  int getActualTool();
111
112  void drawGraph();
113  void clear();
114
115  ///creates a new Nodemap
116  int addNewNodeMap(double,std::string);
117  ///creates a new Edgemap
118  int addNewEdgeMap(double,std::string);
119
120private:
121  ///Deletes the given element.
122  void deleteItem(NodeIt);
123  ///Deletes the given element.
124  void deleteItem(EdgeIt);
125  ///Deletes the given element.
126  void deleteItem(Graph::Edge);
127
128private:
129
130  ///Map of nodes of graph
131  Graph::NodeMap<Gnome::Canvas::Ellipse *> nodesmap;
132
133  ///Map of edges of graph
134  Graph::EdgeMap<BrokenEdge *> edgesmap;
135
136  ///Map of texts to write on edges
137  Graph::EdgeMap<Gnome::Canvas::Text *> edgetextmap;
138
139  ///Map of texts to write on nodes
140  Graph::NodeMap<Gnome::Canvas::Text *> nodetextmap;
141
142  ///Group of graphical elements of displayed_graph
143  Gnome::Canvas::Group displayed_graph;
144
145  ///Map editor entry
146  Gtk::Entry entrywidget;
147
148  ///GnomeCanvas holder for entry
149  Gnome::Canvas::Widget * canvasentrywidget;
150
151  ///Here we store the maps that can be displayed through properties.
152  MapStorage & mapstorage;
153
154  ///Indicates whether the button of mouse is pressed or not
155  int isbutton;
156
157  ///Stores the actual tool in hand
158  int actual_tool;
159
160  ///At this location was the mousebutton pressed.
161  ///It helps to calculate the distance of dragging.
162  double clicked_x, clicked_y;
163
164  ///Remembers which Gnome::Canvas::Item was pressed.
165  ///this variable is needed, because
166  ///1. we cannot query the item at he cursor as fast as it could not cause a Segmentation Fault
167  ///2. we would like to handle only ony item per movement, therefore quering it is not a working solution
168  Gnome::Canvas::Item * active_item, * target_item;
169  Graph::NodeIt active_node;
170  Graph::EdgeIt active_edge;
171  Graph::EdgeIt forming_edge;
172
173  std::string nodemap_to_edit, edgemap_to_edit;
174
175  static const int zoom_step = 5;
176
177  ///We need to store mapwin, to be able to ask the appropriate values for properties of new items.
178  MapWin & mapwin;
179
180  ///We need to store the parent window to be able to set the focus on a given widget
181  ///We will use this variable to activate the set focus on entry widget in the case of editing map values.
182  Gtk::Window * parentwin;
183
184};
185
186#endif //GRAPH_DISPLAYER_CANVAS_H
Note: See TracBrowser for help on using the repository browser.