graph_displayer_canvas-event.cc
author hegyi
Fri, 24 Jun 2005 07:58:18 +0000
branchgui
changeset 27 e2c86ae158cf
child 28 fa28f1071bd6
permissions -rwxr-xr-x
File graph_displayer is split in functional parts.
hegyi@27
     1
#include <graph_displayer_canvas.h>
hegyi@27
     2
#include <broken_edge.h>
hegyi@27
     3
#include <math.h>
hegyi@27
     4
hegyi@27
     5
hegyi@27
     6
bool GraphDisplayerCanvas::on_expose_event(GdkEventExpose *event)
hegyi@27
     7
{
hegyi@27
     8
  Gnome::Canvas::CanvasAA::on_expose_event(event);
hegyi@27
     9
  //usleep(10000);
hegyi@27
    10
  //rezoom();
hegyi@27
    11
  return true;
hegyi@27
    12
}
hegyi@27
    13
hegyi@27
    14
void GraphDisplayerCanvas::changeEditorialTool(int newtool)
hegyi@27
    15
{
hegyi@27
    16
  actual_handler.disconnect();
hegyi@27
    17
hegyi@27
    18
  if(actual_tool==CREATE_EDGE)
hegyi@27
    19
    {
hegyi@27
    20
	GdkEvent * generated=new GdkEvent();
hegyi@27
    21
	generated->type=GDK_BUTTON_RELEASE;
hegyi@27
    22
	generated->button.button=3;
hegyi@27
    23
	create_edge_event_handler(generated);      
hegyi@27
    24
    }
hegyi@27
    25
hegyi@27
    26
  actual_tool=newtool;
hegyi@27
    27
hegyi@27
    28
  switch(newtool)
hegyi@27
    29
    {
hegyi@27
    30
    case MOVE:
hegyi@27
    31
      actual_handler=displayed_graph.signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::move_event_handler), false);
hegyi@27
    32
      break;
hegyi@27
    33
hegyi@27
    34
      //it has to assigned to canvas, because all the canvas has to be monitored, not only the elements of the already drawn group
hegyi@27
    35
    case CREATE_NODE:
hegyi@27
    36
      actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::create_node_event_handler), false);
hegyi@27
    37
      break;
hegyi@27
    38
hegyi@27
    39
    case CREATE_EDGE:
hegyi@27
    40
      actual_handler=displayed_graph.signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::create_edge_event_handler), false);
hegyi@27
    41
      break;
hegyi@27
    42
hegyi@27
    43
    case ERASER:
hegyi@27
    44
      actual_handler=displayed_graph.signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::eraser_event_handler), false);
hegyi@27
    45
      break;
hegyi@27
    46
hegyi@27
    47
    default:
hegyi@27
    48
      break;
hegyi@27
    49
    }
hegyi@27
    50
}
hegyi@27
    51
hegyi@27
    52
int GraphDisplayerCanvas::get_actual_tool()
hegyi@27
    53
{
hegyi@27
    54
  return actual_tool;
hegyi@27
    55
}
hegyi@27
    56
hegyi@27
    57
