graph_displayer_canvas-event.cc
author hegyi
Tue, 12 Jul 2005 21:45:39 +0000
branchgui
changeset 33 8dc87bc15ec5
parent 32 1f45545f124c
child 34 2cb1fc37f742
permissions -rwxr-xr-x
Developing of edgemap editing is started.
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@30
    23
	createEdgeEventHandler(generated);      
hegyi@27
    24
    }
hegyi@27
    25
hegyi@27
    26
  actual_tool=newtool;
hegyi@27
    27
hegyi@33
    28
  active_item=NULL; 
hegyi@33
    29
  target_item=NULL; 
hegyi@33
    30
  active_edge=INVALID;	
hegyi@33
    31
  active_node=INVALID;	
hegyi@33
    32
hegyi@27
    33
  switch(newtool)
hegyi@27
    34
    {
hegyi@27
    35
    case MOVE:
hegyi@31
    36
      actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::moveEventHandler), false);
hegyi@27
    37
      break;
hegyi@27
    38
hegyi@27
    39
    case CREATE_NODE:
hegyi@30
    40
      actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::createNodeEventHandler), false);
hegyi@27
    41
      break;
hegyi@27
    42
hegyi@27
    43
    case CREATE_EDGE:
hegyi@31
    44
      actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::createEdgeEventHandler), false);
hegyi@27
    45
      break;
hegyi@27
    46
hegyi@27
    47
    case ERASER:
hegyi@31
    48
      actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::eraserEventHandler), false);
hegyi@27
    49
      break;
hegyi@27
    50
hegyi@32
    51
    case EDGE_MAP_EDIT:
hegyi@32
    52
      actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::edgeMapEditEventHandler), false);
hegyi@32
    53
      break;
hegyi@32
    54
hegyi@32
    55
    case NODE_MAP_EDIT:
hegyi@32
    56
      actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::nodeMapEditEventHandler), false);
hegyi@32
    57
      break;
hegyi@32
    58
hegyi@27
    59
    default:
hegyi@27
    60
      break;
hegyi@27
    61
    }
hegyi@27
    62
}
hegyi@27
    63
hegyi@30
    64
int GraphDisplayerCanvas::getActualTool()
hegyi@27
    65
{
hegyi@27
    66
  return actual_tool;
hegyi@27
    67
}
hegyi@27
    68
hegyi@30
    69
