5 // Created by Hori,Masaki on 2015/05/27.
6 // Copyright (c) 2015年 Hori,Masaki. All rights reserved.
9 #import "HMBookmarkManager.h"
14 const NSUInteger kBookmarkMenuItemTag = 5000;
15 const NSUInteger kSeparatorItemTag = 9999;
18 static HMBookmarkManager *sharedInstance = nil;
19 static NSMenu *bookmarkMenu = nil;
22 @interface HMBookmarkManager () <NSMenuDelegate>
24 @property (nonatomic, strong) NSArrayController *bookmarksController;
26 @property (readonly) HMBookmarkDataStore *editorStore;
29 @implementation HMBookmarkManager
33 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
34 [nc addObserver:[self sharedManager]
35 selector:@selector(applicationDidFinishLaunching:)
36 name:NSApplicationDidFinishLaunchingNotification
40 + (instancetype)sharedManager
42 if(sharedInstance) return sharedInstance;
44 sharedInstance = [self new];
45 return sharedInstance;
52 _bookmarksController = [[NSArrayController alloc] initWithContent:nil];
53 _bookmarksController.managedObjectContext = self.manageObjectContext;
54 _bookmarksController.entityName = @"Bookmark";
56 NSSortDescriptor *sortDesc = [NSSortDescriptor sortDescriptorWithKey:@"order"
58 _bookmarksController.sortDescriptors = @[sortDesc];
61 [NSTimer scheduledTimerWithTimeInterval:0.1
63 selector:@selector(storeData:)
71 - (void)applicationDidFinishLaunching:(NSNotification *)notification
73 NSMenu *mainMenu = [[NSApplication sharedApplication] mainMenu];
74 NSMenuItem *bookmarkMenuItem = [mainMenu itemWithTag:kBookmarkMenuItemTag];
75 bookmarkMenu = [bookmarkMenuItem submenu];
77 [bookmarkMenu setDelegate:self];
79 [self buildBookmarkMenu];
81 - (void)menuNeedsUpdate:(NSMenu*)menu
83 [self buildBookmarkMenu];
85 - (void)buildBookmarkMenu
87 NSInteger itemNum = bookmarkMenu.numberOfItems;
88 for(NSInteger i = itemNum - 1; i > 0; i--) {
89 NSMenuItem *item = [bookmarkMenu itemAtIndex:i];
90 if([item tag] == kSeparatorItemTag) break;
91 [bookmarkMenu removeItemAtIndex:i];
94 NSArray *bookmarksArray = self.bookmarks;
95 NSInteger bookmarkNum = bookmarksArray.count;
96 for(NSInteger i = 0; i < bookmarkNum; i++) {
97 HMBookmarkItem *item = bookmarksArray[i];
98 NSMenuItem *newItem = [[NSMenuItem alloc] initWithTitle:item.name
99 action:@selector(selectBookmark:)
101 newItem.representedObject = item;
102 [bookmarkMenu addItem:newItem];
106 - (NSManagedObjectContext *)manageObjectContext
108 return [[HMBookmarkDataStore defaultManager] managedObjectContext];
110 - (HMBookmarkDataStore *)editorStore
112 static HMBookmarkDataStore *_store = nil;
113 if(_store) return _store;
115 _store = [HMBookmarkDataStore oneTimeEditor];
118 - (void)storeData:(id)timer
120 HMBookmarkDataStore *store = self.editorStore;
121 NSManagedObjectContext *context = store.managedObjectContext;
122 if(context.hasChanges) {
123 [store saveAction:nil];
126 - (HMBookmarkItem *)createNewBookmark
128 NSNumber *maxOrder = [self.bookmarksController valueForKeyPath:@"arrangedObjects.@max.order"];
130 HMBookmarkItem *object = [self.editorStore insertNewObjectForEntityForName:@"Bookmark"];
131 object.identifier = [NSString stringWithFormat:@"HMBM%@", [NSDate date]];
132 object.order = @(maxOrder.integerValue + 100);
137 - (NSArray *)bookmarks
139 [self.bookmarksController fetch:nil];
140 NSArray *array = self.bookmarksController.arrangedObjects;