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)
138 func registerScreenshot(_ image: NSBitmapImageRep, fromOnScreen: NSRect) {
140 screenshotListWindowController.registerScreenshot(image, fromOnScreen: fromOnScreen)
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 { return }
156 isFrontMostWindow(window) ? window.orderOut(nil) : window.makeKeyAndOrderFront(nil)
159 @IBAction func showHideHistory(_ sender: AnyObject?) {
161 makeFrontOrOrderOut(historyWindowController.window)
164 @IBAction func showHideSlotItemWindow(_ sender: AnyObject?) {
166 makeFrontOrOrderOut(slotItemWindowController.window)
169 @IBAction func showHideUpgradableShipWindow(_ sender: AnyObject?) {
171 makeFrontOrOrderOut(upgradableShipWindowController.window)
174 @IBAction func showHideScreenshotListWindow(_ sender: AnyObject?) {
176 makeFrontOrOrderOut(screenshotListWindowController.window)
179 @IBAction func showHideAirBaseInfoWindow(_ sender: AnyObject?) {
181 makeFrontOrOrderOut(airBaseWindowController.window)
184 @IBAction func showHidePreferencePanle(_ sender: AnyObject?) {
186 makeFrontOrOrderOut(preferencePanelController.window)
189 @IBAction func showWindowAduster(_ sender: AnyObject?) {
191 browserContentAdjuster.showWindow(nil)
194 @IBAction func openNewBrowser(_ sender: AnyObject?) {
196 _ = createNewBrowser()
199 @IBAction func selectBookmark(_ sender: AnyObject?) {
201 let b = createNewBrowser()
202 b.selectBookmark(sender)
205 @IBAction func showMainBrowser(_ sender: AnyObject?) {
207 browserWindowController.showWindow(nil)
210 @IBAction func showShipWindow(_ sender: AnyObject?) {
212 shipWindowController.showWindow(nil)
215 @IBAction func showEquipmentWindow(_ sender: AnyObject?) {
217 equipmentWindowController.showWindow(nil)
220 @IBAction func showMapWindow(_ sender: AnyObject?) {
222 mapWindowController.showWindow(nil)
225 @IBAction func showOwnershipShipWindow(_ sender: AnyObject?) {
227 shipMDWindowController.showWindow(nil)
230 @IBAction func saveDocument(_ sender: AnyObject?) {
232 let panel = NSSavePanel()
233 panel.allowedFileTypes = ["plist"]
234 panel.prompt = "Save Panel"
235 panel.title = "Save Panel"
239 guard $0 == .OK else { return }
240 guard let url = panel.url else { return }
241 guard let array = self.jsonViewWindowController?.commands else { return }
243 let data = NSKeyedArchiver.archivedData(withRootObject: array)
247 try data.write(to: url)
251 Logger.shared.log("Can not write to \(url)")
256 @IBAction func openDocument(_ sender: AnyObject?) {
258 let panel = NSOpenPanel()
259 panel.allowedFileTypes = ["plist"]
260 panel.allowsMultipleSelection = false
261 panel.prompt = "Open log"
262 panel.title = "Open log"
266 guard $0 == .OK else { return }
267 guard let url = panel.url else { return }
271 let data = try Data(contentsOf: url)
272 let array = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data)
273 guard let commands = array as? [[String: Any]] else { return }
275 self.logedJSONViewWindowController = JSONViewWindowController()
276 self.logedJSONViewWindowController?.commands = commands
277 self.logedJSONViewWindowController?.window?.title = "SAVED LOG FILE VIEWER"
278 self.logedJSONViewWindowController?.showWindow(nil)
282 Logger.shared.log("Can not load \(url)")
287 private func setTitle(_ menuItem: NSMenuItem, _ window: NSWindow?, _ showLabel: String, _ hideLabel: String) {
289 guard let window = window else { return }
291 if isFrontMostWindow(window) {
293 menuItem.title = hideLabel
297 menuItem.title = showLabel
301 func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
303 guard let action = menuItem.action else { return false }
307 case #selector(WindowManager.showHideHistory(_:)):
309 historyWindowController.window,
310 LocalizedStrings.showHistory.string,
311 LocalizedStrings.hideHistory.string)
314 case #selector(WindowManager.showHideSlotItemWindow(_:)):
316 slotItemWindowController.window,
317 LocalizedStrings.showSlotItem.string,
318 LocalizedStrings.hideSlotItem.string)
321 case #selector(WindowManager.showHideUpgradableShipWindow(_:)):
323 upgradableShipWindowController.window,
324 LocalizedStrings.showUpgradableShips.string,
325 LocalizedStrings.hideUpgradableShips.string)
328 case #selector(WindowManager.showHideScreenshotListWindow(_:)):
330 screenshotListWindowController.window,
331 LocalizedStrings.showScreenshotList.string,
332 LocalizedStrings.hideScreenshotList.string)
335 case #selector(WindowManager.showHideAirBaseInfoWindow(_:)):
337 airBaseWindowController.window,
338 LocalizedStrings.showAirbaseInfo.string,
339 LocalizedStrings.hideAirbaseInfo.string)
342 case #selector(WindowManager.showHidePreferencePanle(_:)):
345 case #selector(WindowManager.openNewBrowser(_:)):
348 case #selector(WindowManager.selectBookmark(_:)):
351 case #selector(WindowManager.showWindowAduster(_:)):
354 case #selector(WindowManager.showShipWindow(_:)),
355 #selector(WindowManager.showEquipmentWindow(_:)),
356 #selector(WindowManager.showMapWindow(_:)),
357 #selector(WindowManager.showOwnershipShipWindow(_:)):
361 case #selector(WindowManager.saveDocument(_:)),
362 #selector(WindowManager.openDocument(_:)):