From 0768dab4cd604cd305b4d63b53aed6a93189dcb1 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Sun, 27 Sep 2009 21:40:53 +0000
Subject: [PATCH] basic connection chooser

---
 Fltk/extraDialogs.cpp | 135 +++++++++++++++++++++++++++++++++++++++---
 1 file changed, 126 insertions(+), 9 deletions(-)

diff --git a/Fltk/extraDialogs.cpp b/Fltk/extraDialogs.cpp
index 4a53342c95..028860f623 100644
--- a/Fltk/extraDialogs.cpp
+++ b/Fltk/extraDialogs.cpp
@@ -16,7 +16,10 @@
 #include <FL/Fl_Check_Button.H>
 #include <FL/Fl_Hold_Browser.H>
 #include <FL/Fl_Box.H>
+#include <FL/Fl_Input.H>
+#include <FL/Fl_Double_Window.H>
 #include <FL/fl_ask.H>
+#include <FL/Fl_Preferences.H>
 #include "FlGui.h"
 #include "paletteWindow.h"
 #include "GmshDefines.h"
@@ -36,7 +39,7 @@ int arrowEditor(const char *title, double &a, double &b, double &c)
     Fl_Value_Slider *sa, *sb, *sc;
     Fl_Button *apply, *cancel;
   };
-  static _editor *editor = NULL;
+  static _editor *editor = 0;
 
   if(!editor){
     editor = new _editor;
@@ -92,7 +95,8 @@ static void persp_change_factor(Fl_Widget* w, void* data)
 }
 
 class Release_Slider : public Fl_Slider {
-  int handle(int event){ 
+  int handle(int event)
+  {
     switch (event) {
     case FL_RELEASE: 
       if(window())
@@ -113,7 +117,7 @@ int perspectiveEditor()
     Fl_Menu_Window *window;
     Release_Slider *sa;
   };
-  static _editor *editor = NULL;
+  static _editor *editor = 0;
 
   if(!editor){
     editor = new _editor;
@@ -163,7 +167,7 @@ int modelChooser()
     Fl_Hold_Browser *browser;
     Fl_Check_Button *butt;
   };
-  static _menu *menu = NULL;
+  static _menu *menu = 0;
 
   const int WW = 200;
 
@@ -197,13 +201,126 @@ int modelChooser()
 
 // Connection chooser
 
+class ConnectionBrowser : public Fl_Hold_Browser {
+  int handle(int event)
+  { 
+    switch (event) {
+    case FL_SHORTCUT:
+    case FL_KEYBOARD:
+      if(Fl::test_shortcut(FL_Delete) || Fl::test_shortcut(FL_BackSpace)){
+        int i = value();
+        if(i){
+          remove(i);
+          if(i <= size())
+            select(i);
+          else if(i > 1)
+            select(i - 1);
+        }
+        return 1;
+      }
+      break;
+    }
+    return Fl_Hold_Browser::handle(event);
+  };
+ public:
+  ConnectionBrowser(int x, int y, int w, int h, const char *l=0)
+    : Fl_Hold_Browser(x, y, w, h, l) {}
+  void save(Fl_Preferences &prefs)
+  {
+    std::set<std::string> uniq;
+    for(int i = 0; i < size(); i++) uniq.insert(text(i + 1));
+    char name[256];
+    int j = 0;
+    for(std::set<std::string>::iterator it = uniq.begin(); it != uniq.end(); it++){
+      sprintf(name, "connection%02d", j++);
+      prefs.set(name, it->c_str());
+    }
+    for(int i = j; i < 100; i++){
+      sprintf(name, "connection%02d", i);
+      if(prefs.entryExists(name))
+        prefs.deleteEntry(name);
+    }
+  }
+};
+
+struct _connectionChooser{
+  Fl_Double_Window *window;
+  Fl_Input *input;
+  ConnectionBrowser *browser;
+  Fl_Box *box;
+  Fl_Return_Button *ok;
+  Fl_Button *cancel;
+};
+
+static _connectionChooser *chooser = 0;
+
+static void select_cb(Fl_Widget* w, void *data)
+{
+  int i = chooser->browser->value();
+  if(i) chooser->input->value(chooser->browser->text(i));
+}
+
 std::string connectionChooser()
 {
-  const char *exe = fl_input
-    ("Command:", 
-     //"ssh ace25 /Users/geuzaine/src/gmsh/bin/gmsh");
-     "./gmsh ../tutorial/view3.pos");
+  if(!chooser){
+    chooser = new _connectionChooser;
+    int h = 4 * WB + 10 * BH, w = 4 * BB + 2 * WB;
+    chooser->window = new Fl_Double_Window(w, h);
+    chooser->window->set_modal();
+    chooser->input = new Fl_Input(WB, WB, w - 2 * WB, BH);
+    chooser->browser = new ConnectionBrowser
+      (WB, 2 * WB + BH, w - 2 * WB, h - 2 * BH - 4 * WB);
+    chooser->browser->callback(select_cb);
+    chooser->cancel = new Fl_Button
+      (w - 2 * WB - 2 * BB, h - WB - BH, BB, BH, "Cancel");
+    chooser->ok = new Fl_Return_Button
+      (w - WB - BB, h - WB - BH, BB, BH, "Run");
+    chooser->box = new Fl_Box(WB, h - WB - BB, WB, WB);
+    chooser->box->hide();
+    chooser->window->resizable(chooser->box);
+  }
+
+  Fl_Preferences prefs(Fl_Preferences::USER, "fltk.org", "gmsh");
+
+  int old = chooser->browser->value();
+  chooser->browser->clear();
+  for (int i = 0; i < 100; i ++) {
+    char name[256], value[1024];
+    sprintf(name, "connection%02d", i);
+    if(prefs.entryExists(name)){
+      prefs.get(name, value, "", sizeof(value));
+      chooser->browser->add(value);
+    }
+  }
+  int n = chooser->browser->size();
+  if(n){
+    if(old > 0 && old <= n)
+      chooser->input->value(chooser->browser->text(old));
+    else
+      chooser->input->value(chooser->browser->text(n));
+  }
+  else
+    chooser->input->value("./gmsh ../tutorial/view3.pos");
+  
+  chooser->window->show();
 
-  if(exe) return std::string(exe);
+  while(chooser->window->shown()){
+    Fl::wait();
+    for (;;) {
+      Fl_Widget* o = Fl::readqueue();
+      if (!o) break;
+      if (o == chooser->ok) {
+        chooser->browser->add(chooser->input->value());
+        chooser->browser->save(prefs);
+        chooser->window->hide();
+        return chooser->input->value();
+      }
+      if (o == chooser->window || o == chooser->cancel){
+        chooser->browser->save(prefs);
+        chooser->window->hide();
+        return "";
+      }
+    }
+  }
   return "";
 }
-- 
GitLab