bool GraphDisplayerCanvas::moveEventHandler(GdkEvent* e)
hegyi@27
    70
{
hegyi@27
    71
  switch(e->type)
hegyi@27
    72
  {
hegyi@27
    73
    case GDK_BUTTON_PRESS:
hegyi@27
    74
      //we mark the location of the event to be able to calculate parameters of dragging
hegyi@31
    75
      window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
hegyi@31
    76
hegyi@31
    77
      active_item=(get_item_at(clicked_x, clicked_y));
hegyi@27
    78
      active_node=INVALID;
hegyi@27
    79
      for (NodeIt i(g); i!=INVALID; ++i)
hegyi@27
    80
	{
hegyi@27
    81
	  if(nodesmap[i]==active_item)
hegyi@27
    82
	    {
hegyi@27
    83
	      active_node=i;
hegyi@27
    84
	    }
hegyi@27
    85
	}
hegyi@27
    86
      switch(e->button.button)
hegyi@27
    87
	{
hegyi@27
    88
	case 3:      
hegyi@27
    89
	  isbutton=3;
hegyi@27
    90
	  break;
hegyi@27
    91
	default:
hegyi@27
    92
	  isbutton=1;
hegyi@27
    93
	  break;
hegyi@27
    94
	}
hegyi@27
    95
      break;
hegyi@27
    96
    case GDK_BUTTON_RELEASE:
hegyi@27
    97
      isbutton=0;
hegyi@27
    98
      active_item=NULL;
hegyi@27
    99
      active_node=INVALID;
hegyi@27
   100
      break;
hegyi@27
   101
    case GDK_MOTION_NOTIFY:
hegyi@27
   102
      //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
   103
      if(active_node!=INVALID)
hegyi@27
   104
      {
hegyi@27
   105
	//new coordinates will be the old values,
hegyi@27
   106
	//because the item will be moved to the
hegyi@27
   107
	//new coordinate therefore the new movement
hegyi@27
   108
	//has to be calculated from here
hegyi@27
   109
hegyi@31
   110
	double new_x, new_y;
hegyi@31
   111
hegyi@31
   112
	window_to_world (e->motion.x, e->motion.y, new_x, new_y);
hegyi@31
   113
hegyi@31
   114
        double dx=new_x-clicked_x;
hegyi@31
   115
        double dy=new_y-clicked_y;
hegyi@27
   116
hegyi@28
   117
	//repositioning node and its text
hegyi@27
   118
        active_item->move(dx, dy);
hegyi@28
   119
	nodetextmap[active_node]->move(dx, dy);
hegyi@27
   120
hegyi@31
   121
        clicked_x=new_x;
hegyi@31
   122
        clicked_y=new_y;
hegyi@27
   123
hegyi@27
   124
	//all the edges connected to the moved point has to be redrawn
hegyi@27
   125
        EdgeIt ei;
hegyi@27
   126
hegyi@27
   127
        g.firstOut(ei,active_node);
hegyi@27
   128
hegyi@27
   129
        for(;ei!=INVALID;g.nextOut(ei))
hegyi@27
   130
        {
hegyi@27
   131
            Gnome::Canvas::Points coos;
hegyi@27
   132
            double x1, x2, y1, y2;
hegyi@27
   133
hegyi@27
   134
            nodesmap[g.source(ei)]->get_bounds(x1, y1, x2, y2);
hegyi@27
   135
            coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
hegyi@27
   136
hegyi@27
   137
            nodesmap[g.target(ei)]->get_bounds(x1, y1, x2, y2);
hegyi@27
   138
            coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
hegyi@27
   139
hegyi@27
   140
	    if(isbutton==3)
hegyi@27
   141
	      {
hegyi@30
   142
		edgesmap[ei]->setPoints(coos);
hegyi@27
   143
	      }
hegyi@27
   144
	    else
hegyi@27
   145
	      {
hegyi@30
   146
		edgesmap[ei]->setPoints(coos,true);
hegyi@27
   147
	      }
hegyi@27
   148
hegyi@28
   149
	    //reposition of edgetext
hegyi@30
   150
	    xy<double> text_pos=edgesmap[ei]->getArrowPos();
hegyi@27
   151
	    text_pos+=(xy<double>(10,10));
hegyi@27
   152
	    edgetextmap[ei]->property_x().set_value(text_pos.x);
hegyi@27
   153
	    edgetextmap[ei]->property_y().set_value(text_pos.y);
hegyi@27
   154
        }
hegyi@27
   155
hegyi@27
   156
        g.firstIn(ei,active_node);
hegyi@27
   157
        for(;ei!=INVALID;g.nextIn(ei))
hegyi@27
   158
        {
hegyi@27
   159
            Gnome::Canvas::Points coos;
hegyi@27
   160
            double x1, x2, y1, y2;
hegyi@27
   161
hegyi@27
   162
            nodesmap[g.source(ei)]->get_bounds(x1, y1, x2, y2);
hegyi@27
   163
            coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
hegyi@27
   164
hegyi@27
   165
            nodesmap[g.target(ei)]->get_bounds(x1, y1, x2, y2);
hegyi@27
   166
            coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
hegyi@27
   167
hegyi@27
   168
	    if(isbutton==3)
hegyi@27
   169
	      {
hegyi@30
   170
		edgesmap[ei]->setPoints(coos);
hegyi@27
   171
	      }
hegyi@27
   172
	    else
hegyi@27
   173
	      {
hegyi@30
   174
		edgesmap[ei]->setPoints(coos,true);
hegyi@27
   175
	      }
hegyi@27
   176
hegyi@30
   177
	    xy<double> text_pos=edgesmap[ei]->getArrowPos();
hegyi@27
   178
	    text_pos+=(xy<double>(10,10));
hegyi@27
   179
	    edgetextmap[ei]->property_x().set_value(text_pos.x);
hegyi@27
   180
	    edgetextmap[ei]->property_y().set_value(text_pos.y);
hegyi@27
   181
        }
hegyi@27
   182
      }
hegyi@27
   183
    default: break;
hegyi@27
   184
  }
hegyi@27
   185
hegyi@31
   186
  return false;
hegyi@27
   187
}
hegyi@27
   188
