summaryrefslogtreecommitdiff
path: root/cocoa/BrowserViewController.m
diff options
context:
space:
mode:
Diffstat (limited to 'cocoa/BrowserViewController.m')
-rw-r--r--cocoa/BrowserViewController.m59
1 files changed, 59 insertions, 0 deletions
diff --git a/cocoa/BrowserViewController.m b/cocoa/BrowserViewController.m
index 8f903c839..387227de0 100644
--- a/cocoa/BrowserViewController.m
+++ b/cocoa/BrowserViewController.m
@@ -182,4 +182,63 @@ static inline bool compare_float( float a, float b )
[browserView updateHistory];
}
+struct history_add_menu_item_data {
+ NSInteger index;
+ NSMenu *menu;
+ id target;
+};
+
+static bool history_add_menu_item_cb( const struct history *history, int x0, int y0, int x1, int y1,
+ const struct history_entry *page, void *user_data )
+{
+ struct history_add_menu_item_data *data = user_data;
+
+ NSMenuItem *item = nil;
+ if (data->index < [data->menu numberOfItems]) {
+ item = [data->menu itemAtIndex: data->index];
+ } else {
+ item = [[NSMenuItem alloc] initWithTitle: @""
+ action: @selector( historyItemSelected: )
+ keyEquivalent: @""];
+ [data->menu addItem: item];
+ [item release];
+ }
+ ++data->index;
+
+ [item setTarget: data->target];
+ [item setTitle: [NSString stringWithUTF8String: history_entry_get_title( page )]];
+ [item setRepresentedObject: [NSValue valueWithPointer: page]];
+
+ return true;
+}
+
+- (IBAction) historyItemSelected: (id) sender;
+{
+ struct history_entry *entry = [[sender representedObject] pointerValue];
+ history_go( browser, browser->history, entry, false );
+ [self updateBackForward];
+}
+
+- (void) buildBackMenu: (NSMenu *)menu;
+{
+ struct history_add_menu_item_data data = {
+ .index = 0,
+ .menu = menu,
+ .target = self
+ };
+ history_enumerate_back( browser->history, history_add_menu_item_cb, &data );
+ while (data.index < [menu numberOfItems]) [menu removeItemAtIndex: data.index];
+}
+
+- (void) buildForwardMenu: (NSMenu *)menu;
+{
+ struct history_add_menu_item_data data = {
+ .index = 0,
+ .menu = menu,
+ .target = self
+ };
+ history_enumerate_forward( browser->history, history_add_menu_item_cb, &data );
+ while (data.index < [menu numberOfItems]) [menu removeItemAtIndex: data.index];
+}
+
@end