bool GraphDisplayerCanvas::move_event_handler(GdkEvent* e)
hegyi@27
    58
{
hegyi@27
    59
  switch(e->type)
hegyi@27
    60
  {
hegyi@27
    61
    case GDK_BUTTON_PRESS:
hegyi@27
    62
      //we mark the location of the event to be able to calculate parameters of dragging
hegyi@27
    63
      clicked_x=e->button.x;
hegyi@27
    64
      clicked_y=e->button.y;
hegyi@27
    65
      active_item=(get_item_at(e->button.x, e->button.y));
hegyi@27
    66
      active_node=INVALID;
hegyi@27
    67
      for (NodeIt i(g); i!=INVALID; ++i)
hegyi@27
    68
	{
hegyi@27
    69
	  if(nodesmap[i]==active_item)
hegyi@27
    70
	    {
hegyi@27
    71
	      active_node=i;
hegyi@27
    72
	    }
hegyi@27
    73
	}
hegyi@27
    74
      switch(e->button.button)
hegyi@27
    75
	{
hegyi@27
    76
	case 3:      
hegyi@27
    77
	  isbutton=3;
hegyi@27
    78
	  break;
hegyi@27
    79
	default:
hegyi@27
    80
	  isbutton=1;
hegyi@27
    81
	  break;
hegyi@27
    82
	}
hegyi@27
    83
      break;
hegyi@27
    84
    case GDK_BUTTON_RELEASE:
hegyi@27
    85
      isbutton=0;
hegyi@27
    86
      active_item=NULL;
hegyi@27
    87
      active_node=INVALID;
hegyi@27
    88
      updateScrollRegion();
hegyi@27
    89
      break;
hegyi@27
    90
    case GDK_MOTION_NOTIFY:
hegyi@27
    91
      //we only have to do sg. if the mouse button is pressed AND the click was on a node that was found in the set of nodes
hegyi@27
    92
      if(active_node!=INVALID)
hegyi@27
    93
      {
hegyi@27
    94
	//new coordinates will be the old values,
hegyi@27
    95
	//because the item will be moved to the
hegyi@27
    96
	//new coordinate therefore the new movement
hegyi@27
    97
	//has to be calculated from here
hegyi@27
    98
hegyi@27
    99
        double dx=e->motion.x-clicked_x;
hegyi@27
   100
        double dy=e->motion.y-clicked_y;
hegyi@27
   101
hegyi@27
   102
        active_item->move(dx, dy);
hegyi@27
   103
hegyi@27
   104
        clicked_x=e->motion.x;
hegyi@27
   105
        clicked_y=e->motion.y;
hegyi@27
   106
hegyi@27
   107
	//all the edges connected to the moved point has to be redrawn
hegyi@27
   108
        EdgeIt ei;
hegyi@27
   109
hegyi@27
   110
        g.firstOut(ei,active_node);
hegyi@27
   111
hegyi@27
   112
        for(;ei!=INVALID;g.nextOut(ei))
hegyi@27
   113
        {
hegyi@27
   114
            Gnome::Canvas::Points coos;
hegyi@27
   115
            double x1, x2, y1, y2;
hegyi@27
   116
hegyi@27
   117
            nodesmap[g.source(ei)]->get_bounds(x1, y1, x2, y2);
hegyi@27
   118
            coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
hegyi@27
   119
hegyi@27
   120
            nodesmap[g.target(ei)]->get_bounds(x1, y1, x2, y2);
hegyi@27
   121
            coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
hegyi@27
   122
hegyi@27
   123
	    if(isbutton==3)
hegyi@27
   124
	      {
hegyi@27
   125
		edgesmap[ei]->set_points(coos);
hegyi@27
   126
	      }
hegyi@27
   127
	    else
hegyi@27
   128
	      {
hegyi@27
   129
		edgesmap[ei]->set_points(coos,true);
hegyi@27
   130
	      }
hegyi@27
   131
hegyi@27
   132
	    xy<double> text_pos=edgesmap[ei]->get_arrow_pos();
hegyi@27
   133
	    text_pos+=(xy<double>(10,10));
hegyi@27
   134
	    edgetextmap[ei]->property_x().set_value(text_pos.x);
hegyi@27
   135
	    edgetextmap[ei]->property_y().set_value(text_pos.y);
hegyi@27
   136
        }
hegyi@27
   137
hegyi@27
   138
        g.firstIn(ei,active_node);
hegyi@27
   139
        for(;ei!=INVALID;g.nextIn(ei))
hegyi@27
   140
        {
hegyi@27
   141
            Gnome::Canvas::Points coos;
hegyi@27
   142
            double x1, x2, y1, y2;
hegyi@27
   143
hegyi@27
   144
            nodesmap[g.source(ei)]->get_bounds(x1, y1, x2, y2);
hegyi@27
   145
            coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
hegyi@27
   146
hegyi@27
   147
            nodesmap[g.target(ei)]->get_bounds(x1, y1, x2, y2);
hegyi@27
   148
            coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
hegyi@27
   149
hegyi@27
   150
	    if(isbutton==3)
hegyi@27
   151
	      {
hegyi@27
   152
		edgesmap[ei]->set_points(coos);
hegyi@27
   153
	      }
hegyi@27
   154
	    else
hegyi@27
   155
	      {
hegyi@27
   156
		edgesmap[ei]->set_points(coos,true);
hegyi@27
   157
	      }
hegyi@27
   158
hegyi@27
   159
	    xy<double> text_pos=edgesmap[ei]->get_arrow_pos();
hegyi@27
   160
	    text_pos+=(xy<double>(10,10));
hegyi@27
   161
	    edgetextmap[ei]->property_x().set_value(text_pos.x);
hegyi@27
   162
	    edgetextmap[ei]->property_y().set_value(text_pos.y);
hegyi@27
   163
        }
hegyi@27
   164
      }
hegyi@27
   165
    default: break;
hegyi@27
   166
  }
hegyi@27
   167
hegyi@27
   168
  return true;
hegyi@27
   169
}
hegyi@27
   170
