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.mm99
1 files changed, 68 insertions, 31 deletions
diff --git a/src/Fl_Native_File_Chooser_MAC.mm b/src/Fl_Native_File_Chooser_MAC.mm
index 8439f32d0..e68e15b03 100644
--- a/src/Fl_Native_File_Chooser_MAC.mm
+++ b/src/Fl_Native_File_Chooser_MAC.mm
@@ -551,40 +551,77 @@ static char *prepareMacFilter(int count, const char *filter, char **patterns) {
}
@end
+
+@interface FLHiddenFilesAction : NSObject
+{
+@public
+ NSSavePanel *panel;
+ NSButton *button;
+}
+- (void)action;
+@end
+@implementation FLHiddenFilesAction
+- (void)action {
+ [panel setShowsHiddenFiles:[button intValue]];
+}
+@end
+
+
static NSPopUpButton *createPopupAccessory(NSSavePanel *panel, const char *filter, const char *title, int rank)
{
NSPopUpButton *popup;
- NSRect rectview = NSMakeRect(5, 5, 350, 30 );
+ NSRect rectview = NSMakeRect(5, 5, 350, filter ? 60 : 30);
NSView *view = [[[NSView alloc] initWithFrame:rectview] autorelease];
NSRect rectbox = NSMakeRect(0, 3, 140, 20 );
- NSBox *box = [[[NSBox alloc] initWithFrame:rectbox] autorelease];
- NSRect rectpop = NSMakeRect(105, 0, 246, 30 );
- popup = [[[NSPopUpButton alloc ] initWithFrame:rectpop pullsDown:NO] autorelease];
- [view addSubview:box];
- [view addSubview:popup];
- [box setBorderType:NSNoBorder];
- NSString *nstitle = [[NSString alloc] initWithUTF8String:title];
- [box setTitle:nstitle];
- [nstitle release];
- NSFont *font = [NSFont controlContentFontOfSize:NSRegularControlSize];
- [box setTitleFont:font];
- [box sizeToFit];
- // horizontally move box to fit the locale-dependent width of its title
- NSRect r=[box frame];
- NSPoint o = r.origin;
- o.x = rectpop.origin.x - r.size.width + 15;
- [box setFrameOrigin:o];
- CFStringRef tab = CFSTR("\n");
- CFStringRef tmp_cfs;
- tmp_cfs = CFStringCreateWithCString(NULL, filter, kCFStringEncodingUTF8);
- CFArrayRef array = CFStringCreateArrayBySeparatingStrings(NULL, tmp_cfs, tab);
- CFRelease(tmp_cfs);
- CFRelease(tab);
- [popup addItemsWithTitles:(NSArray*)array];
- NSMenuItem *item = [popup itemWithTitle:@""];
- if (item) [popup removeItemWithTitle:@""];
- CFRelease(array);
- [popup selectItemAtIndex:rank];
+ // the "Show hidden files" button
+ NSRect hidden_files_rect = {{150, (filter ? 35 : 0)}, {80, 30}};
+ NSButton *hidden_files = [[[NSButton alloc] initWithFrame:hidden_files_rect] autorelease];
+ [hidden_files setButtonType:
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12
+ NSButtonTypeSwitch
+#else
+ NSSwitchButton
+#endif
+ ];
+ [hidden_files setTitle:[NSString stringWithUTF8String:Fl_File_Chooser::hidden_label]];
+ [hidden_files sizeToFit];
+ [hidden_files setIntValue:0];
+ [view addSubview:hidden_files];
+ static FLHiddenFilesAction *target = [[FLHiddenFilesAction alloc] init]; // never released
+ target->panel = panel;
+ target->button = hidden_files;
+ [hidden_files setAction:@selector(action)];
+ [hidden_files setTarget:target];
+ if (filter) {
+ NSBox *box = [[[NSBox alloc] initWithFrame:rectbox] autorelease];
+ NSRect rectpop = NSMakeRect(105, 0, 246, 30 );
+ popup = [[[NSPopUpButton alloc ] initWithFrame:rectpop pullsDown:NO] autorelease];
+ [view addSubview:box];
+ [view addSubview:popup];
+ [box setBorderType:NSNoBorder];
+ NSString *nstitle = [[NSString alloc] initWithUTF8String:title];
+ [box setTitle:nstitle];
+ [nstitle release];
+ NSFont *font = [NSFont controlContentFontOfSize:NSRegularControlSize];
+ [box setTitleFont:font];
+ [box sizeToFit];
+ // horizontally move box to fit the locale-dependent width of its title
+ NSRect r=[box frame];
+ NSPoint o = r.origin;
+ o.x = rectpop.origin.x - r.size.width + 15;
+ [box setFrameOrigin:o];
+ CFStringRef tab = CFSTR("\n");
+ CFStringRef tmp_cfs;
+ tmp_cfs = CFStringCreateWithCString(NULL, filter, kCFStringEncodingUTF8);
+ CFArrayRef array = CFStringCreateArrayBySeparatingStrings(NULL, tmp_cfs, tab);
+ CFRelease(tmp_cfs);
+ CFRelease(tab);
+ [popup addItemsWithTitles:(NSArray*)array];
+ NSMenuItem *item = [popup itemWithTitle:@""];
+ if (item) [popup removeItemWithTitle:@""];
+ CFRelease(array);
+ [popup selectItemAtIndex:rank];
+ }
[panel setAccessoryView:view];
return popup;
}
@@ -710,7 +747,7 @@ int Fl_Quartz_Native_File_Chooser_Driver::post() {
FLopenDelegate *openDelegate = [[[FLopenDelegate alloc] init] autorelease];
[openDelegate setPopup:popup filter_pattern:_filt_patt];
[_panel setDelegate:openDelegate];
- }
+ } else createPopupAccessory(_panel, NULL, Fl_File_Chooser::show_label, 0);
}
else {
FLsaveDelegate *saveDelegate = [[[FLsaveDelegate alloc] init] autorelease];
@@ -738,7 +775,7 @@ int Fl_Quartz_Native_File_Chooser_Driver::post() {
}
[_panel setCanSelectHiddenExtension:YES];
[_panel setExtensionHidden:NO];
- }
+ } else createPopupAccessory(_panel, NULL, Fl_File_Chooser::show_label, 0);
}
int retval = runmodal();
if (_filt_total) {