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