gui/graph_displayer_canvas-event.cc
author deba
Fri, 27 Jan 2006 14:18:11 +0000
changeset 1915 f1f523d39d32
parent 1879 01d41844ef46
child 1943 7349b09373a0
permissions -rwxr-xr-x
Add new ItemSetTraits for ANode and BNode
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
hegyi@1594
   557
      //recolor activated item
hegyi@1525
   558
      if(active_item)
hegyi@1525
   559
	{
hegyi@1525
   560
	  *active_item << Gnome::Canvas::Properties::fill_color("red");
hegyi@1525
   561
	}
hegyi@1510
   562
      break;
hegyi@1510
   563
hegyi@1510
   564
    case GDK_BUTTON_RELEASE:
hegyi@1525
   565
      window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
hegyi@1525
   566
      if(active_item)
hegyi@1510
   567
	{
hegyi@1594
   568
	  //the cursor was not moved since pressing it
hegyi@1525
   569
	  if( active_item == ( get_item_at (clicked_x, clicked_y) ) )
hegyi@1510
   570
	    {
hegyi@1594
   571
	      //a node was found
hegyi@1525
   572
	      if(active_node!=INVALID)
hegyi@1525
   573
		{
hegyi@1849
   574
                  (mytab.mapstorage).modified = true;
hegyi@1510
   575
hegyi@1525
   576
		  std::set<Graph::Edge> edges_to_delete;
hegyi@1510
   577
hegyi@1849
   578
		  for(OutEdgeIt e((mytab.mapstorage).graph,active_node);e!=INVALID;++e)
hegyi@1525
   579
		    {
hegyi@1525
   580
		      edges_to_delete.insert(e);
hegyi@1525
   581
		    }
alpar@1651
   582
		  
hegyi@1849
   583
		  for(InEdgeIt e((mytab.mapstorage).graph,active_node);e!=INVALID;++e)
hegyi@1525
   584
		    {
hegyi@1525
   585
		      edges_to_delete.insert(e);
hegyi@1525
   586
		    }
alpar@1651
   587
		  
hegyi@1525
   588
		  //deleting collected edges
alpar@1651
   589
		  for(std::set<Graph::Edge>::iterator
alpar@1651
   590
			edge_set_it=edges_to_delete.begin();
alpar@1651
   591
		      edge_set_it!=edges_to_delete.end();
alpar@1651
   592
		      ++edge_set_it)
hegyi@1525
   593
		    {
hegyi@1525
   594
		      deleteItem(*edge_set_it);
hegyi@1525
   595
		    }
hegyi@1525
   596
		  deleteItem(active_node);
hegyi@1525
   597
		}
hegyi@1525
   598
	      //a simple edge was chosen
hegyi@1525
   599
	      else
hegyi@1510
   600
		{
hegyi@1525
   601
		  deleteItem(active_edge);
hegyi@1510
   602
		}
hegyi@1510
   603
	    }
hegyi@1525
   604
	  //pointer was moved, deletion is cancelled
hegyi@1510
   605
	  else
hegyi@1510
   606
	    {
hegyi@1525
   607
	      if(active_node!=INVALID)
hegyi@1525
   608
		{
hegyi@1525
   609
		  *active_item << Gnome::Canvas::Properties::fill_color("blue");
hegyi@1525
   610
		}
hegyi@1525
   611
	      else
hegyi@1525
   612
		{
hegyi@1525
   613
		  *active_item << Gnome::Canvas::Properties::fill_color("green");
hegyi@1525
   614
		}
hegyi@1510
   615
	    }
hegyi@1510
   616
	}
hegyi@1510
   617
      //reseting datas
hegyi@1510
   618
      active_item=NULL;
hegyi@1510
   619
      active_edge=INVALID;
hegyi@1510
   620
      active_node=INVALID;
hegyi@1510
   621
      break;
hegyi@1510
   622
hegyi@1510
   623
    case GDK_MOTION_NOTIFY:
hegyi@1510
   624
      break;
hegyi@1510
   625
hegyi@1510
   626
    default:
hegyi@1510
   627
      break;
hegyi@1510
   628
    }
hegyi@1525
   629
  return false;
hegyi@1510
   630
}
hegyi@1510
   631
hegyi@1550
   632
