/* * Copyright 2011 Sven Weidauer * * 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 . */ #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 () @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