gui/graph_displayer_canvas.h
author deba
Thu, 30 Mar 2006 09:36:33 +0000
changeset 2021 11455e986b95
parent 1888 eed01ce27087
permissions -rw-r--r--
IncEdgeIt goes through on loop edges twice.
     1 // -*- C++ -*- //
     2 
     3 #ifndef GRAPH_DISPLAYER_CANVAS_H
     4 #define GRAPH_DISPLAYER_CANVAS_H
     5 
     6 class 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.
    15 class GraphDisplayerCanvas : public Gnome::Canvas::CanvasAA
    16 {
    17   friend class BrokenEdge;
    18 
    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
    26   class BrokenEdge : public Gnome::Canvas::Line
    27   {
    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
    33     Edge edge;
    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
    40     GraphDisplayerCanvas & gdc;
    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.
    46     Gnome::Canvas::Polygon * arrow;
    47 
    48     ///Indicates whether the button of mouse is pressed or not at the moment.
    49     bool isbutton;
    50 
    51     ///At this location was the mousebutton pressed. Horizontal component.
    52 
    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);
    68   public:
    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
    81     ~BrokenEdge();
    82 
    83     ///The function that draws the edge based on collected data
    84     void draw();
    85   };
    86 
    87   ///Type of canvas, on which the graph is drawn
    88   typedef Gnome::Canvas::CanvasAA Parent;
    89 
    90 public:
    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
    97   virtual ~GraphDisplayerCanvas();
    98 
    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 
   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);
   116 
   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 
   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);
   128 
   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 
   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);
   140 
   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 
   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);
   152 
   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 
   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);
   164 
   165   ///Resets label of node(s) to the default value
   166 
   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);
   170 
   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
   190   void propertyUpdate(Edge);
   191 
   192   ///updates all the property for the given node
   193   void propertyUpdate(Node);
   194 
   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 
   206   ///This function changes the tool in the graph-editor's hand
   207   void changeEditorialTool(int);
   208 
   209 protected:
   210 
   211   //maximizing, minimizing, restoring window, etc.
   212   virtual bool on_expose_event(GdkEventExpose *);
   213 
   214 private:
   215 
   216   ///This function is responsible for the correct
   217   ///reaction of any action happened in the territory
   218   ///of the canvas
   219   ///DEPRECATED!!!!
   220   bool eventHandler(GdkEvent* e, Node n);
   221 
   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
   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*);
   239 
   240 public:
   241   ///Moves the text to new place
   242   void textReposition(xy<double>);
   243 
   244   ///Activates an edge belonging to a BrokenEdge
   245 
   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);
   252 
   253 public:
   254 
   255   ///Returns the actual tool in hand
   256   int getActualTool();
   257 
   258   ///draws the graph
   259 
   260   ///Called when opening a file.
   261   void drawGraph();
   262 
   263   ///Clears the canvas
   264 
   265   ///It achieves this by deleting all data
   266   ///structure used to help handle the displayed graph.
   267   void clear();
   268 
   269   ///creates a new Nodemap
   270 
   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
   275 
   276   ///\param init initial value of the map
   277   ///\param mapname name of new map
   278   int addNewEdgeMap(double init,std::string mapname);
   279 
   280 private:
   281   ///Deletes the given element.
   282   void deleteItem(Node);
   283   ///Deletes the given element.
   284   void deleteItem(Edge);
   285 
   286 private:
   287 
   288   ///Map of nodes of graph
   289   Graph::NodeMap<Gnome::Canvas::Ellipse *> nodesmap;
   290 
   291   ///Map of edges of graph
   292   Graph::EdgeMap<BrokenEdge *> edgesmap;
   293 
   294   ///Map of texts to write on edges
   295   Graph::EdgeMap<Gnome::Canvas::Text *> edgetextmap;
   296 
   297   ///Map of texts to write on nodes
   298   Graph::NodeMap<Gnome::Canvas::Text *> nodetextmap;
   299 
   300   ///Group of graphical elements of displayed_graph
   301   Gnome::Canvas::Group displayed_graph;
   302 
   303 private:
   304   ///Indicates whether the button of mouse is pressed or not
   305   int isbutton;
   306 
   307   ///Stores the actual tool in hand
   308   int actual_tool;
   309 
   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.
   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)
   330   Node active_node;
   331 
   332   ///selected edge (for any editing)
   333   Edge active_edge;
   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.
   339   Edge forming_edge;
   340 
   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;
   346 
   347   static const int zoom_step = 5;
   348 
   349 private:
   350 
   351   ///reference to the container, in which the canvas is
   352   NoteBookTab & mytab;
   353 
   354   XY calcArrowPos(XY, XY, XY, XY, bool);
   355 };
   356 
   357 #endif //GRAPH_DISPLAYER_CANVAS_H