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