From cca607fbe85ae6b6ad517a08eee80ac6a6e83c50 Mon Sep 17 00:00:00 2001 From: Sven Weidauer Date: Tue, 25 Jan 2011 15:09:06 +0000 Subject: [PATCH] Creating select menus for forms svn path=/trunk/netsurf/; revision=11484 --- cocoa/FormSelectMenu.h | 33 +++++++++ cocoa/FormSelectMenu.m | 98 +++++++++++++++++++++++++ cocoa/Makefile.target | 1 + cocoa/NetSurf.xcodeproj/project.pbxproj | 6 ++ cocoa/gui.m | 7 +- 5 files changed, 143 insertions(+), 2 deletions(-) create mode 100644 cocoa/FormSelectMenu.h create mode 100644 cocoa/FormSelectMenu.m diff --git a/cocoa/FormSelectMenu.h b/cocoa/FormSelectMenu.h new file mode 100644 index 000000000..54f226fed --- /dev/null +++ b/cocoa/FormSelectMenu.h @@ -0,0 +1,33 @@ +/* + * 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 + + +@interface FormSelectMenu : NSObject { + NSMenu *menu; + NSPopUpButtonCell *cell; + + struct browser_window *browser; + struct form_control *control; +} + +- initWithControl: (struct form_control *) control forWindow: (struct browser_window *) window; +- (void) runInView: (NSView *) view; + +@end diff --git a/cocoa/FormSelectMenu.m b/cocoa/FormSelectMenu.m new file mode 100644 index 000000000..62cb91220 --- /dev/null +++ b/cocoa/FormSelectMenu.m @@ -0,0 +1,98 @@ +/* + * 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 "FormSelectMenu.h" + +#import "render/form.h" +#import "render/box.h" + +@interface FormSelectMenu () + +- (void) itemSelected: (id) sender; + +@end + + +@implementation FormSelectMenu + + +- 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) { + [self release]; + return nil; + } + + [menu addItemWithTitle: @"" action: NULL keyEquivalent: @""]; + + NSInteger currentItemIndex = 0; + for (struct form_option *opt = control->data.select.items; opt != NULL; opt = opt->next) { + NSMenuItem *item = [[NSMenuItem alloc] initWithTitle: [NSString stringWithUTF8String: opt->text] + action: @selector( itemSelected: ) + keyEquivalent: @""]; + if (opt->selected) [item setState: NSOnState]; + [item setTarget: self]; + [item setTag: currentItemIndex++]; + [menu addItem: item]; + [item release]; + } + + [menu setDelegate: self]; + + return self; +} + +- (void) dealloc; +{ + [cell release]; + [menu release]; + + [super dealloc]; +} + +- (void) runInView: (NSView *) view; +{ + [self retain]; + + cell = [[NSPopUpButtonCell alloc] initTextCell: @"" pullsDown: YES]; + [cell setMenu: menu]; + + struct rect r; + box_bounds( control->box, &r ); + + [cell performClickWithFrame: NSMakeRect( r.x0, r.y0, r.x1 - r.x0, r.y1 - r.y0 ) + inView: view]; +} + +- (void) itemSelected: (id) sender; +{ + form_select_process_selection( browser->current_content, control, [sender tag] ); +} + +- (void) menuDidClose: (NSMenu *) sender; +{ + [self release]; +} + +@end diff --git a/cocoa/Makefile.target b/cocoa/Makefile.target index 8c14340fd..ba792dc49 100644 --- a/cocoa/Makefile.target +++ b/cocoa/Makefile.target @@ -74,6 +74,7 @@ S_COCOA := \ URLFieldCell.m \ TreeView.m \ HistoryView.m \ + FormSelectMenu.m \ bitmap.m \ fetch.m \ font.m \ diff --git a/cocoa/NetSurf.xcodeproj/project.pbxproj b/cocoa/NetSurf.xcodeproj/project.pbxproj index 8d059bbf7..25f390988 100644 --- a/cocoa/NetSurf.xcodeproj/project.pbxproj +++ b/cocoa/NetSurf.xcodeproj/project.pbxproj @@ -142,6 +142,7 @@ 26CDD0F612E726E0004FC66B /* BrowserViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 26CDD0F512E726E0004FC66B /* BrowserViewController.m */; }; 26EC3B6A12ED62C0000A960C /* URLFieldCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 26EC3B6912ED62C0000A960C /* URLFieldCell.m */; }; 26EC3C4412ED8202000A960C /* HistoryView.m in Sources */ = {isa = PBXBuildFile; fileRef = 26EC3C4312ED8202000A960C /* HistoryView.m */; }; + 26EC3F1812EF0CBD000A960C /* FormSelectMenu.m in Sources */ = {isa = PBXBuildFile; fileRef = 26EC3F1712EF0CBD000A960C /* FormSelectMenu.m */; }; 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; /* End PBXBuildFile section */ @@ -407,6 +408,8 @@ 26EC3B6912ED62C0000A960C /* URLFieldCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = URLFieldCell.m; sourceTree = ""; }; 26EC3C4212ED8202000A960C /* HistoryView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HistoryView.h; sourceTree = ""; }; 26EC3C4312ED8202000A960C /* HistoryView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HistoryView.m; sourceTree = ""; }; + 26EC3F1612EF0CBD000A960C /* FormSelectMenu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FormSelectMenu.h; sourceTree = ""; }; + 26EC3F1712EF0CBD000A960C /* FormSelectMenu.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FormSelectMenu.m; sourceTree = ""; }; 8D1107320486CEB800E47090 /* NetSurf.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NetSurf.app; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -805,6 +808,8 @@ 26EC3B6912ED62C0000A960C /* URLFieldCell.m */, 26EC3C4212ED8202000A960C /* HistoryView.h */, 26EC3C4312ED8202000A960C /* HistoryView.m */, + 26EC3F1612EF0CBD000A960C /* FormSelectMenu.h */, + 26EC3F1712EF0CBD000A960C /* FormSelectMenu.m */, ); name = Views; sourceTree = ""; @@ -1074,6 +1079,7 @@ 26CDD0F612E726E0004FC66B /* BrowserViewController.m in Sources */, 26EC3B6A12ED62C0000A960C /* URLFieldCell.m in Sources */, 26EC3C4412ED8202000A960C /* HistoryView.m in Sources */, + 26EC3F1812EF0CBD000A960C /* FormSelectMenu.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/cocoa/gui.m b/cocoa/gui.m index bac2590cd..03a9b1015 100644 --- a/cocoa/gui.m +++ b/cocoa/gui.m @@ -21,6 +21,7 @@ #import "BrowserView.h" #import "BrowserViewController.h" #import "BrowserWindowController.h" +#import "FormSelectMenu.h" #import "desktop/gui.h" #import "desktop/netsurf.h" @@ -199,6 +200,7 @@ void gui_window_set_pointer(struct gui_window *g, gui_pointer_shape shape) break; case GUI_POINTER_POINT: + case GUI_POINTER_MENU: [[NSCursor pointingHandCursor] set]; break; @@ -298,10 +300,11 @@ void gui_drag_save_selection(struct selection *s, struct gui_window *g) void gui_create_form_select_menu(struct browser_window *bw, struct form_control *control) { - UNIMPL(); + FormSelectMenu *menu = [[FormSelectMenu alloc] initWithControl: control forWindow: bw]; + [menu runInView: [(BrowserViewController *)bw->window browserView]]; + [menu release]; } - void gui_launch_url(const char *url) { [[NSWorkspace sharedWorkspace] openURL: [NSURL URLWithString: [NSString stringWithUTF8String: url]]];