import Cocoa
protocol BookmarkListViewControllerDelegate: class {
+
func didSelectBookmark(_ bookmark: Bookmark)
}
-fileprivate struct DragingType {
- static let bookmarkItem = "com.masakih.KCD.BookmarkItem"
+extension NSPasteboard.PasteboardType {
+
+ static let bookmarkItem = NSPasteboard.PasteboardType("com.masakih.KCD.BookmarkItem")
}
-class BookmarkListViewController: NSViewController {
- let managedObjectContext = BookmarkManager.shared().manageObjectContext
+final class BookmarkListViewController: NSViewController {
+
+ @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! {
- return "BookmarkListViewController"
+ override var nibName: NSNib.Name {
+
+ return .nibName(instanceOf: self)
}
override func viewDidLoad() {
+
super.viewDidLoad()
editorController = BookmarkEditorViewController()
popover.contentViewController = editorController
- tableView.register(forDraggedTypes: [DragingType.bookmarkItem])
+ tableView.registerForDraggedTypes([.bookmarkItem])
tableView.setDraggingSourceOperationMask(.move, forLocal: true)
}
@IBAction func editBookmark(_ sender: AnyObject?) {
+
let clickedRow = tableView.clickedRow
- guard let bookmarks = bookmarkController.arrangedObjects as? [Any],
- 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)
}
+
@IBAction func deleteBookmark(_ sender: AnyObject?) {
+
let clickedRow = tableView.clickedRow
- guard let bookmarks = bookmarkController.arrangedObjects as? [Any],
- 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)
}
}
extension BookmarkListViewController: NSTableViewDelegate, NSTableViewDataSource {
+
func reorderingBoolmarks() {
+
guard let objects = bookmarkController.arrangedObjects as? [Bookmark] else { return }
+
var order = 100
objects.forEach {
$0.order = order
}
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 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 }
- objectRange = first...last
+
+ guard let first = rowIndexes.first else { return }
+ guard let last = rowIndexes.last else { return }
+
+ 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 {
- guard dropOperation == .above,
- !(objectRange ~= row),
- let tableView = info.draggingSource() as? NSTableView,
- tableView == self.tableView
- else { return [] }
+
+ func tableView(_ tableView: NSTableView,
+ validateDrop info: NSDraggingInfo,
+ proposedRow row: Int,
+ proposedDropOperation dropOperation: NSTableView.DropOperation) -> NSDragOperation {
+
+ 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() }
let targetOrder: Int = {
+
guard let objects = bookmarkController.arrangedObjects as? [Any],
- 1...objects.count ~= row,
- let target = objects[row - 1] as? Bookmark
- else { return 0 }
+ case 1...objects.count = row,
+ let target = objects[row - 1] as? Bookmark else {
+
+ return 0
+ }
+
return target.order
}()
- guard let items = info.draggingPasteboard().pasteboardItems
- else { return false }
- let store = BookmarkManager.shared().editorStore
- items.enumerated().forEach {
- 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 }
- bookmark.order = targetOrder + $0.offset + 1
+
+ guard let items = info.draggingPasteboard().pasteboardItems else { return false }
+
+ 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
+ }
+
+ store.save()
+
+ self.bookmarkController.rearrangeObjects()
+ self.reorderingBoolmarks()
+ self.bookmarkController.rearrangeObjects()
}
- store.saveActionCore()
- bookmarkController.rearrangeObjects()
- reorderingBoolmarks()
- bookmarkController.rearrangeObjects()
+
+ tableView.reloadData()
return true
}