1from Cocoa import * 2from CoreData import * 3import objc 4 5class DragAppAppDelegate (NSObject): 6 clubWindow = objc.IBOutlet() 7 peopleWindow = objc.IBOutlet() 8 9 _managedObjectModel = objc.ivar() 10 _managedObjectContext = objc.ivar() 11 _things = objc.ivar() 12 13 def managedObjectModel(self): 14 if self._managedObjectModel is None: 15 allBundles = NSMutableSet.alloc().init() 16 allBundles.addObject_(NSBundle.mainBundle()) 17 allBundles.addObjectsFromArray_(NSBundle.allFrameworks()) 18 19 self._managedObjectModel = NSManagedObjectModel.mergedModelFromBundles_(allBundles.allObjects()) 20 21 return self._managedObjectModel 22 23 24 25 # Change this path/code to point to your App's data store. 26 def applicationSupportFolder(self): 27 paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, True) 28 29 if len(paths) == 0: 30 NSRunAlertPanel("Alert", "Can't find application support folder", 31 "Quit", None, None) 32 NSApplication.sharedApplication().terminate_(self) 33 else: 34 applicationSupportFolder = paths[0].stringByAppendingPathComponent_("DragApp") 35 36 return applicationSupportFolder 37 38 def managedObjectContext(self): 39 if self._managedObjectContext is None: 40 fileManager = NSFileManager.defaultManager() 41 applicationSupportFolder = self.applicationSupportFolder() 42 43 if not fileManager.fileExistsAtPath_isDirectory_(applicationSupportFolder, None)[0]: 44 fileManager.createDirectoryAtPath_attributes_( 45 applicationSupportFolder, None) 46 47 url = NSURL.fileURLWithPath_( 48 applicationSupportFolder.stringByAppendingPathComponent_( 49 "DragApp.xml")) 50 51 coordinator = NSPersistentStoreCoordinator.alloc().initWithManagedObjectModel_(self.managedObjectModel()) 52 result, error = coordinator.addPersistentStoreWithType_configuration_URL_options_error_(NSXMLStoreType, None, url, None, None) 53 if result: 54 self._managedObjectContext = NSManagedObjectContext.alloc().init() 55 self._managedObjectContext.setPersistentStoreCoordinator_(coordinator) 56 else: 57 NSApplication.sharedApplication().presentError_(error) 58 59 return self._managedObjectContext 60 61 62 def windowWillReturnUndoManager_(self, window): 63 return self.managedObjectContext().undoManager() 64 65 @objc.IBAction 66 def saveAction_(self, sender): 67 res, error = self.managedObjectContext().save_(None) 68 if not res: 69 NSApplication.sharedApplication().presentError_(error) 70 71 def applicationShouldTerminate_(self, sender): 72 context = self.managedObjectContext() 73 74 reply = NSTerminateNow; 75 76 if context is not None: 77 if context.commitEditing(): 78 res, error = context.save_(None) 79 if not res: 80 # This default error handling implementation should be 81 # changed to make sure the error presented includes 82 # application specific error recovery. For now, simply 83 # display 2 panels. 84 errorResult = NSApplication.sharedApplication().presentError_(error) 85 86 if errorResult: # Then the error was handled 87 reply = NSTerminateCancel 88 else: 89 # Error handling wasn't implemented. Fall back to 90 # displaying a "quit anyway" panel. 91 alertReturn = NSRunAlertPanel(None, "Could not save changes while quitting. Quit anyway?" , "Quit anyway", "Cancel", None) 92 if alertReturn == NSAlertAlternateReturn: 93 reply = NSTerminateCancel; 94 95 else: 96 reply = NSTerminateCancel 97 98 return reply 99