Index: dijkstrabox.cc
===================================================================
--- dijkstrabox.cc	(revision 163)
+++ dijkstrabox.cc	(revision 165)
@@ -1,3 +1,6 @@
 #include <dijkstrabox.h>
+#include <lemon/dijkstra.h>
+#include <lemon/suurballe.h>
+#include <lemon/path.h>
 
 enum {INPUT, OUTPUT, MAP_NUM};
@@ -6,4 +9,21 @@
 {
   init(t);
+}
+    
+SuurballeBox::SuurballeBox(std::vector<std::string> t):DijkstraBox(t)
+{
+  Gtk::Adjustment * adjustment=new Gtk::Adjustment(2, 1, 20, 1, 5);
+  num_set = new Gtk::SpinButton(*adjustment, 5,0);
+
+  Gtk::Label * label=new Gtk::Label("No. of paths to find: ");
+//   hbox.pack_start(*label);
+//   hbox.pack_start(*num_set);
+//   hbox.show_all_children();
+
+  table.attach(*label, 0,1,2,3);
+  table.attach(*num_set, 1,2,2,3);
+
+
+//   pack_start(hbox);
 }
     
@@ -19,40 +39,26 @@
     {
       const Graph &g=mapstorage->graph;
-
-      Graph::EdgeMap<double> * inputmap=
-	(mapstorage->edgemap_storage)[(edgemapcbts[INPUT])->get_active_text()];
-      Graph::EdgeMap<double> * outputmap=
-	(mapstorage->edgemap_storage)[(edgemapcbts[OUTPUT])->get_active_text()];
-
       Node from, to;
-      int assigned=0;
+
+      get_from_to(from, to, (Graph&)g);
+
       std::ostringstream o;
 
-      //zero out output map
-      for (EdgeIt i(g); i!=INVALID; ++i)
-	{
-	  (*outputmap)[i]=0;
-	}
-
-      for (NodeIt i(g); (i!=INVALID) && (assigned<2); ++i)
-	{
-	  std::ostringstream text;
-	  text << (*((mapstorage->nodemap_storage)["label"]))[i];
-	  if(!(text.str().compare(source.get_active_text())))
-	    {
-	      from=i;
-	      assigned++;
-	    }
-	  if(!(text.str().compare(target.get_active_text())))
-	    {
-	      to=i;
-	      assigned++;
-	    }
-	}
       if(!(from==to))
 	{
+	  Graph::EdgeMap<double> * inputmap=
+	    (mapstorage->edgemap_storage)[(edgemapcbts[INPUT])->get_active_text()];
+	  Graph::EdgeMap<double> * outputmap=
+	    (mapstorage->edgemap_storage)[(edgemapcbts[OUTPUT])->get_active_text()];
+
+	  //zero out output map
+	  for (EdgeIt i(g); i!=INVALID; ++i)
+	    {
+	      (*outputmap)[i]=0;
+	    }
+	  
 	  Dijkstra<Graph, Graph::EdgeMap<double> > dijkstra(g, *inputmap);
 	  dijkstra.run(from, to);
-
+	  
 	  if(dijkstra.reached(to))
 	    {
@@ -74,11 +80,76 @@
 	    }
 	  resultlabel.set_text(o.str());
-
+	  
 	  mapstorage->mapChanged(true, (edgemapcbts[OUTPUT])->get_active_text());
-	}
-      //   mapstorage->changeActiveMap(true, E_COLOR,
-      // 			      (edgemapcbts[OUTPUT])->get_active_text());
-      //   mapstorage->changeActiveMap(true, E_TEXT,
-      // 			      (edgemapcbts[INPUT])->get_active_text());
+	  //   mapstorage->changeActiveMap(true, E_COLOR,
+	  // 			      (edgemapcbts[OUTPUT])->get_active_text());
+	  //   mapstorage->changeActiveMap(true, E_TEXT,
+	  // 			      (edgemapcbts[INPUT])->get_active_text());
+	}
+    }
+}
+
+void SuurballeBox::run()
+{
+  if(
+     tabcbt.get_active_text()!="" &&
+     (edgemapcbts[INPUT])->get_active_text()!="" &&
+     (edgemapcbts[OUTPUT])->get_active_text()!="" &&
+     source.get_active_text()!="" &&
+     target.get_active_text()!=""
+     )
+    {
+      const Graph &g=mapstorage->graph;
+      Node from, to;
+
+      get_from_to(from, to, (Graph&)g);
+
+      std::ostringstream o;
+
+      if(!(from==to))
+	{
+	  Graph::EdgeMap<double> * inputmap=
+	    (mapstorage->edgemap_storage)[(edgemapcbts[INPUT])->get_active_text()];
+	  Graph::EdgeMap<double> * outputmap=
+	    (mapstorage->edgemap_storage)[(edgemapcbts[OUTPUT])->get_active_text()];
+
+	  //zero out output map
+	  for (EdgeIt i(g); i!=INVALID; ++i)
+	    {
+	      (*outputmap)[i]=0;
+	    }
+	  
+	  Suurballe<Graph, Graph::EdgeMap<double> > sb((Graph&)g, *inputmap, from, to);
+	  
+	  int found=sb.run(num_set->get_value_as_int());
+	  if(found)
+	    {
+	      for(int j=0;j<found;j++)
+		{
+		  DirPath<Graph> path(g);
+		  sb.getPath(path, j);
+		  for(int k=0;k<path.length();k++)
+		    {
+		      DirPath<Graph>::EdgeIt ei;
+		      path.nth(ei,k);
+		      (*outputmap)[ei]=j+1;
+		    }
+		}
+	      o << "Result: found " << found << " paths between ";
+	      o << source.get_active_text() << " and " << target.get_active_text();
+	    }
+	  else
+	    {
+	      o << "Result: failed to find shortest path between ";
+	      o << source.get_active_text() << " and " << target.get_active_text();
+	    }
+	  resultlabel.set_text(o.str());
+	  
+	  mapstorage->mapChanged(true, (edgemapcbts[OUTPUT])->get_active_text());
+	  //   mapstorage->changeActiveMap(true, E_COLOR,
+	  // 			      (edgemapcbts[OUTPUT])->get_active_text());
+	  //   mapstorage->changeActiveMap(true, E_TEXT,
+	  // 			      (edgemapcbts[INPUT])->get_active_text());
+	}
     }
 }
@@ -108,4 +179,8 @@
 }
 
+void SuurballeBox::build_box()
+{
+}
+
 void DijkstraBox::maplists_updated()
 {
@@ -124,2 +199,22 @@
     }
 }
+
+void DijkstraBox::get_from_to(Node & from, Node & to, Graph & g)
+{
+  int assigned=0;
+  for (NodeIt i(g); (i!=INVALID) && (assigned<2); ++i)
+    {
+      std::ostringstream text;
+      text << (*((mapstorage->nodemap_storage)["label"]))[i];
+      if(!(text.str().compare(source.get_active_text())))
+	{
+	  from=i;
+	  assigned++;
+	}
+      if(!(text.str().compare(target.get_active_text())))
+	{
+	  to=i;
+	  assigned++;
+	}
+    }
+}
