Skip to content

Commit 828dd6f

Browse files
committed
Add STTextFinderBarContainer to handle text finder bar
Move responsibility for managing the text finder bar from STTextView to a new STTextFinderBarContainer class that implements NSTextFinderBarContainer. This allows properly positioning the gutter view below the find bar when it is shown/hidden. Update STTextView to: - Create the text finder client, bar container and finder in init - Connect the text finder client and bar container - Remove code to set up the text finder when moving to a window - Scope some enclosing scroll view accesses
1 parent 00a4241 commit 828dd6f

File tree

3 files changed

+61
-14
lines changed

3 files changed

+61
-14
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import AppKit
2+
3+
final class STTextFinderBarContainer: NSObject, NSTextFinderBarContainer {
4+
5+
// Forward NSTextFinderBarContainer to enclosing NSScrollView (for now at least)
6+
weak var client: STTextView?
7+
8+
var findBarView: NSView? {
9+
get {
10+
client?.scrollView?.findBarView
11+
}
12+
13+
set {
14+
client?.scrollView?.findBarView = newValue
15+
16+
// Rearrange gutter view position in NSScrollView hierarchy
17+
Task { @MainActor in
18+
if let scrollView = client?.scrollView, let gutterView = client?.gutterView {
19+
gutterView.removeFromSuperviewWithoutNeedingDisplay()
20+
scrollView.addSubview(gutterView, positioned: .below, relativeTo: scrollView.findBarView)
21+
}
22+
}
23+
}
24+
}
25+
26+
var isFindBarVisible: Bool {
27+
get {
28+
client?.scrollView?.isFindBarVisible ?? false
29+
}
30+
31+
set {
32+
client?.scrollView?.isFindBarVisible = newValue
33+
}
34+
}
35+
36+
func contentView() -> NSView? {
37+
client?.contentView
38+
}
39+
40+
func findBarViewDidChangeHeight() {
41+
client?.scrollView?.findBarViewDidChangeHeight()
42+
}
43+
}

Sources/STTextViewAppKit/STTextView+Gutter.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ extension STTextView {
2121
gutterView.selectedLineTextColor = textColor
2222
gutterView.highlightSelectedLine = highlightSelectedLine
2323
gutterView.selectedLineHighlightColor = selectedLineHighlightColor
24-
if let scrollView = enclosingScrollView {
25-
scrollView.addSubview(gutterView, positioned: .below, relativeTo: scrollView.findBarView)
24+
if let scrollView {
25+
scrollView.addSubview(gutterView)
2626
}
2727
self.gutterView = gutterView
2828
needsLayout = true

Sources/STTextViewAppKit/STTextView.swift

+16-12
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,8 @@ import AVFoundation
457457
/// NSTextFinderClient
458458
internal let textFinderClient: STTextFinderClient
459459

460+
internal let textFinderBarContainer: STTextFinderBarContainer
461+
460462
internal var textCheckingController: NSTextCheckingController!
461463

462464
/// A Boolean value that indicates whether the receiver has continuous spell checking enabled.
@@ -592,9 +594,10 @@ import AVFoundation
592594
allowsUndo = true
593595
_undoManager = CoalescingUndoManager()
594596

595-
596-
textFinder = NSTextFinder()
597597
textFinderClient = STTextFinderClient()
598+
textFinderBarContainer = STTextFinderBarContainer()
599+
textFinder = NSTextFinder()
600+
textFinder.client = textFinderClient
598601

599602
_defaultTypingAttributes = [
600603
.paragraphStyle: NSParagraphStyle.default,
@@ -606,6 +609,9 @@ import AVFoundation
606609

607610
super.init(frame: frameRect)
608611

612+
textFinderBarContainer.client = self
613+
textFinder.findBarContainer = textFinderBarContainer
614+
609615
setSelectedTextRange(NSTextRange(location: textLayoutManager.documentRange.location), updateLayout: false)
610616

611617
textLayoutManager.delegate = self
@@ -724,25 +730,23 @@ import AVFoundation
724730
open override func viewDidMoveToSuperview() {
725731
super.viewDidMoveToSuperview()
726732

727-
NotificationCenter.default.addObserver(
728-
self,
729-
selector: #selector(enclosingClipViewBoundsDidChange(_:)),
730-
name: NSClipView.boundsDidChangeNotification,
731-
object: scrollView?.contentView
732-
)
733+
if let scrollView {
734+
NotificationCenter.default.addObserver(
735+
self,
736+
selector: #selector(enclosingClipViewBoundsDidChange(_:)),
737+
name: NSClipView.boundsDidChangeNotification,
738+
object: scrollView.contentView
739+
)
740+
}
733741
}
734742

735743
open override func viewDidMoveToWindow() {
736744
super.viewDidMoveToWindow()
737745

738746
if self.window != nil {
739-
textFinder.client = textFinderClient
740-
textFinder.findBarContainer = enclosingScrollView
741-
742747
// setup registerd plugins
743748
setupPlugins()
744749
}
745-
746750
}
747751

748752
open override func hitTest(_ point: NSPoint) -> NSView? {

0 commit comments

Comments
 (0)