bool GraphDisplayerCanvas::edgeMapEditEventHandler(GdkEvent* e)
hegyi@1550
   633
{
hegyi@1599
   634
  if(actual_tool==EDGE_MAP_EDIT)
ladanyi@1648
   635
  {
ladanyi@1648
   636
    switch(e->type)
hegyi@1550
   637
    {
ladanyi@1648
   638
      case GDK_BUTTON_PRESS:
ladanyi@1648
   639
        {
ladanyi@1648
   640
          //for determine, whether it was an edge
ladanyi@1648
   641
          Edge clicked_edge=INVALID;
hegyi@1594
   642
ladanyi@1648
   643
          window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
ladanyi@1648
   644
          active_item=(get_item_at(clicked_x, clicked_y));
hegyi@1599
   645
ladanyi@1648
   646
          //find the activated item between texts
hegyi@1849
   647
          for (EdgeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
ladanyi@1648
   648
          {
ladanyi@1648
   649
            //at the same time only one can be active
ladanyi@1648
   650
            if(edgetextmap[i]==active_item)
ladanyi@1648
   651
            {
ladanyi@1648
   652
              clicked_edge=i;
ladanyi@1648
   653
            }
ladanyi@1648
   654
          }
ladanyi@1647
   655
ladanyi@1648
   656
          //if it was not between texts, search for it between edges
ladanyi@1648
   657
          if(clicked_edge==INVALID)
ladanyi@1648
   658
          {
hegyi@1849
   659
            for (EdgeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
ladanyi@1648
   660
            {
ladanyi@1648
   661
              //at the same time only one can be active
ladanyi@1648
   662
              if((edgesmap[i]==active_item)||(edgetextmap[i]==active_item))
ladanyi@1648
   663
              {
ladanyi@1648
   664
                clicked_edge=i;
ladanyi@1648
   665
              }
ladanyi@1648
   666
            }
ladanyi@1648
   667
          }
ladanyi@1648
   668
 
ladanyi@1648
   669
          //if it was really an edge...
ladanyi@1648
   670
          if(clicked_edge!=INVALID)
ladanyi@1648
   671
          {
ladanyi@1648
   672
            // the id map is not editable
ladanyi@1648
   673
            if (edgemap_to_edit == "id") return 0;
hegyi@1599
   674
ladanyi@1648
   675
            //and there is activated map
ladanyi@1648
   676
            if(edgetextmap[clicked_edge]->property_text().get_value()!="")
ladanyi@1648
   677
            {
ladanyi@1648
   678
              //activate the general variable for it
ladanyi@1648
   679
              active_edge=clicked_edge;
hegyi@1599
   680
ladanyi@1648
   681
              //create a dialog
hegyi@1849
   682
              Gtk::Dialog dialog("Edit value", true);
ladanyi@1648
   683
              dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
ladanyi@1648
   684
              dialog.add_button(Gtk::Stock::OK, Gtk::RESPONSE_ACCEPT);
ladanyi@1648
   685
              Gtk::VBox* vbox = dialog.get_vbox();
ladanyi@1826
   686
              Gtk::SpinButton spin(0.0, 4);
ladanyi@1826
   687
              spin.set_increments(1.0, 10.0);
ladanyi@1826
   688
              spin.set_range(-1000000.0, 1000000.0);
ladanyi@1648
   689
              spin.set_numeric(true);
ladanyi@1648
   690
              vbox->add(spin);
ladanyi@1648
   691
              spin.show();
ladanyi@1648
   692
              switch (dialog.run())
ladanyi@1648
   693
              {
ladanyi@1648
   694
                case Gtk::RESPONSE_NONE:
ladanyi@1648
   695
                case Gtk::RESPONSE_CANCEL:
ladanyi@1648
   696
                  break;
ladanyi@1648
   697
                case Gtk::RESPONSE_ACCEPT:
ladanyi@1648
   698
                  double new_value = spin.get_value();
hegyi@1849
   699
                  (*(mytab.mapstorage).edgemap_storage[edgemap_to_edit])[active_edge] =
ladanyi@1648
   700
                    new_value;
ladanyi@1648
   701
                  std::ostringstream ostr;
ladanyi@1648
   702
                  ostr << new_value;
ladanyi@1648
   703
                  edgetextmap[active_edge]->property_text().set_value(
ladanyi@1648
   704
                      ostr.str());
ladanyi@1648
   705
                  //mapwin.updateEdge(active_edge);
hegyi@1837
   706
//                   mapwin.updateEdge(Edge(INVALID));
hegyi@1837
   707
                  propertyUpdate(Edge(INVALID));
ladanyi@1648
   708
              }
ladanyi@1648
   709
            }
ladanyi@1648
   710
          }
ladanyi@1648
   711
          break;
ladanyi@1648
   712
        }
ladanyi@1648
   713
      default:
ladanyi@1648
   714
        break;
hegyi@1550
   715
    }
ladanyi@1648
   716
  }
hegyi@1550
   717
  return false;  
hegyi@1550
   718
}
hegyi@1550
   719
hegyi@1550
   720
bool GraphDisplayerCanvas::nodeMapEditEventHandler(GdkEvent* e)
hegyi@1550
   721
{
hegyi@1599
   722
  if(actual_tool==NODE_MAP_EDIT)
ladanyi@1648
   723
  {
ladanyi@1648
   724
    switch(e->type)
hegyi@1579
   725
    {
ladanyi@1648
   726
      case GDK_BUTTON_PRESS:
ladanyi@1648
   727
        {
ladanyi@1648
   728
          //for determine, whether it was a node
ladanyi@1648
   729
          Node clicked_node=INVALID;
hegyi@1594
   730
ladanyi@1648
   731
          window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
ladanyi@1648
   732
          active_item=(get_item_at(clicked_x, clicked_y));
hegyi@1594
   733
ladanyi@1648
   734
          //find the activated item between texts
hegyi@1849
   735
          for (NodeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
ladanyi@1648
   736
          {
ladanyi@1648
   737
            //at the same time only one can be active
ladanyi@1648
   738
            if(nodetextmap[i]==active_item)
ladanyi@1648
   739
            {
ladanyi@1648
   740
              clicked_node=i;
ladanyi@1648
   741
            }
ladanyi@1648
   742
          }
hegyi@1599
   743
ladanyi@1648
   744
          //if there was not, search for it between nodes
ladanyi@1648
   745
          if(clicked_node==INVALID)
ladanyi@1648
   746
          {
hegyi@1849
   747
            for (NodeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
ladanyi@1648
   748
            {
ladanyi@1648
   749
              //at the same time only one can be active
ladanyi@1648
   750
              if(nodesmap[i]==active_item)
ladanyi@1648
   751
              {
ladanyi@1648
   752
                clicked_node=i;
ladanyi@1648
   753
              }
ladanyi@1648
   754
            }
ladanyi@1648
   755
          }
hegyi@1599
   756
ladanyi@1648
   757
          //if it was really a node...
ladanyi@1648
   758
          if(clicked_node!=INVALID)
ladanyi@1648
   759
          {
ladanyi@1648
   760
            // the id map is not editable
ladanyi@1648
   761
            if (nodemap_to_edit == "id") return 0;
hegyi@1599
   762
ladanyi@1648
   763
            //and there is activated map
ladanyi@1648
   764
            if(nodetextmap[clicked_node]->property_text().get_value()!="")
ladanyi@1648
   765
            {
ladanyi@1648
   766
              //activate the general variable for it
ladanyi@1648
   767
              active_node=clicked_node;
hegyi@1599
   768
ladanyi@1648
   769
              //create a dialog
hegyi@1849
   770
              Gtk::Dialog dialog("Edit value", true);
ladanyi@1648
   771
              dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
ladanyi@1648
   772
              dialog.add_button(Gtk::Stock::OK, Gtk::RESPONSE_ACCEPT);
ladanyi@1648
   773
              Gtk::VBox* vbox = dialog.get_vbox();
ladanyi@1826
   774
              Gtk::SpinButton spin(0.0, 4);
ladanyi@1826
   775
              spin.set_increments(1.0, 10.0);
ladanyi@1826
   776
              spin.set_range(-1000000.0, 1000000.0);
ladanyi@1648
   777
              spin.set_numeric(true);
ladanyi@1648
   778
              vbox->add(spin);
ladanyi@1648
   779
              spin.show();
ladanyi@1648
   780
              switch (dialog.run())
ladanyi@1648
   781
              {
ladanyi@1648
   782
                case Gtk::RESPONSE_NONE:
ladanyi@1648
   783
                case Gtk::RESPONSE_CANCEL:
ladanyi@1648
   784
                  break;
ladanyi@1648
   785
                case Gtk::RESPONSE_ACCEPT:
ladanyi@1648
   786
                  double new_value = spin.get_value();
hegyi@1849
   787
                  (*(mytab.mapstorage).nodemap_storage[nodemap_to_edit])[active_node] =
ladanyi@1648
   788
                    new_value;
ladanyi@1648
   789
                  std::ostringstream ostr;
ladanyi@1648
   790
                  ostr << new_value;
ladanyi@1648
   791
                  nodetextmap[active_node]->property_text().set_value(
ladanyi@1648
   792
                      ostr.str());
ladanyi@1648
   793
                  //mapwin.updateNode(active_node);
hegyi@1837
   794
//                   mapwin.updateNode(Node(INVALID));
hegyi@1837
   795
                  propertyUpdate(Node(INVALID));
ladanyi@1648
   796
              }
ladanyi@1648
   797
            }
ladanyi@1648
   798
          }
ladanyi@1648
   799
          break;
ladanyi@1648
   800
        }
ladanyi@1648
   801
      default:
ladanyi@1648
   802
        break;
hegyi@1579
   803
    }
ladanyi@1648
   804
  }
hegyi@1579
   805
  return false;  
hegyi@1550
   806
}
hegyi@1550
   807
alpar@1643
   808
void GraphDisplayerCanvas::deleteItem(Node node_to_delete)
hegyi@1510
   809
{
hegyi@1512
   810
  delete(nodetextmap[node_to_delete]);
hegyi@1510
   811
  delete(nodesmap[node_to_delete]);
hegyi@1849
   812
  (mytab.mapstorage).graph.erase(node_to_delete);
hegyi@1510
   813
}
hegyi@1510
   814
alpar@1643
   815
void GraphDisplayerCanvas::deleteItem(Edge edge_to_delete)
hegyi@1510
   816
{
hegyi@1512
   817
  delete(edgetextmap[edge_to_delete]);
hegyi@1510
   818
  delete(edgesmap[edge_to_delete]);
hegyi@1849
   819
  (mytab.mapstorage).graph.erase(edge_to_delete);
hegyi@1510
   820
}
hegyi@1510
   821
hegyi@1524
   822
void GraphDisplayerCanvas::textReposition(xy<double> new_place)
hegyi@1510
   823
{
hegyi@1510
   824
  new_place+=(xy<double>(10,10));
hegyi@1579
   825
  edgetextmap[forming_edge]->property_x().set_value(new_place.x);
hegyi@1579
   826
  edgetextmap[forming_edge]->property_y().set_value(new_place.y);
hegyi@1510
   827
}
hegyi@1510
   828
hegyi@1524
   829
void GraphDisplayerCanvas::toggleEdgeActivity(BrokenEdge* active_bre, bool on)
hegyi@1510
   830
{
hegyi@1510
   831
  if(on)
hegyi@1510
   832
    {
hegyi@1579
   833
      if(forming_edge!=INVALID)
hegyi@1510
   834
	{
hegyi@1599
   835
	  std::cerr << "ERROR!!!! Valid edge found!" << std::endl;
hegyi@1510
   836
	}
hegyi@1510
   837
      else
hegyi@1510
   838
	{
hegyi@1849
   839
	  for (EdgeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
hegyi@1510
   840
	    {
hegyi@1510
   841
	      if(edgesmap[i]==active_bre)
hegyi@1510
   842
		{
hegyi@1579
   843
		  forming_edge=i;
hegyi@1510
   844
		}
hegyi@1510
   845
	    }
hegyi@1510
   846
	}
hegyi@1510
   847
    }
hegyi@1510
   848
  else
hegyi@1510
   849
    {
hegyi@1579
   850
      if(forming_edge!=INVALID)
hegyi@1510
   851
	{
hegyi@1579
   852
	  forming_edge=INVALID;
hegyi@1510
   853
	}
hegyi@1510
   854
      else
hegyi@1510
   855
	{
hegyi@1599
   856
	  std::cerr << "ERROR!!!! Invalid edge found!" << std::endl;
hegyi@1510
   857
	}
hegyi@1510
   858
    }
hegyi@1510
   859
}