2 // HistoryTableViewController.swift
5 // Created by Hori,Masaki on 2017/03/10.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
12 private protocol Markable {
14 var mark: Bool { get set }
17 private protocol HistoryObject {
19 var date: Date { get }
22 extension DropShipHistory: Markable, HistoryObject {}
23 extension KenzoHistory: Markable, HistoryObject {}
24 extension KaihatuHistory: Markable, HistoryObject {}
26 enum MenuItemTag: Int {
33 class HistoryTableViewController: NSViewController {
35 // Subbclass MUST override these.
36 var predicateFormat: String { fatalError("Subbclass MUST implement.") }
37 func objects(of predicate: Predicate?, in store: LocalDataStore) throws -> [NSManagedObject] {
39 fatalError("Subbclass MUST implement.")
42 @IBOutlet private(set) var controller: NSArrayController!
43 @IBOutlet private(set) var tableView: NSTableView!
45 @IBAction func delete(_ sender: AnyObject?) {
47 let store = LocalDataStore.oneTimeEditor()
49 guard let controller = controller else {
53 guard let selection = controller.selectedObjects as? [NSManagedObject] else {
58 let selectedIndex = controller.selectionIndex
62 .compactMap(store.exchange)
63 .forEach(store.delete)
66 if selectedIndex > 1 {
68 controller.setSelectionIndex(selectedIndex - 1)
72 @IBAction func addMark(_ sender: AnyObject?) {
74 guard let clickedRow = tableView?.clickedRow else {
78 guard let items = controller?.arrangedObjects as? [HistoryObject] else {
82 guard case 0..<items.count = clickedRow else {
87 let clickedObject = items[clickedRow]
88 let predicate = Predicate(\KenzoMark.date, equalTo: clickedObject.date)
90 let store = LocalDataStore.oneTimeEditor()
93 if let items = try? self.objects(of: predicate, in: store),
94 var history = items.first as? Markable {
96 let currentMark = history.mark
97 history.mark = !currentMark
104 override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
106 guard let itemTag = MenuItemTag(rawValue: menuItem.tag) else {
115 return controller.selectionIndex != -1
119 menuItem.isEnabled = false
120 guard let clickedRow = tableView?.clickedRow else {
124 guard let items = controller?.arrangedObjects as? [Markable] else {
128 guard case 0..<items.count = clickedRow else {
133 menuItem.isEnabled = true
134 if items[clickedRow].mark {
136 menuItem.title = LocalizedStrings.removeMark.string
140 menuItem.title = LocalizedStrings.addMark.string
148 extension HistoryTableViewController: NSTableViewDelegate {
150 func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
153 .flatMap { $0.identifier }
154 .flatMap { tableView.makeView(withIdentifier: $0, owner: nil) }
158 final class KaihatsuHistoryTableViewController: HistoryTableViewController {
160 override var predicateFormat: String { return "name contains $value" }
161 override func objects(of predicate: Predicate?, in store: LocalDataStore) throws -> [NSManagedObject] {
163 return try store.objects(of: KaihatuHistory.self, predicate: predicate)
167 final class KenzoHistoryTableViewController: HistoryTableViewController {
169 override var predicateFormat: String { return "name contains $value" }
170 override func objects(of predicate: Predicate?, in store: LocalDataStore) throws -> [NSManagedObject] {
172 return try store.objects(of: KenzoHistory.self, predicate: predicate)
176 final class DropShipHistoryTableViewController: HistoryTableViewController {
178 override var predicateFormat: String { return "shipName contains $value" }
179 override func objects(of predicate: Predicate?, in store: LocalDataStore) throws -> [NSManagedObject] {
181 return try store.objects(of: DropShipHistory.self, predicate: predicate)