blob: 2a0cd30387a54a70785b6416dc70de887b1a6f80 [file] [log] [blame]
yangsu@google.com12d177d2011-08-01 17:07:12 +00001#import "SkOptionsTableView.h"
2#import "SkTextFieldCell.h"
3@implementation SkOptionItem
4@synthesize fCell, fItem;
5- (void)dealloc {
6 [fCell release];
7 [super dealloc];
8}
9@end
10
11@implementation SkOptionsTableView
12@synthesize fItems;
13
14- (id)initWithCoder:(NSCoder*)coder {
15 if ((self = [super initWithCoder:coder])) {
16 self.dataSource = self;
17 self.delegate = self;
yangsu@google.comf3493f02011-08-08 15:12:05 +000018 fMenus = NULL;
19 fShowKeys = YES;
yangsu@google.com12d177d2011-08-01 17:07:12 +000020 [self setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleNone];
21 self.fItems = [NSMutableArray array];
22 }
23 return self;
24}
25
26- (void)dealloc {
27 self.fItems = nil;
28 [super dealloc];
29}
30
31- (void) view:(SkNSView*)view didAddMenu:(const SkOSMenu*)menu {}
32- (void) view:(SkNSView*)view didUpdateMenu:(const SkOSMenu*)menu {
33 [self updateMenu:menu];
34}
35
yangsu@google.comf3493f02011-08-08 15:12:05 +000036- (IBAction)toggleKeyEquivalents:(id)sender {
37 fShowKeys = !fShowKeys;
38 NSMenuItem* item = (NSMenuItem*)sender;
39 [item setState:fShowKeys];
40 [self reloadData];
41}
42
yangsu@google.com12d177d2011-08-01 17:07:12 +000043- (void)registerMenus:(const SkTDArray<SkOSMenu*>*)menus {
44 fMenus = menus;
45 for (NSUInteger i = 0; i < fMenus->count(); ++i) {
46 [self loadMenu:(*fMenus)[i]];
47 }
48}
49
50- (void)updateMenu:(SkOSMenu*)menu {
51 // the first menu is always assumed to be the static, the second is
52 // repopulated every time over and over again
53 int menuIndex = fMenus->find(menu);
54 if (menuIndex >= 0 && menuIndex < fMenus->count()) {
55 NSUInteger first = 0;
56 for (NSInteger i = 0; i < menuIndex; ++i) {
57 first += (*fMenus)[i]->countItems();
58 }
59 [fItems removeObjectsInRange:NSMakeRange(first, [fItems count] - first)];
60 [self loadMenu:menu];
61 }
62 [self reloadData];
63}
64
65- (NSCellStateValue)triStateToNSState:(SkOSMenu::TriState)state {
66 if (SkOSMenu::kOnState == state)
67 return NSOnState;
68 else if (SkOSMenu::kOffState == state)
69 return NSOffState;
70 else
71 return NSMixedState;
72}
73
74- (void)loadMenu:(const SkOSMenu*)menu {
75 for (int i = 0; i < menu->countItems(); ++i) {
76 const SkOSMenu::Item* item = menu->getItem(i);
yangsu@google.com12d177d2011-08-01 17:07:12 +000077 SkOptionItem* option = [[SkOptionItem alloc] init];
78 option.fItem = item;
yangsu@google.comf3493f02011-08-08 15:12:05 +000079
80 if (SkOSMenu::kList_Type == item->getType()) {
81 int index = 0, count = 0;
82 SkOSMenu::FindListItemCount(item->getEvent(), &count);
83 NSMutableArray* optionstrs = [[NSMutableArray alloc] initWithCapacity:count];
84 SkString options[count];
85 SkOSMenu::FindListItems(item->getEvent(), options);
86 for (int i = 0; i < count; ++i)
87 [optionstrs addObject:[NSString stringWithUTF8String:options[i].c_str()]];
88 SkOSMenu::FindListIndex(item->getEvent(), item->getSlotName(), &index);
89 option.fCell = [self createList:optionstrs current:index];
90 [optionstrs release];
91 }
92 else {
93 bool state = false;
94 SkString str;
95 SkOSMenu::TriState tristate;
96 switch (item->getType()) {
97 case SkOSMenu::kAction_Type:
98 option.fCell = [self createAction];
99 break;
100 case SkOSMenu::kSlider_Type:
101 SkScalar min, max, value;
102 SkOSMenu::FindSliderValue(item->getEvent(), item->getSlotName(), &value);
103 SkOSMenu::FindSliderMin(item->getEvent(), &min);
104 SkOSMenu::FindSliderMax(item->getEvent(), &max);
105 option.fCell = [self createSlider:value
106 min:min
107 max:max];
108 break;
109 case SkOSMenu::kSwitch_Type:
110 SkOSMenu::FindSwitchState(item->getEvent(), item->getSlotName(), &state);
111 option.fCell = [self createSwitch:(BOOL)state];
112 break;
113 case SkOSMenu::kTriState_Type:
114 SkOSMenu::FindTriState(item->getEvent(), item->getSlotName(), &tristate);
115 option.fCell = [self createTriState:[self triStateToNSState:tristate]];
116 break;
117 case SkOSMenu::kTextField_Type:
118 SkOSMenu::FindText(item->getEvent(),item->getSlotName(), &str);
119 option.fCell = [self createTextField:[NSString stringWithUTF8String:str.c_str()]];
120 break;
121 default:
122 break;
123 }
yangsu@google.com12d177d2011-08-01 17:07:12 +0000124 }
125 [fItems addObject:option];
126 [option release];
127 }
128}
129
130- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
131 return [self.fItems count];
132}
133
134- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
135 int columnIndex = [tableView columnWithIdentifier:[tableColumn identifier]];
yangsu@google.comf3493f02011-08-08 15:12:05 +0000136 if (columnIndex == 0) {
137 const SkOSMenu::Item* item = ((SkOptionItem*)[fItems objectAtIndex:row]).fItem;
138 NSString* label = [NSString stringWithUTF8String:item->getLabel()];
139 if (fShowKeys)
140 return [NSString stringWithFormat:@"%@ (%c)", label, item->getKeyEquivalent()];
141 else
142 return label;
143 }
yangsu@google.com12d177d2011-08-01 17:07:12 +0000144 else
145 return nil;
146}
147
148- (NSCell *)tableView:(NSTableView *)tableView dataCellForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
149 if (tableColumn) {
150 int columnIndex = [tableView columnWithIdentifier:[tableColumn identifier]];
151 if (columnIndex == 1)
152 return [((SkOptionItem*)[fItems objectAtIndex:row]).fCell copy];
153 else
154 return [[[SkTextFieldCell alloc] init] autorelease];
155 }
156 return nil;
157}
158
159- (void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
160 int columnIndex = [tableView columnWithIdentifier:[tableColumn identifier]];
161 if (columnIndex == 1) {
162 SkOptionItem* option = (SkOptionItem*)[self.fItems objectAtIndex:row];
163 NSCell* storedCell = option.fCell;
164 const SkOSMenu::Item* item = option.fItem;
165 switch (item->getType()) {
166 case SkOSMenu::kAction_Type:
167 break;
168 case SkOSMenu::kList_Type:
169 [cell selectItemAtIndex:[(NSPopUpButtonCell*)storedCell indexOfSelectedItem]];
170 break;
171 case SkOSMenu::kSlider_Type:
172 [cell setFloatValue:[storedCell floatValue]];
173 break;
174 case SkOSMenu::kSwitch_Type:
yangsu@google.com12d177d2011-08-01 17:07:12 +0000175 [cell setState:[(NSButtonCell*)storedCell state]];
176 break;
177 case SkOSMenu::kTextField_Type:
178 if ([[storedCell stringValue] length] > 0)
179 [cell setStringValue:[storedCell stringValue]];
180 break;
181 case SkOSMenu::kTriState_Type:
yangsu@google.com12d177d2011-08-01 17:07:12 +0000182 [cell setState:[(NSButtonCell*)storedCell state]];
183 break;
184 default:
185 break;
186 }
187 }
188 else {
189 [(SkTextFieldCell*)cell setEditable:NO];
190 }
191}
192
193- (void)tableView:(NSTableView *)tableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
194 int columnIndex = [tableView columnWithIdentifier:[tableColumn identifier]];
195 if (columnIndex == 1) {
196 SkOptionItem* option = (SkOptionItem*)[self.fItems objectAtIndex:row];
197 NSCell* cell = option.fCell;
198 const SkOSMenu::Item* item = option.fItem;
199 switch (item->getType()) {
200 case SkOSMenu::kAction_Type:
201 item->postEvent();
202 break;
203 case SkOSMenu::kList_Type:
204 [(NSPopUpButtonCell*)cell selectItemAtIndex:[anObject intValue]];
205 item->postEventWithInt([anObject intValue]);
206 break;
207 case SkOSMenu::kSlider_Type:
208 [cell setFloatValue:[anObject floatValue]];
209 item->postEventWithScalar([anObject floatValue]);
210 break;
211 case SkOSMenu::kSwitch_Type:
212 [cell setState:[anObject boolValue]];
213 item->postEventWithBool([anObject boolValue]);
214 break;
215 case SkOSMenu::kTextField_Type:
216 if ([anObject length] > 0) {
217 [cell setStringValue:anObject];
218 item->postEventWithString([anObject UTF8String]);
219 }
220 break;
221 case SkOSMenu::kTriState_Type:
222 [cell setState:[anObject intValue]];
223 item->postEventWithInt([anObject intValue]);
224 break;
225 default:
226 break;
227 }
228 }
229}
230
231- (NSCell*)createAction{
232 NSButtonCell* cell = [[[NSButtonCell alloc] init] autorelease];
233 [cell setTitle:@""];
234 [cell setButtonType:NSMomentaryPushInButton];
235 [cell setBezelStyle:NSSmallSquareBezelStyle];
236 return cell;
237}
238
239- (NSCell*)createList:(NSArray*)items current:(int)index {
240 NSPopUpButtonCell* cell = [[[NSPopUpButtonCell alloc] init] autorelease];
241 [cell addItemsWithTitles:items];
242 [cell selectItemAtIndex:index];
243 [cell setArrowPosition:NSPopUpArrowAtBottom];
244 [cell setBezelStyle:NSSmallSquareBezelStyle];
245 return cell;
246}
247
yangsu@google.com12d177d2011-08-01 17:07:12 +0000248- (NSCell*)createSlider:(float)value min:(float)min max:(float)max {
249 NSSliderCell* cell = [[[NSSliderCell alloc] init] autorelease];
250 [cell setFloatValue:value];
251 [cell setMinValue:min];
252 [cell setMaxValue:max];
253 return cell;
254}
255
256- (NSCell*)createSwitch:(BOOL)state {
257 NSButtonCell* cell = [[[NSButtonCell alloc] init] autorelease];
yangsu@google.com12d177d2011-08-01 17:07:12 +0000258 [cell setState:state];
yangsu@google.comf3493f02011-08-08 15:12:05 +0000259 [cell setTitle:@""];
yangsu@google.com12d177d2011-08-01 17:07:12 +0000260 [cell setButtonType:NSSwitchButton];
261 return cell;
262}
263
264- (NSCell*)createTextField:(NSString*)placeHolder; {
265 SkTextFieldCell* cell = [[[SkTextFieldCell alloc] init] autorelease];
266 [cell setEditable:YES];
267 [cell setStringValue:@""];
268 [cell setPlaceholderString:placeHolder];
269 return cell;
270}
271
272- (NSCell*)createTriState:(NSCellStateValue)state {
273 NSButtonCell* cell = [[[NSButtonCell alloc] init] autorelease];
yangsu@google.com12d177d2011-08-01 17:07:12 +0000274 [cell setAllowsMixedState:TRUE];
yangsu@google.comf3493f02011-08-08 15:12:05 +0000275 [cell setTitle:@""];
yangsu@google.com12d177d2011-08-01 17:07:12 +0000276 [cell setState:(NSInteger)state];
277 [cell setButtonType:NSSwitchButton];
278 return cell;
279}
yangsu@google.comf3493f02011-08-08 15:12:05 +0000280@end