OSDN Git Service

HMAnchorageRepairManagerをSwiftに変換した
[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 #import "KCD-Swift.h"
12
13
14 const NSUInteger kBookmarkMenuItemTag = 5000;
15 const NSUInteger kSeparatorItemTag = 9999;
16
17
18 static HMBookmarkManager *sharedInstance = nil;
19 static NSMenu *bookmarkMenu = nil;
20
21
22 @interface HMBookmarkManager () <NSMenuDelegate>
23
24 @property (nonatomic, strong) NSArrayController *bookmarksController;
25
26 @property (readonly) HMBookmarkDataStore *editorStore;
27 @end
28
29 @implementation HMBookmarkManager
30
31 + (void)load
32 {
33         NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
34         [nc addObserver:[self sharedManager]
35                    selector:@selector(applicationDidFinishLaunching:)
36                            name:NSApplicationDidFinishLaunchingNotification
37                          object:NSApp];
38 }
39
40 + (instancetype)sharedManager
41 {
42         if(sharedInstance) return sharedInstance;
43         
44         sharedInstance = [self new];
45         return sharedInstance;
46 }
47
48 - (instancetype)init
49 {
50         self = [super init];
51         if(self) {
52                 _bookmarksController = [[NSArrayController alloc] initWithContent:nil];
53                 _bookmarksController.managedObjectContext = self.manageObjectContext;
54                 _bookmarksController.entityName = @"Bookmark";
55                 
56                 NSSortDescriptor *sortDesc = [NSSortDescriptor sortDescriptorWithKey:@"order"
57                                                                                                                                    ascending:YES];
58                 _bookmarksController.sortDescriptors = @[sortDesc];
59                 
60                 
61                 [NSTimer scheduledTimerWithTimeInterval:0.1
62                                                                                  target:self
63                                                                            selector:@selector(storeData:)
64                                                                            userInfo:nil
65                                                                                 repeats:YES];
66         }
67         return self;
68 }
69
70
71 - (void)applicationDidFinishLaunching:(NSNotification *)notification
72 {
73         NSMenu *mainMenu = [[NSApplication sharedApplication] mainMenu];
74         NSMenuItem *bookmarkMenuItem = [mainMenu itemWithTag:kBookmarkMenuItemTag];
75         bookmarkMenu = [bookmarkMenuItem submenu];
76         
77         [bookmarkMenu setDelegate:self];
78         
79         [self buildBookmarkMenu];
80 }
81 - (void)menuNeedsUpdate:(NSMenu*)menu
82 {
83         [self buildBookmarkMenu];
84 }
85 - (void)buildBookmarkMenu
86 {
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];
92         }
93         
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:)
100                                                                                                   keyEquivalent:@""];
101                 newItem.representedObject = item;
102                 [bookmarkMenu addItem:newItem];
103         }
104 }
105
106 - (NSManagedObjectContext *)manageObjectContext
107 {
108         return [[HMBookmarkDataStore defaultManager] managedObjectContext];
109 }
110 - (HMBookmarkDataStore *)editorStore
111 {
112         static HMBookmarkDataStore *_store = nil;
113         if(_store) return _store;
114         
115         _store = [HMBookmarkDataStore oneTimeEditor];
116         return _store;
117 }
118 - (void)storeData:(id)timer
119 {
120         HMBookmarkDataStore *store = self.editorStore;
121         NSManagedObjectContext *context = store.managedObjectContext;
122         if(context.hasChanges) {
123                 [store saveAction:nil];
124         }
125 }
126 - (HMBookmarkItem *)createNewBookmark
127 {
128         NSNumber *maxOrder = [self.bookmarksController valueForKeyPath:@"arrangedObjects.@max.order"];
129         
130         HMBookmarkItem *object = [self.editorStore insertNewObjectForEntityForName:@"Bookmark"];
131         object.identifier = [NSString stringWithFormat:@"HMBM%@", [NSDate date]];
132         object.order = @(maxOrder.integerValue + 100);
133
134         return object;
135 }
136
137 - (NSArray *)bookmarks
138 {
139         [self.bookmarksController fetch:nil];
140         NSArray *array = self.bookmarksController.arrangedObjects;
141         return array;
142 }
143
144
145 @end