Commits

rentzsch  committed 0c37054

[FIX] TaskTracker 1.2.2. Switch from NSManagedObject-JRExtensions to CoreData+JRExtensions. This fixes the total task time update bug exposed in the Universal version (1.2.1).

  • Participants
  • Parent commits 00ae026

Comments (0)

Files changed (9)

 	<key>CFBundlePackageType</key>
 	<string>APPL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>1.2.1</string>
+	<string>1.2.2</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>
-	<string>1.2.1</string>
+	<string>1.2.2</string>
 	<key>NSMainNibFile</key>
 	<string>MainMenu</string>
 	<key>NSPrincipalClass</key>

File MyDocument.m

 #import "MyDocument.h"
-#import "NSManagedObject-JRExtensions.h"
+#import "CoreData+JRExtensions.h"
 #import "nsenumerate.h"
 #import "TaskMO.h"
 #import "TaskPeriodMO.h"
 	[super dealloc];
 }
 
-- (void) updateCalcIntervalKVO:(NSTimer*)timer {
+- (void)updateCalcIntervalKVO:(NSTimer*)timer {
 	NSManagedObjectContext *moc = [self managedObjectContext];
 	[[moc undoManager] disableUndoRegistration]; {
 		NSMutableSet *tasksNeedingUpdating = [NSMutableSet set];

File NSManagedObject-JRExtensions.h

-#import <Cocoa/Cocoa.h>
-
-@interface NSManagedObject (JRExtensions)
-+ (id)newInManagedObjectContext:(NSManagedObjectContext*)moc_;
-
-+ (id)rootObjectInManagedObjectContext:(NSManagedObjectContext*)moc_;
-- (id)initAndInsertIntoManagedObjectContext:(NSManagedObjectContext*)moc_;
-
-+ (NSArray*)fetchAllInManagedObjectContext:(NSManagedObjectContext*)moc_;
-+ (NSArray*)fetchAllInManagedObjectContext:(NSManagedObjectContext*)moc_ error:(NSError**)error_;
-
-+ (NSString*)entityNameByHeuristic; // MyCoolObjectMO => @"MyCoolObject".
-+ (NSEntityDescription*)entityDescriptionInManagedObjectContext:(NSManagedObjectContext*)moc_;
-+ (NSFetchRequest*)fetchRequestForEntityInManagedObjectContext:(NSManagedObjectContext*)moc_;
-@end
-
-@interface NSManagedObjectContext (JRExtensions)
-- (NSArray*)executeFetchRequestNamed:(NSString*)fetchRequestName_ error:(NSError**)error;
-@end

File NSManagedObject-JRExtensions.m

-#import "NSManagedObject-JRExtensions.h"
-
-@implementation NSManagedObject (JRExtensions)
-
-+ (id)newInManagedObjectContext:(NSManagedObjectContext*)moc_ {
-	return [[[self alloc] initAndInsertIntoManagedObjectContext:moc_] autorelease];
-}
-
-+ (id)rootObjectInManagedObjectContext:(NSManagedObjectContext*)moc_ {
-	NSError *error = nil;
-	NSArray *objects = [moc_ executeFetchRequest:[self fetchRequestForEntityInManagedObjectContext:moc_] error:&error];
-	NSAssert( objects, @"-[NSManagedObjectContext executeFetchRequest] returned nil" );
-	
-	id result = nil;
-	
-	switch( [objects count] ) {
-		case 0:
-			[[moc_ undoManager] disableUndoRegistration];
-			result = [self newInManagedObjectContext:moc_];
-			[moc_ processPendingChanges];
-			[[moc_ undoManager] enableUndoRegistration];
-			break;
-		case 1:
-			result = [objects objectAtIndex:0];
-			break;
-		default:
-			NSAssert2( NO, @"0 or 1 %@ objects expected, %d found", [self className], [objects count] );
-	}
-	
-	return result;
-}
-
-- (id)initAndInsertIntoManagedObjectContext:(NSManagedObjectContext*)moc_ {
-	return [self initWithEntity:[[self class] entityDescriptionInManagedObjectContext:moc_] insertIntoManagedObjectContext:moc_];
-}
-
-+ (NSString*)entityNameByHeuristic {
-	NSString *result = [self className];
-	if( [result hasSuffix:@"MO"] )
-		result = [result substringToIndex:([result length]-2)];
-	return result;
-}
-
-+ (NSEntityDescription*)entityDescriptionInManagedObjectContext:(NSManagedObjectContext*)moc_ {
-	NSEntityDescription *result = [NSEntityDescription entityForName:[self entityNameByHeuristic] inManagedObjectContext:moc_];
-	if( nil == result ) {
-		// Heuristic failed. Do it the hard way.
-		NSString *className = [self className];
-		NSManagedObjectModel *managedObjectModel = [[moc_ persistentStoreCoordinator] managedObjectModel];
-		NSArray *entities = [managedObjectModel entities];
-		unsigned entityIndex = 0, entityCount = [entities count];
-		for( ; nil == result && entityIndex < entityCount; ++entityIndex ) {
-			if( [[[entities objectAtIndex:entityIndex] managedObjectClassName] isEqualToString:className] )
-				result = [entities objectAtIndex:entityIndex];
-		}
-		NSAssert1( result, @"no entity found with a managedObjectClassName of %@", className );
-	}
-	return result;
-}
-
-+ (NSFetchRequest*)fetchRequestForEntityInManagedObjectContext:(NSManagedObjectContext*)moc_ {
-	NSFetchRequest *result = [[[NSFetchRequest alloc] init] autorelease];
-	[result setEntity:[self entityDescriptionInManagedObjectContext:moc_]];
-	return result;
-}
-
-+ (NSArray*)fetchAllInManagedObjectContext:(NSManagedObjectContext*)moc_ {
-	return [self fetchAllInManagedObjectContext:moc_ error:nil];
-}
-
-+ (NSArray*)fetchAllInManagedObjectContext:(NSManagedObjectContext*)moc_ error:(NSError**)error_ {
-	return [moc_ executeFetchRequest:[self fetchRequestForEntityInManagedObjectContext:moc_]
-							   error:error_];
-}
-
-@end
-
-@implementation NSManagedObjectContext (JRExtensions)
-- (NSArray*)executeFetchRequestNamed:(NSString*)fetchRequestName_ error:(NSError**)error_ {
-	NSFetchRequest *fetchRequest = [[[self persistentStoreCoordinator] managedObjectModel] fetchRequestTemplateForName:fetchRequestName_];
-	NSAssert1(fetchRequest, @"Can't find fetch request named \"%@\".", fetchRequestName_);
-	return [self executeFetchRequest:fetchRequest error:error_];
-}
-@end

File TaskDocumentMO.m

 #import "TaskDocumentMO.h"
 #import "TaskPeriodMO.h"
-#import "NSManagedObject-JRExtensions.h"
+#import "CoreData+JRExtensions.h"
 #import "nsenumerate.h"
 
 double calculateTotal( double dollarsPerHour, double secondsWorked ) {
 #import "TaskPeriodMO.h"
 #import "TaskDocumentMO.h"
 #import "MyDocument.h"
-#import "NSManagedObject-JRExtensions.h"
+#import "CoreData+JRExtensions.h"
 #import "nsenumerate.h"
 
 @implementation TaskMO

File TaskTracker2.xcodeproj/project.pbxproj

 		793B66BE0822817F00D8D69E /* TaskDocumentMO.m in Sources */ = {isa = PBXBuildFile; fileRef = 793B66BD0822817F00D8D69E /* TaskDocumentMO.m */; };
 		793B66C50822818900D8D69E /* TaskMO.m in Sources */ = {isa = PBXBuildFile; fileRef = 793B66C40822818900D8D69E /* TaskMO.m */; };
 		793B66CC0822819700D8D69E /* TaskPeriodMO.m in Sources */ = {isa = PBXBuildFile; fileRef = 793B66CB0822819700D8D69E /* TaskPeriodMO.m */; };
-		793B66EF08228CDF00D8D69E /* NSManagedObject-JRExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 793B66EE08228CDF00D8D69E /* NSManagedObject-JRExtensions.m */; };
+		79476D820B02EBA90008B0B7 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79476D810B02EBA90008B0B7 /* Carbon.framework */; };
+		79A384360B02579A00386B39 /* CoreData+JRExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 79A384350B02579A00386B39 /* CoreData+JRExtensions.m */; };
 		79E11BBD098CA5AB000E8E93 /* Aqua2_Add_Inactive.tif in Resources */ = {isa = PBXBuildFile; fileRef = 79E11BBA098CA5AB000E8E93 /* Aqua2_Add_Inactive.tif */; };
 		79E11BBE098CA5AB000E8E93 /* Aqua2_Add_Pressed.tif in Resources */ = {isa = PBXBuildFile; fileRef = 79E11BBB098CA5AB000E8E93 /* Aqua2_Add_Pressed.tif */; };
 		79E11BBF098CA5AB000E8E93 /* Aqua2_Add.tif in Resources */ = {isa = PBXBuildFile; fileRef = 79E11BBC098CA5AB000E8E93 /* Aqua2_Add.tif */; };
 		793B66C40822818900D8D69E /* TaskMO.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TaskMO.m; sourceTree = "<group>"; };
 		793B66CA0822819700D8D69E /* TaskPeriodMO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TaskPeriodMO.h; sourceTree = "<group>"; };
 		793B66CB0822819700D8D69E /* TaskPeriodMO.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TaskPeriodMO.m; sourceTree = "<group>"; };
-		793B66ED08228CDF00D8D69E /* NSManagedObject-JRExtensions.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = "NSManagedObject-JRExtensions.h"; sourceTree = "<group>"; };
-		793B66EE08228CDF00D8D69E /* NSManagedObject-JRExtensions.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = "NSManagedObject-JRExtensions.m"; sourceTree = "<group>"; };
+		79476D810B02EBA90008B0B7 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = ../../../../../../../../System/Library/Frameworks/Carbon.framework; sourceTree = "<group>"; };
+		79A384340B02579A00386B39 /* CoreData+JRExtensions.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = "CoreData+JRExtensions.h"; path = "../CoreData+JRExtensions/CoreData+JRExtensions.h"; sourceTree = SOURCE_ROOT; };
+		79A384350B02579A00386B39 /* CoreData+JRExtensions.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = "CoreData+JRExtensions.m"; path = "../CoreData+JRExtensions/CoreData+JRExtensions.m"; sourceTree = SOURCE_ROOT; };
 		79E11BBA098CA5AB000E8E93 /* Aqua2_Add_Inactive.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = Aqua2_Add_Inactive.tif; sourceTree = "<group>"; };
 		79E11BBB098CA5AB000E8E93 /* Aqua2_Add_Pressed.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = Aqua2_Add_Pressed.tif; sourceTree = "<group>"; };
 		79E11BBC098CA5AB000E8E93 /* Aqua2_Add.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = Aqua2_Add.tif; sourceTree = "<group>"; };
 			buildActionMask = 2147483647;
 			files = (
 				775DFF38067A968500C5B868 /* Cocoa.framework in Frameworks */,
+				79476D820B02EBA90008B0B7 /* Carbon.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		1058C7A6FEA54F5311CA2CBB /* Linked Frameworks */ = {
 			isa = PBXGroup;
 			children = (
+				79476D810B02EBA90008B0B7 /* Carbon.framework */,
 				1058C7A7FEA54F5311CA2CBB /* Cocoa.framework */,
 			);
 			name = "Linked Frameworks";
 				79E11D58098D414E000E8E93 /* IntervalFormatter.h */,
 				79E11D59098D414E000E8E93 /* IntervalFormatter.m */,
 				79E11D82098D440D000E8E93 /* nsenumerate.h */,
-				793B66ED08228CDF00D8D69E /* NSManagedObject-JRExtensions.h */,
-				793B66EE08228CDF00D8D69E /* NSManagedObject-JRExtensions.m */,
+				79A384340B02579A00386B39 /* CoreData+JRExtensions.h */,
+				79A384350B02579A00386B39 /* CoreData+JRExtensions.m */,
 			);
 			name = Classes;
 			sourceTree = "<group>";
 				793B66BE0822817F00D8D69E /* TaskDocumentMO.m in Sources */,
 				793B66C50822818900D8D69E /* TaskMO.m in Sources */,
 				793B66CC0822819700D8D69E /* TaskPeriodMO.m in Sources */,
-				793B66EF08228CDF00D8D69E /* NSManagedObject-JRExtensions.m in Sources */,
 				79E11D5A098D414E000E8E93 /* IntervalFormatter.m in Sources */,
+				79A384360B02579A00386B39 /* CoreData+JRExtensions.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

File TaskTracker2.xcodeproj/wolf.mode1

 	<key>Notifications</key>
 	<array/>
 	<key>OpenEditors</key>
-	<array>
-		<dict>
-			<key>Content</key>
-			<dict>
-				<key>PBXProjectModuleGUID</key>
-				<string>7954686D0B014DAE00BF1539</string>
-				<key>PBXProjectModuleLabel</key>
-				<string>MyDocument.m</string>
-				<key>PBXSplitModuleInNavigatorKey</key>
-				<dict>
-					<key>Split0</key>
-					<dict>
-						<key>PBXProjectModuleGUID</key>
-						<string>7954686E0B014DAE00BF1539</string>
-						<key>PBXProjectModuleLabel</key>
-						<string>MyDocument.m</string>
-						<key>_historyCapacity</key>
-						<integer>0</integer>
-						<key>bookmark</key>
-						<string>79E591C20B01B278002875BF</string>
-						<key>history</key>
-						<array>
-							<string>7954686F0B014DAE00BF1539</string>
-						</array>
-					</dict>
-					<key>SplitCount</key>
-					<string>1</string>
-				</dict>
-				<key>StatusBarVisibility</key>
-				<true/>
-			</dict>
-			<key>Geometry</key>
-			<dict>
-				<key>Frame</key>
-				<string>{{0, 20}, {1092, 743}}</string>
-				<key>PBXModuleWindowStatusBarHidden2</key>
-				<false/>
-				<key>RubberWindowFrame</key>
-				<string>671 693 1092 784 0 0 2560 1578 </string>
-			</dict>
-		</dict>
-		<dict>
-			<key>Content</key>
-			<dict>
-				<key>PBXProjectModuleGUID</key>
-				<string>795468690B014DAE00BF1539</string>
-				<key>PBXProjectModuleLabel</key>
-				<string>TaskMO.m</string>
-				<key>PBXSplitModuleInNavigatorKey</key>
-				<dict>
-					<key>Split0</key>
-					<dict>
-						<key>PBXProjectModuleGUID</key>
-						<string>7954686A0B014DAE00BF1539</string>
-						<key>PBXProjectModuleLabel</key>
-						<string>TaskMO.m</string>
-						<key>_historyCapacity</key>
-						<integer>0</integer>
-						<key>bookmark</key>
-						<string>79E591C30B01B278002875BF</string>
-						<key>history</key>
-						<array>
-							<string>7954686C0B014DAE00BF1539</string>
-						</array>
-					</dict>
-					<key>SplitCount</key>
-					<string>1</string>
-				</dict>
-				<key>StatusBarVisibility</key>
-				<true/>
-			</dict>
-			<key>Geometry</key>
-			<dict>
-				<key>Frame</key>
-				<string>{{0, 20}, {821, 716}}</string>
-				<key>PBXModuleWindowStatusBarHidden2</key>
-				<false/>
-				<key>RubberWindowFrame</key>
-				<string>1391 617 821 757 0 0 2560 1578 </string>
-			</dict>
-		</dict>
-	</array>
+	<array/>
 	<key>PerspectiveWidths</key>
 	<array>
 		<integer>-1</integer>
 								<string>E1B74B1A0667B4A90069E3BA</string>
 								<string>2A37F4AFFDCFA73011CA2CEA</string>
 								<string>2A37F4B8FDCFA73011CA2CEA</string>
+								<string>2A37F4C3FDCFA73011CA2CEA</string>
+								<string>1058C7A6FEA54F5311CA2CBB</string>
 								<string>19C28FB0FE9D524F11CA2CBB</string>
 								<string>1C37FBAC04509CD000000102</string>
-								<string>79E591BB0B01B24D002875BF</string>
 								<string>1C37FAAC04509CD000000102</string>
 								<string>1C37FABC05509CD000000102</string>
 							</array>
 							<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
 							<array>
 								<array>
-									<integer>30</integer>
-									<integer>20</integer>
+									<integer>38</integer>
+									<integer>37</integer>
 									<integer>0</integer>
 								</array>
 							</array>
 							<real>218</real>
 						</array>
 						<key>RubberWindowFrame</key>
-						<string>1173 776 932 802 0 0 2560 1578 </string>
+						<string>89 76 932 802 0 0 1440 878 </string>
 					</dict>
 					<key>Module</key>
 					<string>PBXSmartGroupTreeModule</string>
 								<key>Frame</key>
 								<string>{{0, 0}, {692, 0}}</string>
 								<key>RubberWindowFrame</key>
-								<string>1173 776 932 802 0 0 2560 1578 </string>
+								<string>89 76 932 802 0 0 1440 878 </string>
 							</dict>
 							<key>Module</key>
 							<string>PBXNavigatorGroup</string>
 								<key>Frame</key>
 								<string>{{0, 5}, {692, 756}}</string>
 								<key>RubberWindowFrame</key>
-								<string>1173 776 932 802 0 0 2560 1578 </string>
+								<string>89 76 932 802 0 0 1440 878 </string>
 							</dict>
 							<key>Module</key>
 							<string>XCDetailModule</string>
 			</array>
 			<key>TableOfContents</key>
 			<array>
-				<string>79E591A70B01AFF7002875BF</string>
+				<string>79812BF40B04E73300DF4429</string>
 				<string>1CE0B1FE06471DED0097A5F4</string>
-				<string>79E591A80B01AFF7002875BF</string>
+				<string>79812BF50B04E73300DF4429</string>
 				<string>1CE0B20306471E060097A5F4</string>
 				<string>1CE0B20506471E060097A5F4</string>
 			</array>
 	<integer>5</integer>
 	<key>WindowOrderList</key>
 	<array>
+		<string>79812C040B04E76D00DF4429</string>
+		<string>1C0AD2B3069F1EA900FABCE6</string>
 		<string>79262739098C8C0B00C029FE</string>
-		<string>795468690B014DAE00BF1539</string>
-		<string>1C0AD2B3069F1EA900FABCE6</string>
-		<string>7954686D0B014DAE00BF1539</string>
 		<string>/Volumes/Island/wolf/code/sf/redshed/cocoa/TaskTracker2/TaskTracker2.xcodeproj</string>
 	</array>
 	<key>WindowString</key>
-	<string>1173 776 932 802 0 0 2560 1578 </string>
+	<string>89 76 932 802 0 0 1440 878 </string>
 	<key>WindowTools</key>
 	<array>
 		<dict>
 								<key>PBXProjectModuleGUID</key>
 								<string>1CD0528F0623707200166675</string>
 								<key>PBXProjectModuleLabel</key>
-								<string>MyDocument.xcdatamodel</string>
+								<string></string>
 								<key>StatusBarVisibility</key>
 								<true/>
 							</dict>
 								<key>Frame</key>
 								<string>{{0, 0}, {1037, 330}}</string>
 								<key>RubberWindowFrame</key>
-								<string>986 797 1037 612 0 0 2560 1578 </string>
+								<string>261 224 1037 612 0 0 1440 878 </string>
 							</dict>
 							<key>Module</key>
 							<string>PBXNavigatorGroup</string>
 							<string>330pt</string>
 						</dict>
 						<dict>
-							<key>BecomeActive</key>
-							<true/>
 							<key>ContentConfiguration</key>
 							<dict>
 								<key>PBXProjectModuleGUID</key>
 								<key>Frame</key>
 								<string>{{0, 335}, {1037, 236}}</string>
 								<key>RubberWindowFrame</key>
-								<string>986 797 1037 612 0 0 2560 1578 </string>
+								<string>261 224 1037 612 0 0 1440 878 </string>
 							</dict>
 							<key>Module</key>
 							<string>PBXBuildResultsModule</string>
 			<key>TableOfContents</key>
 			<array>
 				<string>79262739098C8C0B00C029FE</string>
-				<string>79E591AB0B01AFF7002875BF</string>
+				<string>79812BF60B04E73300DF4429</string>
 				<string>1CD0528F0623707200166675</string>
 				<string>XCMainBuildResultsModuleGUID</string>
 			</array>
 			<key>ToolbarConfiguration</key>
 			<string>xcode.toolbar.config.build</string>
 			<key>WindowString</key>
-			<string>986 797 1037 612 0 0 2560 1578 </string>
+			<string>261 224 1037 612 0 0 1440 878 </string>
 			<key>WindowToolGUID</key>
 			<string>79262739098C8C0B00C029FE</string>
 			<key>WindowToolIsVisible</key>
 										<string>yes</string>
 										<key>sizes</key>
 										<array>
-											<string>{{0, 0}, {578, 264}}</string>
-											<string>{{578, 0}, {394, 264}}</string>
+											<string>{{0, 0}, {575, 302}}</string>
+											<string>{{575, 0}, {397, 302}}</string>
 										</array>
 									</dict>
 									<key>VerticalSplitView</key>
 										<string>yes</string>
 										<key>sizes</key>
 										<array>
-											<string>{{0, 0}, {972, 264}}</string>
-											<string>{{0, 264}, {972, 329}}</string>
+											<string>{{0, 0}, {972, 302}}</string>
+											<string>{{0, 302}, {972, 291}}</string>
 										</array>
 									</dict>
 								</dict>
 			<key>TableOfContents</key>
 			<array>
 				<string>1CD10A99069EF8BA00B06720</string>
-				<string>79E11EC4098D6554000E8E93</string>
+				<string>79476D3B0B02DEBC0008B0B7</string>
 				<string>1C162984064C10D400B95A72</string>
-				<string>79E11EC5098D6554000E8E93</string>
-				<string>79E11EC6098D6554000E8E93</string>
-				<string>79E11EC7098D6554000E8E93</string>
-				<string>79E11EC8098D6554000E8E93</string>
-				<string>79E11EC9098D6554000E8E93</string>
-				<string>79E11ECA098D6554000E8E93</string>
+				<string>79476D3C0B02DEBC0008B0B7</string>
+				<string>79476D3D0B02DEBC0008B0B7</string>
+				<string>79476D3E0B02DEBC0008B0B7</string>
+				<string>79476D3F0B02DEBC0008B0B7</string>
+				<string>79476D400B02DEBC0008B0B7</string>
+				<string>79476D410B02DEBC0008B0B7</string>
 			</array>
 			<key>ToolbarConfiguration</key>
 			<string>xcode.toolbar.config.debug</string>
 							<key>Dock</key>
 							<array>
 								<dict>
+									<key>BecomeActive</key>
+									<true/>
 									<key>ContentConfiguration</key>
 									<dict>
 										<key>PBXProjectModuleGUID</key>
 										<string>1CDD528C0622207200134675</string>
 										<key>PBXProjectModuleLabel</key>
-										<string></string>
+										<string>TaskDocumentMO.m</string>
 										<key>StatusBarVisibility</key>
 										<true/>
 									</dict>
 										<key>Frame</key>
 										<string>{{0, 0}, {781, 212}}</string>
 										<key>RubberWindowFrame</key>
-										<string>643 55 781 470 0 0 1440 878 </string>
+										<string>1736 149 781 470 0 0 2560 1578 </string>
 									</dict>
 									<key>Module</key>
 									<string>PBXNavigatorGroup</string>
 								<key>Frame</key>
 								<string>{{0, 217}, {781, 212}}</string>
 								<key>RubberWindowFrame</key>
-								<string>643 55 781 470 0 0 1440 878 </string>
+								<string>1736 149 781 470 0 0 2560 1578 </string>
 							</dict>
 							<key>Module</key>
 							<string>PBXProjectFindModule</string>
 			<key>TableOfContents</key>
 			<array>
 				<string>1C530D57069F1CE1000CFCEE</string>
-				<string>7969A8AA0B010DC6002471E7</string>
-				<string>7969A8AB0B010DC6002471E7</string>
+				<string>79A383DD0B0255CD00386B39</string>
+				<string>79A383DE0B0255CD00386B39</string>
 				<string>1CDD528C0622207200134675</string>
 				<string>1CD0528E0623707200166675</string>
 			</array>
 			<key>WindowString</key>
-			<string>643 55 781 470 0 0 1440 878 </string>
+			<string>1736 149 781 470 0 0 2560 1578 </string>
 			<key>WindowToolGUID</key>
 			<string>1C530D57069F1CE1000CFCEE</string>
 			<key>WindowToolIsVisible</key>
-			<true/>
+			<false/>
 		</dict>
 		<dict>
 			<key>Identifier</key>
 					<key>Dock</key>
 					<array>
 						<dict>
+							<key>BecomeActive</key>
+							<true/>
 							<key>ContentConfiguration</key>
 							<dict>
 								<key>PBXProjectModuleGUID</key>
 								<key>Frame</key>
 								<string>{{0, 0}, {440, 358}}</string>
 								<key>RubberWindowFrame</key>
-								<string>105 356 440 400 0 0 2560 1578 </string>
+								<string>1583 332 440 400 0 0 2560 1578 </string>
 							</dict>
 							<key>Module</key>
 							<string>PBXDebugCLIModule</string>
 			<key>TableOfContents</key>
 			<array>
 				<string>7926277C098C8CA000C029FE</string>
-				<string>79E11ECB098D6554000E8E93</string>
+				<string>79476D8D0B02EBB70008B0B7</string>
 				<string>1C78EAAC065D492600B07095</string>
 			</array>
 			<key>WindowString</key>
-			<string>105 356 440 400 0 0 2560 1578 </string>
+			<string>1583 332 440 400 0 0 2560 1578 </string>
 			<key>WindowToolGUID</key>
 			<string>7926277C098C8CA000C029FE</string>
 			<key>WindowToolIsVisible</key>
 							<key>GeometryConfiguration</key>
 							<dict>
 								<key>Frame</key>
-								<string>{{0, 0}, {1144, 170}}</string>
+								<string>{{0, 0}, {1183, 524}}</string>
 								<key>RubberWindowFrame</key>
-								<string>617 1236 1144 211 0 0 2560 1578 </string>
+								<string>115 278 1183 565 0 0 1440 878 </string>
 							</dict>
 							<key>Module</key>
 							<string>PBXRunSessionModule</string>
 							<key>Proportion</key>
-							<string>170pt</string>
+							<string>524pt</string>
 						</dict>
 					</array>
 					<key>Proportion</key>
-					<string>170pt</string>
+					<string>524pt</string>
 				</dict>
 			</array>
 			<key>Name</key>
 			<key>TableOfContents</key>
 			<array>
 				<string>1C0AD2B3069F1EA900FABCE6</string>
-				<string>79E591AC0B01AFF7002875BF</string>
+				<string>79812BF70B04E73300DF4429</string>
 				<string>1CD0528B0623707200166675</string>
-				<string>79E591AD0B01AFF7002875BF</string>
+				<string>79812BF80B04E73300DF4429</string>
 			</array>
 			<key>ToolbarConfiguration</key>
 			<string>xcode.toolbar.config.run</string>
 			<key>WindowString</key>
-			<string>617 1236 1144 211 0 0 2560 1578 </string>
+			<string>115 278 1183 565 0 0 1440 878 </string>
 			<key>WindowToolGUID</key>
 			<string>1C0AD2B3069F1EA900FABCE6</string>
 			<key>WindowToolIsVisible</key>
-			<true/>
+			<false/>
 		</dict>
 		<dict>
 			<key>Identifier</key>
 									<real>168</real>
 								</array>
 								<key>RubberWindowFrame</key>
-								<string>859 676 744 409 0 0 2560 1578 </string>
+								<string>329 286 744 409 0 0 1440 878 </string>
 							</dict>
 							<key>Module</key>
 							<string>PBXSmartGroupTreeModule</string>
 								<key>Frame</key>
 								<string>{{190, 0}, {554, 368}}</string>
 								<key>RubberWindowFrame</key>
-								<string>859 676 744 409 0 0 2560 1578 </string>
+								<string>329 286 744 409 0 0 1440 878 </string>
 							</dict>
 							<key>Module</key>
 							<string>XCDetailModule</string>
 			<true/>
 			<key>TableOfContents</key>
 			<array>
-				<string>79E11CB6098D374A000E8E93</string>
-				<string>79E11CB7098D374A000E8E93</string>
+				<string>79812C040B04E76D00DF4429</string>
+				<string>79812C050B04E76D00DF4429</string>
 				<string>1CE0B1FE06471DED0097A5F4</string>
 				<string>1CA1AED706398EBD00589147</string>
 			</array>
 			<key>ToolbarConfiguration</key>
 			<string>xcode.toolbar.config.breakpoints</string>
 			<key>WindowString</key>
-			<string>859 676 744 409 0 0 2560 1578 </string>
+			<string>329 286 744 409 0 0 1440 878 </string>
 			<key>WindowToolGUID</key>
-			<string>79E11CB6098D374A000E8E93</string>
+			<string>79812C040B04E76D00DF4429</string>
 			<key>WindowToolIsVisible</key>
 			<false/>
 		</dict>

File TaskTracker2.xcodeproj/wolf.pbxuser

 					PBXFileDataSource_Warnings_ColumnID,
 				);
 			};
-			PBXPerProjectTemplateStateSaveDate = 184659943;
-			PBXWorkspaceStateSaveDate = 184659943;
-		};
-		perUserProjectItems = {
-			7954686C0B014DAE00BF1539 /* PBXTextBookmark */ = 7954686C0B014DAE00BF1539 /* PBXTextBookmark */;
-			7954686F0B014DAE00BF1539 /* PBXTextBookmark */ = 7954686F0B014DAE00BF1539 /* PBXTextBookmark */;
-			79E591C20B01B278002875BF /* PBXTextBookmark */ = 79E591C20B01B278002875BF /* PBXTextBookmark */;
-			79E591C30B01B278002875BF /* PBXTextBookmark */ = 79E591C30B01B278002875BF /* PBXTextBookmark */;
+			PBXPerProjectTemplateStateSaveDate = 184870673;
+			PBXWorkspaceStateSaveDate = 184870673;
 		};
 		sourceControlManager = 793B669A08227F4B00D8D69E /* Source Control */;
 		userBuildSettings = {
 	};
 	2A37F4ACFDCFA73011CA2CEA /* MyDocument.m */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {1053, 1610}}";
