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 class BookmarkManager: NSObject, NSMenuDelegate {
17 private static let sharedInstance: BookmarkManager = BookmarkManager()
19 class func shared() -> BookmarkManager {
23 private let bookmarksController: NSArrayController
25 private override init() {
26 bookmarksController = NSArrayController()
28 bookmarksController.managedObjectContext = self.manageObjectContext
29 bookmarksController.entityName = Bookmark.entityName
30 let sort = NSSortDescriptor(key: "order", ascending: true)
31 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 private(set) var editorStore: BookmarkDataStore = BookmarkDataStore.oneTimeEditor()
40 private var bookmarkMenu: NSMenu!
41 var manageObjectContext = BookmarkDataStore.default.context
42 var bookmarks: [Bookmark] {
43 bookmarksController.fetch(nil)
44 guard let items = bookmarksController.arrangedObjects as? [Bookmark]
49 func createNewBookmark() -> Bookmark? {
50 guard let maxOrder = bookmarksController.value(forKeyPath: "arrangedObjects.@max.order") as? Int
52 print("BookmarkManager: Can no convert max order to Int")
55 guard let new = editorStore.createBookmark()
57 print("BookmarkManager: Can not insert BookMarkItem")
60 new.identifier = String(format: "B%@", arguments: [NSDate()])
61 new.order = maxOrder + 100
63 DispatchQueue.main.asyncAfter(deadline: .now()) {
64 self.editorStore.save()
69 func menuNeedsUpdate(_ menu: NSMenu) {
72 private func buildBookmarkMenu() {
73 for item in bookmarkMenu.items.reversed() {
74 if item.tag == BookmarkMenuTag.separator.rawValue { break }
75 bookmarkMenu.removeItem(item)
79 let item = NSMenuItem(title: $0.name,
80 action: #selector(ExternalBrowserWindowController.selectBookmark(_:)),
82 item.representedObject = $0
83 bookmarkMenu.addItem(item)