gui/graph_displayer_canvas-event.cc
author deba
Wed, 01 Mar 2006 10:25:30 +0000
changeset 1991 d7442141d9ef
parent 1883 05b0e8d057a6
child 2063 9535436aaa9f
permissions -rwxr-xr-x
The graph adadptors can be alteration observed.
In most cases it uses the adapted graph alteration notifiers.
Only special case is now the UndirGraphAdaptor, where
we have to proxy the signals from the graph.

The SubBidirGraphAdaptor is removed, because it doest not
gives more feature than the EdgeSubGraphAdaptor<UndirGraphAdaptor<Graph>>.

The ResGraphAdaptor is based on this composition.
ladanyi@1606
     1
#include "graph_displayer_canvas.h"
alpar@1632
     2
#include <cmath>
hegyi@1510
     3
hegyi@1510
     4
hegyi@1510
     5
bool GraphDisplayerCanvas::on_expose_event(GdkEventExpose *event)
hegyi@1510
     6
{
hegyi@1510
     7
  Gnome::Canvas::CanvasAA::on_expose_event(event);
hegyi@1510
     8
  //usleep(10000);
hegyi@1510
     9
  //rezoom();
hegyi@1510
    10
  return true;
hegyi@1510
    11
}
hegyi@1510
    12
hegyi@1510
    13
void GraphDisplayerCanvas::changeEditorialTool(int newtool)
hegyi@1510
    14
{
hegyi@1562
    15
  if(actual_tool!=newtool)
hegyi@1562
    16
    {
hegyi@1510
    17
hegyi@1562
    18
      actual_handler.disconnect();
hegyi@1510
    19
hegyi@1562
    20
      switch(actual_tool)
hegyi@1562
    21
	{
hegyi@1562
    22
	case CREATE_EDGE:
hegyi@1562
    23
	  {
hegyi@1562
    24
	    GdkEvent * generated=new GdkEvent();
hegyi@1562
    25
	    generated->type=GDK_BUTTON_RELEASE;
hegyi@1562
    26
	    generated->button.button=3;
hegyi@1562
    27
	    createEdgeEventHandler(generated);      
hegyi@1562
    28
	    break;
hegyi@1562
    29
	  }
hegyi@1562
    30
	case EDGE_MAP_EDIT:
hegyi@1579
    31
	  //has to do the same thing as in the case of NODE_MAP_EDIT
hegyi@1579
    32
	case NODE_MAP_EDIT:
hegyi@1579
    33
	  {
hegyi@1579
    34
	    break;
hegyi@1579
    35
	  }
hegyi@1562
    36
	default:
hegyi@1562
    37
	  break;
hegyi@1562
    38
	}
hegyi@1510
    39
hegyi@1562
    40
      active_item=NULL; 
hegyi@1562
    41
      target_item=NULL; 
hegyi@1562
    42
      active_edge=INVALID;	
hegyi@1562
    43
      active_node=INVALID;	
hegyi@1551
    44
hegyi@1510
    45
hegyi@1562
    46
      actual_tool=newtool;
hegyi@1562
    47
  
hegyi@1562
    48
      switch(newtool)
hegyi@1562
    49
	{
hegyi@1562
    50
	case MOVE:
hegyi@1562
    51
	  actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::moveEventHandler), false);
hegyi@1562
    52
	  break;
hegyi@1510
    53
hegyi@1562
    54
	case CREATE_NODE:
hegyi@1562
    55
	  actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::createNodeEventHandler), false);
hegyi@1562
    56
	  break;
hegyi@1510
    57
hegyi@1562
    58
	case CREATE_EDGE:
hegyi@1562
    59
	  actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::createEdgeEventHandler), false);
hegyi@1562
    60
	  break;
hegyi@1510
    61
hegyi@1562
    62
	case ERASER:
hegyi@1562
    63
	  actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::eraserEventHandler), false);
hegyi@1562
    64
	  break;
hegyi@1550
    65
hegyi@1562
    66
	case EDGE_MAP_EDIT:
hegyi@1562
    67
	  grab_focus();
hegyi@1562
    68
	  actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::edgeMapEditEventHandler), false);
hegyi@1562
    69
	  break;
hegyi@1550
    70
hegyi@1562
    71
	case NODE_MAP_EDIT:
hegyi@1562
    72
	  actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::nodeMapEditEventHandler), false);
hegyi@1562
    73
	  break;
hegyi@1562
    74
hegyi@1562
    75
	default:
hegyi@1562
    76
	  break;
hegyi@1562
    77
	}
hegyi@1510
    78
    }
hegyi@1510
    79
}
hegyi@1510
    80
hegyi@1524
    81
int GraphDisplayerCanvas::getActualTool()
hegyi@1510
    82
{
hegyi@1510
    83
  return actual_tool;
hegyi@1510
    84
}
hegyi@1510
    85
hegyi@1524
    86
