OSDN Git Service

Loggerを利用するようにした
[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     static let shared = BookmarkManager()
22     
23     private override init() {
24         
25         super.init()
26         
27         bookmarksController.managedObjectContext = self.manageObjectContext
28         bookmarksController.entityName = Bookmark.entityName
29         let sort = NSSortDescriptor(key: #keyPath(Bookmark.order), ascending: true)
30         bookmarksController.sortDescriptors = [sort]
31         
32         let mainMenu = NSApplication.shared.mainMenu
33         let bItem = mainMenu?.item(withTag: BookmarkMenuTag.bookmark.rawValue)
34         bookmarkMenu = bItem?.submenu
35         bookmarkMenu?.delegate = self
36         buildBookmarkMenu()
37     }
38     
39     let editorStore: BookmarkDataStore = BookmarkDataStore.oneTimeEditor()
40     let manageObjectContext = BookmarkDataStore.default.context
41     private let bookmarksController = NSArrayController()
42     
43     private var bookmarkMenu: NSMenu!
44     
45     var bookmarks: [Bookmark] {
46         
47         bookmarksController.fetch(nil)
48         
49         guard let items = bookmarksController.arrangedObjects as? [Bookmark] else { return [] }
50         
51         return items
52     }
53     
54     func createNewBookmark() -> Bookmark? {
55         
56         guard let maxOrder = bookmarksController.value(forKeyPath: "arrangedObjects.@max.order") as? Int else {
57             
58             return Logger.shared.log("BookmarkManager: Can no convert max order to Int", value: nil)
59         }
60         
61         guard let new = editorStore.createBookmark() else {
62             
63             return Logger.shared.log("BookmarkManager: Can not insert BookMarkItem", value: nil)
64         }
65         
66         new.identifier = String(format: "B%@", arguments: [NSDate()])
67         new.order = maxOrder + 100
68         
69         DispatchQueue.main.asyncAfter(deadline: .now()) {
70             
71             self.editorStore.save(errorHandler: self.editorStore.presentOnMainThread)
72         }
73         
74         return new
75     }
76     
77     func menuNeedsUpdate(_ menu: NSMenu) {
78         
79         buildBookmarkMenu()
80     }
81     
82     private func buildBookmarkMenu() {
83         
84         bookmarkMenu
85             .items
86             .filter { $0.tag == BookmarkMenuTag.bookmarkItem.rawValue }
87             .forEach(bookmarkMenu.removeItem)
88         
89         bookmarks.forEach {
90             
91             let item = NSMenuItem(title: $0.name,
92                                   action: #selector(ExternalBrowserWindowController.selectBookmark(_:)),
93                                   keyEquivalent: "")
94             item.representedObject = $0
95             item.tag = BookmarkMenuTag.bookmarkItem.rawValue
96             bookmarkMenu.addItem(item)
97         }
98     }
99 }