hegyi@30
   189
bool GraphDisplayerCanvas::createNodeEventHandler(GdkEvent* e)
hegyi@27
   190
{
hegyi@27
   191
  switch(e->type)
hegyi@27
   192
    {
hegyi@27
   193
hegyi@27
   194
      //draw the new node in red at the clicked place
hegyi@31
   195
    case GDK_2BUTTON_PRESS:
hegyi@31
   196
      std::cout << "double click" << std::endl;
hegyi@31
   197
      break;
hegyi@27
   198
    case GDK_BUTTON_PRESS:
hegyi@27
   199
      isbutton=1;
hegyi@27
   200
hegyi@27
   201
      active_node=NodeIt(g,g.addNode());
hegyi@27
   202
hegyi@27
   203
      //initiating values corresponding to new node in maps
hegyi@27
   204
hegyi@27
   205
      window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
hegyi@27
   206
hegyi@31
   207
      target_item=NULL;
hegyi@31
   208
      target_item=get_item_at(clicked_x, clicked_y);
hegyi@31
   209
hegyi@27
   210
      nodesmap[active_node]=new Gnome::Canvas::Ellipse(displayed_graph, clicked_x-20, clicked_y-20, clicked_x+20, clicked_y+20);
hegyi@27
   211
      active_item=(Gnome::Canvas::Item *)(nodesmap[active_node]);
hegyi@27
   212
      *(nodesmap[active_node]) << Gnome::Canvas::Properties::fill_color("red");
hegyi@27
   213
      *(nodesmap[active_node]) << Gnome::Canvas::Properties::outline_color("black");
hegyi@27
   214
      (nodesmap[active_node])->show();
hegyi@28
   215
hegyi@28
   216
      nodetextmap[active_node]=new Gnome::Canvas::Text(displayed_graph, clicked_x+node_property_defaults[N_RADIUS]+5, clicked_y+node_property_defaults[N_RADIUS]+5, "");
hegyi@28
   217
      nodetextmap[active_node]->property_fill_color().set_value("darkblue");
hegyi@28
   218
hegyi@30
   219
      mapwin->updateNode(active_node);
hegyi@28
   220
hegyi@27
   221
      break;
hegyi@27
   222
hegyi@27
   223
      //move the new node
hegyi@27
   224
    case GDK_MOTION_NOTIFY:
hegyi@27
   225
      {
hegyi@27
   226
	GdkEvent * generated=new GdkEvent();
hegyi@31
   227
	generated->motion.x=e->motion.x;
hegyi@31
   228
	generated->motion.y=e->motion.y;
hegyi@27
   229
	generated->type=GDK_MOTION_NOTIFY;
hegyi@30
   230
	moveEventHandler(generated);      
hegyi@27
   231
	break;
hegyi@27
   232
      }
hegyi@27
   233
hegyi@27
   234
      //finalize the new node
hegyi@27
   235
    case GDK_BUTTON_RELEASE:
hegyi@27
   236
      isbutton=0;
hegyi@31
   237
      if(!target_item)
hegyi@31
   238
	{
hegyi@31
   239
	  //Its appropriate color is given by update.
hegyi@31
   240
	  //*active_item << Gnome::Canvas::Properties::fill_color("blue");
hegyi@31
   241
	}
hegyi@31
   242
      else
hegyi@31
   243
	{
hegyi@31
   244
	  //In this case the given color has to be overwritten, because the noe covers an other item.
hegyi@31
   245
	  *active_item << Gnome::Canvas::Properties::fill_color("lightblue");
hegyi@31
   246
	}
hegyi@31
   247
      target_item=NULL;
hegyi@27
   248
      active_item=NULL;
hegyi@27
   249
      active_node=INVALID;
hegyi@27
   250
      break;
hegyi@27
   251
    default:
hegyi@27
   252
      break;
hegyi@27
   253
    }
hegyi@27
   254
  return false;
hegyi@27
   255
}
hegyi@27
   256
