OSDN Git Service

コード整形
[kcd/KCD.git] / KCD / BookmarkListViewController.swift
1 //
2 //  BookmarkListViewController.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2016/12/23.
6 //  Copyright © 2016年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 protocol BookmarkListViewControllerDelegate: class {
12     
13     func didSelectBookmark(_ bookmark: Bookmark)
14 }
15
16 fileprivate struct DragingType {
17     
18     static let bookmarkItem = "com.masakih.KCD.BookmarkItem"
19 }
20
21 final class BookmarkListViewController: NSViewController {
22     
23     let managedObjectContext = BookmarkManager.shared().manageObjectContext
24     
25     @IBOutlet var tableView: NSTableView!
26     @IBOutlet var bookmarkController: NSArrayController!
27     @IBOutlet var contextMenu: NSMenu!
28     @IBOutlet var popover: NSPopover!
29     
30     weak var delegate: BookmarkListViewControllerDelegate?
31     var editorController: BookmarkEditorViewController?
32     
33     // tableView support
34     var objectRange: CountableClosedRange = 0...0
35     
36     override var nibName: String! {
37         
38         return "BookmarkListViewController"
39     }
40     
41     override func viewDidLoad() {
42         
43         super.viewDidLoad()
44         
45         editorController = BookmarkEditorViewController()
46         popover.contentViewController = editorController
47         
48         tableView.register(forDraggedTypes: [DragingType.bookmarkItem])
49         tableView.setDraggingSourceOperationMask(.move, forLocal: true)
50     }
51     
52     @IBAction func editBookmark(_ sender: AnyObject?) {
53         
54         let clickedRow = tableView.clickedRow
55         
56         guard let bookmarks = bookmarkController.arrangedObjects as? [Any],
57             case 0..<bookmarks.count = clickedRow
58             else { return }
59         
60         editorController?.representedObject = bookmarks[clickedRow]
61         popover.show(relativeTo: tableView.rect(ofRow: clickedRow), of: tableView, preferredEdge: .minY)
62     }
63     
64     @IBAction func deleteBookmark(_ sender: AnyObject?) {
65         
66         let clickedRow = tableView.clickedRow
67         
68         guard let bookmarks = bookmarkController.arrangedObjects as? [Any],
69             case 0..<bookmarks.count = clickedRow
70             else { return }
71         
72         bookmarkController.remove(atArrangedObjectIndex: clickedRow)
73     }
74 }
75
76 extension BookmarkListViewController: NSTableViewDelegate, NSTableViewDataSource {
77     
78     func reorderingBoolmarks() {
79         
80         guard let objects = bookmarkController.arrangedObjects as? [Bookmark]
81             else { return }
82         
83         var order = 100
84         objects.forEach {
85             $0.order = order
86             order += 100
87         }
88     }
89     
90     func tableViewSelectionDidChange(_ notification: Notification) {
91         
92         guard let tableView = notification.object as? NSTableView,
93             let bookmarks = bookmarkController.arrangedObjects as? [Bookmark]
94             else { return }
95         
96         let selection = tableView.selectedRow
97         tableView.deselectAll(nil)
98         
99         guard case 0..<bookmarks.count = selection
100             else { return }
101         
102         delegate?.didSelectBookmark(bookmarks[selection])
103     }
104     
105     func tableView(_ tableView: NSTableView, pasteboardWriterForRow row: Int) -> NSPasteboardWriting? {
106         
107         guard let objects = bookmarkController.arrangedObjects as? [NSPasteboardWriting]
108             else { return nil }
109         
110         return objects[row]
111     }
112     
113     func tableView(_ tableView: NSTableView, draggingSession session: NSDraggingSession, willBeginAt screenPoint: NSPoint, forRowIndexes rowIndexes: IndexSet) {
114         
115         guard let first = rowIndexes.first,
116             let last = rowIndexes.last
117             else { return }
118         
119         objectRange = first...last
120     }
121     
122     func tableView(_ tableView: NSTableView, draggingSession session: NSDraggingSession, endedAt screenPoint: NSPoint, operation: NSDragOperation) {
123         
124         objectRange = 0...0
125     }
126     
127     func tableView(_ tableView: NSTableView,
128                    validateDrop info: NSDraggingInfo,
129                    proposedRow row: Int,
130                    proposedDropOperation dropOperation: NSTableViewDropOperation) -> NSDragOperation {
131         
132         guard dropOperation == .above,
133             !(objectRange ~= row),
134             let tableView = info.draggingSource() as? NSTableView,
135             tableView == self.tableView
136             else { return [] }
137         
138         return .move
139     }
140     
141     func tableView(_ tableView: NSTableView, acceptDrop info: NSDraggingInfo, row: Int, dropOperation: NSTableViewDropOperation) -> Bool {
142         
143         tableView.beginUpdates()
144         defer { tableView.endUpdates() }
145         
146         let targetOrder: Int = {
147             
148             guard let objects = bookmarkController.arrangedObjects as? [Any],
149                 case 1...objects.count = row,
150                 let target = objects[row - 1] as? Bookmark
151                 else { return 0 }
152             
153             return target.order
154         }()
155         
156         guard let items = info.draggingPasteboard().pasteboardItems
157             else { return false }
158         
159         let store = BookmarkManager.shared().editorStore
160         items.enumerated().forEach {
161             
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
166                 else { return }
167             
168             bookmark.order = targetOrder + $0.offset + 1
169         }
170         
171         store.save()
172         bookmarkController.rearrangeObjects()
173         reorderingBoolmarks()
174         bookmarkController.rearrangeObjects()
175         
176         return true
177     }
178 }