1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/views/mac/SkOptionsTableView.mm Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,297 @@ 1.4 + 1.5 +/* 1.6 + * Copyright 2011 Google Inc. 1.7 + * 1.8 + * Use of this source code is governed by a BSD-style license that can be 1.9 + * found in the LICENSE file. 1.10 + */ 1.11 + 1.12 +#import "SkOptionsTableView.h" 1.13 +#import "SkTextFieldCell.h" 1.14 +@implementation SkOptionItem 1.15 +@synthesize fCell, fItem; 1.16 +- (void)dealloc { 1.17 + [fCell release]; 1.18 + [super dealloc]; 1.19 +} 1.20 +@end 1.21 + 1.22 +@implementation SkOptionsTableView 1.23 +@synthesize fItems; 1.24 + 1.25 +- (id)initWithCoder:(NSCoder*)coder { 1.26 + if ((self = [super initWithCoder:coder])) { 1.27 + self.dataSource = self; 1.28 + self.delegate = self; 1.29 + fMenus = NULL; 1.30 + fShowKeys = YES; 1.31 + [self setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleNone]; 1.32 + self.fItems = [NSMutableArray array]; 1.33 + } 1.34 + return self; 1.35 +} 1.36 + 1.37 +- (void)dealloc { 1.38 + self.fItems = nil; 1.39 + [super dealloc]; 1.40 +} 1.41 + 1.42 +- (void) view:(SkNSView*)view didAddMenu:(const SkOSMenu*)menu {} 1.43 +- (void) view:(SkNSView*)view didUpdateMenu:(const SkOSMenu*)menu { 1.44 + [self updateMenu:menu]; 1.45 +} 1.46 + 1.47 +- (IBAction)toggleKeyEquivalents:(id)sender { 1.48 + fShowKeys = !fShowKeys; 1.49 + NSMenuItem* item = (NSMenuItem*)sender; 1.50 + [item setState:fShowKeys]; 1.51 + [self reloadData]; 1.52 +} 1.53 + 1.54 +- (void)registerMenus:(const SkTDArray<SkOSMenu*>*)menus { 1.55 + fMenus = menus; 1.56 + for (int i = 0; i < fMenus->count(); ++i) { 1.57 + [self loadMenu:(*fMenus)[i]]; 1.58 + } 1.59 +} 1.60 + 1.61 +- (void)updateMenu:(const SkOSMenu*)menu { 1.62 + // the first menu is always assumed to be the static, the second is 1.63 + // repopulated every time over and over again 1.64 + 1.65 + // seems pretty weird that we have to get rid of the const'ness here, 1.66 + // but trying to propagate the const'ness through all the way to the fMenus 1.67 + // vector was a non-starter. 1.68 + 1.69 + int menuIndex = fMenus->find(const_cast<SkOSMenu *>(menu)); 1.70 + if (menuIndex >= 0 && menuIndex < fMenus->count()) { 1.71 + NSUInteger first = 0; 1.72 + for (int i = 0; i < menuIndex; ++i) { 1.73 + first += (*fMenus)[i]->getCount(); 1.74 + } 1.75 + [fItems removeObjectsInRange:NSMakeRange(first, [fItems count] - first)]; 1.76 + [self loadMenu:menu]; 1.77 + } 1.78 + [self reloadData]; 1.79 +} 1.80 + 1.81 +- (NSCellStateValue)triStateToNSState:(SkOSMenu::TriState)state { 1.82 + if (SkOSMenu::kOnState == state) 1.83 + return NSOnState; 1.84 + else if (SkOSMenu::kOffState == state) 1.85 + return NSOffState; 1.86 + else 1.87 + return NSMixedState; 1.88 +} 1.89 + 1.90 +- (void)loadMenu:(const SkOSMenu*)menu { 1.91 + const SkOSMenu::Item* menuitems[menu->getCount()]; 1.92 + menu->getItems(menuitems); 1.93 + for (int i = 0; i < menu->getCount(); ++i) { 1.94 + const SkOSMenu::Item* item = menuitems[i]; 1.95 + SkOptionItem* option = [[SkOptionItem alloc] init]; 1.96 + option.fItem = item; 1.97 + 1.98 + if (SkOSMenu::kList_Type == item->getType()) { 1.99 + int index = 0, count = 0; 1.100 + SkOSMenu::FindListItemCount(*item->getEvent(), &count); 1.101 + NSMutableArray* optionstrs = [[NSMutableArray alloc] initWithCapacity:count]; 1.102 + SkAutoTDeleteArray<SkString> ada(new SkString[count]); 1.103 + SkString* options = ada.get(); 1.104 + SkOSMenu::FindListItems(*item->getEvent(), options); 1.105 + for (int i = 0; i < count; ++i) 1.106 + [optionstrs addObject:[NSString stringWithUTF8String:options[i].c_str()]]; 1.107 + SkOSMenu::FindListIndex(*item->getEvent(), item->getSlotName(), &index); 1.108 + option.fCell = [self createList:optionstrs current:index]; 1.109 + [optionstrs release]; 1.110 + } 1.111 + else { 1.112 + bool state = false; 1.113 + SkString str; 1.114 + SkOSMenu::TriState tristate; 1.115 + switch (item->getType()) { 1.116 + case SkOSMenu::kAction_Type: 1.117 + option.fCell = [self createAction]; 1.118 + break; 1.119 + case SkOSMenu::kSlider_Type: 1.120 + SkScalar min, max, value; 1.121 + SkOSMenu::FindSliderValue(*item->getEvent(), item->getSlotName(), &value); 1.122 + SkOSMenu::FindSliderMin(*item->getEvent(), &min); 1.123 + SkOSMenu::FindSliderMax(*item->getEvent(), &max); 1.124 + option.fCell = [self createSlider:value 1.125 + min:min 1.126 + max:max]; 1.127 + break; 1.128 + case SkOSMenu::kSwitch_Type: 1.129 + SkOSMenu::FindSwitchState(*item->getEvent(), item->getSlotName(), &state); 1.130 + option.fCell = [self createSwitch:(BOOL)state]; 1.131 + break; 1.132 + case SkOSMenu::kTriState_Type: 1.133 + SkOSMenu::FindTriState(*item->getEvent(), item->getSlotName(), &tristate); 1.134 + option.fCell = [self createTriState:[self triStateToNSState:tristate]]; 1.135 + break; 1.136 + case SkOSMenu::kTextField_Type: 1.137 + SkOSMenu::FindText(*item->getEvent(),item->getSlotName(), &str); 1.138 + option.fCell = [self createTextField:[NSString stringWithUTF8String:str.c_str()]]; 1.139 + break; 1.140 + default: 1.141 + break; 1.142 + } 1.143 + } 1.144 + [fItems addObject:option]; 1.145 + [option release]; 1.146 + } 1.147 +} 1.148 + 1.149 +- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { 1.150 + return [self.fItems count]; 1.151 +} 1.152 + 1.153 +- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 1.154 + NSInteger columnIndex = [tableView columnWithIdentifier:[tableColumn identifier]]; 1.155 + if (columnIndex == 0) { 1.156 + const SkOSMenu::Item* item = ((SkOptionItem*)[fItems objectAtIndex:row]).fItem; 1.157 + NSString* label = [NSString stringWithUTF8String:item->getLabel()]; 1.158 + if (fShowKeys) 1.159 + return [NSString stringWithFormat:@"%@ (%c)", label, item->getKeyEquivalent()]; 1.160 + else 1.161 + return label; 1.162 + } 1.163 + else 1.164 + return nil; 1.165 +} 1.166 + 1.167 +- (NSCell *)tableView:(NSTableView *)tableView dataCellForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 1.168 + if (tableColumn) { 1.169 + NSInteger columnIndex = [tableView columnWithIdentifier:[tableColumn identifier]]; 1.170 + if (columnIndex == 1) 1.171 + return [((SkOptionItem*)[fItems objectAtIndex:row]).fCell copy]; 1.172 + else 1.173 + return [[[SkTextFieldCell alloc] init] autorelease]; 1.174 + } 1.175 + return nil; 1.176 +} 1.177 + 1.178 +- (void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 1.179 + NSInteger columnIndex = [tableView columnWithIdentifier:[tableColumn identifier]]; 1.180 + if (columnIndex == 1) { 1.181 + SkOptionItem* option = (SkOptionItem*)[self.fItems objectAtIndex:row]; 1.182 + NSCell* storedCell = option.fCell; 1.183 + const SkOSMenu::Item* item = option.fItem; 1.184 + switch (item->getType()) { 1.185 + case SkOSMenu::kAction_Type: 1.186 + break; 1.187 + case SkOSMenu::kList_Type: 1.188 + [cell selectItemAtIndex:[(NSPopUpButtonCell*)storedCell indexOfSelectedItem]]; 1.189 + break; 1.190 + case SkOSMenu::kSlider_Type: 1.191 + [cell setFloatValue:[storedCell floatValue]]; 1.192 + break; 1.193 + case SkOSMenu::kSwitch_Type: 1.194 + [cell setState:[(NSButtonCell*)storedCell state]]; 1.195 + break; 1.196 + case SkOSMenu::kTextField_Type: 1.197 + if ([[storedCell stringValue] length] > 0) 1.198 + [cell setStringValue:[storedCell stringValue]]; 1.199 + break; 1.200 + case SkOSMenu::kTriState_Type: 1.201 + [cell setState:[(NSButtonCell*)storedCell state]]; 1.202 + break; 1.203 + default: 1.204 + break; 1.205 + } 1.206 + } 1.207 + else { 1.208 + [(SkTextFieldCell*)cell setEditable:NO]; 1.209 + } 1.210 +} 1.211 + 1.212 +- (void)tableView:(NSTableView *)tableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 1.213 + NSInteger columnIndex = [tableView columnWithIdentifier:[tableColumn identifier]]; 1.214 + if (columnIndex == 1) { 1.215 + SkOptionItem* option = (SkOptionItem*)[self.fItems objectAtIndex:row]; 1.216 + NSCell* cell = option.fCell; 1.217 + const SkOSMenu::Item* item = option.fItem; 1.218 + switch (item->getType()) { 1.219 + case SkOSMenu::kAction_Type: 1.220 + item->postEvent(); 1.221 + break; 1.222 + case SkOSMenu::kList_Type: 1.223 + [(NSPopUpButtonCell*)cell selectItemAtIndex:[anObject intValue]]; 1.224 + item->setInt([anObject intValue]); 1.225 + break; 1.226 + case SkOSMenu::kSlider_Type: 1.227 + [cell setFloatValue:[anObject floatValue]]; 1.228 + item->setScalar([anObject floatValue]); 1.229 + break; 1.230 + case SkOSMenu::kSwitch_Type: 1.231 + [cell setState:[anObject boolValue]]; 1.232 + item->setBool([anObject boolValue]); 1.233 + break; 1.234 + case SkOSMenu::kTextField_Type: 1.235 + if ([anObject length] > 0) { 1.236 + [cell setStringValue:anObject]; 1.237 + item->setString([anObject UTF8String]); 1.238 + } 1.239 + break; 1.240 + case SkOSMenu::kTriState_Type: 1.241 + [cell setState:[anObject intValue]]; 1.242 + item->setTriState((SkOSMenu::TriState)[anObject intValue]); 1.243 + break; 1.244 + default: 1.245 + break; 1.246 + } 1.247 + item->postEvent(); 1.248 + } 1.249 +} 1.250 + 1.251 +- (NSCell*)createAction{ 1.252 + NSButtonCell* cell = [[[NSButtonCell alloc] init] autorelease]; 1.253 + [cell setTitle:@""]; 1.254 + [cell setButtonType:NSMomentaryPushInButton]; 1.255 + [cell setBezelStyle:NSSmallSquareBezelStyle]; 1.256 + return cell; 1.257 +} 1.258 + 1.259 +- (NSCell*)createList:(NSArray*)items current:(int)index { 1.260 + NSPopUpButtonCell* cell = [[[NSPopUpButtonCell alloc] init] autorelease]; 1.261 + [cell addItemsWithTitles:items]; 1.262 + [cell selectItemAtIndex:index]; 1.263 + [cell setArrowPosition:NSPopUpArrowAtBottom]; 1.264 + [cell setBezelStyle:NSSmallSquareBezelStyle]; 1.265 + return cell; 1.266 +} 1.267 + 1.268 +- (NSCell*)createSlider:(float)value min:(float)min max:(float)max { 1.269 + NSSliderCell* cell = [[[NSSliderCell alloc] init] autorelease]; 1.270 + [cell setFloatValue:value]; 1.271 + [cell setMinValue:min]; 1.272 + [cell setMaxValue:max]; 1.273 + return cell; 1.274 +} 1.275 + 1.276 +- (NSCell*)createSwitch:(BOOL)state { 1.277 + NSButtonCell* cell = [[[NSButtonCell alloc] init] autorelease]; 1.278 + [cell setState:state]; 1.279 + [cell setTitle:@""]; 1.280 + [cell setButtonType:NSSwitchButton]; 1.281 + return cell; 1.282 +} 1.283 + 1.284 +- (NSCell*)createTextField:(NSString*)placeHolder { 1.285 + SkTextFieldCell* cell = [[[SkTextFieldCell alloc] init] autorelease]; 1.286 + [cell setEditable:YES]; 1.287 + [cell setStringValue:@""]; 1.288 + [cell setPlaceholderString:placeHolder]; 1.289 + return cell; 1.290 +} 1.291 + 1.292 +- (NSCell*)createTriState:(NSCellStateValue)state { 1.293 + NSButtonCell* cell = [[[NSButtonCell alloc] init] autorelease]; 1.294 + [cell setAllowsMixedState:TRUE]; 1.295 + [cell setTitle:@""]; 1.296 + [cell setState:(NSInteger)state]; 1.297 + [cell setButtonType:NSSwitchButton]; 1.298 + return cell; 1.299 +} 1.300 +@end