diff -Naur espws-2.0-orig/FileChooser.cxx espws-2.0/FileChooser.cxx --- espws-2.0-orig/FileChooser.cxx Tue Feb 29 10:45:55 2000 +++ espws-2.0/FileChooser.cxx Mon Jul 23 18:27:45 2001 @@ -128,7 +128,7 @@ { Fl_Choice* o = dirMenu = new Fl_Choice(75, 10, 200, 25, "Directory:"); o->callback((Fl_Callback*)cb_dirMenu); } - { Fl_Button* o = new Fl_Button(340, 10, 25, 25); + { Fl_Button* o = allFiles = new Fl_Button(340, 10, 25, 25); bitmap_allfiles.label(o); o->labelsize(28); o->labelcolor(4); @@ -140,6 +140,7 @@ o->end(); } window->size_range(345, 270, 345); +directory_chooser_ = false; fileList->filter(p); type(t); value(d); @@ -216,6 +217,14 @@ } void FileChooser::type(int t) { + if (t == DIRECTORY) + { + t = SINGLE; + directory_chooser_ = true; + allFiles->deactivate(); + fileList->filter("-_-_-_-_-_-"); /* Match that! */ + } + type_ = t; if (t == MULTI) fileList->type(FL_MULTI_BROWSER); diff -Naur espws-2.0-orig/FileChooser.h espws-2.0/FileChooser.h --- espws-2.0-orig/FileChooser.h Tue Feb 29 10:45:55 2000 +++ espws-2.0/FileChooser.h Mon Jul 23 18:27:45 2001 @@ -15,7 +15,7 @@ class FileChooser { public: - enum { SINGLE, MULTI, CREATE }; + enum { SINGLE, MULTI, CREATE, DIRECTORY }; FileChooser(const char *d, const char *p, int t, const char *title); private: Fl_Window *window; @@ -41,10 +41,12 @@ Fl_Choice *dirMenu; inline void cb_dirMenu_i(Fl_Choice*, void*); static void cb_dirMenu(Fl_Choice*, void*); + Fl_Button *allFiles; inline void cb_allfiles_i(Fl_Button*, void*); static void cb_allfiles(Fl_Button*, void*); char directory_[1024]; int type_; + int directory_chooser_; void fileListCB(); void fileNameCB(); void newdir(); diff -Naur espws-2.0-orig/FileChooser2.cxx espws-2.0/FileChooser2.cxx --- espws-2.0-orig/FileChooser2.cxx Tue Jan 4 05:45:51 2000 +++ espws-2.0/FileChooser2.cxx Mon Jul 23 18:27:45 2001 @@ -170,7 +170,7 @@ pathname[sizeof(pathname) - 1] = '\0'; } - if (filename_isdir(pathname)) + if (filename_isdir(pathname) && !directory_chooser_) return (0); else return (1); @@ -189,7 +189,7 @@ pathname[sizeof(pathname) - 1] = '\0'; } - if (!filename_isdir(pathname)) + if (!filename_isdir(pathname) || directory_chooser_) count ++; } @@ -209,6 +209,16 @@ const char *name; // Current filename static char pathname[1024]; // Filename + directory +// There seems to be a little bit of a bug...sometimes +// the returned path can start with '//'. I think the +// Unix file system handles this OK ("ls //tmp" works), +// but lets clean it up anyway. + + if (strlen (directory_) >= 2 && + directory_[0] == '/' && directory_[1] == '/') + { + memmove (directory_, directory_ + 1, strlen (directory_)); + } if (type_ != MULTI) { @@ -227,7 +237,7 @@ name = fileList->text(i); sprintf(pathname, "%s/%s", directory_, name); - if (!filename_isdir(pathname)) + if (!filename_isdir(pathname) || directory_chooser_) { // Nope, see if this this is "the one"... count ++; @@ -427,7 +437,7 @@ { fileName->value(filename); - if (!filename_isdir(pathname)) + if (!filename_isdir(pathname) || directory_chooser_) okButton->activate(); } } @@ -487,10 +497,10 @@ // Enter pressed - select or change directory... #if defined(WIN32) || defined(__EMX__) - if ((strlen(pathname) == 2 && pathname[1] == ':') || - filename_isdir(pathname)) + if (((strlen(pathname) == 2 && pathname[1] == ':') || + filename_isdir(pathname)) && !directory_chooser_) #else - if (filename_isdir(pathname)) + if (filename_isdir(pathname) && !directory_chooser_) #endif /* WIN32 || __EMX__ */ directory(pathname); else if (type_ == CREATE || access(pathname, 0) == 0) @@ -622,7 +632,7 @@ sprintf(pathname, "%s/%s", directory_, fileName->value()); if ((type_ == CREATE || access(pathname, 0) == 0) && - !filename_isdir(pathname)) + (!filename_isdir(pathname) || directory_chooser_)) okButton->activate(); else okButton->deactivate();