2 // HistoryTableViewController.swift
5 // Created by Hori,Masaki on 2017/03/10.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
11 fileprivate protocol Markable {
13 var mark: Bool { get set }
16 fileprivate 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.")
42 @IBOutlet var controller: NSArrayController!
43 @IBOutlet var tableView: NSTableView!
45 @IBAction func delete(_ sender: AnyObject?) {
47 let store = LocalDataStore.oneTimeEditor()
49 guard let controller = controller,
50 let selection = controller.selectedObjects as? [NSManagedObject]
53 let selectedIndex = controller.selectionIndex
55 .forEach { store.delete(store.object(with: $0.objectID)) }
57 if selectedIndex > 1 {
59 controller.setSelectionIndex(selectedIndex - 1)
63 @IBAction func addMark(_ sender: AnyObject?) {
65 guard let clickedRow = tableView?.clickedRow,
66 let items = controller?.arrangedObjects as? [HistoryObject],
67 case 0..<items.count = clickedRow
70 let clickedObject = items[clickedRow]
71 let predicate = NSPredicate(format: "date = %@",
72 argumentArray: [clickedObject.date])
74 let store = LocalDataStore.oneTimeEditor()
76 if let items = try? objects(of: predicate, in: store),
77 var history = items.first as? Markable {
79 history.mark = !history.mark
85 override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
87 guard let itemTag = MenuItemTag(rawValue: menuItem.tag)
92 return controller.selectionIndex != -1
95 menuItem.isEnabled = false
96 guard let clickedRow = tableView?.clickedRow,
97 let items = controller?.arrangedObjects as? [Markable],
98 case 0..<items.count = clickedRow
101 let clickedObject = items[clickedRow]
102 menuItem.isEnabled = true
103 if clickedObject.mark {
105 menuItem.title = NSLocalizedString("Remove mark", comment: "Remove history mark.")
109 menuItem.title = NSLocalizedString("Add mark", comment: "Add history mark.")
117 extension HistoryTableViewController: NSTableViewDelegate {
119 func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
122 .flatMap { $0.identifier }
123 .flatMap { tableView.make(withIdentifier: $0, owner: nil) }
127 final class KaihatsuHistoryTableViewController: HistoryTableViewController {
129 override var predicateFormat: String { return "name contains $value" }
130 override func objects(of predicate: NSPredicate?, in store: LocalDataStore) throws -> [NSManagedObject] {
132 return try store.objects(with: KaihatuHistory.entity, predicate: predicate)
136 final class KenzoHistoryTableViewController: HistoryTableViewController {
138 override var predicateFormat: String { return "name contains $value" }
139 override func objects(of predicate: NSPredicate?, in store: LocalDataStore) throws -> [NSManagedObject] {
141 return try store.objects(with: KenzoHistory.entity, predicate: predicate)
145 final class DropShipHistoryTableViewController: HistoryTableViewController {
147 override var predicateFormat: String { return "shipName contains $value" }
148 override func objects(of predicate: NSPredicate?, in store: LocalDataStore) throws -> [NSManagedObject] {
150 return try store.objects(with: DropShipHistory.entity, predicate: predicate)