OSDN Git Service

処理をわかりやすく
[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 fileprivate 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: "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]
57             else { return [] }
58         
59         return items
60     }
61     
62     func createNewBookmark() -> Bookmark? {
63         
64         guard let maxOrder = bookmarksController.value(forKeyPath: "arrangedObjects.@max.order") as? Int
65             else {
66                 print("BookmarkManager: Can no convert max order to Int")
67                 return nil
68         }
69         
70         guard let new = editorStore.createBookmark()
71             else {
72                 print("BookmarkManager: Can not insert BookMarkItem")
73                 return nil
74         }
75         
76         new.identifier = String(format: "B%@", arguments: [NSDate()])
77         new.order = maxOrder + 100
78         
79         DispatchQueue.main.asyncAfter(deadline: .now()) {
80             
81             self.editorStore.save()
82         }
83         
84         return new
85     }
86     
87     func menuNeedsUpdate(_ menu: NSMenu) {
88         
89         buildBookmarkMenu()
90     }
91     
92     private func buildBookmarkMenu() {
93         
94         bookmarkMenu
95             .items
96             .filter { $0.tag == BookmarkMenuTag.bookmarkItem.rawValue }
97             .forEach(bookmarkMenu.removeItem)
98         
99         bookmarks.forEach {
100             
101             let item = NSMenuItem(title: $0.name,
102                                   action: #selector(ExternalBrowserWindowController.selectBookmark(_:)),
103                                   keyEquivalent: "")
104             item.representedObject = $0
105             item.tag = BookmarkMenuTag.bookmarkItem.rawValue
106             bookmarkMenu.addItem(item)
107         }
108     }
109 }