Chameleon Applications

Chameleon Applications Commit Details

Date:2010-01-24 21:39:01 (14 years 2 months ago)
Author:Rekursor
Commit:49
Parents: 48
Message:Implemented last increment for bootConfig options: automatic type oriented bootConfig updating. Now all options are persistent. Needs more testing but already works fairly well.
Changes:
A/trunk/ChameleonPrefPane/Sources/KernOptionsParser.h
A/trunk/ChameleonPrefPane/Sources/string_util.cpp
A/trunk/ChameleonPrefPane/Sources/KernOptionsParser.cpp
M/trunk/ChameleonPrefPane/Sources/BootSetupController.h
M/trunk/ChameleonPrefPane/Sources/AdvancedSetupController.h
M/trunk/ChameleonPrefPane/Sources/BootSetupController.mm
M/trunk/ChameleonPrefPane/Sources/PropertyList.cpp
M/trunk/ChameleonPrefPane/Sources/BootPropertyList.cpp
M/trunk/ChameleonPrefPane/Sources/PropertyList.h
M/trunk/ChameleonPrefPane/English.lproj/Chameleon.xib
M/trunk/ChameleonPrefPane/Sources/PeripheralsController.h
M/trunk/ChameleonPrefPane/Sources/PreferencesControllerBase.mm
M/trunk/ChameleonPrefPane/Sources/BootFlagsController.h
M/trunk/ChameleonPrefPane/Sources/BootPropertyList.h
M/trunk/ChameleonPrefPane/Sources/PeripheralsController.mm

File differences

