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 showHideHistory = #selector(AppDelegate.showHideHistory(_:))
15 static let showHideSlotItemWindow = #selector(AppDelegate.showHideSlotItemWindow(_:))
16 static let showHideUpgradableShipWindow = #selector(AppDelegate.showHideUpgradableShipWindow(_:))
17 static let showHideScreenshotListWindow = #selector(AppDelegate.showHideScreenshotListWindow(_:))
18 static let showHideAirBaseInfoWindow = #selector(AppDelegate.showHideAirBaseInfoWindow(_:))
19 static let saveLocalData = #selector(AppDelegate.saveLocalData(_:))
20 static let loadLocalData = #selector(AppDelegate.loadLocalData(_:))
21 static let showHidePreferencePanle = #selector(AppDelegate.showHidePreferencePanle(_:))
22 static let openNewBrowser = #selector(AppDelegate.openNewBrowser(_:))
23 static let selectBookmark = #selector(AppDelegate.selectBookmark(_:))
24 static let showWindowAduster = #selector(AppDelegate.showWindowAduster(_:))
26 static let saveDocument = #selector(AppDelegate.saveDocument(_:))
27 static let openDocument = #selector(AppDelegate.openDocument(_:))
28 static let removeDatabaseFile = #selector(AppDelegate.removeDatabaseFile(_:))
29 static let showShipWindow = #selector(AppDelegate.showShipWindow(_:))
30 static let showEquipmentWindow = #selector(AppDelegate.showEquipmentWindow(_:))
31 static let showMapWindow = #selector(AppDelegate.showMapWindow(_:))
32 static let showOwnershipShipWindow = #selector(AppDelegate.showOwnershipShipWindow(_:))
36 class AppDelegate: NSObject {
37 static var shared: AppDelegate {
38 return NSApplication.shared().delegate as! AppDelegate // swiftlint:disable:this force_cast
40 let appNameForUserAgent: String = "Version/9.1.2 Safari/601.7.7"
41 let fleetManager: FleetManager = FleetManager()
43 private let historyCleanNotifer = PeriodicNotifier(hour: 0, minutes: 7)
44 private let jsonTracker = JSONTracker()
45 private let timeSignalNotifier = TimeSignalNotifier()
46 private let resourceHistory = ResourceHistoryManager()
48 fileprivate let browserWindowController = BroserWindowController()
51 let jsonViewWindowController: JSONViewWindowController? = {
52 let vc = JSONViewWindowController()
57 private let jsonViewWindowController: JSONViewWindowController? = nil
61 private let uiTestWindowController: UITestWindowController? = {
62 let vc = UITestWindowController()
67 private let uiTestWindowController: UITestWindowController? = nil
72 @IBOutlet var debugMenuItem: NSMenuItem!
73 @IBOutlet var billingWindowMenuItem: NSMenuItem!
75 fileprivate lazy var historyWindowController: HistoryWindowController = {
76 HistoryWindowController()
78 fileprivate lazy var slotItemWindowController: SlotItemWindowController = {
79 SlotItemWindowController()
81 fileprivate lazy var preferencePanelController: PreferencePanelController = {
82 PreferencePanelController()
84 fileprivate lazy var upgradableShipWindowController: UpgradableShipsWindowController = {
85 UpgradableShipsWindowController()
87 fileprivate lazy var airBaseWindowController: AirBaseWindowController = {
88 AirBaseWindowController()
90 fileprivate lazy var browserContentAdjuster: BrowserContentAdjuster = {
91 BrowserContentAdjuster()
93 fileprivate(set) lazy var screenshotListWindowController: ScreenshotListWindowController = {
94 let wc = ScreenshotListWindowController()
99 fileprivate lazy var shipWindowController: ShipWindowController = {
100 ShipWindowController()
102 fileprivate lazy var shipMDWindowController: ShipMasterDetailWindowController = {
103 ShipMasterDetailWindowController()
105 fileprivate lazy var equipmentWindowController: EquipmentWindowController = {
106 EquipmentWindowController()
108 fileprivate lazy var mapWindowController: MapWindowController = {
109 MapWindowController()
112 private var browserWindowControllers: [ExternalBrowserWindowController] = []
113 private var updaters: [() -> Void] = []
114 fileprivate var logedJSONViewWindowController: JSONViewWindowController?
115 private var isLoadedMainMenu = false
117 var screenShotSaveDirectory: String {
119 return UserDefaults.standard.screenShotSaveDirectory ?? ApplicationDirecrories.pictures.path
122 UserDefaults.standard.screenShotSaveDirectory = newValue
125 var screenShotSaveDirectoryURL: URL {
126 return URL(fileURLWithPath: screenShotSaveDirectory)
128 dynamic var monospaceSystemFont11: NSFont {
129 return NSFont.monospacedDigitSystemFont(ofSize: 11, weight: NSFontWeightRegular)
131 dynamic var monospaceSystemFont12: NSFont {
132 return NSFont.monospacedDigitSystemFont(ofSize: 12, weight: NSFontWeightRegular)
134 dynamic var monospaceSystemFont13: NSFont {
135 return NSFont.monospacedDigitSystemFont(ofSize: 13, weight: NSFontWeightRegular)
139 override func awakeFromNib() {
140 if isLoadedMainMenu { return }
141 isLoadedMainMenu = true
143 ValueTransformerRegister.registerAll()
144 UserDefaults.registerAllDefaults()
145 CustomHTTPProtocol.start()
146 CommandRegister.register()
148 let _ = BookmarkManager.shared()
149 let _ = screenshotListWindowController
150 browserWindowController.showWindow(nil)
151 if !UserDefaults.standard.showsDebugMenu { debugMenuItem.isHidden = true }
152 NotificationCenter.default
153 .addObserver(forName: .Periodic, object: historyCleanNotifer, queue: nil) { _ in
154 HistoryItemCleaner().cleanOldHistoryItems()
158 func addCounterUpdate(_ updater: @escaping () -> Void) {
159 updaters.append(updater)
162 CustomHTTPProtocol.clearCache()
164 func createNewBrowser() -> ExternalBrowserWindowController {
165 let browser = ExternalBrowserWindowController()
166 browserWindowControllers.append(browser)
167 browser.window?.makeKeyAndOrderFront(nil)
168 var token: NSObjectProtocol! = nil
169 token = NotificationCenter.default
170 .addObserver(forName: .NSWindowWillClose,
171 object: browser.window,
172 queue: nil) { [unowned self] notification in
173 NotificationCenter.default.removeObserver(token)
174 if let obj = notification.object as? NSWindow,
175 let index = self.browserWindowControllers.index(where: { $0.window == obj }) {
176 self.browserWindowControllers.remove(at: index)
182 func fire(_ timer: Timer) {
183 updaters.forEach { $0() }
187 extension AppDelegate {
188 private func isFrontMostWindow(_ window: NSWindow) -> Bool {
189 return window.isVisible && window.isMainWindow
191 private func makeFrontOrOrderOut(_ window: NSWindow?) {
192 guard let window = window else { return }
193 isFrontMostWindow(window) ? window.orderOut(nil) : window.makeKeyAndOrderFront(nil)
195 @IBAction func showHideHistory(_ sender: AnyObject?) {
196 makeFrontOrOrderOut(historyWindowController.window)
198 @IBAction func showHideSlotItemWindow(_ sender: AnyObject?) {
199 makeFrontOrOrderOut(slotItemWindowController.window)
201 @IBAction func showHideUpgradableShipWindow(_ sender: AnyObject?) {
202 makeFrontOrOrderOut(upgradableShipWindowController.window)
204 @IBAction func showHideScreenshotListWindow(_ sender: AnyObject?) {
205 makeFrontOrOrderOut(screenshotListWindowController.window)
207 @IBAction func showHideAirBaseInfoWindow(_ sender: AnyObject?) {
208 makeFrontOrOrderOut(airBaseWindowController.window)
210 @IBAction func showHidePreferencePanle(_ sender: AnyObject?) {
211 makeFrontOrOrderOut(preferencePanelController.window)
213 @IBAction func showWindowAduster(_ sender: AnyObject?) {
214 browserContentAdjuster.showWindow(nil)
216 @IBAction func openNewBrowser(_ sender: AnyObject?) {
217 let _ = createNewBrowser()
219 @IBAction func selectBookmark(_ sender: AnyObject?) {
220 let b = createNewBrowser()
221 b.selectBookmark(sender)
223 @IBAction func removeDatabaseFile(_ sender: AnyObject?) {
224 guard let path = Bundle.main.path(forResource: "RemoveDatabaseFileAndRestart", ofType: "app")
225 else { return print("Can not find RemoveDatabaseFileAndRestart.app") }
226 let process = Process()
227 process.launchPath = "/usr/bin/open"
228 process.arguments = [path]
231 @IBAction func showMainBrowser(_ sender: AnyObject?) {
232 browserWindowController.showWindow(nil)
235 @IBAction func showShipWindow(_ sender: AnyObject?) {
236 shipWindowController.showWindow(nil)
238 @IBAction func showEquipmentWindow(_ sender: AnyObject?) {
239 equipmentWindowController.showWindow(nil)
241 @IBAction func showMapWindow(_ sender: AnyObject?) {
242 mapWindowController.showWindow(nil)
244 @IBAction func showOwnershipShipWindow(_ sender: AnyObject?) {
245 shipMDWindowController.showWindow(nil)
248 @IBAction func saveLocalData(_ sender: AnyObject?) {
251 @IBAction func loadLocalData(_ sender: AnyObject?) {
255 @IBAction func saveDocument(_ sender: AnyObject?) {
256 let panel = NSSavePanel()
257 panel.allowedFileTypes = ["plist"]
258 panel.prompt = "Save Panel"
259 panel.title = "Save Panel"
261 guard $0 == NSModalResponseOK,
263 let array = self.jsonViewWindowController?.commands
265 let data = NSKeyedArchiver.archivedData(withRootObject: array)
267 try data.write(to: url)
268 } catch { print("Can not write to \(url)") }
271 @IBAction func openDocument(_ sender: AnyObject?) {
272 let panel = NSOpenPanel()
273 panel.allowedFileTypes = ["plist"]
274 panel.allowsMultipleSelection = false
275 panel.prompt = "Open log"
276 panel.title = "Open log"
278 guard $0 == NSModalResponseOK,
282 let data = try Data(contentsOf: url)
283 let array = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data as NSData)
284 guard let commands = array as? [[String: Any]]
287 self.logedJSONViewWindowController = JSONViewWindowController()
288 self.logedJSONViewWindowController?.commands = commands
289 self.logedJSONViewWindowController?.window?.title = "SAVED LOG FILE VIEWER"
290 self.logedJSONViewWindowController?.showWindow(nil)
291 } catch { print("Can not load \(url)") }
295 private func setTitle(_ menuItem: NSMenuItem,
298 _ hideLabel: String) {
299 guard let window = window else { return }
300 if isFrontMostWindow(window) {
301 menuItem.title = hideLabel
303 menuItem.title = showLabel
306 // swiftlint:disable function_body_length
307 override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
308 guard let action = menuItem.action else { return false }
310 case Selector.showHideHistory:
312 historyWindowController.window,
313 NSLocalizedString("Show History", comment: "Show History"),
314 NSLocalizedString("Hide History", comment: "Hide History"))
316 case Selector.showHideSlotItemWindow:
318 slotItemWindowController.window,
319 NSLocalizedString("Show Slot Item", comment: "Show Slot Item"),
320 NSLocalizedString("Hide Slot Item", comment: "Hide Slot Item"))
322 case Selector.showHideUpgradableShipWindow:
324 upgradableShipWindowController.window,
325 NSLocalizedString("Show Upgradable Ships", comment: "Show Upgradable Ships"),
326 NSLocalizedString("Hide Upgradable Ships", comment: "Hide Upgradable Ships"))
328 case Selector.showHideScreenshotListWindow:
330 screenshotListWindowController.window,
331 NSLocalizedString("Show Screenshot List", comment: "Show Screenshot List"),
332 NSLocalizedString("Hide Screenshot List", comment: "Hide Screenshot List"))
334 case Selector.showHideAirBaseInfoWindow:
336 airBaseWindowController.window,
337 NSLocalizedString("Show Air Base Info", comment: "Show Air Base Info"),
338 NSLocalizedString("Hide Air Base Info", comment: "Hide Air Base Info"))
340 case Selector.saveLocalData, Selector.loadLocalData:
342 case Selector.showHidePreferencePanle:
344 case Selector.openNewBrowser:
346 case Selector.selectBookmark:
348 case Selector.showWindowAduster:
350 case Selector.saveDocument, Selector.openDocument:
351 return jsonViewWindowController != nil
352 case Selector.removeDatabaseFile:
354 case Selector.showShipWindow, Selector.showEquipmentWindow,
355 Selector.showMapWindow, Selector.showOwnershipShipWindow:
363 extension AppDelegate: NSApplicationDelegate {
364 func applicationWillFinishLaunching(_ notification: Notification) {
365 NSUserNotificationCenter.default.delegate = self
366 Timer.scheduledTimer(timeInterval: 0.33,
368 selector: .fireInAppDelegate,
372 func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
377 extension AppDelegate: NSUserNotificationCenterDelegate {
378 func userNotificationCenter(_ center: NSUserNotificationCenter,
379 shouldPresent notification: NSUserNotification) -> Bool {
384 @available(OSX 10.12.2, *)
385 fileprivate var objectForTouchBar: [Int: NSTouchBar] = [:]
387 @available(OSX 10.12.2, *)
388 extension AppDelegate: NSTouchBarProvider {
389 @IBOutlet var mainTouchBar: NSTouchBar? {
391 return objectForTouchBar[hash]
394 objectForTouchBar[hash] = newValue
398 var touchBar: NSTouchBar? {
400 let mainWindow = NSApplication.shared().mainWindow
401 if mainWindow == self.browserWindowController.window { return nil }
402 if let _ = mainTouchBar {
405 var topLevel: NSArray = []
406 Bundle.main.loadNibNamed("MainTouchBar",
408 topLevelObjects: &topLevel)