5 // Created by Hori,Masaki on 2017/04/08.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
11 final class WindowManager {
13 private let browserWindowController = BroserWindowController()
16 let jsonViewWindowController: JSONViewWindowController? = {
18 let vc = JSONViewWindowController()
24 let jsonViewWindowController: JSONViewWindowController? = nil
28 private let uiTestWindowController: UITestWindowController? = {
30 let vc = UITestWindowController()
36 private let uiTestWindowController: UITestWindowController? = nil
40 private lazy var historyWindowController: HistoryWindowController = {
42 HistoryWindowController()
45 private lazy var slotItemWindowController: SlotItemWindowController = {
47 SlotItemWindowController()
50 private lazy var preferencePanelController: PreferencePanelController = {
52 PreferencePanelController()
55 private lazy var upgradableShipWindowController: UpgradableShipsWindowController = {
57 UpgradableShipsWindowController()
60 private lazy var airBaseWindowController: AirBaseWindowController = {
62 AirBaseWindowController()
65 private lazy var browserContentAdjuster: BrowserContentAdjuster = {
67 BrowserContentAdjuster()
70 private(set) lazy var screenshotListWindowController: ScreenshotListWindowController = {
72 let wc = ScreenshotListWindowController()
78 private lazy var shipWindowController: ShipWindowController = {
80 ShipWindowController()
83 private lazy var shipMDWindowController: ShipMasterDetailWindowController = {
85 ShipMasterDetailWindowController()
88 private lazy var equipmentWindowController: EquipmentWindowController = {
90 EquipmentWindowController()
93 private lazy var mapWindowController: MapWindowController = {
98 private var browserWindowControllers: [ExternalBrowserWindowController] = []
99 private var logedJSONViewWindowController: JSONViewWindowController?
101 var canSaveLog: Bool {
103 return jsonViewWindowController != nil
106 var isMainWindowMostFront: Bool {
108 guard let window = browserWindowController.window else {
113 return isFrontMostWindow(window)
118 _ = BookmarkManager.shared
119 _ = screenshotListWindowController
121 browserWindowController.showWindow(nil)
124 func createNewBrowser() -> ExternalBrowserWindowController {
126 let browser = ExternalBrowserWindowController()
127 browserWindowControllers.append(browser)
128 browser.window?.makeKeyAndOrderFront(nil)
130 NotificationCenter.default
131 .addObserverOnce(forName: NSWindow.willCloseNotification, object: browser.window, queue: nil) { [unowned self] notification in
133 if let obj = notification.object as? NSWindow,
134 let index = self.browserWindowControllers.index(where: { $0.window == obj }) {
136 self.browserWindowControllers.remove(at: index)
145 extension WindowManager {
147 private func isFrontMostWindow(_ window: NSWindow) -> Bool {
149 return window.isVisible && window.isMainWindow
152 private func makeFrontOrOrderOut(_ window: NSWindow?) {
154 guard let window = window else {
159 isFrontMostWindow(window) ? window.orderOut(nil) : window.makeKeyAndOrderFront(nil)
162 @IBAction func showHideHistory(_ sender: AnyObject?) {
164 makeFrontOrOrderOut(historyWindowController.window)
167 @IBAction func showHideSlotItemWindow(_ sender: AnyObject?) {
169 makeFrontOrOrderOut(slotItemWindowController.window)
172 @IBAction func showHideUpgradableShipWindow(_ sender: AnyObject?) {
174 makeFrontOrOrderOut(upgradableShipWindowController.window)
177 @IBAction func showHideScreenshotListWindow(_ sender: AnyObject?) {
179 makeFrontOrOrderOut(screenshotListWindowController.window)
182 @IBAction func showHideAirBaseInfoWindow(_ sender: AnyObject?) {
184 makeFrontOrOrderOut(airBaseWindowController.window)
187 @IBAction func showHidePreferencePanle(_ sender: AnyObject?) {
189 makeFrontOrOrderOut(preferencePanelController.window)
192 @IBAction func showWindowAduster(_ sender: AnyObject?) {
194 browserContentAdjuster.showWindow(nil)
197 @IBAction func openNewBrowser(_ sender: AnyObject?) {
199 _ = createNewBrowser()
202 @IBAction func selectBookmark(_ sender: AnyObject?) {
204 let b = createNewBrowser()
205 b.selectBookmark(sender)
208 @IBAction func showMainBrowser(_ sender: AnyObject?) {
210 browserWindowController.showWindow(nil)
213 @IBAction func showShipWindow(_ sender: AnyObject?) {
215 shipWindowController.showWindow(nil)
218 @IBAction func showEquipmentWindow(_ sender: AnyObject?) {
220 equipmentWindowController.showWindow(nil)
223 @IBAction func showMapWindow(_ sender: AnyObject?) {
225 mapWindowController.showWindow(nil)
228 @IBAction func showOwnershipShipWindow(_ sender: AnyObject?) {
230 shipMDWindowController.showWindow(nil)
233 @IBAction func saveDocument(_ sender: AnyObject?) {
235 let panel = NSSavePanel()
236 panel.allowedFileTypes = ["plist"]
237 panel.prompt = "Save Panel"
238 panel.title = "Save Panel"
242 guard $0 == .OK else {
246 guard let url = panel.url else {
250 guard let array = self.jsonViewWindowController?.commands else {
255 let data = NSKeyedArchiver.archivedData(withRootObject: array)
259 try data.write(to: url)
263 Logger.shared.log("Can not write to \(url)")
268 @IBAction func openDocument(_ sender: AnyObject?) {
270 let panel = NSOpenPanel()
271 panel.allowedFileTypes = ["plist"]
272 panel.allowsMultipleSelection = false
273 panel.prompt = "Open log"
274 panel.title = "Open log"
278 guard $0 == .OK else {
282 guard let url = panel.url else {
289 let data = try Data(contentsOf: url)
290 let array = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data)
291 guard let commands = array as? [[String: Any]] else {
296 self.logedJSONViewWindowController = JSONViewWindowController()
297 self.logedJSONViewWindowController?.commands = commands
298 self.logedJSONViewWindowController?.window?.title = "SAVED LOG FILE VIEWER"
299 self.logedJSONViewWindowController?.showWindow(nil)
303 Logger.shared.log("Can not load \(url)")
308 private func setTitle(to menuItem: NSMenuItem, frontWindow window: NSWindow?, show showLabel: String, hide hideLabel: String) {
310 guard let window = window else {
315 if isFrontMostWindow(window) {
317 menuItem.title = hideLabel
321 menuItem.title = showLabel
325 func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
327 guard let action = menuItem.action else {
334 case #selector(WindowManager.showHideHistory(_:)):
336 setTitle(to: menuItem,
337 frontWindow: historyWindowController.window,
338 show: LocalizedStrings.showHistory.string,
339 hide: LocalizedStrings.hideHistory.string)
343 case #selector(WindowManager.showHideSlotItemWindow(_:)):
345 setTitle(to: menuItem,
346 frontWindow: slotItemWindowController.window,
347 show: LocalizedStrings.showSlotItem.string,
348 hide: LocalizedStrings.hideSlotItem.string)
352 case #selector(WindowManager.showHideUpgradableShipWindow(_:)):
354 setTitle(to: menuItem,
355 frontWindow: upgradableShipWindowController.window,
356 show: LocalizedStrings.showUpgradableShips.string,
357 hide: LocalizedStrings.hideUpgradableShips.string)
361 case #selector(WindowManager.showHideScreenshotListWindow(_:)):
363 setTitle(to: menuItem,
364 frontWindow: screenshotListWindowController.window,
365 show: LocalizedStrings.showScreenshotList.string,
366 hide: LocalizedStrings.hideScreenshotList.string)
370 case #selector(WindowManager.showHideAirBaseInfoWindow(_:)):
372 setTitle(to: menuItem,
373 frontWindow: airBaseWindowController.window,
374 show: LocalizedStrings.showAirbaseInfo.string,
375 hide: LocalizedStrings.hideAirbaseInfo.string)
379 case #selector(WindowManager.showHidePreferencePanle(_:)):
383 case #selector(WindowManager.openNewBrowser(_:)):
387 case #selector(WindowManager.selectBookmark(_:)):
391 case #selector(WindowManager.showWindowAduster(_:)):
395 case #selector(WindowManager.showShipWindow(_:)),
396 #selector(WindowManager.showEquipmentWindow(_:)),
397 #selector(WindowManager.showMapWindow(_:)),
398 #selector(WindowManager.showOwnershipShipWindow(_:)):
402 case #selector(WindowManager.saveDocument(_:)),
403 #selector(WindowManager.openDocument(_:)):