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 {
@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
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
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
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) {
if !canMovePage {
AppDelegate.shared.createNewBrowser().move(bookmark: bookmark)
+
return
}
}
}
+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 = LocalizedStrings.hideBookmark.string
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)
}
@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 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
+ 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 else { return }
- guard let _ = bookmarkListViwController else { return }
- guard !bookmarkShowing else { return }
+ guard let window = window else {
+
+ return
+ }
+ guard let _ = bookmarkListViwController else {
+
+ return
+ }
+ guard !bookmarkShowing else {
+
+ return
+ }
bookmarkShowing = true
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?) {
@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
@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
@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
@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
}
}
-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
}
Timer.scheduledTimer(timeInterval: waitingBookmarkItem.scrollDelay,
target: self,
- selector: .updateContentVisibleRect,
+ selector: #selector(ExternalBrowserWindowController.updateContentVisibleRect(_:)),
userInfo: waitingBookmarkItem,
repeats: false)
}