-			sepNavSelRange = "{4076, 10}";
-			sepNavVisRect = "{{0, 899}, {1053, 711}}";
-			sepNavWindowFrame = "{{671, 693}, {1092, 784}}";
+			sepNavIntBoundsRect = "{{0, 0}, {1053, 1624}}";
+			sepNavSelRange = "{1036, 48}";
+			sepNavVisRect = "{{0, 0}, {1053, 726}}";
+			sepNavWindowFrame = "{{204, 83}, {1092, 784}}";
 		};
 	};
 	2A37F4AEFDCFA73011CA2CEA /* MyDocument.h */ = {
 			sepNavWindowFrame = "{{561, 121}, {821, 757}}";
 		};
 	};
+	2A37F4B0FDCFA73011CA2CEA /* main.m */ = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {1193, 673}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {1193, 673}}";
+			sepNavWindowFrame = "{{176, 695}, {1232, 731}}";
+		};
+	};
 	775BDEF0067A8BF0009058FE /* MyDocument.xcdatamodel */ = {
 		uiCtxt = {
 			"Xdesign Model Editor Bookmark Key" = {
 		continueAfterActions = 0;
 		delayBeforeContinue = 0;
 		hitCount = 1;
-		modificationTime = 160264052.588058;
+		location = Foundation;
+		modificationTime = 184740913.489344;
 		state = 1;
 		symbolName = "-[NSException raise]";
 	};
 		};
 		sourceDirectories = (
 		);
+		variableFormatDictionary = {
+		};
 	};
 	793B669A08227F4B00D8D69E /* Source Control */ = {
 		isa = PBXSourceControlManager;
 	};
 	793B66BD0822817F00D8D69E /* TaskDocumentMO.m */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {783, 784}}";
