summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael R Sweet <michael.r.sweet@gmail.com>2002-05-01 12:41:21 +0000
committerMichael R Sweet <michael.r.sweet@gmail.com>2002-05-01 12:41:21 +0000
commit94a9fb879f3bb31785ddca44c6bbaba5283da136 (patch)
tree6be38779406339f510975a43d8bb967ac3a4960d
parent3a33fc7d818cb336bad2cc81a1dc821f6b75f5d0 (diff)
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
-rw-r--r--CHANGES6
-rw-r--r--FL/Fl_File_Chooser.H4
-rw-r--r--documentation/functions.html46
-rw-r--r--src/Fl_File_Chooser.cxx5
-rw-r--r--src/Fl_File_Chooser.fl8
-rw-r--r--src/Fl_File_Chooser2.cxx24
-rw-r--r--src/fl_file_dir.cxx38
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</A>.
<LI><A HREF="#fl_choice2"><TT>fl_choice</TT></A></LI>
<LI><A HREF="#fl_color_chooser_func"><TT>fl_color_chooser</TT></A></LI>
<LI><A HREF="#fl_color_cube"><TT>fl_color_cube</TT></A></LI>
+ <LI><A HREF="#fl_dir_chooser"><TT>fl_dir_chooser</TT></A></LI>
<LI><A HREF="#fl_file_chooser2"><TT>fl_file_chooser</TT></A></LI>
<LI><A HREF="#fl_file_chooser_callback"><TT>fl_file_chooser_callback</TT></A></LI>
<LI><A HREF="#fl_filename_absolute"><TT>fl_filename_absolute</TT></A></LI>
@@ -50,6 +51,7 @@ A</A>.
<LI><A HREF="#fl_beep"><TT>fl_beep</TT></A></LI>
<LI><A HREF="#fl_choice2"><TT>fl_choice</TT></A></LI>
<LI><A HREF="#fl_color_chooser_func"><TT>fl_color_chooser</TT></A></LI>
+ <LI><A HREF="#fl_dir_chooser"><TT>fl_dir_chooser</TT></A></LI>
<LI><A HREF="#fl_file_chooser2"><TT>fl_file_chooser</TT></A></LI>
<LI><A HREF="#fl_file_chooser_callback"><TT>fl_file_chooser_callback</TT></A></LI>
<LI><A HREF="#fl_input2"><TT>fl_input</TT></A></LI>
@@ -327,6 +329,44 @@ fl_color_cube(R * (FL_NUM_RED - 1) / 255,
<!-- NEED 4in -->
+<H2><A NAME="fl_dir_chooser">fl_dir_chooser</A></H2>
+
+<HR>
+
+<H3>Include Files</H3>
+
+<UL><PRE>
+#include &lt;FL/Fl_File_Chooser.H&gt;
+</PRE></UL>
+
+<H3>Prototype</H3>
+
+<UL><PRE>
+char *fl_dir_chooser(const char * message, const char *fname, int relative = 0);
+</PRE></UL>
+
+<H3>Description</H3>
+
+<P>The <tt>fl_dir_chooser()</tt> function displays a <A
+HREF="Fl_File_Chooser.html"><tt>Fl_File_Chooser</tt></A> dialog
+so that the user can choose a directory.
+
+<P><tt>message</tt> is a string used to title the window.
+
+<P><tt>fname</tt> is a default filename to fill in the chooser
+with. If this is <tt>NULL</tt> then the last filename that was
+choosen is used. The first time the file chooser is called this
+defaults to a blank string.
+
+<P><tt>relative</tt> specifies whether the returned filename
+should be relative (any non-zero value) or absolute (0). The
+default is to return absolute paths.
+
+<P>The returned value points at a static buffer that is only
+good until the next time <tt>fl_dir_chooser()</tt> is called.
+
+
+<!-- NEED 4in -->
<H2><A NAME="fl_file_chooser2">fl_file_chooser</A></H2>
<HR>
@@ -340,7 +380,7 @@ fl_color_cube(R * (FL_NUM_RED - 1) / 255,
<H3>Prototype</H3>
<UL><PRE>
-char *fl_file_chooser(const char * message, const char *pattern, const char *fname);
+char *fl_file_chooser(const char * message, const char *pattern, const char *fname, int relative = 0);
</PRE></UL>
<H3>Description</H3>
@@ -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.
+<P><tt>relative</tt> specifies whether the returned filename
+should be relative (any non-zero value) or absolute (0). The
+default is to return absolute paths.
+
<P>The returned value points at a static buffer that is only
good until the next time <tt>fl_file_chooser()</tt> 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 $".
//