trunk/ChameleonPrefPane/Sources/AdvancedSetupController.h
4646
4747
4848
49
49
5050
5151
5252
}
- (IBAction) onCheckButtonChange: (NSButton*) sender;
- (IBAction) onTextFiedChange: (id) sender;
- (IBAction) onTextFiedChange: (NSTextField*) sender;
+ (AdvancedSetupController *)instance;
trunk/ChameleonPrefPane/Sources/string_util.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/*
* string_util.cpp
* ChameleonPrefPane
*
* Created by Rekursor on 1/23/10.
*/
#include "string_util.h"
/*
* String Tokenizer
* In: src string and separator
* Out: a list of string tokens
*/
std::list<std::string> tokenize(const std::string& src, const std::string& sep)
{
std::list<std::string> ret;
if (src.length()==0) return ret;
std::string::size_type left=0, right=0;
std::string token;
std::string::size_type len = sep.length();
for (left=0; (right = src.find(sep, left)) != std::string::npos; left = right + len )
{
token = src.substr (left, right-left);
if (token.length()>0) ret.push_back (token);
}
token = src.substr(left);
if (token.length()>0) ret.push_back (token);
return ret;
}
trunk/ChameleonPrefPane/Sources/BootPropertyList.cpp
1414
1515
1616
17
18
1719
1820
1921
2022
2123
2224
25
2326
2427
std::map<void*, BootOptionDesc*>::iterator bod;
for (bod=_idToDescDict.begin(); bod!=_idToDescDict.end(); bod++)
if(bod->second) delete bod->second;
for (bod=_contentIdToDescDict.begin(); bod!=_contentIdToDescDict.end(); bod++)
if(bod->second) delete bod->second;
}
void BootPropertyList::clearOptionDesc()
{
deleteOptionDesc();
_idToDescDict.clear();// now clear the pairs
_contentIdToDescDict.clear();// now clear the pairs
}
trunk/ChameleonPrefPane/Sources/BootPropertyList.h
4848
4949
5050
51
51
52
53
54
5255
5356
5457
......
5962
6063
6164
65
66
67
68
69
70
71
72
6273
6374
6475
......
8091
8192
8293
83
94
95
8496
8597
8698
// id to map BootOptionDesc handling
void addOptionDesc(void * ID, void* cID, BootOptionType t, const char * szName, const char* szDefault)
{
if (ID) _idToDescDict[ID] = new BootOptionDesc(ID, cID, t, szName? szName : "", szDefault ? szDefault : "");
if (ID) _idToDescDict[ID] =
new BootOptionDesc(ID, cID, t, szName? szName : "", szDefault ? szDefault : "");
if (cID) _contentIdToDescDict[cID] =
new BootOptionDesc(ID, cID, t, szName? szName : "", szDefault ? szDefault : "");
}
// find the desc corresponding to id:
return bod->second;
}
// find the option bod corresponding to contentID
const BootOptionDesc* findOptionContent(void *cID) const
{
std::map<void*, BootOptionDesc*>::const_iterator bod;
if (!cID || (bod=_contentIdToDescDict.find(cID))==_contentIdToDescDict.end()) return NULL;
return bod->second;
}
// opaque enumeration for the map
const BootOptionDesc* firstOption()
{
void deleteOptionDesc();
private:
std::map<void *, BootOptionDesc*> _idToDescDict; // dictionary for id -> desc association type
// dictionary for id -> desc and contentID -> desc association type
std::map<void *, BootOptionDesc*> _idToDescDict, _contentIdToDescDict;
std::map<void*, BootOptionDesc*>::const_iterator _bod;
};
trunk/ChameleonPrefPane/Sources/PeripheralsController.mm
5555
5656
5757
58
5958
6059
6160
{
}
//--------------------------------------------------------------------------
-(IBAction) onCheckButtonChange: (NSButton*) sender
{
trunk/ChameleonPrefPane/Sources/BootSetupController.mm
6262
6363
6464
65
66
67
68
69
70
71
72
73
74
7565
7666
7767
......
234224
235225
236226
237
238
239
240
241
242
243
244
245
246
247
248
249
250
227
228
229
251230
252
253231
254
232
255233
256234
257235
}
//--------------------------------------------------------------------------
-(void) loadOptionsFromBootFile
{
//// Get the Partitions options
//[self loadOptionFromBootFile: mDefaultPartition];
//[self loadOptionFromBootFile: mHidePartition];
//[self loadOptionFromBootFile: mRenamePartition];
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
- (void) loadFrozenParts
{
std::vector<PartitionInfo>& partList = partExtractor->editPartList(); //rw
{
[self onInjectPartsToFreeze: mInjectFrozenParts];
}
// Factorize this code by using the options descriptor map:
else if ( [self handleSender:sender withButton: mDefaultPartition andField: mDefaultPartitionText
forKey: kDefaultPartition] )
{
}
else if ( [self handleSender:sender withButton: mHidePartition andField: mHidePartitionText
forKey: kHidePartition] )
{
}
else if ( [self handleSender:sender withButton: mRenamePartition andField: mRenamePartitionText
forKey: kHidePartition] )
{
}
// Handle BootOptions generically:
else
[self handleSender:sender];
}
//--------------------------------------------------------------------------
-(IBAction) onTextFiedChange: (id) sender
-(IBAction) onTextFiedChange: (NSTextField*) sender
{
}
trunk/ChameleonPrefPane/Sources/PropertyList.cpp
175175
176176
177177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197178
198179
199180
......
260241
261242
262243
244
263245
264246
265
247
248
266249
250
267251
268252
269253
......
302286
303287
304288
305
306
307
289
308290
309291
310292
311
293
294
312295
313
314296
315297
316298
......
327309
328310
329311
330
331
332312
333313
314
334315
335
336
316
317
318
337319
338320
339321
340
322
341323
342324
343325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
}
/****************************************************************************/
static void show(CFStringRef formatString, ...) {
CFStringRef resultString;
CFDataRef data;
va_list argList;
va_start(argList, formatString);
resultString = CFStringCreateWithFormatAndArguments(NULL, NULL, formatString, argList);
va_end(argList);
data = CFStringCreateExternalRepresentation(NULL, resultString, CFStringGetSystemEncoding(), '?');
if (data != NULL) {
printf ("%.*s\n\n", (int)CFDataGetLength(data), CFDataGetBytePtr(data));
CFRelease(data);
}
CFRelease(resultString);
}
/****************************************************************************/
/*
* Always return a valid static const string, if the CFSTR is not valid, then we return ""
*/
if (_CFURLRef)
{
CFRetain(_CFURLRef);
_proplistRef = CreatePropertyListFromFile(inURL, errorString);
if (_proplistRef)
if (_proplistRef) {
CFRetain(_proplistRef);
ret= true;
}
}
// restore rights
ret= chmodFile(path,"0644", auth, flags);
*/
const char * PropertyList::getStringForKey(const char *key)
{
if (!_proplistRef) return 0;
CFDictionaryRef myDict =
(CFGetTypeID(_proplistRef) == CFDictionaryGetTypeID()) ? (CFDictionaryRef) _proplistRef : NULL;
if (!_proplistRef) return NULL;
CFStringRef cfKey = CFStringCreateWithCString (kCFAllocatorDefault, key, kCFStringEncodingUTF8);
CFStringRef myString;
if (myDict && CFDictionaryGetValueIfPresent(myDict, cfKey, (const void **) &myString))
if (_proplistRef && CFDictionaryGetValueIfPresent((CFMutableDictionaryRef)_proplistRef,
cfKey, (const void **) &myString))
{
// show(CFSTR("Key '%@' found , value = <%@>\n"), cfKey, !myString ? CFSTR("") : myString);
CFRelease(cfKey);
return CfsToCs(myString);
}
{
if (!_proplistRef) return false;
bool ret = false;
CFMutableDictionaryRef myDict =
(CFGetTypeID(_proplistRef) == CFDictionaryGetTypeID()) ? (CFMutableDictionaryRef) _proplistRef : NULL;
CFStringRef cfKey = CFStringCreateWithCString (kCFAllocatorDefault, key, kCFStringEncodingUTF8);
CFStringRef myString = CFStringCreateWithCString (kCFAllocatorDefault, value, kCFStringEncodingUTF8);
CFMutableDictionaryRef myDict = (CFMutableDictionaryRef) _proplistRef;
if (myDict) {
CFDictionaryReplaceValue(myDict, cfKey, myString);
if (myDict)
{
CFDictionarySetValue(myDict, cfKey, myString);
ret=true;
}
if(cfKey) CFRelease(cfKey);
if(myString) CFRelease(myString);
//if(myString) CFRelease(myString);
return ret;
}
/****************************************************************************/
/**
* delete a key and its value from the dictionary
*/
bool PropertyList::removeKeyAndValue(const char *key)
{
if (!_proplistRef) return false;
bool ret = false;
CFStringRef cfKey = CFStringCreateWithCString (kCFAllocatorDefault, key, kCFStringEncodingUTF8);
if (_proplistRef) {
CFDictionaryRemoveValue((CFMutableDictionaryRef) _proplistRef, cfKey);
ret=true;
}
if(cfKey) CFRelease(cfKey);
return ret;
}
trunk/ChameleonPrefPane/Sources/PropertyList.h
3434
3535
3636
37
38
3739
3840
3941
40
4142
4243
44
45
46
47
48
4349
50
51
52
53
54
55
4456
45
57
4658
4759
4860
PropertyList() : _proplistRef(0), _CFURLRef(0) {}
virtual ~PropertyList();
bool isValid() const { return _proplistRef!=NULL;}
bool open(const char *propListPath, CFStringRef* errString,
AuthorizationRef auth=NULL, AuthorizationFlags flags=kAuthorizationFlagDefaults);
bool save(AuthorizationRef auth=NULL, AuthorizationFlags flags=kAuthorizationFlagDefaults);
bool isValid() const { return _proplistRef!=NULL;}
const char * getStringForKey(const char *key);
const char * getStringForKey(const std::string& key)
{
std::string str= key;
return getStringForKey(str.c_str());
}
bool setStringForKey(const char* key, const char* value);
bool setStringForKey(const std::string& key, const std::string& value)
{
return setStringForKey(key.c_str(), value.c_str());
}
bool removeKeyAndValue(const char *key);
const char * propFilePath() const {return _propFilePath.c_str(); }
static bool chmodFile(const char * path, const char * chmodMask,
AuthorizationRef auth, AuthorizationFlags flags=kAuthorizationFlagDefaults);
protected:
trunk/ChameleonPrefPane/Sources/PreferencesControllerBase.mm
6767
6868
6969
70
71
72
73
74
75
76
77
7078
7179
7280
......
105113
106114
107115
108
109116
110117
111118
......
147154
148155
149156
150
157
158
159
151160
152161
162
163
164
153165
154166
155167
......
186198
187199
188200
201
189202
190203
191204
......
206219
207220
208221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
209298
210299
211300
......
224313
225314
226315
316
227317
228318
229319
......
243333
244334
245335
336
337
338
339
340
246341
247342
248343
}
//--------------------------------------------------------------------------
// get authorisation from main panel lock
- (AuthorizationRef) getAuthorization
{
AuthorizationRef auth= [[self chameleon] isUnlocked] ?
[[ [self chameleon]->authView authorization] authorizationRef] : NULL;
return auth;
}
//--------------------------------------------------------------------------
+ (void) registerPreferencesGroup:(id) myGroup
{
groupList.push_back(myGroup);
//--------------------------------------------------------------------------
+ (void) loadOptionsFromBootFile
{
// *** TODO
// parse unix like command string:
kernelFlags.parseOptions(prop->getStringForKey(kKernelFlags));
}
break;
case OptionString:
[(NSButton*)optionID setIntValue: (s.length()>0 ? 1 : 0 ) ];
{
int val = (s.length()>0 ? 1 : 0 );
[(NSButton*)optionID setIntValue: val ];
[(NSTextField*) bod->contentID setStringValue:
[[NSString alloc] initWithUTF8String: s.c_str()] ];
[(NSTextField*) bod->contentID setEnabled: val ? true: false];
[(NSTextField*) bod->contentID setEditable: val ? true : false];
}
break;
case OptionUnix:
}
}
//--------------------------------------------------------------------------
- (void) refreshLockState: (id) item
{
}
//--------------------------------------------------------------------------
// update the boot Config with one option change and its associated desc
- (bool) saveBootConfig: (id) sender withBootOptionDesc: (BootOptionDesc*) bod
{
if(!bod)
{
return false;
}
// load boot config file so that we don't risk to loose
// externally modified parameters
int val = [(NSButton*) sender intValue ];
std::string sDefaultValue = trim(bod->Default ? bod->Default : "");
bool status = false;
switch (bod->Type) {
case OptionYesNo:
{
std::string sVal = val ? "Yes" : "No";
if (sDefaultValue.length()==0) sDefaultValue= "No";
// Avoid populating bootConfig with unnecessary options:
if (sVal == sDefaultValue)
status = prop->removeKeyAndValue(bod->Name);
else
status = prop->setStringForKey(bod->Name, sVal.c_str());
}
break;
case OptionUnix:
if (!val)kernelFlags.removeFlag(bod->Name);
elsekernelFlags.addFlag(bod->Name);
prop->setStringForKey(kKernelFlags,kernelFlags.options());
status = true;
break;
case OptionKernel:
{
std::string contentValue =
[ [(NSTextField*) bod->contentID stringValue] UTF8String ];
if (!val)kernelFlags.removeFlag(kernelFlags.stringFromKey(bod->Name));
else
{
std::string concat = bod->Name;
concat+= "=";
concat+= trim(contentValue);
kernelFlags.addFlag(concat);
}
prop->setStringForKey(kKernelFlags,kernelFlags.options());
status = true;
}
break;
case OptionKernel1:
case OptionString:
// Avoid populating bootConfig with unnecessary options:
if (val == 0 && bod->Type!=OptionKernel1)
status = prop->removeKeyAndValue(bod->Name);
else
{
std::string contentValue =
[ [(NSTextField*) bod->contentID stringValue] UTF8String ];
if (contentValue.length()>0)
status = prop->setStringForKey(bod->Name, contentValue.c_str());
else {
return false; // no content to save so don't save it
}
}
break;
default:
break;
}
// Now save the bootConfig
AuthorizationRef auth = [self getAuthorization ];
if (status)status = prop->save(auth);
return status;
}
//--------------------------------------------------------------------------
-(NSMutableDictionary*) preferencesFile
{
return [[ChameleonPrefPane instance] preferencesFile];
const BootOptionDesc * bod = prop->findOption(sender);
if (!bod) {
bod = prop->findOptionContent(sender);
NSTextField* textField = (NSTextField*) sender;
std::string content = [[textField stringValue] UTF8String ];
}
break;
}
}
if(![self saveBootConfig: sender withBootOptionDesc: (BootOptionDesc*) bod] && !bod->contentID )
{ // Couldn't save, so warn user ...
NSRunAlertPanel(@"Error saving bootConfig", @"Could not save com.apple.Boot.plist",
@"OK", nil, nil);
}
return true;
}
trunk/ChameleonPrefPane/Sources/PeripheralsController.h
3232
3333
3434
35
35
3636
3737
3838
}
- (IBAction) onCheckButtonChange: (NSButton*) sender;
- (IBAction) onTextFiedChange: (id) sender;
- (IBAction) onTextFiedChange: (NSTextField*) sender;
+ (PeripheralsController *)instance;
trunk/ChameleonPrefPane/Sources/KernOptionsParser.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/*
* KernOptionsParser.cpp
* ChameleonPrefPane
*
* Created by Rekursor on 1/23/10.
*/
#include "KernOptionsParser.h"
#include "string_util.h"
bool KernOptionsParser::parseOptions(const char* options)
{
_options = options ? trim(options) : "";
std::string token, temp=_options;
// first remove spaces around '=' to simplify parsing
std::string::size_type found = std::string::npos;
while ((found=_options.find(" =")) != std::string::npos) _options.replace(found, 3,"=");
while ((found=_options.find("= ")) != std::string::npos) _options.replace(found, 3,"=");
// then tokenize the string
_optionsList = tokenize(_options);
return true;
}
static const std::string sEmpty="";
// get the corresponding kern option "xxxx=yyyy"
const std::string& KernOptionsParser::stringFromKey(const std::string& key) const
{
for (std::list<std::string>::const_iterator it=_optionsList.begin(); it!=_optionsList.end(); it++)
if (it->find(key)!=std::string::npos) return *it;
return sEmpty;
}
// get the left member of kern option "xxxx=yyyy"
const std::string& KernOptionsParser::leftMember(const std::string& expression) const
{
static std::string sLeft;
std::string::size_type pos = expression.find('=');
if (pos!=std::string::npos)
return (sLeft = expression.substr(0, pos));
return expression;
}
// get the right member of kern option "xxxx=yyyy"
const std::string& KernOptionsParser::rightMember(const std::string& expression) const
{
static std::string sLeft;
std::string::size_type pos = expression.find('=');
if (pos!=std::string::npos)
return (sLeft = expression.substr(pos+1));
return expression;
}
// remove a flag in the string
void KernOptionsParser::removeFlag(const std::string& flag)
{
std::string::size_type found = _options.find(flag);
if (found==std::string::npos) return;
_options.erase(found, found+flag.length());
}
// remove a flag in the string
void KernOptionsParser::addFlag(const std::string& flag)
{
std::string::size_type found = _options.find(flag);
if (found!=std::string::npos) return;
_options = " " + _options;
_options = flag + _options;
}
trunk/ChameleonPrefPane/Sources/BootFlagsController.h
3131
3232
3333
34
34
3535
3636
3737
}
- (IBAction) onCheckButtonChange: (NSButton*) sender;
- (IBAction) onTextFiedChange: (id) sender;
- (IBAction) onTextFiedChange: (NSTextField*) sender;
+ (BootFlagsController *)instance;
trunk/ChameleonPrefPane/Sources/KernOptionsParser.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/*
* KernOptionsParser.h
* ChameleonPrefPane
*
* Created by Rekursor on 1/23/10.
*/
#include <string>
#include <list>
class KernOptionsParser
{
public:
KernOptionsParser() {}
// extract from the string all kern options
bool parseOptions(const char* options);
// get the corresponding kern option "xxxx=yyyy"
const std::string& stringFromKey(const std::string& key) const;
// get the left member of kern option "xxxx=yyyy"
const std::string& leftMember(const std::string& expression) const;
// get the right member of kern option "xxxx=yyyy"
const std::string& rightMember(const std::string& expression) const;
// add / remove a kernel Flags in the string
void addFlag(const std::string& flag);
void removeFlag(const std::string& flag);
const std::string& options() const { return _options;}
private:
bool _status;
std::string _options;
std::list<std::string> _optionsList;
};
trunk/ChameleonPrefPane/Sources/BootSetupController.h
3434
3535
3636
37
37
3838
3939
4040
}
- (IBAction) onCheckButtonChange: (NSButton*) sender;
- (IBAction) onTextFiedChange: (id) sender;
- (IBAction) onTextFiedChange: (NSTextField*) sender;
- (void) doSwapHD: (int) val save: (bool) doSave src: (int) isrc dst: (int) idst;
trunk/ChameleonPrefPane/English.lproj/Chameleon.xib
1212
1313
1414
15
15
1616
1717
1818
......
11611161
11621162
11631163
1164
1164
11651165
11661166
11671167
......
34643464
34653465
34663466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
34673635
34683636
34693637
......
40204188
40214189
40224190
4023
40244191
40254192
4193
40264194
40274195
40284196
......
41504318
41514319
41524320
4153
41544321
41554322
41564323
......
41654332
41664333
41674334
4335
41684336
41694337
41704338
......
51355303
51365304
51375305
5138
5306
51395307
5140
5308
51415309
51425310
51435311
......
57075875
57085876
57095877
5710
5878
57115879
57125880
57135881
......
57255893
57265894
57275895
5728
5896
57295897
57305898
57315899
......
58055973
58065974
58075975
5808
5976
58095977
58105978
58115979
......
58596027
58606028
58616029
5862
6030
58636031
58646032
58656033
......
59796147
59806148
59816149
5982
6150
59836151
59846152
59856153
</object>
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
<bool key="EncodedWithXMLCoder">YES</bool>
<integer value="172"/>
<integer value="511"/>
</object>
<object class="NSArray" key="IBDocument.PluginDependencies">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="504344601">
<int key="NSCellFlags">-1536033215</int>
<int key="NSCellFlags2">272630784</int>
<string key="NSContents">8</string>
<string key="NSContents"/>
<reference key="NSSupport" ref="930899267"/>
<reference key="NSControlView" ref="390095704"/>
<bool key="NSDrawsBackground">YES</bool>
</object>
<int key="connectionID">715</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="2692381"/>
<reference key="destination" ref="455218521"/>
</object>
<int key="connectionID">716</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="2692381"/>
<reference key="destination" ref="732855392"/>
</object>
<int key="connectionID">717</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="2692381"/>
<reference key="destination" ref="552874632"/>
</object>
<int key="connectionID">718</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="2692381"/>
<reference key="destination" ref="915217355"/>
</object>
<int key="connectionID">719</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="2692381"/>
<reference key="destination" ref="668416335"/>
</object>
<int key="connectionID">720</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="2692381"/>
<reference key="destination" ref="498570608"/>
</object>
<int key="connectionID">721</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="2692381"/>
<reference key="destination" ref="767062089"/>
</object>
<int key="connectionID">722</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="276543394"/>
<reference key="destination" ref="334542109"/>
</object>
<int key="connectionID">723</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="276543394"/>
<reference key="destination" ref="724579405"/>
</object>
<int key="connectionID">725</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="276543394"/>
<reference key="destination" ref="601436105"/>
</object>
<int key="connectionID">726</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="276543394"/>
<reference key="destination" ref="90016923"/>
</object>
<int key="connectionID">727</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="276543394"/>
<reference key="destination" ref="793808229"/>
</object>
<int key="connectionID">728</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="276543394"/>
<reference key="destination" ref="1050615289"/>
</object>
<int key="connectionID">729</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="276543394"/>
<reference key="destination" ref="712902523"/>
</object>
<int key="connectionID">730</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="276543394"/>
<reference key="destination" ref="744752273"/>
</object>
<int key="connectionID">731</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="276543394"/>
<reference key="destination" ref="629897331"/>
</object>
<int key="connectionID">732</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="770879448"/>
<reference key="destination" ref="276176519"/>
</object>
<int key="connectionID">733</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onCheckButtonChange:</string>
<reference key="source" ref="770879448"/>
<reference key="destination" ref="18675440"/>
</object>
<int key="connectionID">734</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onTextFiedChange:</string>
<reference key="source" ref="770879448"/>
<reference key="destination" ref="316034842"/>
</object>
<int key="connectionID">735</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onTextFiedChange:</string>
<reference key="source" ref="770879448"/>
<reference key="destination" ref="386809836"/>
</object>
<int key="connectionID">736</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">onTextFiedChange:</string>
<reference key="source" ref="2692381"/>
<reference key="destination" ref="174976306"/>
</object>
<int key="connectionID">737</int>
</object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
<reference ref="732855392"/>
<reference ref="915217355"/>
<reference ref="552874632"/>
<reference ref="455218521"/>
<reference ref="628549159"/>
<reference ref="961902576"/>
<reference ref="455218521"/>
</object>
<reference key="parent" ref="495127110"/>
</object>
<reference key="object" ref="138697471"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="317712564"/>
<reference ref="867800924"/>
<reference ref="339794873"/>
<reference ref="561126957"/>
<reference ref="426436104"/>
<reference ref="286479560"/>
<reference ref="706656551"/>
<reference ref="317712564"/>
</object>
<reference key="parent" ref="241622967"/>
</object>
</object>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{344, 266}, {668, 368}}</string>
<string>{{326, 204}, {668, 368}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{344, 266}, {668, 368}}</string>
<string>{{326, 204}, {668, 368}}</string>
<integer value="1"/>
<integer value="1"/>
<string>{224.664, 10}</string>
</object>
</object>
<nil key="sourceID"/>
<int key="maxID">715</int>
<int key="maxID">737</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>NSButton</string>
<string>id</string>
<string>NSTextField</string>
</object>
</object>
<object class="NSMutableDictionary" key="outlets">
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>NSButton</string>
<string>id</string>
<string>NSTextField</string>
</object>
</object>
<object class="NSMutableDictionary" key="outlets">
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>NSButton</string>
<string>id</string>
<string>NSTextField</string>
</object>
</object>
<object class="NSMutableDictionary" key="outlets">
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>NSButton</string>
<string>id</string>
<string>NSTextField</string>
</object>
</object>
<object class="NSMutableDictionary" key="outlets">

Archive Download the corresponding diff file

Revision: 49