aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar gtm.daemon <gtm.daemon@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3>2009-10-27 20:22:02 +0000
committerGravatar gtm.daemon <gtm.daemon@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3>2009-10-27 20:22:02 +0000
commit982c28eb83a3a834845f6f2f3fd6b36f1ca39be8 (patch)
tree4041d21f68373cd906a5a8a3bff402d3ab4c7f23
parentfbaa3462f3ca659bf4199cba7fe83341c9cdd672 (diff)
[Author: thomasvl]
Adding GTMIBArray, a class that can be used in IB to build up an NSArray directly, so developers don't need to add lots of outlets to other objects and assemble things during awakeFromNib. R=dmaclach DELTA=1337 (1333 added, 0 deleted, 4 changed)
-rw-r--r--AppKit/GTMIBArray.h39
-rw-r--r--AppKit/GTMIBArray.m125
-rw-r--r--AppKit/GTMIBArrayTest.h31
-rw-r--r--AppKit/GTMIBArrayTest.m311
-rw-r--r--AppKit/GTMIBArrayTest.xib807
-rw-r--r--GTM.xcodeproj/project.pbxproj18
-rw-r--r--ReleaseNotes.txt10
7 files changed, 1337 insertions, 4 deletions
diff --git a/AppKit/GTMIBArray.h b/AppKit/GTMIBArray.h
new file mode 100644
index 0000000..c918938
--- /dev/null
+++ b/AppKit/GTMIBArray.h
@@ -0,0 +1,39 @@
+//
+// GTMIBArray.h
+//
+// Copyright 2009 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy
+// of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+//
+
+#import <Foundation/Foundation.h>
+#import <AppKit/NSNibDeclarations.h>
+
+// This class allows you to create dynamically sized arrays of objects in your
+// nib. This saves you from adding a random "large" number of outlets on an
+// object to accommodate a variable number of connections. If you need <= 5
+// objects you only need to create one of these in your nib. If you need > 5
+// objects you can connect any of the outlets in a given GTMIBArray to another
+// instance of GTMIBArray and we will recurse through it to create the final
+// array.
+@interface GTMIBArray : NSArray {
+ @protected
+ IBOutlet id object1_;
+ IBOutlet id object2_;
+ IBOutlet id object3_;
+ IBOutlet id object4_;
+ IBOutlet id object5_;
+ NSArray *realArray_;
+}
+
+@end
diff --git a/AppKit/GTMIBArray.m b/AppKit/GTMIBArray.m
new file mode 100644
index 0000000..a522072
--- /dev/null
+++ b/AppKit/GTMIBArray.m
@@ -0,0 +1,125 @@
+//
+// GTMIBArray.m
+//
+// Copyright 2009 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy
+// of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+//
+
+
+#import "GTMIBArray.h"
+#import "GTMDefines.h"
+
+@implementation GTMIBArray
+
+- (void)dealloc {
+ [realArray_ release];
+ [super dealloc];
+}
+
+- (void)setupRealArray {
+
+#ifdef DEBUG
+ // It is very easy to create a cycle if you are chaining these in IB, so in
+ // debug builds, we try to catch this to inform the developer. Use -[NSArray
+ // indexOfObjectIdenticalTo:] to get pointer comparisons instead of object
+ // equality.
+ static NSMutableArray *ibArraysBuilding = nil;
+ if (!ibArraysBuilding) {
+ ibArraysBuilding = [[NSMutableArray alloc] init];
+ }
+ _GTMDevAssert([ibArraysBuilding indexOfObjectIdenticalTo:self] == NSNotFound,
+ @"There is a cycle in your GTMIBArrays!");
+ [ibArraysBuilding addObject:self];
+#endif // DEBUG
+
+ // Build the array up.
+ NSMutableArray *builder = [NSMutableArray array];
+ Class ibArrayClass = [GTMIBArray class];
+ id objs[] = {
+ object1_, object2_, object3_, object4_, object5_,
+ };
+ for (size_t idx = 0 ; idx < sizeof(objs) / (sizeof(objs[0])) ; ++idx) {
+ id obj = objs[idx];
+ if (obj) {
+ if ([obj isKindOfClass:ibArrayClass]) {
+ [builder addObjectsFromArray:obj];
+ } else {
+ [builder addObject:obj];
+ }
+ }
+ }
+
+#ifdef DEBUG
+ [ibArraysBuilding removeObject:self];
+#endif // DEBUG
+
+ // Now copy with our zone.
+ realArray_ = [builder copyWithZone:[self zone]];
+}
+
+// ----------------------------------------------------------------------------
+// NSArray has two methods that everything else seems to work on, simply
+// implement those.
+
+- (NSUInteger)count {
+ if (!realArray_) [self setupRealArray];
+ return [realArray_ count];
+}
+
+- (id)objectAtIndex:(NSUInteger)idx {
+ if (!realArray_) [self setupRealArray];
+ return [realArray_ objectAtIndex:idx];
+}
+
+// ----------------------------------------------------------------------------
+// Directly relay the enumeration based calls just in case there is some extra
+// efficency to be had.
+
+- (NSEnumerator *)objectEnumerator {
+ if (!realArray_) [self setupRealArray];
+ return [realArray_ objectEnumerator];
+}
+
+- (NSEnumerator *)reverseObjectEnumerator {
+ if (!realArray_) [self setupRealArray];
+ return [realArray_ reverseObjectEnumerator];
+}
+
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+
+- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state
+ objects:(id *)stackbuf
+ count:(NSUInteger)len {
+ if (!realArray_) [self setupRealArray];
+ return [realArray_ countByEnumeratingWithState:state
+ objects:stackbuf
+ count:len];
+}
+
+#endif // MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+
+// ----------------------------------------------------------------------------
+// Directly relay the copy methods, again, for any extra efficency.
+
+- (id)copyWithZone:(NSZone *)zone {
+ if (!realArray_) [self setupRealArray];
+ return [realArray_ copyWithZone:zone];
+}
+
+- (id)mutableCopyWithZone:(NSZone *)zone {
+ if (!realArray_) [self setupRealArray];
+ return [realArray_ mutableCopyWithZone:zone];
+}
+
+@end
diff --git a/AppKit/GTMIBArrayTest.h b/AppKit/GTMIBArrayTest.h
new file mode 100644
index 0000000..946a117
--- /dev/null
+++ b/AppKit/GTMIBArrayTest.h
@@ -0,0 +1,31 @@
+//
+// GTMIBArrayTest.h
+//
+// Copyright 2009 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy
+// of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+//
+
+
+#import <Cocoa/Cocoa.h>
+
+@interface GTMIBArrayTestWindowController : NSWindowController {
+ @private
+ IBOutlet NSArray *labels_;
+ IBOutlet NSArray *fields_;
+ IBOutlet NSArray *everything_; // labels + fields + buttons
+}
+- (NSArray *)labelsArray;
+- (NSArray *)fieldsArray;
+- (NSArray *)everythingArray;
+@end
diff --git a/AppKit/GTMIBArrayTest.m b/AppKit/GTMIBArrayTest.m
new file mode 100644
index 0000000..c4908b3
--- /dev/null
+++ b/AppKit/GTMIBArrayTest.m
@@ -0,0 +1,311 @@
+//
+// GTMIBArrayTest.m
+//
+// Copyright 2009 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy
+// of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+//
+
+
+#import "GTMIBArray.h"
+#import "GTMSenTestCase.h"
+#import "GTMIBArrayTest.h"
+
+@interface GTMIBArrayTest : GTMTestCase
+@end
+
+@interface IBArrayTestHelper : GTMIBArray
+- (id)initWithObj1:(id)obj1 obj2:(id)obj2 obj3:(id)obj3
+ obj4:(id)obj4 obj5:(id)obj5;
+@end
+
+@implementation IBArrayTestHelper
+- (id)initWithObj1:(id)obj1 obj2:(id)obj2 obj3:(id)obj3
+ obj4:(id)obj4 obj5:(id)obj5 {
+ if ((self = [super init])) {
+ object1_ = [obj1 retain];
+ object2_ = [obj2 retain];
+ object3_ = [obj3 retain];
+ object4_ = [obj4 retain];
+ object5_ = [obj5 retain];
+ }
+ return self;
+}
+@end
+
+@implementation GTMIBArrayTest
+
+- (void)testEmpty {
+ GTMIBArray *worker = [[[GTMIBArray alloc] init] autorelease];
+
+ STAssertNotNil(worker, nil);
+ STAssertEquals([worker count], (NSUInteger)0, nil);
+
+ worker = [[[IBArrayTestHelper alloc] initWithObj1:nil
+ obj2:nil
+ obj3:nil
+ obj4:nil
+ obj5:nil] autorelease];
+ STAssertNotNil(worker, nil);
+ STAssertEquals([worker count], (NSUInteger)0, nil);
+}
+
+- (void)testSparse {
+ struct {
+ id obj1;
+ id obj2;
+ id obj3;
+ id obj4;
+ id obj5;
+ id combined;
+ } data[] = {
+ { @"a", nil, nil, nil, nil, @"a" },
+ { nil, @"a", nil, nil, nil, @"a" },
+ { nil, nil, @"a", nil, nil, @"a" },
+ { nil, nil, nil, @"a", nil, @"a" },
+ { nil, nil, nil, nil, @"a", @"a" },
+
+ { @"a", @"b", nil, nil, nil, @"ab" },
+ { @"a", @"b", @"c", nil, nil, @"abc" },
+ { @"a", @"b", @"c", @"d", nil, @"abcd" },
+ { nil, @"b", @"c", nil, nil, @"bc" },
+ { nil, nil, @"c", @"d", nil, @"cd" },
+ { nil, nil, nil, @"d", @"e", @"de" },
+ { @"a", nil, @"c", nil, @"e", @"ace" },
+
+ { @"a", @"b", @"c", @"d", @"e", @"abcde" },
+ };
+
+ for (size_t i = 0; i < sizeof(data) / sizeof(data[0]); ++i) {
+ GTMIBArray *worker =
+ [[[IBArrayTestHelper alloc] initWithObj1:data[i].obj1
+ obj2:data[i].obj2
+ obj3:data[i].obj3
+ obj4:data[i].obj4
+ obj5:data[i].obj5] autorelease];
+ STAssertNotNil(worker, @"index %zu", i);
+ NSUInteger count = 0;
+ if (data[i].obj1) ++count;
+ if (data[i].obj2) ++count;
+ if (data[i].obj3) ++count;
+ if (data[i].obj4) ++count;
+ if (data[i].obj5) ++count;
+ STAssertEquals([worker count], count, @"index %zu", i);
+ STAssertEqualObjects([worker componentsJoinedByString:@""],
+ data[i].combined,
+ @"index %zu", i);
+ }
+}
+
+- (void)testRecursive {
+ GTMIBArray *ibArray1 =
+ [[[IBArrayTestHelper alloc] initWithObj1:@"a"
+ obj2:@"b"
+ obj3:@"c"
+ obj4:@"d"
+ obj5:@"e"] autorelease];
+ GTMIBArray *ibArray2 =
+ [[[IBArrayTestHelper alloc] initWithObj1:@"f"
+ obj2:@"g"
+ obj3:@"h"
+ obj4:@"i"
+ obj5:@"j"] autorelease];
+ GTMIBArray *ibArray3 =
+ [[[IBArrayTestHelper alloc] initWithObj1:@"k"
+ obj2:@"l"
+ obj3:@"m"
+ obj4:@"n"
+ obj5:@"o"] autorelease];
+ GTMIBArray *ibArray4 =
+ [[[IBArrayTestHelper alloc] initWithObj1:ibArray1
+ obj2:@"1"
+ obj3:ibArray2
+ obj4:@"2"
+ obj5:ibArray3] autorelease];
+ GTMIBArray *ibArray5 =
+ [[[IBArrayTestHelper alloc] initWithObj1:ibArray1
+ obj2:@"3"
+ obj3:nil
+ obj4:@"4"
+ obj5:ibArray3] autorelease];
+ GTMIBArray *ibArray6 =
+ [[[IBArrayTestHelper alloc] initWithObj1:nil
+ obj2:@"5"
+ obj3:ibArray1
+ obj4:@"6"
+ obj5:nil] autorelease];
+ GTMIBArray *ibArray7 =
+ [[[IBArrayTestHelper alloc] initWithObj1:nil
+ obj2:@"7"
+ obj3:ibArray1
+ obj4:@"8"
+ obj5:ibArray6] autorelease];
+ GTMIBArray *ibArray8 =
+ [[[IBArrayTestHelper alloc] initWithObj1:ibArray3
+ obj2:@"9"
+ obj3:ibArray7
+ obj4:nil
+ obj5:ibArray6] autorelease];
+
+ struct {
+ GTMIBArray *ibArray;
+ NSUInteger count;
+ NSString *result;
+ } data[] = {
+ { ibArray1, 5, @"abcde" },
+ { ibArray2, 5, @"fghij" },
+ { ibArray3, 5, @"klmno" },
+ { ibArray4, 17, @"abcde1fghij2klmno" },
+ { ibArray5, 12, @"abcde34klmno" },
+ { ibArray6, 7, @"5abcde6" },
+ { ibArray7, 14, @"7abcde85abcde6" },
+ { ibArray8, 27, @"klmno97abcde85abcde65abcde6" },
+ };
+
+ for (size_t i = 0; i < sizeof(data) / sizeof(data[0]); ++i) {
+ NSArray *worker = data[i].ibArray;
+ STAssertNotNil(worker, @"index %zu", i);
+ STAssertEquals([worker count], data[i].count, @"index %zu", i);
+ STAssertEqualObjects([worker componentsJoinedByString:@""],
+ data[i].result,
+ @"index %zu", i);
+ }
+}
+
+- (void)testEnumeration {
+ GTMIBArray *worker =
+ [[[IBArrayTestHelper alloc] initWithObj1:@"a"
+ obj2:@"b"
+ obj3:@"c"
+ obj4:@"d"
+ obj5:@"e"] autorelease];
+
+ NSEnumerator *enumerator = [worker objectEnumerator];
+ STAssertNotNil(enumerator, nil);
+ STAssertEqualObjects([enumerator nextObject], @"a", nil);
+ STAssertEqualObjects([enumerator nextObject], @"b", nil);
+ STAssertEqualObjects([enumerator nextObject], @"c", nil);
+ STAssertEqualObjects([enumerator nextObject], @"d", nil);
+ STAssertEqualObjects([enumerator nextObject], @"e", nil);
+ STAssertNil([enumerator nextObject], nil);
+
+ enumerator = [worker reverseObjectEnumerator];
+ STAssertNotNil(enumerator, nil);
+ STAssertEqualObjects([enumerator nextObject], @"e", nil);
+ STAssertEqualObjects([enumerator nextObject], @"d", nil);
+ STAssertEqualObjects([enumerator nextObject], @"c", nil);
+ STAssertEqualObjects([enumerator nextObject], @"b", nil);
+ STAssertEqualObjects([enumerator nextObject], @"a", nil);
+ STAssertNil([enumerator nextObject], nil);
+}
+
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+
+- (void)testFastEnumeration {
+ GTMIBArray *worker =
+ [[[IBArrayTestHelper alloc] initWithObj1:@"a"
+ obj2:@"b"
+ obj3:@"c"
+ obj4:@"d"
+ obj5:@"e"] autorelease];
+
+ NSUInteger idx = 0;
+ for (id obj in worker) {
+ switch (++idx) {
+ case 1:
+ STAssertEqualObjects(obj, @"a", nil);
+ break;
+ case 2:
+ STAssertEqualObjects(obj, @"b", nil);
+ break;
+ case 3:
+ STAssertEqualObjects(obj, @"c", nil);
+ break;
+ case 4:
+ STAssertEqualObjects(obj, @"d", nil);
+ break;
+ case 5:
+ STAssertEqualObjects(obj, @"e", nil);
+ break;
+ default:
+ STFail(@"looping too many times: %zu", idx);
+ break;
+ }
+ }
+}
+
+#endif // MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+
+- (void)testCopy {
+ GTMIBArray *worker =
+ [[[IBArrayTestHelper alloc] initWithObj1:@"a"
+ obj2:@"b"
+ obj3:@"c"
+ obj4:@"d"
+ obj5:@"e"] autorelease];
+
+ // Should get back a different object, but with the same contents.
+
+ NSArray *aCopy = [[worker copy] autorelease];
+ STAssertNotEquals(aCopy, worker, nil);
+ STAssertEqualObjects(aCopy, worker, nil);
+
+ NSArray *aMutableCopy = [[worker mutableCopy] autorelease];
+ STAssertNotEquals(aMutableCopy, worker, nil);
+ STAssertNotEquals(aMutableCopy, aCopy, nil);
+ STAssertEqualObjects(aMutableCopy, worker, nil);
+ STAssertEqualObjects(aMutableCopy, aCopy, nil);
+}
+
+- (void)testFromNib {
+ GTMIBArrayTestWindowController *controller =
+ [[[GTMIBArrayTestWindowController alloc]
+ initWithWindowNibName:@"GTMIBArrayTest"] autorelease];
+ NSWindow *window = [controller window];
+ STAssertNotNil(window, nil);
+
+ NSArray *labels = [controller labelsArray];
+ NSArray *fields = [controller fieldsArray];
+ NSArray *everything = [controller everythingArray];
+ STAssertNotNil(labels, nil);
+ STAssertNotNil(fields, nil);
+ STAssertNotNil(everything, nil);
+
+ STAssertEquals([labels count], (NSUInteger)3, nil);
+ STAssertEquals([fields count], (NSUInteger)3, nil);
+ STAssertEquals([everything count], (NSUInteger)8, nil);
+
+ NSSet *labelsSet = [NSSet setWithArray:labels];
+ NSSet *fieldsSet = [NSSet setWithArray:fields];
+ NSSet *everythingSet = [NSSet setWithArray:everything];
+ STAssertTrue([labelsSet isSubsetOfSet:everythingSet], nil);
+ STAssertTrue([fieldsSet isSubsetOfSet:everythingSet], nil);
+}
+
+@end
+
+@implementation GTMIBArrayTestWindowController
+
+- (NSArray *)labelsArray {
+ return labels_;
+}
+
+- (NSArray *)fieldsArray {
+ return fields_;
+}
+
+- (NSArray *)everythingArray {
+ return everything_;
+}
+
+@end
diff --git a/AppKit/GTMIBArrayTest.xib b/AppKit/GTMIBArrayTest.xib
new file mode 100644
index 0000000..f348fec
--- /dev/null
+++ b/AppKit/GTMIBArrayTest.xib
@@ -0,0 +1,807 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03">
+ <data>
+ <int key="IBDocument.SystemTarget">1050</int>
+ <string key="IBDocument.SystemVersion">9L30</string>
+ <string key="IBDocument.InterfaceBuilderVersion">677</string>
+ <string key="IBDocument.AppKitVersion">949.54</string>
+ <string key="IBDocument.HIToolboxVersion">353.00</string>
+ <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <integer value="2"/>
+ </object>
+ <object class="NSArray" key="IBDocument.PluginDependencies">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilderKit</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSCustomObject" id="1001">
+ <string key="NSClassName">GTMIBArrayTestWindowController</string>
+ </object>
+ <object class="NSCustomObject" id="1003">
+ <string key="NSClassName">FirstResponder</string>
+ </object>
+ <object class="NSCustomObject" id="1004">
+ <string key="NSClassName">NSApplication</string>
+ </object>
+ <object class="NSWindowTemplate" id="1005">
+ <int key="NSWindowStyleMask">15</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{71, 286}, {491, 166}}</string>
+ <int key="NSWTFlags">536870912</int>
+ <string key="NSWindowTitle">Window</string>
+ <string key="NSWindowClass">NSWindow</string>
+ <nil key="NSViewClass"/>
+ <string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+ <object class="NSView" key="NSWindowView" id="1006">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTextField" id="32340604">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{17, 126}, {100, 17}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="1064530732">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">71304192</int>
+ <string key="NSContents">First Name:</string>
+ <object class="NSFont" key="NSSupport" id="396891173">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">1.300000e+01</double>
+ <int key="NSfFlags">1044</int>
+ </object>
+ <reference key="NSControlView" ref="32340604"/>
+ <object class="NSColor" key="NSBackgroundColor" id="584893825">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlColor</string>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+ </object>
+ </object>
+ <object class="NSColor" key="NSTextColor" id="215232119">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlTextColor</string>
+ <object class="NSColor" key="NSColor" id="960820016">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MAA</bytes>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSTextField" id="499628444">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{17, 62}, {100, 17}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="200889835">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">71304192</int>
+ <string key="NSContents">Last Name:</string>
+ <reference key="NSSupport" ref="396891173"/>
+ <reference key="NSControlView" ref="499628444"/>
+ <reference key="NSBackgroundColor" ref="584893825"/>
+ <reference key="NSTextColor" ref="215232119"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="236725617">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{17, 94}, {100, 17}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="65808262">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">71304192</int>
+ <string key="NSContents">Middle Name:</string>
+ <reference key="NSSupport" ref="396891173"/>
+ <reference key="NSControlView" ref="236725617"/>
+ <reference key="NSBackgroundColor" ref="584893825"/>
+ <reference key="NSTextColor" ref="215232119"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="800844720">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">266</int>
+ <string key="NSFrame">{{122, 92}, {349, 22}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="951606926">
+ <int key="NSCellFlags">-1804468671</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="396891173"/>
+ <reference key="NSControlView" ref="800844720"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <object class="NSColor" key="NSBackgroundColor" id="763520216">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">textBackgroundColor</string>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MQA</bytes>
+ </object>
+ </object>
+ <object class="NSColor" key="NSTextColor" id="843269795">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">textColor</string>
+ <reference key="NSColor" ref="960820016"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSTextField" id="745022904">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">266</int>
+ <string key="NSFrame">{{122, 60}, {349, 22}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="810828168">
+ <int key="NSCellFlags">-1804468671</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="396891173"/>
+ <reference key="NSControlView" ref="745022904"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <reference key="NSBackgroundColor" ref="763520216"/>
+ <reference key="NSTextColor" ref="843269795"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="478979211">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">266</int>
+ <string key="NSFrame">{{122, 124}, {349, 22}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="1044158630">
+ <int key="NSCellFlags">-1804468671</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="396891173"/>
+ <reference key="NSControlView" ref="478979211"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <reference key="NSBackgroundColor" ref="763520216"/>
+ <reference key="NSTextColor" ref="843269795"/>
+ </object>
+ </object>
+ <object class="NSButton" id="228116783">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">289</int>
+ <string key="NSFrame">{{381, 12}, {96, 32}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="394822725">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">134217728</int>
+ <string key="NSContents">OK</string>
+ <reference key="NSSupport" ref="396891173"/>
+ <reference key="NSControlView" ref="228116783"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">129</int>
+ <string key="NSAlternateContents"/>
+ <string type="base64-UTF8" key="NSKeyEquivalent">DQ</string>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="476526902">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">289</int>
+ <string key="NSFrame">{{285, 12}, {96, 32}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="615815">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">134217728</int>
+ <string key="NSContents">Cancel</string>
+ <reference key="NSSupport" ref="396891173"/>
+ <reference key="NSControlView" ref="476526902"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">129</int>
+ <string key="NSAlternateContents"/>
+ <string type="base64-UTF8" key="NSKeyEquivalent">Gw</string>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ </object>
+ <string key="NSFrameSize">{491, 166}</string>
+ <reference key="NSSuperview"/>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1920, 1178}}</string>
+ <string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+ </object>
+ <object class="NSCustomObject" id="978135756">
+ <string key="NSClassName">GTMIBArray</string>
+ </object>
+ <object class="NSCustomObject" id="202064574">
+ <string key="NSClassName">GTMIBArray</string>
+ </object>
+ <object class="NSCustomObject" id="1042708171">
+ <string key="NSClassName">GTMIBArray</string>
+ </object>
+ </object>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <object class="NSMutableArray" key="connectionRecords">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">window</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="1005"/>
+ </object>
+ <int key="connectionID">119</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">object1_</string>
+ <reference key="source" ref="978135756"/>
+ <reference key="destination" ref="32340604"/>
+ </object>
+ <int key="connectionID">125</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">object2_</string>
+ <reference key="source" ref="978135756"/>
+ <reference key="destination" ref="236725617"/>
+ </object>
+ <int key="connectionID">126</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">object3_</string>
+ <reference key="source" ref="978135756"/>
+ <reference key="destination" ref="499628444"/>
+ </object>
+ <int key="connectionID">127</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">labels_</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="978135756"/>
+ </object>
+ <int key="connectionID">128</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">object1_</string>
+ <reference key="source" ref="202064574"/>
+ <reference key="destination" ref="478979211"/>
+ </object>
+ <int key="connectionID">130</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">object2_</string>
+ <reference key="source" ref="202064574"/>
+ <reference key="destination" ref="800844720"/>
+ </object>
+ <int key="connectionID">131</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">object3_</string>
+ <reference key="source" ref="202064574"/>
+ <reference key="destination" ref="745022904"/>
+ </object>
+ <int key="connectionID">132</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">object1_</string>
+ <reference key="source" ref="1042708171"/>
+ <reference key="destination" ref="978135756"/>
+ </object>
+ <int key="connectionID">134</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">object2_</string>
+ <reference key="source" ref="1042708171"/>
+ <reference key="destination" ref="202064574"/>
+ </object>
+ <int key="connectionID">135</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">object3_</string>
+ <reference key="source" ref="1042708171"/>
+ <reference key="destination" ref="228116783"/>
+ </object>
+ <int key="connectionID">136</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">object4_</string>
+ <reference key="source" ref="1042708171"/>
+ <reference key="destination" ref="476526902"/>
+ </object>
+ <int key="connectionID">137</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">fields_</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="202064574"/>
+ </object>
+ <int key="connectionID">138</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">everything_</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="1042708171"/>
+ </object>
+ <int key="connectionID">139</int>
+ </object>
+ </object>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <object class="NSArray" key="orderedObjects">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <object class="NSArray" key="object" id="1002">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <reference key="children" ref="1000"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="1001"/>
+ <reference key="parent" ref="1002"/>
+ <string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="1003"/>
+ <reference key="parent" ref="1002"/>
+ <string key="objectName">First Responder</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-3</int>
+ <reference key="object" ref="1004"/>
+ <reference key="parent" ref="1002"/>
+ <string key="objectName">Application</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">1</int>
+ <reference key="object" ref="1005"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1006"/>
+ </object>
+ <reference key="parent" ref="1002"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">2</int>
+ <reference key="object" ref="1006"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="32340604"/>
+ <reference ref="236725617"/>
+ <reference ref="800844720"/>
+ <reference ref="745022904"/>
+ <reference ref="478979211"/>
+ <reference ref="228116783"/>
+ <reference ref="476526902"/>
+ <reference ref="499628444"/>
+ </object>
+ <reference key="parent" ref="1005"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">5</int>
+ <reference key="object" ref="32340604"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1064530732"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">6</int>
+ <reference key="object" ref="1064530732"/>
+ <reference key="parent" ref="32340604"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">9</int>
+ <reference key="object" ref="499628444"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="200889835"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">10</int>
+ <reference key="object" ref="200889835"/>
+ <reference key="parent" ref="499628444"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">7</int>
+ <reference key="object" ref="236725617"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="65808262"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">8</int>
+ <reference key="object" ref="65808262"/>
+ <reference key="parent" ref="236725617"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">13</int>
+ <reference key="object" ref="800844720"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="951606926"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">14</int>
+ <reference key="object" ref="951606926"/>
+ <reference key="parent" ref="800844720"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">15</int>
+ <reference key="object" ref="745022904"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="810828168"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">16</int>
+ <reference key="object" ref="810828168"/>
+ <reference key="parent" ref="745022904"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">11</int>
+ <reference key="object" ref="478979211"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1044158630"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">12</int>
+ <reference key="object" ref="1044158630"/>
+ <reference key="parent" ref="478979211"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">120</int>
+ <reference key="object" ref="228116783"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="394822725"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">121</int>
+ <reference key="object" ref="394822725"/>
+ <reference key="parent" ref="228116783"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">122</int>
+ <reference key="object" ref="476526902"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="615815"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">123</int>
+ <reference key="object" ref="615815"/>
+ <reference key="parent" ref="476526902"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">124</int>
+ <reference key="object" ref="978135756"/>
+ <reference key="parent" ref="1002"/>
+ <string key="objectName">Labels Array</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">129</int>
+ <reference key="object" ref="202064574"/>
+ <reference key="parent" ref="1002"/>
+ <string key="objectName">Fields Array</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">133</int>
+ <reference key="object" ref="1042708171"/>
+ <reference key="parent" ref="1002"/>
+ <string key="objectName">Everything Array</string>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="flattenedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>-1.IBPluginDependency</string>
+ <string>-2.IBPluginDependency</string>
+ <string>-3.IBPluginDependency</string>
+ <string>1.IBEditorWindowLastContentRect</string>
+ <string>1.IBPluginDependency</string>
+ <string>1.IBWindowTemplateEditedContentRect</string>
+ <string>1.NSWindowTemplate.visibleAtLaunch</string>
+ <string>1.WindowOrigin</string>
+ <string>1.editorWindowContentRectSynchronizationRect</string>
+ <string>10.IBPluginDependency</string>
+ <string>11.IBPluginDependency</string>
+ <string>12.IBPluginDependency</string>
+ <string>120.IBPluginDependency</string>
+ <string>121.IBPluginDependency</string>
+ <string>122.IBPluginDependency</string>
+ <string>123.IBPluginDependency</string>
+ <string>124.IBPluginDependency</string>
+ <string>129.IBPluginDependency</string>
+ <string>13.IBPluginDependency</string>
+ <string>133.IBPluginDependency</string>
+ <string>14.IBPluginDependency</string>
+ <string>15.IBPluginDependency</string>
+ <string>16.IBPluginDependency</string>
+ <string>2.IBPluginDependency</string>
+ <string>5.IBPluginDependency</string>
+ <string>6.IBPluginDependency</string>
+ <string>7.IBPluginDependency</string>
+ <string>8.IBPluginDependency</string>
+ <string>9.IBPluginDependency</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilderKit</string>
+ <string>com.apple.InterfaceBuilderKit</string>
+ <string>{{636, 990}, {491, 166}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{636, 990}, {491, 166}}</string>
+ <boolean value="NO"/>
+ <string>{196, 240}</string>
+ <string>{{202, 428}, {480, 270}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="unlocalizedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="activeLocalization"/>
+ <object class="NSMutableDictionary" key="localizations">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="sourceID"/>
+ <int key="maxID">140</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <object class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">GTMIBArray</string>
+ <string key="superclassName">NSArray</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>object1_</string>
+ <string>object2_</string>
+ <string>object3_</string>
+ <string>object4_</string>
+ <string>object5_</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">Foundation/GTMIBArray.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">GTMIBArrayTestWindowController</string>
+ <string key="superclassName">NSWindowController</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>everything_</string>
+ <string>fields_</string>
+ <string>labels_</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>NSArray</string>
+ <string>NSArray</string>
+ <string>NSArray</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">Foundation/GTMIBArrayTest.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSApplication</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="925048441">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">UnitTesting/GTMAppKit+UnitTesting.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSArray</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">Foundation/GTMLogger.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSArray</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">Foundation/GTMNSArray+Merge.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSButton</string>
+ <reference key="sourceIdentifier" ref="925048441"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSCell</string>
+ <reference key="sourceIdentifier" ref="925048441"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSControl</string>
+ <reference key="sourceIdentifier" ref="925048441"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSMenu</string>
+ <reference key="sourceIdentifier" ref="925048441"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">AppKit/GTMCarbonEvent.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">AppKit/GTMDelegatingTableColumn.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">Foundation/GTMHTTPServer.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">Foundation/GTMNSAppleEventDescriptor+Foundation.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">Foundation/GTMNSObject+KeyValueObserving.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">UnitTesting/GTMCALayer+UnitTesting.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">UnitTesting/GTMNSObject+BindingUnitTesting.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">UnitTesting/GTMNSObject+UnitTesting.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSTextField</string>
+ <reference key="sourceIdentifier" ref="925048441"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="39542122">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">AppKit/GTMTheme.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSView</string>
+ <reference key="sourceIdentifier" ref="925048441"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSWindow</string>
+ <reference key="sourceIdentifier" ref="39542122"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSWindow</string>
+ <reference key="sourceIdentifier" ref="925048441"/>
+ </object>
+ </object>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.LastKnownRelativeProjectPath">../GTM.xcodeproj</string>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ </data>
+</archive>
diff --git a/GTM.xcodeproj/project.pbxproj b/GTM.xcodeproj/project.pbxproj
index 64d86c7..e1df5c4 100644
--- a/GTM.xcodeproj/project.pbxproj
+++ b/GTM.xcodeproj/project.pbxproj
@@ -323,6 +323,10 @@
F4C0B9DA108E3142002FC8E4 /* GTMUILocalizerAndLayoutTweakerTest5-0.tiff in Resources */ = {isa = PBXBuildFile; fileRef = F4C0B9D7108E3142002FC8E4 /* GTMUILocalizerAndLayoutTweakerTest5-0.tiff */; };
F4C0B9DB108E3142002FC8E4 /* GTMUILocalizerAndLayoutTweakerTest5-1.tiff in Resources */ = {isa = PBXBuildFile; fileRef = F4C0B9D8108E3142002FC8E4 /* GTMUILocalizerAndLayoutTweakerTest5-1.tiff */; };
F4C0B9DC108E3142002FC8E4 /* GTMUILocalizerAndLayoutTweakerTest5-2.tiff in Resources */ = {isa = PBXBuildFile; fileRef = F4C0B9D9108E3142002FC8E4 /* GTMUILocalizerAndLayoutTweakerTest5-2.tiff */; };
+ F4C62489109753960069CADD /* GTMIBArrayTest.m in Sources */ = {isa = PBXBuildFile; fileRef = F4C62486109753960069CADD /* GTMIBArrayTest.m */; };
+ F4C6248A109753960069CADD /* GTMIBArrayTest.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4C62487109753960069CADD /* GTMIBArrayTest.xib */; };
+ F4C6248B109753960069CADD /* GTMIBArray.h in Headers */ = {isa = PBXBuildFile; fileRef = F4C62483109753960069CADD /* GTMIBArray.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ F4C6248C109753960069CADD /* GTMIBArray.m in Sources */ = {isa = PBXBuildFile; fileRef = F4C62484109753960069CADD /* GTMIBArray.m */; };
F4CA854F0DAFAAF600B4AB10 /* GTMObjC2Runtime.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B6F32060DA34A1B0052CA40 /* GTMObjC2Runtime.h */; settings = {ATTRIBUTES = (Public, ); }; };
F4FC15DD1046AD66000AB7BC /* GTMUILocalizerAndLayoutTweakerTest3.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4FC15DC1046AD66000AB7BC /* GTMUILocalizerAndLayoutTweakerTest3.xib */; };
F4FC16031046B581000AB7BC /* GTMUILocalizerAndLayoutTweakerTest3-0.tiff in Resources */ = {isa = PBXBuildFile; fileRef = F4FC15FF1046B581000AB7BC /* GTMUILocalizerAndLayoutTweakerTest3-0.tiff */; };
@@ -720,6 +724,11 @@
F4C0B9D7108E3142002FC8E4 /* GTMUILocalizerAndLayoutTweakerTest5-0.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = "GTMUILocalizerAndLayoutTweakerTest5-0.tiff"; sourceTree = "<group>"; };
F4C0B9D8108E3142002FC8E4 /* GTMUILocalizerAndLayoutTweakerTest5-1.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = "GTMUILocalizerAndLayoutTweakerTest5-1.tiff"; sourceTree = "<group>"; };
F4C0B9D9108E3142002FC8E4 /* GTMUILocalizerAndLayoutTweakerTest5-2.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = "GTMUILocalizerAndLayoutTweakerTest5-2.tiff"; sourceTree = "<group>"; };
+ F4C62483109753960069CADD /* GTMIBArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMIBArray.h; sourceTree = "<group>"; };
+ F4C62484109753960069CADD /* GTMIBArray.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMIBArray.m; sourceTree = "<group>"; };
+ F4C62485109753960069CADD /* GTMIBArrayTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMIBArrayTest.h; sourceTree = "<group>"; };
+ F4C62486109753960069CADD /* GTMIBArrayTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMIBArrayTest.m; sourceTree = "<group>"; };
+ F4C62487109753960069CADD /* GTMIBArrayTest.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GTMIBArrayTest.xib; sourceTree = "<group>"; };
F4C978090D5B79C7001C29A6 /* ReleaseNotes.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ReleaseNotes.txt; sourceTree = "<group>"; };
F4CA854E0DAFAAB600B4AB10 /* xcconfigs-readme.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "xcconfigs-readme.txt"; sourceTree = "<group>"; };
F4CA864A0DB3ACB200B4AB10 /* DebugLeopardOrLater.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = DebugLeopardOrLater.xcconfig; sourceTree = "<group>"; };
@@ -1042,6 +1051,11 @@
F4A420EE0EDDF8E000397A11 /* GTMHotKeyTextFieldTest.m */,
8BAA9B560F7B4C2400DF4F12 /* GTMHotKeyTextFieldTest.xib */,
8B0E653E0FD80D5E00461C4A /* GTMHotKeyTextFieldLocalizations */,
+ F4C62483109753960069CADD /* GTMIBArray.h */,
+ F4C62484109753960069CADD /* GTMIBArray.m */,
+ F4C62485109753960069CADD /* GTMIBArrayTest.h */,
+ F4C62486109753960069CADD /* GTMIBArrayTest.m */,
+ F4C62487109753960069CADD /* GTMIBArrayTest.xib */,
8B1801A10E2533D500280961 /* GTMLargeTypeWindow.h */,
8B1801A00E2533D500280961 /* GTMLargeTypeWindow.m */,
8B1801A40E2533DB00280961 /* GTMLargeTypeWindowTest.m */,
@@ -1390,6 +1404,7 @@
7F97DB32104EBCA0004DDDEE /* GTMFadeTruncatingTextFieldCell.h in Headers */,
7FF768E41051B17E00D34F4B /* GTMNSImage+SearchCache.h in Headers */,
8B307FF91056B773006C4C7A /* GTMNSNumber+64Bit.h in Headers */,
+ F4C6248B109753960069CADD /* GTMIBArray.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1701,6 +1716,7 @@
F4C0B9DA108E3142002FC8E4 /* GTMUILocalizerAndLayoutTweakerTest5-0.tiff in Resources */,
F4C0B9DB108E3142002FC8E4 /* GTMUILocalizerAndLayoutTweakerTest5-1.tiff in Resources */,
F4C0B9DC108E3142002FC8E4 /* GTMUILocalizerAndLayoutTweakerTest5-2.tiff in Resources */,
+ F4C6248A109753960069CADD /* GTMIBArrayTest.xib in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1940,6 +1956,7 @@
0BFAD4C9104D06EF002BEB27 /* GTMNSDictionary+CaseInsensitive.m in Sources */,
7FF768E51051B17E00D34F4B /* GTMNSImage+SearchCache.m in Sources */,
8B307FF81056B773006C4C7A /* GTMNSNumber+64Bit.m in Sources */,
+ F4C6248C109753960069CADD /* GTMIBArray.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1971,6 +1988,7 @@
F42E2C69102B1261004DF054 /* GTMUILocalizerAndLayoutTweakerTest.m in Sources */,
7F97DB31104EBC8D004DDDEE /* GTMFadeTruncatingTextFieldCellTest.m in Sources */,
7FF768E31051B17900D34F4B /* GTMNSImage+SearchCacheTest.m in Sources */,
+ F4C62489109753960069CADD /* GTMIBArrayTest.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/ReleaseNotes.txt b/ReleaseNotes.txt
index 603808c..b18e8d2 100644
--- a/ReleaseNotes.txt
+++ b/ReleaseNotes.txt
@@ -247,7 +247,7 @@ Changes since 1.5.1
with supplied NSPorts.
- Finally dropped GTMHTTPFetcher and GTMProgressMonitorInputStream, GData
- versions now pretty much line up w/ these, so rather then both projects
+ versions now pretty much line up with these, so rather then both projects
maintaing them, we've dropped them and point folks at the gdata versions
which can be used independent of the rest of GData.
@@ -340,12 +340,14 @@ Changes since 1.5.1
- Added GTMNSNumber+64Bit for working with CGFloats, NSIntegers and NSUInters
using NSNumber on all supported SDKs.
+- Added GTMIBArray for building arrays in nib files.
+
Release 1.5.1
Changes since 1.5.0
16-June-2008
-- Fixed building tiger gcov w/ a directory path that contains a space.
+- Fixed building tiger gcov with a directory path that contains a space.
Release 1.5.0
@@ -401,7 +403,7 @@ Changes since 1.0.0
- Renamed the actual framework to "GoogleToolboxForMac.framework" (it should
have matched the project on code.google.com from the start)
-- added a Debug-gcov target that will product debug bits w/ code coverage
+- added a Debug-gcov target that will product debug bits with code coverage
support to check unittests, etc.
- GTMDebugSelectorValidation to provide something to include in class impls
@@ -440,7 +442,7 @@ Changes since 1.0.0
- Added GTMHTTPFetcher and GTMProgressMonitorInputStream.
- Moved the data files for unittests into subdirectories call TestData to
- help make it a little easier to find files w/in the main directories.
+ help make it a little easier to find files within the main directories.
- GTMDelegatingTableColumn get an overhaul to match the 10.5 sdk so it's closer
to a dropin for previous sdks.