OSDN Git Service

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