@@ -3,11 +3,11 @@ import WebKit
33
44class DocumentationWindowController : NSWindowController {
55
6- @IBOutlet weak var contentSearchField : NSSearchField ?
76 @IBOutlet weak var documentationViewController : DocumentationViewController ?
87
98 var documentation : Documentation !
109 private var observations : Set < NSKeyValueObservation > !
10+ private weak var contentSearchField : NSSearchField ?
1111
1212 override var windowNibName : NSNib . Name ? {
1313 return NSNib . Name ( " DocumentationWindow " )
@@ -26,6 +26,8 @@ class DocumentationWindowController: NSWindowController {
2626 override func windowDidLoad( ) {
2727 guard let dvc = documentationViewController else { return }
2828
29+ setupToolbar ( )
30+
2931 NotificationCenter . default. addObserver ( self ,
3032 selector: #selector( observeViewerState) ,
3133 name: . DocumentViewerStateDidChange,
@@ -52,6 +54,20 @@ class DocumentationWindowController: NSWindowController {
5254 object: nil )
5355 }
5456
57+ private func setupToolbar( ) {
58+ let toolbar = NSToolbar ( identifier: " DocumentationWindowToolbar " )
59+ toolbar. allowsUserCustomization = true
60+ toolbar. autosavesConfiguration = true
61+ toolbar. displayMode = . iconOnly
62+ toolbar. delegate = self
63+
64+ if let window = window {
65+ window. titlebarAppearsTransparent = true
66+ window. toolbarStyle = . automatic
67+ window. toolbar = toolbar
68+ }
69+ }
70+
5571 // MARK:- NotificationCenter observers
5672
5773 @objc private func observeViewerState( ) {
@@ -128,3 +144,116 @@ extension DocumentationWindowController: DocumentationViewDelegate {
128144 }
129145 }
130146}
147+
148+ // MARK:- NSToolbarItem.Identifier
149+ extension NSToolbarItem . Identifier {
150+ static let historyNavigation : NSToolbarItem . Identifier = NSToolbarItem . Identifier ( " HistoryNavigation " )
151+ static let contentSearch : NSToolbarItem . Identifier = NSToolbarItem . Identifier ( " ContentSearch " )
152+
153+ // Sub items
154+ static let navigateBack : NSToolbarItem . Identifier = NSToolbarItem . Identifier ( " NavigateBack " )
155+ static let navigateForward : NSToolbarItem . Identifier = NSToolbarItem . Identifier ( " NavigateForward " )
156+ }
157+
158+ // MARK:- NSToolbarDelegate
159+ extension DocumentationWindowController : NSToolbarDelegate {
160+ func toolbarAllowedItemIdentifiers( _ toolbar: NSToolbar ) -> [ NSToolbarItem . Identifier ] {
161+ return [
162+ . historyNavigation,
163+ . space,
164+ . flexibleSpace,
165+ . contentSearch
166+ ]
167+ }
168+
169+ func toolbarDefaultItemIdentifiers( _ toolbar: NSToolbar ) -> [ NSToolbarItem . Identifier ] {
170+ return [ . historyNavigation, . flexibleSpace, . contentSearch]
171+ }
172+
173+ func toolbar( _ toolbar: NSToolbar , itemForItemIdentifier itemIdentifier: NSToolbarItem . Identifier , willBeInsertedIntoToolbar flag: Bool ) -> NSToolbarItem ? {
174+ switch itemIdentifier {
175+ case . historyNavigation:
176+ let backItem = NSToolbarItem ( itemIdentifier: . navigateBack)
177+ backItem. label = NSLocalizedString ( " Back " , comment: " Navigate back " )
178+ backItem. toolTip = backItem. label
179+ backItem. isBordered = true
180+ backItem. image = NSImage ( systemSymbolName: " chevron.backward " ,
181+ accessibilityDescription: NSLocalizedString ( " Navigate back " , comment: " Navigate back " ) )
182+ backItem. autovalidates = true
183+
184+ let forwardItem = NSToolbarItem ( itemIdentifier: . navigateForward)
185+ forwardItem. label = NSLocalizedString ( " Forward " , comment: " Navigate forward " )
186+ forwardItem. toolTip = forwardItem. label
187+ forwardItem. isBordered = true
188+ forwardItem. image = NSImage ( systemSymbolName: " chevron.forward " ,
189+ accessibilityDescription: NSLocalizedString ( " Navigate forward " , comment: " Navigate forward " ) )
190+ forwardItem. autovalidates = true
191+
192+ let item = NSToolbarItemGroup ( itemIdentifier: itemIdentifier)
193+ item. label = NSLocalizedString ( " Back / Forward " , comment: " History navigation " )
194+ item. isNavigational = true
195+ item. subitems = [ backItem, forwardItem]
196+ return item
197+ case . contentSearch:
198+ let item = NSSearchToolbarItem ( itemIdentifier: itemIdentifier)
199+ item. searchField. recentsAutosaveName = NSSearchField . RecentsAutosaveName ( " content-search-term " )
200+ return item
201+ default :
202+ return nil
203+ }
204+ }
205+
206+ func toolbarWillAddItem( _ notification: Notification ) {
207+ guard let item = notification. userInfo ? [ " item " ] as? NSToolbarItem else {
208+ return
209+ }
210+
211+ switch item. itemIdentifier {
212+ case . historyNavigation:
213+ let itemGroup = item as! NSToolbarItemGroup
214+ for subitem in itemGroup. subitems {
215+ subitem. target = documentationViewController
216+ switch subitem. itemIdentifier {
217+ case . navigateBack:
218+ subitem. action = #selector( DocumentationViewController . goBack)
219+ case . navigateForward:
220+ subitem. action = #selector( DocumentationViewController . goForward)
221+ default :
222+ break
223+ }
224+ }
225+ case . contentSearch:
226+ let searchItem = item as! NSSearchToolbarItem
227+ searchItem. searchField. delegate = documentationViewController
228+ searchItem. searchField. target = documentationViewController
229+ searchItem. searchField. action = #selector( DocumentationViewController . searchPageContents ( _: ) )
230+ contentSearchField = searchItem. searchField
231+ default :
232+ return
233+ }
234+ }
235+
236+ func toolbarDidRemoveItem( _ notification: Notification ) {
237+ guard let item = notification. userInfo ? [ " item " ] as? NSToolbarItem else {
238+ return
239+ }
240+
241+ switch item. itemIdentifier {
242+ case . historyNavigation:
243+ let itemGroup = item as! NSToolbarItemGroup
244+ for subitem in itemGroup. subitems {
245+ subitem. target = nil
246+ subitem. action = nil
247+ }
248+ case . contentSearch:
249+ contentSearchField = nil
250+
251+ let searchItem = item as! NSSearchToolbarItem
252+ searchItem. searchField. delegate = nil
253+ searchItem. searchField. target = nil
254+ searchItem. searchField. action = nil
255+ default :
256+ return
257+ }
258+ }
259+ }
0 commit comments