123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- //
- // KMSearchReplaceWindowController.swift
- // PDF Reader Pro
- //
- // Created by User-Tangchao on 2024/8/7.
- //
- import Cocoa
- class KMSearchReplaceWindowController_Window: NSWindow {
- override var canBecomeMain: Bool {
- return true
- }
-
- override var canBecomeKey: Bool {
- return true
- }
- }
- @objc enum KMSearchReplaceType: Int {
- case none = 0
- case search = 1
- case replace = 2
- }
- class KMSearchReplaceWindowController: NSWindowController {
- @IBOutlet weak var titleBarBox: NSBox!
- @IBOutlet weak var closeButton: NSButton!
-
- @IBOutlet weak var tabBox: NSBox!
- @IBOutlet weak var searchTabButton: NSButton!
- @IBOutlet weak var replaceTabButton: NSButton!
- @IBOutlet weak var tabBottomLine: NSBox!
- @IBOutlet weak var tabSelectedLine: NSBox!
- @IBOutlet weak var tabSelectedLineLeftConst: NSLayoutConstraint!
-
- @IBOutlet weak var searchBox: NSBox!
- @IBOutlet weak var searchTitleLabel: NSTextField!
- @IBOutlet weak var searchInputBox: NSBox!
- @IBOutlet weak var searchInputView: NSTextField!
- @IBOutlet weak var matchWholeCheck: NSButton!
- @IBOutlet weak var caseSensitiveCheck: NSButton!
- @IBOutlet weak var previousButton: NSButton!
- @IBOutlet weak var nextButton: NSButton!
-
- @IBOutlet weak var replaceBox: NSBox!
- @IBOutlet weak var bottomBarBox: NSBox!
- @IBOutlet weak var replaceButton: NSButton!
- @IBOutlet weak var replaceAllButton: NSButton!
-
- private var _modalSession: NSApplication.ModalSession?
-
- private var handdler: KMSearchReplaceHanddler = KMSearchReplaceHanddler()
- private var type_: KMSearchReplaceType = .search
-
- deinit {
- KMPrint("KMSearchReplaceWindowController deinit.")
- }
-
- convenience init(with pdfView: CPDFView?, type: KMSearchReplaceType) {
- self.init(windowNibName: "KMSearchReplaceWindowController")
-
- self.handdler.pdfView = pdfView
- self.type_ = type
- }
- override func windowDidLoad() {
- super.windowDidLoad()
- self.initDefaultValue()
- self.switchType(self.type_)
- }
-
- func initDefaultValue() {
- self.window?.isMovableByWindowBackground = true
-
- self.titleBarBox.boxType = .custom
- self.titleBarBox.borderWidth = 0
- self.closeButton.imagePosition = .imageOnly
- self.closeButton.image = NSImage(named: "KMImageNameUXIconBtnCloseNor")
- self.closeButton.target = self
- self.closeButton.action = #selector(_closeAction)
-
- self.searchTabButton.target = self
- self.searchTabButton.action = #selector(_searchTabAction)
- self.searchTabButton.title = " \(NSLocalizedString("Search", comment: ""))"
- self.searchTabButton.image = NSImage(named: "KMImageNameSearchIcon")
- self.searchTabButton.imagePosition = .imageLeft
- // self.searchTabButton.imageHugsTitle = true
-
- self.replaceTabButton.target = self
- self.replaceTabButton.action = #selector(_replaceTabAction)
- self.replaceTabButton.title = " \(NSLocalizedString("Replace", comment: ""))"
- self.replaceTabButton.image = NSImage(named: "KMImageNameReplaceIcon")
- self.replaceTabButton.imagePosition = .imageLeft
- self.tabSelectedLine.borderWidth = 0
- self.tabSelectedLine.fillColor = NSColor(hex: "#4982E6")
-
- self.searchBox.borderWidth = 0
- self.searchTitleLabel.stringValue = NSLocalizedString("Search", comment: "")
- self.searchInputBox.cornerRadius = 0
- self.searchInputView.drawsBackground = false
- self.searchInputView.isBordered = false
- self.searchInputView.delegate = self
-
- self.matchWholeCheck.title = NSLocalizedString("Whole Words Only", comment: "")
- self.caseSensitiveCheck.title = NSLocalizedString("Ignore Case", comment: "")
- self.previousButton.title = NSLocalizedString("Previous", comment: "")
- self.previousButton.target = self
- self.previousButton.action = #selector(_previousAction)
- self.nextButton.title = NSLocalizedString("Next", comment: "")
- self.nextButton.target = self
- self.nextButton.action = #selector(_nextAction)
-
- self.replaceButton.title = NSLocalizedString("Replace", comment: "")
- self.replaceAllButton.title = NSLocalizedString("Replace All", comment: "")
- }
-
- // MARK: - Actions
-
- @objc private func _closeAction(_ sender: NSButton) {
- self.endModal(sender)
- }
-
- @objc private func _previousAction(_ sender: NSButton) {
- guard let model = self.handdler.searchResults.safe_element(for: self.handdler.showIdx+1) as? KMSearchMode else {
- return
- }
- self.handdler.showIdx += 1
- self.handdler.showSelection(model.selection)
- }
-
- @objc private func _nextAction(_ sender: NSButton) {
- guard let model = self.handdler.searchResults.safe_element(for: self.handdler.showIdx-1) as? KMSearchMode else {
- return
- }
- self.handdler.showIdx -= 1
- self.handdler.showSelection(model.selection)
- }
-
- @objc private func _searchTabAction(_ sender: NSButton) {
- self.switchType(.search, animate: true)
- }
-
- @objc private func _replaceTabAction(_ sender: NSButton) {
- self.switchType(.replace, animate: true)
- }
-
- func switchType(_ type: KMSearchReplaceType, animate: Bool = false) {
- if type == .replace {
- if IAPProductsManager.default().isAvailableAllFunction() == false {
- KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
- return
- }
- }
-
- self.type_ = type
-
- let selectedColor = NSColor(hex: "0E1114")
- let unSelectedColor = NSColor(hex: "757780")
- if type == .search { // 248
- self.tabSelectedLineLeftConst.constant = 24
-
- self.searchTabButton.setTitleColor(selectedColor)
- self.searchTabButton.image = NSImage(named: "KMImageNameSearchIcon")
- self.replaceTabButton.setTitleColor(unSelectedColor)
- self.replaceTabButton.image = NSImage(named: "KMImageNameReplaceUnselectedIcon")
-
- // DispatchQueue.main.async {
- self.replaceBox.isHidden = true
- self.bottomBarBox.isHidden = true
- // }
-
- var frame = self.window?.frame ?? .zero
- let height: CGFloat = 248+20
- let heightOffset = frame.size.height - height
- frame.origin.y += heightOffset
- frame.size.height = height
- self.window?.setFrame(frame, display: true, animate: animate)
- self.window?.minSize = frame.size
- self.window?.maxSize = frame.size
- } else if type == .replace { // 388
- self.tabSelectedLineLeftConst.constant = 140
-
- self.searchTabButton.setTitleColor(unSelectedColor)
- self.searchTabButton.image = NSImage(named: "KMImageNameSearchUnselectedIcon")
- self.replaceTabButton.setTitleColor(selectedColor)
- self.replaceTabButton.image = NSImage(named: "KMImageNameReplaceIcon")
-
- DispatchQueue.main.async {
- self.replaceBox.isHidden = false
- self.bottomBarBox.isHidden = false
- }
-
- var frame = self.window?.frame ?? .zero
- let height:CGFloat = 388
- let heightOffset = frame.size.height-height
- frame.origin.y += heightOffset
- frame.size.height = height
- self.window?.setFrame(frame, display: true, animate: animate)
- self.window?.minSize = frame.size
- self.window?.maxSize = frame.size
- }
- }
-
- func startModal(_ sender: AnyObject?) {
- NSApp.stopModal()
-
- var modalCode: NSApplication.ModalResponse?
- if let _win = self.window {
- self._modalSession = NSApp.beginModalSession(for: _win)
- repeat {
- modalCode = NSApp.runModalSession(self._modalSession!)
- } while (modalCode == .continue)
- }
- }
-
- func endModal(_ sender: AnyObject?) {
- if let session = self._modalSession {
- NSApp.stopModal()
- NSApp.endModalSession(session)
- self.window?.orderOut(self)
- }
- if let winC = self.window?.kmCurrentWindowC, winC.isEqual(to: self) {
- self.window?.kmCurrentWindowC = nil
- }
- }
-
- }
- extension KMSearchReplaceWindowController: NSTextFieldDelegate {
- func controlTextDidEndEditing(_ obj: Notification) {
-
- }
-
- func control(_ control: NSControl, textView: NSTextView, doCommandBy commandSelector: Selector) -> Bool {
- switch commandSelector {
- case #selector(NSResponder.insertNewline(_:)):
- if let inputView = control as? NSTextField {
- // //当当前TextField按下enter
- if inputView == self.searchInputView {
- let isCase = self.caseSensitiveCheck.state == .on
- let isWholeWord = self.matchWholeCheck.state == .on
- self.handdler.search(keyword: self.searchInputView.stringValue, isCase: isCase, isWholeWord: isWholeWord, callback: { [weak self] datas in
- if let sel = datas?.first?.selection {
- self?.handdler.showIdx = 0
- self?.handdler.showSelection(sel)
- }
- })
- }
- }
- return true
- default:
- return false
- }
- }
- }
|