bool GraphDisplayerCanvas::moveEventHandler(GdkEvent* e)
hegyi@1510
    87
{
ladanyi@1652
    88
  static Gnome::Canvas::Text *coord_text = 0;
hegyi@1510
    89
  switch(e->type)
hegyi@1510
    90
  {
hegyi@1510
    91
    case GDK_BUTTON_PRESS:
hegyi@1510
    92
      //we mark the location of the event to be able to calculate parameters of dragging
hegyi@1525
    93
      window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
hegyi@1525
    94
hegyi@1525
    95
      active_item=(get_item_at(clicked_x, clicked_y));
hegyi@1510
    96
      active_node=INVALID;
hegyi@1849
    97
      for (NodeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
hegyi@1510
    98
	{
hegyi@1510
    99
	  if(nodesmap[i]==active_item)
hegyi@1510
   100
	    {
hegyi@1510
   101
	      active_node=i;
hegyi@1510
   102
	    }
hegyi@1510
   103
	}
hegyi@1510
   104
      switch(e->button.button)
hegyi@1510
   105
	{
hegyi@1510
   106
	case 3:      
hegyi@1510
   107
	  isbutton=3;
hegyi@1510
   108
	  break;
hegyi@1510
   109
	default:
hegyi@1510
   110
	  isbutton=1;
hegyi@1510
   111
	  break;
hegyi@1510
   112
	}
hegyi@1510
   113
      break;
hegyi@1510
   114
    case GDK_BUTTON_RELEASE:
ladanyi@1652
   115
      if (coord_text)
ladanyi@1652
   116
      {
ladanyi@1652
   117
        delete coord_text;
ladanyi@1652
   118
        coord_text = 0;
ladanyi@1652
   119
      }
hegyi@1510
   120
      isbutton=0;
hegyi@1510
   121
      active_item=NULL;
hegyi@1510
   122
      active_node=INVALID;
hegyi@1510
   123
      break;
hegyi@1510
   124
    case GDK_MOTION_NOTIFY:
hegyi@1510
   125
      //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
   126
      if(active_node!=INVALID)
hegyi@1510
   127
      {
hegyi@1849
   128
        (mytab.mapstorage).modified = true;
ladanyi@1652
   129
hegyi@1510
   130
	//new coordinates will be the old values,
hegyi@1510
   131
	//because the item will be moved to the
hegyi@1510
   132
	//new coordinate therefore the new movement
hegyi@1510
   133
	//has to be calculated from here
hegyi@1510
   134
hegyi@1525
   135
	double new_x, new_y;
hegyi@1525
   136
hegyi@1525
   137
	window_to_world (e->motion.x, e->motion.y, new_x, new_y);
hegyi@1525
   138
hegyi@1525
   139
        double dx=new_x-clicked_x;
hegyi@1525
   140
        double dy=new_y-clicked_y;
hegyi@1510
   141
hegyi@1512
   142
	//repositioning node and its text
hegyi@1510
   143
        active_item->move(dx, dy);
hegyi@1512
   144
	nodetextmap[active_node]->move(dx, dy);
hegyi@1510
   145
ladanyi@1652
   146
        // the new coordinates of the centre of the node 
hegyi@1849
   147
        double coord_x = new_x - (clicked_x - (mytab.mapstorage).coords[active_node].x);
hegyi@1849
   148
        double coord_y = new_y - (clicked_y - (mytab.mapstorage).coords[active_node].y);
ladanyi@1652
   149
ladanyi@1860
   150
        // write back the new coordinates to the coords map
ladanyi@1860
   151
        (mytab.mapstorage).coords.set(active_node, xy<double>(coord_x, coord_y));
ladanyi@1860
   152
hegyi@1525
   153
        clicked_x=new_x;
hegyi@1525
   154
        clicked_y=new_y;
hegyi@1510
   155
ladanyi@1652
   156
        // reposition the coordinates text
ladanyi@1652
   157
        std::ostringstream ostr;
ladanyi@1652
   158
        ostr << "(" <<
hegyi@1849
   159
          (mytab.mapstorage).coords[active_node].x << ", " <<
hegyi@1849
   160
          (mytab.mapstorage).coords[active_node].y << ")";
ladanyi@1654
   161
        double radius =
ladanyi@1654
   162
          (nodesmap[active_node]->property_x2().get_value() -
ladanyi@1654
   163
          nodesmap[active_node]->property_x1().get_value()) / 2.0;
ladanyi@1652
   164
        if (coord_text)
ladanyi@1652
   165
        {
ladanyi@1652
   166
          coord_text->property_text().set_value(ostr.str());
hegyi@1849
   167
          coord_text->property_x().set_value((mytab.mapstorage).coords[active_node].x +
ladanyi@1654
   168
              radius);
hegyi@1849
   169
          coord_text->property_y().set_value((mytab.mapstorage).coords[active_node].y -
ladanyi@1654
   170
              radius);
ladanyi@1652
   171
        }
ladanyi@1652
   172
        else
ladanyi@1652
   173
        {
ladanyi@1652
   174
          coord_text = new Gnome::Canvas::Text(
ladanyi@1652
   175
              displayed_graph,
hegyi@1849
   176
              (mytab.mapstorage).coords[active_node].x + radius,
hegyi@1849
   177
              (mytab.mapstorage).coords[active_node].y - radius,
ladanyi@1652
   178
              ostr.str());
ladanyi@1652
   179
          coord_text->property_fill_color().set_value("black");
ladanyi@1654
   180
          coord_text->property_anchor().set_value(Gtk::ANCHOR_SOUTH_WEST);
ladanyi@1652
   181
        }
ladanyi@1652
   182
ladanyi@1652
   183
	//all the edges connected to the moved point has to be redrawn
hegyi@1849
   184
        for(OutEdgeIt ei((mytab.mapstorage).graph,active_node);ei!=INVALID;++ei)
hegyi@1510
   185
        {
ladanyi@1860
   186
            XY moved_node_1(coord_x - dx, coord_y - dy);
ladanyi@1860
   187
            XY moved_node_2(coord_x, coord_y);
ladanyi@1860
   188
            Node target = mytab.mapstorage.graph.target(ei);
ladanyi@1860
   189
            XY fix_node(mytab.mapstorage.coords[target].x,
ladanyi@1860
   190
                        mytab.mapstorage.coords[target].y);
ladanyi@1860
   191
            XY old_arrow_pos(mytab.mapstorage.arrow_pos[ei]);
hegyi@1510
   192
ladanyi@1860
   193
            XY arrow_pos;
ladanyi@1860
   194
	    if(isbutton==3)
ladanyi@1860
   195
              arrow_pos = calcArrowPos(moved_node_1, moved_node_2, fix_node, old_arrow_pos, false);
ladanyi@1860
   196
	    else
ladanyi@1860
   197
              arrow_pos = calcArrowPos(moved_node_1, moved_node_2, fix_node, old_arrow_pos, true);
hegyi@1510
   198
ladanyi@1860
   199
            mytab.mapstorage.arrow_pos.set(ei, arrow_pos);
ladanyi@1860
   200
            edgesmap[ei]->draw();
hegyi@1510
   201
hegyi@1512
   202
	    //reposition of edgetext
ladanyi@1860
   203
	    XY text_pos=mytab.mapstorage.arrow_pos[ei];
ladanyi@1860
   204
	    text_pos+=(XY(10,10));
hegyi@1510
   205
	    edgetextmap[ei]->property_x().set_value(text_pos.x);
hegyi@1510
   206
	    edgetextmap[ei]->property_y().set_value(text_pos.y);
hegyi@1510
   207
        }
hegyi@1510
   208
hegyi@1849
   209
        for(InEdgeIt ei((mytab.mapstorage).graph,active_node);ei!=INVALID;++ei)
hegyi@1510
   210
        {
ladanyi@1860
   211
            XY moved_node_1(coord_x - dx, coord_y - dy);
ladanyi@1860
   212
            XY moved_node_2(coord_x, coord_y);
ladanyi@1860
   213
            Node source = mytab.mapstorage.graph.source(ei);
ladanyi@1860
   214
            XY fix_node(mytab.mapstorage.coords[source].x,
ladanyi@1860
   215
                        mytab.mapstorage.coords[source].y);
ladanyi@1860
   216
            XY old_arrow_pos(mytab.mapstorage.arrow_pos[ei]);
hegyi@1510
   217
ladanyi@1860
   218
            XY arrow_pos;
ladanyi@1860
   219
	    if(isbutton==3)
ladanyi@1860
   220
              arrow_pos = calcArrowPos(moved_node_1, moved_node_2, fix_node, old_arrow_pos, false);
ladanyi@1860
   221
	    else
ladanyi@1860
   222
              arrow_pos = calcArrowPos(moved_node_1, moved_node_2, fix_node, old_arrow_pos, true);
hegyi@1510
   223
ladanyi@1860
   224
            mytab.mapstorage.arrow_pos.set(ei, arrow_pos);
ladanyi@1860
   225
            edgesmap[ei]->draw();
hegyi@1510
   226
ladanyi@1860
   227
	    //reposition of edgetext
ladanyi@1860
   228
	    XY text_pos=mytab.mapstorage.arrow_pos[ei];
ladanyi@1860
   229
	    text_pos+=(XY(10,10));
hegyi@1510
   230
	    edgetextmap[ei]->property_x().set_value(text_pos.x);
hegyi@1510
   231
	    edgetextmap[ei]->property_y().set_value(text_pos.y);
hegyi@1510
   232
        }
hegyi@1510
   233
      }
hegyi@1510
   234
    default: break;
hegyi@1510
   235
  }
hegyi@1510
   236
hegyi@1525
   237
  return false;
hegyi@1510
   238
}
hegyi@1510
   239
ladanyi@1860
   240
XY GraphDisplayerCanvas::calcArrowPos(XY moved_node_1, XY moved_node_2, XY fix_node, XY old_arrow_pos, bool move)
ladanyi@1860
   241
{
ladanyi@1860
   242
  if(!move)
ladanyi@1860
   243
  {
ladanyi@1860
   244
    return XY((moved_node_2.x + fix_node.x) / 2.0, (moved_node_2.y + fix_node.y) / 2.0);
ladanyi@1860
   245
  }
ladanyi@1860
   246
  else
ladanyi@1860
   247
  {
ladanyi@1860
   248
    //////////////////////////////////////////////////////////////////////////////////////////////////////
ladanyi@1860
   249
    /////////// keeps shape-with scalar multiplication - version 2.
ladanyi@1860
   250
    //////////////////////////////////////////////////////////////////////////////////////////////////////
ladanyi@1860
   251
ladanyi@1860
   252
    //old vector from one to the other node - a
ladanyi@1860
   253
    xy<double> a_v(moved_node_1.x-fix_node.x,moved_node_1.y-fix_node.y);
ladanyi@1860
   254
    //new vector from one to the other node - b
ladanyi@1860
   255
    xy<double> b_v(moved_node_2.x-fix_node.x,moved_node_2.y-fix_node.y);
ladanyi@1860
   256
ladanyi@1860
   257
    double absa=sqrt(a_v.normSquare());
ladanyi@1860
   258
    double absb=sqrt(b_v.normSquare());
ladanyi@1860
   259
ladanyi@1860
   260
    if ((absa == 0.0) || (absb == 0.0))
ladanyi@1860
   261
    {
ladanyi@1860
   262
      return old_arrow_pos;
ladanyi@1860
   263
    }
ladanyi@1860
   264
    else
ladanyi@1860
   265
    {
ladanyi@1860
   266
      //old vector from one node to the breakpoint - c
ladanyi@1860
   267
      xy<double> c_v(old_arrow_pos.x-fix_node.x,old_arrow_pos.y-fix_node.y);
ladanyi@1860
   268
ladanyi@1860
   269
      //unit vector with the same direction to a_v
ladanyi@1860
   270
      xy<double> a_v_u(a_v.x/absa,a_v.y/absa);
ladanyi@1860
   271
ladanyi@1860
   272
      //normal vector of unit vector with the same direction to a_v
ladanyi@1860
   273
      xy<double> a_v_u_n(((-1)*a_v_u.y),a_v_u.x);
ladanyi@1860
   274
ladanyi@1860
   275
      //unit vector with the same direction to b_v
ladanyi@1860
   276
      xy<double> b_v_u(b_v.x/absb,b_v.y/absb);
ladanyi@1860
   277
ladanyi@1860
   278
      //normal vector of unit vector with the same direction to b_v
ladanyi@1860
   279
      xy<double> b_v_u_n(((-1)*b_v_u.y),b_v_u.x);
ladanyi@1860
   280
ladanyi@1860
   281
      //vector c in a_v_u and a_v_u_n co-ordinate system
ladanyi@1860
   282
      xy<double> c_a(c_v*a_v_u,c_v*a_v_u_n);
ladanyi@1860
   283
ladanyi@1860
   284
      //new vector from one node to the breakpoint - d - we have to calculate this one
ladanyi@1860
   285
      xy<double> d_v=absb/absa*(c_a.x*b_v_u+c_a.y*b_v_u_n);
ladanyi@1860
   286
ladanyi@1860
   287
      return XY(d_v.x+fix_node.x,d_v.y+fix_node.y);
ladanyi@1860
   288
    }
ladanyi@1860
   289
  }
ladanyi@1860
   290
}
ladanyi@1860
   291
hegyi@1524
   292
bool GraphDisplayerCanvas::createNodeEventHandler(GdkEvent* e)
hegyi@1510
   293
{
hegyi@1510
   294
  switch(e->type)
ladanyi@1645
   295
  {
ladanyi@1645
   296
    //move the new node
ladanyi@1645
   297
    case GDK_MOTION_NOTIFY:
ladanyi@1645
   298
      {
ladanyi@1645
   299
        GdkEvent * generated=new GdkEvent();
ladanyi@1645
   300
        generated->motion.x=e->motion.x;
ladanyi@1645
   301
        generated->motion.y=e->motion.y;
ladanyi@1645
   302
        generated->type=GDK_MOTION_NOTIFY;
ladanyi@1645
   303
        moveEventHandler(generated);      
ladanyi@1645
   304
        break;
ladanyi@1645
   305
      }
hegyi@1510
   306
ladanyi@1645
   307
    case GDK_BUTTON_RELEASE:
hegyi@1849
   308
      (mytab.mapstorage).modified = true;
ladanyi@1606
   309
hegyi@1510
   310
      isbutton=1;
hegyi@1510
   311
hegyi@1849
   312
      active_node=(mytab.mapstorage).graph.addNode();
hegyi@1510
   313
hegyi@1510
   314
      //initiating values corresponding to new node in maps
hegyi@1510
   315
hegyi@1510
   316
      window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
hegyi@1510
   317
ladanyi@1645
   318
      // update coordinates
hegyi@1849
   319
      (mytab.mapstorage).coords.set(active_node, xy<double>(clicked_x, clicked_y));
ladanyi@1645
   320
ladanyi@1645
   321
      // update all other maps
ladanyi@1645
   322
      for (std::map<std::string, Graph::NodeMap<double>*>::const_iterator it =
hegyi@1849
   323
          (mytab.mapstorage).nodemap_storage.begin(); it !=
hegyi@1849
   324
          (mytab.mapstorage).nodemap_storage.end(); ++it)
ladanyi@1645
   325
      {
ladanyi@1646
   326
        if ((it->first != "coordinates_x") &&
ladanyi@1646
   327
            (it->first != "coordinates_y"))
ladanyi@1645
   328
        {
ladanyi@1645
   329
          (*(it->second))[active_node] =
hegyi@1849
   330
            (mytab.mapstorage).nodemap_default[it->first];
ladanyi@1645
   331
        }
ladanyi@1645
   332
      }
ladanyi@1646
   333
      // increment the id map's default value
hegyi@1849
   334
      (mytab.mapstorage).nodemap_default["id"] += 1.0;
ladanyi@1645
   335
ladanyi@1606
   336
      nodesmap[active_node]=new Gnome::Canvas::Ellipse(displayed_graph,
ladanyi@1645
   337
          clicked_x-20, clicked_y-20, clicked_x+20, clicked_y+20);
hegyi@1510
   338
      active_item=(Gnome::Canvas::Item *)(nodesmap[active_node]);
ladanyi@1645
   339
      *(nodesmap[active_node]) <<
ladanyi@1645
   340
        Gnome::Canvas::Properties::fill_color("blue");
ladanyi@1645
   341
      *(nodesmap[active_node]) <<
ladanyi@1645
   342
        Gnome::Canvas::Properties::outline_color("black");
ladanyi@1645
   343
      active_item->raise_to_top();
ladanyi@1645
   344
hegyi@1510
   345
      (nodesmap[active_node])->show();
hegyi@1512
   346
ladanyi@1606
   347
      nodetextmap[active_node]=new Gnome::Canvas::Text(displayed_graph,
ladanyi@1645
   348
          clicked_x+node_property_defaults[N_RADIUS]+5,
ladanyi@1645
   349
          clicked_y+node_property_defaults[N_RADIUS]+5, "");
hegyi@1512
   350
      nodetextmap[active_node]->property_fill_color().set_value("darkblue");
ladanyi@1645
   351
      nodetextmap[active_node]->raise_to_top();
hegyi@1512
   352
hegyi@1837
   353
//       mapwin.updateNode(active_node);
hegyi@1837
   354
      propertyUpdate(active_node);
hegyi@1512
   355
hegyi@1510
   356
      isbutton=0;
hegyi@1525
   357
      target_item=NULL;
hegyi@1510
   358
      active_item=NULL;
hegyi@1510
   359
      active_node=INVALID;
hegyi@1510
   360
      break;
hegyi@1510
   361
    default:
hegyi@1510
   362
      break;
ladanyi@1645
   363
  }
hegyi@1510
   364
  return false;
hegyi@1510
   365
}
hegyi@1510
   366
hegyi@1524
   367
bool GraphDisplayerCanvas::createEdgeEventHandler(GdkEvent* e)
hegyi@1510
   368
{
hegyi@1510
   369
  switch(e->type)
ladanyi@1645
   370
  {
hegyi@1510
   371
    case GDK_BUTTON_PRESS:
hegyi@1510
   372
      //in edge creation right button has special meaning
hegyi@1510
   373
      if(e->button.button!=3)
ladanyi@1645
   374
      {
ladanyi@1645
   375
        //there is not yet selected node
ladanyi@1645
   376
        if(active_node==INVALID)
ladanyi@1645
   377
        {
ladanyi@1645
   378
          //we mark the location of the event to be able to calculate parameters of dragging
hegyi@1525
   379
ladanyi@1645
   380
          window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
hegyi@1525
   381
ladanyi@1645
   382
          active_item=(get_item_at(clicked_x, clicked_y));
ladanyi@1645
   383
          active_node=INVALID;
hegyi@1849
   384
          for (NodeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
ladanyi@1645
   385
          {
ladanyi@1645
   386
            if(nodesmap[i]==active_item)
ladanyi@1645
   387
            {
ladanyi@1645
   388
              active_node=i;
ladanyi@1645
   389
            }
ladanyi@1645
   390
          }
ladanyi@1645
   391
          //the clicked item is really a node
ladanyi@1645
   392
          if(active_node!=INVALID)
ladanyi@1645
   393
          {
ladanyi@1645
   394
            *(nodesmap[active_node]) << Gnome::Canvas::Properties::fill_color("red");
ladanyi@1645
   395
            isbutton=1;
ladanyi@1645
   396
          }
ladanyi@1645
   397
          //clicked item was not a node. It could be e.g. edge.
ladanyi@1645
   398
          else
ladanyi@1645
   399
          {
ladanyi@1645
   400
            active_item=NULL;
ladanyi@1645
   401
          }
ladanyi@1645
   402
        }
ladanyi@1645
   403
        //we only have to do sg. if the mouse button
ladanyi@1645
   404
        // is pressed already once AND the click was
ladanyi@1645
   405
        // on a node that was found in the set of 
ladanyi@1645
   406
        //nodes, and now we only search for the second 
ladanyi@1645
   407
        //node
ladanyi@1645
   408
        else
ladanyi@1645
   409
        {
ladanyi@1645
   410
          window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
ladanyi@1645
   411
          target_item=(get_item_at(clicked_x, clicked_y));
ladanyi@1645
   412
          Node target_node=INVALID;
hegyi@1849
   413
          for (NodeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
ladanyi@1645
   414
          {
ladanyi@1645
   415
            if(nodesmap[i]==target_item)
ladanyi@1645
   416
            {
ladanyi@1645
   417
              target_node=i;
ladanyi@1645
   418
            }
ladanyi@1645
   419
          }
ladanyi@1645
   420
          //the clicked item is a node, the edge can be drawn
ladanyi@1645
   421
          if(target_node!=INVALID)
ladanyi@1645
   422
          {
ladanyi@1645
   423
            if(target_node!=active_node)		
ladanyi@1645
   424
            {
hegyi@1849
   425
              (mytab.mapstorage).modified = true;
ladanyi@1606
   426
ladanyi@1645
   427
              *(nodesmap[target_node]) <<
ladanyi@1645
   428
                Gnome::Canvas::Properties::fill_color("red");
hegyi@1510
   429
ladanyi@1645
   430
              //creating new edge
hegyi@1849
   431
              active_edge=(mytab.mapstorage).graph.addEdge(active_node,
ladanyi@1645
   432
                  target_node);
hegyi@1510
   433
ladanyi@1646
   434
              // update maps
ladanyi@1645
   435
              for (std::map<std::string,
ladanyi@1645
   436
                  Graph::EdgeMap<double>*>::const_iterator it =
hegyi@1849
   437
                  (mytab.mapstorage).edgemap_storage.begin(); it !=
hegyi@1849
   438
                  (mytab.mapstorage).edgemap_storage.end(); ++it)
ladanyi@1645
   439
              {
ladanyi@1646
   440
                (*(it->second))[active_edge] =
hegyi@1849
   441
                  (mytab.mapstorage).edgemap_default[it->first];
ladanyi@1645
   442
              }
ladanyi@1646
   443
              // increment the id map's default value
hegyi@1849
   444
              (mytab.mapstorage).edgemap_default["id"] += 1.0;
hegyi@1510
   445
ladanyi@1645
   446
              //calculating coordinates of new edge
ladanyi@1645
   447
              Gnome::Canvas::Points coos;
ladanyi@1645
   448
              double x1, x2, y1, y2;
hegyi@1510
   449
ladanyi@1645
   450
              active_item->get_bounds(x1, y1, x2, y2);
ladanyi@1645
   451
              coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
hegyi@1510
   452
ladanyi@1645
   453
              target_item->get_bounds(x1, y1, x2, y2);
ladanyi@1645
   454
              coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
hegyi@1510
   455
ladanyi@1883
   456
              // set the coordinates of the arrow on the new edge
ladanyi@1883
   457
              MapStorage& ms = mytab.mapstorage;
ladanyi@1883
   458
              ms.arrow_pos.set(active_edge,
ladanyi@1883
   459
                  (ms.coords[ms.graph.source(active_edge)] +
ladanyi@1883
   460
                   ms.coords[ms.graph.target(active_edge)])/ 2.0);
ladanyi@1883
   461
ladanyi@1645
   462
              //drawing new edge
ladanyi@1860
   463
              edgesmap[active_edge]=new BrokenEdge(displayed_graph, active_edge,
ladanyi@1645
   464
                  *this);
ladanyi@1645
   465
              *(edgesmap[active_edge]) <<
ladanyi@1645
   466
                Gnome::Canvas::Properties::fill_color("green");
ladanyi@1645
   467
              edgesmap[active_edge]->property_width_pixels().set_value(10);
hegyi@1510
   468
ladanyi@1645
   469
              edgesmap[active_edge]->lower_to_bottom();
hegyi@1512
   470
ladanyi@1645
   471
              //initializing edge-text as well, to empty string
ladanyi@1860
   472
              XY text_pos=mytab.mapstorage.arrow_pos[active_edge];
ladanyi@1860
   473
              text_pos+=(XY(10,10));
ladanyi@1645
   474
ladanyi@1645
   475
              edgetextmap[active_edge]=new Gnome::Canvas::Text(displayed_graph,
ladanyi@1645
   476
                  text_pos.x, text_pos.y, "");
ladanyi@1645
   477
              edgetextmap[active_edge]->property_fill_color().set_value(
ladanyi@1645
   478
                  "darkgreen");
ladanyi@1645
   479
              edgetextmap[active_edge]->raise_to_top();
ladanyi@1645
   480
ladanyi@1645
   481
              //updating its properties
hegyi@1837
   482
//               mapwin.updateEdge(active_edge);
hegyi@1837
   483
              propertyUpdate(active_edge);
ladanyi@1645
   484
            }
ladanyi@1645
   485
            else
ladanyi@1645
   486
            {
ladanyi@1645
   487
              target_node=INVALID;
ladanyi@1645
   488
              std::cerr << "Loop edge is not yet implemented!" << std::endl;
ladanyi@1645
   489
            }
ladanyi@1645
   490
          }
ladanyi@1645
   491
          //clicked item was not a node. it could be an e.g. edge. we do not
ladanyi@1645
   492
          //deal with it furthermore.
ladanyi@1645
   493
          else
ladanyi@1645
   494
          {
ladanyi@1645
   495
            target_item=NULL;
ladanyi@1645
   496
          }
ladanyi@1645
   497
        }
ladanyi@1645
   498
      }
hegyi@1510
   499
      break;
hegyi@1510
   500
    case GDK_BUTTON_RELEASE:
hegyi@1510
   501
      isbutton=0;
hegyi@1510
   502
      //we clear settings in two cases
hegyi@1510
   503
      //1: the edge is ready (target_item has valid value)
hegyi@1510
   504
      //2: the edge creation is cancelled with right button
hegyi@1510
   505
      if((target_item)||(e->button.button==3))
ladanyi@1645
   506
      {
ladanyi@1645
   507
        if(active_item)
ladanyi@1645
   508
        {
ladanyi@1645
   509
          *active_item << Gnome::Canvas::Properties::fill_color("blue");
ladanyi@1645
   510
          active_item=NULL;
ladanyi@1645
   511
        }
ladanyi@1645
   512
        if(target_item)
ladanyi@1645
   513
        {
ladanyi@1645
   514
          *target_item << Gnome::Canvas::Properties::fill_color("blue");
ladanyi@1645
   515
          target_item=NULL;
ladanyi@1645
   516
        }
ladanyi@1645
   517
        active_node=INVALID;
ladanyi@1645
   518
        active_edge=INVALID;
ladanyi@1645
   519
      }
hegyi@1510
   520
      break;
hegyi@1510
   521
    default:
hegyi@1510
   522
      break;
ladanyi@1645
   523
  }
hegyi@1510
   524
  return false;
hegyi@1510
   525
}
hegyi@1510
   526
hegyi@1524
   527
bool GraphDisplayerCanvas::eraserEventHandler(GdkEvent* e)
hegyi@1510
   528
{
hegyi@1510
   529
  switch(e->type)
hegyi@1510
   530
    {
hegyi@1510
   531
    case GDK_BUTTON_PRESS:
hegyi@1594
   532
      //finding the clicked items
hegyi@1525
   533
      window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
hegyi@1525
   534
      active_item=(get_item_at(clicked_x, clicked_y));
hegyi@1510
   535
      active_node=INVALID;
hegyi@1510
   536
      active_edge=INVALID;
hegyi@1594
   537
      //was it a node?
hegyi@1849
   538
      for (NodeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
hegyi@1510
   539
	{
hegyi@1510
   540
	  if(nodesmap[i]==active_item)
hegyi@1510
   541
	    {
hegyi@1510
   542
	      active_node=i;
hegyi@1510
   543
	    }
hegyi@1510
   544
	}
hegyi@1594
   545
      //or was it an edge?
hegyi@1510
   546
      if(active_node==INVALID)
hegyi@1510
   547
	{
hegyi@1849
   548
	  for (EdgeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
hegyi@1510
   549
	    {
hegyi@1510
   550
	      if(edgesmap[i]==active_item)
hegyi@1510
   551
		{
hegyi@1510
   552
		  active_edge=i;
hegyi@1510
   553
		}
hegyi@1510
   554
	    }
hegyi@1510
   555
	}
hegyi@1594
   556
ladanyi@1943
   557
      // return if the clicked object is neither an edge nor a node
ladanyi@1943
   558
      if (active_edge == INVALID) return false;
ladanyi@1943
   559
      
hegyi@1594
   560
      //recolor activated item
hegyi@1525
   561
      if(active_item)
hegyi@1525
   562
	{
hegyi@1525
   563
	  *active_item << Gnome::Canvas::Properties::fill_color("red");
hegyi@1525
   564
	}
hegyi@1510
   565
      break;
hegyi@1510
   566
hegyi@1510
   567
    case GDK_BUTTON_RELEASE:
hegyi@1525
   568
      window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
hegyi@1525
   569
      if(active_item)
hegyi@1510
   570
	{
hegyi@1594
   571
	  //the cursor was not moved since pressing it
hegyi@1525
   572
	  if( active_item == ( get_item_at (clicked_x, clicked_y) ) )
hegyi@1510
   573
	    {
hegyi@1594
   574
	      //a node was found
hegyi@1525
   575
	      if(active_node!=INVALID)
hegyi@1525
   576
		{
hegyi@1849
   577
                  (mytab.mapstorage).modified = true;
hegyi@1510
   578
hegyi@1525
   579
		  std::set<Graph::Edge> edges_to_delete;
hegyi@1510
   580
hegyi@1849
   581
		  for(OutEdgeIt e((mytab.mapstorage).graph,active_node);e!=INVALID;++e)
hegyi@1525
   582
		    {
hegyi@1525
   583
		      edges_to_delete.insert(e);
hegyi@1525
   584
		    }
alpar@1651
   585
		  
hegyi@1849
   586
		  for(InEdgeIt e((mytab.mapstorage).graph,active_node);e!=INVALID;++e)
hegyi@1525
   587
		    {
hegyi@1525
   588
		      edges_to_delete.insert(e);
hegyi@1525
   589
		    }
alpar@1651
   590
		  
hegyi@1525
   591
		  //deleting collected edges
alpar@1651
   592
		  for(std::set<Graph::Edge>::iterator
alpar@1651
   593
			edge_set_it=edges_to_delete.begin();
alpar@1651
   594
		      edge_set_it!=edges_to_delete.end();
alpar@1651
   595
		      ++edge_set_it)
hegyi@1525
   596
		    {
hegyi@1525
   597
		      deleteItem(*edge_set_it);
hegyi@1525
   598
		    }
hegyi@1525
   599
		  deleteItem(active_node);
hegyi@1525
   600
		}
hegyi@1525
   601
	      //a simple edge was chosen
ladanyi@1943
   602
	      else if (active_edge != INVALID)
hegyi@1510
   603
		{
hegyi@1525
   604
		  deleteItem(active_edge);
hegyi@1510
   605
		}
hegyi@1510
   606
	    }
hegyi@1525
   607
	  //pointer was moved, deletion is cancelled
hegyi@1510
   608
	  else
hegyi@1510
   609
	    {
hegyi@1525
   610
	      if(active_node!=INVALID)
hegyi@1525
   611
		{
hegyi@1525
   612
		  *active_item << Gnome::Canvas::Properties::fill_color("blue");
hegyi@1525
   613
		}
ladanyi@1943
   614
	      else if (active_edge != INVALID)
hegyi@1525
   615
		{
hegyi@1525
   616
		  *active_item << Gnome::Canvas::Properties::fill_color("green");
hegyi@1525
   617
		}
hegyi@1510
   618
	    }
hegyi@1510
   619
	}
hegyi@1510
   620
      //reseting datas
hegyi@1510
   621
      active_item=NULL;
hegyi@1510
   622
      active_edge=INVALID;
hegyi@1510
   623
      active_node=INVALID;
hegyi@1510
   624
      break;
hegyi@1510
   625
hegyi@1510
   626
    case GDK_MOTION_NOTIFY:
hegyi@1510
   627
      break;
hegyi@1510
   628
hegyi@1510
   629
    default:
hegyi@1510
   630
      break;
hegyi@1510
   631
    }
hegyi@1525
   632
  return false;
hegyi@1510
   633
}
hegyi@1510
   634
hegyi@1550
   635
bool GraphDisplayerCanvas::edgeMapEditEventHandler(GdkEvent* e)
hegyi@1550
   636
{
hegyi@1599
   637
  if(actual_tool==EDGE_MAP_EDIT)
ladanyi@1648
   638
  {
ladanyi@1648
   639
    switch(e->type)
hegyi@1550
   640
    {
ladanyi@1648
   641
      case GDK_BUTTON_PRESS:
ladanyi@1648
   642
        {
ladanyi@1648
   643
          //for determine, whether it was an edge
ladanyi@1648
   644
          Edge clicked_edge=INVALID;
hegyi@1594
   645
ladanyi@1648
   646
          window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
ladanyi@1648
   647
          active_item=(get_item_at(clicked_x, clicked_y));
hegyi@1599
   648
ladanyi@1648
   649
          //find the activated item between texts
hegyi@1849
   650
          for (EdgeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
ladanyi@1648
   651
          {
ladanyi@1648
   652
            //at the same time only one can be active
ladanyi@1648
   653
            if(edgetextmap[i]==active_item)
ladanyi@1648
   654
            {
ladanyi@1648
   655
              clicked_edge=i;
ladanyi@1648
   656
            }
ladanyi@1648
   657
          }
ladanyi@1647
   658
ladanyi@1648
   659
          //if it was not between texts, search for it between edges
ladanyi@1648
   660
          if(clicked_edge==INVALID)
ladanyi@1648
   661
          {
hegyi@1849
   662
            for (EdgeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
ladanyi@1648
   663
            {
ladanyi@1648
   664
              //at the same time only one can be active
ladanyi@1648
   665
              if((edgesmap[i]==active_item)||(edgetextmap[i]==active_item))
ladanyi@1648
   666
              {
ladanyi@1648
   667
                clicked_edge=i;
ladanyi@1648
   668
              }
ladanyi@1648
   669
            }
ladanyi@1648
   670
          }
ladanyi@1648
   671
 
ladanyi@1648
   672
          //if it was really an edge...
ladanyi@1648
   673
          if(clicked_edge!=INVALID)
ladanyi@1648
   674
          {
ladanyi@1648
   675
            // the id map is not editable
ladanyi@1648
   676
            if (edgemap_to_edit == "id") return 0;
hegyi@1599
   677
ladanyi@1648
   678
            //and there is activated map
ladanyi@1648
   679
            if(edgetextmap[clicked_edge]->property_text().get_value()!="")
ladanyi@1648
   680
            {
ladanyi@1648
   681
              //activate the general variable for it
ladanyi@1648
   682
              active_edge=clicked_edge;
hegyi@1599
   683
ladanyi@1648
   684
              //create a dialog
hegyi@1849
   685
              Gtk::Dialog dialog("Edit value", true);
ladanyi@1648
   686
              dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
ladanyi@1648
   687
              dialog.add_button(Gtk::Stock::OK, Gtk::RESPONSE_ACCEPT);
ladanyi@1648
   688
              Gtk::VBox* vbox = dialog.get_vbox();
ladanyi@1826
   689
              Gtk::SpinButton spin(0.0, 4);
ladanyi@1826
   690
              spin.set_increments(1.0, 10.0);
ladanyi@1826
   691
              spin.set_range(-1000000.0, 1000000.0);
ladanyi@1648
   692
              spin.set_numeric(true);
ladanyi@1648
   693
              vbox->add(spin);
ladanyi@1648
   694
              spin.show();
ladanyi@1648
   695
              switch (dialog.run())
ladanyi@1648
   696
              {
ladanyi@1648
   697
                case Gtk::RESPONSE_NONE:
ladanyi@1648
   698
                case Gtk::RESPONSE_CANCEL:
ladanyi@1648
   699
                  break;
ladanyi@1648
   700
                case Gtk::RESPONSE_ACCEPT:
ladanyi@1648
   701
                  double new_value = spin.get_value();
hegyi@1849
   702
                  (*(mytab.mapstorage).edgemap_storage[edgemap_to_edit])[active_edge] =
ladanyi@1648
   703
                    new_value;
ladanyi@1648
   704
                  std::ostringstream ostr;
ladanyi@1648
   705
                  ostr << new_value;
ladanyi@1648
   706
                  edgetextmap[active_edge]->property_text().set_value(
ladanyi@1648
   707
                      ostr.str());
ladanyi@1648
   708
                  //mapwin.updateEdge(active_edge);
hegyi@1837
   709
//                   mapwin.updateEdge(Edge(INVALID));
hegyi@1837
   710
                  propertyUpdate(Edge(INVALID));
ladanyi@1648
   711
              }
ladanyi@1648
   712
            }
ladanyi@1648
   713
          }
ladanyi@1648
   714
          break;
ladanyi@1648
   715
        }
ladanyi@1648
   716
      default:
ladanyi@1648
   717
        break;
hegyi@1550
   718
    }
ladanyi@1648
   719
  }
hegyi@1550
   720
  return false;  
hegyi@1550
   721
}
hegyi@1550
   722
hegyi@1550
   723
bool GraphDisplayerCanvas::nodeMapEditEventHandler(GdkEvent* e)
hegyi@1550
   724
{
hegyi@1599
   725
  if(actual_tool==NODE_MAP_EDIT)
ladanyi@1648
   726
  {
ladanyi@1648
   727
    switch(e->type)
hegyi@1579
   728
    {
ladanyi@1648
   729
      case GDK_BUTTON_PRESS:
ladanyi@1648
   730
        {
ladanyi@1648
   731
          //for determine, whether it was a node
ladanyi@1648
   732
          Node clicked_node=INVALID;
hegyi@1594
   733
ladanyi@1648
   734
          window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
ladanyi@1648
   735
          active_item=(get_item_at(clicked_x, clicked_y));
hegyi@1594
   736
ladanyi@1648
   737
          //find the activated item between texts
hegyi@1849
   738
          for (NodeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
ladanyi@1648
   739
          {
ladanyi@1648
   740
            //at the same time only one can be active
ladanyi@1648
   741
            if(nodetextmap[i]==active_item)
ladanyi@1648
   742
            {
ladanyi@1648
   743
              clicked_node=i;
ladanyi@1648
   744
            }
ladanyi@1648
   745
          }
hegyi@1599
   746
ladanyi@1648
   747
          //if there was not, search for it between nodes
ladanyi@1648
   748
          if(clicked_node==INVALID)
ladanyi@1648
   749
          {
hegyi@1849
   750
            for (NodeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
ladanyi@1648
   751
            {
ladanyi@1648
   752
              //at the same time only one can be active
ladanyi@1648
   753
              if(nodesmap[i]==active_item)
ladanyi@1648
   754
              {
ladanyi@1648
   755
                clicked_node=i;
ladanyi@1648
   756
              }
ladanyi@1648
   757
            }
ladanyi@1648
   758
          }
hegyi@1599
   759
ladanyi@1648
   760
          //if it was really a node...
ladanyi@1648
   761
          if(clicked_node!=INVALID)
ladanyi@1648
   762
          {
ladanyi@1648
   763
            // the id map is not editable
ladanyi@1648
   764
            if (nodemap_to_edit == "id") return 0;
hegyi@1599
   765
ladanyi@1648
   766
            //and there is activated map
ladanyi@1648
   767
            if(nodetextmap[clicked_node]->property_text().get_value()!="")
ladanyi@1648
   768
            {
ladanyi@1648
   769
              //activate the general variable for it
ladanyi@1648
   770
              active_node=clicked_node;
hegyi@1599
   771
ladanyi@1648
   772
              //create a dialog
hegyi@1849
   773
              Gtk::Dialog dialog("Edit value", true);
ladanyi@1648
   774
              dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
ladanyi@1648
   775
              dialog.add_button(Gtk::Stock::OK, Gtk::RESPONSE_ACCEPT);
ladanyi@1648
   776
              Gtk::VBox* vbox = dialog.get_vbox();
ladanyi@1826
   777
              Gtk::SpinButton spin(0.0, 4);
ladanyi@1826
   778
              spin.set_increments(1.0, 10.0);
ladanyi@1826
   779
              spin.set_range(-1000000.0, 1000000.0);
ladanyi@1648
   780
              spin.set_numeric(true);
ladanyi@1648
   781
              vbox->add(spin);
ladanyi@1648
   782
              spin.show();
ladanyi@1648
   783
              switch (dialog.run())
ladanyi@1648
   784
              {
ladanyi@1648
   785
                case Gtk::RESPONSE_NONE:
ladanyi@1648
   786
                case Gtk::RESPONSE_CANCEL:
ladanyi@1648
   787
                  break;
ladanyi@1648
   788
                case Gtk::RESPONSE_ACCEPT:
ladanyi@1648
   789
                  double new_value = spin.get_value();
hegyi@1849
   790
                  (*(mytab.mapstorage).nodemap_storage[nodemap_to_edit])[active_node] =
ladanyi@1648
   791
                    new_value;
ladanyi@1648
   792
                  std::ostringstream ostr;
ladanyi@1648
   793
                  ostr << new_value;
ladanyi@1648
   794
                  nodetextmap[active_node]->property_text().set_value(
ladanyi@1648
   795
                      ostr.str());
ladanyi@1648
   796
                  //mapwin.updateNode(active_node);
hegyi@1837
   797
//                   mapwin.updateNode(Node(INVALID));
hegyi@1837
   798
                  propertyUpdate(Node(INVALID));
ladanyi@1648
   799
              }
ladanyi@1648
   800
            }
ladanyi@1648
   801
          }
ladanyi@1648
   802
          break;
ladanyi@1648
   803
        }
ladanyi@1648
   804
      default:
ladanyi@1648
   805
        break;
hegyi@1579
   806
    }
ladanyi@1648
   807
  }
hegyi@1579
   808
  return false;  
hegyi@1550
   809
}
hegyi@1550
   810
alpar@1643
   811
void GraphDisplayerCanvas::deleteItem(Node node_to_delete)
hegyi@1510
   812
{
hegyi@1512
   813
  delete(nodetextmap[node_to_delete]);
hegyi@1510
   814
  delete(nodesmap[node_to_delete]);
hegyi@1849
   815
  (mytab.mapstorage).graph.erase(node_to_delete);
hegyi@1510
   816
}
hegyi@1510
   817
alpar@1643
   818
void GraphDisplayerCanvas::deleteItem(Edge edge_to_delete)
hegyi@1510
   819
{
hegyi@1512
   820
  delete(edgetextmap[edge_to_delete]);
hegyi@1510
   821
  delete(edgesmap[edge_to_delete]);
hegyi@1849
   822
  (mytab.mapstorage).graph.erase(edge_to_delete);
hegyi@1510
   823
}
hegyi@1510
   824
hegyi@1524
   825
void GraphDisplayerCanvas::textReposition(xy<double> new_place)
hegyi@1510
   826
{
hegyi@1510
   827
  new_place+=(xy<double>(10,10));
hegyi@1579
   828
  edgetextmap[forming_edge]->property_x().set_value(new_place.x);
hegyi@1579
   829
  edgetextmap[forming_edge]->property_y().set_value(new_place.y);
hegyi@1510
   830
}
hegyi@1510
   831
hegyi@1524
   832
void GraphDisplayerCanvas::toggleEdgeActivity(BrokenEdge* active_bre, bool on)
hegyi@1510
   833
{
hegyi@1510
   834
  if(on)
hegyi@1510
   835
    {
hegyi@1579
   836
      if(forming_edge!=INVALID)
hegyi@1510
   837
	{
hegyi@1599
   838
	  std::cerr << "ERROR!!!! Valid edge found!" << std::endl;
hegyi@1510
   839
	}
hegyi@1510
   840
      else
hegyi@1510
   841
	{
hegyi@1849
   842
	  for (EdgeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
hegyi@1510
   843
	    {
hegyi@1510
   844
	      if(edgesmap[i]==active_bre)
hegyi@1510
   845
		{
hegyi@1579
   846
		  forming_edge=i;
hegyi@1510
   847
		}
hegyi@1510
   848
	    }
hegyi@1510
   849
	}
hegyi@1510
   850
    }
hegyi@1510
   851
  else
hegyi@1510
   852
    {
hegyi@1579
   853
      if(forming_edge!=INVALID)
hegyi@1510
   854
	{
hegyi@1579
   855
	  forming_edge=INVALID;
hegyi@1510
   856
	}
hegyi@1510
   857
      else
hegyi@1510
   858
	{
hegyi@1599
   859
	  std::cerr << "ERROR!!!! Invalid edge found!" << std::endl;
hegyi@1510
   860
	}
hegyi@1510
   861
    }
hegyi@1510
   862
}