summaryrefslogtreecommitdiff
path: root/src/Fl_Native_File_Chooser_MAC.mm
diff options
context:
space:
mode:
Diffstat (limited to 'src/Fl_Native_File_Chooser_MAC.mm')
-rw-r--r--src/Fl_Native_File_Chooser_MAC.mm161
1 files changed, 113 insertions, 48 deletions
diff --git a/src/Fl_Native_File_Chooser_MAC.mm b/src/Fl_Native_File_Chooser_MAC.mm
index d09024d70..606a3c112 100644
--- a/src/Fl_Native_File_Chooser_MAC.mm
+++ b/src/Fl_Native_File_Chooser_MAC.mm
@@ -23,7 +23,6 @@
#ifdef __APPLE__
-#include "Fl_Native_File_Chooser_common.cxx" // strnew/strfree/strapp/chrcat
#include <libgen.h> // dirname(3)
#include <sys/types.h> // stat(2)
#include <sys/stat.h> // stat(2)
@@ -34,9 +33,74 @@
#include <FL/Fl_Native_File_Chooser.H>
#include <FL/Fl_File_Chooser.H>
#include <FL/filename.H>
+# define MAXFILTERS 80
+
+class Fl_Native_File_Chooser_Darwin_Driver : public Fl_Native_File_Chooser_Driver {
+private:
+ int _btype; // kind-of browser to show()
+ int _options; // general options
+ void *_panel;
+ 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 methods
+ void errmsg(const char *msg);
+ void clear_pathnames();
+ void set_single_pathname(const char *s);
+ int get_saveas_basename(void);
+ void clear_filters();
+ void parse_filter(const char *from);
+ int post();
+ int runmodal();
+public:
+ Fl_Native_File_Chooser_Darwin_Driver(int val);
+ ~Fl_Native_File_Chooser_Darwin_Driver();
+ virtual void type(int t);
+ virtual int type() const ;
+ virtual void options(int o);
+ virtual int options() const;
+ virtual int count() const;
+ virtual const char *filename() const ;
+ virtual const char *filename(int i) const ;
+ virtual void directory(const char *val) ;
+ virtual const char *directory() const;
+ virtual void title(const char *t);
+ virtual const char* title() const;
+ virtual const char *filter() const ;
+ virtual void filter(const char *f);
+ virtual int filters() const ;
+ virtual void filter_value(int i) ;
+ virtual int filter_value() const ;
+ virtual void preset_file(const char*f) ;
+ virtual const char* preset_file() const;
+ virtual const char *errmsg() const ;
+ virtual int show() ;
+};
+
+Fl_Native_File_Chooser::Fl_Native_File_Chooser(int val) {
+ platform_fnfc = new Fl_Native_File_Chooser_Darwin_Driver(val);
+}
// FREE PATHNAMES ARRAY, IF IT HAS ANY CONTENTS
-void Fl_Native_File_Chooser::clear_pathnames() {
+void Fl_Native_File_Chooser_Darwin_Driver::clear_pathnames() {
if ( _pathnames ) {
while ( --_tpathnames >= 0 ) {
_pathnames[_tpathnames] = strfree(_pathnames[_tpathnames]);
@@ -48,7 +112,7 @@ void Fl_Native_File_Chooser::clear_pathnames() {
}
// SET A SINGLE PATHNAME
-void Fl_Native_File_Chooser::set_single_pathname(const char *s) {
+void Fl_Native_File_Chooser_Darwin_Driver::set_single_pathname(const char *s) {
clear_pathnames();
_pathnames = new char*[1];
_pathnames[0] = strnew(s);
@@ -56,10 +120,11 @@ void Fl_Native_File_Chooser::set_single_pathname(const char *s) {
}
// CONSTRUCTOR
-Fl_Native_File_Chooser::Fl_Native_File_Chooser(int val) {
+Fl_Native_File_Chooser_Darwin_Driver::Fl_Native_File_Chooser_Darwin_Driver(int val) :
+ Fl_Native_File_Chooser_Driver(val) {
_btype = val;
_panel = NULL;
- _options = NO_OPTIONS;
+ _options = Fl_Native_File_Chooser::NO_OPTIONS;
_pathnames = NULL;
_tpathnames = 0;
_title = NULL;
@@ -74,7 +139,7 @@ Fl_Native_File_Chooser::Fl_Native_File_Chooser(int val) {
}
// DESTRUCTOR
-Fl_Native_File_Chooser::~Fl_Native_File_Chooser() {
+Fl_Native_File_Chooser_Darwin_Driver::~Fl_Native_File_Chooser_Darwin_Driver() {
// _opts // nothing to manage
// _options // nothing to manage
// _keepstate // nothing to manage
@@ -93,17 +158,17 @@ Fl_Native_File_Chooser::~Fl_Native_File_Chooser() {
}
// GET TYPE OF BROWSER
-int Fl_Native_File_Chooser::type() const {
+int Fl_Native_File_Chooser_Darwin_Driver::type() const {
return(_btype);
}
// SET OPTIONS
-void Fl_Native_File_Chooser::options(int val) {
+void Fl_Native_File_Chooser_Darwin_Driver::options(int val) {
_options = val;
}
// GET OPTIONS
-int Fl_Native_File_Chooser::options() const {
+int Fl_Native_File_Chooser_Darwin_Driver::options() const {
return(_options);
}
@@ -113,7 +178,7 @@ int Fl_Native_File_Chooser::options() const {
// 1 - user cancelled
// -1 - failed; errmsg() has reason
//
-int Fl_Native_File_Chooser::show() {
+int Fl_Native_File_Chooser_Darwin_Driver::show() {
// Make sure fltk interface updates before posting our dialog
Fl::flush();
@@ -127,37 +192,37 @@ int Fl_Native_File_Chooser::show() {
// SET ERROR MESSAGE
// Internal use only.
//
-void Fl_Native_File_Chooser::errmsg(const char *msg) {
+void Fl_Native_File_Chooser_Darwin_Driver::errmsg(const char *msg) {
_errmsg = strfree(_errmsg);
_errmsg = strnew(msg);
}
// RETURN ERROR MESSAGE
-const char *Fl_Native_File_Chooser::errmsg() const {
+const char *Fl_Native_File_Chooser_Darwin_Driver::errmsg() const {
return(_errmsg ? _errmsg : "No error");
}
// GET FILENAME
-const char* Fl_Native_File_Chooser::filename() const {
+const char* Fl_Native_File_Chooser_Darwin_Driver::filename() const {
if ( _pathnames && _tpathnames > 0 ) return(_pathnames[0]);
return("");
}
// GET FILENAME FROM LIST OF FILENAMES
-const char* Fl_Native_File_Chooser::filename(int i) const {
+const char* Fl_Native_File_Chooser_Darwin_Driver::filename(int i) const {
if ( _pathnames && i < _tpathnames ) return(_pathnames[i]);
return("");
}
// GET TOTAL FILENAMES CHOSEN
-int Fl_Native_File_Chooser::count() const {
+int Fl_Native_File_Chooser_Darwin_Driver::count() const {
return(_tpathnames);
}
// PRESET PATHNAME
// Value can be NULL for none.
//
-void Fl_Native_File_Chooser::directory(const char *val) {
+void Fl_Native_File_Chooser_Darwin_Driver::directory(const char *val) {
_directory = strfree(_directory);
_directory = strnew(val);
}
@@ -165,14 +230,14 @@ void Fl_Native_File_Chooser::directory(const char *val) {
// GET PRESET PATHNAME
// Returned value can be NULL if none set.
//
-const char* Fl_Native_File_Chooser::directory() const {
+const char* Fl_Native_File_Chooser_Darwin_Driver::directory() const {
return(_directory);
}
// SET TITLE
// Value can be NULL if no title desired.
//
-void Fl_Native_File_Chooser::title(const char *val) {
+void Fl_Native_File_Chooser_Darwin_Driver::title(const char *val) {
_title = strfree(_title);
_title = strnew(val);
}
@@ -180,14 +245,14 @@ void Fl_Native_File_Chooser::title(const char *val) {
// GET TITLE
// Returned value can be NULL if none set.
//
-const char *Fl_Native_File_Chooser::title() const {
+const char *Fl_Native_File_Chooser_Darwin_Driver::title() const {
return(_title);
}
// SET FILTER
// Can be NULL if no filter needed
//
-void Fl_Native_File_Chooser::filter(const char *val) {
+void Fl_Native_File_Chooser_Darwin_Driver::filter(const char *val) {
_filter = strfree(_filter);
_filter = strnew(val);
@@ -204,14 +269,14 @@ void Fl_Native_File_Chooser::filter(const char *val) {
// GET FILTER
// Returned value can be NULL if none set.
//
-const char *Fl_Native_File_Chooser::filter() const {
+const char *Fl_Native_File_Chooser_Darwin_Driver::filter() const {
return(_filter);
}
// CLEAR ALL FILTERS
// Internal use only.
//
-void Fl_Native_File_Chooser::clear_filters() {
+void Fl_Native_File_Chooser_Darwin_Driver::clear_filters() {
_filt_names = strfree(_filt_names);
for (int i=0; i<_filt_total; i++) {
_filt_patt[i] = strfree(_filt_patt[i]);
@@ -239,7 +304,7 @@ void Fl_Native_File_Chooser::clear_filters() {
// \_____/ \_______/
// Name Wildcard
//
-void Fl_Native_File_Chooser::parse_filter(const char *in) {
+void Fl_Native_File_Chooser_Darwin_Driver::parse_filter(const char *in) {
clear_filters();
if ( ! in ) return;
int has_name = strchr(in, '\t') ? 1 : 0;
@@ -285,7 +350,7 @@ void Fl_Native_File_Chooser::parse_filter(const char *in) {
// CFStringCreateArrayBySeparatingStrings()
//
if ( _filt_total ) {
- _filt_names = strapp(_filt_names, "\t");
+ _filt_names = strapp(_filt_names, "\t");
}
_filt_names = strapp(_filt_names, name);
@@ -303,8 +368,8 @@ void Fl_Native_File_Chooser::parse_filter(const char *in) {
default: // handle all non-special chars
regchar: // handle regular char
switch ( mode ) {
- case 'n': chrcat(name, *in); continue;
- case 'w': chrcat(wildcard, *in); continue;
+ case 'n': chrcat(name, *in); continue;
+ case 'w': chrcat(wildcard, *in); continue;
}
break;
}
@@ -315,7 +380,7 @@ void Fl_Native_File_Chooser::parse_filter(const char *in) {
// SET PRESET FILE
// Value can be NULL for none.
//
-void Fl_Native_File_Chooser::preset_file(const char* val) {
+void Fl_Native_File_Chooser_Darwin_Driver::preset_file(const char* val) {
_preset_file = strfree(_preset_file);
_preset_file = strnew(val);
}
@@ -323,28 +388,28 @@ void Fl_Native_File_Chooser::preset_file(const char* val) {
// PRESET FILE
// Returned value can be NULL if none set.
//
-const char* Fl_Native_File_Chooser::preset_file() const {
+const char* Fl_Native_File_Chooser_Darwin_Driver::preset_file() const {
return(_preset_file);
}
-void Fl_Native_File_Chooser::filter_value(int val) {
+void Fl_Native_File_Chooser_Darwin_Driver::filter_value(int val) {
_filt_value = val;
}
-int Fl_Native_File_Chooser::filter_value() const {
+int Fl_Native_File_Chooser_Darwin_Driver::filter_value() const {
return(_filt_value);
}
-int Fl_Native_File_Chooser::filters() const {
+int Fl_Native_File_Chooser_Darwin_Driver::filters() const {
return(_filt_total);
}
#import <Cocoa/Cocoa.h>
#define UNLIKELYPREFIX "___fl_very_unlikely_prefix_"
-int Fl_Native_File_Chooser::get_saveas_basename(void) {
+int Fl_Native_File_Chooser_Darwin_Driver::get_saveas_basename(void) {
char *q = strdup( [[[(NSSavePanel*)_panel URL] path] UTF8String] );
- if ( !(_options & SAVEAS_CONFIRM) ) {
+ if ( !(_options & Fl_Native_File_Chooser::SAVEAS_CONFIRM) ) {
const char *d = [[[[(NSSavePanel*)_panel URL] path] stringByDeletingLastPathComponent] UTF8String];
int l = (int)strlen(d) + 1;
if (strcmp(d, "/") == 0) l = 1;
@@ -358,7 +423,7 @@ int Fl_Native_File_Chooser::get_saveas_basename(void) {
}
// SET THE TYPE OF BROWSER
-void Fl_Native_File_Chooser::type(int val) {
+void Fl_Native_File_Chooser_Darwin_Driver::type(int val) {
_btype = val;
}
@@ -527,7 +592,7 @@ static NSPopUpButton *createPopupAccessory(NSSavePanel *panel, const char *filte
return popup;
}
-int Fl_Native_File_Chooser::runmodal()
+int Fl_Native_File_Chooser_Darwin_Driver::runmodal()
{
NSString *dir = nil;
NSString *fname = nil;
@@ -563,7 +628,7 @@ int Fl_Native_File_Chooser::runmodal()
// 1 - user cancelled
// -1 - failed; errmsg() has reason
//
-int Fl_Native_File_Chooser::post() {
+int Fl_Native_File_Chooser_Darwin_Driver::post() {
// INITIALIZE BROWSER
if ( _filt_total == 0 ) { // Make sure they match
_filt_value = 0; // TBD: move to someplace more logical?
@@ -571,30 +636,30 @@ int Fl_Native_File_Chooser::post() {
NSAutoreleasePool *localPool;
localPool = [[NSAutoreleasePool alloc] init];
switch (_btype) {
- case BROWSE_FILE:
- case BROWSE_MULTI_FILE:
- case BROWSE_DIRECTORY:
- case BROWSE_MULTI_DIRECTORY:
+ case Fl_Native_File_Chooser::BROWSE_FILE:
+ case Fl_Native_File_Chooser::BROWSE_MULTI_FILE:
+ case Fl_Native_File_Chooser::BROWSE_DIRECTORY:
+ case Fl_Native_File_Chooser::BROWSE_MULTI_DIRECTORY:
_panel = [NSOpenPanel openPanel];
break;
- case BROWSE_SAVE_DIRECTORY:
- case BROWSE_SAVE_FILE:
+ case Fl_Native_File_Chooser::BROWSE_SAVE_DIRECTORY:
+ case Fl_Native_File_Chooser::BROWSE_SAVE_FILE:
_panel = [NSSavePanel savePanel];
break;
}
NSString *nstitle = [NSString stringWithUTF8String: (_title ? _title : "No Title")];
[(NSSavePanel*)_panel setTitle:nstitle];
switch (_btype) {
- case BROWSE_MULTI_FILE:
+ case Fl_Native_File_Chooser::BROWSE_MULTI_FILE:
[(NSOpenPanel*)_panel setAllowsMultipleSelection:YES];
break;
- case BROWSE_MULTI_DIRECTORY:
+ case Fl_Native_File_Chooser::BROWSE_MULTI_DIRECTORY:
[(NSOpenPanel*)_panel setAllowsMultipleSelection:YES];
/* FALLTHROUGH */
- case BROWSE_DIRECTORY:
+ case Fl_Native_File_Chooser::BROWSE_DIRECTORY:
[(NSOpenPanel*)_panel setCanChooseDirectories:YES];
break;
- case BROWSE_SAVE_DIRECTORY:
+ case Fl_Native_File_Chooser::BROWSE_SAVE_DIRECTORY:
[(NSSavePanel*)_panel setCanCreateDirectories:YES];
break;
}
@@ -621,13 +686,13 @@ int Fl_Native_File_Chooser::post() {
FLsaveDelegate *saveDelegate = [[[FLsaveDelegate alloc] init] autorelease];
[(NSSavePanel*)_panel setAllowsOtherFileTypes:YES];
[(NSSavePanel*)_panel setDelegate:saveDelegate];
- [saveDelegate option:(_options & SAVEAS_CONFIRM)];
+ [saveDelegate option:(_options & Fl_Native_File_Chooser::SAVEAS_CONFIRM)];
if (_filt_total) {
if (_filt_value >= _filt_total) _filt_value = _filt_total - 1;
char *t = prepareMacFilter(_filt_total, _filter, _filt_patt);
popup = createPopupAccessory((NSSavePanel*)_panel, t, [[(NSSavePanel*)_panel nameFieldLabel] UTF8String], _filt_value);
delete[] t;
- if (_options & USE_FILTER_EXT) {
+ if (_options & Fl_Native_File_Chooser::USE_FILTER_EXT) {
[popup setAction:@selector(changedPopup:)];
[popup setTarget:saveDelegate];
[saveDelegate panel:(NSSavePanel*)_panel];