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()
23 let jsonViewWindowController: JSONViewWindowController? = nil
27 private let uiTestWindowController: UITestWindowController? = {
29 let vc = UITestWindowController()
34 private let uiTestWindowController: UITestWindowController? = nil
38 private lazy var historyWindowController: HistoryWindowController = {
40 HistoryWindowController()
43 private lazy var slotItemWindowController: SlotItemWindowController = {
45 SlotItemWindowController()
48 private lazy var preferencePanelController: PreferencePanelController = {
50 PreferencePanelController()
53 private lazy var upgradableShipWindowController: UpgradableShipsWindowController = {
55 UpgradableShipsWindowController()
58 private lazy var airBaseWindowController: AirBaseWindowController = {
60 AirBaseWindowController()
63 private lazy var browserContentAdjuster: BrowserContentAdjuster = {
65 BrowserContentAdjuster()
68 private(set) lazy var screenshotListWindowController: ScreenshotListWindowController = {
70 let wc = ScreenshotListWindowController()
76 private lazy var shipWindowController: ShipWindowController = {
78 ShipWindowController()
81 private lazy var shipMDWindowController: ShipMasterDetailWindowController = {
83 ShipMasterDetailWindowController()
86 private lazy var equipmentWindowController: EquipmentWindowController = {
88 EquipmentWindowController()
91 private lazy var mapWindowController: MapWindowController = {
96 private var browserWindowControllers: [ExternalBrowserWindowController] = []
97 private var logedJSONViewWindowController: JSONViewWindowController?
99 var canSaveLog: Bool {
101 return jsonViewWindowController != nil
104 var isMainWindowMostFront: Bool {
106 guard let window = browserWindowController.window else { return false }
108 return isFrontMostWindow(window)
113 _ = BookmarkManager.shared
114 _ = screenshotListWindowController
116 browserWindowController.showWindow(nil)
119 func createNewBrowser() -> ExternalBrowserWindowController {
121 let browser = ExternalBrowserWindowController()
122 browserWindowControllers.append(browser)
123 browser.window?.makeKeyAndOrderFront(nil)
125 NotificationCenter.default
126 .addObserverOnce(forName: NSWindow.willCloseNotification, object: browser.window, queue: nil) { [unowned self] notification in
128 if let obj = notification.object as? NSWindow,
129 let index = self.browserWindowControllers.index(where: { $0.window == obj }) {
131 self.browserWindowControllers.remove(at: index)
140 extension WindowManager {
142 private func isFrontMostWindow(_ window: NSWindow) -> Bool {
144 return window.isVisible && window.isMainWindow
147 private func makeFrontOrOrderOut(_ window: NSWindow?) {
149 guard let window = window else { return }
151 isFrontMostWindow(window) ? window.orderOut(nil) : window.makeKeyAndOrderFront(nil)
154 @IBAction func showHideHistory(_ sender: AnyObject?) {
156 makeFrontOrOrderOut(historyWindowController.window)
159 @IBAction func showHideSlotItemWindow(_ sender: AnyObject?) {
161 makeFrontOrOrderOut(slotItemWindowController.window)
164 @IBAction func showHideUpgradableShipWindow(_ sender: AnyObject?) {
166 makeFrontOrOrderOut(upgradableShipWindowController.window)
169 @IBAction func showHideScreenshotListWindow(_ sender: AnyObject?) {
171 makeFrontOrOrderOut(screenshotListWindowController.window)
174 @IBAction func showHideAirBaseInfoWindow(_ sender: AnyObject?) {
176 makeFrontOrOrderOut(airBaseWindowController.window)
179 @IBAction func showHidePreferencePanle(_ sender: AnyObject?) {
181 makeFrontOrOrderOut(preferencePanelController.window)
184 @IBAction func showWindowAduster(_ sender: AnyObject?) {
186 browserContentAdjuster.showWindow(nil)
189 @IBAction func openNewBrowser(_ sender: AnyObject?) {
191 _ = createNewBrowser()
194 @IBAction func selectBookmark(_ sender: AnyObject?) {
196 let b = createNewBrowser()
197 b.selectBookmark(sender)
200 @IBAction func showMainBrowser(_ sender: AnyObject?) {
202 browserWindowController.showWindow(nil)
205 @IBAction func showShipWindow(_ sender: AnyObject?) {
207 shipWindowController.showWindow(nil)
210 @IBAction func showEquipmentWindow(_ sender: AnyObject?) {
212 equipmentWindowController.showWindow(nil)
215 @IBAction func showMapWindow(_ sender: AnyObject?) {
217 mapWindowController.showWindow(nil)
220 @IBAction func showOwnershipShipWindow(_ sender: AnyObject?) {
222 shipMDWindowController.showWindow(nil)
225 @IBAction func saveDocument(_ sender: AnyObject?) {
227 let panel = NSSavePanel()
228 panel.allowedFileTypes = ["plist"]
229 panel.prompt = "Save Panel"
230 panel.title = "Save Panel"
234 guard $0 == .OK else { return }
235 guard let url = panel.url else { return }
236 guard let array = self.jsonViewWindowController?.commands else { return }
238 let data = NSKeyedArchiver.archivedData(withRootObject: array)
242 try data.write(to: url)
246 Logger.shared.log("Can not write to \(url)")
251 @IBAction func openDocument(_ sender: AnyObject?) {
253 let panel = NSOpenPanel()
254 panel.allowedFileTypes = ["plist"]
255 panel.allowsMultipleSelection = false
256 panel.prompt = "Open log"
257 panel.title = "Open log"
261 guard $0 == .OK else { return }
262 guard let url = panel.url else { return }
266 let data = try Data(contentsOf: url)
267 let array = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data)
268 guard let commands = array as? [[String: Any]] else { return }
270 self.logedJSONViewWindowController = JSONViewWindowController()
271 self.logedJSONViewWindowController?.commands = commands
272 self.logedJSONViewWindowController?.window?.title = "SAVED LOG FILE VIEWER"
273 self.logedJSONViewWindowController?.showWindow(nil)
277 Logger.shared.log("Can not load \(url)")
282 private func setTitle(to menuItem: NSMenuItem, frontWindow window: NSWindow?, show showLabel: String, hide hideLabel: String) {
284 guard let window = window else { return }
286 if isFrontMostWindow(window) {
288 menuItem.title = hideLabel
292 menuItem.title = showLabel
296 func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
298 guard let action = menuItem.action else { return false }
302 case #selector(WindowManager.showHideHistory(_:)):
303 setTitle(to: menuItem,
304 frontWindow: historyWindowController.window,
305 show: LocalizedStrings.showHistory.string,
306 hide: LocalizedStrings.hideHistory.string)
309 case #selector(WindowManager.showHideSlotItemWindow(_:)):
310 setTitle(to: menuItem,
311 frontWindow: slotItemWindowController.window,
312 show: LocalizedStrings.showSlotItem.string,
313 hide: LocalizedStrings.hideSlotItem.string)
316 case #selector(WindowManager.showHideUpgradableShipWindow(_:)):
317 setTitle(to: menuItem,
318 frontWindow: upgradableShipWindowController.window,
319 show: LocalizedStrings.showUpgradableShips.string,
320 hide: LocalizedStrings.hideUpgradableShips.string)
323 case #selector(WindowManager.showHideScreenshotListWindow(_:)):
324 setTitle(to: menuItem,
325 frontWindow: screenshotListWindowController.window,
326 show: LocalizedStrings.showScreenshotList.string,
327 hide: LocalizedStrings.hideScreenshotList.string)
330 case #selector(WindowManager.showHideAirBaseInfoWindow(_:)):
331 setTitle(to: menuItem,
332 frontWindow: airBaseWindowController.window,
333 show: LocalizedStrings.showAirbaseInfo.string,
334 hide: LocalizedStrings.hideAirbaseInfo.string)
337 case #selector(WindowManager.showHidePreferencePanle(_:)):
340 case #selector(WindowManager.openNewBrowser(_:)):
343 case #selector(WindowManager.selectBookmark(_:)):
346 case #selector(WindowManager.showWindowAduster(_:)):
349 case #selector(WindowManager.showShipWindow(_:)),
350 #selector(WindowManager.showEquipmentWindow(_:)),
351 #selector(WindowManager.showMapWindow(_:)),
352 #selector(WindowManager.showOwnershipShipWindow(_:)):
356 case #selector(WindowManager.saveDocument(_:)),
357 #selector(WindowManager.openDocument(_:)):