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