OSDN Git Service

Swift4.0にコンバートした
[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 private extension Selector {
12     
13     static let fireInAppDelegate = #selector(AppDelegate.fire(_:))
14     
15     static let saveLocalData = #selector(AppDelegate.saveLocalData(_:))
16     static let loadLocalData = #selector(AppDelegate.loadLocalData(_:))
17     
18     static let removeDatabaseFile = #selector(AppDelegate.removeDatabaseFile(_:))
19 }
20
21 @NSApplicationMain
22 final class AppDelegate: NSObject {
23     
24     static var shared: AppDelegate {
25         
26         // swiftlint:disable force_cast
27         return NSApplication.shared.delegate as! AppDelegate
28     }
29     
30     let appNameForUserAgent: String = "KCD(1.9b17) is not Safari/603.3.8"
31     let fleetManager: FleetManager = FleetManager()
32     
33     let windowManager = WindowManager()
34     
35     private let historyCleanNotifer = PeriodicNotifier(hour: 0, minutes: 7)
36     private let jsonTracker = JSONTracker()
37     private let timeSignalNotifier = TimeSignalNotifier()
38     private let resourceHistory = ResourceHistoryManager()
39     
40     // MARK: - Variable
41     @IBOutlet var debugMenuItem: NSMenuItem!
42     @IBOutlet var billingWindowMenuItem: NSMenuItem!
43     
44     var jsonViewWindowController: JSONViewWindowController? {
45         
46         return windowManager.jsonViewWindowController
47     }
48     
49     private var browserWindowControllers: [ExternalBrowserWindowController] = []
50     private var updaters: [() -> Void] = []
51     private var logedJSONViewWindowController: JSONViewWindowController?
52     private var didLoadedMainMenu = false
53     
54     var screenShotSaveDirectory: String {
55         
56         get {
57             return UserDefaults.standard[.screenShotSaveDirectory] ?? ApplicationDirecrories.pictures.path
58         }
59         set {
60             UserDefaults.standard[.screenShotSaveDirectory] = newValue
61         }
62     }
63     
64     var screenShotSaveDirectoryURL: URL {
65         
66         return URL(fileURLWithPath: screenShotSaveDirectory)
67     }
68     
69     @objc dynamic var monospaceSystemFont11: NSFont {
70         
71         return NSFont.monospacedDigitSystemFont(ofSize: 11, weight: .regular)
72     }
73     
74     @objc dynamic var monospaceSystemFont12: NSFont {
75         
76         return NSFont.monospacedDigitSystemFont(ofSize: 12, weight: .regular)
77     }
78     
79     @objc dynamic var monospaceSystemFont13: NSFont {
80         
81         return NSFont.monospacedDigitSystemFont(ofSize: 13, weight: .regular)
82     }
83     
84     // MARK: - Function
85     override func awakeFromNib() {
86         
87         if didLoadedMainMenu { return }
88         
89         didLoadedMainMenu = true
90         
91         ValueTransformerRegister.registerAll()
92         UserDefaults.standard.register(defaults: DefaultKeys.defaults)
93         CustomHTTPProtocol.start()
94         CommandRegister.register()
95         
96         windowManager.prepair()
97         
98         if !UserDefaults.standard[.showsDebugMenu] { debugMenuItem.isHidden = true }
99         
100         NotificationCenter.default
101             .addObserver(forName: .Periodic, object: historyCleanNotifer, queue: nil) { _ in
102                 
103                 HistoryItemCleaner().cleanOldHistoryItems()
104         }
105     }
106     
107     func addCounterUpdate(_ updater: @escaping () -> Void) {
108         
109         updaters.append(updater)
110     }
111     
112     func clearCache() {
113         
114         CustomHTTPProtocol.clearCache()
115     }
116     
117     func createNewBrowser() -> ExternalBrowserWindowController {
118         
119         return windowManager.createNewBrowser()
120     }
121     
122     func registerScreenshot(_ image: NSBitmapImageRep, fromOnScreen: NSRect) {
123         
124         windowManager.registerScreenshot(image, fromOnScreen: fromOnScreen)
125     }
126     
127     @objc func fire(_ timer: Timer) {
128         
129         updaters.forEach { $0() }
130     }
131 }
132
133 // MARK: - IBActions
134 extension AppDelegate {
135     
136     @IBAction func showHideHistory(_ sender: AnyObject?) {
137         
138         windowManager.showHideHistory(sender)
139     }
140     
141     @IBAction func showHideSlotItemWindow(_ sender: AnyObject?) {
142         
143         windowManager.showHideSlotItemWindow(sender)
144     }
145     
146     @IBAction func showHideUpgradableShipWindow(_ sender: AnyObject?) {
147         
148         windowManager.showHideUpgradableShipWindow(sender)
149     }
150     
151     @IBAction func showHideScreenshotListWindow(_ sender: AnyObject?) {
152         
153         windowManager.showHideScreenshotListWindow(sender)
154     }
155     
156     @IBAction func showHideAirBaseInfoWindow(_ sender: AnyObject?) {
157         
158         windowManager.showHideAirBaseInfoWindow(sender)
159     }
160     
161     @IBAction func showHidePreferencePanle(_ sender: AnyObject?) {
162         
163         windowManager.showHidePreferencePanle(sender)
164     }
165     
166     @IBAction func showWindowAduster(_ sender: AnyObject?) {
167         
168         windowManager.showWindowAduster(sender)
169     }
170     
171     @IBAction func openNewBrowser(_ sender: AnyObject?) {
172         
173         windowManager.openNewBrowser(sender)
174     }
175     
176     @IBAction func selectBookmark(_ sender: AnyObject?) {
177         
178         windowManager.selectBookmark(sender)
179     }
180     
181     @IBAction func removeDatabaseFile(_ sender: AnyObject?) {
182         
183         guard let path = Bundle.main.path(forResource: "RemoveDatabaseFileAndRestart", ofType: "app")
184             else { return print("Can not find RemoveDatabaseFileAndRestart.app") }
185         let process = Process()
186         process.launchPath = "/usr/bin/open"
187         process.arguments = [path]
188         process.launch()
189     }
190     
191     @IBAction func showMainBrowser(_ sender: AnyObject?) {
192         
193         windowManager.showMainBrowser(sender)
194     }
195     
196     @IBAction func showShipWindow(_ sender: AnyObject?) {
197         
198         windowManager.showShipWindow(sender)
199     }
200     
201     @IBAction func showEquipmentWindow(_ sender: AnyObject?) {
202         
203         windowManager.showEquipmentWindow(sender)
204     }
205     
206     @IBAction func showMapWindow(_ sender: AnyObject?) {
207         
208         windowManager.showMapWindow(sender)
209     }
210     
211     @IBAction func showOwnershipShipWindow(_ sender: AnyObject?) {
212         
213         windowManager.showOwnershipShipWindow(sender)
214     }
215     
216     @IBAction func saveLocalData(_ sender: AnyObject?) {
217         
218         TSVSupport().save()
219     }
220     
221     @IBAction func loadLocalData(_ sender: AnyObject?) {
222         
223         TSVSupport().load()
224     }
225     
226     @IBAction func saveDocument(_ sender: AnyObject?) {
227         
228         windowManager.saveDocument(sender)
229     }
230     
231     @IBAction func openDocument(_ sender: AnyObject?) {
232         
233         windowManager.openDocument(sender)
234     }
235     
236     @IBAction func openInDeckBuilder(_ sender: Any?) {
237         
238         DeckBuilder().openDeckBuilder()
239     }
240     
241     override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
242         
243         guard let action = menuItem.action else { return false }
244         
245         switch action {
246         case Selector.saveLocalData, Selector.loadLocalData:
247             return true
248             
249         case Selector.removeDatabaseFile:
250             return true
251             
252         case #selector(openInDeckBuilder(_:)):
253             return true
254             
255         default:
256             return windowManager.validateMenuItem(menuItem)
257         }
258     }
259 }
260
261 extension AppDelegate: NSApplicationDelegate {
262     
263     func applicationWillFinishLaunching(_ notification: Notification) {
264         
265         if NSEvent.modifierFlags == .option {
266             
267             removeDatabaseFile(nil)
268             
269             exit(0)
270         }
271         
272         NSUserNotificationCenter.default.delegate = self
273         Timer.scheduledTimer(timeInterval: 0.33,
274                              target: self,
275                              selector: .fireInAppDelegate,
276                              userInfo: nil,
277                              repeats: true)
278     }
279     
280     func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
281         
282         return true
283     }
284 }
285
286 extension AppDelegate: NSUserNotificationCenterDelegate {
287     
288     func userNotificationCenter(_ center: NSUserNotificationCenter, shouldPresent notification: NSUserNotification) -> Bool {
289         
290         return true
291     }
292 }
293
294 @available(OSX 10.12.2, *)
295 private var objectForTouchBar: [Int: NSTouchBar] = [:]
296
297 @available(OSX 10.12.2, *)
298 extension AppDelegate: NSTouchBarProvider {
299     
300     @IBOutlet var mainTouchBar: NSTouchBar? {
301         
302         get { return objectForTouchBar[hash] }
303         set { objectForTouchBar[hash] = newValue }
304     }
305     
306     var touchBar: NSTouchBar? {
307         
308         get {
309             if windowManager.isMainWindowMostFront { return nil }
310             if let _ = mainTouchBar { return mainTouchBar }
311             
312             var topLevel: NSArray?
313             Bundle.main.loadNibNamed(NSNib.Name("MainTouchBar"), owner: self, topLevelObjects: &topLevel)
314             
315             return mainTouchBar
316         }
317         set {}
318     }
319 }