OSDN Git Service

guard の書き方を統一した
[kcd/KCD.git] / KCD / HistoryWindowController.swift
index f179765..55b233d 100644 (file)
 
 import Cocoa
 
-fileprivate protocol Markable {
-    var marked: Bool { get set }
-}
-extension DropShipHistory: Markable {
-    var marked: Bool {
-        get { return mark }
-        set { mark = newValue }
-    }
-}
-extension KenzoHistory: Markable {
-    var marked: Bool {
-        get { return mark }
-        set { mark = newValue }
-    }
-}
-extension KaihatuHistory: Markable {
-    var marked: Bool {
-        get { return mark }
-        set { mark = newValue }
-    }
-}
-
-fileprivate extension Selector {
-    static let addMark = #selector(HistoryWindowController.addMark(_:))
-}
-
-class HistoryWindowController: NSWindowController {
-    fileprivate enum HistoryWindowTabIndex: Int {
+final class HistoryWindowController: NSWindowController {
+    
+    private enum HistoryWindowTabIndex: Int {
+        
         case kaihatuHistory = 0
         case kenzoHistory = 1
         case dropHistory = 2
     }
     
-    fileprivate struct SelectionInfo {
-        let controller: NSArrayController
-        let predicateFormat: String
-        let tableView: NSTableView
-        let entityName: String
-        let pickUpPredicateFormat: String
+    @objc let manageObjectContext = LocalDataStore.default.context
+    
+    @IBOutlet var tabView: NSTabView!
+    @IBOutlet var kaihatsuTableVC: KaihatsuHistoryTableViewController!
+    @IBOutlet var kenzoTableVC: KenzoHistoryTableViewController!
+    @IBOutlet var dropShipTableVC: DropShipHistoryTableViewController!
+    
+    @IBOutlet var searchField: NSSearchField!
+    
+    private var currentSelection: HistoryTableViewController? {
         
-        init(_ owner: HistoryWindowController) {
-            switch owner.swiftSelectedTabIndex {
-            case .kaihatuHistory:
-                controller = owner.kaihatuHistoryController
-                predicateFormat = "name contains $value"
-                tableView = owner.kaihatuHistoryTableView
-                entityName = "KaihatuHistory"
-                pickUpPredicateFormat = "date = %@ AND name = %@"
-            case .kenzoHistory:
-                controller = owner.kenzoHistoryController
-                predicateFormat = "name contains $value"
-                tableView = owner.kenzoHistoryTableView
-                entityName = "KenzoHistory"
-                pickUpPredicateFormat = "date = %@ AND name = %@"
-            case .dropHistory:
-                controller = owner.dropHistoryController
-                predicateFormat = "shipName contains $value"
-                tableView = owner.dropHistoryTableView
-                entityName = "DropShipHistory"
-                pickUpPredicateFormat = "date = %@ AND mapCell = %ld"
+        didSet {
+            window?.makeFirstResponder(currentSelection?.tableView)
+            
+            if let controller = currentSelection?.controller,
+                let predicateFormat = currentSelection?.predicateFormat {
+                
+                searchField.bind(.predicate,
+                                 to: controller,
+                                 withKeyPath: NSBindingName.filterPredicate.rawValue,
+                                 options: [.predicateFormat: predicateFormat])
+            } else {
+                
+                searchField.unbind(.predicate)
             }
         }
     }
     
-    let manageObjectContext = LocalDataStore.default.managedObjectContext
-    
-    @IBOutlet var kaihatuHistoryController: NSArrayController!
-    @IBOutlet var kenzoHistoryController: NSArrayController!
-    @IBOutlet var dropHistoryController: NSArrayController!
-    
-    @IBOutlet var kaihatuHistoryTableView: NSTableView!
-    @IBOutlet var kenzoHistoryTableView: NSTableView!
-    @IBOutlet var dropHistoryTableView: NSTableView!
-    
-    @IBOutlet var searchField: NSSearchField!
-    
-    var selectedTabIndex: Int = 0 {
+    @objc var selectedTabIndex: Int = -1 {
+        
         didSet {
-            HistoryWindowTabIndex(rawValue: selectedTabIndex)
-                .map { swiftSelectedTabIndex = $0 }
+            guard let tabIndex = HistoryWindowTabIndex(rawValue: selectedTabIndex) else { return }
+            
+            switch tabIndex {
+            case .kaihatuHistory:
+                currentSelection = kaihatsuTableVC
+                
+            case .kenzoHistory:
+                currentSelection = kenzoTableVC
+                
+            case .dropHistory:
+                currentSelection = dropShipTableVC
+            }
         }
     }
-    fileprivate var swiftSelectedTabIndex: HistoryWindowTabIndex = .kaihatuHistory
-    override var windowNibName: String! {
-        return "HistoryWindowController"
+    override var windowNibName: NSNib.Name {
+        
+        return .nibName(instanceOf: self)
     }
     
     override func windowDidLoad() {
+        
         super.windowDidLoad()
         
-        let info = SelectionInfo(self)
+        let vcs: [NSViewController] = [kaihatsuTableVC, kenzoTableVC, dropShipTableVC]
+        zip(vcs, tabView.tabViewItems)
+            .forEach { $0.1.viewController = $0.0 }
         
-        searchField.bind(NSPredicateBinding,
-                         to: info.controller,
-                         withKeyPath: NSFilterPredicateBinding,
-                         options: [NSPredicateFormatBindingOption: info.predicateFormat])
+        selectedTabIndex = 0
     }
     
     @IBAction func delete(_ sender: AnyObject?) {
-        let store = LocalDataStore.oneTimeEditor()
-        SelectionInfo(self)
-            .controller
-            .selectedObjects
-            .flatMap { $0 as? [NSManagedObject] }
-            .flatMap { $0 }
-            .map { $0.objectID }
-            .map { store.object(with: $0) }
-            .forEach { store.delete($0) }
-    }
-    
-    @IBAction func addMark(_ sender: AnyObject?) {
-        let info = SelectionInfo(self)
-        let clickedRow = info.tableView.clickedRow
-        guard let items = info.controller.arrangedObjects as? [Any],
-            0..<items.count ~= clickedRow
-            else { return }
-        let clickedObject = items[clickedRow]
-        
-        let p: NSPredicate? = {
-            switch clickedObject {
-            case let obj as KaihatuHistory:
-                return NSPredicate(format: info.pickUpPredicateFormat,
-                                   argumentArray: [obj.date, obj.name])
-            case let obj as KenzoHistory:
-                return NSPredicate(format: info.pickUpPredicateFormat,
-                                   argumentArray: [obj.date, obj.name])
-            case let obj as DropShipHistory:
-                return NSPredicate(format: info.pickUpPredicateFormat,
-                                   argumentArray: [obj.date, obj.mapCell])
-            default:
-                return nil
-            }
-        }()
-        guard let predicate = p else { return }
         
-        let store = LocalDataStore.oneTimeEditor()
-        if let a = try? store.objects(withEntityName: info.entityName,
-                             predicate: predicate),
-            let item = a.first,
-            var history = item as? Markable {
-            history.marked = !history.marked
-        }
-        store.saveActionCore()
-    }
-    
-    override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
-        if menuItem.action == .addMark {
-            menuItem.isEnabled = false
-            
-            let info = SelectionInfo(self)
-            let clickedRow = info.tableView.clickedRow
-            guard let items = info.controller.arrangedObjects as? [Any],
-                0..<items.count ~= clickedRow,
-                let clickedObject = items[clickedRow] as? Markable
-                else { return false }
-            
-            menuItem.isEnabled = true
-            if clickedObject.marked {
-                menuItem.title = NSLocalizedString("Remove mark", comment: "Remove history mark.")
-            } else {
-                menuItem.title = NSLocalizedString("Add mark", comment: "Add history mark.")
-            }
-            return true
-        }
-        
-        return false
+        currentSelection?.delete(sender)
     }
 }
 
 @available(OSX 10.12.2, *)
-fileprivate var objectForTouchBar:[Int: NSTouchBar] = [:]
-fileprivate var object1ForTouchBar:[Int: NSButton] = [:]
+private var objectForTouchBar: [Int: NSTouchBar] = [:]
+private var object1ForTouchBar: [Int: NSButton] = [:]
 
 @available(OSX 10.12.2, *)
 extension HistoryWindowController {
+    
     @IBOutlet var myTouchBar: NSTouchBar? {
-        get {
-            return objectForTouchBar[hashValue]
-        }
-        set {
-            objectForTouchBar[hashValue] = newValue
-        }
+        
+        get { return objectForTouchBar[hashValue] }
+        set { objectForTouchBar[hashValue] = newValue }
     }
+    
     @IBOutlet var searchButton: NSButton? {
-        get {
-            return object1ForTouchBar[hashValue]
-        }
-        set {
-            object1ForTouchBar[hashValue] = newValue
-        }
+        
+        get { return object1ForTouchBar[hashValue] }
+        set { object1ForTouchBar[hashValue] = newValue }
     }
     
     override var touchBar: NSTouchBar? {
+        
         get {
             if let _ = myTouchBar {
+                
                 return myTouchBar
             }
-            var topLevel: NSArray = []
-            Bundle.main.loadNibNamed("HistoryWindowTouchBar",
+            var topLevel: NSArray?
+            Bundle.main.loadNibNamed(NSNib.Name("HistoryWindowTouchBar"),
                                      owner: self,
                                      topLevelObjects: &topLevel)
+            
             return myTouchBar
         }
         set {}
     }
     
     @IBAction func selectSearchField(_ sender: AnyObject?) {
-        window!.makeFirstResponder(searchField!)
-    }
-}
-
-extension HistoryWindowController: NSTableViewDelegate {
-    func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
-        return tableView.make(withIdentifier: tableColumn!.identifier, owner: nil)
-    }
-}
-
-extension HistoryWindowController: NSTabViewDelegate {
-    func tabView(_ tabView: NSTabView, didSelect tabViewItem: NSTabViewItem?) {
-        searchField.unbind(NSPredicateBinding)
-        
-        let info = SelectionInfo(self)
         
-        searchField.bind(NSPredicateBinding,
-                         to: info.controller,
-                         withKeyPath: NSFilterPredicateBinding,
-                         options: [NSPredicateFormatBindingOption: info.predicateFormat])
+        window?.makeFirstResponder(searchField!)
     }
 }