FLTK 1.3.4
Fl_Native_File_Chooser.H
Go to the documentation of this file.
1 //
2 // "$Id: Fl_Native_File_Chooser.H 11188 2016-02-18 04:21:27Z greg.ercolano $"
3 //
4 // FLTK native OS file chooser widget
5 //
6 // Copyright 1998-2014 by Bill Spitzak and others.
7 // Copyright 2004 Greg Ercolano.
8 //
9 // This library is free software. Distribution and use rights are outlined in
10 // the file "COPYING" which should have been included with this file. If this
11 // file is missing or damaged, see the license at:
12 //
13 // http://www.fltk.org/COPYING.php
14 //
15 // Please report all bugs and problems on the following page:
16 //
17 // http://www.fltk.org/str.php
18 //
19 
23 #ifndef FL_NATIVE_FILE_CHOOSER_H
24 #define FL_NATIVE_FILE_CHOOSER_H
25 
26 // Use Windows' chooser
27 #ifdef WIN32
28 // #define _WIN32_WINNT 0x0501 // needed for OPENFILENAME's 'FlagsEx'
29 #if defined(FL_LIBRARY) || FLTK_ABI_VERSION < 10304
30 # include <windows.h>
31 # include <commdlg.h> // OPENFILENAMEW, GetOpenFileName()
32 # include <shlobj.h> // BROWSEINFOW, SHBrowseForFolder()
33 typedef OPENFILENAMEW fl_OPENFILENAMEW;
34 typedef BROWSEINFOW fl_BROWSEINFOW;
35 #else
36 typedef void fl_OPENFILENAMEW;
37 typedef void fl_BROWSEINFOW;
38 #endif
39 #endif
40 
41 // Use Apple's chooser
42 #ifdef __APPLE__
43 # define MAXFILTERS 80
44 #endif
45 
46 // All else falls back to FLTK's own chooser
47 #if ! defined(__APPLE__) && !defined(WIN32)
48 # include <FL/Fl_File_Chooser.H>
49 #else
50 # include <FL/filename.H> // FL_EXPORT
51 #endif
52 
55 
111 class FL_EXPORT Fl_Native_File_Chooser {
112 public:
113  enum Type {
114  BROWSE_FILE = 0,
119  BROWSE_SAVE_DIRECTORY
120  };
121  enum Option {
122  NO_OPTIONS = 0x0000,
123  SAVEAS_CONFIRM = 0x0001,
124  NEW_FOLDER = 0x0002,
125  PREVIEW = 0x0004,
126  USE_FILTER_EXT = 0x0008
127  };
129  static const char *file_exists_message;
130 
131 public:
132  Fl_Native_File_Chooser(int val=BROWSE_FILE);
134 
135  // Public methods
136  void type(int t);
137  int type() const ;
138  void options(int o);
139  int options() const;
140  int count() const;
141  const char *filename() const ;
142  const char *filename(int i) const ;
143  void directory(const char *val) ;
144  const char *directory() const;
145  void title(const char *t);
146  const char* title() const;
147  const char *filter() const ;
148  void filter(const char *f);
149  int filters() const ;
150  void filter_value(int i) ;
151  int filter_value() const ;
152  void preset_file(const char*f) ;
153  const char* preset_file() const;
154  const char *errmsg() const ;
155  int show() ;
156 
157 #ifdef WIN32
158 private:
159  int _btype; // kind-of browser to show()
160  int _options; // general options
161 #if FLTK_ABI_VERSION >= 10304
162  fl_OPENFILENAMEW *_ofn_ptr; // GetOpenFileName() & GetSaveFileName() struct
163  fl_BROWSEINFOW *_binf_ptr; // SHBrowseForFolder() struct
164  WCHAR *_wpattern; // pattern buffer for filter
165 #else
166  fl_OPENFILENAMEW _ofn;
167  fl_BROWSEINFOW _binf;
168 #endif
169  char **_pathnames; // array of pathnames
170  int _tpathnames; // total pathnames
171  char *_directory; // default pathname to use
172  char *_title; // title for window
173  char *_filter; // user-side search filter
174  char *_parsedfilt; // filter parsed for Windows dialog
175  int _nfilters; // number of filters parse_filter counted
176  char *_preset_file; // the file to preselect
177  char *_errmsg; // error message
178 
179  // Private methods
180  void errmsg(const char *msg);
181 
182  void clear_pathnames();
183  void set_single_pathname(const char *s);
184  void add_pathname(const char *s);
185 
186  void ClearOFN();
187  void ClearBINF();
188  void Win2Unix(char *s);
189  void Unix2Win(char *s);
190  int showfile();
191  int showdir();
192 
193  void parse_filter(const char *);
194  void clear_filters();
195  void add_filter(const char *, const char *);
196 #endif
197 
198 #ifdef __APPLE__
199 private:
200  int _btype; // kind-of browser to show()
201  int _options; // general options
202  void *_panel;
203  char **_pathnames; // array of pathnames
204  int _tpathnames; // total pathnames
205  char *_directory; // default pathname to use
206  char *_title; // title for window
207  char *_preset_file; // the 'save as' filename
208 
209  char *_filter; // user-side search filter, eg:
210  // C Files\t*.[ch]\nText Files\t*.txt"
211 
212  char *_filt_names; // filter names (tab delimited)
213  // eg. "C Files\tText Files"
214 
215  char *_filt_patt[MAXFILTERS];
216  // array of filter patterns, eg:
217  // _filt_patt[0]="*.{cxx,h}"
218  // _filt_patt[1]="*.txt"
219 
220  int _filt_total; // parse_filter() # of filters loaded
221  int _filt_value; // index of the selected filter
222  char *_errmsg; // error message
223 
224  // Private methods
225  void errmsg(const char *msg);
226  void clear_pathnames();
227  void set_single_pathname(const char *s);
228  int get_saveas_basename(void);
229  void clear_filters();
230  void add_filter(const char *, const char *);
231  void parse_filter(const char *from);
232  int post();
233  int runmodal();
234 #endif
235 
236 #if ! defined(__APPLE__) && !defined(WIN32)
237 private:
238 #if FLTK_ABI_VERSION <= 10302
239  int _btype; // kind-of browser to show()
240  int _options; // general options
241  int _nfilters;
242  char *_filter; // user supplied filter
243  char *_parsedfilt; // parsed filter
244  int _filtvalue; // selected filter
245  char *_preset_file;
246  char *_prevvalue; // Returned filename
247  char *_directory;
248  char *_errmsg; // error message
249 #endif
250  static int have_looked_for_GTK_libs;
251  union {
252  Fl_FLTK_File_Chooser *_x11_file_chooser;
253  Fl_GTK_File_Chooser *_gtk_file_chooser;
254  };
255 #endif
256 };
257 
258 #if !defined(__APPLE__) && !defined(WIN32)
259 class FL_EXPORT Fl_FLTK_File_Chooser {
260  friend class Fl_Native_File_Chooser;
261 protected:
262  int _btype; // kind-of browser to show()
263  int _options; // general options
264  int _nfilters;
265  char *_filter; // user supplied filter
266  char *_parsedfilt; // parsed filter
267  int _filtvalue; // selected filter
268  char *_preset_file;
269  char *_prevvalue; // Returned filename
270  char *_directory;
271  char *_errmsg; // error message
272  Fl_FLTK_File_Chooser(int val);
273  virtual ~Fl_FLTK_File_Chooser();
274  void errmsg(const char *msg);
275  int type_fl_file(int);
276  void parse_filter();
277  int exist_dialog();
278  Fl_File_Chooser *_file_chooser;
279  virtual void type(int);
280  int type() const;
281  void options(int);
282  int options() const;
283  virtual int count() const;
284  virtual const char *filename() const;
285  virtual const char *filename(int i) const;
286  void directory(const char *val);
287  const char *directory() const;
288  virtual void title(const char *);
289  virtual const char* title() const;
290  const char *filter() const;
291  void filter(const char *);
292  int filters() const;
293  void filter_value(int i);
294  int filter_value() const;
295  void preset_file(const char*);
296  const char* preset_file() const;
297  const char *errmsg() const;
298  virtual int show();
299 };
300 
301 
302 class FL_EXPORT Fl_GTK_File_Chooser : public Fl_FLTK_File_Chooser {
303  friend class Fl_Native_File_Chooser;
304 private:
305  typedef struct _GtkWidget GtkWidget;
306  typedef struct _GtkFileFilterInfo GtkFileFilterInfo;
307  struct pair {
308  Fl_GTK_File_Chooser* running; // the running Fl_GTK_File_Chooser
309  const char *filter; // a filter string of the chooser
310  pair(Fl_GTK_File_Chooser* c, const char *f) {
311  running = c;
312  filter = strdup(f);
313  };
314  ~pair() {
315  free((char*)filter);
316  };
317  };
318  GtkWidget *gtkw_ptr; // used to hold a GtkWidget* without pulling GTK into everything...
319  void *gtkw_slist; // used to hold a GLib GSList...
320  unsigned gtkw_count; // number of files read back - if any
321  mutable char *gtkw_filename; // last name we read back
322  char *gtkw_title; // the title to be applied to the dialog
323  const char *previous_filter;
324 
325  int fl_gtk_chooser_wrapper(); // method that wraps the GTK widget
326  Fl_GTK_File_Chooser(int val);
327  virtual ~Fl_GTK_File_Chooser();
328  static int did_find_GTK_libs;
329  static void probe_for_GTK_libs(void);
330  virtual void type(int);
331  virtual int count() const;
332  virtual const char *filename() const;
333  virtual const char *filename(int i) const;
334  virtual void title(const char *);
335  virtual const char* title() const;
336  virtual int show();
337  void changed_output_type(const char *filter);
338 
339  static int custom_gtk_filter_function(const GtkFileFilterInfo*, Fl_GTK_File_Chooser::pair*);
340  static void free_pair(pair *p);
341 };
342 #endif // !defined(__APPLE__) && !defined(WIN32)
343 
344 #endif /*FL_NATIVE_FILE_CHOOSER_H*/
345 
346 //
347 // End of "$Id: Fl_Native_File_Chooser.H 11188 2016-02-18 04:21:27Z greg.ercolano $".
348 //
Option
Definition: Fl_Native_File_Chooser.H:121
This class lets an FLTK application easily and consistently access the operating system's native file...
Definition: Fl_Native_File_Chooser.H:111
Type
Definition: Fl_Native_File_Chooser.H:113
const char * directory() const
Returns the current preset directory() value.
Definition: Fl_Native_File_Chooser_FLTK.cxx:154
File names and URI utility functions.
Definition: Fl_Native_File_Chooser.H:302
int filter_value() const
Returns which filter value was last selected by the user.
Definition: Fl_Native_File_Chooser_FLTK.cxx:213
int options() const
Gets the platform specific Fl_Native_File_Chooser::Option flags.
Definition: Fl_Native_File_Chooser_FLTK.cxx:103
const char * filename() const
Return the filename the user chose.
Definition: Fl_Native_File_Chooser_FLTK.cxx:126
int show()
Post the chooser's dialog.
Definition: Fl_Native_File_Chooser_FLTK.cxx:242
static const char * file_exists_message
Localizable message.
Definition: Fl_Native_File_Chooser.H:129
const char * errmsg() const
Returns a system dependent error message for the last method that failed.
Definition: Fl_Native_File_Chooser_FLTK.cxx:233
The Fl_File_Chooser widget displays a standard file selection dialog that supports various selection ...
Definition: Fl_File_Chooser.H:48
int count() const
Returns the number of filenames (or directory names) the user selected.
Definition: Fl_Native_File_Chooser_FLTK.cxx:118
const char * preset_file() const
Get the preset filename.
Definition: Fl_Native_File_Chooser_FLTK.cxx:226
Definition: Fl_Native_File_Chooser.H:259
const char * filter() const
Returns the filter string last set.
Definition: Fl_Native_File_Chooser_FLTK.cxx:173
browse files (lets user choose multiple files)
Definition: Fl_Native_File_Chooser.H:116
int filters() const
Gets how many filters were available, not including "All Files".
Definition: Fl_Native_File_Chooser_FLTK.cxx:198
browse directories (lets user choose multiple directories)
Definition: Fl_Native_File_Chooser.H:117
const char * title() const
Get the title of the file chooser's dialog window.
Definition: Fl_Native_File_Chooser_FLTK.cxx:167
browse directories (lets user choose one directory)
Definition: Fl_Native_File_Chooser.H:115
browse to save a file
Definition: Fl_Native_File_Chooser.H:118
int type() const
Gets the current Fl_Native_File_Chooser::Type of browser.
Definition: Fl_Native_File_Chooser_FLTK.cxx:82