OSDN Git Service

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