hegyi@27
   171
bool GraphDisplayerCanvas::create_node_event_handler(GdkEvent* e)
hegyi@27
   172
{
hegyi@27
   173
  switch(e->type)
hegyi@27
   174
    {
hegyi@27
   175
hegyi@27
   176
      //draw the new node in red at the clicked place
hegyi@27
   177
    case GDK_BUTTON_PRESS:
hegyi@27
   178
      isbutton=1;
hegyi@27
   179
hegyi@27
   180
      active_node=NodeIt(g,g.addNode());
hegyi@27
   181
hegyi@27
   182
      //initiating values corresponding to new node in maps
hegyi@27
   183
      
hegyi@27
   184
hegyi@27
   185
      window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
hegyi@27
   186
hegyi@27
   187
      nodesmap[active_node]=new Gnome::Canvas::Ellipse(displayed_graph, clicked_x-20, clicked_y-20, clicked_x+20, clicked_y+20);
hegyi@27
   188
      active_item=(Gnome::Canvas::Item *)(nodesmap[active_node]);
hegyi@27
   189
      *(nodesmap[active_node]) << Gnome::Canvas::Properties::fill_color("red");
hegyi@27
   190
      *(nodesmap[active_node]) << Gnome::Canvas::Properties::outline_color("black");
hegyi@27
   191
      (nodesmap[active_node])->show();
hegyi@27
   192
      break;
hegyi@27
   193
hegyi@27
   194
      //move the new node
hegyi@27
   195
    case GDK_MOTION_NOTIFY:
hegyi@27
   196
      {
hegyi@27
   197
	double world_motion_x, world_motion_y;
hegyi@27
   198
	GdkEvent * generated=new GdkEvent();
hegyi@27
   199
	window_to_world (e->motion.x, e->motion.y, world_motion_x, world_motion_y);
hegyi@27
   200
	generated->motion.x=world_motion_x;
hegyi@27
   201
	generated->motion.y=world_motion_y;
hegyi@27
   202
	generated->type=GDK_MOTION_NOTIFY;
hegyi@27
   203
	move_event_handler(generated);      
hegyi@27
   204
	break;
hegyi@27
   205
      }
hegyi@27
   206
hegyi@27
   207
      //finalize the new node
hegyi@27
   208
    case GDK_BUTTON_RELEASE:
hegyi@27
   209
      isbutton=0;
hegyi@27
   210
      *active_item << Gnome::Canvas::Properties::fill_color("blue");
hegyi@27
   211
      active_item=NULL;
hegyi@27
   212
      active_node=INVALID;
hegyi@27
   213
      updateScrollRegion();
hegyi@27
   214
      break;
hegyi@27
   215
    default:
hegyi@27
   216
      break;
hegyi@27
   217
    }
hegyi@27
   218
  return false;
hegyi@27
   219
}
hegyi@27
   220
hegyi@27
   221
