--- a/ui/cocoa/menu.m Wed Apr 02 13:21:11 2014 +0200 +++ b/ui/cocoa/menu.m Wed Apr 02 20:31:47 2014 +0200 @@ -29,6 +29,7 @@ #import <stdio.h> #import <stdlib.h> #import <string.h> +#import <stdarg.h> #import "menu.h" #import "window.h" @@ -78,6 +79,43 @@ @end +@implementation UiGroupMenuItem + +- (id)initWithTitle:(NSString*)title action:(SEL)action keyEquivalent:(NSString*)s { + [super initWithTitle:title action:action keyEquivalent:s]; + groups = [[NSMutableArray alloc]initWithCapacity: 16]; + return self; +} + +- (void) addGroup:(int)group { + NSNumber *groupNumber = [NSNumber numberWithInteger:group]; + [groups addObject:groupNumber]; +} + +- (void) checkGroups:(int*)g count:(int)n { + int c = [groups count]; + + char *check = calloc(1, c); + for(int i=0;i<n;i++) { + for(int k=0;k<c;k++) { + NSNumber *groupNumber = [groups objectAtIndex:k]; + if([groupNumber intValue] == g[i]) { + check[k] = 1; + break; + } + } + } + + for(int j=0;j<c;j++) { + if(check[j] == 0) { + [self setEnabled:NO]; + return; + } + } + [self setEnabled:YES]; +} + +@end static NSMenu *currentMenu = NULL; @@ -100,6 +138,7 @@ NSMenuItem *menuItem = [[NSApp mainMenu] addItemWithTitle:str action:nil keyEquivalent:@""]; [menu setDelegate: delegate]; + [menu setAutoenablesItems:NO]; [[NSApp mainMenu] setSubmenu:menu forItem:menuItem]; currentMenu = menu; @@ -107,23 +146,53 @@ } void ui_menuitem(char *label, ui_callback f, void *data) { - EventWrapper *event = [[EventWrapper alloc]initWithData:data callback:f]; - NSString *str = [[NSString alloc] initWithUTF8String:label]; + ui_menuitem_gr(label, f, data, -1); +} + +void ui_menuitem_st(char *stockid, ui_callback f, void *data) { + ui_menuitem_stgr(stockid, f, data, -1); +} + +void ui_menuitem_gr(char *label, ui_callback f, void *userdata, ...) { + // create menu item + EventWrapper *event = [[EventWrapper alloc]initWithData:userdata callback:f]; + NSString *title = [[NSString alloc] initWithUTF8String:label]; + UiGroupMenuItem *item = [[UiGroupMenuItem alloc]initWithTitle:title action:@selector(handleEvent:) keyEquivalent:@""]; + [item setTarget:event]; - NSMenuItem *item = [currentMenu addItemWithTitle:str - action:@selector(handleEvent:) keyEquivalent:@""]; - [item setTarget:event]; + // add groups + va_list ap; + va_start(ap, userdata); + int group; + while((group = va_arg(ap, int)) != -1) { + [item addGroup: group]; + } + + + [currentMenu addItem:item]; currentItemIndex++; } -void ui_menuitem_st(char *stockid, ui_callback f, void *data) { - EventWrapper *event = [[EventWrapper alloc]initWithData:data callback:f]; +void ui_menuitem_stgr(char *stockid, ui_callback f, void *userdata, ...) { + // create menu item + EventWrapper *event = [[EventWrapper alloc]initWithData:userdata callback:f]; UiStockItem *si = ui_get_stock_item(stockid); + UiGroupMenuItem *item = [[UiGroupMenuItem alloc]initWithTitle:si->label + action:@selector(handleEvent:) + keyEquivalent:si->keyEquivalent]; + [item setTarget:event]; - NSMenuItem *item = [currentMenu addItemWithTitle:si->label - action:@selector(handleEvent:) keyEquivalent:si->keyEquivalent]; - [item setTarget:event]; + // add groups + va_list ap; + va_start(ap, userdata); + int group; + while((group = va_arg(ap, int)) != -1) { + [item addGroup: group]; + } + + + [currentMenu addItem:item]; currentItemIndex++; }