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 {
17 final class BookmarkManager: NSObject, NSMenuDelegate {
19 private static let sharedInstance: BookmarkManager = BookmarkManager()
21 class func shared() -> BookmarkManager {
26 private let bookmarksController: NSArrayController
28 private override init() {
30 bookmarksController = NSArrayController()
34 bookmarksController.managedObjectContext = self.manageObjectContext
35 bookmarksController.entityName = Bookmark.entityName
36 let sort = NSSortDescriptor(key: "order", ascending: true)
37 bookmarksController.sortDescriptors = [sort]
39 let mainMenu = NSApplication.shared().mainMenu
40 let bItem = mainMenu?.item(withTag: BookmarkMenuTag.bookmark.rawValue)
41 bookmarkMenu = bItem?.submenu
42 bookmarkMenu?.delegate = self
46 private(set) var editorStore: BookmarkDataStore = BookmarkDataStore.oneTimeEditor()
47 private var bookmarkMenu: NSMenu!
48 var manageObjectContext = BookmarkDataStore.default.context
50 var bookmarks: [Bookmark] {
52 bookmarksController.fetch(nil)
54 guard let items = bookmarksController.arrangedObjects as? [Bookmark]
60 func createNewBookmark() -> Bookmark? {
62 guard let maxOrder = bookmarksController.value(forKeyPath: "arrangedObjects.@max.order") as? Int
64 print("BookmarkManager: Can no convert max order to Int")
68 guard let new = editorStore.createBookmark()
70 print("BookmarkManager: Can not insert BookMarkItem")
74 new.identifier = String(format: "B%@", arguments: [NSDate()])
75 new.order = maxOrder + 100
77 DispatchQueue.main.asyncAfter(deadline: .now()) {
79 self.editorStore.save()
85 func menuNeedsUpdate(_ menu: NSMenu) {
90 private func buildBookmarkMenu() {
92 // TODO: replace to forEach
93 for item in bookmarkMenu.items.reversed() {
95 if item.tag == BookmarkMenuTag.separator.rawValue { break }
96 bookmarkMenu.removeItem(item)
101 let item = NSMenuItem(title: $0.name,
102 action: #selector(ExternalBrowserWindowController.selectBookmark(_:)),
104 item.representedObject = $0
105 bookmarkMenu.addItem(item)