OSDN Git Service

Markableプロトコルを修正
[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 fileprivate protocol Markable {
12     
13     var mark: Bool { get set }
14 }
15
16 fileprivate 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,
50             let selection = controller.selectedObjects as? [NSManagedObject]
51             else { return }
52         
53         let selectedIndex = controller.selectionIndex
54         selection
55             .forEach { store.delete(store.object(with: $0.objectID)) }
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,
66             let items = controller?.arrangedObjects as? [HistoryObject],
67             case 0..<items.count = clickedRow
68             else { return }
69         
70         let clickedObject = items[clickedRow]
71         let predicate = NSPredicate(format: "date = %@",
72                                     argumentArray: [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)
88             else { return false }
89         
90         switch itemTag {
91         case .delete:
92             return controller.selectionIndex != -1
93             
94         case .addMark:
95             menuItem.isEnabled = false
96             guard let clickedRow = tableView?.clickedRow,
97                 let items = controller?.arrangedObjects as? [Markable],
98                 case 0..<items.count = clickedRow
99                 else { return false }
100             
101             let clickedObject = items[clickedRow]
102             menuItem.isEnabled = true
103             if clickedObject.mark {
104                 
105                 menuItem.title = NSLocalizedString("Remove mark", comment: "Remove history mark.")
106                 
107             } else {
108                 
109                 menuItem.title = NSLocalizedString("Add mark", comment: "Add history mark.")
110             }
111         }
112         
113         return true
114     }
115 }
116
117 extension HistoryTableViewController: NSTableViewDelegate {
118     
119     func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
120         
121         return tableColumn
122             .flatMap { $0.identifier }
123             .flatMap { tableView.make(withIdentifier: $0, owner: nil) }
124     }
125 }
126
127 final class KaihatsuHistoryTableViewController: HistoryTableViewController {
128     
129     override var predicateFormat: String { return "name contains $value" }
130     override func objects(of predicate: NSPredicate?, in store: LocalDataStore) throws -> [NSManagedObject] {
131         
132         return try store.objects(with: KaihatuHistory.entity, predicate: predicate)
133     }
134 }
135
136 final class KenzoHistoryTableViewController: HistoryTableViewController {
137     
138     override var predicateFormat: String { return "name contains $value" }
139     override func objects(of predicate: NSPredicate?, in store: LocalDataStore) throws -> [NSManagedObject] {
140         
141         return try store.objects(with: KenzoHistory.entity, predicate: predicate)
142     }
143 }
144
145 final class DropShipHistoryTableViewController: HistoryTableViewController {
146     
147     override var predicateFormat: String { return "shipName contains $value" }
148     override func objects(of predicate: NSPredicate?, in store: LocalDataStore) throws -> [NSManagedObject] {
149         
150         return try store.objects(with: DropShipHistory.entity, predicate: predicate)
151     }
152 }