5 // Created by Hori,Masaki on 2017/02/03.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
11 fileprivate extension Selector {
12 static let fireInAppDelegate = #selector(AppDelegate.fire(_:))
14 static let saveLocalData = #selector(AppDelegate.saveLocalData(_:))
15 static let loadLocalData = #selector(AppDelegate.loadLocalData(_:))
17 static let removeDatabaseFile = #selector(AppDelegate.removeDatabaseFile(_:))
21 class AppDelegate: NSObject {
22 static var shared: AppDelegate {
23 // swiftlint:disable force_cast
24 return NSApplication.shared().delegate as! AppDelegate
26 // let appNameForUserAgent: String = "Version/10.0.3 Safari/603.2.4"
27 let appNameForUserAgent: String = "KCD(1.9b11) is not Safari/603.2.4"
28 let fleetManager: FleetManager = FleetManager()
30 let windowManager = WindowManager()
32 private let historyCleanNotifer = PeriodicNotifier(hour: 0, minutes: 7)
33 private let jsonTracker = JSONTracker()
34 private let timeSignalNotifier = TimeSignalNotifier()
35 private let resourceHistory = ResourceHistoryManager()
38 @IBOutlet var debugMenuItem: NSMenuItem!
39 @IBOutlet var billingWindowMenuItem: NSMenuItem!
41 var jsonViewWindowController: JSONViewWindowController? {
42 return windowManager.jsonViewWindowController
45 private var browserWindowControllers: [ExternalBrowserWindowController] = []
46 private var updaters: [() -> Void] = []
47 fileprivate var logedJSONViewWindowController: JSONViewWindowController?
48 private var didLoadedMainMenu = false
50 var screenShotSaveDirectory: String {
52 return UserDefaults.standard.screenShotSaveDirectory ?? ApplicationDirecrories.pictures.path
54 set { UserDefaults.standard.screenShotSaveDirectory = newValue }
56 var screenShotSaveDirectoryURL: URL {
57 return URL(fileURLWithPath: screenShotSaveDirectory)
59 dynamic var monospaceSystemFont11: NSFont {
60 return NSFont.monospacedDigitSystemFont(ofSize: 11, weight: NSFontWeightRegular)
62 dynamic var monospaceSystemFont12: NSFont {
63 return NSFont.monospacedDigitSystemFont(ofSize: 12, weight: NSFontWeightRegular)
65 dynamic var monospaceSystemFont13: NSFont {
66 return NSFont.monospacedDigitSystemFont(ofSize: 13, weight: NSFontWeightRegular)
70 override func awakeFromNib() {
71 if didLoadedMainMenu { return }
72 didLoadedMainMenu = true
74 ValueTransformerRegister.registerAll()
75 UserDefaults.registerAllDefaults()
76 CustomHTTPProtocol.start()
77 CommandRegister.register()
79 windowManager.prepair()
81 if !UserDefaults.standard.showsDebugMenu { debugMenuItem.isHidden = true }
82 NotificationCenter.default
83 .addObserver(forName: .Periodic, object: historyCleanNotifer, queue: nil) { _ in
84 HistoryItemCleaner().cleanOldHistoryItems()
88 func addCounterUpdate(_ updater: @escaping () -> Void) {
89 updaters.append(updater)
92 CustomHTTPProtocol.clearCache()
94 func createNewBrowser() -> ExternalBrowserWindowController {
95 return windowManager.createNewBrowser()
98 func registerScreenshot(_ image: NSBitmapImageRep, fromOnScreen: NSRect) {
99 windowManager.registerScreenshot(image, fromOnScreen: fromOnScreen)
102 func fire(_ timer: Timer) {
103 updaters.forEach { $0() }
107 extension AppDelegate {
108 @IBAction func showHideHistory(_ sender: AnyObject?) {
109 windowManager.showHideHistory(sender)
111 @IBAction func showHideSlotItemWindow(_ sender: AnyObject?) {
112 windowManager.showHideSlotItemWindow(sender)
114 @IBAction func showHideUpgradableShipWindow(_ sender: AnyObject?) {
115 windowManager.showHideUpgradableShipWindow(sender)
117 @IBAction func showHideScreenshotListWindow(_ sender: AnyObject?) {
118 windowManager.showHideScreenshotListWindow(sender)
120 @IBAction func showHideAirBaseInfoWindow(_ sender: AnyObject?) {
121 windowManager.showHideAirBaseInfoWindow(sender)
123 @IBAction func showHidePreferencePanle(_ sender: AnyObject?) {
124 windowManager.showHidePreferencePanle(sender)
126 @IBAction func showWindowAduster(_ sender: AnyObject?) {
127 windowManager.showWindowAduster(sender)
129 @IBAction func openNewBrowser(_ sender: AnyObject?) {
130 windowManager.openNewBrowser(sender)
132 @IBAction func selectBookmark(_ sender: AnyObject?) {
133 windowManager.selectBookmark(sender)
135 @IBAction func removeDatabaseFile(_ sender: AnyObject?) {
136 guard let path = Bundle.main.path(forResource: "RemoveDatabaseFileAndRestart", ofType: "app")
137 else { return print("Can not find RemoveDatabaseFileAndRestart.app") }
138 let process = Process()
139 process.launchPath = "/usr/bin/open"
140 process.arguments = [path]
143 @IBAction func showMainBrowser(_ sender: AnyObject?) {
144 windowManager.showMainBrowser(sender)
147 @IBAction func showShipWindow(_ sender: AnyObject?) {
148 windowManager.showShipWindow(sender)
150 @IBAction func showEquipmentWindow(_ sender: AnyObject?) {
151 windowManager.showEquipmentWindow(sender)
153 @IBAction func showMapWindow(_ sender: AnyObject?) {
154 windowManager.showMapWindow(sender)
156 @IBAction func showOwnershipShipWindow(_ sender: AnyObject?) {
157 windowManager.showOwnershipShipWindow(sender)
160 @IBAction func saveLocalData(_ sender: AnyObject?) {
163 @IBAction func loadLocalData(_ sender: AnyObject?) {
167 @IBAction func saveDocument(_ sender: AnyObject?) {
168 windowManager.saveDocument(sender)
170 @IBAction func openDocument(_ sender: AnyObject?) {
171 windowManager.openDocument(sender)
174 override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
175 guard let action = menuItem.action else { return false }
177 case Selector.saveLocalData, Selector.loadLocalData:
179 case Selector.removeDatabaseFile:
182 return windowManager.validateMenuItem(menuItem)
187 extension AppDelegate: NSApplicationDelegate {
188 func applicationWillFinishLaunching(_ notification: Notification) {
189 NSUserNotificationCenter.default.delegate = self
190 Timer.scheduledTimer(timeInterval: 0.33,
192 selector: .fireInAppDelegate,
196 func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
201 extension AppDelegate: NSUserNotificationCenterDelegate {
202 func userNotificationCenter(_ center: NSUserNotificationCenter,
203 shouldPresent notification: NSUserNotification) -> Bool {
208 @available(OSX 10.12.2, *)
209 fileprivate var objectForTouchBar: [Int: NSTouchBar] = [:]
211 @available(OSX 10.12.2, *)
212 extension AppDelegate: NSTouchBarProvider {
213 @IBOutlet var mainTouchBar: NSTouchBar? {
214 get { return objectForTouchBar[hash] }
215 set { objectForTouchBar[hash] = newValue }
218 var touchBar: NSTouchBar? {
220 if windowManager.isMainWindowMostFront { return nil }
221 if let _ = mainTouchBar {
224 var topLevel: NSArray = []
225 Bundle.main.loadNibNamed("MainTouchBar",
227 topLevelObjects: &topLevel)