diff options
| author | Manolo Gouy <Manolo> | 2014-06-07 12:01:59 +0000 |
|---|---|---|
| committer | Manolo Gouy <Manolo> | 2014-06-07 12:01:59 +0000 |
| commit | baebff2227400ef54a92638d297fc0c23a4bd521 (patch) | |
| tree | 88b6efae852185634761c2503844385f4ac826f8 /FL/Fl_Native_File_Chooser.H | |
| parent | 460544455d9f449ce80abdab22e0244698444158 (diff) | |
STR #3088: make Fl_Native_File_Chooser use the standard GTK file dialog when available.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@10186 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'FL/Fl_Native_File_Chooser.H')
| -rw-r--r-- | FL/Fl_Native_File_Chooser.H | 212 |
1 files changed, 149 insertions, 63 deletions
diff --git a/FL/Fl_Native_File_Chooser.H b/FL/Fl_Native_File_Chooser.H index ae115b765..a33985c17 100644 --- a/FL/Fl_Native_File_Chooser.H +++ b/FL/Fl_Native_File_Chooser.H @@ -3,7 +3,7 @@ // // FLTK native OS file chooser widget // -// Copyright 1998-2010 by Bill Spitzak and others. +// Copyright 1998-2014 by Bill Spitzak and others. // Copyright 2004 Greg Ercolano. // // This library is free software. Distribution and use rights are outlined in @@ -23,47 +23,46 @@ #ifndef FL_NATIVE_FILE_CHOOSER_H #define FL_NATIVE_FILE_CHOOSER_H -/* \file - Fl_Native_File_Chooser widget. */ - // Use Windows' chooser #ifdef WIN32 // #define _WIN32_WINNT 0x0501 // needed for OPENFILENAME's 'FlagsEx' -#include <stdio.h> -#include <stdlib.h> // malloc -#include <windows.h> -#include <commdlg.h> // OPENFILENAME, GetOpenFileName() -#include <shlobj.h> // BROWSEINFO, SHBrowseForFolder() +# include <stdio.h> +# include <stdlib.h> // malloc +# include <windows.h> +# include <commdlg.h> // OPENFILENAME, GetOpenFileName() +# include <shlobj.h> // BROWSEINFO, SHBrowseForFolder() #endif // Use Apple's chooser #ifdef __APPLE__ -#define MAXFILTERS 80 +# define MAXFILTERS 80 #endif // All else falls back to FLTK's own chooser #if ! defined(__APPLE__) && !defined(WIN32) -#include <FL/Fl_File_Chooser.H> -#include <unistd.h> // _POSIX_NAME_MAX +# include <FL/Fl_File_Chooser.H> +# include <unistd.h> // _POSIX_NAME_MAX #else -#include <FL/filename.H> // FL_EXPORT +# include <FL/filename.H> // FL_EXPORT #endif +class Fl_FLTK_File_Chooser; +class Fl_GTK_File_Chooser; /** - This class lets an FLTK application easily and consistently access - the operating system's native file chooser. Some operating systems - have very complex and specific file choosers that many users want - access to specifically, instead of FLTK's default file chooser(s). - + This class lets an FLTK application easily and consistently access + the operating system's native file chooser. Some operating systems + have very complex and specific file choosers that many users want + access to specifically, instead of FLTK's default file chooser(s). + In cases where there is no native file browser, FLTK's own file browser is used instead. - + To use this widget, use the following include in your code: \code #include <FL/Fl_Native_File_Chooser.H> \endcode - + The following example shows how to pick a single file: \code // Create and post the local native file chooser @@ -82,25 +81,28 @@ default: printf("PICKED: %s\n", fnfc.filename()); break; // FILE CHOSEN } \endcode - + The Fl_Native_File_Chooser widget transmits UTF-8 encoded filenames to its user. It is recommended to open files that may have non-ASCII names with the fl_fopen() or - fl_open() utility functions that handle these names in a cross-platform way - (whereas the standard fopen()/open() functions fail on the MSWindows platform + fl_open() utility functions that handle these names in a cross-platform way + (whereas the standard fopen()/open() functions fail on the MSWindows platform to open files with a non-ASCII name). - + <B>Platform Specific Caveats</B> - - - Under X windows, it's best if you call Fl_File_Icon::load_system_icons() + + - Under X windows, and if Fl::OPTION_FNFC_USES_GTK has not been switched off, + the widget attempts to use standard GTK file chooser dialogs if they are + available at run-time on the platform, and falls back to use FLTK's Fl_File_Chooser if they are not. + In the latter case, it's best if you call Fl_File_Icon::load_system_icons() at the start of main(), to enable the nicer looking file browser widgets. Use the static public attributes of class Fl_File_Chooser to localize the browser. - - Some operating systems support certain OS specific options; see + - Some operating systems support certain OS specific options; see Fl_Native_File_Chooser::options() for a list. - + \image html Fl_Native_File_Chooser.png "The Fl_Native_File_Chooser on different platforms." \image latex Fl_Native_File_Chooser.png "The Fl_Native_File_Chooser on different platforms" width=14cm - + */ class FL_EXPORT Fl_Native_File_Chooser { public: @@ -121,39 +123,39 @@ public: }; /** Localizable message */ static const char *file_exists_message; - + public: Fl_Native_File_Chooser(int val=BROWSE_FILE); ~Fl_Native_File_Chooser(); - + // Public methods - void type(int); - int type() const; - void options(int); + void type(int t); + int type() const ; + void options(int o); int options() const; int count() const; - const char *filename() const; - const char *filename(int i) const; - void directory(const char *val); + const char *filename() const ; + const char *filename(int i) const ; + void directory(const char *val) ; const char *directory() const; - void title(const char *); + void title(const char *t); const char* title() const; - const char *filter() const; - void filter(const char *); - int filters() const; - void filter_value(int i); - int filter_value() const; - void preset_file(const char*); + const char *filter() const ; + void filter(const char *f); + int filters() const ; + void filter_value(int i) ; + int filter_value() const ; + void preset_file(const char*f) ; const char* preset_file() const; - const char *errmsg() const; - int show(); - + const char *errmsg() const ; + int show() ; + #ifdef WIN32 private: int _btype; // kind-of browser to show() int _options; // general options OPENFILENAMEW _ofn; // GetOpenFileName() & GetSaveFileName() struct - BROWSEINFOW _binf; // SHBrowseForFolder() struct + BROWSEINFOW _binf; // SHBrowseForFolder() struct char **_pathnames; // array of pathnames int _tpathnames; // total pathnames char *_directory; // default pathname to use @@ -163,14 +165,14 @@ private: int _nfilters; // number of filters parse_filter counted char *_preset_file; // the file to preselect char *_errmsg; // error message - + // Private methods void errmsg(const char *msg); - + void clear_pathnames(); void set_single_pathname(const char *s); void add_pathname(const char *s); - + void FreePIDL(LPITEMIDLIST pidl); void ClearOFN(); void ClearBINF(); @@ -179,7 +181,7 @@ private: int showfile(); static int CALLBACK Dir_CB(HWND win, UINT msg, LPARAM param, LPARAM data); int showdir(); - + void parse_filter(const char *); void clear_filters(); void add_filter(const char *, const char *); @@ -195,22 +197,22 @@ private: char *_directory; // default pathname to use char *_title; // title for window char *_preset_file; // the 'save as' filename - + char *_filter; // user-side search filter, eg: - // C Files\t*.[ch]\nText Files\t*.txt" - + // C Files\t*.[ch]\nText Files\t*.txt" + char *_filt_names; // filter names (tab delimited) - // eg. "C Files\tText Files" - + // eg. "C Files\tText Files" + char *_filt_patt[MAXFILTERS]; // array of filter patterns, eg: // _filt_patt[0]="*.{cxx,h}" // _filt_patt[1]="*.txt" - + int _filt_total; // parse_filter() # of filters loaded int _filt_value; // index of the selected filter char *_errmsg; // error message - + // Private methods void errmsg(const char *msg); void clear_pathnames(); @@ -225,6 +227,7 @@ private: #if ! defined(__APPLE__) && !defined(WIN32) private: +#if FLTK_ABI_VERSION <= 10302 int _btype; // kind-of browser to show() int _options; // general options int _nfilters; @@ -235,18 +238,101 @@ private: char *_prevvalue; // Returned filename char *_directory; char *_errmsg; // error message - Fl_File_Chooser *_file_chooser; +#endif + static int have_looked_for_GTK_libs; + union { + Fl_FLTK_File_Chooser *_x11_file_chooser; + Fl_GTK_File_Chooser *_gtk_file_chooser; + }; +#endif +}; - // Private methods +#if !defined(__APPLE__) && !defined(WIN32) +class Fl_FLTK_File_Chooser { + friend class Fl_Native_File_Chooser; +protected: + int _btype; // kind-of browser to show() + int _options; // general options + int _nfilters; + char *_filter; // user supplied filter + char *_parsedfilt; // parsed filter + int _filtvalue; // selected filter + char *_preset_file; + char *_prevvalue; // Returned filename + char *_directory; + char *_errmsg; // error message + Fl_FLTK_File_Chooser(int val); + virtual ~Fl_FLTK_File_Chooser(); void errmsg(const char *msg); int type_fl_file(int); void parse_filter(); - void keeplocation(); int exist_dialog(); -#endif + Fl_File_Chooser *_file_chooser; + virtual void type(int); + int type() const; + void options(int); + int options() const; + virtual int count() const; + virtual const char *filename() const; + virtual const char *filename(int i) const; + void directory(const char *val); + const char *directory() const; + virtual void title(const char *); + virtual const char* title() const; + const char *filter() const; + void filter(const char *); + int filters() const; + void filter_value(int i); + int filter_value() const; + void preset_file(const char*); + const char* preset_file() const; + const char *errmsg() const; + virtual int show(); }; +class Fl_GTK_File_Chooser : public Fl_FLTK_File_Chooser { + friend class Fl_Native_File_Chooser; +private: + typedef struct _GtkWidget GtkWidget; + typedef struct _GtkFileFilterInfo GtkFileFilterInfo; + struct pair { + Fl_GTK_File_Chooser* running; // the running Fl_GTK_File_Chooser + const char *filter; // a filter string of the chooser + pair(Fl_GTK_File_Chooser* c, const char *f) { + running = c; + filter = strdup(f); + }; + ~pair() { + free((char*)filter); + }; + }; + GtkWidget *gtkw_ptr; // used to hold a GtkWidget* without pulling GTK into everything... + void *gtkw_slist; // used to hold a GLib GSList... + unsigned gtkw_count; // number of files read back - if any + mutable char *gtkw_filename; // last name we read back + char *gtkw_title; // the title to be applied to the dialog + const char *previous_filter; + + int fl_gtk_chooser_wrapper(); // method that wraps the GTK widget + Fl_GTK_File_Chooser(int val); + virtual ~Fl_GTK_File_Chooser(); + static int did_find_GTK_libs; + static void probe_for_GTK_libs(void); + virtual void type(int); + virtual int count() const; + virtual const char *filename() const; + virtual const char *filename(int i) const; + virtual void title(const char *); + virtual const char* title() const; + virtual int show(); + void changed_output_type(const char *filter); + + static int custom_gtk_filter_function(const GtkFileFilterInfo*, Fl_GTK_File_Chooser::pair*); + static void free_pair(pair *p); +}; +#endif // !defined(__APPLE__) && !defined(WIN32) + #endif /*FL_NATIVE_FILE_CHOOSER_H*/ // |
