2 // BookmarkManager.swift
5 // Created by Hori,Masaki on 2017/01/22.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
11 private enum BookmarkMenuTag: Int {
16 case bookmarkItem = 999999
19 final class BookmarkManager: NSObject, NSMenuDelegate {
21 static let shared = BookmarkManager()
23 private override init() {
27 bookmarksController.managedObjectContext = self.manageObjectContext
28 bookmarksController.entityName = Bookmark.entityName
29 let sort = NSSortDescriptor(key: #keyPath(Bookmark.order), ascending: true)
30 bookmarksController.sortDescriptors = [sort]
32 let mainMenu = NSApplication.shared.mainMenu
33 let bItem = mainMenu?.item(withTag: BookmarkMenuTag.bookmark.rawValue)
34 bookmarkMenu = bItem?.submenu
35 bookmarkMenu?.delegate = self
39 let editorStore: BookmarkDataStore = BookmarkDataStore.oneTimeEditor()
40 let manageObjectContext = BookmarkDataStore.default.context
41 private let bookmarksController = NSArrayController()
43 private var bookmarkMenu: NSMenu!
45 var bookmarks: [Bookmark] {
47 bookmarksController.fetch(nil)
49 guard let items = bookmarksController.arrangedObjects as? [Bookmark] else { return [] }
54 func createNewBookmark() -> Bookmark? {
56 guard let maxOrder = bookmarksController.value(forKeyPath: "arrangedObjects.@max.order") as? Int else {
58 return Logger.shared.log("BookmarkManager: Can no convert max order to Int", value: nil)
61 guard let new = editorStore.createBookmark() else {
63 return Logger.shared.log("BookmarkManager: Can not insert BookMarkItem", value: nil)
66 new.identifier = String(format: "B%@", arguments: [NSDate()])
67 new.order = maxOrder + 100
69 DispatchQueue.main.asyncAfter(deadline: .now()) {
71 self.editorStore.save(errorHandler: self.editorStore.presentOnMainThread)
77 func menuNeedsUpdate(_ menu: NSMenu) {
82 private func buildBookmarkMenu() {
86 .filter { $0.tag == BookmarkMenuTag.bookmarkItem.rawValue }
87 .forEach(bookmarkMenu.removeItem)
91 let item = NSMenuItem(title: $0.name,
92 action: #selector(ExternalBrowserWindowController.selectBookmark(_:)),
94 item.representedObject = $0
95 item.tag = BookmarkMenuTag.bookmarkItem.rawValue
96 bookmarkMenu.addItem(item)