OSDN Git Service

shared instanceを持つようにした
[kcd/KCD.git] / KCD / ExternalBrowserWindowController.swift
index 2731e0f..a8701a8 100644 (file)
@@ -9,28 +9,14 @@
 import Cocoa
 import WebKit
 
-private extension Selector {
-    
-    static let addBookmark = #selector(ExternalBrowserWindowController.addBookmark(_:))
-    static let showBookmark = #selector(ExternalBrowserWindowController.showBookmark(_:))
-    static let selectBookmark = #selector(ExternalBrowserWindowController.selectBookmark(_:))
-    static let reloadContent = #selector(ExternalBrowserWindowController.reloadContent(_:))
-    static let updateContentVisibleRect = #selector(ExternalBrowserWindowController.updateContentVisibleRect(_:))
-}
-
 final class ExternalBrowserWindowController: NSWindowController {
-    
-    let managedObjectContext = BookmarkManager.shared().manageObjectContext
-    
-    deinit {
         
-        webView.removeObserver(self, forKeyPath: "canGoBack")
-        webView.removeObserver(self, forKeyPath: "canGoForward")
-    }
+    @IBOutlet private var webView: WebView!
+    @IBOutlet private var goSegment: NSSegmentedControl!
+    @IBOutlet private var bookmarkListView: NSView!
     
-    @IBOutlet var webView: WebView!
-    @IBOutlet var goSegment: NSSegmentedControl!
-    @IBOutlet var bookmarkListView: NSView!
+    private var canGoBackObservation: NSKeyValueObservation?
+    private var canGoForwardObservation: NSKeyValueObservation?
     
     override var windowNibName: NSNib.Name {
         
@@ -40,39 +26,33 @@ final class ExternalBrowserWindowController: NSWindowController {
     @objc dynamic var canResize: Bool = true {
         
         willSet {
-            guard let window = window else { return }
             
-            if canResize == newValue { return }
+            if canResize == newValue {
+                
+                return
+            }
             
-            var styleMask = window.styleMask
             if newValue {
                 
-                styleMask.insert(.resizable)
+                window?.styleMask.insert(.resizable)
                 
             } else {
                 
-                styleMask.remove(.resizable)
+                window?.styleMask.remove(.resizable)
             }
-            
-            window.styleMask = styleMask
         }
     }
     
     @objc dynamic var canScroll: Bool = true {
         
         willSet {
-            guard let webView = webView else { return }
-            
-            if canScroll == newValue { return }
             
-            if newValue {
-                
-                webView.mainFrame.frameView.allowsScrolling = true
-                
-            } else {
+            if canScroll == newValue {
                 
-                webView.mainFrame.frameView.allowsScrolling = false
+                return
             }
+            
+            webView?.mainFrame.frameView.allowsScrolling = newValue
         }
     }
     @objc dynamic var canMovePage: Bool = true
@@ -85,12 +65,20 @@ final class ExternalBrowserWindowController: NSWindowController {
     var windowContentSize: NSSize {
         
         get {
-            guard let window = window else { return .zero }
+            
+            guard let window = window else {
+                
+                return .zero
+            }
             
             return window.contentRect(forFrameRect: window.frame).size
         }
         set {
-            guard let window = window else { return }
+            
+            guard let window = window else {
+                
+                return
+            }
             
             var contentRect: NSRect = .zero
             contentRect.size = newValue
@@ -113,7 +101,10 @@ final class ExternalBrowserWindowController: NSWindowController {
     
     private lazy var bookmarkListViwController: BookmarkListViewController? = { [weak self] in
         
-        guard let `self` = self else { return nil }
+        guard let `self` = self else {
+            
+            return nil
+        }
         
         let controller = BookmarkListViewController()
         self.bookmarkListView = controller.view
@@ -132,29 +123,27 @@ final class ExternalBrowserWindowController: NSWindowController {
         
         super.windowDidLoad()
         
-        webView.addObserver(self, forKeyPath: "canGoBack", context: nil)
-        webView.addObserver(self, forKeyPath: "canGoForward", context: nil)
-        webView.applicationNameForUserAgent = AppDelegate.shared.appNameForUserAgent
-        webView.frameLoadDelegate = self
-    }
-    
-    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
-        
-        if keyPath == "canGoBack" {
+        canGoBackObservation = webView.observe(\WebView.canGoBack) { [weak self] _, _ in
             
-            goSegment.setEnabled(webView.canGoBack, forSegment: 0)
+            guard let `self` = self else {
+                
+                return
+            }
             
-            return
+            self.goSegment.setEnabled(self.webView.canGoBack, forSegment: 0)
         }
-        
-        if keyPath == "canGoForward" {
+        canGoForwardObservation = webView.observe(\WebView.canGoForward) { [weak self] _, _ in
             
-            goSegment.setEnabled(webView.canGoForward, forSegment: 1)
+            guard let `self` = self else {
+                
+                return
+            }
             
-            return
+            self.goSegment.setEnabled(self.webView.canGoForward, forSegment: 1)
         }
         
-        super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
+        webView.applicationNameForUserAgent = AppDelegate.shared.appNameForUserAgent
+        webView.frameLoadDelegate = self
     }
     
     override func swipe(with event: NSEvent) {
@@ -175,6 +164,7 @@ final class ExternalBrowserWindowController: NSWindowController {
         if !canMovePage {
             
             AppDelegate.shared.createNewBrowser().move(bookmark: bookmark)
+            
             return
         }
         
@@ -191,43 +181,67 @@ final class ExternalBrowserWindowController: NSWindowController {
     }
 }
 
+extension ExternalBrowserWindowController: NSWindowDelegate {
+    
+    func windowWillClose(_ notification: Notification) {
+        
+        webView.policyDelegate = nil
+        webView.uiDelegate = nil
+        webView.downloadDelegate = nil
+        webView.frameLoadDelegate = nil
+    }
+}
+
 // MARK: - IBAction
 extension ExternalBrowserWindowController {
     
     override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
         
-        guard let action = menuItem.action else { return false }
+        guard let action = menuItem.action else {
+            
+            return false
+        }
         
         switch action {
-        case Selector.addBookmark:
+            
+        case #selector(ExternalBrowserWindowController.addBookmark(_:)):
+            
             return webView.mainFrameURL != nil
             
-        case Selector.showBookmark:
+        case #selector(ExternalBrowserWindowController.showBookmark(_:)):
+            
             if showsBookmarkList() {
                 
-                menuItem.title = NSLocalizedString("Hide Bookmark", comment: "Menu item title, Hide Bookmark")
+                menuItem.title = LocalizedStrings.hideBookmark.string
                 
             } else {
                 
-                menuItem.title = NSLocalizedString("Show Bookmark", comment: "Menu item title, Show Bookmark")
+                menuItem.title = LocalizedStrings.showBookmark.string
             }
+            
             return true
             
-        case Selector.selectBookmark:
+        case #selector(ExternalBrowserWindowController.selectBookmark(_:)):
+            
             return true
             
-        case Selector.reloadContent:
+        case #selector(ExternalBrowserWindowController.reloadContent(_:)):
+            
             return true
             
         default:
+            
             return false
+            
         }
     }
     
     @IBAction func selectBookmark(_ sender: AnyObject?) {
         
-        guard let item = sender?.representedObject as? Bookmark
-            else { return }
+        guard let item = sender?.representedObject as? Bookmark else {
+            
+            return
+        }
         
         move(bookmark: item)
     }
@@ -244,43 +258,57 @@ extension ExternalBrowserWindowController {
     
     @IBAction func clickGoBackSegment(_ sender: AnyObject?) {
         
-        guard let cell = goSegment.cell as? NSSegmentedCell
-            else { return }
+        guard let cell = goSegment.cell as? NSSegmentedCell else {
+            
+            return
+        }
         
         let tag = cell.tag(forSegment: cell.selectedSegment)
         switch tag {
-        case 0:
-            webView.goBack(nil)
             
-        case 1:
-            webView.goForward(nil)
+        case 0: webView.goBack(nil)
+            
+        case 1: webView.goForward(nil)
+            
+        default: break
             
-        default:
-            break
         }
     }
     
     @IBAction func addBookmark(_ sender: AnyObject?) {
         
-        guard let window = window,
-            let bookmark = BookmarkManager.shared().createNewBookmark()
-            else { return }
-        
-        bookmark.name = window.title
-        bookmark.urlString = webView.mainFrameURL
-        bookmark.windowContentSize = windowContentSize
-        bookmark.contentVisibleRect = contentVisibleRect
-        bookmark.canResize = canResize
-        bookmark.canScroll = canScroll
-        bookmark.scrollDelay = 0.5
+        guard let window = window else {
+            
+            return
+        }
+        _ = BookmarkManager.shared.createNewBookmark { bookmark in
+            
+            bookmark.name = window.title
+            bookmark.urlString = self.webView.mainFrameURL
+            bookmark.windowContentSize = self.windowContentSize
+            bookmark.contentVisibleRect = self.contentVisibleRect
+            bookmark.canResize = self.canResize
+            bookmark.canScroll = self.canScroll
+            bookmark.scrollDelay = 0.5
+            
+            return true
+        }
     }
     
     @IBAction func showBookmark(_ sender: AnyObject?) {
         
-        guard let window = window,
-            let _ = bookmarkListViwController,
-            !bookmarkShowing
-            else { return }
+        guard let window = window else {
+            
+            return
+        }
+        guard let _ = bookmarkListViwController else {
+            
+            return
+        }
+        guard !bookmarkShowing else {
+            
+            return
+        }
         
         bookmarkShowing = true
         
@@ -303,17 +331,14 @@ extension ExternalBrowserWindowController {
             newFrame.size.width = window.frame.size.width - 200
         }
         
-        let webAnime: [NSViewAnimation.Key: Any] = [
-            .target: webView,
-            .endFrame: NSValue(rect: newFrame)
-        ]
-        let bookmarkAnime: [NSViewAnimation.Key: Any] = [
-            .target: bookmarkListView,
-            .endFrame: NSValue(rect: frame)
-        ]
-        let anime = NSViewAnimation(viewAnimations: [webAnime, bookmarkAnime])
-        anime.delegate = self
-        anime.start()
+        let webAnime = ViewAnimationAttributes(target: webView, endFrame: newFrame)
+        let bookmarkAnime = ViewAnimationAttributes(target: bookmarkListView, endFrame: frame)
+
+        let anime = ViewAnimation(viewAnimations: [webAnime, bookmarkAnime])
+        anime.start { [weak self] in
+            
+            self?.bookmarkShowing = false
+        }
     }
     
     @IBAction func scrollLeft(_ sender: AnyObject?) {
@@ -346,7 +371,10 @@ extension ExternalBrowserWindowController {
     
     @IBAction func increaseWidth(_ sender: AnyObject?) {
         
-        guard let window = window else { return }
+        guard let window = window else {
+            
+            return
+        }
         
         var frame = window.frame
         frame.size.width += 1
@@ -355,7 +383,10 @@ extension ExternalBrowserWindowController {
     
     @IBAction func decreaseWidth(_ sender: AnyObject?) {
         
-        guard let window = window else { return }
+        guard let window = window else {
+            
+            return
+        }
         
         var frame = window.frame
         frame.size.width -= 1
@@ -364,7 +395,10 @@ extension ExternalBrowserWindowController {
     
     @IBAction func increaseHeight(_ sender: AnyObject?) {
         
-        guard let window = window else { return }
+        guard let window = window else {
+            
+            return
+        }
         
         var frame = window.frame
         frame.size.height += 1
@@ -374,7 +408,10 @@ extension ExternalBrowserWindowController {
     
     @IBAction func decreaseHeight(_ sender: AnyObject?) {
         
-        guard let window = window else { return }
+        guard let window = window else {
+            
+            return
+        }
         
         var frame = window.frame
         frame.size.height -= 1
@@ -391,20 +428,14 @@ extension ExternalBrowserWindowController: BookmarkListViewControllerDelegate {
     }
 }
 
-extension ExternalBrowserWindowController: NSAnimationDelegate {
-    
-    func animationDidEnd(_ animation: NSAnimation) {
-        
-        bookmarkShowing = false
-    }
-}
-
 extension ExternalBrowserWindowController: WebFrameLoadDelegate, WebPolicyDelegate {
     
     @objc func updateContentVisibleRect(_ timer: Timer) {
         
-        guard let item = timer.userInfo as? Bookmark
-            else { return }
+        guard let item = timer.userInfo as? Bookmark else {
+            
+            return
+        }
         
         contentVisibleRect = item.contentVisibleRect
     }
@@ -415,7 +446,7 @@ extension ExternalBrowserWindowController: WebFrameLoadDelegate, WebPolicyDelega
             
             Timer.scheduledTimer(timeInterval: waitingBookmarkItem.scrollDelay,
                                  target: self,
-                                 selector: .updateContentVisibleRect,
+                                 selector: #selector(ExternalBrowserWindowController.updateContentVisibleRect(_:)),
                                  userInfo: waitingBookmarkItem,
                                  repeats: false)
         }