hegyi@30
   257
bool GraphDisplayerCanvas::createEdgeEventHandler(GdkEvent* e)
hegyi@27
   258
{
hegyi@27
   259
  switch(e->type)
hegyi@27
   260
    {
hegyi@27
   261
    case GDK_BUTTON_PRESS:
hegyi@27
   262
      //in edge creation right button has special meaning
hegyi@27
   263
      if(e->button.button!=3)
hegyi@27
   264
	{
hegyi@27
   265
	  //there is not yet selected node
hegyi@27
   266
	  if(active_node==INVALID)
hegyi@27
   267
	    {
hegyi@27
   268
	      //we mark the location of the event to be able to calculate parameters of dragging
hegyi@31
   269
hegyi@31
   270
	      window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
hegyi@31
   271
hegyi@31
   272
	      active_item=(get_item_at(clicked_x, clicked_y));
hegyi@27
   273
	      active_node=INVALID;
hegyi@27
   274
	      for (NodeIt i(g); i!=INVALID; ++i)
hegyi@27
   275
		{
hegyi@27
   276
		  if(nodesmap[i]==active_item)
hegyi@27
   277
		    {
hegyi@27
   278
		      active_node=i;
hegyi@27
   279
		    }
hegyi@27
   280
		}
hegyi@27
   281
	      //the clicked item is really a node
hegyi@27
   282
	      if(active_node!=INVALID)
hegyi@27
   283
		{
hegyi@27
   284
		  *(nodesmap[active_node]) << Gnome::Canvas::Properties::fill_color("red");
hegyi@27
   285
		  isbutton=1;
hegyi@27
   286
		}
hegyi@27
   287
	      //clicked item was not a node. It could be e.g. edge.
hegyi@27
   288
	      else
hegyi@27
   289
		{
hegyi@27
   290
		  active_item=NULL;
hegyi@27
   291
		}
hegyi@27
   292
	    }
hegyi@27
   293
	  //we only have to do sg. if the mouse button
hegyi@27
   294
	  // is pressed already once AND the click was
hegyi@27
   295
	  // on a node that was found in the set of 
hegyi@27
   296
	  //nodes, and now we only search for the second 
hegyi@27
   297
	  //node
hegyi@27
   298
	  else
hegyi@27
   299
	    {
hegyi@31
   300
	      window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
hegyi@31
   301
	      target_item=(get_item_at(clicked_x, clicked_y));
hegyi@27
   302
	      Graph::NodeIt target_node=INVALID;
hegyi@27
   303
	      for (NodeIt i(g); i!=INVALID; ++i)
hegyi@27
   304
		{
hegyi@27
   305
		  if(nodesmap[i]==target_item)
hegyi@27
   306
		    {
hegyi@27
   307
		      target_node=i;
hegyi@27
   308
		    }
hegyi@27
   309
		}
hegyi@27
   310
	      //the clicked item is a node, the edge can be drawn
hegyi@27
   311
	      if(target_node!=INVALID)
hegyi@27
   312
		{
hegyi@28
   313
		  if(target_node!=active_node)		
hegyi@28
   314
		    {
hegyi@28
   315
		      *(nodesmap[target_node]) << Gnome::Canvas::Properties::fill_color("red");
hegyi@27
   316
hegyi@28
   317
		      //creating new edge
hegyi@28
   318
		      active_edge=EdgeIt(g,g.addEdge(active_node, target_node));
hegyi@27
   319
hegyi@28
   320
		      //initiating values corresponding to new edge in maps
hegyi@30
   321
		      mapstorage.initMapsForEdge(active_edge);
hegyi@27
   322
	  
hegyi@28
   323
		      //calculating coordinates of new edge
hegyi@28
   324
		      Gnome::Canvas::Points coos;
hegyi@28
   325
		      double x1, x2, y1, y2;
hegyi@27
   326
	  
hegyi@28
   327
		      active_item->get_bounds(x1, y1, x2, y2);
hegyi@28
   328
		      coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
hegyi@27
   329
hegyi@28
   330
		      target_item->get_bounds(x1, y1, x2, y2);
hegyi@28
   331
		      coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
hegyi@27
   332
hegyi@28
   333
		      //drawing new edge
hegyi@28
   334
		      edgesmap[active_edge]=new BrokenEdge(displayed_graph, coos, *this);
hegyi@28
   335
		      *(edgesmap[active_edge]) << Gnome::Canvas::Properties::fill_color("green");
hegyi@28
   336
		      edgesmap[active_edge]->property_width_pixels().set_value(10);
hegyi@27
   337
hegyi@28
   338
		      //redraw nodes to blank terminations of the new edge
hegyi@28
   339
		      target_item->raise_to_top();
hegyi@28
   340
		      active_item->raise_to_top();
hegyi@27
   341
hegyi@28
   342
		      //initializing edge-text as well, to empty string
hegyi@30
   343
		      xy<double> text_pos=edgesmap[active_edge]->getArrowPos();
hegyi@28
   344
		      text_pos+=(xy<double>(10,10));
hegyi@27
   345
hegyi@28
   346
		      edgetextmap[active_edge]=new Gnome::Canvas::Text(displayed_graph, text_pos.x, text_pos.y, "");
hegyi@28
   347
		      edgetextmap[active_edge]->property_fill_color().set_value("darkgreen");
hegyi@28
   348
hegyi@28
   349
		      //updating its properties
hegyi@30
   350
		      mapwin->updateEdge(active_edge);
hegyi@28
   351
		    }
hegyi@28
   352
		  else
hegyi@28
   353
		    {
hegyi@28
   354
		      target_node=INVALID;
hegyi@28
   355
		      std::cout << "Loop edge is not yet implemented!" << std::endl;
hegyi@28
   356
		    }
hegyi@27
   357
		}
hegyi@27
   358
	      //clicked item was not a node. it could be an e.g. edge. we do not deal with it furthermore.
hegyi@27
   359
	      else
hegyi@27
   360
		{
hegyi@27
   361
		  target_item=NULL;
hegyi@27
   362
		}
hegyi@27
   363
	    }
hegyi@27
   364
	}
hegyi@27
   365
      break;
hegyi@27
   366
    case GDK_BUTTON_RELEASE:
hegyi@27
   367
      isbutton=0;
hegyi@27
   368
      //we clear settings in two cases
hegyi@27
   369
      //1: the edge is ready (target_item has valid value)
hegyi@27
   370
      //2: the edge creation is cancelled with right button
hegyi@27
   371
      if((target_item)||(e->button.button==3))
hegyi@27
   372
	{
hegyi@27
   373
	  if(active_item)
hegyi@27
   374
	    {
hegyi@27
   375
	      *active_item << Gnome::Canvas::Properties::fill_color("blue");
hegyi@27
   376
	      active_item=NULL;
hegyi@27
   377
	    }
hegyi@27
   378
	  if(target_item)
hegyi@27
   379
	    {
hegyi@27
   380
	      *target_item << Gnome::Canvas::Properties::fill_color("blue");
hegyi@27
   381
	      target_item=NULL;
hegyi@27
   382
	    }
hegyi@27
   383
	  active_node=INVALID;
hegyi@27
   384
	  active_edge=INVALID;
hegyi@27
   385
	}
hegyi@27
   386
      break;
hegyi@27
   387
    default:
hegyi@27
   388
      break;
hegyi@27
   389
    }
hegyi@27
   390
  return false;
hegyi@27
   391
}
hegyi@27
   392
