diff options
| author | Manolo Gouy <Manolo> | 2011-06-03 10:06:27 +0000 |
|---|---|---|
| committer | Manolo Gouy <Manolo> | 2011-06-03 10:06:27 +0000 |
| commit | ad737003881b088759f1e2c66a0a9107a5fe447c (patch) | |
| tree | 89f2cfad818c392dcf6bd9e40a407a1f7de1a90c /src/Fl_Native_File_Chooser_MAC.mm | |
| parent | 965e81fc87ad15cf34aa9aba76e7eb6ba0eec400 (diff) | |
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
Diffstat (limited to 'src/Fl_Native_File_Chooser_MAC.mm')
| -rw-r--r-- | src/Fl_Native_File_Chooser_MAC.mm | 57 |
1 files changed, 43 insertions, 14 deletions
diff --git a/src/Fl_Native_File_Chooser_MAC.mm b/src/Fl_Native_File_Chooser_MAC.mm index c7594b03a..80e3b4901 100644 --- a/src/Fl_Native_File_Chooser_MAC.mm +++ b/src/Fl_Native_File_Chooser_MAC.mm @@ -373,6 +373,45 @@ int Fl_Native_File_Chooser::get_saveas_basename(void) { void Fl_Native_File_Chooser::type(int 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 #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]] ) { NSPopUpButton *popup = nil; if (_filt_total) { - char *p; p = _filter; - 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); + char *t = prepareMacFilter(_filt_total, _filter, _filt_patt); popup = createPopupAccessory((NSSavePanel*)_panel, t, "Enable:", 0); delete[] t; [[popup menu] addItem:[NSMenuItem separatorItem]]; @@ -576,7 +603,9 @@ int Fl_Native_File_Chooser::post() { } if (_directory && !dir) dir = [[NSString alloc] initWithUTF8String:_directory]; 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]; if (_filt_total) { |
