OSDN Git Service

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