hegyi@30
   393
bool GraphDisplayerCanvas::eraserEventHandler(GdkEvent* e)
hegyi@27
   394
{
hegyi@27
   395
  switch(e->type)
hegyi@27
   396
    {
hegyi@27
   397
    case GDK_BUTTON_PRESS:
hegyi@31
   398
      window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
hegyi@31
   399
      active_item=(get_item_at(clicked_x, clicked_y));
hegyi@27
   400
      active_node=INVALID;
hegyi@27
   401
      active_edge=INVALID;
hegyi@27
   402
      for (NodeIt i(g); i!=INVALID; ++i)
hegyi@27
   403
	{
hegyi@27
   404
	  if(nodesmap[i]==active_item)
hegyi@27
   405
	    {
hegyi@27
   406
	      active_node=i;
hegyi@27
   407
	    }
hegyi@27
   408
	}
hegyi@27
   409
      if(active_node==INVALID)
hegyi@27
   410
	{
hegyi@27
   411
	  for (EdgeIt i(g); i!=INVALID; ++i)
hegyi@27
   412
	    {
hegyi@27
   413
	      if(edgesmap[i]==active_item)
hegyi@27
   414
		{
hegyi@27
   415
		  active_edge=i;
hegyi@27
   416
		}
hegyi@27
   417
	    }
hegyi@27
   418
	}
hegyi@31
   419
      if(active_item)
hegyi@31
   420
	{
hegyi@31
   421
	  *active_item << Gnome::Canvas::Properties::fill_color("red");
hegyi@31
   422
	}
hegyi@27
   423
      break;
hegyi@27
   424
hegyi@27
   425
    case GDK_BUTTON_RELEASE:
hegyi@31
   426
      window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
hegyi@31
   427
      if(active_item)
hegyi@27
   428
	{
hegyi@31
   429
	  if( active_item == ( get_item_at (clicked_x, clicked_y) ) )
hegyi@27
   430
	    {
hegyi@31
   431
	      if(active_node!=INVALID)
hegyi@31
   432
		{
hegyi@27
   433
hegyi@31
   434
		  //collecting edges to delete
hegyi@31
   435
		  EdgeIt e;
hegyi@31
   436
		  std::set<Graph::Edge> edges_to_delete;
hegyi@27
   437
hegyi@31
   438
		  g.firstOut(e,active_node);
hegyi@31
   439
		  for(;e!=INVALID;g.nextOut(e))
hegyi@31
   440
		    {
hegyi@31
   441
		      edges_to_delete.insert(e);
hegyi@31
   442
		    }
hegyi@31
   443
hegyi@31
   444
		  g.firstIn(e,active_node);
hegyi@31
   445
		  for(;e!=INVALID;g.nextIn(e))
hegyi@31
   446
		    {
hegyi@31
   447
		      edges_to_delete.insert(e);
hegyi@31
   448
		    }
hegyi@31
   449
hegyi@31
   450
		  //deleting collected edges
hegyi@31
   451
		  for(std::set<Graph::Edge>::iterator edge_set_it=edges_to_delete.begin();edge_set_it!=edges_to_delete.end();edge_set_it++)
hegyi@31
   452
		    {
hegyi@31
   453
		      deleteItem(*edge_set_it);
hegyi@31
   454
		    }
hegyi@31
   455
		  deleteItem(active_node);
hegyi@31
   456
		}
hegyi@31
   457
	      //a simple edge was chosen
hegyi@31
   458
	      else
hegyi@27
   459
		{
hegyi@31
   460
		  deleteItem(active_edge);
hegyi@27
   461
		}
hegyi@27
   462
	    }
hegyi@31
   463
	  //pointer was moved, deletion is cancelled
hegyi@27
   464
	  else
hegyi@27
   465
	    {
hegyi@31
   466
	      if(active_node!=INVALID)
hegyi@31
   467
		{
hegyi@31
   468
		  *active_item << Gnome::Canvas::Properties::fill_color("blue");
hegyi@31
   469
		}
hegyi@31
   470
	      else
hegyi@31
   471
		{
hegyi@31
   472
		  *active_item << Gnome::Canvas::Properties::fill_color("green");
hegyi@31
   473
		}
hegyi@27
   474
	    }
hegyi@27
   475
	}
hegyi@27
   476
      //reseting datas
hegyi@27
   477
      active_item=NULL;
hegyi@27
   478
      active_edge=INVALID;
hegyi@27
   479
      active_node=INVALID;
hegyi@27
   480
      break;
hegyi@27
   481
hegyi@27
   482
    case GDK_MOTION_NOTIFY:
hegyi@27
   483
      break;
hegyi@27
   484
hegyi@27
   485
    default:
hegyi@27
   486
      break;
hegyi@27
   487
    }
hegyi@31
   488
  return false;
hegyi@27
   489
}
hegyi@27
   490
