summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Fl_File_Chooser2.cxx212
1 files changed, 55 insertions, 157 deletions
diff --git a/src/Fl_File_Chooser2.cxx b/src/Fl_File_Chooser2.cxx
index 9be64784d..3f3ceb05d 100644
--- a/src/Fl_File_Chooser2.cxx
+++ b/src/Fl_File_Chooser2.cxx
@@ -356,33 +356,6 @@
#include <stdlib.h>
#include "flstring.h"
#include <errno.h>
-#include <sys/types.h>
-
-#if defined(WIN32) || defined(__APPLE__) // PORTME: Fl_Screen_Driver - platform file browser
-#elif defined(FL_PORTING)
-# pragma message "FL_PORTING: implement the internals of your filechooser here"
-// Ouch: this must be in the system driver!
-int mkdir(const char *, unsigned int);
-#else
-#endif
-
-#if defined(WIN32) && ! defined (__CYGWIN__)
-# include <direct.h>
-# include <io.h>
-// Visual C++ 2005 incorrectly displays a warning about the use of POSIX APIs
-// on Windows, which is supposed to be POSIX compliant...
-# define access _access
-# define mkdir _mkdir
-// Apparently Borland C++ defines DIRECTORY in <direct.h>, which
-// interfers with the Fl_File_Icon enumeration of the same name.
-# ifdef DIRECTORY
-# undef DIRECTORY
-# endif // DIRECTORY
-#else
-# include <unistd.h>
-# include <pwd.h>
-#endif /* WIN32 */
-
//
// File chooser label strings and sort function...
@@ -396,11 +369,7 @@ const char *Fl_File_Chooser::custom_filter_label = "Custom Filter";
const char *Fl_File_Chooser::existing_file_label = "Please choose an existing file!";
const char *Fl_File_Chooser::favorites_label = "Favorites";
const char *Fl_File_Chooser::filename_label = "Filename:";
-#ifdef WIN32
-const char *Fl_File_Chooser::filesystems_label = "My Computer";
-#else
-const char *Fl_File_Chooser::filesystems_label = "File Systems";
-#endif // WIN32
+const char *Fl_File_Chooser::filesystems_label = Fl::system_driver()->filesystems_label();
const char *Fl_File_Chooser::manage_favorites_label = "Manage Favorites";
const char *Fl_File_Chooser::new_directory_label = "New Directory?";
const char *Fl_File_Chooser::new_directory_tooltip = "Create a new directory.";
@@ -419,9 +388,6 @@ static int compare_dirnames(const char *a, const char *b);
static void quote_pathname(char *, const char *, int);
static void unquote_pathname(char *, const char *, int);
-// use platform dependent getenv() to get the home directory (STR #3166)
-static const char* get_homedir();
-
//
// 'Fl_File_Chooser::count()' - Return the number of selected files.
//
@@ -475,29 +441,25 @@ Fl_File_Chooser::directory(const char *d)// I - Directory to change to
if (d == NULL)
d = ".";
-#ifdef WIN32
- // See if the filename contains backslashes...
- char *slash; // Pointer to slashes
- char fixpath[FL_PATH_MAX]; // Path with slashes converted
- if (strchr(d, '\\')) {
- // Convert backslashes to slashes...
- strlcpy(fixpath, d, sizeof(fixpath));
+ if (Fl::system_driver()->backslash_as_slash()) {
+ // See if the filename contains backslashes...
+ char *slash; // Pointer to slashes
+ char fixpath[FL_PATH_MAX]; // Path with slashes converted
+ if (strchr(d, '\\')) {
+ // Convert backslashes to slashes...
+ strlcpy(fixpath, d, sizeof(fixpath));
- for (slash = strchr(fixpath, '\\'); slash; slash = strchr(slash + 1, '\\'))
- *slash = '/';
+ for (slash = strchr(fixpath, '\\'); slash; slash = strchr(slash + 1, '\\'))
+ *slash = '/';
- d = fixpath;
+ d = fixpath;
+ }
}
-#endif // WIN32
if (d[0] != '\0')
{
// Make the directory absolute...
-#if (defined(WIN32) && ! defined(__CYGWIN__))|| defined(__EMX__)
- if (d[0] != '/' && d[0] != '\\' && d[1] != ':')
-#else
- if (d[0] != '/' && d[0] != '\\')
-#endif /* WIN32 || __EMX__ */
+ if (d[0] != '/' && d[0] != '\\' && ( !Fl::system_driver()->colon_is_drive() || d[1] != ':' ) )
fl_filename_absolute(directory_, d);
else
strlcpy(directory_, d, sizeof(directory_));
@@ -550,7 +512,7 @@ Fl_File_Chooser::favoritesButtonCB()
if (!v) {
// Add current directory to favorites...
- if (get_homedir()) v = favoritesButton->size() - 5;
+ if (Fl::system_driver()->home_directory_name()) v = favoritesButton->size() - 5;
else v = favoritesButton->size() - 4;
sprintf(menuname, "favorite%02d", v);
@@ -725,13 +687,11 @@ Fl_File_Chooser::fileListCB()
}
if (Fl::event_clicks()) {
-#if (defined(WIN32) && ! defined(__CYGWIN__)) || defined(__EMX__)
- if ((strlen(pathname) == 2 && pathname[1] == ':') ||
- Fl::system_driver()->filename_isdir_quick(pathname))
-#else
- if (Fl::system_driver()->filename_isdir_quick(pathname))
-#endif /* WIN32 || __EMX__ */
- {
+ int condition = 0;
+ if (Fl::system_driver()->colon_is_drive() && strlen(pathname) == 2 && pathname[1] == ':') condition = 1;
+ if (!condition) condition = Fl::system_driver()->filename_isdir_quick(pathname);
+ if (condition)
+ {
// Change directories...
directory(pathname);
@@ -838,13 +798,9 @@ Fl_File_Chooser::fileNameCB()
}
// Make sure we have an absolute path...
-#if (defined(WIN32) && !defined(__CYGWIN__)) || defined(__EMX__)
- if (directory_[0] != '\0' && filename[0] != '/' &&
- filename[0] != '\\' &&
- !(isalpha(filename[0] & 255) && (!filename[1] || filename[1] == ':'))) {
-#else
- if (directory_[0] != '\0' && filename[0] != '/') {
-#endif /* WIN32 || __EMX__ */
+ int condition = directory_[0] != '\0' && filename[0] != '/';
+ if (condition && Fl::system_driver()->colon_is_drive()) condition = !(isalpha(filename[0] & 255) && (!filename[1] || filename[1] == ':'));
+ if (condition) {
fl_filename_absolute(pathname, sizeof(pathname), filename);
value(pathname);
fileName->mark(fileName->position()); // no selection after expansion
@@ -858,16 +814,12 @@ Fl_File_Chooser::fileNameCB()
// Now process things according to the key pressed...
if (Fl::event_key() == FL_Enter || Fl::event_key() == FL_KP_Enter) {
// Enter pressed - select or change directory...
-#if (defined(WIN32) && ! defined(__CYGWIN__)) || defined(__EMX__)
- if ((isalpha(pathname[0] & 255) && pathname[1] == ':' && !pathname[2]) ||
- (Fl::system_driver()->filename_isdir_quick(pathname) &&
- compare_dirnames(pathname, directory_))) {
-#else
- if (Fl::system_driver()->filename_isdir_quick(pathname) &&
- compare_dirnames(pathname, directory_)) {
-#endif /* WIN32 || __EMX__ */
+ int condition = 0;
+ if (Fl::system_driver()->colon_is_drive()) condition = isalpha(pathname[0] & 255) && pathname[1] == ':' && !pathname[2];
+ if (!condition) condition = ( Fl::system_driver()->filename_isdir_quick(pathname) && compare_dirnames(pathname, directory_) );
+ if (condition) {
directory(pathname);
- } else if ((type_ & CREATE) || access(pathname, 0) == 0) {
+ } else if ((type_ & CREATE) || fl_access(pathname, 0) == 0) {
if (!Fl::system_driver()->filename_isdir_quick(pathname) || (type_ & DIRECTORY)) {
// Update the preview box...
update_preview();
@@ -895,13 +847,9 @@ Fl_File_Chooser::fileNameCB()
*slash++ = '\0';
filename = slash;
-#if defined(WIN32) || defined(__EMX__)
- if (strcasecmp(pathname, directory_) &&
- (pathname[0] || strcasecmp("/", directory_))) {
-#else
- if (strcmp(pathname, directory_) &&
- (pathname[0] || strcasecmp("/", directory_))) {
-#endif // WIN32 || __EMX__
+ int condition = Fl::system_driver()->case_insensitive_filenames() ?
+ strcasecmp(pathname, directory_) : strcmp(pathname, directory_);
+ if (condition && (pathname[0] || strcmp("/", directory_))) {
int p = fileName->position();
int m = fileName->mark();
@@ -927,11 +875,8 @@ Fl_File_Chooser::fileNameCB()
for (i = 1; i <= num_files && max_match > min_match; i ++) {
file = fileList->text(i);
-#if (defined(WIN32) && ! defined(__CYGWIN__)) || defined(__EMX__)
- if (strncasecmp(filename, file, min_match) == 0) {
-#else
- if (strncmp(filename, file, min_match) == 0) {
-#endif // WIN32 || __EMX__
+ if ( (Fl::system_driver()->case_insensitive_filenames()?
+ strncasecmp(filename, file, min_match) : strncmp(filename, file, min_match)) == 0) {
// OK, this one matches; check against the previous match
if (!first_line) {
// First match; copy stuff over...
@@ -950,11 +895,8 @@ Fl_File_Chooser::fileNameCB()
} else {
// Succeeding match; compare to find maximum string match...
while (max_match > min_match)
-#if (defined(WIN32) && ! defined(__CYGWIN__)) || defined(__EMX__)
- if (strncasecmp(file, matchname, max_match) == 0)
-#else
- if (strncmp(file, matchname, max_match) == 0)
-#endif // WIN32 || __EMX__
+ if ( (Fl::system_driver()->case_insensitive_filenames()?
+ strncasecmp(file, matchname, max_match) : strncmp(file, matchname, max_match)) == 0)
break;
else
max_match --;
@@ -991,7 +933,7 @@ Fl_File_Chooser::fileNameCB()
}
// See if we need to enable the OK button...
- if (((type_ & CREATE) || !access(fileName->value(), 0)) &&
+ if (((type_ & CREATE) || !fl_access(fileName->value(), 0)) &&
(!fl_filename_isdir(fileName->value()) || (type_ & DIRECTORY))) {
okButton->activate();
} else {
@@ -1001,7 +943,7 @@ Fl_File_Chooser::fileNameCB()
// FL_Delete or FL_BackSpace
fileList->deselect(0);
fileList->redraw();
- if (((type_ & CREATE) || !access(fileName->value(), 0)) &&
+ if (((type_ & CREATE) || !fl_access(fileName->value(), 0)) &&
(!fl_filename_isdir(fileName->value()) || (type_ & DIRECTORY))) {
okButton->activate();
} else {
@@ -1075,21 +1017,13 @@ Fl_File_Chooser::newdir()
return;
// Make it relative to the current directory as needed...
-#if (defined(WIN32) && ! defined (__CYGWIN__)) || defined(__EMX__)
- if (dir[0] != '/' && dir[0] != '\\' && dir[1] != ':')
-#else
- if (dir[0] != '/' && dir[0] != '\\')
-#endif /* WIN32 || __EMX__ */
+ if (dir[0] != '/' && dir[0] != '\\' && (!Fl::system_driver()->colon_is_drive() || dir[1] != ':') )
snprintf(pathname, sizeof(pathname), "%s/%s", directory_, dir);
else
strlcpy(pathname, dir, sizeof(pathname));
// Create the directory; ignore EEXIST errors...
-#if defined(WIN32) && ! defined (__CYGWIN__)
- if (mkdir(pathname))
-#else
- if (mkdir(pathname, 0777))
-#endif /* WIN32 */
+ if (fl_mkdir(pathname, 0777))
if (errno != EEXIST)
{
fl_alert("%s", strerror(errno));
@@ -1166,9 +1100,7 @@ Fl_File_Chooser::rescan()
// Build the file list...
fileList->load(directory_, sort);
-#ifndef WIN32
- if (!showHiddenButton->value()) remove_hidden_files();
-#endif
+ if (Fl::system_driver()->dot_file_hidden() && !showHiddenButton->value()) remove_hidden_files();
// Update the preview box...
update_preview();
}
@@ -1193,9 +1125,7 @@ void Fl_File_Chooser::rescan_keep_filename()
// Build the file list...
fileList->load(directory_, sort);
-#ifndef WIN32
- if (!showHiddenButton->value()) remove_hidden_files();
-#endif
+ if (Fl::system_driver()->dot_file_hidden() && !showHiddenButton->value()) remove_hidden_files();
// Update the preview box...
update_preview();
@@ -1207,11 +1137,7 @@ void Fl_File_Chooser::rescan_keep_filename()
else
slash = pathname;
for (i = 1; i <= fileList->size(); i ++)
-#if defined(WIN32) || defined(__EMX__)
- if (strcasecmp(fileList->text(i), slash) == 0) {
-#else
- if (strcmp(fileList->text(i), slash) == 0) {
-#endif // WIN32 || __EMX__
+ if ( (Fl::system_driver()->case_insensitive_filenames() ? strcasecmp(fileList->text(i), slash) : strcmp(fileList->text(i), slash)) == 0) {
fileList->topline(i);
fileList->select(i);
found = 1;
@@ -1285,7 +1211,7 @@ Fl_File_Chooser::update_favorites()
favoritesButton->add(manage_favorites_label, FL_ALT + 'm', 0, 0, FL_MENU_DIVIDER);
favoritesButton->add(filesystems_label, FL_ALT + 'f', 0);
- if ((home = get_homedir()) != NULL) {
+ if ((home = Fl::system_driver()->home_directory_name()) != NULL) {
quote_pathname(menuname, home, sizeof(menuname));
favoritesButton->add(menuname, FL_ALT + 'h', 0);
}
@@ -1549,19 +1475,19 @@ Fl_File_Chooser::value(const char *filename)
return;
}
-#ifdef WIN32
- // See if the filename contains backslashes...
- char fixpath[FL_PATH_MAX]; // Path with slashes converted
- if (strchr(filename, '\\')) {
- // Convert backslashes to slashes...
- strlcpy(fixpath, filename, sizeof(fixpath));
+ if (Fl::system_driver()->backslash_as_slash()) {
+ // See if the filename contains backslashes...
+ char fixpath[FL_PATH_MAX]; // Path with slashes converted
+ if (strchr(filename, '\\')) {
+ // Convert backslashes to slashes...
+ strlcpy(fixpath, filename, sizeof(fixpath));
- for (slash = strchr(fixpath, '\\'); slash; slash = strchr(slash + 1, '\\'))
- *slash = '/';
+ for (slash = strchr(fixpath, '\\'); slash; slash = strchr(slash + 1, '\\'))
+ *slash = '/';
- filename = fixpath;
+ filename = fixpath;
+ }
}
-#endif // WIN32
// See if there is a directory in there...
fl_filename_absolute(pathname, sizeof(pathname), filename);
@@ -1591,11 +1517,7 @@ Fl_File_Chooser::value(const char *filename)
fileList->redraw();
for (i = 1; i <= fcount; i ++)
-#if defined(WIN32) || defined(__EMX__)
- if (strcasecmp(fileList->text(i), slash) == 0) {
-#else
- if (strcmp(fileList->text(i), slash) == 0) {
-#endif // WIN32 || __EMX__
+ if ( ( Fl::system_driver()->case_insensitive_filenames() ? strcasecmp(fileList->text(i), slash) : strcmp(fileList->text(i), slash)) == 0) {
// printf("Selecting line %d...\n", i);
fileList->topline(i);
fileList->select(i);
@@ -1612,9 +1534,7 @@ void Fl_File_Chooser::show()
rescan_keep_filename();
fl_cursor(FL_CURSOR_DEFAULT);
fileName->take_focus();
-#ifdef WIN32
- showHiddenButton->hide();
-#endif
+ if (!Fl::system_driver()->dot_file_hidden()) showHiddenButton->hide();
}
void Fl_File_Chooser::showHidden(int value)
@@ -1660,11 +1580,7 @@ compare_dirnames(const char *a, const char *b) {
if (alen != blen) return alen - blen;
// Do a comparison of the first N chars (alen == blen at this point)...
-#ifdef WIN32
- return strncasecmp(a, b, alen);
-#else
- return strncmp(a, b, alen);
-#endif // WIN32
+ return Fl::system_driver()->case_insensitive_filenames() ? strncasecmp(a, b, alen) : strncmp(a, b, alen);
}
@@ -1721,23 +1637,5 @@ unquote_pathname(char *dst, // O - Destination string
}
//
-// 'get_homedir()' - Try to find the home directory (platform dependent).
-
-static const char*
-get_homedir() {
-
- const char *home = fl_getenv("HOME");
-
-#ifdef WIN32
-
- if (!home) home = fl_getenv("UserProfile");
-
-#endif // WIN32
-
- return home;
-}
-
-
-//
// End of "$Id$".
//