-			sepNavSelRange = "{714, 0}";
-			sepNavVisRect = "{{0, 25}, {783, 692}}";
+			sepNavIntBoundsRect = "{{0, 0}, {740, 798}}";
+			sepNavSelRange = "{84, 0}";
+			sepNavVisRect = "{{0, 0}, {740, 195}}";
 			sepNavWindowFrame = "{{581, 78}, {822, 750}}";
 		};
 	};
 	};
 	793B66C40822818900D8D69E /* TaskMO.m */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {794, 910}}";
-			sepNavSelRange = "{1309, 0}";
-			sepNavVisRect = "{{0, 0}, {782, 684}}";
+			sepNavIntBoundsRect = "{{0, 0}, {782, 924}}";
+			sepNavSelRange = "{1302, 0}";
+			sepNavVisRect = "{{0, 1}, {782, 699}}";
 			sepNavWindowFrame = "{{1391, 617}, {821, 757}}";
 		};
 	};
 			sepNavWindowFrame = "{{1590, 667}, {821, 757}}";
 		};
 	};
-	793B66ED08228CDF00D8D69E /* NSManagedObject-JRExtensions.h */ = {
+	79A384350B02579A00386B39 /* CoreData+JRExtensions.m */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {782, 684}}";
-			sepNavSelRange = "{780, 24}";
-			sepNavVisRect = "{{0, 0}, {782, 684}}";
-			sepNavWindowFrame = "{{1245, 138}, {821, 757}}";
+			sepNavIntBoundsRect = "{{0, 0}, {890, 2548}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {890, 650}}";
+			sepNavWindowFrame = "{{38, 170}, {929, 708}}";
 		};
 	};