bool GraphDisplayerCanvas::create_edge_event_handler(GdkEvent* e)
hegyi@27
   222
{
hegyi@27
   223
  switch(e->type)
hegyi@27
   224
    {
hegyi@27
   225
    case GDK_BUTTON_PRESS:
hegyi@27
   226
      //in edge creation right button has special meaning
hegyi@27
   227
      if(e->button.button!=3)
hegyi@27
   228
	{
hegyi@27
   229
	  //there is not yet selected node
hegyi@27
   230
	  if(active_node==INVALID)
hegyi@27
   231
	    {
hegyi@27
   232
	      //we mark the location of the event to be able to calculate parameters of dragging
hegyi@27
   233
	      clicked_x=e->button.x;
hegyi@27
   234
	      clicked_y=e->button.y;
hegyi@27
   235
	      active_item=(get_item_at(e->button.x, e->button.y));
hegyi@27
   236
	      active_node=INVALID;
hegyi@27
   237
	      for (NodeIt i(g); i!=INVALID; ++i)
hegyi@27
   238
		{
hegyi@27
   239
		  if(nodesmap[i]==active_item)
hegyi@27
   240
		    {
hegyi@27
   241
		      active_node=i;
hegyi@27
   242
		    }
hegyi@27
   243
		}
hegyi@27
   244
	      //the clicked item is really a node
hegyi@27
   245
	      if(active_node!=INVALID)
hegyi@27
   246
		{
hegyi@27
   247
		  *(nodesmap[active_node]) << Gnome::Canvas::Properties::fill_color("red");
hegyi@27
   248
		  isbutton=1;
hegyi@27
   249
		}
hegyi@27
   250
	      //clicked item was not a node. It could be e.g. edge.
hegyi@27
   251
	      else
hegyi@27
   252
		{
hegyi@27
   253
		  active_item=NULL;
hegyi@27
   254
		}
hegyi@27
   255
	    }
hegyi@27
   256
	  //we only have to do sg. if the mouse button
hegyi@27
   257
	  // is pressed already once AND the click was
hegyi@27
   258
	  // on a node that was found in the set of 
hegyi@27
   259
	  //nodes, and now we only search for the second 
hegyi@27
   260
	  //node
hegyi@27
   261
	  else
hegyi@27
   262
	    {
hegyi@27
   263
	      target_item=(get_item_at(e->button.x, e->button.y));
hegyi@27
   264
	      Graph::NodeIt target_node=INVALID;
hegyi@27
   265
	      for (NodeIt i(g); i!=INVALID; ++i)
hegyi@27
   266
		{
hegyi@27
   267
		  if(nodesmap[i]==target_item)
hegyi@27
   268
		    {
hegyi@27
   269
		      target_node=i;
hegyi@27
   270
		    }
hegyi@27
   271
		}
hegyi@27
   272
	      //the clicked item is a node, the edge can be drawn
hegyi@27
   273
	      if(target_node!=INVALID)
hegyi@27
   274
		{
hegyi@27
   275
		  *(nodesmap[target_node]) << Gnome::Canvas::Properties::fill_color("red");
hegyi@27
   276
hegyi@27
   277
		  //creating new edge
hegyi@27
   278
		  active_edge=EdgeIt(g,g.addEdge(active_node, target_node));
hegyi@27
   279
hegyi@27
   280
		  //initiating values corresponding to new edge in maps
hegyi@27
   281
		  mapstorage.init_maps_for_edge(active_edge);
hegyi@27
   282
	  
hegyi@27
   283
		  //calculating coordinates of new edge
hegyi@27
   284
		  Gnome::Canvas::Points coos;
hegyi@27
   285
		  double x1, x2, y1, y2;
hegyi@27
   286
	  
hegyi@27
   287
		  active_item->get_bounds(x1, y1, x2, y2);
hegyi@27
   288
		  coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
hegyi@27
   289
hegyi@27
   290
		  target_item->get_bounds(x1, y1, x2, y2);
hegyi@27
   291
		  coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
hegyi@27
   292
hegyi@27
   293
		  //drawing new edge
hegyi@27
   294
		  edgesmap[active_edge]=new BrokenEdge(displayed_graph, coos, *this);
hegyi@27
   295
		  *(edgesmap[active_edge]) << Gnome::Canvas::Properties::fill_color("green");
hegyi@27
   296
		  edgesmap[active_edge]->property_width_pixels().set_value(10);
hegyi@27
   297
hegyi@27
   298
		  //redraw nodes to blank terminations of the new edge
hegyi@27
   299
		  target_item->raise_to_top();
hegyi@27
   300
		  active_item->raise_to_top();
hegyi@27
   301
hegyi@27
   302
		  //initializing edge-text as well, to empty string
hegyi@27
   303
		  xy<double> text_pos=edgesmap[active_edge]->get_arrow_pos();
hegyi@27
   304
		  text_pos+=(xy<double>(10,10));
hegyi@27
   305
hegyi@27
   306
		  edgetextmap[active_edge]=new Gnome::Canvas::Text(displayed_graph, text_pos.x, text_pos.y, "");
hegyi@27
   307
		  edgetextmap[active_edge]->property_fill_color().set_value("black");
hegyi@27
   308
		}
hegyi@27
   309
	      //clicked item was not a node. it could be an e.g. edge. we do not deal with it furthermore.
hegyi@27
   310
	      else
hegyi@27
   311
		{
hegyi@27
   312
		  target_item=NULL;
hegyi@27
   313
		}
hegyi@27
   314
	    }
hegyi@27
   315
	}
hegyi@27
   316
      break;
hegyi@27
   317
    case GDK_BUTTON_RELEASE:
hegyi@27
   318
      isbutton=0;
hegyi@27
   319
      //we clear settings in two cases
hegyi@27
   320
      //1: the edge is ready (target_item has valid value)
hegyi@27
   321
      //2: the edge creation is cancelled with right button
hegyi@27
   322
      if((target_item)||(e->button.button==3))
hegyi@27
   323
	{
hegyi@27
   324
	  if(active_item)
hegyi@27
   325
	    {
hegyi@27
   326
	      *active_item << Gnome::Canvas::Properties::fill_color("blue");
hegyi@27
   327
	      active_item=NULL;
hegyi@27
   328
	    }
hegyi@27
   329
	  if(target_item)
hegyi@27
   330
	    {
hegyi@27
   331
	      *target_item << Gnome::Canvas::Properties::fill_color("blue");
hegyi@27
   332
	      target_item=NULL;
hegyi@27
   333
	    }
hegyi@27
   334
	  active_node=INVALID;
hegyi@27
   335
	  active_edge=INVALID;
hegyi@27
   336
	}
hegyi@27
   337
      break;
hegyi@27
   338
    default:
hegyi@27
   339
      break;
hegyi@27
   340
    }
hegyi@27
   341
  return false;
hegyi@27
   342
}
hegyi@27
   343
