OSDN Git Service

UIを調整
[kcd/KCD.git] / KCD / HMBookmarkManager.m
1 //
2 //  HMBookmarkManager.m
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2015/05/27.
6 //  Copyright (c) 2015年 Hori,Masaki. All rights reserved.
7 //
8
9 #import "HMBookmarkManager.h"
10
11 const NSUInteger kBookmarkMenuItemTag = 5000;
12 const NSUInteger kSeparatorItemTag = 9999;
13
14
15 static HMBookmarkManager *sharedInstance = nil;
16 static NSMenu *bookmarkMenu = nil;
17
18
19 @interface HMBookmarkManager () <NSMenuDelegate>
20
21 @property (strong, nonatomic) NSArrayController *bookmarksController;
22
23 @property (readonly) HMBookmarkDataStore *editorStore;
24 @end
25
26 @implementation HMBookmarkManager
27
28 + (void)load
29 {
30         NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
31         [nc addObserver:[self sharedManager]
32                    selector:@selector(applicationDidFinishLaunching:)
33                            name:NSApplicationDidFinishLaunchingNotification
34                          object:NSApp];
35 }
36
37 + (instancetype)sharedManager
38 {
39         if(sharedInstance) return sharedInstance;
40         
41         sharedInstance = [self new];
42         return sharedInstance;
43 }
44
45 - (instancetype)init
46 {
47         self = [super init];
48         if(self) {
49                 _bookmarksController = [[NSArrayController alloc] initWithContent:nil];
50                 _bookmarksController.managedObjectContext = self.manageObjectContext;
51                 _bookmarksController.entityName = @"Bookmark";
52                 
53                 NSSortDescriptor *sortDesc = [NSSortDescriptor sortDescriptorWithKey:@"order"
54                                                                                                                                    ascending:YES];
55                 _bookmarksController.sortDescriptors = @[sortDesc];
56                 
57                 
58                 [NSTimer scheduledTimerWithTimeInterval:0.1
59                                                                                  target:self
60                                                                            selector:@selector(storeData:)
61                                                                            userInfo:nil
62                                                                                 repeats:YES];
63         }
64         return self;
65 }
66
67
68 - (void)applicationDidFinishLaunching:(NSNotification *)notification
69 {
70         NSMenu *mainMenu = [[NSApplication sharedApplication] mainMenu];
71         NSMenuItem *bookmarkMenuItem = [mainMenu itemWithTag:kBookmarkMenuItemTag];
72         bookmarkMenu = [bookmarkMenuItem submenu];
73         
74         [bookmarkMenu setDelegate:self];
75         
76         [self buildBookmarkMenu];
77 }
78 - (void)menuNeedsUpdate:(NSMenu*)menu
79 {
80         [self buildBookmarkMenu];
81 }
82 - (void)buildBookmarkMenu
83 {
84         NSInteger itemNum = bookmarkMenu.numberOfItems;
85         for(NSInteger i = itemNum - 1; i > 0; i--) {
86                 NSMenuItem *item = [bookmarkMenu itemAtIndex:i];
87                 if([item tag] == kSeparatorItemTag) break;
88                 [bookmarkMenu removeItemAtIndex:i];
89         }
90         
91         NSArray *bookmarksArray = self.bookmarks;
92         NSInteger bookmarkNum = bookmarksArray.count;
93         for(NSInteger i = 0; i < bookmarkNum; i++) {
94                 HMBookmarkItem *item = bookmarksArray[i];
95                 NSMenuItem *newItem = [[NSMenuItem alloc] initWithTitle:item.name
96                                                                                                                  action:@selector(selectBookmark:)
97                                                                                                   keyEquivalent:@""];
98                 newItem.representedObject = item;
99                 [bookmarkMenu addItem:newItem];
100         }
101 }
102
103 - (NSManagedObjectContext *)manageObjectContext
104 {
105         return [[HMBookmarkDataStore defaultManager] managedObjectContext];
106 }
107 - (HMBookmarkDataStore *)editorStore
108 {
109         static HMBookmarkDataStore *_store = nil;
110         if(_store) return _store;
111         
112         _store = [HMBookmarkDataStore oneTimeEditor];
113         return _store;
114 }
115 - (void)storeData:(id)timer
116 {
117         HMBookmarkDataStore *store = self.editorStore;
118         NSManagedObjectContext *context = store.managedObjectContext;
119         if(context.hasChanges) {
120                 [store saveAction:nil];
121         }
122 }
123 - (HMBookmarkItem *)createNewBookmark
124 {
125         NSNumber *maxOrder = [self.bookmarksController valueForKeyPath:@"arrangedObjects.@max.order"];
126         
127         HMBookmarkItem *object = [NSEntityDescription insertNewObjectForEntityForName:@"Bookmark"
128                                                                                                                    inManagedObjectContext:self.editorStore.managedObjectContext];
129         object.identifier = [NSString stringWithFormat:@"HMBM%@", [NSDate date]];
130         object.order = @(maxOrder.integerValue + 100);
131
132         return object;
133 }
134
135 - (NSArray *)bookmarks
136 {
137         [self.bookmarksController fetch:nil];
138         NSArray *array = self.bookmarksController.arrangedObjects;
139         return array;
140 }
141
142
143 @end