OSDN Git Service

Loggerを利用するようにした
[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.9b17) is not Safari/603.3.8"
21     let fleetManager: FleetManager = FleetManager()
22     
23     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 var debugMenuItem: NSMenuItem!
32     @IBOutlet 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 { return }
78         
79         didLoadedMainMenu = true
80         
81         ValueTransformerRegister.registerAll()
82         UserDefaults.standard.register(defaults: DefaultKeys.defaults)
83         CustomHTTPProtocol.start()
84         CommandRegister.register()
85         
86         windowManager.prepair()
87         
88         if !UserDefaults.standard[.showsDebugMenu] { debugMenuItem.isHidden = true }
89         
90         NotificationCenter.default
91             .addObserver(forName: .Periodic, object: historyCleanNotifer, queue: nil) { _ in
92                 
93                 HistoryItemCleaner().cleanOldHistoryItems()
94         }
95     }
96     
97     func addCounterUpdate(_ updater: @escaping () -> Void) {
98         
99         updaters.append(updater)
100     }
101     
102     func clearCache() {
103         
104         CustomHTTPProtocol.clearCache()
105     }
106     
107     func createNewBrowser() -> ExternalBrowserWindowController {
108         
109         return windowManager.createNewBrowser()
110     }
111     
112     func registerScreenshot(_ image: NSBitmapImageRep, fromOnScreen: NSRect) {
113         
114         windowManager.registerScreenshot(image, fromOnScreen: fromOnScreen)
115     }
116     
117     @objc func fire(_ timer: Timer) {
118         
119         updaters.forEach { $0() }
120     }
121 }
122
123 // MARK: - IBActions
124 extension AppDelegate {
125     
126     @IBAction func showHideHistory(_ sender: AnyObject?) {
127         
128         windowManager.showHideHistory(sender)
129     }
130     
131     @IBAction func showHideSlotItemWindow(_ sender: AnyObject?) {
132         
133         windowManager.showHideSlotItemWindow(sender)
134     }
135     
136     @IBAction func showHideUpgradableShipWindow(_ sender: AnyObject?) {
137         
138         windowManager.showHideUpgradableShipWindow(sender)
139     }
140     
141     @IBAction func showHideScreenshotListWindow(_ sender: AnyObject?) {
142         
143         windowManager.showHideScreenshotListWindow(sender)
144     }
145     
146     @IBAction func showHideAirBaseInfoWindow(_ sender: AnyObject?) {
147         
148         windowManager.showHideAirBaseInfoWindow(sender)
149     }
150     
151     @IBAction func showHidePreferencePanle(_ sender: AnyObject?) {
152         
153         windowManager.showHidePreferencePanle(sender)
154     }
155     
156     @IBAction func showWindowAduster(_ sender: AnyObject?) {
157         
158         windowManager.showWindowAduster(sender)
159     }
160     
161     @IBAction func openNewBrowser(_ sender: AnyObject?) {
162         
163         windowManager.openNewBrowser(sender)
164     }
165     
166     @IBAction func selectBookmark(_ sender: AnyObject?) {
167         
168         windowManager.selectBookmark(sender)
169     }
170     
171     @IBAction func removeDatabaseFile(_ sender: AnyObject?) {
172         
173         guard let path = Bundle.main.path(forResource: "RemoveDatabaseFileAndRestart", ofType: "app") else {
174             
175             return Logger.shared.log("Can not find RemoveDatabaseFileAndRestart.app")
176         }
177         
178         let process = Process()
179         process.launchPath = "/usr/bin/open"
180         process.arguments = [path]
181         process.launch()
182     }
183     
184     @IBAction func showMainBrowser(_ sender: AnyObject?) {
185         
186         windowManager.showMainBrowser(sender)
187     }
188     
189     @IBAction func showShipWindow(_ sender: AnyObject?) {
190         
191         windowManager.showShipWindow(sender)
192     }
193     
194     @IBAction func showEquipmentWindow(_ sender: AnyObject?) {
195         
196         windowManager.showEquipmentWindow(sender)
197     }
198     
199     @IBAction func showMapWindow(_ sender: AnyObject?) {
200         
201         windowManager.showMapWindow(sender)
202     }
203     
204     @IBAction func showOwnershipShipWindow(_ sender: AnyObject?) {
205         
206         windowManager.showOwnershipShipWindow(sender)
207     }
208     
209     @IBAction func saveLocalData(_ sender: AnyObject?) {
210         
211         TSVSupport().save()
212     }
213     
214     @IBAction func loadLocalData(_ sender: AnyObject?) {
215         
216         TSVSupport().load()
217     }
218     
219     @IBAction func saveDocument(_ sender: AnyObject?) {
220         
221         windowManager.saveDocument(sender)
222     }
223     
224     @IBAction func openDocument(_ sender: AnyObject?) {
225         
226         windowManager.openDocument(sender)
227     }
228     
229     @IBAction func openInDeckBuilder(_ sender: Any?) {
230         
231         DeckBuilder().openDeckBuilder()
232     }
233     
234     override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
235         
236         guard let action = menuItem.action else { return false }
237         
238         switch action {
239             
240         case #selector(AppDelegate.saveLocalData(_:)),
241              #selector(AppDelegate.loadLocalData(_:)):
242             
243             return true
244             
245         case #selector(AppDelegate.removeDatabaseFile(_:)):
246             return true
247             
248         case #selector(openInDeckBuilder(_:)):
249             return true
250             
251         default:
252             return windowManager.validateMenuItem(menuItem)
253         }
254     }
255 }
256
257 extension AppDelegate: NSApplicationDelegate {
258     
259     func applicationWillFinishLaunching(_ notification: Notification) {
260         
261         if NSEvent.modifierFlags == .option {
262             
263             removeDatabaseFile(nil)
264             
265             exit(0)
266         }
267         
268         NSUserNotificationCenter.default.delegate = self
269         Timer.scheduledTimer(timeInterval: 0.33,
270                              target: self,
271                              selector: #selector(AppDelegate.fire(_:)),
272                              userInfo: nil,
273                              repeats: true)
274     }
275     
276     func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
277         
278         return true
279     }
280 }
281
282 extension AppDelegate: NSUserNotificationCenterDelegate {
283     
284     func userNotificationCenter(_ center: NSUserNotificationCenter, shouldPresent notification: NSUserNotification) -> Bool {
285         
286         return true
287     }
288 }
289
290 @available(OSX 10.12.2, *)
291 private var objectForTouchBar: [Int: NSTouchBar] = [:]
292
293 @available(OSX 10.12.2, *)
294 extension AppDelegate: NSTouchBarProvider {
295     
296     @IBOutlet var mainTouchBar: NSTouchBar? {
297         
298         get { return objectForTouchBar[hash] }
299         set { objectForTouchBar[hash] = newValue }
300     }
301     
302     var touchBar: NSTouchBar? {
303         
304         get {
305             if windowManager.isMainWindowMostFront { return nil }
306             if let _ = mainTouchBar { return mainTouchBar }
307             
308             var topLevel: NSArray?
309             Bundle.main.loadNibNamed(NSNib.Name("MainTouchBar"), owner: self, topLevelObjects: &topLevel)
310             
311             return mainTouchBar
312         }
313         set {}
314     }
315 }