OSDN Git Service

ShipSlotObserverを使用するように変更
[kcd/KCD.git] / KCD / WindowManager.swift
1 //
2 //  WindowManager.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/04/08.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 final class WindowManager {
12     
13     private let browserWindowController = BroserWindowController()
14     
15     #if ENABLE_JSON_LOG
16     let jsonViewWindowController: JSONViewWindowController? = {
17     
18         let vc = JSONViewWindowController()
19         vc.showWindow(nil)
20         return vc
21     }()
22     #else
23     let jsonViewWindowController: JSONViewWindowController? = nil
24     #endif
25     
26     #if UI_TEST
27     private let uiTestWindowController: UITestWindowController? = {
28     
29         let vc = UITestWindowController()
30         vc.showWindow(nil)
31         return vc
32     }()
33     #else
34     private let uiTestWindowController: UITestWindowController? = nil
35     #endif
36     
37     // MARK: - Variable
38     private lazy var historyWindowController: HistoryWindowController = {
39         
40         HistoryWindowController()
41     }()
42     
43     private lazy var slotItemWindowController: SlotItemWindowController = {
44         
45         SlotItemWindowController()
46     }()
47     
48     private lazy var preferencePanelController: PreferencePanelController = {
49         
50         PreferencePanelController()
51     }()
52     
53     private lazy var upgradableShipWindowController: UpgradableShipsWindowController = {
54         
55         UpgradableShipsWindowController()
56     }()
57     
58     private lazy var airBaseWindowController: AirBaseWindowController = {
59         
60         AirBaseWindowController()
61     }()
62     
63     private lazy var browserContentAdjuster: BrowserContentAdjuster = {
64         
65         BrowserContentAdjuster()
66     }()
67     
68     private(set) lazy var screenshotListWindowController: ScreenshotListWindowController = {
69         
70         let wc = ScreenshotListWindowController()
71         _ = wc.window
72         
73         return wc
74     }()
75     
76     private lazy var shipWindowController: ShipWindowController = {
77         
78         ShipWindowController()
79     }()
80     
81     private lazy var shipMDWindowController: ShipMasterDetailWindowController = {
82         
83         ShipMasterDetailWindowController()
84     } ()
85     
86     private lazy var equipmentWindowController: EquipmentWindowController = {
87         
88         EquipmentWindowController()
89     }()
90     
91     private lazy var mapWindowController: MapWindowController = {
92         
93         MapWindowController()
94     }()
95     
96     private var browserWindowControllers: [ExternalBrowserWindowController] = []
97     private var logedJSONViewWindowController: JSONViewWindowController?
98     
99     var canSaveLog: Bool {
100         
101         return jsonViewWindowController != nil
102     }
103     
104     var isMainWindowMostFront: Bool {
105         
106         guard let window = browserWindowController.window else { return false }
107         
108         return isFrontMostWindow(window)
109     }
110     
111     func prepair() {
112         
113         _ = BookmarkManager.shared
114         _ = screenshotListWindowController
115         
116         browserWindowController.showWindow(nil)
117     }
118     
119     func createNewBrowser() -> ExternalBrowserWindowController {
120         
121         let browser = ExternalBrowserWindowController()
122         browserWindowControllers.append(browser)
123         browser.window?.makeKeyAndOrderFront(nil)
124         
125         NotificationCenter.default
126             .addObserverOnce(forName: NSWindow.willCloseNotification, object: browser.window, queue: nil) { [unowned self] notification in
127                 
128                 if let obj = notification.object as? NSWindow,
129                     let index = self.browserWindowControllers.index(where: { $0.window == obj }) {
130                     
131                     self.browserWindowControllers.remove(at: index)
132                 }
133         }
134         
135         return browser
136     }
137     
138     func registerScreenshot(_ image: NSBitmapImageRep, fromOnScreen: NSRect) {
139         
140         screenshotListWindowController.registerScreenshot(image, fromOnScreen: fromOnScreen)
141     }
142 }
143
144 // MARK: - IBActions
145 extension WindowManager {
146     
147     private func isFrontMostWindow(_ window: NSWindow) -> Bool {
148         
149         return window.isVisible && window.isMainWindow
150     }
151     
152     private func makeFrontOrOrderOut(_ window: NSWindow?) {
153         
154         guard let window = window else { return }
155         
156         isFrontMostWindow(window) ? window.orderOut(nil) : window.makeKeyAndOrderFront(nil)
157     }
158     
159     @IBAction func showHideHistory(_ sender: AnyObject?) {
160         
161         makeFrontOrOrderOut(historyWindowController.window)
162     }
163     
164     @IBAction func showHideSlotItemWindow(_ sender: AnyObject?) {
165         
166         makeFrontOrOrderOut(slotItemWindowController.window)
167     }
168     
169     @IBAction func showHideUpgradableShipWindow(_ sender: AnyObject?) {
170         
171         makeFrontOrOrderOut(upgradableShipWindowController.window)
172     }
173     
174     @IBAction func showHideScreenshotListWindow(_ sender: AnyObject?) {
175         
176         makeFrontOrOrderOut(screenshotListWindowController.window)
177     }
178     
179     @IBAction func showHideAirBaseInfoWindow(_ sender: AnyObject?) {
180         
181         makeFrontOrOrderOut(airBaseWindowController.window)
182     }
183     
184     @IBAction func showHidePreferencePanle(_ sender: AnyObject?) {
185         
186         makeFrontOrOrderOut(preferencePanelController.window)
187     }
188     
189     @IBAction func showWindowAduster(_ sender: AnyObject?) {
190         
191         browserContentAdjuster.showWindow(nil)
192     }
193     
194     @IBAction func openNewBrowser(_ sender: AnyObject?) {
195         
196         _ = createNewBrowser()
197     }
198     
199     @IBAction func selectBookmark(_ sender: AnyObject?) {
200         
201         let b = createNewBrowser()
202         b.selectBookmark(sender)
203     }
204     
205     @IBAction func showMainBrowser(_ sender: AnyObject?) {
206         
207         browserWindowController.showWindow(nil)
208     }
209     
210     @IBAction func showShipWindow(_ sender: AnyObject?) {
211         
212         shipWindowController.showWindow(nil)
213     }
214     
215     @IBAction func showEquipmentWindow(_ sender: AnyObject?) {
216         
217         equipmentWindowController.showWindow(nil)
218     }
219     
220     @IBAction func showMapWindow(_ sender: AnyObject?) {
221         
222         mapWindowController.showWindow(nil)
223     }
224     
225     @IBAction func showOwnershipShipWindow(_ sender: AnyObject?) {
226         
227         shipMDWindowController.showWindow(nil)
228     }
229     
230     @IBAction func saveDocument(_ sender: AnyObject?) {
231         
232         let panel = NSSavePanel()
233         panel.allowedFileTypes = ["plist"]
234         panel.prompt = "Save Panel"
235         panel.title = "Save Panel"
236         
237         panel.begin {
238             
239             guard $0 == .OK else { return }
240             guard let url = panel.url else { return }
241             guard let array = self.jsonViewWindowController?.commands else { return }
242             
243             let data = NSKeyedArchiver.archivedData(withRootObject: array)
244             
245             do {
246                 
247                 try data.write(to: url)
248                 
249             } catch {
250                 
251                 Logger.shared.log("Can not write to \(url)")
252             }
253         }
254     }
255     
256     @IBAction func openDocument(_ sender: AnyObject?) {
257         
258         let panel = NSOpenPanel()
259         panel.allowedFileTypes = ["plist"]
260         panel.allowsMultipleSelection = false
261         panel.prompt = "Open log"
262         panel.title = "Open log"
263         
264         panel.begin {
265             
266             guard $0 == .OK else { return }
267             guard let url = panel.url else { return }
268             
269             do {
270                 
271                 let data = try Data(contentsOf: url)
272                 let array = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data)
273                 guard let commands = array as? [[String: Any]] else { return }
274                 
275                 self.logedJSONViewWindowController = JSONViewWindowController()
276                 self.logedJSONViewWindowController?.commands = commands
277                 self.logedJSONViewWindowController?.window?.title = "SAVED LOG FILE VIEWER"
278                 self.logedJSONViewWindowController?.showWindow(nil)
279                 
280             } catch {
281                 
282                 Logger.shared.log("Can not load \(url)")
283             }
284         }
285     }
286     
287     private func setTitle(to menuItem: NSMenuItem, frontWindow window: NSWindow?, show showLabel: String, hide hideLabel: String) {
288         
289         guard let window = window else { return }
290         
291         if isFrontMostWindow(window) {
292             
293             menuItem.title = hideLabel
294             
295         } else {
296             
297             menuItem.title = showLabel
298         }
299     }
300     
301     func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
302         
303         guard let action = menuItem.action else { return false }
304         
305         switch action {
306             
307         case #selector(WindowManager.showHideHistory(_:)):
308             setTitle(to: menuItem,
309                      frontWindow: historyWindowController.window,
310                      show: LocalizedStrings.showHistory.string,
311                      hide: LocalizedStrings.hideHistory.string)
312             return true
313             
314         case #selector(WindowManager.showHideSlotItemWindow(_:)):
315             setTitle(to: menuItem,
316                      frontWindow: slotItemWindowController.window,
317                      show: LocalizedStrings.showSlotItem.string,
318                      hide: LocalizedStrings.hideSlotItem.string)
319             return true
320             
321         case #selector(WindowManager.showHideUpgradableShipWindow(_:)):
322             setTitle(to: menuItem,
323                      frontWindow: upgradableShipWindowController.window,
324                      show: LocalizedStrings.showUpgradableShips.string,
325                      hide: LocalizedStrings.hideUpgradableShips.string)
326             return true
327             
328         case #selector(WindowManager.showHideScreenshotListWindow(_:)):
329             setTitle(to: menuItem,
330                      frontWindow: screenshotListWindowController.window,
331                      show: LocalizedStrings.showScreenshotList.string,
332                      hide: LocalizedStrings.hideScreenshotList.string)
333             return true
334             
335         case #selector(WindowManager.showHideAirBaseInfoWindow(_:)):
336             setTitle(to: menuItem,
337                      frontWindow: airBaseWindowController.window,
338                      show: LocalizedStrings.showAirbaseInfo.string,
339                      hide: LocalizedStrings.hideAirbaseInfo.string)
340             return true
341             
342         case #selector(WindowManager.showHidePreferencePanle(_:)):
343             return true
344             
345         case #selector(WindowManager.openNewBrowser(_:)):
346             return true
347             
348         case #selector(WindowManager.selectBookmark(_:)):
349             return true
350             
351         case #selector(WindowManager.showWindowAduster(_:)):
352             return true
353             
354         case #selector(WindowManager.showShipWindow(_:)),
355              #selector(WindowManager.showEquipmentWindow(_:)),
356              #selector(WindowManager.showMapWindow(_:)),
357              #selector(WindowManager.showOwnershipShipWindow(_:)):
358             
359             return true
360             
361         case #selector(WindowManager.saveDocument(_:)),
362              #selector(WindowManager.openDocument(_:)):
363             
364             return canSaveLog
365             
366         default:
367             return false
368         }
369     }
370 }