OSDN Git Service

staticプロパティをインスタンスプロパティに変更
[kcd/KCD.git] / KCD / BookmarkManager.swift
index 319b83c..e32d546 100644 (file)
@@ -13,24 +13,16 @@ private enum BookmarkMenuTag: Int {
     case bookmark = 5000
     
     case separator = 9999
+    
     case bookmarkItem = 999999
 }
 
 final class BookmarkManager: NSObject, NSMenuDelegate {
     
-    private static let sharedInstance: BookmarkManager = BookmarkManager()
-    
-    class func shared() -> BookmarkManager {
-        
-        return sharedInstance
-    }
-    
-    private let bookmarksController: NSArrayController
+    static let shared = BookmarkManager()
     
     private override init() {
         
-        bookmarksController = NSArrayController()
-        
         super.init()
         
         bookmarksController.managedObjectContext = self.manageObjectContext
@@ -45,42 +37,58 @@ final class BookmarkManager: NSObject, NSMenuDelegate {
         buildBookmarkMenu()
     }
     
-    private(set) var editorStore: BookmarkDataStore = BookmarkDataStore.oneTimeEditor()
+    let editorStore: BookmarkDataStore = BookmarkDataStore.oneTimeEditor()
+    let manageObjectContext = BookmarkDataStore.default.context
+    private let bookmarksController = NSArrayController()
+    
     private var bookmarkMenu: NSMenu!
-    var manageObjectContext = BookmarkDataStore.default.context
     
     var bookmarks: [Bookmark] {
         
         bookmarksController.fetch(nil)
         
-        guard let items = bookmarksController.arrangedObjects as? [Bookmark] else { return [] }
+        guard let items = bookmarksController.arrangedObjects as? [Bookmark] else {
+            
+            return []
+        }
         
         return items
     }
     
-    func createNewBookmark() -> Bookmark? {
+    func createNewBookmark(configurator: @escaping (Bookmark) -> Bool) -> Bookmark? {
         
         guard let maxOrder = bookmarksController.value(forKeyPath: "arrangedObjects.@max.order") as? Int else {
             
-            print("BookmarkManager: Can no convert max order to Int")
+            Logger.shared.log("BookmarkManager: Can no convert max order to Int")
+            
             return nil
         }
         
-        guard let new = editorStore.createBookmark() else {
+        let editorStore: BookmarkDataStore = BookmarkDataStore.oneTimeEditor()
+        
+        guard let new = editorStore.sync(execute: { editorStore.createBookmark() }) else {
+            
+            Logger.shared.log("BookmarkManager: Can not insert BookMarkItem")
             
-            print("BookmarkManager: Can not insert BookMarkItem")
             return nil
         }
         
-        new.identifier = String(format: "B%@", arguments: [NSDate()])
-        new.order = maxOrder + 100
-        
-        DispatchQueue.main.asyncAfter(deadline: .now()) {
+        return editorStore.sync {
             
-            self.editorStore.save()
+            new.identifier = String(format: "B%@", arguments: [NSDate()])
+            new.order = maxOrder + 100
+            
+            if !configurator(new) {
+                
+                editorStore.delete(new)
+                
+                return nil
+            }
+            
+            editorStore.save()
+            
+            return new
         }
-        
-        return new
     }
     
     func menuNeedsUpdate(_ menu: NSMenu) {