1# 2# StickiesAppDelegate.rb 3# Stickies 4# 5# Created by Laurent Sansonetti on 1/4/07. 6# Copyright (c) 2007 Apple Computer. All rights reserved. 7# 8 9class StickiesAppDelegate < NSObject#< StickiesAppDelegateBase #NSObject 10 11 ib_outlet :stickiesController 12 kvc_writer :managedObjectContext 13 kvc_writer :managedObjectModel 14 15 def applicationDidFinishLaunching(notification) 16 # Next time through the event loop, load all the stickies. 17 # This delay is required because the NSArrayController's fetch request is delayed until the next event loop 18 objc_send :performSelector, 'loadAllStickies', 19 :withObject, nil, 20 :afterDelay, 0.0 21 end 22 23 def loadAllStickies 24 # Fault each sticky in the array controller and call it's setup function 25 @stickiesController.arrangedObjects.to_a.each { |x| x.setupSticky } 26 end 27 28 def removeSticky(sticky) 29 @stickiesController.removeObject(sticky) 30 end 31 32 def managedObjectModel 33 return @managedObjectModel if @managedObjectModel 34 35 allBundles = OSX::NSMutableSet.alloc.init 36 allBundles.addObject(OSX::NSBundle.mainBundle) 37 allBundles.addObjectsFromArray(OSX::NSBundle.allFrameworks) 38 39 @managedObjectModel = OSX::NSManagedObjectModel.mergedModelFromBundles(allBundles.allObjects) 40 OSX::CoreData.define_wrapper(@managedObjectModel) 41 42 return @managedObjectModel 43 end 44 45 # Change this path/code to point to your App's data store. 46 def applicationSupportFolder 47 OSX.NSHomeDirectory.stringByAppendingPathComponent(File.join('Library', 'Application Support', 'CoreData Stickies')) 48 end 49 50 def managedObjectContext 51 return @managedObjectContext if @managedObjectContext 52 53 fileManager = OSX::NSFileManager.defaultManager 54 storeFolder = applicationSupportFolder 55 unless fileManager.fileExistsAtPath_isDirectory(storeFolder, nil) 56 fileManager.createDirectoryAtPath_attributes(storeFolder, nil) 57 end 58 59 url = OSX::NSURL.fileURLWithPath(storeFolder.stringByAppendingPathComponent('Stickies.xml')) 60 coordinator = OSX::NSPersistentStoreCoordinator.alloc.initWithManagedObjectModel(managedObjectModel) 61 ok, error = coordinator.objc_send :addPersistentStoreWithType, NSXMLStoreType, 62 :configuration, nil, 63 :URL, url, 64 :options, nil, 65 :error, nil # XXX 66 if ok 67 @managedObjectContext = OSX::NSManagedObjectContext.alloc.init 68 @managedObjectContext.setPersistentStoreCoordinator(coordinator) 69 else 70 raise "error" # XXX 71 OSX::NSApplication.sharedApplication.presentError(error) 72 end 73 return @managedObjectContext 74 end 75 76 def windowWillReturnUndoManager(window) 77 return managedObjectContext.undoManager 78 end 79 80 def saveAction(sender) 81 ok, error = managerObjectContext.save(nil) # XXX 82 unless ok 83 raise "error" # XXX 84 OSX::NSApplication.sharedApplication.presentError(error) 85 end 86 end 87 ib_action :saveAction 88 89 def applicationShouldTerminate(sender) 90 reply = OSX::NSTerminateNow 91 92 context = managedObjectContext 93 if context 94 if context.commitEditing 95 ok, error = context.save(nil) # XXX 96 unless ok 97 raise "error" # XXX 98 errorResult = OSX::NSApplication.sharedApplication.presentError?(error) 99 100 if errorResult 101 reply = OSX::NSTerminateCancel 102 else 103 alertReturn = OSX.NSRunAlertPanel(nil, "Could not save changes while quitting. Quit anyway?", "Quit anyway", "Cancel", nil) 104 if alertReturn == OSX::NSAlertAlternateReturn 105 reply = OSX::NSTerminateCancel 106 end 107 end 108 end 109 else 110 reply = OSX::NSTerminateCancel 111 end 112 end 113 return reply 114 end 115 116end 117