Fix STR #2653: (Mac OS only) filters in file chooser panels have now the form filter_name (pattern)
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@8774 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
parent
965e81fc87
commit
ad73700388
@ -373,6 +373,45 @@ int Fl_Native_File_Chooser::get_saveas_basename(void) {
|
|||||||
void Fl_Native_File_Chooser::type(int val) {
|
void Fl_Native_File_Chooser::type(int val) {
|
||||||
_btype = val;
|
_btype = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Input
|
||||||
|
filter= "C files\t*.{c,h}\nText files\t*.txt\n"
|
||||||
|
patterns[0] = "*.{c,h}"
|
||||||
|
patterns[1] = "*.txt"
|
||||||
|
count = 2
|
||||||
|
Return:
|
||||||
|
"C files (*.{c,h})\nText files (*.txt)\n"
|
||||||
|
*/
|
||||||
|
static char *prepareMacFilter(int count, const char *filter, char **patterns) {
|
||||||
|
int rank = 0, l = 0;
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
l += strlen(patterns[i]) + 3;
|
||||||
|
}
|
||||||
|
const char *p = filter;
|
||||||
|
char *q; q = new char[strlen(p) + l + 1];
|
||||||
|
const char *r, *s;
|
||||||
|
char *t;
|
||||||
|
t = q;
|
||||||
|
do { // copy to t what is in filter removing what is between \t and \n, if any
|
||||||
|
r = strchr(p, '\n');
|
||||||
|
if (!r) r = p + strlen(p);
|
||||||
|
s = strchr(p, '\t');
|
||||||
|
if (s && s < r) {
|
||||||
|
memcpy(q, p, s - p);
|
||||||
|
q += s - p;
|
||||||
|
if (rank < count) { sprintf(q, " (%s)", patterns[rank]); q += strlen(q); }
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
memcpy(q, p, r - p);
|
||||||
|
q += r - p;
|
||||||
|
}
|
||||||
|
rank++;
|
||||||
|
*(q++) = '\n';
|
||||||
|
if (*p) p = r + 1;
|
||||||
|
} while(*p);
|
||||||
|
*q = 0;
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
@interface FLopenDelegate : NSObject
|
@interface FLopenDelegate : NSObject
|
||||||
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
|
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
|
||||||
@ -503,19 +542,7 @@ int Fl_Native_File_Chooser::post() {
|
|||||||
if ( [(NSSavePanel*)_panel isKindOfClass:[NSOpenPanel class]] ) {
|
if ( [(NSSavePanel*)_panel isKindOfClass:[NSOpenPanel class]] ) {
|
||||||
NSPopUpButton *popup = nil;
|
NSPopUpButton *popup = nil;
|
||||||
if (_filt_total) {
|
if (_filt_total) {
|
||||||
char *p; p = _filter;
|
char *t = prepareMacFilter(_filt_total, _filter, _filt_patt);
|
||||||
char *q; q = new char[strlen(p) + 1];
|
|
||||||
char *r, *s, *t;
|
|
||||||
t = q;
|
|
||||||
do { // copy to t what is in _filter removing what is between \t and \n, if any
|
|
||||||
r = strchr(p, '\n');
|
|
||||||
if (!r) r = p + strlen(p) - 1;
|
|
||||||
s = strchr(p, '\t');
|
|
||||||
if (s && s < r) { memcpy(q, p, s - p); q += s - p; *(q++) = '\n'; }
|
|
||||||
else { memcpy(q, p, r - p + 1); q += r - p + 1; }
|
|
||||||
*q = 0;
|
|
||||||
p = r + 1;
|
|
||||||
} while(*p);
|
|
||||||
popup = createPopupAccessory((NSSavePanel*)_panel, t, "Enable:", 0);
|
popup = createPopupAccessory((NSSavePanel*)_panel, t, "Enable:", 0);
|
||||||
delete[] t;
|
delete[] t;
|
||||||
[[popup menu] addItem:[NSMenuItem separatorItem]];
|
[[popup menu] addItem:[NSMenuItem separatorItem]];
|
||||||
@ -576,7 +603,9 @@ int Fl_Native_File_Chooser::post() {
|
|||||||
}
|
}
|
||||||
if (_directory && !dir) dir = [[NSString alloc] initWithUTF8String:_directory];
|
if (_directory && !dir) dir = [[NSString alloc] initWithUTF8String:_directory];
|
||||||
if (_filt_total) {
|
if (_filt_total) {
|
||||||
popup = createPopupAccessory((NSSavePanel*)_panel, _filter, "Format:", _filt_value);
|
char *t = prepareMacFilter(_filt_total, _filter, _filt_patt);
|
||||||
|
popup = createPopupAccessory((NSSavePanel*)_panel, t, "Format:", _filt_value);
|
||||||
|
delete[] t;
|
||||||
}
|
}
|
||||||
retval = [(NSSavePanel*)_panel runModalForDirectory:dir file:fname];
|
retval = [(NSSavePanel*)_panel runModalForDirectory:dir file:fname];
|
||||||
if (_filt_total) {
|
if (_filt_total) {
|
||||||
|
Loading…
Reference in New Issue
Block a user