1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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
|