graph_displayer_canvas.cc
author hegyi
Mon, 02 Oct 2006 18:52:00 +0000
changeset 157 7e6ad28aeb9e
parent 156 c5cdf6690cdf
child 160 14a76109b561
permissions -rwxr-xr-x
View settings also for edges.
     1 #include "graph_displayer_canvas.h"
     2 #include <cmath>
     3 
     4 GraphDisplayerCanvas::GraphDisplayerCanvas(NoteBookTab & mainw) :
     5   nodesmap(mainw.mapstorage.graph), edgesmap(mainw.mapstorage.graph), edgetextmap(mainw.mapstorage.graph),
     6   nodetextmap(mainw.mapstorage.graph), displayed_graph(*(root()), 0, 0),
     7   isbutton(0), active_item(NULL), target_item(NULL), nodemap_to_edit(""),
     8   edgemap_to_edit(""), autoscale(true), zoomtrack(false), radius_size(20), edge_width(10), mytab(mainw)
     9 {
    10   //base event handler is move tool
    11   actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::moveEventHandler), false);
    12   actual_tool=MOVE;
    13 
    14   active_node=INVALID;
    15   active_edge=INVALID;
    16   forming_edge=INVALID;
    17 }
    18 
    19 GraphDisplayerCanvas::~GraphDisplayerCanvas()
    20 {
    21   for (NodeIt n((mytab.mapstorage).graph); n != INVALID; ++n)
    22     {
    23       delete nodesmap[n];
    24       delete nodetextmap[n];
    25     }
    26   
    27   for (EdgeIt e((mytab.mapstorage).graph); e != INVALID; ++e)
    28     {
    29       delete edgesmap[e];
    30       delete edgetextmap[e];
    31     }
    32 }
    33 
    34 void GraphDisplayerCanvas::propertyChange(bool itisedge, int prop)
    35 {
    36   if(itisedge)
    37     {
    38       propertyUpdate(Edge(INVALID), prop);
    39     }
    40   else
    41     {
    42       propertyUpdate(Node(INVALID), prop);
    43     }
    44 }
    45 
    46 void GraphDisplayerCanvas::propertyUpdate(Edge edge)
    47 {
    48   for(int i=0;i<EDGE_PROPERTY_NUM;i++)
    49     {
    50       propertyUpdate(edge, i);
    51     }
    52 }
    53 
    54 void GraphDisplayerCanvas::propertyUpdate(Node node)
    55 {
    56   for(int i=0;i<NODE_PROPERTY_NUM;i++)
    57     {
    58       propertyUpdate(node, i);
    59     }
    60 }
    61 
    62 void GraphDisplayerCanvas::propertyUpdate(Node node, int prop)
    63 {
    64   //dummy=dummy;
    65 
    66   std::string mapname=mytab.getActiveNodeMap(prop);
    67 
    68   if(mapname!="")
    69     {
    70       if( ( ((mytab.mapstorage).nodemap_storage).find(mapname) != ((mytab.mapstorage).nodemap_storage).end() ) )
    71 	{
    72 	  switch(prop)
    73 	    {
    74 	    case N_RADIUS:
    75 	      changeNodeRadius(mapname, node);
    76 	      break;
    77 	    case N_COLOR:
    78 	      changeNodeColor(mapname, node);
    79 	      break;
    80 	    case N_TEXT:
    81 	      changeNodeText(mapname, node);
    82 	      break;
    83 	    default:
    84 	      std::cerr<<"Error\n";
    85 	    }
    86 	}
    87     }
    88   else //mapname==""
    89     {
    90       Node node=INVALID;	
    91       switch(prop)
    92 	{
    93 	case N_RADIUS:
    94 	  resetNodeRadius(node);
    95 	  break;
    96 	case N_COLOR:
    97 	  resetNodeColor(node);
    98 	  break;
    99 	case N_TEXT:
   100 	  resetNodeText(node);
   101 	  break;
   102 	default:
   103 	  std::cerr<<"Error\n";
   104 	}
   105     }
   106 
   107 }
   108 
   109 void GraphDisplayerCanvas::propertyUpdate(Edge edge, int prop)
   110 {
   111   //dummy=dummy;
   112 
   113   std::string mapname=mytab.getActiveEdgeMap(prop);
   114 
   115   if(mapname!="")
   116     {
   117       if( ( ((mytab.mapstorage).edgemap_storage).find(mapname) != ((mytab.mapstorage).edgemap_storage).end() ) )
   118 	{
   119 	  switch(prop)
   120 	    {
   121 	    case E_WIDTH:
   122 	      changeEdgeWidth(mapname, edge);
   123 	      break;
   124 	    case E_COLOR:
   125 	      changeEdgeColor(mapname, edge);
   126 	      break;
   127 	    case E_TEXT:
   128 	      changeEdgeText(mapname, edge);
   129 	      break;
   130 	    default:
   131 	      std::cerr<<"Error\n";
   132 	    }
   133 	}
   134     }
   135   else //mapname==""
   136     {
   137       switch(prop)
   138 	{
   139 	case E_WIDTH:
   140 	  resetEdgeWidth(edge);
   141 	  break;
   142 	case E_COLOR:
   143 	  resetEdgeColor(edge);
   144 	  break;
   145 	case E_TEXT:
   146 	  resetEdgeText(edge);
   147 	  break;
   148 	default:
   149 	  std::cerr<<"Error\n";
   150 	}
   151     }
   152 }
   153 
   154 void GraphDisplayerCanvas::drawGraph()
   155 {
   156   //first edges are drawn, to hide joining with nodes later
   157 
   158   for (EdgeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
   159   {
   160     if (mytab.mapstorage.graph.source(i) == mytab.mapstorage.graph.target(i))
   161     {
   162       edgesmap[i]=new LoopEdge(displayed_graph, i, *this);
   163     }
   164     else
   165     {
   166       edgesmap[i]=new BrokenEdge(displayed_graph, i, *this);
   167     }
   168     //initializing edge-text as well, to empty string
   169 
   170     XY text_pos=mytab.mapstorage.arrow_pos[i];
   171     text_pos+=(XY(10,10));
   172 
   173     edgetextmap[i]=new Gnome::Canvas::Text(displayed_graph, text_pos.x, text_pos.y, "");
   174     edgetextmap[i]->property_fill_color().set_value("darkgreen");
   175     edgetextmap[i]->signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::mapEditEventHandler), false);
   176     edgetextmap[i]->raise_to_top();
   177   }
   178 
   179   //afterwards nodes come to be drawn
   180 
   181   for (NodeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
   182   {
   183     //drawing bule nodes, with black line around them
   184 
   185     nodesmap[i]=new Gnome::Canvas::Ellipse(
   186         displayed_graph,
   187         (mytab.mapstorage).coords[i].x-20,
   188         (mytab.mapstorage).coords[i].y-20,
   189         (mytab.mapstorage).coords[i].x+20,
   190         (mytab.mapstorage).coords[i].y+20);
   191     *(nodesmap[i]) << Gnome::Canvas::Properties::fill_color("blue");
   192     *(nodesmap[i]) << Gnome::Canvas::Properties::outline_color("black");
   193     nodesmap[i]->raise_to_top();
   194 
   195     //initializing edge-text as well, to empty string
   196 
   197     XY text_pos(
   198         ((mytab.mapstorage).coords[i].x+node_property_defaults[N_RADIUS]+5),
   199         ((mytab.mapstorage).coords[i].y+node_property_defaults[N_RADIUS]+5));
   200 
   201     nodetextmap[i]=new Gnome::Canvas::Text(displayed_graph,
   202         text_pos.x, text_pos.y, "");
   203     nodetextmap[i]->property_fill_color().set_value("darkblue");
   204     nodetextmap[i]->signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::mapEditEventHandler), false);
   205     nodetextmap[i]->raise_to_top();
   206   }
   207 
   208   updateScrollRegion();
   209 }
   210 
   211 void GraphDisplayerCanvas::clear()
   212 {
   213   active_node=INVALID;
   214   active_edge=INVALID;
   215   forming_edge=INVALID;
   216 
   217   for (NodeIt n((mytab.mapstorage).graph); n != INVALID; ++n)
   218   {
   219     delete nodesmap[n];
   220     delete nodetextmap[n];
   221   }
   222 
   223   for (EdgeIt e((mytab.mapstorage).graph); e != INVALID; ++e)
   224   {
   225     delete edgesmap[e];
   226     delete edgetextmap[e];
   227   }
   228 }
   229 
   230 void GraphDisplayerCanvas::setView(bool autoscale_p, bool zoomtrack_p, double width_p, double radius_p)
   231 {
   232   autoscale=autoscale_p;
   233   edge_width=width_p;
   234   radius_size=radius_p;
   235 
   236   if((!zoomtrack) && zoomtrack_p)
   237     {
   238       fixed_zoom_factor=get_pixels_per_unit();
   239     }
   240 
   241   zoomtrack=zoomtrack_p;
   242 
   243   propertyChange(false, N_RADIUS);
   244   propertyChange(true, E_WIDTH);
   245 }
   246 
   247 void GraphDisplayerCanvas::getView(bool & autoscale_p, bool & zoomtrack_p, double& width_p, double& radius_p)
   248 {
   249   autoscale_p=autoscale;
   250   zoomtrack_p=zoomtrack;
   251   width_p=edge_width;
   252   radius_p=radius_size;
   253 }