OSDN Git Service

7b03da5ea5ae757be9e13058b565c8262d435d77
[kcd/KCD.git] / KCD / HistoryTableViewController.swift
1 //
2 //  HistoryTableViewController.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/03/10.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 private protocol Markable {
12     
13     var mark: Bool { get set }
14 }
15
16 private protocol HistoryObject {
17     
18     var date: Date { get }
19 }
20
21 extension DropShipHistory: Markable, HistoryObject {}
22 extension KenzoHistory: Markable, HistoryObject {}
23 extension KaihatuHistory: Markable, HistoryObject {}
24
25 enum MenuItemTag: Int {
26     
27     case delete = 314
28     
29     case addMark = 50000
30 }
31
32 class HistoryTableViewController: NSViewController {
33     
34     // Subbclass MUST override these.
35     var predicateFormat: String { fatalError("Subbclass MUST implement.") }
36     func objects(of predicate: NSPredicate?, in store: LocalDataStore) throws -> [NSManagedObject] {
37         
38         fatalError("Subbclass MUST implement.")
39     }
40     
41     
42     @IBOutlet var controller: NSArrayController!
43     @IBOutlet var tableView: NSTableView!
44     
45     @IBAction func delete(_ sender: AnyObject?) {
46         
47         let store = LocalDataStore.oneTimeEditor()
48         
49         guard let controller = controller else { return }
50         guard let selection = controller.selectedObjects as? [NSManagedObject] else { return }
51         
52         let selectedIndex = controller.selectionIndex
53         selection
54             .lazy
55             .map { $0.objectID }
56             .map { store.object(with: $0) }
57             .forEach(store.delete)
58         
59         if selectedIndex > 1 {
60             
61             controller.setSelectionIndex(selectedIndex - 1)
62         }
63     }
64     
65     @IBAction func addMark(_ sender: AnyObject?) {
66         
67         guard let clickedRow = tableView?.clickedRow else { return }
68         guard let items = controller?.arrangedObjects as? [HistoryObject] else { return }
69         guard case 0..<items.count = clickedRow else { return }
70         
71         let clickedObject = items[clickedRow]
72         let predicate = NSPredicate(#keyPath(KenzoMark.date), equal: clickedObject.date)
73         
74         let store = LocalDataStore.oneTimeEditor()
75         
76         if let items = try? objects(of: predicate, in: store),
77             var history = items.first as? Markable {
78             
79             history.mark = !history.mark
80         }
81         
82         store.save()
83     }
84     
85     override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
86         
87         guard let itemTag = MenuItemTag(rawValue: menuItem.tag) else { return false }
88         
89         switch itemTag {
90         case .delete:
91             return controller.selectionIndex != -1
92             
93         case .addMark:
94             menuItem.isEnabled = false
95             guard let clickedRow = tableView?.clickedRow else { return false }
96             guard let items = controller?.arrangedObjects as? [Markable] else { return false }
97             guard case 0..<items.count = clickedRow else { return false }
98             
99             let clickedObject = items[clickedRow]
100             menuItem.isEnabled = true
101             if clickedObject.mark {
102                 
103                 menuItem.title = LocalizedStrings.removeMark.string
104                 
105             } else {
106                 
107                 menuItem.title = LocalizedStrings.addMark.string
108             }
109         }
110         
111         return true
112     }
113 }
114
115 extension HistoryTableViewController: NSTableViewDelegate {
116     
117     func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
118         
119         return tableColumn
120             .flatMap { $0.identifier }
121             .flatMap { tableView.makeView(withIdentifier: $0, owner: nil) }
122     }
123 }
124
125 final class KaihatsuHistoryTableViewController: HistoryTableViewController {
126     
127     override var predicateFormat: String { return "name contains $value" }
128     override func objects(of predicate: NSPredicate?, in store: LocalDataStore) throws -> [NSManagedObject] {
129         
130         return try store.objects(of: KaihatuHistory.entity, predicate: predicate)
131     }
132 }
133
134 final class KenzoHistoryTableViewController: HistoryTableViewController {
135     
136     override var predicateFormat: String { return "name contains $value" }
137     override func objects(of predicate: NSPredicate?, in store: LocalDataStore) throws -> [NSManagedObject] {
138         
139         return try store.objects(of: KenzoHistory.entity, predicate: predicate)
140     }
141 }
142
143 final class DropShipHistoryTableViewController: HistoryTableViewController {
144     
145     override var predicateFormat: String { return "shipName contains $value" }
146     override func objects(of predicate: NSPredicate?, in store: LocalDataStore) throws -> [NSManagedObject] {
147         
148         return try store.objects(of: DropShipHistory.entity, predicate: predicate)
149     }
150 }