2 // HistoryWindowController.swift
5 // Created by Hori,Masaki on 2016/12/20.
6 // Copyright © 2016年 Hori,Masaki. All rights reserved.
11 fileprivate protocol Markable {
12 var marked: Bool { get set }
14 extension DropShipHistory: Markable {
17 set { mark = newValue }
20 extension KenzoHistory: Markable {
23 set { mark = newValue }
26 extension KaihatuHistory: Markable {
29 set { mark = newValue }
33 fileprivate extension Selector {
34 static let addMark = #selector(HistoryWindowController.addMark(_:))
37 class HistoryWindowController: NSWindowController {
38 fileprivate enum HistoryWindowTabIndex: Int {
39 case kaihatuHistory = 0
44 fileprivate struct SelectionInfo {
45 let controller: NSArrayController
46 let predicateFormat: String
47 let tableView: NSTableView
49 let pickUpPredicateFormat: String
51 init(_ owner: HistoryWindowController) {
52 switch owner.swiftSelectedTabIndex {
54 controller = owner.kaihatuHistoryController
55 predicateFormat = "name contains $value"
56 tableView = owner.kaihatuHistoryTableView
57 entity = .kaihatuHistory
58 pickUpPredicateFormat = "date = %@ AND name = %@"
60 controller = owner.kenzoHistoryController
61 predicateFormat = "name contains $value"
62 tableView = owner.kenzoHistoryTableView
63 entity = .kenzoHistory
64 pickUpPredicateFormat = "date = %@ AND name = %@"
66 controller = owner.dropHistoryController
67 predicateFormat = "shipName contains $value"
68 tableView = owner.dropHistoryTableView
69 entity = .dropShipHistory
70 pickUpPredicateFormat = "date = %@ AND mapCell = %ld"
75 let manageObjectContext = LocalDataStore.default.managedObjectContext
77 @IBOutlet var kaihatuHistoryController: NSArrayController!
78 @IBOutlet var kenzoHistoryController: NSArrayController!
79 @IBOutlet var dropHistoryController: NSArrayController!
81 @IBOutlet var kaihatuHistoryTableView: NSTableView!
82 @IBOutlet var kenzoHistoryTableView: NSTableView!
83 @IBOutlet var dropHistoryTableView: NSTableView!
85 @IBOutlet var searchField: NSSearchField!
87 var selectedTabIndex: Int = 0 {
89 HistoryWindowTabIndex(rawValue: selectedTabIndex)
90 .map { swiftSelectedTabIndex = $0 }
93 fileprivate var swiftSelectedTabIndex: HistoryWindowTabIndex = .kaihatuHistory
94 override var windowNibName: String! {
95 return "HistoryWindowController"
98 override func windowDidLoad() {
101 let info = SelectionInfo(self)
103 searchField.bind(NSPredicateBinding,
105 withKeyPath: NSFilterPredicateBinding,
106 options: [NSPredicateFormatBindingOption: info.predicateFormat])
109 @IBAction func delete(_ sender: AnyObject?) {
110 let store = LocalDataStore.oneTimeEditor()
114 .flatMap { $0 as? [NSManagedObject] }
117 .map { store.object(with: $0) }
118 .forEach { store.delete($0) }
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
127 let clickedObject = items[clickedRow]
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])
144 guard let predicate = p else { return }
146 let store = LocalDataStore.oneTimeEditor()
147 if let a = try? store.objects(with: info.entity,
148 predicate: predicate),
150 var history = item as? Markable {
151 history.marked = !history.marked
153 store.saveActionCore()
156 override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
157 if menuItem.action == .addMark {
158 menuItem.isEnabled = false
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 }
167 menuItem.isEnabled = true
168 if clickedObject.marked {
169 menuItem.title = NSLocalizedString("Remove mark", comment: "Remove history mark.")
171 menuItem.title = NSLocalizedString("Add mark", comment: "Add history mark.")
180 @available(OSX 10.12.2, *)
181 fileprivate var objectForTouchBar:[Int: NSTouchBar] = [:]
182 fileprivate var object1ForTouchBar:[Int: NSButton] = [:]
184 @available(OSX 10.12.2, *)
185 extension HistoryWindowController {
186 @IBOutlet var myTouchBar: NSTouchBar? {
188 return objectForTouchBar[hashValue]
191 objectForTouchBar[hashValue] = newValue
194 @IBOutlet var searchButton: NSButton? {
196 return object1ForTouchBar[hashValue]
199 object1ForTouchBar[hashValue] = newValue
203 override var touchBar: NSTouchBar? {
205 if let _ = myTouchBar {
208 var topLevel: NSArray = []
209 Bundle.main.loadNibNamed("HistoryWindowTouchBar",
211 topLevelObjects: &topLevel)
217 @IBAction func selectSearchField(_ sender: AnyObject?) {
218 window!.makeFirstResponder(searchField!)
222 extension HistoryWindowController: NSTableViewDelegate {
223 func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
224 return tableView.make(withIdentifier: tableColumn!.identifier, owner: nil)
228 extension HistoryWindowController: NSTabViewDelegate {
229 func tabView(_ tabView: NSTabView, didSelect tabViewItem: NSTabViewItem?) {
230 searchField.unbind(NSPredicateBinding)
232 let info = SelectionInfo(self)
234 searchField.bind(NSPredicateBinding,
236 withKeyPath: NSFilterPredicateBinding,
237 options: [NSPredicateFormatBindingOption: info.predicateFormat])