home *** CD-ROM | disk | FTP | other *** search
- #include <LEDA/graph.h>
- #include <LEDA/d_array.h>
- #include <LEDA/plane.h>
- #include <LEDA/window.h>
-
- declare2(GRAPH,point,int)
-
- declare2(d_array,point,node)
- declare2(d_array,node,int)
-
- declare(node_array,node)
-
- string filename;
-
- GRAPH(point,int) G;
-
- int node_count = 0;
-
- window* Wp;
-
- panel file_panel("FILE PANEL");
- panel init_panel("INIT PANEL");
-
- int node_width = 12;
- int edge_width = 2;
- int xmin = 0;
- int xmax = 50;
- int ymin = 0;
-
- color node_color = blue;
- color edge_color = red;
-
- d_array(point,node) V(nil);
- d_array(node,int) name;
-
-
-
- static void draw_node_cursor(double x, double y)
- {
- Wp->draw_node(x,y);
- }
-
-
-
- void draw_node(node v)
- { Wp->draw_text_node(G[v],form("%d",name[v]),node_color);
- }
-
-
-
- void draw_edge(edge e)
- {
- Wp->draw_edge_arrow(G[source(e)],G[target(e)],edge_color);
- }
-
- void message(string s)
- { s += " ";
- Wp->del_message();
- Wp->message(s);
- }
-
-
- void load_graph(string s)
- {
-
-
- node v;
- edge e;
-
- G.clear();
- Wp->clear();
-
- if (s=="")
- { message("Empty buffer");
- return;
- }
- else
- message(form("Reading file %s",~s));
-
- int x = G.read(s);
-
- if (x == 1) message("new file");
-
- if (x == 3) message("Warning: Illegal file type.");
-
- if (x == 2 )
- { init_random();
- message("Warning: Graph not created by graph edit.");
- forall_nodes(v,G)
- G[v] = point(2*random(1,24), 2*random(1,24));
- }
-
-
- forall_nodes(v,G)
- { name[v] = node_count++;
- V[G[v]] = v;
- draw_node(v);
- }
-
- forall_edges(e,G) draw_edge(e);
-
- }
-
- void read_graph(string s)
- {
- message(form("Reading file %s",~s));
-
- GRAPH(point,int) X;
- node v;
- edge e;
-
- int x = X.read(s);
-
- if (x == 1) message("empty file");
-
- if (x == 2)
- { message("Warning: File not created by graph edit.");
- forall_nodes(v,X)
- X[v] = point(random(1,49), random(1,49));
- }
-
- node_array(node) corr(X);
-
- forall_nodes(v,X)
- { node u = G.new_node(G[v]);
- corr[v] = u;
- name[u] = node_count++;
- V[G[u]] = u;
- draw_node(u);
- }
-
- forall_edges(e,X)
- { G.new_edge(corr[source(e)],corr[target(e)]);
- draw_edge(e);
- }
- }
-
-
- void save_graph(string f)
- { message(form("writing to file %s",~f));
- G.write(f);
- }
-
- void panel_init()
- {
- init_panel.text_item(" BUTTON unshifted shifted ");
- init_panel.text_item(" ");
- init_panel.text_item(" LEFT insert/move node delete node ");
- init_panel.text_item(" MIDDLE insert edge delete edge ");
- init_panel.text_item(" RIGHT File Menu Help ");
- init_panel.text_item(" ");
- init_panel.int_item("xmin",xmin);
- init_panel.int_item("xmax",xmax);
- init_panel.int_item("ymin",ymin);
- init_panel.int_item("node width",node_width,5,20);
- init_panel.int_item("edge width",edge_width,1,8);
- init_panel.color_item("node color",node_color);
- init_panel.color_item("edge color",edge_color);
-
- file_panel.string_item("file",filename);
- file_panel.button("Cancel");
- file_panel.button("Edit");
- file_panel.button("Read");
- file_panel.button("Save");
- file_panel.button("Quit");
- }
-
-
- void ged_init()
- {
-
- init_panel.open();
-
- Wp->init(xmin,xmax,ymin,1);
- Wp->set_mode(xor_mode);
- Wp->set_node_width(node_width);
- Wp->set_line_width(edge_width);
-
- node v;
- forall_nodes(v,G) draw_node(v);
-
- edge e;
- forall_edges(e,G) draw_edge(e);
- }
-
-
-
- void graph_edit(window& W, string s)
- {
- real x,y;
- point p,q;
- int key = 0;
- int k;
-
- Wp = &W;
-
- filename = s;
-
- drawing_mode save = W.get_mode();
-
-
- panel_init();
-
- ged_init();
-
-
- load_graph(filename);
-
-
- for(;;)
- {
- key = W.read_mouse(x,y);
-
- W.del_message();
-
- p = point(x,y);
-
- switch(key) {
-
- case 1: {
- node v;
-
- if (V[p] == nil) // new node
- { v = G.new_node(p);
- name[v] = node_count++;
- draw_node(v);
- V[p] = v;
- }
- else // move node
- { v = V[p];
-
- draw_node(v);
-
- W.read_mouse_action(draw_node_cursor,x,y);
-
- point q(x,y); // new position
-
- if (V[q] != nil) // position not free
- { draw_node(v);
- break;
- }
-
- V[p] = nil;
-
- edge e;
-
- forall_edges(e,G)
- if (source(e) == v || target(e) == v) draw_edge(e);
-
- G[v] = q;
- V[q] = v;
- draw_node(v);
-
- forall_edges(e,G)
- if (source(e) == v || target(e) == v) draw_edge(e);
-
- }
- break;
- }
-
- case -1: { // delete node
-
- node v = V[p];
-
- edge e;
- if (v != nil)
- { forall_edges(e,G)
- if (source(e) == v || target(e) == v) draw_edge(e);
-
- draw_node(v);
-
- G.del_node(v);
- V[p] = nil;
- }
-
- }
-
- case 2: { // new edge
- int k;
- node v = V[p];
- node w;
-
- if (v != nil)
- { W.draw_filled_node(p);
- do { k = W.read_mouse_seg(p.xcoord(),p.ycoord(),x,y);
- w = V[point(x,y)];
- if (w != nil)
- draw_edge(G.new_edge(v,w));
- } while ( w == nil && k == 2);
- W.draw_filled_node(p);
- }
- break;
- }
-
- case -2: { // delete edge
-
- node v = V[p];
-
- if (v != nil)
- { W.read_mouse_seg(p.xcoord(),p.ycoord(),x,y);
- q = point(x,y);
- node w = V[q];
- if (w != nil)
- { //linear search
- edge e = G.first_adj_edge(v);
- while (e != nil && target(e) != w) e = G.adj_succ(e);
- if (e != nil)
- { draw_edge(e);
- G.del_edge(e);
- }
- }
- }
- break;
- }
-
-
-
- case 3: { //Menu
-
-
- k = file_panel.open();
-
- switch (k) {
-
- case 0 : // cancel
- break;
-
- case 1 : // edit
- load_graph(filename);
- break;
-
- case 2 : // read
- read_graph(filename);
- break;
-
- case 3 : // save
- save_graph(filename);
- break;
-
- case 4 : // quit
- exit(0);
- break;
- }
-
- break;
- }
-
-
- case -3: { ged_init();
- break;
- }
-
-
-
- } // switch
-
- } // for(;;)
-
- W.set_mode(save);
-
- }
-
-
- main(int argc, char** argv)
- {
- window W;
-
- if (argc > 1)
- graph_edit(W,argv[1]);
- else
- graph_edit(W,"");
-
-
- }
-