OSDN Git Service

CoreDataProviderのプロパティ名を簡略化
[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     var marked: Bool { get set }
13 }
14 fileprivate protocol HistoryObject {
15     var date: Date { get }
16 }
17
18 extension DropShipHistory: Markable, HistoryObject {
19     var marked: Bool {
20         get { return mark }
21         set { mark = newValue }
22     }
23 }
24 extension KenzoHistory: Markable, HistoryObject {
25     var marked: Bool {
26         get { return mark }
27         set { mark = newValue }
28     }
29 }
30 extension KaihatuHistory: Markable, HistoryObject {
31     var marked: Bool {
32         get { return mark }
33         set { mark = newValue }
34     }
35 }
36
37 enum MenuItemTag: Int {
38     case delete = 314
39     
40     case addMark = 50000
41 }
42
43 class HistoryTableViewController: NSViewController {
44     var pickUpPredicateFormat: String { return "date = %@" }
45     var predicateFormat: String { return "" }
46     var entityType: NSManagedObject.Type? { return nil }
47     
48     @IBOutlet var controller: NSArrayController!
49     @IBOutlet var tableView: NSTableView!
50     
51     @IBAction func delete(_ sender: AnyObject?) {
52         let store = LocalDataStore.oneTimeEditor()
53         guard let controller = controller,
54             let selection = controller.selectedObjects as? [NSManagedObject]
55             else { return }
56         let selectedIndex = controller.selectionIndex
57         selection
58             .forEach { store.delete(store.object(with: $0.objectID)) }
59         if selectedIndex > 1 {
60             controller.setSelectionIndex(selectedIndex - 1)
61         }
62     }
63     @IBAction func addMark(_ sender: AnyObject?) {
64         guard let entityType = entityType,
65             let clickedRow = tableView?.clickedRow,
66             let items = controller?.arrangedObjects as? [HistoryObject],
67             0..<items.count ~= clickedRow
68             else { return }
69         let clickedObject = items[clickedRow]
70         let predicate = NSPredicate(format: pickUpPredicateFormat,
71                                     argumentArray: [clickedObject.date])
72         let store = LocalDataStore.oneTimeEditor()
73         if let a = try? store.objects(with: Entity(name: entityType.entityName, type: entityType),
74                                       predicate: predicate),
75             let item = a.first,
76             var history = item as? Markable {
77             history.marked = !history.marked
78         }
79         store.save()
80     }
81     
82     override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
83         guard let itemTag = MenuItemTag(rawValue: menuItem.tag)
84             else { return false }
85         switch itemTag {
86         case .delete:
87             return controller.selectionIndex != -1
88         case .addMark:
89             menuItem.isEnabled = false
90             guard let clickedRow = tableView?.clickedRow,
91                 let items = controller?.arrangedObjects as? [Markable],
92                 0..<items.count ~= clickedRow
93                 else { return false }
94             let clickedObject = items[clickedRow]
95             menuItem.isEnabled = true
96             if clickedObject.marked {
97                 menuItem.title = NSLocalizedString("Remove mark", comment: "Remove history mark.")
98             } else {
99                 menuItem.title = NSLocalizedString("Add mark", comment: "Add history mark.")
100             }
101         }
102         
103         return true
104     }
105 }
106 extension HistoryTableViewController: NSTableViewDelegate {
107     func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
108         return tableColumn
109             .flatMap { $0.identifier }
110             .flatMap { tableView.make(withIdentifier: $0, owner: nil) }
111     }
112 }
113
114 class KaihatsuHistoryTableViewController: HistoryTableViewController {
115     override var predicateFormat: String { return "name contains $value" }
116     override var entityType: NSManagedObject.Type? { return KaihatuHistory.self }
117 }
118 class KenzoHistoryTableViewController: HistoryTableViewController {
119     override var predicateFormat: String { return "name contains $value" }
120     override var entityType: NSManagedObject.Type? { return KenzoHistory.self }
121 }
122 class DropShipHistoryTableViewController: HistoryTableViewController {
123     override var predicateFormat: String { return "shipName contains $value" }
124     override var entityType: NSManagedObject.Type? { return DropShipHistory.self }
125 }