From 83e8e351c39166a7c0aec6256b299ee8bdf3a375 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Wed, 10 Mar 2010 07:04:26 +0000
Subject: [PATCH] - add watch in menu

---
 Common/DefaultOptions.h   |  2 +-
 Fltk/fieldWindow.cpp      |  2 +-
 Fltk/fileDialogs.cpp      | 35 ++++++++++++++++++++++-------------
 Fltk/fileDialogs.h        |  9 ++++++++-
 Fltk/menuWindow.cpp       | 26 ++++++++++++++++++--------
 Fltk/messageWindow.cpp    |  2 +-
 Fltk/projectionEditor.cpp |  8 ++++----
 Fltk/solverWindow.cpp     |  6 +++---
 8 files changed, 58 insertions(+), 32 deletions(-)

diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h
index c4d4e653e7..9ebe7dd8b3 100644
--- a/Common/DefaultOptions.h
+++ b/Common/DefaultOptions.h
@@ -99,7 +99,7 @@ StringXString GeneralOptions_String[] = {
 #endif
     "System command to launch a web browser" },
 
-  { F|0, "WatchFilePattern", opt_general_watch_file_pattern , "" ,
+  { F, "WatchFilePattern", opt_general_watch_file_pattern , "" ,
      "Pattern of files to merge as they become available"},
 
    { 0, 0 , 0 , "" , 0 }
diff --git a/Fltk/fieldWindow.cpp b/Fltk/fieldWindow.cpp
index 65225863fa..56a37a9ff3 100644
--- a/Fltk/fieldWindow.cpp
+++ b/Fltk/fieldWindow.cpp
@@ -83,7 +83,7 @@ static void field_put_on_view_cb(Fl_Widget *w, void *data)
 static void field_select_file_cb(Fl_Widget *w, void *data)
 {
   Fl_Input *input = (Fl_Input*)data;
-  int ret = fileChooser(0, 0, "File selection", "", input->value());
+  int ret = fileChooser(FILE_CHOOSER_SINGLE, "Choose", "", input->value());
   if(ret){
     input->value(fileChooserGetName(0).c_str());
     input->set_changed();
diff --git a/Fltk/fileDialogs.cpp b/Fltk/fileDialogs.cpp
index d1d62cd1ae..f29d1b2823 100644
--- a/Fltk/fileDialogs.cpp
+++ b/Fltk/fileDialogs.cpp
@@ -22,6 +22,7 @@
 #include "GmshMessage.h"
 #include "GmshDefines.h"
 #include "FlGui.h"
+#include "fileDialogs.h"
 #include "CreateFile.h"
 #include "Options.h"
 #include "GModel.h"
@@ -75,7 +76,7 @@ static flFileChooser *fc = 0;
 
 #endif
 
-int fileChooser(int multi, int create, const char *message,
+int fileChooser(FILE_CHOOSER_TYPE type, const char *message,
                 const char *filter, const char *fname)
 {
   static char thefilter[1024] = "";
@@ -89,12 +90,16 @@ int fileChooser(int multi, int create, const char *message,
 
 #if defined(HAVE_NATIVE_FILE_CHOOSER)
   if(!fc) fc = new Fl_Native_File_Chooser();
-  if(multi)
-    fc->type(Fl_Native_File_Chooser::BROWSE_MULTI_FILE);
-  else if(create)
-    fc->type(Fl_Native_File_Chooser::BROWSE_SAVE_FILE);
-  else
-    fc->type(Fl_Native_File_Chooser::BROWSE_FILE);
+  switch(type){
+  case FILE_CHOOSER_MULTI: 
+    fc->type(Fl_Native_File_Chooser::BROWSE_MULTI_FILE); break;
+  case FILE_CHOOSER_CREATE:
+    fc->type(Fl_Native_File_Chooser::BROWSE_SAVE_FILE); break;
+  case FILE_CHOOSER_DIRECTORY:
+    fc->type(Fl_Native_File_Chooser::BROWSE_DIRECTORY); break;
+  default:
+    fc->type(Fl_Native_File_Chooser::BROWSE_FILE); break;
+  }
   fc->title(message);
   fc->filter(filter);
   fc->filter_value(thefilterindex);
@@ -119,12 +124,16 @@ int fileChooser(int multi, int create, const char *message,
     fc->position(CTX::instance()->fileChooserPosition[0], 
                  CTX::instance()->fileChooserPosition[1]);
   }
-  if(multi)
-    fc->type(Fl_File_Chooser::MULTI);
-  else if(create)
-    fc->type(Fl_File_Chooser::CREATE);
-  else
-    fc->type(Fl_File_Chooser::SINGLE);
+  switch(type){
+  case FILE_CHOOSER_MULTI: 
+    fc->type(Fl_File_Chooser::MULTI); break;
+  case FILE_CHOOSER_CREATE:
+    fc->type(Fl_File_Chooser::CREATE); break;
+  case FILE_CHOOSER_DIRECTORY:
+    fc->type(Fl_File_Chooser::DIRECTORY); break;
+  default:
+    fc->type(Fl_File_Chooser::SINGLE); break;
+  }
   fc->label(message);
   fc->filter(thefilter);
   fc->filter_value(thefilterindex);
diff --git a/Fltk/fileDialogs.h b/Fltk/fileDialogs.h
index e1dab6f5e8..5c1b92eda9 100644
--- a/Fltk/fileDialogs.h
+++ b/Fltk/fileDialogs.h
@@ -8,7 +8,14 @@
 
 #include <string>
 
-int fileChooser(int multi, int create, const char *message,
+typedef enum {
+  FILE_CHOOSER_SINGLE, 
+  FILE_CHOOSER_MULTI, 
+  FILE_CHOOSER_CREATE, 
+  FILE_CHOOSER_DIRECTORY 
+} FILE_CHOOSER_TYPE;
+
+int fileChooser(FILE_CHOOSER_TYPE type, const char *message,
                 const char *pat, const char *fname=NULL);
 std::string fileChooserGetName(int num);
 int fileChooserGetFilter();
diff --git a/Fltk/menuWindow.cpp b/Fltk/menuWindow.cpp
index 71873fc7a3..cdb68cc71a 100644
--- a/Fltk/menuWindow.cpp
+++ b/Fltk/menuWindow.cpp
@@ -55,7 +55,7 @@
 static void file_new_cb(Fl_Widget *w, void *data)
 {
  test:
-  if(fileChooser(0, 1, "New", "*")) {
+  if(fileChooser(FILE_CHOOSER_CREATE, "New", "*")) {
     std::string name = fileChooserGetName(1);
     if(!StatFile(name)){
       if(fl_choice("File '%s' already exists.\n\nDo you want to erase it?",
@@ -122,7 +122,7 @@ static const char *input_formats =
 static void file_open_cb(Fl_Widget *w, void *data)
 {
   int n = PView::list.size();
-  if(fileChooser(0, 0, "Open", input_formats)) {
+  if(fileChooser(FILE_CHOOSER_SINGLE, "Open", input_formats)) {
     OpenProject(fileChooserGetName(1));
     drawContext::global()->draw();
   }
@@ -133,7 +133,7 @@ static void file_open_cb(Fl_Widget *w, void *data)
 static void file_merge_cb(Fl_Widget *w, void *data)
 {
   int n = PView::list.size();
-  int f = fileChooser(1, 0, "Merge", input_formats);
+  int f = fileChooser(FILE_CHOOSER_MULTI, "Merge", input_formats);
   if(f) {
     for(int i = 1; i <= f; i++)
       MergeFile(fileChooserGetName(i));
@@ -355,7 +355,7 @@ static void file_save_as_cb(Fl_Widget *w, void *data)
   }
 
  test:
-  if(fileChooser(0, 1, "Save As", pat)) {
+  if(fileChooser(FILE_CHOOSER_CREATE, "Save As", pat)) {
     std::string name = fileChooserGetName(1);
     if(CTX::instance()->confirmOverwrite) {
       if(!StatFile(name))
@@ -394,7 +394,8 @@ static void file_options_save_cb(Fl_Widget *w, void *data)
 static void file_rename_cb(Fl_Widget *w, void *data)
 {
  test:
-  if(fileChooser(0, 1, "Rename", "*", GModel::current()->getFileName().c_str())) {
+  if(fileChooser(FILE_CHOOSER_CREATE, "Rename", "*",
+                 GModel::current()->getFileName().c_str())) {
     std::string name = fileChooserGetName(1);
     if(CTX::instance()->confirmOverwrite) {
       if(!StatFile(name))
@@ -417,6 +418,12 @@ void file_quit_cb(Fl_Widget *w, void *data)
 
 void file_watch_cb(Fl_Widget *w, void *data)
 {
+  if(w){
+    if(fileChooser(FILE_CHOOSER_CREATE, "Watch Pattern", "*")) {
+      CTX::instance()->watchFilePattern = fileChooserGetName(1);
+    }
+  }
+
   if(CTX::instance()->watchFilePattern.empty()) return;
 
   std::string pattern = FixRelativePath
@@ -2154,7 +2161,8 @@ static void view_save_as(int index, const char *title, int format)
   PView *view = PView::list[index];
   
  test:
-  if(fileChooser(0, 1, title, "*", view->getData()->getFileName().c_str())){
+  if(fileChooser(FILE_CHOOSER_CREATE, title, "*", 
+                 view->getData()->getFileName().c_str())){
     std::string name = fileChooserGetName(1);
     if(CTX::instance()->confirmOverwrite) {
       if(!StatFile(name))
@@ -2280,7 +2288,7 @@ static Fl_Menu_Item bar_table[] = {
   {"&File", 0, 0, 0, FL_SUBMENU},
     {"&New...",     FL_CTRL+'n', (Fl_Callback *)file_new_cb, 0},
     {"&Open...",    FL_CTRL+'o', (Fl_Callback *)file_open_cb, 0},
-    {"Open recent", 0, 0, 0, FL_SUBMENU},
+    {"Open Recent", 0, 0, 0, FL_SUBMENU},
       {"History1", 0, 0, 0, FL_MENU_INVISIBLE},
       {"History2", 0, 0, 0, FL_MENU_INVISIBLE},
       {"History3", 0, 0, 0, FL_MENU_INVISIBLE},
@@ -2288,6 +2296,7 @@ static Fl_Menu_Item bar_table[] = {
       {"History5", 0, 0, 0, FL_MENU_INVISIBLE},
       {0},
     {"M&erge...",   FL_CTRL+FL_SHIFT+'o', (Fl_Callback *)file_merge_cb, 0},
+    {"Watch Pattern...",    0, (Fl_Callback *)file_watch_cb, 0},
     {"&Clear",      0, (Fl_Callback *)file_clear_cb, 0, FL_MENU_DIVIDER},
     {"Remote", 0, 0, 0, FL_MENU_DIVIDER | FL_SUBMENU},
       {"Start...",  0, (Fl_Callback *)file_remote_cb, (void*)"start"},
@@ -2340,7 +2349,7 @@ static Fl_Menu_Item sysbar_table[] = {
     {"New...",     FL_META+'n', (Fl_Callback *)file_new_cb, 0},
     {"Open...",    FL_META+'o', (Fl_Callback *)file_open_cb, 0},
   /* system menu bar is not dynamic in fltk 1.1; it will be in fltk 1.3
-    {"Open recent", 0, 0, 0, FL_SUBMENU},
+    {"Open Recent", 0, 0, 0, FL_SUBMENU},
       {"History1", 0, 0, 0, FL_MENU_INVISIBLE},
       {"History2", 0, 0, 0, FL_MENU_INVISIBLE},
       {"History3", 0, 0, 0, FL_MENU_INVISIBLE},
@@ -2349,6 +2358,7 @@ static Fl_Menu_Item sysbar_table[] = {
       {0},
   */
     {"Merge...",   FL_META+FL_SHIFT+'o', (Fl_Callback *)file_merge_cb, 0},
+    {"Watch Pattern...",   0, (Fl_Callback *)file_watch_cb, 0},
     {"Clear",      0, (Fl_Callback *)file_clear_cb, 0, FL_MENU_DIVIDER},
     {"Remote", 0, 0, 0, FL_MENU_DIVIDER | FL_SUBMENU},
       {"Start...",  0, (Fl_Callback *)file_remote_cb, (void*)"start"},
diff --git a/Fltk/messageWindow.cpp b/Fltk/messageWindow.cpp
index 33d040f751..e752817a02 100644
--- a/Fltk/messageWindow.cpp
+++ b/Fltk/messageWindow.cpp
@@ -52,7 +52,7 @@ static void message_clear_cb(Fl_Widget *w, void *data)
 static void message_save_cb(Fl_Widget *w, void *data)
 {
  test:
-  if(fileChooser(0, 1, "Save", "*")) {
+  if(fileChooser(FILE_CHOOSER_CREATE, "Save", "*")) {
     std::string name = fileChooserGetName(1);
     if(CTX::instance()->confirmOverwrite) {
       if(!StatFile(name))
diff --git a/Fltk/projectionEditor.cpp b/Fltk/projectionEditor.cpp
index 5cd4c4a8a5..13550fe04a 100644
--- a/Fltk/projectionEditor.cpp
+++ b/Fltk/projectionEditor.cpp
@@ -418,7 +418,7 @@ static void proj_hide_cb(Fl_Widget *w, void *data)
 static void save_selection_cb(Fl_Widget *w, void *data)
 {
   projectionEditor *e = (projectionEditor*)data;
-  if(fileChooser(0, 1, "Save Selection", "*.{geo,msh}")){
+  if(fileChooser(FILE_CHOOSER_CREATE, "Save Selection", "*.{geo,msh}")){
     FILE *fp = fopen(fileChooserGetName(1).c_str(), "w");
     if(!fp){
       Msg::Error("Unable to open file `%s'", fileChooserGetName(1).c_str());
@@ -458,7 +458,7 @@ static void save_selection_cb(Fl_Widget *w, void *data)
 static void load_projection_cb(Fl_Widget *w, void *data)
 {
   projectionEditor *e = (projectionEditor*)data;
-  if(fileChooser(0, 0, "Load Projection", "*.pro")){
+  if(fileChooser(FILE_CHOOSER_SINGLE, "Load Projection", "*.pro")){
     FILE *fp = fopen(fileChooserGetName(1).c_str(), "r");
     if(!fp){
       Msg::Error("Unable to open file `%s'", fileChooserGetName(1).c_str());
@@ -502,7 +502,7 @@ static void save_projection_cb(Fl_Widget *w, void *data)
   projection *p = e->getCurrentProjection();
   if(p){
     FM::ProjectionSurface *ps = (FM::ProjectionSurface*)p->face->getNativePtr();
-    if(fileChooser(0, 1, "Save Projection", "*.pro")){
+    if(fileChooser(FILE_CHOOSER_CREATE, "Save Projection", "*.pro")){
       std::string name = fileChooserGetName(1);
       FILE *fp = fopen(name.c_str(), "w");
       if(!fp){
@@ -688,7 +688,7 @@ static void action_cb(Fl_Widget *w, void *data)
       delete_fourier(faces[i]);
   }
   else{
-    if(fileChooser(0, 1, "Save Fourier Model", "*.fm")){
+    if(fileChooser(FILE_CHOOSER_CREATE, "Save Fourier Model", "*.fm")){
       FILE *fp = fopen(fileChooserGetName(1).c_str(), "w");
       if(!fp){
         Msg::Error("Unable to open file `%s'", fileChooserGetName(1).c_str());
diff --git a/Fltk/solverWindow.cpp b/Fltk/solverWindow.cpp
index 4330149046..3341047800 100644
--- a/Fltk/solverWindow.cpp
+++ b/Fltk/solverWindow.cpp
@@ -339,7 +339,7 @@ static void solver_choose_executable_cb(Fl_Widget *w, void *data)
   pattern += ".exe";
 #endif
 
-  if(fileChooser(0, 0, "Choose", pattern.c_str())){
+  if(fileChooser(FILE_CHOOSER_SINGLE, "Choose", pattern.c_str())){
     FlGui::instance()->solver[num]->input[2]->value(fileChooserGetName(1).c_str());
     solver_ok_cb(w, data);
   }
@@ -350,7 +350,7 @@ static void solver_file_open_cb(Fl_Widget *w, void *data)
   int num = (int)(long)data;
   std::string pattern = "*" + ConnectionManager::get(num)->inputFileExtension;
 
-  if(fileChooser(0, 0, "Choose", pattern.c_str())) {
+  if(fileChooser(FILE_CHOOSER_SINGLE, "Choose", pattern.c_str())) {
     FlGui::instance()->solver[num]->input[0]->value(fileChooserGetName(1).c_str());
     solver_ok_cb(w, data);
   }
@@ -367,7 +367,7 @@ static void solver_file_edit_cb(Fl_Widget *w, void *data)
 static void solver_choose_mesh_cb(Fl_Widget *w, void *data)
 {
   int num = (int)(long)data;
-  if(fileChooser(0, 0, "Choose", "*.msh")){
+  if(fileChooser(FILE_CHOOSER_SINGLE, "Choose", "*.msh")){
     FlGui::instance()->solver[num]->input[1]->value(fileChooserGetName(1).c_str());
     solver_ok_cb(w, data);
   }
-- 
GitLab