gui/graph_displayer_canvas.cc
author alpar
Thu, 28 Jul 2005 19:04:43 +0000
changeset 1603 5ad84fbadf2b
parent 1598 739df601808d
child 1606 dc4ea2010dee
permissions -rwxr-xr-x
More docs
     1 #include <graph_displayer_canvas.h>
     2 #include <broken_edge.h>
     3 #include <math.h>
     4 
     5 GraphDisplayerCanvas::GraphDisplayerCanvas(Graph & gr, CoordinatesMap & cm, MapStorage & ms, MapWin * mw):g(gr),nodesmap(g),edgesmap(g),edgetextmap(g),nodetextmap(g),displayed_graph(*(root()), 0, 0),canvasentrywidget(NULL),mapstorage(ms),isbutton(0),active_item(NULL),target_item(NULL),nodemap_to_edit(""),edgemap_to_edit(""),mapwin(mw)
     6 {
     7   
     8   //Initializing values.
     9   active_node=INVALID;
    10   active_edge=INVALID;
    11   forming_edge=INVALID;
    12 
    13   //setting event handler for the editor widget
    14   entrywidget.signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::entryWidgetChangeHandler), false);
    15 
    16   //base event handler is move tool
    17   actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::moveEventHandler), false);
    18   actual_tool=MOVE;
    19 
    20   //set_center_scroll_region(true);
    21 
    22   //first edges are drawn, to hide joining with nodes later
    23 
    24   for (EdgeIt i(g); i!=INVALID; ++i)
    25   {
    26 
    27     //drawing green lines, coordinates are from cm
    28 
    29     Gnome::Canvas::Points coos;
    30     coos.push_back(Gnome::Art::Point(cm[g.source(i)].x,cm[g.source(i)].y));
    31     coos.push_back(Gnome::Art::Point(cm[g.target(i)].x,cm[g.target(i)].y));
    32     
    33     edgesmap[i]=new BrokenEdge(displayed_graph, coos, *this);
    34     *(edgesmap[i]) << Gnome::Canvas::Properties::fill_color("green");
    35     edgesmap[i]->property_width_units().set_value(10);    
    36     
    37     //initializing edge-text as well, to empty string
    38 
    39     xy<double> text_pos=edgesmap[i]->getArrowPos();
    40     text_pos+=(xy<double>(10,10));
    41 
    42     edgetextmap[i]=new Gnome::Canvas::Text(displayed_graph, text_pos.x, text_pos.y, "");
    43     edgetextmap[i]->property_fill_color().set_value("darkgreen");
    44     edgetextmap[i]->signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::edgeMapEditEventHandler), false);
    45   }
    46 
    47   //afterwards nodes come to be drawn
    48 
    49   NodeIt i(g);
    50   int maxx=0, maxy=0, minx=(int)cm[i].x, miny=(int)cm[i].y;
    51 
    52   for (; i!=INVALID; ++i)
    53   {
    54     //minimum and maximum is gathered to be able to zoom to the graph correctly (whole figure should be seen)
    55 
    56     if(cm[i].x>maxx)maxx=(int)cm[i].x;
    57     if(cm[i].y>maxy)maxy=(int)cm[i].y;
    58     if(cm[i].x<minx)minx=(int)cm[i].x;
    59     if(cm[i].y<miny)miny=(int)cm[i].y;
    60 
    61     //drawing bule nodes, with black line around them
    62 
    63     nodesmap[i]=new Gnome::Canvas::Ellipse(displayed_graph, cm[i].x-20, cm[i].y-20, cm[i].x+20, cm[i].y+20);
    64     *(nodesmap[i]) << Gnome::Canvas::Properties::fill_color("blue");
    65     *(nodesmap[i]) << Gnome::Canvas::Properties::outline_color("black");
    66 
    67     //initializing edge-text as well, to empty string
    68 
    69     xy<double> text_pos((cm[i].x+node_property_defaults[N_RADIUS]+5),(cm[i].y+node_property_defaults[N_RADIUS]+5));
    70 
    71     nodetextmap[i]=new Gnome::Canvas::Text(displayed_graph, text_pos.x, text_pos.y, "");
    72     nodetextmap[i]->property_fill_color().set_value("darkblue");
    73     nodetextmap[i]->signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::nodeMapEditEventHandler), false);
    74   }
    75 
    76   updateScrollRegion();
    77 }
    78 
    79 GraphDisplayerCanvas::~GraphDisplayerCanvas()
    80 {
    81   if(canvasentrywidget)
    82     {
    83       delete(canvasentrywidget);
    84     }
    85 
    86   //writing out the end state of the graph
    87   //\todo all the maps has to be write out!
    88 
    89   Graph::NodeMap <int> id(g);
    90   Graph::NodeMap <double> xc(g);
    91   Graph::NodeMap <double> yc(g);
    92   
    93   int j=1;
    94   
    95   for (NodeIt i(g); i!=INVALID; ++i)
    96   {
    97     double x1,y1,x2,y2;
    98     nodesmap[i]->get_bounds(x1, y1, x2, y2);
    99     
   100     id[i]=j++;
   101     xc[i]=(x1+x2)/2;
   102     yc[i]=(y1+y2)/2;
   103   }
   104 
   105   GraphWriter<Graph> writer(std::cout,g);
   106   
   107   writer.writeNodeMap("id", id);
   108   writer.writeNodeMap("coordinates_x", xc);
   109   writer.writeNodeMap("coordinates_y", yc);
   110   writer.run();
   111 }