hegyi@27
   344
bool GraphDisplayerCanvas::eraser_event_handler(GdkEvent* e)
hegyi@27
   345
{
hegyi@27
   346
  switch(e->type)
hegyi@27
   347
    {
hegyi@27
   348
    case GDK_BUTTON_PRESS:
hegyi@27
   349
      active_item=(get_item_at(e->button.x, e->button.y));
hegyi@27
   350
      active_node=INVALID;
hegyi@27
   351
      active_edge=INVALID;
hegyi@27
   352
      for (NodeIt i(g); i!=INVALID; ++i)
hegyi@27
   353
	{
hegyi@27
   354
	  if(nodesmap[i]==active_item)
hegyi@27
   355
	    {
hegyi@27
   356
	      active_node=i;
hegyi@27
   357
	    }
hegyi@27
   358
	}
hegyi@27
   359
      if(active_node==INVALID)
hegyi@27
   360
	{
hegyi@27
   361
	  for (EdgeIt i(g); i!=INVALID; ++i)
hegyi@27
   362
	    {
hegyi@27
   363
	      if(edgesmap[i]==active_item)
hegyi@27
   364
		{
hegyi@27
   365
		  active_edge=i;
hegyi@27
   366
		}
hegyi@27
   367
	    }
hegyi@27
   368
	}
hegyi@27
   369
    *active_item << Gnome::Canvas::Properties::fill_color("red");
hegyi@27
   370
      break;
hegyi@27
   371
hegyi@27
   372
    case GDK_BUTTON_RELEASE:
hegyi@27
   373
      if(active_item==(get_item_at(e->button.x, e->button.y)))
hegyi@27
   374
	{
hegyi@27
   375
	  if(active_node!=INVALID)
hegyi@27
   376
	    {
hegyi@27
   377
hegyi@27
   378
	      //collecting edges to delete
hegyi@27
   379
	      EdgeIt e;
hegyi@27
   380
	      std::set<Graph::Edge> edges_to_delete;
hegyi@27
   381
hegyi@27
   382
	      g.firstOut(e,active_node);
hegyi@27
   383
	      for(;e!=INVALID;g.nextOut(e))
hegyi@27
   384
		{
hegyi@27
   385
		      edges_to_delete.insert(e);
hegyi@27
   386
		}
hegyi@27
   387
hegyi@27
   388
	      g.firstIn(e,active_node);
hegyi@27
   389
	      for(;e!=INVALID;g.nextIn(e))
hegyi@27
   390
		{
hegyi@27
   391
		      edges_to_delete.insert(e);
hegyi@27
   392
		}
hegyi@27
   393
hegyi@27
   394
	      //deleting collected edges
hegyi@27
   395
	      for(std::set<Graph::Edge>::iterator edge_set_it=edges_to_delete.begin();edge_set_it!=edges_to_delete.end();edge_set_it++)
hegyi@27
   396
		{
hegyi@27
   397
		  delete_item(*edge_set_it);
hegyi@27
   398
		}
hegyi@27
   399
	      delete_item(active_node);
hegyi@27
   400
	    }
hegyi@27
   401
	  //a simple edge was chosen
hegyi@27
   402
	  else
hegyi@27
   403
	    {
hegyi@27
   404
	      delete_item(active_edge);
hegyi@27
   405
	    }
hegyi@27
   406
hegyi@27
   407
	  
hegyi@27
   408
	}
hegyi@27
   409
      //pointer was moved, deletion is cancelled
hegyi@27
   410
      else
hegyi@27
   411
	{
hegyi@27
   412
	  if(active_node!=INVALID)
hegyi@27
   413
	    {
hegyi@27
   414
	      *active_item << Gnome::Canvas::Properties::fill_color("blue");
hegyi@27
   415
	    }
hegyi@27
   416
	  else
hegyi@27
   417
	    {
hegyi@27
   418
	      *active_item << Gnome::Canvas::Properties::fill_color("green");
hegyi@27
   419
	    }
hegyi@27
   420
	}
hegyi@27
   421
      //reseting datas
hegyi@27
   422
      active_item=NULL;
hegyi@27
   423
      active_edge=INVALID;
hegyi@27
   424
      active_node=INVALID;
hegyi@27
   425
      break;
hegyi@27
   426
hegyi@27
   427
    case GDK_MOTION_NOTIFY:
hegyi@27
   428
      break;
hegyi@27
   429
hegyi@27
   430
    default:
hegyi@27
   431
      break;
hegyi@27
   432
    }
hegyi@27
   433
  return true;
hegyi@27
   434
}
hegyi@27
   435
