2 // BookmarkListViewController.swift
5 // Created by Hori,Masaki on 2016/12/23.
6 // Copyright © 2016年 Hori,Masaki. All rights reserved.
11 protocol BookmarkListViewControllerDelegate: class {
13 func didSelectBookmark(_ bookmark: Bookmark)
16 fileprivate struct DragingType {
18 static let bookmarkItem = "com.masakih.KCD.BookmarkItem"
21 final class BookmarkListViewController: NSViewController {
23 let managedObjectContext = BookmarkManager.shared().manageObjectContext
25 @IBOutlet var tableView: NSTableView!
26 @IBOutlet var bookmarkController: NSArrayController!
27 @IBOutlet var contextMenu: NSMenu!
28 @IBOutlet var popover: NSPopover!
30 weak var delegate: BookmarkListViewControllerDelegate?
31 var editorController: BookmarkEditorViewController?
34 var objectRange: CountableClosedRange = 0...0
36 override var nibName: String! {
38 return "BookmarkListViewController"
41 override func viewDidLoad() {
45 editorController = BookmarkEditorViewController()
46 popover.contentViewController = editorController
48 tableView.register(forDraggedTypes: [DragingType.bookmarkItem])
49 tableView.setDraggingSourceOperationMask(.move, forLocal: true)
52 @IBAction func editBookmark(_ sender: AnyObject?) {
54 let clickedRow = tableView.clickedRow
56 guard let bookmarks = bookmarkController.arrangedObjects as? [Any],
57 case 0..<bookmarks.count = clickedRow
60 editorController?.representedObject = bookmarks[clickedRow]
61 popover.show(relativeTo: tableView.rect(ofRow: clickedRow), of: tableView, preferredEdge: .minY)
64 @IBAction func deleteBookmark(_ sender: AnyObject?) {
66 let clickedRow = tableView.clickedRow
68 guard let bookmarks = bookmarkController.arrangedObjects as? [Any],
69 case 0..<bookmarks.count = clickedRow
72 bookmarkController.remove(atArrangedObjectIndex: clickedRow)
76 extension BookmarkListViewController: NSTableViewDelegate, NSTableViewDataSource {
78 func reorderingBoolmarks() {
80 guard let objects = bookmarkController.arrangedObjects as? [Bookmark]
90 func tableViewSelectionDidChange(_ notification: Notification) {
92 guard let tableView = notification.object as? NSTableView,
93 let bookmarks = bookmarkController.arrangedObjects as? [Bookmark]
96 let selection = tableView.selectedRow
97 tableView.deselectAll(nil)
99 guard case 0..<bookmarks.count = selection
102 delegate?.didSelectBookmark(bookmarks[selection])
105 func tableView(_ tableView: NSTableView, pasteboardWriterForRow row: Int) -> NSPasteboardWriting? {
107 guard let objects = bookmarkController.arrangedObjects as? [NSPasteboardWriting]
113 func tableView(_ tableView: NSTableView, draggingSession session: NSDraggingSession, willBeginAt screenPoint: NSPoint, forRowIndexes rowIndexes: IndexSet) {
115 guard let first = rowIndexes.first,
116 let last = rowIndexes.last
119 objectRange = first...last
122 func tableView(_ tableView: NSTableView, draggingSession session: NSDraggingSession, endedAt screenPoint: NSPoint, operation: NSDragOperation) {
127 func tableView(_ tableView: NSTableView,
128 validateDrop info: NSDraggingInfo,
129 proposedRow row: Int,
130 proposedDropOperation dropOperation: NSTableViewDropOperation) -> NSDragOperation {
132 guard dropOperation == .above,
133 !(objectRange ~= row),
134 let tableView = info.draggingSource() as? NSTableView,
135 tableView == self.tableView
141 func tableView(_ tableView: NSTableView, acceptDrop info: NSDraggingInfo, row: Int, dropOperation: NSTableViewDropOperation) -> Bool {
143 tableView.beginUpdates()
144 defer { tableView.endUpdates() }
146 let targetOrder: Int = {
148 guard let objects = bookmarkController.arrangedObjects as? [Any],
149 case 1...objects.count = row,
150 let target = objects[row - 1] as? Bookmark
156 guard let items = info.draggingPasteboard().pasteboardItems
157 else { return false }
159 let store = BookmarkManager.shared().editorStore
160 items.enumerated().forEach {
162 guard let data = $0.element.data(forType: DragingType.bookmarkItem),
163 let uri = NSKeyedUnarchiver.unarchiveObject(with: data) as? URL,
164 let oID = managedObjectContext.persistentStoreCoordinator?.managedObjectID(forURIRepresentation: uri),
165 let bookmark = store.object(with: oID) as? Bookmark
168 bookmark.order = targetOrder + $0.offset + 1
172 bookmarkController.rearrangeObjects()
173 reorderingBoolmarks()
174 bookmarkController.rearrangeObjects()