diff options
Diffstat (limited to 'frontends/cocoa/FormSelectMenu.m')
-rw-r--r-- | frontends/cocoa/FormSelectMenu.m | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/frontends/cocoa/FormSelectMenu.m b/frontends/cocoa/FormSelectMenu.m new file mode 100644 index 000000000..c849ba0c2 --- /dev/null +++ b/frontends/cocoa/FormSelectMenu.m @@ -0,0 +1,110 @@ +/* + * Copyright 2011 Sven Weidauer <sven.weidauer@gmail.com> + * + * This file is part of NetSurf, http://www.netsurf-browser.org/ + * + * NetSurf is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * NetSurf 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#import "cocoa/FormSelectMenu.h" +#import "cocoa/coordinates.h" + +#import "netsurf/types.h" +#import "netsurf/browser_window.h" +#import "netsurf/form.h" + +static inline NSRect cocoa_rect_for_control(struct browser_window *bw, struct form_control *control) +{ + struct rect r; + form_control_bounding_rect(control, &r); + return cocoa_scaled_rect(browser_window_get_scale(bw), + r.x0, + r.y0, + r.x1, + r.y1); +} + +@interface FormSelectMenu () <NSMenuDelegate> + +@property (nonatomic) NSMenu *menu; +@property (nonatomic) NSPopUpButtonCell *cell; + +@property (nonatomic) struct browser_window *browser; +@property (nonatomic) struct form_control *control; + +- (void)itemSelected:(id)sender; + +@end + +@implementation FormSelectMenu + +- (instancetype)initWithControl:(struct form_control *)c forWindow:(struct browser_window *)w +{ + if ((self = [super init]) == nil) + return nil; + + _control = c; + _browser = w; + + _menu = [[NSMenu alloc] initWithTitle:@"Select"]; + if (_menu == nil) { + return nil; + } + + [_menu addItemWithTitle:@"" action:NULL keyEquivalent:@""]; + + NSInteger currentItemIndex = 0; + struct form_option *opt; + for (opt = form_select_get_option(_control, 0); + opt != NULL; + opt = opt->next) { + NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:[NSString stringWithUTF8String:opt->text] + action:@selector(itemSelected:) + keyEquivalent:@""]; + if (opt->selected) { + item.state = NSOnState; + } + item.target = self; + item.tag = currentItemIndex++; + [_menu addItem:item]; + } + + _menu.delegate = self; + + return self; +} + +- (void)runInView:(NSView *)view +{ + (void)(__bridge_retained void *) self; + + _cell = [[NSPopUpButtonCell alloc] initTextCell:@"" pullsDown:YES]; + _cell.menu = _menu; + + const NSRect rect = cocoa_rect_for_control(_browser, _control); + + [_cell attachPopUpWithFrame:rect inView:view]; + [_cell performClickWithFrame:rect inView:view]; +} + +- (void)itemSelected:(id)sender +{ + form_select_process_selection(_control, (int)[sender tag]); +} + +- (void)menuDidClose:(NSMenu *)sender +{ + (void)(__bridge_transfer id)((__bridge void *)self); +} + +@end |