hegyi@32
   491
bool GraphDisplayerCanvas::edgeMapEditEventHandler(GdkEvent* e)
hegyi@32
   492
{
hegyi@32
   493
  switch(e->type)
hegyi@32
   494
    {
hegyi@32
   495
    case GDK_BUTTON_PRESS:
hegyi@32
   496
      window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
hegyi@32
   497
      active_item=(get_item_at(clicked_x, clicked_y));
hegyi@32
   498
      active_edge=INVALID;
hegyi@32
   499
      for (EdgeIt i(g); i!=INVALID; ++i)
hegyi@32
   500
	{
hegyi@32
   501
	  if(edgesmap[i]==active_item)
hegyi@32
   502
	    {
hegyi@32
   503
	      active_edge=i;
hegyi@32
   504
	    }
hegyi@32
   505
	}
hegyi@33
   506
      if((active_edge!=INVALID)&&(edgetextmap[active_edge]->property_text().get_value()!=""))
hegyi@32
   507
	{
hegyi@32
   508
	  if(canvasentrywidget)
hegyi@32
   509
	    {
hegyi@32
   510
	      delete(canvasentrywidget);
hegyi@32
   511
	    }
hegyi@32
   512
	  entrywidget.show();
hegyi@33
   513
	  entrywidget.set_text(edgetextmap[active_edge]->property_text().get_value());
hegyi@33
   514
	  xy<double> entry_coos;
hegyi@33
   515
	  entry_coos.x=(edgetextmap[active_edge])->property_x().get_value();
hegyi@33
   516
	  entry_coos.x-=edgetextmap[active_edge]->property_text_width().get_value()/2;
hegyi@33
   517
	  entry_coos.y=(edgetextmap[active_edge])->property_y().get_value();
hegyi@33
   518
	  entry_coos.y-=edgetextmap[active_edge]->property_text_height().get_value()*1.5/2;
hegyi@33
   519
	  canvasentrywidget=new Gnome::Canvas::Widget(displayed_graph, entry_coos.x, entry_coos.y, entrywidget);
hegyi@33
   520
	  canvasentrywidget->property_width().set_value(edgetextmap[active_edge]->property_text_width().get_value()*1.5);
hegyi@33
   521
	  canvasentrywidget->property_height().set_value(edgetextmap[active_edge]->property_text_height().get_value()*1.5);
hegyi@32
   522
	}
hegyi@32
   523
      break;
hegyi@32
   524
    default:
hegyi@32
   525
      break;
hegyi@32
   526
    }
hegyi@32
   527
  return false;  
hegyi@32
   528
}
hegyi@32
   529
