summaryrefslogtreecommitdiff
path: root/frontends/cocoa/FormSelectMenu.m
blob: c849ba0c2913fe243460a73d561ddd6e295ab010 (plain)
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