import Cocoa
-fileprivate extension Selector {
- static let fireInAppDelegate = #selector(AppDelegate.fire(_:))
-
- static let showHideHistory = #selector(AppDelegate.showHideHistory(_:))
- static let showHideSlotItemWindow = #selector(AppDelegate.showHideSlotItemWindow(_:))
- static let showHideUpgradableShipWindow = #selector(AppDelegate.showHideUpgradableShipWindow(_:))
- static let showHideScreenshotListWindow = #selector(AppDelegate.showHideScreenshotListWindow(_:))
- static let showHideAirBaseInfoWindow = #selector(AppDelegate.showHideAirBaseInfoWindow(_:))
- static let saveLocalData = #selector(AppDelegate.saveLocalData(_:))
- static let loadLocalData = #selector(AppDelegate.loadLocalData(_:))
- static let showHidePreferencePanle = #selector(AppDelegate.showHidePreferencePanle(_:))
- static let openNewBrowser = #selector(AppDelegate.openNewBrowser(_:))
- static let selectBookmark = #selector(AppDelegate.selectBookmark(_:))
- static let showWindowAduster = #selector(AppDelegate.showWindowAduster(_:))
-
- static let saveDocument = #selector(AppDelegate.saveDocument(_:))
- static let openDocument = #selector(AppDelegate.openDocument(_:))
- static let removeDatabaseFile = #selector(AppDelegate.removeDatabaseFile(_:))
- static let showShipWindow = #selector(AppDelegate.showShipWindow(_:))
- static let showEquipmentWindow = #selector(AppDelegate.showEquipmentWindow(_:))
- static let showMapWindow = #selector(AppDelegate.showMapWindow(_:))
- static let showOwnershipShipWindow = #selector(AppDelegate.showOwnershipShipWindow(_:))
-}
-
@NSApplicationMain
-class AppDelegate: NSObject {
+final class AppDelegate: NSObject {
+
static var shared: AppDelegate {
- return NSApplication.shared().delegate as! AppDelegate // swiftlint:disable:this force_cast
+
+ return NSApplication.shared.delegate as! AppDelegate // swiftlint:disable:this force_cast
}
- let appNameForUserAgent: String = "Version/9.1.2 Safari/601.7.7"
- let fleetManager: FleetManager = FleetManager()
+
+ let appNameForUserAgent: String = "KCD(1.9b36) is not Safari/604.4.7"
+ private(set) var fleetManager: FleetManager?
+
+ private let windowManager = WindowManager()
private let historyCleanNotifer = PeriodicNotifier(hour: 0, minutes: 7)
private let jsonTracker = JSONTracker()
private let timeSignalNotifier = TimeSignalNotifier()
private let resourceHistory = ResourceHistoryManager()
- fileprivate let browserWindowController = BroserWindowController()
-
- #if ENABLE_JSON_LOG
- let jsonViewWindowController: JSONViewWindowController? = {
- let vc = JSONViewWindowController()
- vc.showWindow(nil)
- return vc
- }()
- #else
- private let jsonViewWindowController: JSONViewWindowController? = nil
- #endif
-
- #if UI_TEST
- private let uiTestWindowController: UITestWindowController? = {
- let vc = UITestWindowController()
- vc.showWindow(nil)
- return vc
- }()
- #else
- private let uiTestWindowController: UITestWindowController? = nil
- #endif
-
-
// MARK: - Variable
- @IBOutlet var debugMenuItem: NSMenuItem!
- @IBOutlet var billingWindowMenuItem: NSMenuItem!
-
- fileprivate lazy var historyWindowController: HistoryWindowController = {
- HistoryWindowController()
- }()
- fileprivate lazy var slotItemWindowController: SlotItemWindowController = {
- SlotItemWindowController()
- }()
- fileprivate lazy var preferencePanelController: PreferencePanelController = {
- PreferencePanelController()
- }()
- fileprivate lazy var upgradableShipWindowController: UpgradableShipsWindowController = {
- UpgradableShipsWindowController()
- }()
- fileprivate lazy var airBaseWindowController: AirBaseWindowController = {
- AirBaseWindowController()
- }()
- fileprivate lazy var browserContentAdjuster: BrowserContentAdjuster = {
- BrowserContentAdjuster()
- }()
- fileprivate(set) lazy var screenshotListWindowController: ScreenshotListWindowController = {
- let wc = ScreenshotListWindowController()
- let _ = wc.window
- return wc
- }()
-
- fileprivate lazy var shipWindowController: ShipWindowController = {
- ShipWindowController()
- }()
- fileprivate lazy var shipMDWindowController: ShipMasterDetailWindowController = {
- ShipMasterDetailWindowController()
- } ()
- fileprivate lazy var equipmentWindowController: EquipmentWindowController = {
- EquipmentWindowController()
- }()
- fileprivate lazy var mapWindowController: MapWindowController = {
- MapWindowController()
- }()
+ @IBOutlet private var debugMenuItem: NSMenuItem!
+ @IBOutlet private var billingWindowMenuItem: NSMenuItem!
+
+ var jsonViewWindowController: JSONViewWindowController? {
+
+ return windowManager.jsonViewWindowController
+ }
private var browserWindowControllers: [ExternalBrowserWindowController] = []
private var updaters: [() -> Void] = []
- fileprivate var logedJSONViewWindowController: JSONViewWindowController?
- private var isLoadedMainMenu = false
+ private var logedJSONViewWindowController: JSONViewWindowController?
+ private var didLoadedMainMenu = false
var screenShotSaveDirectory: String {
+
get {
- return UserDefaults.standard.screenShotSaveDirectory ?? ApplicationDirecrories.pictures.path
+
+ return UserDefaults.standard[.screenShotSaveDirectory] ?? ApplicationDirecrories.pictures.path
}
set {
- UserDefaults.standard.screenShotSaveDirectory = newValue
+
+ UserDefaults.standard[.screenShotSaveDirectory] = newValue
}
}
+
var screenShotSaveDirectoryURL: URL {
+
return URL(fileURLWithPath: screenShotSaveDirectory)
}
- dynamic var monospaceSystemFont11: NSFont {
- return NSFont.monospacedDigitSystemFont(ofSize: 11, weight: NSFontWeightRegular)
+
+ @objc dynamic var monospaceSystemFont11: NSFont {
+
+ return NSFont.monospacedDigitSystemFont(ofSize: 11, weight: .regular)
}
- dynamic var monospaceSystemFont12: NSFont {
- return NSFont.monospacedDigitSystemFont(ofSize: 12, weight: NSFontWeightRegular)
+
+ @objc dynamic var monospaceSystemFont12: NSFont {
+
+ return NSFont.monospacedDigitSystemFont(ofSize: 12, weight: .regular)
}
- dynamic var monospaceSystemFont13: NSFont {
- return NSFont.monospacedDigitSystemFont(ofSize: 13, weight: NSFontWeightRegular)
+
+ @objc dynamic var monospaceSystemFont13: NSFont {
+
+ return NSFont.monospacedDigitSystemFont(ofSize: 13, weight: .regular)
}
// MARK: - Function
override func awakeFromNib() {
- if isLoadedMainMenu { return }
- isLoadedMainMenu = true
+
+ if didLoadedMainMenu {
+
+ return
+ }
+
+ didLoadedMainMenu = true
+
+ fleetManager = FleetManager()
ValueTransformerRegister.registerAll()
- UserDefaults.registerAllDefaults()
+ UserDefaults.standard.register(defaults: DefaultKeys.defaults)
CustomHTTPProtocol.start()
CommandRegister.register()
- let _ = BookmarkManager.shared()
- let _ = screenshotListWindowController
- browserWindowController.showWindow(nil)
- if !UserDefaults.standard.showsDebugMenu { debugMenuItem.isHidden = true }
+ windowManager.prepair()
+
+ if !UserDefaults.standard[.showsDebugMenu] {
+
+ debugMenuItem.isHidden = true
+ }
+
NotificationCenter.default
- .addObserver(forName: .Periodic, object: historyCleanNotifer, queue: nil) { _ in
- HistoryItemCleaner().cleanOldHistoryItems()
+ .addObserver(forName: .Periodic, object: historyCleanNotifer, queue: nil) { _ in
+
+ HistoryItemCleaner().cleanOldHistoryItems()
}
}
func addCounterUpdate(_ updater: @escaping () -> Void) {
+
updaters.append(updater)
}
+
func clearCache() {
+
CustomHTTPProtocol.clearCache()
}
- func createNewBrowser() -> ExternalBrowserWindowController {
- let browser = ExternalBrowserWindowController()
- browserWindowControllers.append(browser)
- browser.window?.makeKeyAndOrderFront(nil)
- var token: NSObjectProtocol! = nil
- token = NotificationCenter.default
- .addObserver(forName: .NSWindowWillClose,
- object: browser.window,
- queue: nil) { [unowned self] notification in
- NotificationCenter.default.removeObserver(token)
- if let obj = notification.object as? NSWindow,
- let index = self.browserWindowControllers.index(where: { $0.window == obj })
- { self.browserWindowControllers.remove(at: index) }
- }
- return browser
- }
- func fire(_ timer: Timer) {
- updaters.forEach { $0() }
+ func createNewBrowser() -> ExternalBrowserWindowController {
+
+ return windowManager.createNewBrowser()
}
}
+
// MARK: - IBActions
extension AppDelegate {
- private func isFrontMostWindow(_ window: NSWindow) -> Bool {
- return window.isVisible && window.isMainWindow
- }
- private func makeFrontOrOrderOut(_ window: NSWindow?) {
- guard let window = window else { return }
- isFrontMostWindow(window) ? window.orderOut(nil) : window.makeKeyAndOrderFront(nil)
- }
+
@IBAction func showHideHistory(_ sender: AnyObject?) {
- makeFrontOrOrderOut(historyWindowController.window)
+
+ windowManager.showHideHistory(sender)
}
+
@IBAction func showHideSlotItemWindow(_ sender: AnyObject?) {
- makeFrontOrOrderOut(slotItemWindowController.window)
+
+ windowManager.showHideSlotItemWindow(sender)
}
+
@IBAction func showHideUpgradableShipWindow(_ sender: AnyObject?) {
- makeFrontOrOrderOut(upgradableShipWindowController.window)
+
+ windowManager.showHideUpgradableShipWindow(sender)
}
+
@IBAction func showHideScreenshotListWindow(_ sender: AnyObject?) {
- makeFrontOrOrderOut(screenshotListWindowController.window)
+
+ windowManager.showHideScreenshotListWindow(sender)
}
+
@IBAction func showHideAirBaseInfoWindow(_ sender: AnyObject?) {
- makeFrontOrOrderOut(airBaseWindowController.window)
+
+ windowManager.showHideAirBaseInfoWindow(sender)
}
+
@IBAction func showHidePreferencePanle(_ sender: AnyObject?) {
- makeFrontOrOrderOut(preferencePanelController.window)
+
+ windowManager.showHidePreferencePanle(sender)
}
+
@IBAction func showWindowAduster(_ sender: AnyObject?) {
- browserContentAdjuster.showWindow(nil)
+
+ windowManager.showWindowAduster(sender)
}
+
@IBAction func openNewBrowser(_ sender: AnyObject?) {
- let _ = createNewBrowser()
+
+ windowManager.openNewBrowser(sender)
}
+
@IBAction func selectBookmark(_ sender: AnyObject?) {
- let b = createNewBrowser()
- b.selectBookmark(sender)
+
+ windowManager.selectBookmark(sender)
}
+
@IBAction func removeDatabaseFile(_ sender: AnyObject?) {
- guard let path = Bundle.main.path(forResource: "RemoveDatabaseFileAndRestart", ofType: "app")
- else { return print("Can not find RemoveDatabaseFileAndRestart.app") }
+
+ guard let path = Bundle.main.path(forResource: "RemoveDatabaseFileAndRestart", ofType: "app") else {
+
+ Logger.shared.log("Can not find RemoveDatabaseFileAndRestart.app")
+
+ return
+ }
+
let process = Process()
process.launchPath = "/usr/bin/open"
process.arguments = [path]
process.launch()
}
+
@IBAction func showMainBrowser(_ sender: AnyObject?) {
- browserWindowController.showWindow(nil)
+
+ windowManager.showMainBrowser(sender)
}
@IBAction func showShipWindow(_ sender: AnyObject?) {
- shipWindowController.showWindow(nil)
+
+ windowManager.showShipWindow(sender)
}
+
@IBAction func showEquipmentWindow(_ sender: AnyObject?) {
- equipmentWindowController.showWindow(nil)
+
+ windowManager.showEquipmentWindow(sender)
}
+
@IBAction func showMapWindow(_ sender: AnyObject?) {
- mapWindowController.showWindow(nil)
+
+ windowManager.showMapWindow(sender)
}
+
@IBAction func showOwnershipShipWindow(_ sender: AnyObject?) {
- shipMDWindowController.showWindow(nil)
+
+ windowManager.showOwnershipShipWindow(sender)
}
@IBAction func saveLocalData(_ sender: AnyObject?) {
+
TSVSupport().save()
}
+
@IBAction func loadLocalData(_ sender: AnyObject?) {
+
TSVSupport().load()
}
@IBAction func saveDocument(_ sender: AnyObject?) {
- let panel = NSSavePanel()
- panel.allowedFileTypes = ["plist"]
- panel.prompt = "Save Panel"
- panel.title = "Save Panel"
- panel.begin {
- guard $0 == NSModalResponseOK,
- let url = panel.url,
- let array = self.jsonViewWindowController?.commands
- else { return }
- let data = NSKeyedArchiver.archivedData(withRootObject: array)
- do {
- try data.write(to: url)
- } catch { print("Can not write to \(url)") }
- }
+
+ windowManager.saveDocument(sender)
}
+
@IBAction func openDocument(_ sender: AnyObject?) {
- let panel = NSOpenPanel()
- panel.allowedFileTypes = ["plist"]
- panel.allowsMultipleSelection = false
- panel.prompt = "Open log"
- panel.title = "Open log"
- panel.begin {
- guard $0 == NSModalResponseOK,
- let url = panel.url
- else { return }
- do {
- let data = try Data(contentsOf: url)
- let array = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data as NSData)
- guard let commands = array as? [[String: Any]]
- else { return }
-
- self.logedJSONViewWindowController = JSONViewWindowController()
- self.logedJSONViewWindowController?.commands = commands
- self.logedJSONViewWindowController?.window?.title = "SAVED LOG FILE VIEWER"
- self.logedJSONViewWindowController?.showWindow(nil)
- } catch { print("Can not load \(url)") }
- }
+
+ windowManager.openDocument(sender)
}
- private func setTitle(_ menuItem: NSMenuItem,
- _ window: NSWindow?,
- _ showLabel: String,
- _ hideLabel: String) {
- guard let window = window else { return }
- if isFrontMostWindow(window) {
- menuItem.title = hideLabel
- } else {
- menuItem.title = showLabel
- }
+ @IBAction func openInDeckBuilder(_ sender: Any?) {
+
+ DeckBuilder().openDeckBuilder()
}
- // swiftlint:disable function_body_length
+
override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
- guard let action = menuItem.action else { return false }
+
+ guard let action = menuItem.action else {
+
+ return false
+ }
+
switch action {
- case Selector.showHideHistory:
- setTitle(menuItem,
- historyWindowController.window,
- NSLocalizedString("Show History", comment: "Show History"),
- NSLocalizedString("Hide History", comment: "Hide History"))
- return true
- case Selector.showHideSlotItemWindow:
- setTitle(menuItem,
- slotItemWindowController.window,
- NSLocalizedString("Show Slot Item", comment: "Show Slot Item"),
- NSLocalizedString("Hide Slot Item", comment: "Hide Slot Item"))
+
+ case #selector(AppDelegate.saveLocalData(_:)),
+ #selector(AppDelegate.loadLocalData(_:)):
+
return true
- case Selector.showHideUpgradableShipWindow:
- setTitle(menuItem,
- upgradableShipWindowController.window,
- NSLocalizedString("Show Upgradable Ships", comment: "Show Upgradable Ships"),
- NSLocalizedString("Hide Upgradable Ships", comment: "Hide Upgradable Ships"))
+
+ case #selector(AppDelegate.removeDatabaseFile(_:)):
+
return true
- case Selector.showHideScreenshotListWindow:
- setTitle(menuItem,
- screenshotListWindowController.window,
- NSLocalizedString("Show Screenshot List", comment: "Show Screenshot List"),
- NSLocalizedString("Hide Screenshot List", comment: "Hide Screenshot List"))
- return true
- case Selector.showHideAirBaseInfoWindow:
- setTitle(menuItem,
- airBaseWindowController.window,
- NSLocalizedString("Show Air Base Info", comment: "Show Air Base Info"),
- NSLocalizedString("Hide Air Base Info", comment: "Hide Air Base Info"))
- return true
- case Selector.saveLocalData, Selector.loadLocalData:
- return true
- case Selector.showHidePreferencePanle:
- return true
- case Selector.openNewBrowser:
- return true
- case Selector.selectBookmark:
- return true
- case Selector.showWindowAduster:
- return true
- case Selector.saveDocument, Selector.openDocument:
- return jsonViewWindowController != nil
- case Selector.removeDatabaseFile:
- return true
- case Selector.showShipWindow, Selector.showEquipmentWindow,
- Selector.showMapWindow, Selector.showOwnershipShipWindow:
+
+ case #selector(openInDeckBuilder(_:)):
+
return true
+
default:
- return false
+
+ return windowManager.validateMenuItem(menuItem)
}
}
}
extension AppDelegate: NSApplicationDelegate {
+
func applicationWillFinishLaunching(_ notification: Notification) {
- NSUserNotificationCenter.default.delegate = self
- Timer.scheduledTimer(timeInterval: 0.33,
- target: self,
- selector: .fireInAppDelegate,
- userInfo: nil,
- repeats: true)
+
+ if NSEvent.modifierFlags == .option {
+
+ removeDatabaseFile(nil)
+
+ exit(0)
+ }
+
+ Timer.scheduledTimer(withTimeInterval: 0.33, repeats: true) { [weak self] _ in
+
+ self?.updaters.forEach { $0() }
+ }
}
+
func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
+
return true
}
}
extension AppDelegate: NSUserNotificationCenterDelegate {
- func userNotificationCenter(_ center: NSUserNotificationCenter,
- shouldPresent notification: NSUserNotification) -> Bool {
+
+ func userNotificationCenter(_ center: NSUserNotificationCenter, shouldPresent notification: NSUserNotification) -> Bool {
+
return true
}
}
@available(OSX 10.12.2, *)
-fileprivate var objectForTouchBar: [Int: NSTouchBar] = [:]
+private var objectForTouchBar: [Int: NSTouchBar] = [:]
@available(OSX 10.12.2, *)
extension AppDelegate: NSTouchBarProvider {
- @IBOutlet var mainTouchBar: NSTouchBar? {
- get {
- return objectForTouchBar[hash]
- }
- set {
- objectForTouchBar[hash] = newValue
- }
+
+ @IBOutlet private var mainTouchBar: NSTouchBar? {
+
+ get { return objectForTouchBar[hash] }
+ set { objectForTouchBar[hash] = newValue }
}
var touchBar: NSTouchBar? {
+
get {
- let mainWindow = NSApplication.shared().mainWindow
- if mainWindow == self.browserWindowController.window { return nil }
+
+ if windowManager.isMainWindowMostFront {
+
+ return nil
+ }
if let _ = mainTouchBar {
+
return mainTouchBar
}
- var topLevel: NSArray = []
- Bundle.main.loadNibNamed("MainTouchBar",
- owner: self,
- topLevelObjects: &topLevel)
+
+ var topLevel: NSArray?
+ Bundle.main.loadNibNamed(NSNib.Name("MainTouchBar"), owner: self, topLevelObjects: &topLevel)
+
return mainTouchBar
}
set {}