hegyi@32
   530
bool GraphDisplayerCanvas::nodeMapEditEventHandler(GdkEvent* e)
hegyi@32
   531
{
hegyi@32
   532
  e=e;
hegyi@32
   533
  return false;
hegyi@32
   534
}
hegyi@32
   535
hegyi@30
   536
void GraphDisplayerCanvas::deleteItem(NodeIt node_to_delete)
hegyi@27
   537
{
hegyi@28
   538
  delete(nodetextmap[node_to_delete]);
hegyi@27
   539
  delete(nodesmap[node_to_delete]);
hegyi@27
   540
  g.erase(node_to_delete);
hegyi@27
   541
}
hegyi@27
   542
hegyi@30
   543
void GraphDisplayerCanvas::deleteItem(EdgeIt edge_to_delete)
hegyi@27
   544
{
hegyi@28
   545
  delete(edgetextmap[edge_to_delete]);
hegyi@27
   546
  delete(edgesmap[edge_to_delete]);
hegyi@27
   547
  g.erase(edge_to_delete);
hegyi@27
   548
}
hegyi@27
   549
hegyi@30
   550
void GraphDisplayerCanvas::deleteItem(Graph::Edge edge_to_delete)
hegyi@27
   551
{
hegyi@28
   552
  delete(edgetextmap[edge_to_delete]);
hegyi@27
   553
  delete(edgesmap[edge_to_delete]);
hegyi@27
   554
  g.erase(edge_to_delete);
hegyi@27
   555
}
hegyi@27
   556
