2 // BookmarkManager.swift
5 // Created by Hori,Masaki on 2017/01/22.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
11 fileprivate enum BookmarkMenuTag: Int {
16 case bookmarkItem = 999999
19 final class BookmarkManager: NSObject, NSMenuDelegate {
21 private static let sharedInstance: BookmarkManager = BookmarkManager()
23 class func shared() -> BookmarkManager {
28 private let bookmarksController: NSArrayController
30 private override init() {
32 bookmarksController = NSArrayController()
36 bookmarksController.managedObjectContext = self.manageObjectContext
37 bookmarksController.entityName = Bookmark.entityName
38 let sort = NSSortDescriptor(key: "order", ascending: true)
39 bookmarksController.sortDescriptors = [sort]
41 let mainMenu = NSApplication.shared().mainMenu
42 let bItem = mainMenu?.item(withTag: BookmarkMenuTag.bookmark.rawValue)
43 bookmarkMenu = bItem?.submenu
44 bookmarkMenu?.delegate = self
48 private(set) var editorStore: BookmarkDataStore = BookmarkDataStore.oneTimeEditor()
49 private var bookmarkMenu: NSMenu!
50 var manageObjectContext = BookmarkDataStore.default.context
52 var bookmarks: [Bookmark] {
54 bookmarksController.fetch(nil)
56 guard let items = bookmarksController.arrangedObjects as? [Bookmark]
62 func createNewBookmark() -> Bookmark? {
64 guard let maxOrder = bookmarksController.value(forKeyPath: "arrangedObjects.@max.order") as? Int
66 print("BookmarkManager: Can no convert max order to Int")
70 guard let new = editorStore.createBookmark()
72 print("BookmarkManager: Can not insert BookMarkItem")
76 new.identifier = String(format: "B%@", arguments: [NSDate()])
77 new.order = maxOrder + 100
79 DispatchQueue.main.asyncAfter(deadline: .now()) {
81 self.editorStore.save()
87 func menuNeedsUpdate(_ menu: NSMenu) {
92 private func buildBookmarkMenu() {
96 .filter { $0.tag == BookmarkMenuTag.bookmarkItem.rawValue }
97 .forEach(bookmarkMenu.removeItem)
101 let item = NSMenuItem(title: $0.name,
102 action: #selector(ExternalBrowserWindowController.selectBookmark(_:)),
104 item.representedObject = $0
105 item.tag = BookmarkMenuTag.bookmarkItem.rawValue
106 bookmarkMenu.addItem(item)