X-Git-Url: http://git.osdn.net/view?p=kcd%2FKCD.git;a=blobdiff_plain;f=KCD%2FAppDelegate.swift;h=f4fba398fd6385efc00658963f5d3552630af8ab;hp=389e9812bc9a5f69ec098cc468766d421ebfa4d1;hb=127f6d561a45c79e630b251d1ff2ef89a3d5ad06;hpb=9c4f6a4cceb486bc24d0c32bffd4f9c4389e59ae diff --git a/KCD/AppDelegate.swift b/KCD/AppDelegate.swift index 389e9812..f4fba398 100644 --- a/KCD/AppDelegate.swift +++ b/KCD/AppDelegate.swift @@ -8,376 +8,318 @@ 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 + + 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! - - private lazy var historyWindowController: HistoryWindowController = { HistoryWindowController() }() - private lazy var slotItemWindowController: SlotItemWindowController = { SlotItemWindowController() }() - private lazy var preferencePanelController: PreferencePanelController = { PreferencePanelController() }() - private lazy var upgradableShipWindowController: UpgradableShipsWindowController = { UpgradableShipsWindowController() }() - private lazy var airBaseWindowController: AirBaseWindowController = { AirBaseWindowController() }() - private lazy var browserContentAdjuster: BrowserContentAdjuster = { BrowserContentAdjuster() }() - private(set) lazy var screenshotListWindowController: ScreenshotListWindowController = { - let wc = ScreenshotListWindowController() - let _ = wc.window - return wc - }() - - private lazy var shipWindowController: ShipWindowController = { ShipWindowController() }() - private lazy var shipMDWindowController: ShipMasterDetailWindowController = { ShipMasterDetailWindowController() } () - private lazy var equipmentWindowController: EquipmentWindowController = { EquipmentWindowController() }() - private 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] = [] private var logedJSONViewWindowController: JSONViewWindowController? - private var isLoadedMainMenu = false + 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 { - // MARK: - IBActions - 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) - - self.logedJSONViewWindowController = JSONViewWindowController() - self.logedJSONViewWindowController?.commands = array as! NSMutableArray - 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() } + 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")) + + case #selector(AppDelegate.saveLocalData(_:)), + #selector(AppDelegate.loadLocalData(_:)): + 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.removeDatabaseFile(_:)): + 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")) - 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 { + 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 {}