OSDN Git Service

洋上補給の補強増設用のショートネームをつけた
[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     @IBOutlet private(set) var controller: NSArrayController!
42     @IBOutlet private(set) var tableView: NSTableView!
43     
44     @IBAction func delete(_ sender: AnyObject?) {
45         
46         let store = LocalDataStore.oneTimeEditor()
47         
48         guard let controller = controller else { return }
49         guard let selection = controller.selectedObjects as? [NSManagedObject] else { return }
50         
51         let selectedIndex = controller.selectionIndex
52         selection
53             .map { $0.objectID }
54             .map(store.object(with:))
55             .forEach(store.delete)
56         
57         if selectedIndex > 1 {
58             
59             controller.setSelectionIndex(selectedIndex - 1)
60         }
61     }
62     
63     @IBAction func addMark(_ sender: AnyObject?) {
64         
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 }
68         
69         let clickedObject = items[clickedRow]
70         let predicate = NSPredicate(#keyPath(KenzoMark.date), equal: clickedObject.date)
71         
72         let store = LocalDataStore.oneTimeEditor()
73         
74         if let items = try? objects(of: predicate, in: store),
75             var history = items.first as? Markable {
76             
77             history.mark = !history.mark
78         }
79         
80         store.save(errorHandler: store.presentOnMainThread)
81     }
82     
83     override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
84         
85         guard let itemTag = MenuItemTag(rawValue: menuItem.tag) else { return false }
86         
87         switch itemTag {
88         case .delete:
89             return controller.selectionIndex != -1
90             
91         case .addMark:
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 }
96             
97             menuItem.isEnabled = true
98             if items[clickedRow].mark {
99                 
100                 menuItem.title = LocalizedStrings.removeMark.string
101                 
102             } else {
103                 
104                 menuItem.title = LocalizedStrings.addMark.string
105             }
106         }
107         
108         return true
109     }
110 }
111
112 extension HistoryTableViewController: NSTableViewDelegate {
113     
114     func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
115         
116         return tableColumn
117             .flatMap { $0.identifier }
118             .flatMap { tableView.makeView(withIdentifier: $0, owner: nil) }
119     }
120 }
121
122 final class KaihatsuHistoryTableViewController: HistoryTableViewController {
123     
124     override var predicateFormat: String { return "name contains $value" }
125     override func objects(of predicate: NSPredicate?, in store: LocalDataStore) throws -> [NSManagedObject] {
126         
127         return try store.objects(of: KaihatuHistory.entity, predicate: predicate)
128     }
129 }
130
131 final class KenzoHistoryTableViewController: HistoryTableViewController {
132     
133     override var predicateFormat: String { return "name contains $value" }
134     override func objects(of predicate: NSPredicate?, in store: LocalDataStore) throws -> [NSManagedObject] {
135         
136         return try store.objects(of: KenzoHistory.entity, predicate: predicate)
137     }
138 }
139
140 final class DropShipHistoryTableViewController: HistoryTableViewController {
141     
142     override var predicateFormat: String { return "shipName contains $value" }
143     override func objects(of predicate: NSPredicate?, in store: LocalDataStore) throws -> [NSManagedObject] {
144         
145         return try store.objects(of: DropShipHistory.entity, predicate: predicate)
146     }
147 }