home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / diverses / leda / prog / graphics / ged1.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-11-15  |  7.2 KB  |  375 lines

  1. #include <LEDA/graph.h>
  2. #include <LEDA/d_array.h>
  3. #include <LEDA/plane.h>
  4. #include <LEDA/window.h>
  5.  
  6. declare2(GRAPH,point,int)
  7.  
  8. declare2(d_array,point,node)
  9. declare2(d_array,node,int)
  10.  
  11. declare(node_array,node)
  12.  
  13. string filename;
  14.  
  15. GRAPH(point,int) G;
  16.  
  17. int node_count = 0;
  18.  
  19. window* Wp;
  20.  
  21. panel file_panel("FILE PANEL");
  22. panel init_panel("INIT PANEL");
  23.  
  24. int node_width = 12;
  25. int edge_width = 2;
  26. int xmin =  0;
  27. int xmax = 50;
  28. int ymin =  0;
  29.  
  30. color node_color = blue;
  31. color edge_color = red;
  32.  
  33. d_array(point,node)   V(nil);
  34. d_array(node,int)     name;
  35.  
  36.  
  37.  
  38. static void draw_node_cursor(double x, double y)
  39.   Wp->draw_node(x,y);
  40.  }
  41.  
  42.  
  43.  
  44. void draw_node(node v)
  45. { Wp->draw_text_node(G[v],form("%d",name[v]),node_color);
  46.  }
  47.  
  48.  
  49.  
  50. void draw_edge(edge e)
  51.   Wp->draw_edge_arrow(G[source(e)],G[target(e)],edge_color);
  52.  }
  53.  
  54. void message(string s)
  55. { s += "                              ";
  56.   Wp->del_message();
  57.   Wp->message(s);
  58. }
  59.  
  60.  
  61. void load_graph(string s)
  62. {
  63.  
  64.  
  65.   node v;
  66.   edge e;
  67.  
  68.   G.clear();
  69.   Wp->clear();
  70.  
  71.   if (s=="")
  72.     { message("Empty buffer");
  73.       return;
  74.      }
  75.   else
  76.     message(form("Reading file %s",~s));
  77.  
  78.   int x = G.read(s);
  79.  
  80.   if (x == 1) message("new file");
  81.  
  82.   if (x == 3) message("Warning: Illegal file type.");
  83.  
  84.   if (x == 2 )
  85.   { init_random();
  86.     message("Warning: Graph not created by graph edit.");
  87.     forall_nodes(v,G)
  88.       G[v] = point(2*random(1,24), 2*random(1,24));
  89.    }
  90.  
  91.  
  92.   forall_nodes(v,G) 
  93.   { name[v] = node_count++;
  94.     V[G[v]] = v;
  95.     draw_node(v);
  96.    }
  97.  
  98.   forall_edges(e,G) draw_edge(e);
  99.                  
  100. }
  101.  
  102. void read_graph(string s)
  103. {
  104.   message(form("Reading file %s",~s));
  105.  
  106.   GRAPH(point,int) X;
  107.   node v;
  108.   edge e;
  109.  
  110.   int x = X.read(s);
  111.  
  112.   if (x == 1) message("empty file");
  113.  
  114.   if (x == 2)
  115.   { message("Warning: File not created by graph edit.");
  116.     forall_nodes(v,X)
  117.       X[v] = point(random(1,49), random(1,49));
  118.    }
  119.  
  120.   node_array(node) corr(X);
  121.  
  122.   forall_nodes(v,X) 
  123.   { node u = G.new_node(G[v]);
  124.     corr[v] = u;
  125.     name[u] = node_count++;
  126.     V[G[u]] = u;
  127.     draw_node(u);
  128.    }
  129.  
  130.   forall_edges(e,X) 
  131.   { G.new_edge(corr[source(e)],corr[target(e)]);
  132.     draw_edge(e);
  133.    }
  134. }
  135.  
  136.  
  137. void save_graph(string f)
  138. { message(form("writing to file %s",~f));
  139.   G.write(f);
  140.  }
  141.  
  142. void panel_init()
  143. {
  144.   init_panel.text_item(" BUTTON        unshifted              shifted     ");
  145.   init_panel.text_item("                                                ");
  146.   init_panel.text_item(" LEFT          insert/move node       delete node ");
  147.   init_panel.text_item(" MIDDLE        insert edge            delete edge ");
  148.   init_panel.text_item(" RIGHT         File Menu              Help        ");
  149.   init_panel.text_item("                                                ");
  150.   init_panel.int_item("xmin",xmin);
  151.   init_panel.int_item("xmax",xmax);
  152.   init_panel.int_item("ymin",ymin);
  153.   init_panel.int_item("node width",node_width,5,20);
  154.   init_panel.int_item("edge width",edge_width,1,8);
  155.   init_panel.color_item("node color",node_color);
  156.   init_panel.color_item("edge color",edge_color);
  157.  
  158.   file_panel.string_item("file",filename);
  159.   file_panel.button("Cancel"); 
  160.   file_panel.button("Edit");
  161.   file_panel.button("Read");
  162.   file_panel.button("Save"); 
  163.   file_panel.button("Quit"); 
  164. }
  165.  
  166.  
  167. void ged_init()
  168.  
  169.   init_panel.open();
  170.  
  171.   Wp->init(xmin,xmax,ymin,1);
  172.   Wp->set_mode(xor_mode);
  173.   Wp->set_node_width(node_width);
  174.   Wp->set_line_width(edge_width);
  175.  
  176.   node v;
  177.   forall_nodes(v,G) draw_node(v);
  178.  
  179.   edge e;
  180.   forall_edges(e,G) draw_edge(e);
  181. }
  182.  
  183.  
  184.  
  185. void graph_edit(window& W, string s)
  186. {
  187.   real  x,y;
  188.   point p,q;
  189.   int   key = 0;
  190.   int k;
  191.  
  192.   Wp = &W;
  193.  
  194.   filename = s;
  195.  
  196.   drawing_mode save = W.get_mode();
  197.  
  198.  
  199.   panel_init();
  200.  
  201.   ged_init();
  202.  
  203.  
  204.   load_graph(filename);
  205.  
  206.  
  207.   for(;;)
  208.   {
  209.      key = W.read_mouse(x,y);
  210.  
  211.      W.del_message();
  212.  
  213.      p = point(x,y);
  214.  
  215.      switch(key) {
  216.  
  217.      case 1:  { 
  218.                 node v;
  219.  
  220.                 if (V[p] == nil)        // new node
  221.                 { v  = G.new_node(p);
  222.                   name[v] = node_count++;
  223.                   draw_node(v);
  224.                   V[p] = v;
  225.                  }
  226.                 else                    // move node
  227.                 { v = V[p];
  228.  
  229.                   draw_node(v);
  230.  
  231.                   W.read_mouse_action(draw_node_cursor,x,y);
  232.  
  233.                   point q(x,y);           // new position
  234.  
  235.                   if (V[q] != nil)        // position not free
  236.                   { draw_node(v);
  237.                     break;
  238.                    }
  239.  
  240.                   V[p] = nil;
  241.  
  242.                   edge e;
  243.  
  244.                   forall_edges(e,G) 
  245.                     if (source(e) == v || target(e) == v) draw_edge(e);
  246.  
  247.                   G[v] = q;
  248.                   V[q] = v;
  249.                   draw_node(v);
  250.  
  251.                   forall_edges(e,G) 
  252.                     if (source(e) == v || target(e) == v) draw_edge(e);
  253.  
  254.                  }
  255.                 break;
  256.                }
  257.  
  258.      case -1: { // delete node
  259.  
  260.                 node v = V[p];
  261.  
  262.                 edge e;
  263.                 if (v != nil) 
  264.                 { forall_edges(e,G) 
  265.                     if (source(e) == v || target(e) == v) draw_edge(e);
  266.  
  267.                   draw_node(v);
  268.  
  269.                   G.del_node(v);
  270.                   V[p] = nil;
  271.                  }
  272.  
  273.                 }
  274.  
  275.      case 2:  { // new edge
  276.                 int k;
  277.                 node v = V[p];
  278.                 node w;
  279.      
  280.                 if (v != nil) 
  281.                 { W.draw_filled_node(p);
  282.                   do { k = W.read_mouse_seg(p.xcoord(),p.ycoord(),x,y);
  283.                        w = V[point(x,y)];
  284.                        if (w != nil) 
  285.                          draw_edge(G.new_edge(v,w));
  286.                       } while ( w == nil && k == 2);
  287.                   W.draw_filled_node(p);
  288.                  }
  289.                 break;
  290.                }
  291.  
  292.      case -2: { // delete edge
  293.  
  294.                 node v = V[p];
  295.  
  296.                 if (v != nil) 
  297.                 { W.read_mouse_seg(p.xcoord(),p.ycoord(),x,y);
  298.                   q = point(x,y);
  299.                   node w = V[q];
  300.                   if (w != nil)
  301.                   { //linear search
  302.                     edge e = G.first_adj_edge(v);
  303.                     while (e != nil && target(e) != w) e = G.adj_succ(e);
  304.                     if (e != nil)
  305.                     { draw_edge(e);
  306.                       G.del_edge(e);
  307.                      }
  308.                    }
  309.                  }
  310.                 break;
  311.                }
  312.  
  313.  
  314.  
  315.      case  3: { //Menu
  316.  
  317.  
  318.                 k = file_panel.open();
  319.  
  320.                 switch (k) {
  321.  
  322.                  case 0 : // cancel
  323.                           break;
  324.  
  325.                  case 1 : // edit
  326.                           load_graph(filename);
  327.                           break;
  328.  
  329.                  case 2 : // read
  330.                           read_graph(filename);
  331.                           break;
  332.  
  333.                  case 3 : // save
  334.                           save_graph(filename);
  335.                           break;
  336.  
  337.                  case 4 : // quit
  338.                           exit(0);
  339.                           break;  
  340.                   }
  341.  
  342.                 break;
  343.               }
  344.  
  345.  
  346.      case -3:  { ged_init();
  347.                  break;
  348.                 }
  349.  
  350.  
  351.  
  352.     } // switch
  353.  
  354.   } // for(;;)
  355.  
  356.   W.set_mode(save);
  357.  
  358. }
  359.  
  360.  
  361. main(int argc, char** argv)
  362. {
  363.   window W;
  364.  
  365.   if (argc > 1)  
  366.      graph_edit(W,argv[1]);
  367.   else 
  368.      graph_edit(W,"");
  369.  
  370.  
  371. }
  372.