OSDN Git Service

CoreDataエンティティのクラスをエンティティ名と同じにした
[kcd/KCD.git] / KCD / BookmarkManager.swift
1 //
2 //  BookmarkManager.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/01/22.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 fileprivate enum BookmarkMenuTag: Int {
12     case bookmark = 5000
13     case separator = 9999
14 }
15
16 class BookmarkManager: NSObject, NSMenuDelegate {
17     private static let sharedInstance: BookmarkManager = BookmarkManager()
18     
19     class func shared() -> BookmarkManager {
20         return sharedInstance
21     }
22     
23     private let bookmarksController: NSArrayController
24     
25     private override init() {
26         bookmarksController = NSArrayController()
27         super.init()
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
36         buildBookmarkMenu()
37     }
38     
39     private(set) var editorStore: BookmarkDataStore = BookmarkDataStore.oneTimeEditor()
40     private var bookmarkMenu: NSMenu!
41     var manageObjectContext = BookmarkDataStore.default.managedObjectContext
42     var bookmarks: [Bookmark] {
43         bookmarksController.fetch(nil)
44         guard let items = bookmarksController.arrangedObjects as? [Bookmark]
45             else { return [] }
46         return items
47     }
48     
49     func createNewBookmark() -> Bookmark? {
50         guard let maxOrder = bookmarksController.value(forKeyPath: "arrangedObjects.@max.order") as? Int
51             else {
52                 print("BookmarkManager: Can no convert max order to Int")
53                 return nil
54         }
55         guard let new = editorStore.createBookmark()
56             else {
57                 print("BookmarkManager: Can not insert BookMarkItem")
58                 return nil
59         }
60         new.identifier = String(format: "B%@", arguments: [NSDate()])
61         new.order = maxOrder + 100
62         
63         DispatchQueue.main.asyncAfter(deadline: .now()) {
64             self.editorStore.saveActionCore()
65         }
66         
67         return new
68     }
69     func menuNeedsUpdate(_ menu: NSMenu) {
70         buildBookmarkMenu()
71     }
72     private func buildBookmarkMenu() {
73         for item in bookmarkMenu.items.reversed() {
74             if item.tag == BookmarkMenuTag.separator.rawValue { break }
75             bookmarkMenu.removeItem(item)
76         }
77         
78         bookmarks.forEach {
79             let item = NSMenuItem(title: $0.name, action:  #selector(ExternalBrowserWindowController.selectBookmark(_:)), keyEquivalent: "")
80             item.representedObject = $0
81             bookmarkMenu.addItem(item)
82         }
83     }
84 }