OSDN Git Service

Doutakuを導入
[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
139 // MARK: - IBActions
140 extension WindowManager {
141     
142     private func isFrontMostWindow(_ window: NSWindow) -> Bool {
143         
144         return window.isVisible && window.isMainWindow
145     }
146     
147     private func makeFrontOrOrderOut(_ window: NSWindow?) {
148         
149         guard let window = window else { return }
150         
151         isFrontMostWindow(window) ? window.orderOut(nil) : window.makeKeyAndOrderFront(nil)
152     }
153     
154     @IBAction func showHideHistory(_ sender: AnyObject?) {
155         
156         makeFrontOrOrderOut(historyWindowController.window)
157     }
158     
159     @IBAction func showHideSlotItemWindow(_ sender: AnyObject?) {
160         
161         makeFrontOrOrderOut(slotItemWindowController.window)
162     }
163     
164     @IBAction func showHideUpgradableShipWindow(_ sender: AnyObject?) {
165         
166         makeFrontOrOrderOut(upgradableShipWindowController.window)
167     }
168     
169     @IBAction func showHideScreenshotListWindow(_ sender: AnyObject?) {
170         
171         makeFrontOrOrderOut(screenshotListWindowController.window)
172     }
173     
174     @IBAction func showHideAirBaseInfoWindow(_ sender: AnyObject?) {
175         
176         makeFrontOrOrderOut(airBaseWindowController.window)
177     }
178     
179     @IBAction func showHidePreferencePanle(_ sender: AnyObject?) {
180         
181         makeFrontOrOrderOut(preferencePanelController.window)
182     }
183     
184     @IBAction func showWindowAduster(_ sender: AnyObject?) {
185         
186         browserContentAdjuster.showWindow(nil)
187     }
188     
189     @IBAction func openNewBrowser(_ sender: AnyObject?) {
190         
191         _ = createNewBrowser()
192     }
193     
194     @IBAction func selectBookmark(_ sender: AnyObject?) {
195         
196         let b = createNewBrowser()
197         b.selectBookmark(sender)
198     }
199     
200     @IBAction func showMainBrowser(_ sender: AnyObject?) {
201         
202         browserWindowController.showWindow(nil)
203     }
204     
205     @IBAction func showShipWindow(_ sender: AnyObject?) {
206         
207         shipWindowController.showWindow(nil)
208     }
209     
210     @IBAction func showEquipmentWindow(_ sender: AnyObject?) {
211         
212         equipmentWindowController.showWindow(nil)
213     }
214     
215     @IBAction func showMapWindow(_ sender: AnyObject?) {
216         
217         mapWindowController.showWindow(nil)
218     }
219     
220     @IBAction func showOwnershipShipWindow(_ sender: AnyObject?) {
221         
222         shipMDWindowController.showWindow(nil)
223     }
224     
225     @IBAction func saveDocument(_ sender: AnyObject?) {
226         
227         let panel = NSSavePanel()
228         panel.allowedFileTypes = ["plist"]
229         panel.prompt = "Save Panel"
230         panel.title = "Save Panel"
231         
232         panel.begin {
233             
234             guard $0 == .OK else { return }
235             guard let url = panel.url else { return }
236             guard let array = self.jsonViewWindowController?.commands else { return }
237             
238             let data = NSKeyedArchiver.archivedData(withRootObject: array)
239             
240             do {
241                 
242                 try data.write(to: url)
243                 
244             } catch {
245                 
246                 Logger.shared.log("Can not write to \(url)")
247             }
248         }
249     }
250     
251     @IBAction func openDocument(_ sender: AnyObject?) {
252         
253         let panel = NSOpenPanel()
254         panel.allowedFileTypes = ["plist"]
255         panel.allowsMultipleSelection = false
256         panel.prompt = "Open log"
257         panel.title = "Open log"
258         
259         panel.begin {
260             
261             guard $0 == .OK else { return }
262             guard let url = panel.url else { return }
263             
264             do {
265                 
266                 let data = try Data(contentsOf: url)
267                 let array = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data)
268                 guard let commands = array as? [[String: Any]] else { return }
269                 
270                 self.logedJSONViewWindowController = JSONViewWindowController()
271                 self.logedJSONViewWindowController?.commands = commands
272                 self.logedJSONViewWindowController?.window?.title = "SAVED LOG FILE VIEWER"
273                 self.logedJSONViewWindowController?.showWindow(nil)
274                 
275             } catch {
276                 
277                 Logger.shared.log("Can not load \(url)")
278             }
279         }
280     }
281     
282     private func setTitle(to menuItem: NSMenuItem, frontWindow window: NSWindow?, show showLabel: String, hide hideLabel: String) {
283         
284         guard let window = window else { return }
285         
286         if isFrontMostWindow(window) {
287             
288             menuItem.title = hideLabel
289             
290         } else {
291             
292             menuItem.title = showLabel
293         }
294     }
295     
296     func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
297         
298         guard let action = menuItem.action else { return false }
299         
300         switch action {
301             
302         case #selector(WindowManager.showHideHistory(_:)):
303             setTitle(to: menuItem,
304                      frontWindow: historyWindowController.window,
305                      show: LocalizedStrings.showHistory.string,
306                      hide: LocalizedStrings.hideHistory.string)
307             return true
308             
309         case #selector(WindowManager.showHideSlotItemWindow(_:)):
310             setTitle(to: menuItem,
311                      frontWindow: slotItemWindowController.window,
312                      show: LocalizedStrings.showSlotItem.string,
313                      hide: LocalizedStrings.hideSlotItem.string)
314             return true
315             
316         case #selector(WindowManager.showHideUpgradableShipWindow(_:)):
317             setTitle(to: menuItem,
318                      frontWindow: upgradableShipWindowController.window,
319                      show: LocalizedStrings.showUpgradableShips.string,
320                      hide: LocalizedStrings.hideUpgradableShips.string)
321             return true
322             
323         case #selector(WindowManager.showHideScreenshotListWindow(_:)):
324             setTitle(to: menuItem,
325                      frontWindow: screenshotListWindowController.window,
326                      show: LocalizedStrings.showScreenshotList.string,
327                      hide: LocalizedStrings.hideScreenshotList.string)
328             return true
329             
330         case #selector(WindowManager.showHideAirBaseInfoWindow(_:)):
331             setTitle(to: menuItem,
332                      frontWindow: airBaseWindowController.window,
333                      show: LocalizedStrings.showAirbaseInfo.string,
334                      hide: LocalizedStrings.hideAirbaseInfo.string)
335             return true
336             
337         case #selector(WindowManager.showHidePreferencePanle(_:)):
338             return true
339             
340         case #selector(WindowManager.openNewBrowser(_:)):
341             return true
342             
343         case #selector(WindowManager.selectBookmark(_:)):
344             return true
345             
346         case #selector(WindowManager.showWindowAduster(_:)):
347             return true
348             
349         case #selector(WindowManager.showShipWindow(_:)),
350              #selector(WindowManager.showEquipmentWindow(_:)),
351              #selector(WindowManager.showMapWindow(_:)),
352              #selector(WindowManager.showOwnershipShipWindow(_:)):
353             
354             return true
355             
356         case #selector(WindowManager.saveDocument(_:)),
357              #selector(WindowManager.openDocument(_:)):
358             
359             return canSaveLog
360             
361         default:
362             return false
363         }
364     }
365 }