From 94a9fb879f3bb31785ddca44c6bbaba5283da136 Mon Sep 17 00:00:00 2001 From: Michael R Sweet Date: Wed, 1 May 2002 12:41:21 +0000 Subject: Fix backspace "bug" in file chooser - now treat delete and backspace the same, eliminating any filename completion value. Added relative argument to fl_file_chooser() and fl_dir_chooser(); both default to 0 (return absolute paths) Give focus to the filename field in the chooser when show() is called. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@2157 ea41ed52-d2ee-0310-a9c1-e6b18d33e121 --- CHANGES | 6 ++++++ FL/Fl_File_Chooser.H | 4 ++-- documentation/functions.html | 46 +++++++++++++++++++++++++++++++++++++++++++- src/Fl_File_Chooser.cxx | 5 +++-- src/Fl_File_Chooser.fl | 8 ++++---- src/Fl_File_Chooser2.cxx | 24 +++++++++++------------ src/fl_file_dir.cxx | 38 +++++++++++++++++++++++++----------- 7 files changed, 99 insertions(+), 32 deletions(-) diff --git a/CHANGES b/CHANGES index efbfaa98c..4a14936ad 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,11 @@ CHANGES IN FLTK 1.1.0rc1 + - The fl_file_chooser() and fl_dir_chooser() functions + now support an optional "relative" argument to get + relative pathnames; the default is to return absolute + pathnames. + - The backspace and delete keys now work as expected in + the file chooser when doing filename completion. - FLUID now supports running shell commands. - New Fl_File_Input widget that shows directory separators with filename in input field. diff --git a/FL/Fl_File_Chooser.H b/FL/Fl_File_Chooser.H index 702482618..b778587a1 100644 --- a/FL/Fl_File_Chooser.H +++ b/FL/Fl_File_Chooser.H @@ -84,7 +84,7 @@ public: static const char *filename_label; static const char *filter_label; }; -extern FL_EXPORT char *fl_dir_chooser(const char *message,const char *fname); -extern FL_EXPORT char *fl_file_chooser(const char *message,const char *pat,const char *fname); +extern FL_EXPORT char *fl_dir_chooser(const char *message,const char *fname,int relative=0); +extern FL_EXPORT char *fl_file_chooser(const char *message,const char *pat,const char *fname,int relative=0); extern FL_EXPORT void fl_file_chooser_callback(void (*cb)(const char*)); #endif diff --git a/documentation/functions.html b/documentation/functions.html index 6dd68e13e..24d42a23d 100644 --- a/documentation/functions.html +++ b/documentation/functions.html @@ -17,6 +17,7 @@ A.
  • fl_choice
  • fl_color_chooser
  • fl_color_cube
  • +
  • fl_dir_chooser
  • fl_file_chooser
  • fl_file_chooser_callback
  • fl_filename_absolute
  • @@ -50,6 +51,7 @@ A.
  • fl_beep
  • fl_choice
  • fl_color_chooser
  • +
  • fl_dir_chooser
  • fl_file_chooser
  • fl_file_chooser_callback
  • fl_input
  • @@ -326,6 +328,44 @@ fl_color_cube(R * (FL_NUM_RED - 1) / 255, + +

    fl_dir_chooser

    + +
    + +

    Include Files

    + + + +

    Prototype

    + + + +

    Description

    + +

    The fl_dir_chooser() function displays a Fl_File_Chooser dialog +so that the user can choose a directory. + +

    message is a string used to title the window. + +

    fname is a default filename to fill in the chooser +with. If this is NULL then the last filename that was +choosen is used. The first time the file chooser is called this +defaults to a blank string. + +

    relative specifies whether the returned filename +should be relative (any non-zero value) or absolute (0). The +default is to return absolute paths. + +

    The returned value points at a static buffer that is only +good until the next time fl_dir_chooser() is called. + +

    fl_file_chooser

    @@ -340,7 +380,7 @@ fl_color_cube(R * (FL_NUM_RED - 1) / 255,

    Prototype

    Description

    @@ -371,6 +411,10 @@ choosen is used (unless that had a different pattern, in which case just the last directory with no name is used). The first time the file chooser is called this defaults to a blank string. +

    relative specifies whether the returned filename +should be relative (any non-zero value) or absolute (0). The +default is to return absolute paths. +

    The returned value points at a static buffer that is only good until the next time fl_file_chooser() is called. diff --git a/src/Fl_File_Chooser.cxx b/src/Fl_File_Chooser.cxx index ca734ae1e..932690caf 100644 --- a/src/Fl_File_Chooser.cxx +++ b/src/Fl_File_Chooser.cxx @@ -211,6 +211,7 @@ const char * Fl_File_Chooser::label() { void Fl_File_Chooser::show() { window->hotspot(fileList); window->show(); +fileName->take_focus(); } int Fl_File_Chooser::shown() { @@ -264,6 +265,6 @@ int Fl_File_Chooser::type() { int Fl_File_Chooser::visible() { return window->visible(); } -FL_EXPORT char *fl_dir_chooser(const char *message,const char *fname); -FL_EXPORT char *fl_file_chooser(const char *message,const char *pat,const char *fname); +FL_EXPORT char *fl_dir_chooser(const char *message,const char *fname,int relative=0); +FL_EXPORT char *fl_file_chooser(const char *message,const char *pat,const char *fname,int relative=0); FL_EXPORT void fl_file_chooser_callback(void (*cb)(const char*)); diff --git a/src/Fl_File_Chooser.fl b/src/Fl_File_Chooser.fl index f78da0404..56f9175c9 100644 --- a/src/Fl_File_Chooser.fl +++ b/src/Fl_File_Chooser.fl @@ -150,8 +150,8 @@ rescan();} {} Function {show()} {open return_type void } { code {window->hotspot(fileList); -window->show();} {selected - } +window->show(); +fileName->take_focus();} {} } Function {shown()} {return_type int } { @@ -217,10 +217,10 @@ else } } -decl {FL_EXPORT char *fl_dir_chooser(const char *message,const char *fname);} {public +decl {FL_EXPORT char *fl_dir_chooser(const char *message,const char *fname,int relative=0);} {public } -decl {FL_EXPORT char *fl_file_chooser(const char *message,const char *pat,const char *fname);} {public +decl {FL_EXPORT char *fl_file_chooser(const char *message,const char *pat,const char *fname,int relative=0);} {selected public } decl {FL_EXPORT void fl_file_chooser_callback(void (*cb)(const char*));} {public diff --git a/src/Fl_File_Chooser2.cxx b/src/Fl_File_Chooser2.cxx index 57696eb11..9a08dbb01 100644 --- a/src/Fl_File_Chooser2.cxx +++ b/src/Fl_File_Chooser2.cxx @@ -1,5 +1,5 @@ // -// "$Id: Fl_File_Chooser2.cxx,v 1.1.2.10 2002/05/01 08:51:59 easysw Exp $" +// "$Id: Fl_File_Chooser2.cxx,v 1.1.2.11 2002/05/01 12:41:21 easysw Exp $" // // More Fl_File_Chooser routines. // @@ -575,7 +575,8 @@ Fl_File_Chooser::fileNameCB() fl_alert("Please choose an existing file!"); } } - else if (Fl::event_key() != FL_Delete) + else if (Fl::event_key() != FL_Delete && + Fl::event_key() != FL_BackSpace) { // Check to see if the user has entered a directory... if ((slash = strrchr(pathname, '/')) == NULL) @@ -673,17 +674,11 @@ Fl_File_Chooser::fileNameCB() fileName->replace(filename - pathname, filename - pathname + min_match, matchname); - // Highlight it; if the user just pressed the backspace - // key, position the cursor at the start of the selection. - // Otherwise, put the cursor at the end of the selection so + // Highlight it with the cursor at the end of the selection so // s/he can press the right arrow to accept the selection // (Tab and End also do this for both cases.) - if (Fl::event_key() == FL_BackSpace) - fileName->position(filename - pathname + min_match - 1, - filename - pathname + max_match); - else - fileName->position(filename - pathname + max_match, - filename - pathname + min_match); + fileName->position(filename - pathname + max_match, + filename - pathname + min_match); } else if (max_match == 0) { fileList->deselect(0); @@ -696,10 +691,15 @@ Fl_File_Chooser::fileNameCB() okButton->activate(); else okButton->deactivate(); + } else { + // FL_Delete or FL_BackSpace + fileList->deselect(0); + fileList->redraw(); + okButton->deactivate(); } } // -// End of "$Id: Fl_File_Chooser2.cxx,v 1.1.2.10 2002/05/01 08:51:59 easysw Exp $". +// End of "$Id: Fl_File_Chooser2.cxx,v 1.1.2.11 2002/05/01 12:41:21 easysw Exp $". // diff --git a/src/fl_file_dir.cxx b/src/fl_file_dir.cxx index c1d0f6d4f..089d1d3ce 100644 --- a/src/fl_file_dir.cxx +++ b/src/fl_file_dir.cxx @@ -1,5 +1,5 @@ // -// "$Id: fl_file_dir.cxx,v 1.1.2.9 2002/04/28 08:42:33 easysw Exp $" +// "$Id: fl_file_dir.cxx,v 1.1.2.10 2002/05/01 12:41:21 easysw Exp $" // // File chooser widget for the Fast Light Tool Kit (FLTK). // @@ -43,9 +43,16 @@ void fl_file_chooser_callback(void (*cb)(const char*)) { } -char* fl_file_chooser(const char* message, const char* pat, const char* fname) -{ - static char retname[1024]; +// +// 'fl_file_chooser()' - Show a file chooser dialog and get a filename. +// + +char * // O - Filename or NULL +fl_file_chooser(const char *message, // I - Message in titlebar + const char *pat, // I - Filename pattern + const char *fname, // I - Initial filename selection + int relative) { // I - 0 for absolute path + static char retname[1024]; // Returned filename if (!fc) { if (!fname || !*fname) fname = "."; @@ -88,17 +95,25 @@ char* fl_file_chooser(const char* message, const char* pat, const char* fname) while (fc->shown()) Fl::wait(); - if (fc->value()) { + if (fc->value() && relative) { fl_filename_relative(retname, sizeof(retname), fc->value()); return retname; - } else return 0; + } else if (fc->value()) return fc->value(); + else return 0; } -char* fl_dir_chooser(const char* message, const char* fname) +// +// 'fl_dir_chooser()' - Show a file chooser dialog and get a directory. +// + +char * // O - Directory or NULL +fl_dir_chooser(const char *message, // I - Message for titlebar + const char *fname, // I - Initial directory name + int relative) // I - 0 for absolute { - static char retname[1024]; + static char retname[1024]; // Returned directory name if (!fname || !*fname) fname = "."; @@ -118,14 +133,15 @@ char* fl_dir_chooser(const char* message, const char* fname) while (fc->shown()) Fl::wait(); - if (fc->value()) { + if (fc->value() && relative) { fl_filename_relative(retname, sizeof(retname), fc->value()); return retname; - } else return 0; + } else if (fc->value) return fc->value(); + else return 0; } // -// End of "$Id: fl_file_dir.cxx,v 1.1.2.9 2002/04/28 08:42:33 easysw Exp $". +// End of "$Id: fl_file_dir.cxx,v 1.1.2.10 2002/05/01 12:41:21 easysw Exp $". // -- cgit v1.2.3