OSDN Git Service

プロパティ名を変更
[kcd/KCD.git] / KCD / HistoryWindowController.swift
1 //
2 //  HistoryWindowController.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2016/12/20.
6 //  Copyright © 2016年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 fileprivate protocol Markable {
12     var marked: Bool { get set }
13 }
14 extension DropShipHistory: Markable {
15     var marked: Bool {
16         get { return mark }
17         set { mark = newValue }
18     }
19 }
20 extension KenzoHistory: Markable {
21     var marked: Bool {
22         get { return mark }
23         set { mark = newValue }
24     }
25 }
26 extension KaihatuHistory: Markable {
27     var marked: Bool {
28         get { return mark }
29         set { mark = newValue }
30     }
31 }
32
33 fileprivate extension Selector {
34     static let addMark = #selector(HistoryWindowController.addMark(_:))
35 }
36
37 class HistoryWindowController: NSWindowController {
38     fileprivate enum HistoryWindowTabIndex: Int {
39         case kaihatuHistory = 0
40         case kenzoHistory = 1
41         case dropHistory = 2
42     }
43     
44     fileprivate struct SelectionInfo {
45         let controller: NSArrayController
46         let predicateFormat: String
47         let tableView: NSTableView
48         let entity: Entity
49         let pickUpPredicateFormat: String
50         
51         init(_ owner: HistoryWindowController) {
52             switch owner.swiftSelectedTabIndex {
53             case .kaihatuHistory:
54                 controller = owner.kaihatuHistoryController
55                 predicateFormat = "name contains $value"
56                 tableView = owner.kaihatuHistoryTableView
57                 entity = .kaihatuHistory
58                 pickUpPredicateFormat = "date = %@ AND name = %@"
59             case .kenzoHistory:
60                 controller = owner.kenzoHistoryController
61                 predicateFormat = "name contains $value"
62                 tableView = owner.kenzoHistoryTableView
63                 entity = .kenzoHistory
64                 pickUpPredicateFormat = "date = %@ AND name = %@"
65             case .dropHistory:
66                 controller = owner.dropHistoryController
67                 predicateFormat = "shipName contains $value"
68                 tableView = owner.dropHistoryTableView
69                 entity = .dropShipHistory
70                 pickUpPredicateFormat = "date = %@ AND mapCell = %ld"
71             }
72         }
73     }
74     
75     let manageObjectContext = LocalDataStore.default.managedObjectContext
76     
77     @IBOutlet var kaihatuHistoryController: NSArrayController!
78     @IBOutlet var kenzoHistoryController: NSArrayController!
79     @IBOutlet var dropHistoryController: NSArrayController!
80     
81     @IBOutlet var kaihatuHistoryTableView: NSTableView!
82     @IBOutlet var kenzoHistoryTableView: NSTableView!
83     @IBOutlet var dropHistoryTableView: NSTableView!
84     
85     @IBOutlet var searchField: NSSearchField!
86     
87     var selectedTabIndex: Int = 0 {
88         didSet {
89             HistoryWindowTabIndex(rawValue: selectedTabIndex)
90                 .map { swiftSelectedTabIndex = $0 }
91         }
92     }
93     fileprivate var swiftSelectedTabIndex: HistoryWindowTabIndex = .kaihatuHistory
94     override var windowNibName: String! {
95         return "HistoryWindowController"
96     }
97     
98     override func windowDidLoad() {
99         super.windowDidLoad()
100         
101         let info = SelectionInfo(self)
102         
103         searchField.bind(NSPredicateBinding,
104                          to: info.controller,
105                          withKeyPath: NSFilterPredicateBinding,
106                          options: [NSPredicateFormatBindingOption: info.predicateFormat])
107     }
108     
109     @IBAction func delete(_ sender: AnyObject?) {
110         let store = LocalDataStore.oneTimeEditor()
111         SelectionInfo(self)
112             .controller
113             .selectedObjects
114             .flatMap { $0 as? [NSManagedObject] }
115             .flatMap { $0 }
116             .map { $0.objectID }
117             .map { store.object(with: $0) }
118             .forEach { store.delete($0) }
119     }
120     
121     @IBAction func addMark(_ sender: AnyObject?) {
122         let info = SelectionInfo(self)
123         let clickedRow = info.tableView.clickedRow
124         guard let items = info.controller.arrangedObjects as? [Any],
125             0..<items.count ~= clickedRow
126             else { return }
127         let clickedObject = items[clickedRow]
128         
129         let p: NSPredicate? = {
130             switch clickedObject {
131             case let obj as KaihatuHistory:
132                 return NSPredicate(format: info.pickUpPredicateFormat,
133                                    argumentArray: [obj.date, obj.name])
134             case let obj as KenzoHistory:
135                 return NSPredicate(format: info.pickUpPredicateFormat,
136                                    argumentArray: [obj.date, obj.name])
137             case let obj as DropShipHistory:
138                 return NSPredicate(format: info.pickUpPredicateFormat,
139                                    argumentArray: [obj.date, obj.mapCell])
140             default:
141                 return nil
142             }
143         }()
144         guard let predicate = p else { return }
145         
146         let store = LocalDataStore.oneTimeEditor()
147         if let a = try? store.objects(with: info.entity,
148                              predicate: predicate),
149             let item = a.first,
150             var history = item as? Markable {
151             history.marked = !history.marked
152         }
153         store.saveActionCore()
154     }
155     
156     override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
157         if menuItem.action == .addMark {
158             menuItem.isEnabled = false
159             
160             let info = SelectionInfo(self)
161             let clickedRow = info.tableView.clickedRow
162             guard let items = info.controller.arrangedObjects as? [Any],
163                 0..<items.count ~= clickedRow,
164                 let clickedObject = items[clickedRow] as? Markable
165                 else { return false }
166             
167             menuItem.isEnabled = true
168             if clickedObject.marked {
169                 menuItem.title = NSLocalizedString("Remove mark", comment: "Remove history mark.")
170             } else {
171                 menuItem.title = NSLocalizedString("Add mark", comment: "Add history mark.")
172             }
173             return true
174         }
175         
176         return false
177     }
178 }
179
180 @available(OSX 10.12.2, *)
181 fileprivate var objectForTouchBar:[Int: NSTouchBar] = [:]
182 fileprivate var object1ForTouchBar:[Int: NSButton] = [:]
183
184 @available(OSX 10.12.2, *)
185 extension HistoryWindowController {
186     @IBOutlet var myTouchBar: NSTouchBar? {
187         get {
188             return objectForTouchBar[hashValue]
189         }
190         set {
191             objectForTouchBar[hashValue] = newValue
192         }
193     }
194     @IBOutlet var searchButton: NSButton? {
195         get {
196             return object1ForTouchBar[hashValue]
197         }
198         set {
199             object1ForTouchBar[hashValue] = newValue
200         }
201     }
202     
203     override var touchBar: NSTouchBar? {
204         get {
205             if let _ = myTouchBar {
206                 return myTouchBar
207             }
208             var topLevel: NSArray = []
209             Bundle.main.loadNibNamed("HistoryWindowTouchBar",
210                                      owner: self,
211                                      topLevelObjects: &topLevel)
212             return myTouchBar
213         }
214         set {}
215     }
216     
217     @IBAction func selectSearchField(_ sender: AnyObject?) {
218         window!.makeFirstResponder(searchField!)
219     }
220 }
221
222 extension HistoryWindowController: NSTableViewDelegate {
223     func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
224         return tableView.make(withIdentifier: tableColumn!.identifier, owner: nil)
225     }
226 }
227
228 extension HistoryWindowController: NSTabViewDelegate {
229     func tabView(_ tabView: NSTabView, didSelect tabViewItem: NSTabViewItem?) {
230         searchField.unbind(NSPredicateBinding)
231         
232         let info = SelectionInfo(self)
233         
234         searchField.bind(NSPredicateBinding,
235                          to: info.controller,
236                          withKeyPath: NSFilterPredicateBinding,
237                          options: [NSPredicateFormatBindingOption: info.predicateFormat])
238     }
239 }