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 extension NSPasteboard.PasteboardType {
18 static let bookmarkItem = NSPasteboard.PasteboardType("com.masakih.KCD.BookmarkItem")
21 final class BookmarkListViewController: NSViewController {
23 @objc let managedObjectContext = BookmarkManager.shared.manageObjectContext
25 @IBOutlet private var tableView: NSTableView!
26 @IBOutlet private var bookmarkController: NSArrayController!
27 @IBOutlet private var contextMenu: NSMenu!
28 @IBOutlet private var popover: NSPopover!
30 weak var delegate: BookmarkListViewControllerDelegate?
31 var editorController: BookmarkEditorViewController?
34 var draggingRange: CountableClosedRange = 0...0
36 override var nibName: NSNib.Name {
38 return .nibName(instanceOf: self)
41 override func viewDidLoad() {
45 editorController = BookmarkEditorViewController()
46 popover.contentViewController = editorController
48 tableView.registerForDraggedTypes([.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] else {
60 guard case 0..<bookmarks.count = clickedRow else {
65 editorController?.representedObject = bookmarks[clickedRow]
66 popover.show(relativeTo: tableView.rect(ofRow: clickedRow), of: tableView, preferredEdge: .minY)
69 @IBAction func deleteBookmark(_ sender: AnyObject?) {
71 let clickedRow = tableView.clickedRow
73 guard let bookmarks = bookmarkController.arrangedObjects as? [Any] else {
77 guard case 0..<bookmarks.count = clickedRow else {
82 bookmarkController.remove(atArrangedObjectIndex: clickedRow)
86 extension BookmarkListViewController: NSTableViewDelegate, NSTableViewDataSource {
88 func reorderingBoolmarks() {
90 guard let objects = bookmarkController.arrangedObjects as? [Bookmark] else {
103 func tableViewSelectionDidChange(_ notification: Notification) {
105 guard let tableView = notification.object as? NSTableView else {
109 guard let bookmarks = bookmarkController.arrangedObjects as? [Bookmark] else {
114 let selection = tableView.selectedRow
115 tableView.deselectAll(nil)
117 guard case 0..<bookmarks.count = selection else {
122 delegate?.didSelectBookmark(bookmarks[selection])
125 func tableView(_ tableView: NSTableView, pasteboardWriterForRow row: Int) -> NSPasteboardWriting? {
127 guard let objects = bookmarkController.arrangedObjects as? [NSPasteboardWriting] else {
135 func tableView(_ tableView: NSTableView, draggingSession session: NSDraggingSession, willBeginAt screenPoint: NSPoint, forRowIndexes rowIndexes: IndexSet) {
137 guard let first = rowIndexes.first else {
141 guard let last = rowIndexes.last else {
146 draggingRange = first...last
149 func tableView(_ tableView: NSTableView, draggingSession session: NSDraggingSession, endedAt screenPoint: NSPoint, operation: NSDragOperation) {
151 draggingRange = 0...0
154 func tableView(_ tableView: NSTableView,
155 validateDrop info: NSDraggingInfo,
156 proposedRow row: Int,
157 proposedDropOperation dropOperation: NSTableView.DropOperation) -> NSDragOperation {
159 guard dropOperation == .above else {
163 guard !(draggingRange ~= row) else {
167 guard let tableView = info.draggingSource() as? NSTableView, tableView == self.tableView else {
175 func tableView(_ tableView: NSTableView, acceptDrop info: NSDraggingInfo, row: Int, dropOperation: NSTableView.DropOperation) -> Bool {
177 tableView.beginUpdates()
178 defer { tableView.endUpdates() }
180 let targetOrder: Int = {
182 guard let objects = bookmarkController.arrangedObjects as? [Any],
183 case 1...objects.count = row,
184 let target = objects[row - 1] as? Bookmark else {
192 guard let items = info.draggingPasteboard().pasteboardItems else {
197 let store = BookmarkManager.shared.editorStore
200 items.enumerated().forEach {
202 guard let data = $0.element.data(forType: .bookmarkItem) else {
206 guard let uri = NSKeyedUnarchiver.unarchiveObject(with: data) as? URL else {
210 guard let bookmark = store.object(of: Bookmark.self, forURIRepresentation: uri) else {
215 bookmark.order = targetOrder + $0.offset + 1
220 self.bookmarkController.rearrangeObjects()
221 self.reorderingBoolmarks()
222 self.bookmarkController.rearrangeObjects()
225 tableView.reloadData()