aboutsummaryrefslogtreecommitdiff
path: root/src/lib/FL/Fl_Native_File_Chooser_MAC.H
blob: 49577c40748f126b2d2c3547f55616bcdbddaec1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
//
// Fl_Native_File_Chooser_MAC.H -- FLTK native OS file chooser widget
//
// Copyright 2004 by Greg Ercolano.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU Library General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
// USA.
//
//      10        20        30        40        50        60        70
//       |         |         |         |         |         |         |
// 4567890123456789012345678901234567890123456789012345678901234567890123456789

// OSX-SPECIFIC NATIVE BROWSER
#ifdef __APPLE_CC__
#include <Carbon/Carbon.h>
#else
#include <Carbon.h>
#endif

#include <FL/filename.H>
#define MAXFILTERS	80

class Fl_Native_File_Chooser {
public:
    enum Type {
	BROWSE_FILE = 0,
	BROWSE_DIRECTORY,
	BROWSE_MULTI_FILE,
	BROWSE_MULTI_DIRECTORY,
	BROWSE_SAVE_FILE,
	BROWSE_SAVE_DIRECTORY
    };
    enum Option {
        NO_OPTIONS     = 0x0000,	// no options enabled
	SAVEAS_CONFIRM = 0x0001,	// Show native 'Save As' overwrite
					// confirm dialog (if supported)
	NEW_FOLDER     = 0x0002,	// Show 'New Folder' icon
					// (if supported)
	PREVIEW        = 0x0004,	// enable preview mode
    };
protected:
    NavDialogCreationOptions _opts;	// file navigation options
private:
    int             _btype;		// kind-of browser to show()
    int             _options;		// general options
    NavDialogRef    _ref;		// file navigation reference
    NavActionState  _keepstate;		// holds button permissions
    NavMenuItemSpec _tempitem;   	// Popup menu selection
    char          **_pathnames;		// array of pathnames
    int             _tpathnames;	// total pathnames
    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"

    char           *_filt_names;	// filter names (tab delimited)
    					// 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 CLASS TO HANDLE NAVIGATION DIALOG REPLY STRUCT
    //     Class-ified, mainly to ensure proper cleanup.
    //
    class NavReply {
        int _valid_reply;
	NavReplyRecord _reply;
    public:
        NavReply();
	~NavReply();
	int get_reply(NavDialogRef& ref);
	int get_saveas_basename(char *s, int slen);
	int get_dirname(char *s, int slen);
	int get_pathnames(char **&pathnames, int& tpathnames);
    };

    // Private methods
    void errmsg(const char *msg);
    void clear_pathnames();
    void set_single_pathname(const char *s);
    int get_saveas_basename(NavDialogRef& ref);
    int get_pathnames(NavDialogRef& ref);
    static void event_handler(NavEventCallbackMessage callBackSelector, 
    					     NavCBRecPtr cbparm, void *data);

    void clear_filters();
    void add_filter(const char *, const char *);
    void parse_filter(const char *from);
    static Boolean filter_proc_cb(AEDesc *, void *, void *, NavFilterModes);
    Boolean filter_proc_cb2(AEDesc*, void*, void*, NavFilterModes);
    int post();
    
public:
    Fl_Native_File_Chooser(int val = BROWSE_FILE);
    ~Fl_Native_File_Chooser();

    // Public methods
    void type(int);
    int type() const;
    void options(int);
    int options() const;
    int count() const;
    const char *filename() const;
    const char *filename(int i) const;
    void directory(const char *);
    const char *directory() const;
    void title(const char *);
    const char *title() const;
    const char *filter() const;
    void filter(const char *);
    void filter_value(int i) { _filt_value = i; }
    int filter_value() { return(_filt_value); }
    int filters() { return(_filt_total); }
    void preset_file(const char *);
    const char *preset_file();
    const char *errmsg() const;
    int show();
};