hegyi@27
   436
void GraphDisplayerCanvas::delete_item(NodeIt node_to_delete)
hegyi@27
   437
{
hegyi@27
   438
  delete(nodesmap[node_to_delete]);
hegyi@27
   439
  g.erase(node_to_delete);
hegyi@27
   440
}
hegyi@27
   441
hegyi@27
   442
void GraphDisplayerCanvas::delete_item(EdgeIt edge_to_delete)
hegyi@27
   443
{
hegyi@27
   444
  delete(edgesmap[edge_to_delete]);
hegyi@27
   445
  g.erase(edge_to_delete);
hegyi@27
   446
}
hegyi@27
   447
hegyi@27
   448
void GraphDisplayerCanvas::delete_item(Graph::Edge edge_to_delete)
hegyi@27
   449
{
hegyi@27
   450
  delete(edgesmap[edge_to_delete]);
hegyi@27
   451
  g.erase(edge_to_delete);
hegyi@27
   452
}
hegyi@27
   453
hegyi@27
   454
void GraphDisplayerCanvas::text_reposition(xy<double> new_place)
hegyi@27
   455
{
hegyi@27
   456
  new_place+=(xy<double>(10,10));
hegyi@27
   457
  edgetextmap[active_edge]->property_x().set_value(new_place.x);
hegyi@27
   458
  edgetextmap[active_edge]->property_y().set_value(new_place.y);
hegyi@27
   459
}
hegyi@27
   460
hegyi@27
   461
void GraphDisplayerCanvas::toggle_edge_activity(BrokenEdge* active_bre, bool on)
hegyi@27
   462
{
hegyi@27
   463
  if(on)
hegyi@27
   464
    {
hegyi@27
   465
      if(active_edge!=INVALID)
hegyi@27
   466
	{
hegyi@27
   467
	  std::cout << "ERROR!!!! Valid edge found!" << std::endl;
hegyi@27
   468
	}
hegyi@27
   469
      else
hegyi@27
   470
	{
hegyi@27
   471
	  for (EdgeIt i(g); i!=INVALID; ++i)
hegyi@27
   472
	    {
hegyi@27
   473
	      if(edgesmap[i]==active_bre)
hegyi@27
   474
		{
hegyi@27
   475
		  active_edge=i;
hegyi@27
   476
		}
hegyi@27
   477
	    }
hegyi@27
   478
	}
hegyi@27
   479
    }
hegyi@27
   480
  else
hegyi@27
   481
    {
hegyi@27
   482
      if(active_edge!=INVALID)
hegyi@27
   483
	{
hegyi@27
   484
	  active_edge=INVALID;
hegyi@27
   485
	}
hegyi@27
   486
      else
hegyi@27
   487
	{
hegyi@27
   488
	  std::cout << "ERROR!!!! Invalid edge found!" << std::endl;
hegyi@27
   489
	}
hegyi@27
   490
    }
hegyi@27
   491
hegyi@27
   492
}