summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cocoa/FormSelectMenu.h33
-rw-r--r--cocoa/FormSelectMenu.m98
-rw-r--r--cocoa/Makefile.target1
-rw-r--r--cocoa/NetSurf.xcodeproj/project.pbxproj6
-rw-r--r--cocoa/gui.m7
5 files changed, 143 insertions, 2 deletions
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 <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/Cocoa.h>
+
+
+@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 <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 "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 = "<group>"; };
26EC3C4212ED8202000A960C /* HistoryView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HistoryView.h; sourceTree = "<group>"; };
26EC3C4312ED8202000A960C /* HistoryView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HistoryView.m; sourceTree = "<group>"; };
+ 26EC3F1612EF0CBD000A960C /* FormSelectMenu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FormSelectMenu.h; sourceTree = "<group>"; };
+ 26EC3F1712EF0CBD000A960C /* FormSelectMenu.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FormSelectMenu.m; sourceTree = "<group>"; };
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 = "<group>";
@@ -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]]];