OSDN Git Service

判定式33に対応
[kcd/KCD.git] / KCD / AppDelegate.swift
1 //
2 //  AppDelegate.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/02/03.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 fileprivate extension Selector {
12     static let fireInAppDelegate = #selector(AppDelegate.fire(_:))
13     
14     static let saveLocalData = #selector(AppDelegate.saveLocalData(_:))
15     static let loadLocalData = #selector(AppDelegate.loadLocalData(_:))
16     
17     static let removeDatabaseFile = #selector(AppDelegate.removeDatabaseFile(_:))
18 }
19
20 @NSApplicationMain
21 class AppDelegate: NSObject {
22     static var shared: AppDelegate {
23         // swiftlint:disable force_cast
24         return NSApplication.shared().delegate as! AppDelegate
25     }
26 //    let appNameForUserAgent: String = "Version/10.0.3 Safari/603.2.4"
27     let appNameForUserAgent: String = "KCD(1.9b11) is not Safari/603.2.4"
28     let fleetManager: FleetManager = FleetManager()
29     
30     let windowManager = WindowManager()
31     
32     private let historyCleanNotifer = PeriodicNotifier(hour: 0, minutes: 7)
33     private let jsonTracker = JSONTracker()
34     private let timeSignalNotifier = TimeSignalNotifier()
35     private let resourceHistory = ResourceHistoryManager()
36     
37     // MARK: - Variable
38     @IBOutlet var debugMenuItem: NSMenuItem!
39     @IBOutlet var billingWindowMenuItem: NSMenuItem!
40     
41     var jsonViewWindowController: JSONViewWindowController? {
42         return windowManager.jsonViewWindowController
43     }
44     
45     private var browserWindowControllers: [ExternalBrowserWindowController] = []
46     private var updaters: [() -> Void] = []
47     fileprivate var logedJSONViewWindowController: JSONViewWindowController?
48     private var didLoadedMainMenu = false
49     
50     var screenShotSaveDirectory: String {
51         get {
52             return UserDefaults.standard.screenShotSaveDirectory ?? ApplicationDirecrories.pictures.path
53         }
54         set { UserDefaults.standard.screenShotSaveDirectory = newValue }
55     }
56     var screenShotSaveDirectoryURL: URL {
57         return URL(fileURLWithPath: screenShotSaveDirectory)
58     }
59     dynamic var monospaceSystemFont11: NSFont {
60         return NSFont.monospacedDigitSystemFont(ofSize: 11, weight: NSFontWeightRegular)
61     }
62     dynamic var monospaceSystemFont12: NSFont {
63         return NSFont.monospacedDigitSystemFont(ofSize: 12, weight: NSFontWeightRegular)
64     }
65     dynamic var monospaceSystemFont13: NSFont {
66         return NSFont.monospacedDigitSystemFont(ofSize: 13, weight: NSFontWeightRegular)
67     }
68     
69     // MARK: - Function
70     override func awakeFromNib() {
71         if didLoadedMainMenu { return }
72         didLoadedMainMenu = true
73         
74         ValueTransformerRegister.registerAll()
75         UserDefaults.registerAllDefaults()
76         CustomHTTPProtocol.start()
77         CommandRegister.register()
78         
79         windowManager.prepair()
80         
81         if !UserDefaults.standard.showsDebugMenu { debugMenuItem.isHidden = true }
82         NotificationCenter.default
83             .addObserver(forName: .Periodic, object: historyCleanNotifer, queue: nil) { _ in
84                 HistoryItemCleaner().cleanOldHistoryItems()
85         }
86     }
87     
88     func addCounterUpdate(_ updater: @escaping () -> Void) {
89         updaters.append(updater)
90     }
91     func clearCache() {
92         CustomHTTPProtocol.clearCache()
93     }
94     func createNewBrowser() -> ExternalBrowserWindowController {
95         return windowManager.createNewBrowser()
96     }
97     
98     func registerScreenshot(_ image: NSBitmapImageRep, fromOnScreen: NSRect) {
99         windowManager.registerScreenshot(image, fromOnScreen: fromOnScreen)
100     }
101     
102     func fire(_ timer: Timer) {
103         updaters.forEach { $0() }
104     }
105 }
106 // MARK: - IBActions
107 extension AppDelegate {
108     @IBAction func showHideHistory(_ sender: AnyObject?) {
109         windowManager.showHideHistory(sender)
110     }
111     @IBAction func showHideSlotItemWindow(_ sender: AnyObject?) {
112         windowManager.showHideSlotItemWindow(sender)
113     }
114     @IBAction func showHideUpgradableShipWindow(_ sender: AnyObject?) {
115         windowManager.showHideUpgradableShipWindow(sender)
116     }
117     @IBAction func showHideScreenshotListWindow(_ sender: AnyObject?) {
118         windowManager.showHideScreenshotListWindow(sender)
119     }
120     @IBAction func showHideAirBaseInfoWindow(_ sender: AnyObject?) {
121         windowManager.showHideAirBaseInfoWindow(sender)
122     }
123     @IBAction func showHidePreferencePanle(_ sender: AnyObject?) {
124         windowManager.showHidePreferencePanle(sender)
125     }
126     @IBAction func showWindowAduster(_ sender: AnyObject?) {
127         windowManager.showWindowAduster(sender)
128     }
129     @IBAction func openNewBrowser(_ sender: AnyObject?) {
130         windowManager.openNewBrowser(sender)
131     }
132     @IBAction func selectBookmark(_ sender: AnyObject?) {
133         windowManager.selectBookmark(sender)
134     }
135     @IBAction func removeDatabaseFile(_ sender: AnyObject?) {
136         guard let path = Bundle.main.path(forResource: "RemoveDatabaseFileAndRestart", ofType: "app")
137             else { return print("Can not find RemoveDatabaseFileAndRestart.app") }
138         let process = Process()
139         process.launchPath = "/usr/bin/open"
140         process.arguments = [path]
141         process.launch()
142     }
143     @IBAction func showMainBrowser(_ sender: AnyObject?) {
144         windowManager.showMainBrowser(sender)
145     }
146     
147     @IBAction func showShipWindow(_ sender: AnyObject?) {
148         windowManager.showShipWindow(sender)
149     }
150     @IBAction func showEquipmentWindow(_ sender: AnyObject?) {
151         windowManager.showEquipmentWindow(sender)
152     }
153     @IBAction func showMapWindow(_ sender: AnyObject?) {
154         windowManager.showMapWindow(sender)
155     }
156     @IBAction func showOwnershipShipWindow(_ sender: AnyObject?) {
157         windowManager.showOwnershipShipWindow(sender)
158     }
159     
160     @IBAction func saveLocalData(_ sender: AnyObject?) {
161         TSVSupport().save()
162     }
163     @IBAction func loadLocalData(_ sender: AnyObject?) {
164         TSVSupport().load()
165     }
166     
167     @IBAction func saveDocument(_ sender: AnyObject?) {
168         windowManager.saveDocument(sender)
169     }
170     @IBAction func openDocument(_ sender: AnyObject?) {
171         windowManager.openDocument(sender)
172     }
173     
174     override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
175         guard let action = menuItem.action else { return false }
176         switch action {
177         case Selector.saveLocalData, Selector.loadLocalData:
178             return true
179         case Selector.removeDatabaseFile:
180             return true
181         default:
182             return windowManager.validateMenuItem(menuItem)
183         }
184     }
185 }
186
187 extension AppDelegate: NSApplicationDelegate {
188     func applicationWillFinishLaunching(_ notification: Notification) {
189         NSUserNotificationCenter.default.delegate = self
190         Timer.scheduledTimer(timeInterval: 0.33,
191                              target: self,
192                              selector: .fireInAppDelegate,
193                              userInfo: nil,
194                              repeats: true)
195     }
196     func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
197         return true
198     }
199 }
200
201 extension AppDelegate: NSUserNotificationCenterDelegate {
202     func userNotificationCenter(_ center: NSUserNotificationCenter,
203                                 shouldPresent notification: NSUserNotification) -> Bool {
204         return true
205     }
206 }
207
208 @available(OSX 10.12.2, *)
209 fileprivate var objectForTouchBar: [Int: NSTouchBar] = [:]
210
211 @available(OSX 10.12.2, *)
212 extension AppDelegate: NSTouchBarProvider {
213     @IBOutlet var mainTouchBar: NSTouchBar? {
214         get { return objectForTouchBar[hash] }
215         set { objectForTouchBar[hash] = newValue }
216     }
217     
218     var touchBar: NSTouchBar? {
219         get {
220             if windowManager.isMainWindowMostFront { return nil }
221             if let _ = mainTouchBar {
222                 return mainTouchBar
223             }
224             var topLevel: NSArray = []
225             Bundle.main.loadNibNamed("MainTouchBar",
226                                      owner: self,
227                                      topLevelObjects: &topLevel)
228             return mainTouchBar
229         }
230         set {}
231     }
232 }