OSDN Git Service

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