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(configurator: @escaping (Bookmark) -> Bool) -> 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 let editorStore: BookmarkDataStore = BookmarkDataStore.oneTimeEditor()
63 guard let new = editorStore.sync(execute: { editorStore.createBookmark() }) else {
65 return Logger.shared.log("BookmarkManager: Can not insert BookMarkItem", value: nil)
68 return editorStore.sync {
70 new.identifier = String(format: "B%@", arguments: [NSDate()])
71 new.order = maxOrder + 100
73 if !configurator(new) {
75 editorStore.delete(new)
86 func menuNeedsUpdate(_ menu: NSMenu) {
91 private func buildBookmarkMenu() {
95 .filter { $0.tag == BookmarkMenuTag.bookmarkItem.rawValue }
96 .forEach(bookmarkMenu.removeItem)
100 let item = NSMenuItem(title: $0.name,
101 action: #selector(ExternalBrowserWindowController.selectBookmark(_:)),
103 item.representedObject = $0
104 item.tag = BookmarkMenuTag.bookmarkItem.rawValue
105 bookmarkMenu.addItem(item)