hegyi@30
   557
void GraphDisplayerCanvas::textReposition(xy<double> new_place)
hegyi@27
   558
{
hegyi@27
   559
  new_place+=(xy<double>(10,10));
hegyi@27
   560
  edgetextmap[active_edge]->property_x().set_value(new_place.x);
hegyi@27
   561
  edgetextmap[active_edge]->property_y().set_value(new_place.y);
hegyi@27
   562
}
hegyi@27
   563
hegyi@30
   564
void GraphDisplayerCanvas::toggleEdgeActivity(BrokenEdge* active_bre, bool on)
hegyi@27
   565
{
hegyi@27
   566
  if(on)
hegyi@27
   567
    {
hegyi@27
   568
      if(active_edge!=INVALID)
hegyi@27
   569
	{
hegyi@27
   570
	  std::cout << "ERROR!!!! Valid edge found!" << std::endl;
hegyi@27
   571
	}
hegyi@27
   572
      else
hegyi@27
   573
	{
hegyi@27
   574
	  for (EdgeIt i(g); i!=INVALID; ++i)
hegyi@27
   575
	    {
hegyi@27
   576
	      if(edgesmap[i]==active_bre)
hegyi@27
   577
		{
hegyi@27
   578
		  active_edge=i;
hegyi@27
   579
		}
hegyi@27
   580
	    }
hegyi@27
   581
	}
hegyi@27
   582
    }
hegyi@27
   583
  else
hegyi@27
   584
    {
hegyi@27
   585
      if(active_edge!=INVALID)
hegyi@27
   586
	{
hegyi@27
   587
	  active_edge=INVALID;
hegyi@27
   588
	}
hegyi@27
   589
      else
hegyi@27
   590
	{
hegyi@27
   591
	  std::cout << "ERROR!!!! Invalid edge found!" << std::endl;
hegyi@27
   592
	}
hegyi@27
   593
    }
hegyi@27
   594
hegyi@27
   595
}
hegyi@32
   596