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/602.4.8"
27 let fleetManager: FleetManager = FleetManager()
29 let windowManager = WindowManager()
31 private let historyCleanNotifer = PeriodicNotifier(hour: 0, minutes: 7)
32 private let jsonTracker = JSONTracker()
33 private let timeSignalNotifier = TimeSignalNotifier()
34 private let resourceHistory = ResourceHistoryManager()
37 @IBOutlet var debugMenuItem: NSMenuItem!
38 @IBOutlet var billingWindowMenuItem: NSMenuItem!
40 var jsonViewWindowController: JSONViewWindowController? {
41 return windowManager.jsonViewWindowController
44 private var browserWindowControllers: [ExternalBrowserWindowController] = []
45 private var updaters: [() -> Void] = []
46 fileprivate var logedJSONViewWindowController: JSONViewWindowController?
47 private var isLoadedMainMenu = false
49 var screenShotSaveDirectory: String {
51 return UserDefaults.standard.screenShotSaveDirectory ?? ApplicationDirecrories.pictures.path
53 set { UserDefaults.standard.screenShotSaveDirectory = newValue }
55 var screenShotSaveDirectoryURL: URL {
56 return URL(fileURLWithPath: screenShotSaveDirectory)
58 dynamic var monospaceSystemFont11: NSFont {
59 return NSFont.monospacedDigitSystemFont(ofSize: 11, weight: NSFontWeightRegular)
61 dynamic var monospaceSystemFont12: NSFont {
62 return NSFont.monospacedDigitSystemFont(ofSize: 12, weight: NSFontWeightRegular)
64 dynamic var monospaceSystemFont13: NSFont {
65 return NSFont.monospacedDigitSystemFont(ofSize: 13, weight: NSFontWeightRegular)
69 override func awakeFromNib() {
70 if isLoadedMainMenu { return }
71 isLoadedMainMenu = true
73 ValueTransformerRegister.registerAll()
74 UserDefaults.registerAllDefaults()
75 CustomHTTPProtocol.start()
76 CommandRegister.register()
78 windowManager.prepair()
80 if !UserDefaults.standard.showsDebugMenu { debugMenuItem.isHidden = true }
81 NotificationCenter.default
82 .addObserver(forName: .Periodic, object: historyCleanNotifer, queue: nil) { _ in
83 HistoryItemCleaner().cleanOldHistoryItems()
87 func addCounterUpdate(_ updater: @escaping () -> Void) {
88 updaters.append(updater)
91 CustomHTTPProtocol.clearCache()
93 func createNewBrowser() -> ExternalBrowserWindowController {
94 return windowManager.createNewBrowser()
97 func registerScreenshot(_ image: NSBitmapImageRep, fromOnScreen: NSRect) {
98 windowManager.registerScreenshot(image, fromOnScreen: fromOnScreen)
101 func fire(_ timer: Timer) {
102 updaters.forEach { $0() }
106 extension AppDelegate {
107 @IBAction func showHideHistory(_ sender: AnyObject?) {
108 windowManager.showHideHistory(sender)
110 @IBAction func showHideSlotItemWindow(_ sender: AnyObject?) {
111 windowManager.showHideSlotItemWindow(sender)
113 @IBAction func showHideUpgradableShipWindow(_ sender: AnyObject?) {
114 windowManager.showHideUpgradableShipWindow(sender)
116 @IBAction func showHideScreenshotListWindow(_ sender: AnyObject?) {
117 windowManager.showHideScreenshotListWindow(sender)
119 @IBAction func showHideAirBaseInfoWindow(_ sender: AnyObject?) {
120 windowManager.showHideAirBaseInfoWindow(sender)
122 @IBAction func showHidePreferencePanle(_ sender: AnyObject?) {
123 windowManager.showHidePreferencePanle(sender)
125 @IBAction func showWindowAduster(_ sender: AnyObject?) {
126 windowManager.showWindowAduster(sender)
128 @IBAction func openNewBrowser(_ sender: AnyObject?) {
129 windowManager.openNewBrowser(sender)
131 @IBAction func selectBookmark(_ sender: AnyObject?) {
132 windowManager.selectBookmark(sender)
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]
142 @IBAction func showMainBrowser(_ sender: AnyObject?) {
143 windowManager.showMainBrowser(sender)
146 @IBAction func showShipWindow(_ sender: AnyObject?) {
147 windowManager.showShipWindow(sender)
149 @IBAction func showEquipmentWindow(_ sender: AnyObject?) {
150 windowManager.showEquipmentWindow(sender)
152 @IBAction func showMapWindow(_ sender: AnyObject?) {
153 windowManager.showMapWindow(sender)
155 @IBAction func showOwnershipShipWindow(_ sender: AnyObject?) {
156 windowManager.showOwnershipShipWindow(sender)
159 @IBAction func saveLocalData(_ sender: AnyObject?) {
162 @IBAction func loadLocalData(_ sender: AnyObject?) {
166 @IBAction func saveDocument(_ sender: AnyObject?) {
167 windowManager.saveDocument(sender)
169 @IBAction func openDocument(_ sender: AnyObject?) {
170 windowManager.openDocument(sender)
173 override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
174 guard let action = menuItem.action else { return false }
176 case Selector.saveLocalData, Selector.loadLocalData:
178 case Selector.removeDatabaseFile:
181 return windowManager.validateMenuItem(menuItem)
186 extension AppDelegate: NSApplicationDelegate {
187 func applicationWillFinishLaunching(_ notification: Notification) {
188 NSUserNotificationCenter.default.delegate = self
189 Timer.scheduledTimer(timeInterval: 0.33,
191 selector: .fireInAppDelegate,
195 func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
200 extension AppDelegate: NSUserNotificationCenterDelegate {
201 func userNotificationCenter(_ center: NSUserNotificationCenter,
202 shouldPresent notification: NSUserNotification) -> Bool {
207 @available(OSX 10.12.2, *)
208 fileprivate var objectForTouchBar: [Int: NSTouchBar] = [:]
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 }
217 var touchBar: NSTouchBar? {
219 if windowManager.isMainWindowMostFront { return nil }
220 if let _ = mainTouchBar {
223 var topLevel: NSArray = []
224 Bundle.main.loadNibNamed("MainTouchBar",
226 topLevelObjects: &topLevel)