1 | //␊ |
2 | // TableViewsController.mm␊ |
3 | // ChameleonPrefPane␊ |
4 | //␊ |
5 | // Created by Rekursor on 1/29/10.␊ |
6 | //␊ |
7 | ␊ |
8 | #import "ChameleonPrefPane.h"␊ |
9 | #import "ChameleonPropertyList.h"␊ |
10 | #import "PreferencesControllerBase.H"␊ |
11 | #import "TableViewsController.h"␊ |
12 | #import "BootSetupController.h"␊ |
13 | #import "ShellProcess.h"␊ |
14 | #import "CenterTextFieldCell.h"␊ |
15 | #import "PartitionInfoManager.h"␊ |
16 | ␊ |
17 | #import <SecurityFoundation/SFAuthorization.h>␊ |
18 | #import <SecurityInterface/SFAuthorizationView.h>␊ |
19 | #include <string>␊ |
20 | #include <vector>␊ |
21 | ␊ |
22 | //--------------------------------------------------------------------------␊ |
23 | // MenuEntry definitions␊ |
24 | //--------------------------------------------------------------------------␊ |
25 | typedef enum { ␊ |
26 | ␉PaneBootFrom, PaneBootSetup, PaneBootFlags, PanePeripherals, ␊ |
27 | ␉PaneAdvanced, PaneEfiInject, PaneSmbios, PaneAbout␊ |
28 | } MenuEntryPane;␊ |
29 | ␊ |
30 | struct MenuEntry␊ |
31 | {␉␊ |
32 | ␉NSString* title;␊ |
33 | ␉MenuEntryPane pane;␊ |
34 | ␉NSImage**␉img;␊ |
35 | };␊ |
36 | ␊ |
37 | ␊ |
38 | static NSImage*␉␉␉␉␉mImgPaneBootFrom; ␊ |
39 | static NSImage*␉␉␉␉␉mImgPaneBootSetup;␊ |
40 | static NSImage*␉␉␉␉␉mImgPaneBootFlags;␊ |
41 | static NSImage*␉␉␉␉␉mImgPanePeripherals;␊ |
42 | static NSImage*␉␉␉␉␉mImgPaneAdvanced;␊ |
43 | static NSImage*␉␉␉␉␉mImgPaneEfiInject;␊ |
44 | static NSImage*␉␉␉␉␉mImgPaneSmbios;␊ |
45 | static NSImage*␉␉␉␉␉mImgPaneAbout;␊ |
46 | ␊ |
47 | ␊ |
48 | static const MenuEntry sMenuList[] =␊ |
49 | {␊ |
50 | ␉{@"Boot_From", PaneBootFrom, &mImgPaneBootFrom}, ␊ |
51 | ␉{@"Boot_Setup",␉PaneBootSetup, &mImgPaneBootSetup},␊ |
52 | ␉{@"Boot_Flags", PaneBootFlags, &mImgPaneBootFlags}, ␊ |
53 | ␉{@"Peripherals", PanePeripherals, &mImgPanePeripherals}, ␊ |
54 | ␉{@"Efi_Inject", PaneEfiInject, &mImgPaneEfiInject}, ␊ |
55 | ␉{@"Bios", PaneSmbios, &mImgPaneSmbios},␊ |
56 | ␉{@"Advanced", PaneAdvanced, &mImgPaneAdvanced}, ␊ |
57 | ␉{@"About", PaneAbout, &mImgPaneAbout}␊ |
58 | };␊ |
59 | const int iMenuListSize = sizeof(sMenuList)/ sizeof(MenuEntry);␊ |
60 | ␊ |
61 | static TableViewsController* _instance; // Singleton DP def.␊ |
62 | ␊ |
63 | ␊ |
64 | //--------------------------------------------------------------------------␊ |
65 | @implementation TableViewsController␊ |
66 | //--------------------------------------------------------------------------␊ |
67 | - (id) init␊ |
68 | {␊ |
69 | ␉self = [super init];␊ |
70 | ␉_instance = self;␊ |
71 | ␉␊ |
72 | ␉currentRowSel = -1;␊ |
73 | ␉// set the image to display the current file being played␊ |
74 | ␉mMacOSXImage = [self getImageResource: @"MacOSX" ofType: @"png"];␊ |
75 | ␉mWindowsImage = [self getImageResource: @"Windows" ofType: @"png"];␊ |
76 | ␉mLinuxImage = [self getImageResource: @"Linux" ofType: @"png"];␊ |
77 | ␉mCDROMImage = [self getImageResource: @"CDROM" ofType: @"png"];␊ |
78 | ␉mUnknownImage = [self getImageResource: @"Chameleon" ofType: @"tiff"];␊ |
79 | ␉␊ |
80 | ␉mImgPaneBootFrom = [self getImageResource:@"disk" ofType:@"png"]; ␊ |
81 | ␉mImgPaneBootSetup = [self getImageResource:@"wrench" ofType:@"png"];␊ |
82 | ␉mImgPaneBootFlags = [self getImageResource:@"flag" ofType:@"png"]; ␊ |
83 | ␉mImgPanePeripherals = [self getImageResource:@"plug" ofType:@"png"]; ␊ |
84 | ␉mImgPaneAdvanced = [self getImageResource:@"advanced" ofType:@"png"];␊ |
85 | ␉mImgPaneEfiInject = [self getImageResource:@"syringe" ofType:@"png"]; ␊ |
86 | ␉mImgPaneSmbios = [self getImageResource:@"chip" ofType:@"png"];␊ |
87 | ␉mImgPaneAbout = [self getImageResource:@"chamsmall" ofType:@"png"];␊ |
88 | ␊ |
89 | ␉return self;␊ |
90 | }␊ |
91 | ␊ |
92 | //--------------------------------------------------------------------------␊ |
93 | // Singleton impl␊ |
94 | + (TableViewsController*) instance␊ |
95 | {␊ |
96 | ␉return _instance;␊ |
97 | }␊ |
98 | //--------------------------------------------------------------------------␊ |
99 | + (bool) isUnlocked␊ |
100 | { ␊ |
101 | ␉return [[ChameleonPrefPane instance] isUnlocked];␊ |
102 | }␊ |
103 | ␊ |
104 | //--------------------------------------------------------------------------␊ |
105 | + (AuthorizationRef) authorization␊ |
106 | { ␊ |
107 | ␉return [TableViewsController isUnlocked] ?␊ |
108 | ␉[ [ [ChameleonPrefPane instance]->authView authorization] authorizationRef] : NULL;␊ |
109 | }␊ |
110 | //--------------------------------------------------------------------------␊ |
111 | - (NSTableView*) partitionsTable␊ |
112 | {␊ |
113 | ␉return mPartitionsTable;␊ |
114 | }␊ |
115 | //--------------------------------------------------------------------------␊ |
116 | - (id) getImageResource: (NSString *) str ofType: (NSString*) sType␊ |
117 | {␊ |
118 | ␉NSImage * img=nil;␊ |
119 | ␉if(!str) return nil;␊ |
120 | ␉NSBundle * b = [NSBundle bundleForClass:[self class]];␊ |
121 | ␉NSString* sRes = [b pathForResource: str ofType:sType ];␊ |
122 | ␉img = [[[NSImage alloc] initWithContentsOfFile: sRes] autorelease];␊ |
123 | ␉return img;␊ |
124 | }␊ |
125 | //--------------------------------------------------------------------------␊ |
126 | - (BOOL)tableView:(NSTableView *)tv shouldSelectRow:(NSInteger)row␊ |
127 | {␊ |
128 | ␉if (tv!= mPartitionsTable)␊ |
129 | ␉␉return YES;␊ |
130 | ␊ |
131 | ␉// PartitionInfoElement* partInfo = [PartsInfoMgr objectAtIndex:row];␊ |
132 | ␉BOOL ret = YES; // (partInfo != nil && [partInfo hidden]== false) ? YES : NO;␊ |
133 | ␉␊ |
134 | ␉return ret;␊ |
135 | }␊ |
136 | //--------------------------------------------------------------------------␊ |
137 | - (BOOL)tableView:(NSTableView *)tv shouldSelectTableColumn:(NSInteger)col␊ |
138 | {␊ |
139 | ␉if (tv!= mPartitionsTable)␊ |
140 | ␉␉return YES;␊ |
141 | ␉return NO;␊ |
142 | }␊ |
143 | //--------------------------------------------------------------------------␊ |
144 | - (NSString *)tableView:␊ |
145 | (NSTableView *) tv ␊ |
146 | toolTipForCell:(NSCell *)aCell ␊ |
147 | rect:(NSRectPointer)rect ␊ |
148 | tableColumn:(NSTableColumn *)aTableColumn ␊ |
149 | row:(NSInteger)row ␊ |
150 | mouseLocation:(NSPoint)mouseLocation␊ |
151 | {␊ |
152 | if (row<0) return nil;␊ |
153 | ␊ |
154 | ␉if (tv == mPartitionsTable)␊ |
155 | ␉{␊ |
156 | PartitionInfoElement* partInfo = [PartsInfoMgr objectAtIndex: row];␊ |
157 | return [partInfo bootDescription];␊ |
158 | ␊ |
159 | } ␊ |
160 | return nil;␊ |
161 | }␊ |
162 | ␊ |
163 | //--------------------------------------------------------------------------␊ |
164 | - (void)tableViewSelectionDidChange:(NSNotification *)notification {␊ |
165 | ␉␊ |
166 | ␉NSTableView* tv= [notification object];␊ |
167 | ␉if (tv == mPartitionsTable)␊ |
168 | ␉{␊ |
169 | ␉␉if ([tv selectedRow] != currentRowSel)␊ |
170 | ␉␉{␊ |
171 | ␉␉␉currentRowSel = [tv selectedRow];␊ |
172 | ␉␉␉if (currentRowSel>=0)␊ |
173 | ␉␉␉{␊ |
174 | ␉␉␉␉PartitionInfoElement* partInfo = [[PartsInfoMgr objectAtIndex:currentRowSel] retain];␊ |
175 | ␉␉␉␉NSString* s;␊ |
176 | ␉␉␉␉␊ |
177 | #if 0 ␊ |
178 | ␉␉␉␉// Chameleon is difficult for now to synchronize with uuid ␊ |
179 | ␉␉␉␉// because windows partitions have a different uuid format than osx ones in the booter ...␊ |
180 | ␉␉␉␉// we'll address that interfacing problem later, probably in chameleon itself first.␊ |
181 | ␉␉␉␉if ( [partInfo vUUID].length>>0)␊ |
182 | ␉␉␉␉␉s = [partInfo vUUID];␊ |
183 | ␉␉␉␉else␊ |
184 | #endif␊ |
185 | ␉␉␉␉␉s = [partInfo hdString];␊ |
186 | ␊ |
187 | ␉␉␉␉AuthorizationRef auth= [TableViewsController authorization];␊ |
188 | ␉␉␉␉if(BootProp::instance().setStringForKey(kDefaultPartition, [s UTF8String]))␊ |
189 | ␉␉␉␉␉BootProp::instance().save(auth);␊ |
190 | ␉␉␉␉[ PreferencesControllerBase loadOptionsFromBootFile];␊ |
191 | ␉␉␉␉[partInfo release];␊ |
192 | ␉␉␉}␊ |
193 | ␉␉␉else␊ |
194 | ␉␉␉{ // no line selected␊ |
195 | ␉␉␉␉BootProp::instance().removeKeyAndValue(kDefaultPartition);␊ |
196 | ␉␉␉␉[ PreferencesControllerBase loadOptionsFromBootFile];␊ |
197 | ␉␉␉␉␊ |
198 | ␉␉␉}␊ |
199 | ␉␉}␊ |
200 | ␉}␊ |
201 | ␉else if (tv == mTabViewPanesSelect)␊ |
202 | ␉{␊ |
203 | ␉␉int selected = [tv selectedRow];␊ |
204 | ␉␉if(selected>=0)␊ |
205 | ␉␉{␊ |
206 | ␉␉␉switch (sMenuList[selected].pane) ␊ |
207 | ␉␉␉{␊ |
208 | ␉␉␉␉case PaneBootFrom:␊ |
209 | ␉␉␉␉␉[mTabViewPanes selectTabViewItem: mBootFrom];␊ |
210 | ␉␉␉␉␉break;␊ |
211 | ␉␉␉␉case PaneBootSetup:␊ |
212 | ␉␉␉␉␉[mTabViewPanes selectTabViewItem: mBootSetup];␊ |
213 | ␉␉␉␉␉break;␊ |
214 | ␉␉␉␉case PaneBootFlags:␊ |
215 | ␉␉␉␉␉[mTabViewPanes selectTabViewItem: mBootFlags];␊ |
216 | ␉␉␉␉␉break;␊ |
217 | ␉␉␉␉case PanePeripherals:␊ |
218 | ␉␉␉␉␉[mTabViewPanes selectTabViewItem: mPeripherals];␊ |
219 | ␉␉␉␉␉break;␊ |
220 | ␉␉␉␉case PaneEfiInject:␊ |
221 | ␉␉␉␉␉[mTabViewPanes selectTabViewItem: mEfiInject];␊ |
222 | ␉␉␉␉␉break;␊ |
223 | ␉␉␉␉case PaneAdvanced:␊ |
224 | ␉␉␉␉␉[mTabViewPanes selectTabViewItem: mAdvanced];␊ |
225 | ␉␉␉␉␉break;␊ |
226 | ␉␉␉␉case PaneSmbios:␊ |
227 | ␉␉␉␉␉[mTabViewPanes selectTabViewItem: mSmbios];␊ |
228 | ␉␉␉␉␉break;␊ |
229 | ␉␉␉␉case PaneAbout:␊ |
230 | ␉␉␉␉␉[mTabViewPanes selectTabViewItem: mAbout];␊ |
231 | ␉␉␉␉␉break;␊ |
232 | ␉␉␉␉default:␊ |
233 | ␉␉␉␉␉break;␊ |
234 | ␉␉␉}␊ |
235 | ␉␉␉[mTabViewPanes setNeedsDisplay: true ];␊ |
236 | ␉␉}␊ |
237 | ␉}␊ |
238 | }␊ |
239 | ␊ |
240 | //--------------------------------------------------------------------------␊ |
241 | - (void) tableView:(NSTableView*) tableView setObjectValue:(id) object␊ |
242 | ␉forTableColumn:(NSTableColumn*) tableColumn row:(NSInteger) row␊ |
243 | {␊ |
244 | ␉if (object == nil) return;␊ |
245 | ␉PartitionInfoElement* partInfo = [PartsInfoMgr objectAtIndex:row];␊ |
246 | ␉bool changed = false;␊ |
247 | ␊ |
248 | ␉if (tableColumn == mHideOrViewColumn)␊ |
249 | ␉{␊ |
250 | int value = [object intValue] ;␊ |
251 | ␉␉[partInfo setHidden: !!value];␊ |
252 | ␊ |
253 | NSString *hideStr = [partInfo hdString];␊ |
254 | const char* sOrig = BootProp::instance().getStringForKey(kHidePartition);␊ |
255 | NSString *curStr = [[NSString stringWithUTF8String: sOrig ? sOrig : ""] ␊ |
256 | stringByReplacingOccurrencesOfString:hideStr withString:@""];␊ |
257 | if (value) curStr = [NSString stringWithFormat:@"%@ %@", curStr, hideStr];␊ |
258 | BootProp::instance().setStringForKey(kHidePartition, [curStr UTF8String]);␊ |
259 | changed=true;␊ |
260 | ␊ |
261 | ␉}␊ |
262 | ␉else if (tableColumn == mPartitionNameColumn)␊ |
263 | ␉{␊ |
264 | ␉␉[partInfo setVAliasName: (object==nil || [object length] == 0) ? [partInfo vName] : object];␊ |
265 | ␉␉const char * sCur = BootProp::instance().getStringForKey(kRenamePartition);␊ |
266 | ␉␉NSString * currentStr = [NSString stringWithUTF8String: sCur ? sCur : ""] ;␊ |
267 | ␉␉NSString* renStr = [PartsInfoMgr getRenameStringFrom:(NSString*) currentStr ␊ |
268 | ␉␉␉␉␉␉␉␉␉␉␉␉andPartition: (PartitionInfoElement*) partInfo];␊ |
269 | ␉␉if (renStr!=nil && ␊ |
270 | ␉␉ BootProp::instance().setStringForKey(kRenamePartition, [renStr UTF8String])␊ |
271 | ␉␉ )␊ |
272 | ␉␉{␊ |
273 | changed = true;␊ |
274 | ␉␉}␊ |
275 | ␉}␊ |
276 | ␊ |
277 | if (changed)␊ |
278 | {␊ |
279 | AuthorizationRef auth= [TableViewsController authorization];␊ |
280 | BootProp::instance().save(auth);␊ |
281 | [ PreferencesControllerBase loadOptionsFromBootFile];␊ |
282 | }␊ |
283 | ␉NSLog(@"object at column %@ row %ld Set %@", [[tableColumn headerCell] stringValue], (long) row, object);␊ |
284 | }␊ |
285 | //--------------------------------------------------------------------------␊ |
286 | - (NSInteger) numberOfRowsInTableView:(NSTableView *)tableView␊ |
287 | {␊ |
288 | ␉int size=0;␊ |
289 | ␉if (tableView == mPartitionsTable)␊ |
290 | ␉␉size = [PartsInfoMgr count];␊ |
291 | ␉else␊ |
292 | ␉␉size = iMenuListSize;␊ |
293 | ␉return size;␊ |
294 | }␊ |
295 | ␊ |
296 | //--------------------------------------------------------------------------␊ |
297 | - (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row␊ |
298 | {␊ |
299 | ␉id ret=nil;␊ |
300 | ␉if (tableView == mPartitionsTable)␊ |
301 | ␉{␊ |
302 | ␉␉PartitionInfoElement* partInfo = [PartsInfoMgr objectAtIndex:row];␊ |
303 | ␉␉␊ |
304 | ␉␉if (tableColumn == mHideOrViewColumn) ␊ |
305 | ␉␉{␊ |
306 | ␉␉␉ret = [NSNumber numberWithInt:(int) [partInfo hidden] ? 1 : 0];␊ |
307 | ␉␉}␊ |
308 | ␉␉else if (tableColumn == mPartitionUIDColumn) ␊ |
309 | ␉␉{␊ |
310 | ␉␉␉ret = [partInfo vUUID ];␊ |
311 | ␉␉}␊ |
312 | ␉␉else if (tableColumn == mPartitionImgColumn) ␊ |
313 | ␉␉{␊ |
314 | ␉␉␉switch( [partInfo imageIndexFromFs])␊ |
315 | ␉␉␉{␊ |
316 | ␉␉␉␉case 0:␊ |
317 | ␉␉␉␉␉ret = mMacOSXImage;␊ |
318 | ␉␉␉␉␉break;␊ |
319 | ␉␉␉␉case 1:␊ |
320 | ␉␉␉␉␉ret = mWindowsImage;␊ |
321 | ␉␉␉␉␉break;␊ |
322 | ␉␉␉␉case 2:␊ |
323 | ␉␉␉␉␉ret = mLinuxImage;␊ |
324 | ␉␉␉␉␉break;␊ |
325 | ␉␉␉␉default:␊ |
326 | ␉␉␉␉␉ret = mUnknownImage;␊ |
327 | ␉␉␉␉␉break;␊ |
328 | ␉␉␉␉␉␊ |
329 | ␉␉␉}␊ |
330 | ␉␉}␊ |
331 | ␉␉else if (tableColumn == mFileSystemColumn) ␊ |
332 | ␉␉{␊ |
333 | ␉␉␉ret = [partInfo vKind];␊ |
334 | ␉␉}␊ |
335 | ␉␉else if (tableColumn == mPartitionNameColumn) ␊ |
336 | ␉␉{␊ |
337 | ␉␉␉ret = [partInfo vAliasName]; // vAliasName is vName if no alias␊ |
338 | ␉␉}␊ |
339 | ␉␉else if (tableColumn == mPartitionIDColumn) ␊ |
340 | ␉␉{␊ |
341 | ␉␉␉ret= [partInfo hdString];␊ |
342 | ␉␉} ␊ |
343 | ␊ |
344 | ␉}␊ |
345 | ␉else if (tableView == mTabViewPanesSelect)␊ |
346 | ␉{␊ |
347 | ␉␉// menu tv handling␊ |
348 | ␉␉if (tableColumn == mMenuName) ␊ |
349 | ␉␉{␊ |
350 | ␉␉␉NSBundle * b = [NSBundle bundleForClass:[self class]];␊ |
351 | ␉␉␉ret = NSLocalizedStringFromTableInBundle(sMenuList[row].title, nil, b, @"comment");␊ |
352 | ␉␉}␉␊ |
353 | ␉␉else if (tableColumn == mMenuIcon) ␊ |
354 | ␉␉{␊ |
355 | ␉␉␉ret = *sMenuList[row].img;␊ |
356 | ␉␉}␉␊ |
357 | ␉}␊ |
358 | ␊ |
359 | ␉return ret;␊ |
360 | }␊ |
361 | //--------------------------------------------------------------------------␊ |
362 | ␊ |
363 | @end␊ |
364 | |