-	793B66EE08228CDF00D8D69E /* NSManagedObject-JRExtensions.m */ = {
-		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {973, 1176}}";
-			sepNavSelRange = "{2933, 24}";
-			sepNavVisRect = "{{0, 0}, {973, 896}}";
-			sepNavWindowFrame = "{{475, 442}, {1012, 969}}";
-		};
-	};
-	7954686C0B014DAE00BF1539 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = 793B66C40822818900D8D69E /* TaskMO.m */;
-		name = "TaskMO.m: 46";
-		rLen = 0;
-		rLoc = 1309;
-		rType = 0;
-		vrLen = 1400;
-		vrLoc = 0;
-	};
-	7954686F0B014DAE00BF1539 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = 2A37F4ACFDCFA73011CA2CEA /* MyDocument.m */;
-		name = stopAction;
-		rLen = 10;
-		rLoc = 4076;
-		rType = 0;
-		vrLen = 2133;
-		vrLoc = 2024;
-	};
 	79E11D59098D414E000E8E93 /* IntervalFormatter.m */ = {
 		uiCtxt = {
 			sepNavIntBoundsRect = "{{0, 0}, {1053, 711}}";
 			sepNavWindowFrame = "{{130, 499}, {1012, 969}}";
 		};
 	};
-	79E591C20B01B278002875BF /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = 2A37F4ACFDCFA73011CA2CEA /* MyDocument.m */;
-		name = stopAction;
-		rLen = 10;
-		rLoc = 4076;
-		rType = 0;
-		vrLen = 2028;
-		vrLoc = 2129;
-	};
-	79E591C30B01B278002875BF /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = 793B66C40822818900D8D69E /* TaskMO.m */;
-		name = "TaskMO.m: 46";
-		rLen = 0;
-		rLoc = 1309;
-		rType = 0;
-		vrLen = 1400;
-		vrLoc = 0;
-	};
 	8D15AC270486D014006FF6A4 /* TaskTracker2 */ = {
 		activeExec = 0;
 		executables = (
 	8D15AC360486D014006FF6A4 /* Info.plist */ = {
 		uiCtxt = {
 			sepNavIntBoundsRect = "{{0, 0}, {938, 812}}";
-			sepNavSelRange = "{1378, 0}";
-			sepNavVisRect = "{{0, 0}, {938, 762}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 35}, {938, 777}}";
 			sepNavWindowFrame = "{{130, 43}, {977, 835}}";
 		};
 	};