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 {
17 case bookmarkItem = 999999
20 final class BookmarkManager: NSObject, NSMenuDelegate {
22 static let shared = BookmarkManager()
24 private override init() {
28 bookmarksController.managedObjectContext = self.manageObjectContext
29 bookmarksController.entityName = Bookmark.entityName
30 let sort = NSSortDescriptor(key: #keyPath(Bookmark.order), ascending: true)
31 bookmarksController.sortDescriptors = [sort]
33 let mainMenu = NSApplication.shared.mainMenu
34 let bItem = mainMenu?.item(withTag: BookmarkMenuTag.bookmark.rawValue)
35 bookmarkMenu = bItem?.submenu
36 bookmarkMenu?.delegate = self
40 let editorStore: BookmarkDataStore = BookmarkDataStore.oneTimeEditor()
41 let manageObjectContext = BookmarkDataStore.default.context
42 private let bookmarksController = NSArrayController()
44 private var bookmarkMenu: NSMenu!
46 var bookmarks: [Bookmark] {
48 bookmarksController.fetch(nil)
50 guard let items = bookmarksController.arrangedObjects as? [Bookmark] else {
58 func createNewBookmark(configurator: @escaping (Bookmark) -> Bool) -> Bookmark? {
60 guard let maxOrder = bookmarksController.value(forKeyPath: "arrangedObjects.@max.order") as? Int else {
62 Logger.shared.log("BookmarkManager: Can no convert max order to Int")
67 let editorStore: BookmarkDataStore = BookmarkDataStore.oneTimeEditor()
69 guard let new = editorStore.sync(execute: { editorStore.createBookmark() }) else {
71 Logger.shared.log("BookmarkManager: Can not insert BookMarkItem")
76 return editorStore.sync {
78 new.identifier = String(format: "B%@", arguments: [NSDate()])
79 new.order = maxOrder + 100
81 if !configurator(new) {
83 editorStore.delete(new)
94 func menuNeedsUpdate(_ menu: NSMenu) {
99 private func buildBookmarkMenu() {
103 .filter { $0.tag == BookmarkMenuTag.bookmarkItem.rawValue }
104 .forEach(bookmarkMenu.removeItem)
108 let item = NSMenuItem(title: $0.name,
109 action: #selector(ExternalBrowserWindowController.selectBookmark(_:)),
111 item.representedObject = $0
112 item.tag = BookmarkMenuTag.bookmarkItem.rawValue
113 bookmarkMenu.addItem(item)