2 // HistoryTableViewController.swift
5 // Created by Hori,Masaki on 2017/03/10.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
11 private protocol Markable {
13 var mark: Bool { get set }
16 private protocol HistoryObject {
18 var date: Date { get }
21 extension DropShipHistory: Markable, HistoryObject {}
22 extension KenzoHistory: Markable, HistoryObject {}
23 extension KaihatuHistory: Markable, HistoryObject {}
25 enum MenuItemTag: Int {
32 class HistoryTableViewController: NSViewController {
34 // Subbclass MUST override these.
35 var predicateFormat: String { fatalError("Subbclass MUST implement.") }
36 func objects(of predicate: NSPredicate?, in store: LocalDataStore) throws -> [NSManagedObject] {
38 fatalError("Subbclass MUST implement.")
41 @IBOutlet private(set) var controller: NSArrayController!
42 @IBOutlet private(set) var tableView: NSTableView!
44 @IBAction func delete(_ sender: AnyObject?) {
46 let store = LocalDataStore.oneTimeEditor()
48 guard let controller = controller else { return }
49 guard let selection = controller.selectedObjects as? [NSManagedObject] else { return }
51 let selectedIndex = controller.selectionIndex
54 .map(store.object(with:))
55 .forEach(store.delete)
57 if selectedIndex > 1 {
59 controller.setSelectionIndex(selectedIndex - 1)
63 @IBAction func addMark(_ sender: AnyObject?) {
65 guard let clickedRow = tableView?.clickedRow else { return }
66 guard let items = controller?.arrangedObjects as? [HistoryObject] else { return }
67 guard case 0..<items.count = clickedRow else { return }
69 let clickedObject = items[clickedRow]
70 let predicate = NSPredicate(#keyPath(KenzoMark.date), equal: clickedObject.date)
72 let store = LocalDataStore.oneTimeEditor()
74 if let items = try? objects(of: predicate, in: store),
75 var history = items.first as? Markable {
77 history.mark = !history.mark
80 store.save(errorHandler: store.presentOnMainThread)
83 override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
85 guard let itemTag = MenuItemTag(rawValue: menuItem.tag) else { return false }
89 return controller.selectionIndex != -1
92 menuItem.isEnabled = false
93 guard let clickedRow = tableView?.clickedRow else { return false }
94 guard let items = controller?.arrangedObjects as? [Markable] else { return false }
95 guard case 0..<items.count = clickedRow else { return false }
97 menuItem.isEnabled = true
98 if items[clickedRow].mark {
100 menuItem.title = LocalizedStrings.removeMark.string
104 menuItem.title = LocalizedStrings.addMark.string
112 extension HistoryTableViewController: NSTableViewDelegate {
114 func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
117 .flatMap { $0.identifier }
118 .flatMap { tableView.makeView(withIdentifier: $0, owner: nil) }
122 final class KaihatsuHistoryTableViewController: HistoryTableViewController {
124 override var predicateFormat: String { return "name contains $value" }
125 override func objects(of predicate: NSPredicate?, in store: LocalDataStore) throws -> [NSManagedObject] {
127 return try store.objects(of: KaihatuHistory.entity, predicate: predicate)
131 final class KenzoHistoryTableViewController: HistoryTableViewController {
133 override var predicateFormat: String { return "name contains $value" }
134 override func objects(of predicate: NSPredicate?, in store: LocalDataStore) throws -> [NSManagedObject] {
136 return try store.objects(of: KenzoHistory.entity, predicate: predicate)
140 final class DropShipHistoryTableViewController: HistoryTableViewController {
142 override var predicateFormat: String { return "shipName contains $value" }
143 override func objects(of predicate: NSPredicate?, in store: LocalDataStore) throws -> [NSManagedObject] {
145 return try store.objects(of: DropShipHistory.entity, predicate: predicate)