OSDN Git Service

#keyPathが使用可能な部分にそれを適用
[kcd/KCD.git] / KCD / BookmarkManager.swift
1 //
2 //  BookmarkManager.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/01/22.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 private enum BookmarkMenuTag: Int {
12     
13     case bookmark = 5000
14     
15     case separator = 9999
16     case bookmarkItem = 999999
17 }
18
19 final class BookmarkManager: NSObject, NSMenuDelegate {
20     
21     private static let sharedInstance: BookmarkManager = BookmarkManager()
22     
23     class func shared() -> BookmarkManager {
24         
25         return sharedInstance
26     }
27     
28     private let bookmarksController: NSArrayController
29     
30     private override init() {
31         
32         bookmarksController = NSArrayController()
33         
34         super.init()
35         
36         bookmarksController.managedObjectContext = self.manageObjectContext
37         bookmarksController.entityName = Bookmark.entityName
38         let sort = NSSortDescriptor(key: #keyPath(Bookmark.order), ascending: true)
39         bookmarksController.sortDescriptors = [sort]
40         
41         let mainMenu = NSApplication.shared.mainMenu
42         let bItem = mainMenu?.item(withTag: BookmarkMenuTag.bookmark.rawValue)
43         bookmarkMenu = bItem?.submenu
44         bookmarkMenu?.delegate = self
45         buildBookmarkMenu()
46     }
47     
48     private(set) var editorStore: BookmarkDataStore = BookmarkDataStore.oneTimeEditor()
49     private var bookmarkMenu: NSMenu!
50     var manageObjectContext = BookmarkDataStore.default.context
51     
52     var bookmarks: [Bookmark] {
53         
54         bookmarksController.fetch(nil)
55         
56         guard let items = bookmarksController.arrangedObjects as? [Bookmark] else { return [] }
57         
58         return items
59     }
60     
61     func createNewBookmark() -> Bookmark? {
62         
63         guard let maxOrder = bookmarksController.value(forKeyPath: "arrangedObjects.@max.order") as? Int else {
64             
65             print("BookmarkManager: Can no convert max order to Int")
66             return nil
67         }
68         
69         guard let new = editorStore.createBookmark() else {
70             
71             print("BookmarkManager: Can not insert BookMarkItem")
72             return nil
73         }
74         
75         new.identifier = String(format: "B%@", arguments: [NSDate()])
76         new.order = maxOrder + 100
77         
78         DispatchQueue.main.asyncAfter(deadline: .now()) {
79             
80             self.editorStore.save()
81         }
82         
83         return new
84     }
85     
86     func menuNeedsUpdate(_ menu: NSMenu) {
87         
88         buildBookmarkMenu()
89     }
90     
91     private func buildBookmarkMenu() {
92         
93         bookmarkMenu
94             .items
95             .filter { $0.tag == BookmarkMenuTag.bookmarkItem.rawValue }
96             .forEach(bookmarkMenu.removeItem)
97         
98         bookmarks.forEach {
99             
100             let item = NSMenuItem(title: $0.name,
101                                   action: #selector(ExternalBrowserWindowController.selectBookmark(_:)),
102                                   keyEquivalent: "")
103             item.representedObject = $0
104             item.tag = BookmarkMenuTag.bookmarkItem.rawValue
105             bookmarkMenu.addItem(item)
106         }
107     }
108 }