.../Source/App/SearchAndPreview/SearchTextView.swift
Line | Count | Source (jump to first uncovered line) |
1 | | // |
2 | | // SearchTextView.swift |
3 | | // CutBox |
4 | | // |
5 | | // Created by Jason Milkins on 7/4/18. |
6 | | // Copyright © 2018-2023 ocodo. All rights reserved. |
7 | | // |
8 | | |
9 | | import Cocoa |
10 | | import Carbon.HIToolbox |
11 | | |
12 | | class SearchTextView: CutBoxBaseTextView { |
13 | | |
14 | | var keyDownEvent: NSEvent? |
15 | | |
16 | 78 | required init?(coder aCoder: NSCoder) { |
17 | 78 | super.init(coder: aCoder) |
18 | 78 | } |
19 | | |
20 | 2 | override init(frame frameRect: NSRect, textContainer aTextContainer: NSTextContainer!) { |
21 | 2 | super.init(frame: frameRect, textContainer: aTextContainer) |
22 | 2 | } |
23 | | |
24 | 4 | override func keyDown(with event: NSEvent?) { |
25 | 4 | if let event = event { |
26 | 4 | keyDownEvent = event |
27 | 4 | super.keyDown(with: event) |
28 | 4 | } |
29 | 4 | } |
30 | | |
31 | 2 | private var augmentedSelectors: [Selector] { return [ |
32 | 2 | "moveRight:", |
33 | 2 | "moveLeft:" |
34 | 4 | ].map { Selector($0) } |
35 | 2 | } |
36 | | |
37 | 1 | private var skippedSelectors: [Selector] { return [ |
38 | 1 | "deleteToBeginningOfLine:", |
39 | 1 | "moveUp:", |
40 | 1 | "moveDown:", |
41 | 1 | "moveDownAndModifySelection:", |
42 | 1 | "moveUpAndModifySelection:", |
43 | 1 | "insertNewline:", |
44 | 1 | "noop:" |
45 | 7 | ].map { Selector($0) } |
46 | 1 | } |
47 | | |
48 | | // MARK: Pass through noop and specific keyboard events to nextResponder |
49 | 6 | override func doCommand(by selector: Selector?) { |
50 | 6 | if let selector = selector { |
51 | 6 | if let keyEvent = keyDownEvent { |
52 | 4 | switch (keyEvent.key, keyEvent.modifiers) { |
53 | 4 | case (kVK_ANSI_A, [.command]): |
54 | 1 | self.selectAll(self) |
55 | 1 | return |
56 | 4 | case (kVK_ANSI_X, [.command]): |
57 | 1 | self.cut(self) |
58 | 1 | return |
59 | 4 | case (kVK_ANSI_C, [.command]): |
60 | 1 | self.copy(self) |
61 | 1 | return |
62 | 4 | case (kVK_ANSI_V, [.command]): |
63 | 1 | self.paste(self) |
64 | 1 | return |
65 | 4 | default: |
66 | 0 | break |
67 | 4 | } |
68 | 6 | } |
69 | 6 | |
70 | 6 | if augmentedSelectors.contains(selector) { |
71 | 1 | super.doCommand(by: selector) |
72 | 1 | self.nextResponder?.keyDown(with: keyDownEvent!) |
73 | 1 | keyDownEvent = nil |
74 | 6 | } else if skippedSelectors.contains(selector) { |
75 | 1 | self.nextResponder?.keyDown(with: keyDownEvent!) |
76 | 1 | keyDownEvent = nil |
77 | 6 | } else { |
78 | 5 | super.doCommand(by: selector) |
79 | 5 | keyDownEvent = nil |
80 | 6 | } |
81 | 6 | } |
82 | 6 | } |
83 | | } |