OSDN Git Service

Doutakuを導入
[kcd/KCD.git] / KCD / ExternalBrowserWindowController.swift
index 259df3f..a76b1d6 100644 (file)
@@ -9,16 +9,11 @@
 import Cocoa
 import WebKit
 
-private extension Selector {
-    
-    static let updateContentVisibleRect = #selector(ExternalBrowserWindowController.updateContentVisibleRect(_:))
-}
-
 final class ExternalBrowserWindowController: NSWindowController {
         
-    @IBOutlet var webView: WebView!
-    @IBOutlet var goSegment: NSSegmentedControl!
-    @IBOutlet var bookmarkListView: NSView!
+    @IBOutlet private var webView: WebView!
+    @IBOutlet private var goSegment: NSSegmentedControl!
+    @IBOutlet private var bookmarkListView: NSView!
     
     private var canGoBackObservation: NSKeyValueObservation?
     private var canGoForwardObservation: NSKeyValueObservation?
@@ -31,32 +26,25 @@ final class ExternalBrowserWindowController: NSWindowController {
     @objc dynamic var canResize: Bool = true {
         
         willSet {
-            guard let window = window else { 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 }
             
-            webView.mainFrame.frameView.allowsScrolling = newValue
+            webView?.mainFrame.frameView.allowsScrolling = newValue
         }
     }
     @objc dynamic var canMovePage: Bool = true
@@ -167,6 +155,17 @@ 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 {
     
@@ -224,29 +223,30 @@ extension ExternalBrowserWindowController {
         
         let tag = cell.tag(forSegment: cell.selectedSegment)
         switch tag {
-        case 0:
-            webView.goBack(nil)
             
-        case 1:
-            webView.goForward(nil)
+        case 0: webView.goBack(nil)
             
-        default:
-            break
+        case 1: webView.goForward(nil)
+            
+        default: break
         }
     }
     
     @IBAction func addBookmark(_ sender: AnyObject?) {
         
         guard let window = window else { return }
-        guard 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
+        _ = 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?) {
@@ -276,17 +276,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?) {
@@ -364,14 +361,6 @@ extension ExternalBrowserWindowController: BookmarkListViewControllerDelegate {
     }
 }
 
-extension ExternalBrowserWindowController: NSAnimationDelegate {
-    
-    func animationDidEnd(_ animation: NSAnimation) {
-        
-        bookmarkShowing = false
-    }
-}
-
 extension ExternalBrowserWindowController: WebFrameLoadDelegate, WebPolicyDelegate {
     
     @objc func updateContentVisibleRect(_ timer: Timer) {
@@ -387,7 +376,7 @@ extension ExternalBrowserWindowController: WebFrameLoadDelegate, WebPolicyDelega
             
             Timer.scheduledTimer(timeInterval: waitingBookmarkItem.scrollDelay,
                                  target: self,
-                                 selector: .updateContentVisibleRect,
+                                 selector: #selector(ExternalBrowserWindowController.updateContentVisibleRect(_:)),
                                  userInfo: waitingBookmarkItem,
                                  repeats: false)
         }