OSDN Git Service

ApplicationDirecroriesの中のアプリケーションに依存する部分を分離した
[kcd/KCD.git] / KCD / BookmarkListViewController.swift
index 892b878..548b16a 100644 (file)
@@ -13,29 +13,29 @@ protocol BookmarkListViewControllerDelegate: class {
     func didSelectBookmark(_ bookmark: Bookmark)
 }
 
-fileprivate struct DragingType {
+extension NSPasteboard.PasteboardType {
     
-    static let bookmarkItem = "com.masakih.KCD.BookmarkItem"
+    static let bookmarkItem = NSPasteboard.PasteboardType("com.masakih.KCD.BookmarkItem")
 }
 
 final class BookmarkListViewController: NSViewController {
     
-    let managedObjectContext = BookmarkManager.shared().manageObjectContext
+    @objc let managedObjectContext = BookmarkManager.shared.manageObjectContext
     
-    @IBOutlet var tableView: NSTableView!
-    @IBOutlet var bookmarkController: NSArrayController!
-    @IBOutlet var contextMenu: NSMenu!
-    @IBOutlet var popover: NSPopover!
+    @IBOutlet private var tableView: NSTableView!
+    @IBOutlet private var bookmarkController: NSArrayController!
+    @IBOutlet private var contextMenu: NSMenu!
+    @IBOutlet private var popover: NSPopover!
     
     weak var delegate: BookmarkListViewControllerDelegate?
     var editorController: BookmarkEditorViewController?
     
     // tableView support
-    var objectRange: CountableClosedRange = 0...0
+    var draggingRange: CountableClosedRange = 0...0
     
-    override var nibName: String! {
+    override var nibName: NSNib.Name {
         
-        return "BookmarkListViewController"
+        return .nibName(instanceOf: self)
     }
     
     override func viewDidLoad() {
@@ -45,7 +45,7 @@ final class BookmarkListViewController: NSViewController {
         editorController = BookmarkEditorViewController()
         popover.contentViewController = editorController
         
-        tableView.register(forDraggedTypes: [DragingType.bookmarkItem])
+        tableView.registerForDraggedTypes([.bookmarkItem])
         tableView.setDraggingSourceOperationMask(.move, forLocal: true)
     }
     
@@ -53,9 +53,14 @@ final class BookmarkListViewController: NSViewController {
         
         let clickedRow = tableView.clickedRow
         
-        guard let bookmarks = bookmarkController.arrangedObjects as? [Any],
-            case 0..<bookmarks.count = clickedRow
-            else { return }
+        guard let bookmarks = bookmarkController.arrangedObjects as? [Any] else {
+            
+            return
+        }
+        guard case 0..<bookmarks.count = clickedRow else {
+            
+            return
+        }
         
         editorController?.representedObject = bookmarks[clickedRow]
         popover.show(relativeTo: tableView.rect(ofRow: clickedRow), of: tableView, preferredEdge: .minY)
@@ -65,9 +70,14 @@ final class BookmarkListViewController: NSViewController {
         
         let clickedRow = tableView.clickedRow
         
-        guard let bookmarks = bookmarkController.arrangedObjects as? [Any],
-            case 0..<bookmarks.count = clickedRow
-            else { return }
+        guard let bookmarks = bookmarkController.arrangedObjects as? [Any] else {
+            
+            return
+        }
+        guard case 0..<bookmarks.count = clickedRow else {
+            
+            return
+        }
         
         bookmarkController.remove(atArrangedObjectIndex: clickedRow)
     }
@@ -77,11 +87,14 @@ extension BookmarkListViewController: NSTableViewDelegate, NSTableViewDataSource
     
     func reorderingBoolmarks() {
         
-        guard let objects = bookmarkController.arrangedObjects as? [Bookmark]
-            else { return }
+        guard let objects = bookmarkController.arrangedObjects as? [Bookmark] else {
+            
+            return
+        }
         
         var order = 100
         objects.forEach {
+            
             $0.order = order
             order += 100
         }
@@ -89,56 +102,77 @@ extension BookmarkListViewController: NSTableViewDelegate, NSTableViewDataSource
     
     func tableViewSelectionDidChange(_ notification: Notification) {
         
-        guard let tableView = notification.object as? NSTableView,
-            let bookmarks = bookmarkController.arrangedObjects as? [Bookmark]
-            else { return }
+        guard let tableView = notification.object as? NSTableView else {
+            
+            return
+        }
+        guard let bookmarks = bookmarkController.arrangedObjects as? [Bookmark] else {
+            
+            return
+        }
         
         let selection = tableView.selectedRow
         tableView.deselectAll(nil)
         
-        guard case 0..<bookmarks.count = selection
-            else { return }
+        guard case 0..<bookmarks.count = selection else {
+            
+            return
+        }
         
         delegate?.didSelectBookmark(bookmarks[selection])
     }
     
     func tableView(_ tableView: NSTableView, pasteboardWriterForRow row: Int) -> NSPasteboardWriting? {
         
-        guard let objects = bookmarkController.arrangedObjects as? [NSPasteboardWriting]
-            else { return nil }
+        guard let objects = bookmarkController.arrangedObjects as? [NSPasteboardWriting] else {
+            
+            return nil
+        }
         
         return objects[row]
     }
     
     func tableView(_ tableView: NSTableView, draggingSession session: NSDraggingSession, willBeginAt screenPoint: NSPoint, forRowIndexes rowIndexes: IndexSet) {
         
-        guard let first = rowIndexes.first,
-            let last = rowIndexes.last
-            else { return }
+        guard let first = rowIndexes.first else {
+            
+            return
+        }
+        guard let last = rowIndexes.last else {
+            
+            return
+        }
         
-        objectRange = first...last
+        draggingRange = first...last
     }
     
     func tableView(_ tableView: NSTableView, draggingSession session: NSDraggingSession, endedAt screenPoint: NSPoint, operation: NSDragOperation) {
         
-        objectRange = 0...0
+        draggingRange = 0...0
     }
     
     func tableView(_ tableView: NSTableView,
                    validateDrop info: NSDraggingInfo,
                    proposedRow row: Int,
-                   proposedDropOperation dropOperation: NSTableViewDropOperation) -> NSDragOperation {
+                   proposedDropOperation dropOperation: NSTableView.DropOperation) -> NSDragOperation {
         
-        guard dropOperation == .above,
-            !(objectRange ~= row),
-            let tableView = info.draggingSource() as? NSTableView,
-            tableView == self.tableView
-            else { return [] }
+        guard dropOperation == .above else {
+            
+            return []
+        }
+        guard !(draggingRange ~= row) else {
+            
+            return []
+        }
+        guard let tableView = info.draggingSource() as? NSTableView, tableView == self.tableView else {
+            
+            return []
+        }
         
         return .move
     }
     
-    func tableView(_ tableView: NSTableView, acceptDrop info: NSDraggingInfo, row: Int, dropOperation: NSTableViewDropOperation) -> Bool {
+    func tableView(_ tableView: NSTableView, acceptDrop info: NSDraggingInfo, row: Int, dropOperation: NSTableView.DropOperation) -> Bool {
         
         tableView.beginUpdates()
         defer { tableView.endUpdates() }
@@ -147,31 +181,48 @@ extension BookmarkListViewController: NSTableViewDelegate, NSTableViewDataSource
             
             guard let objects = bookmarkController.arrangedObjects as? [Any],
                 case 1...objects.count = row,
-                let target = objects[row - 1] as? Bookmark
-                else { return 0 }
+                let target = objects[row - 1] as? Bookmark else {
+                    
+                    return 0
+            }
             
             return target.order
         }()
         
-        guard let items = info.draggingPasteboard().pasteboardItems
-            else { return false }
+        guard let items = info.draggingPasteboard().pasteboardItems else {
+            
+            return false
+        }
         
-        let store = BookmarkManager.shared().editorStore
-        items.enumerated().forEach {
+        let store = BookmarkManager.shared.editorStore
+        store.sync {
+            
+            items.enumerated().forEach {
+                
+                guard let data = $0.element.data(forType: .bookmarkItem) else {
+                    
+                    return
+                }
+                guard let uri = NSKeyedUnarchiver.unarchiveObject(with: data) as? URL else {
+                    
+                    return
+                }
+                guard let bookmark = store.object(of: Bookmark.entity, forURIRepresentation: uri) else {
+                    
+                    return
+                }
+                
+                bookmark.order = targetOrder + $0.offset + 1
+            }
             
-            guard let data = $0.element.data(forType: DragingType.bookmarkItem),
-                let uri = NSKeyedUnarchiver.unarchiveObject(with: data) as? URL,
-                let oID = managedObjectContext.persistentStoreCoordinator?.managedObjectID(forURIRepresentation: uri),
-                let bookmark = store.object(with: oID) as? Bookmark
-                else { return }
+            store.save()
             
-            bookmark.order = targetOrder + $0.offset + 1
+            self.bookmarkController.rearrangeObjects()
+            self.reorderingBoolmarks()
+            self.bookmarkController.rearrangeObjects()
         }
         
-        store.save()
-        bookmarkController.rearrangeObjects()
-        reorderingBoolmarks()
-        bookmarkController.rearrangeObjects()
+        tableView.reloadData()
         
         return true
     }