Browse Source

【搜索替换】新增搜索替换窗口

tangchao 7 months ago
parent
commit
b548f5d3cc

+ 58 - 30
PDF Office/PDF Master/Class/PDFWindowController/Toolbar/KMToolbarViewController.swift

@@ -2423,45 +2423,73 @@ extension KMToolbarViewController {
         let words = UserDefaults.standard.array(forKey: "kmDocumentSearchWordArrays") as? [String] ?? []
         let searchMenu = NSMenu()
         
-        for word in words {
-            var truncatedWord = word
-            if word.count > 15 {
-                truncatedWord = String(word.prefix(15)) + "..."
-            }
-            let item = searchMenu.addItem(withTitle: truncatedWord, action: #selector(searchPDFKeyWord(_:)), keyEquivalent: "")
-            item.representedObject = word
-        }
+//        for word in words {
+//            var truncatedWord = word
+//            if word.count > 15 {
+//                truncatedWord = String(word.prefix(15)) + "..."
+//            }
+//            let item = searchMenu.addItem(withTitle: truncatedWord, action: #selector(searchPDFKeyWord(_:)), keyEquivalent: "")
+//            item.representedObject = word
+//        }
         
         let attributes: [NSAttributedString.Key: Any] = [.font: NSFont(name: "Helvetica", size: 12.0)!]
 
-        if !words.isEmpty {
-            let attributedString = NSAttributedString(string: NSLocalizedString("Search History", comment: ""), attributes: attributes)
-            let item = NSMenuItem()
-            item.attributedTitle = attributedString
-            searchMenu.insertItem(item, at: 0)
-            searchMenu.addItem(NSMenuItem.separator())
-            
-            let attributedString1 = NSAttributedString(string: NSLocalizedString("Clear Search History", comment: ""), attributes: attributes)
-            let item1 = NSMenuItem()
-            item1.attributedTitle = attributedString1
-            item1.action = #selector(clearSearchWordHistory(_:))
-            item1.target = self
-            searchMenu.addItem(item1)
-            
-            searchMenu.insertItem(NSMenuItem.separator(), at: 0)
-        }
+//        if !words.isEmpty {
+//            let attributedString = NSAttributedString(string: NSLocalizedString("Search History", comment: ""), attributes: attributes)
+//            let item = NSMenuItem()
+//            item.attributedTitle = attributedString
+//            searchMenu.insertItem(item, at: 0)
+//            searchMenu.addItem(NSMenuItem.separator())
+//
+//            let attributedString1 = NSAttributedString(string: NSLocalizedString("Clear Search History", comment: ""), attributes: attributes)
+//            let item1 = NSMenuItem()
+//            item1.attributedTitle = attributedString1
+//            item1.action = #selector(clearSearchWordHistory(_:))
+//            item1.target = self
+//            searchMenu.addItem(item1)
+//
+//            searchMenu.insertItem(NSMenuItem.separator(), at: 0)
+//        }
+//
+//        let attributedString2 = NSAttributedString(string: NSLocalizedString("Ignore Case", comment: ""), attributes: attributes)
+//        let ignoreItem = NSMenuItem()
+//        ignoreItem.attributedTitle = attributedString2
+//        ignoreItem.action = #selector(toggleCaseInsensitiveSearch)
+//        ignoreItem.target = self
+//        searchMenu.insertItem(ignoreItem, at: 0)
+        
+        let attri = NSAttributedString(string: NSLocalizedString("Search", comment: ""), attributes: attributes)
+        let item = NSMenuItem()
+        item.attributedTitle = attri
+        item.action = #selector(searchItemAction)
+        item.target = self
+        searchMenu.insertItem(item, at: 0)
         
-        let attributedString2 = NSAttributedString(string: NSLocalizedString("Ignore Case", comment: ""), attributes: attributes)
-        let ignoreItem = NSMenuItem()
-        ignoreItem.attributedTitle = attributedString2
-        ignoreItem.action = #selector(toggleCaseInsensitiveSearch)
-        ignoreItem.target = self
-        searchMenu.insertItem(ignoreItem, at: 0)
+        let attri2 = NSAttributedString(string: NSLocalizedString("Replace", comment: ""), attributes: attributes)
+        let item2 = NSMenuItem()
+        item2.attributedTitle = attri2
+        item2.action = #selector(replaceItemAction)
+        item2.target = self
+        searchMenu.insertItem(item2, at: 1)
 
         (self.searchField.cell as? NSSearchFieldCell)?.searchMenuTemplate = searchMenu
     
     }
     
+    @objc func searchItemAction(_ sender: NSMenuItem) {
+        let item = self.toolbarItemFindItemIdentifiers(value: KMDocumentSearchToolbarItemIdentifier)
+        if item.itemIdentifier == KMDocumentSearchToolbarItemIdentifier {
+            self.delegate?.toolbarViewController?(self, menuItemDidClick: item, index: 11, info: nil)
+        }
+    }
+    
+    @objc func replaceItemAction(_ sender: NSMenuItem) {
+        let item = self.toolbarItemFindItemIdentifiers(value: KMDocumentSearchToolbarItemIdentifier)
+        if item.itemIdentifier == KMDocumentSearchToolbarItemIdentifier {
+            self.delegate?.toolbarViewController?(self, menuItemDidClick: item, index: 12, info: nil)
+        }
+    }
+    
     @objc func toggleCaseInsensitiveSearch(_ sender: NSMenuItem) {
         var value = KMDataManager.ud_integer(forKey: SKCaseInsensitiveSearchKey)
         KMDataManager.ud_set(value == 0 ? 1 : 0, forKey: SKCaseInsensitiveSearchKey)

+ 17 - 1
PDF Office/PDF Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift

@@ -4593,7 +4593,23 @@ extension KMMainViewController : KMMainToolbarControllerDelegate {
             self.clickChildTool(type: .secure, index: index)
             FMTrackEventManager.defaultManager.trackEvent(event: "SubTbr_Editor", withProperties: ["SubTbr_Btn": "Btn_SubTbr_Editor_Security"])
         } else if toolbarItem.itemIdentifier == KMDocumentSearchToolbarItemIdentifier {
-            self.toolbarController.showFindBar()
+            if index == 11 {
+                let winC = KMSearchReplaceWindowController(with: self.listView)
+//                if let win = winC.window {
+//                    self.view .window?.addChildWindow(win, ordered: .above)
+//                }
+//                winC.showWindow(nil)
+//                self.view.window?.beginSheet(winC.window!)
+//                self.view.window?.beginCriticalSheet(winC.window!)
+//                NSApp.runModal(for: winC.window!)
+//                NSApp.beginModalSession(for: winC.window!)
+                self.view.window?.makeFirstResponder(nil)
+                winC.startModal(nil)
+            } else if index == 12 {
+                
+            } else {
+                self.toolbarController.showFindBar()
+            }
         } else if toolbarItem.itemIdentifier == KMRightControlToolbarItemIdentifier {
             toolbarItem.isSelected = !toolbarItem.isSelected
             self.toggleRightPane()

+ 143 - 0
PDF Office/PDF Master/Class/Tools/Search/Tools/KMSearchReplaceHanddler.swift

@@ -0,0 +1,143 @@
+//
+//  KMSearchReplaceHanddler.swift
+//  PDF Reader Pro
+//
+//  Created by User-Tangchao on 2024/8/8.
+//
+
+import Cocoa
+
+class KMSearchReplaceHanddler: NSObject {
+    weak var pdfView: CPDFView?
+    
+    var searchResults: [KMSearchMode] = []
+    var showIdx = 0
+    
+    func search(key: String, isCase: Bool, display: Bool, needShowAll: Bool) {
+        guard let document = self.pdfView?.document else {
+            NSSound.beep()
+            return
+        }
+        if document.isFinding {
+            document.cancelFindString()
+        }
+        if key.isEmpty {
+            self.searchResults = []
+//            self.leftSideViewController.searchResults = self.searchResults
+            self.pdfView?.setHighlightedSelections([])
+            self.pdfView?.setHighlightedSelection(nil, animated: false)
+            self.pdfView?.setNeedsDisplayAnnotationViewForVisiblePages()
+        } else {
+//            mwcFlags.wholeWordSearch = isCase == true ? 1 : 0
+            let wholeWordSearch = isCase == true ? 1 : 0
+            var findArray : [[CPDFSelection]]
+            if isCase {
+//                if self.leftSideViewController.mwcFlags.wholeWordSearch == 1 {
+                    findArray = document.findString(key, with: .matchWholeWord) ?? []
+//                } else {
+//                    findArray = self.listView.document.findString(searchString) ?? []
+//                }
+            } else {
+//                if self.leftSideViewController.mwcFlags.wholeWordSearch == 1 {
+                    findArray = document.findString(key, with: [.caseSensitive, .matchWholeWord]) ?? []
+//                } else {
+//                    findArray = self.listView.document.findString(searchString, with: .caseSensitive) ?? []
+//                }
+                
+            }
+            self.searchResults.removeAll()
+            var _selections: [CPDFSelection] = []
+            for selections in findArray {
+                for selection in selections {
+                    let mode : KMSearchMode = KMSearchMode()
+                    mode.selection = selection
+                    mode.attributedString = KMOCToolClass.getAttributedString(selection: selection, keyword: key)
+                    mode.selectionPageIndex = document.index(for: selection.page)
+                    self.searchResults.insert(mode, at: self.searchResults.count)
+                    _selections.append(selection)
+                    selection.setColor(NSColor(red: 236/255.0, green: 241/255.0, blue: 83/255.0, alpha: 0.5))
+//                    self.listView.setHighlight(selection, forBorderColor: .yellow, fill: .red, animated: false)
+                }
+//                self.listView.setHighlightedSelections(selections )
+            }
+            
+            if needShowAll {
+                self.pdfView?.setHighlightedSelections(_selections)
+            }
+            if _selections.isEmpty {
+                self.pdfView?.setHighlightedSelection(nil, animated: false)
+            }
+            self.pdfView?.setNeedsDisplayAnnotationViewForVisiblePages()
+//            self.leftSideViewController.searchResults = self.searchResults
+        }
+        
+//        if display {
+//            if self.leftSideViewController.findPaneState == .singular {
+//                self.leftSideViewController.displayFindViewAnimating(true)
+//            } else {
+//                self.leftSideViewController.displayGroupedFindViewAnimating(true)
+//            }
+//        }
+    }
+    
+    func search(keyword: String, isCase: Bool, isWholeWord: Bool, callback: @escaping (([KMSearchMode]?) -> Void)) {
+        guard let document = self.pdfView?.document else {
+            NSSound.beep()
+            callback(nil)
+            return
+        }
+        if document.isFinding {
+            document.cancelFindString()
+        }
+        if keyword.isEmpty {
+            callback(nil)
+            return
+        }
+        
+        let theKeyword = keyword.decomposedStringWithCompatibilityMapping
+        var opt = CPDFSearchOptions()
+        if isCase {
+            opt.insert(.caseSensitive)
+        }
+        if isWholeWord {
+            opt.insert(.matchWholeWord)
+        }
+        DispatchQueue.global().async {
+            let result = document.findString(theKeyword, with: opt)
+            
+            self.searchResults.removeAll()
+            for sels in result ?? [] {
+                for sel in sels {
+                    let mode : KMSearchMode = KMSearchMode()
+                    mode.selection = sel
+                    mode.attributedString = KMOCToolClass.getAttributedString(selection: sel, keyword: theKeyword)
+                    mode.selectionPageIndex = document.index(for: sel.page)
+                    self.searchResults.insert(mode, at: self.searchResults.count)
+
+                    sel.setColor(NSColor(red: 236/255.0, green: 241/255.0, blue: 83/255.0, alpha: 0.5))
+                }
+            }
+            
+            DispatchQueue.main.async {
+                callback(self.searchResults)
+            }
+        }
+    }
+    
+    func showSelection(_ sel: CPDFSelection?) {
+        guard let theSel = sel else {
+            return
+        }
+        guard let document = self.pdfView?.document else {
+            return
+        }
+        
+        theSel.setColor(NSColor(red: 236/255.0, green: 241/255.0, blue: 83/255.0, alpha: 0.5))
+        
+        let pageIdx = document.index(for: theSel.page)
+        self.pdfView?.go(toPageIndex: Int(pageIdx), animated: false)
+        self.pdfView?.go(to: theSel.bounds, on: theSel.page)
+        self.pdfView?.setHighlightedSelection(theSel, animated: true)
+        self.pdfView?.setNeedsDisplayAnnotationViewForVisiblePages()
+    }
+}

+ 163 - 0
PDF Office/PDF Master/Class/Tools/Search/Window/KMSearchReplaceWindowController.swift

@@ -0,0 +1,163 @@
+//
+//  KMSearchReplaceWindowController.swift
+//  PDF Reader Pro
+//
+//  Created by User-Tangchao on 2024/8/7.
+//
+
+import Cocoa
+
+class KMSearchReplaceWindowController_Window: NSWindow {
+//    override var isMainWindow: Bool {
+//        return true
+//    }
+//
+//    override var isKeyWindow: Bool {
+//        return true
+//    }
+    
+    override var canBecomeMain: Bool {
+        return true
+    }
+    
+    override var canBecomeKey: Bool {
+        return true
+    }
+}
+
+class KMSearchReplaceWindowController: NSWindowController {
+    @IBOutlet weak var titleBarBox: NSBox!
+    @IBOutlet weak var closeButton: NSButton!
+    
+    @IBOutlet weak var tabBox: NSBox!
+    
+    @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()
+    
+    deinit {
+        KMPrint("KMSearchReplaceWindowController deinit.")
+    }
+    
+    convenience init(with pdfView: CPDFView?) {
+        self.init(windowNibName: "KMSearchReplaceWindowController")
+        
+        self.handdler.pdfView = pdfView
+    }
+
+    override func windowDidLoad() {
+        super.windowDidLoad()
+
+        self.initDefaultValue()
+    }
+    
+    func initDefaultValue() {
+        self.window?.isMovableByWindowBackground = true
+        
+        self.closeButton.imagePosition = .imageOnly
+        self.closeButton.image = NSImage(named: "KMImageNameUXIconBtnCloseNor")
+        self.closeButton.target = self
+        self.closeButton.action = #selector(_closeAction)
+        
+        self.searchTitleLabel.stringValue = NSLocalizedString("Search", comment: "")
+        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)
+    }
+    
+    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 {
+                    self.handdler.search(keyword: self.searchInputView.stringValue, isCase: false, isWholeWord: false, callback: { [weak self] datas in
+                        if let sel = datas?.first?.selection {
+                            self?.handdler.showIdx = 0
+                            self?.handdler.showSelection(sel)
+                        }
+                    })
+                }
+            }
+            return true
+        default:
+            return false
+        }
+    }
+}

+ 232 - 0
PDF Office/PDF Master/Class/Tools/Search/Window/KMSearchReplaceWindowController.xib

@@ -0,0 +1,232 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21507" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21507"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMSearchReplaceWindowController" customModule="PDF_Reader_Pro" customModuleProvider="target">
+            <connections>
+                <outlet property="bottomBarBox" destination="aX3-LQ-PXi" id="pTa-Jj-51B"/>
+                <outlet property="caseSensitiveCheck" destination="X98-Hr-uLG" id="m9g-IW-cLu"/>
+                <outlet property="closeButton" destination="883-OE-nPf" id="do0-4i-9Wi"/>
+                <outlet property="matchWholeCheck" destination="tox-LJ-GtX" id="oMU-xm-hmP"/>
+                <outlet property="nextButton" destination="qxA-YM-xIq" id="V1I-bs-Gsy"/>
+                <outlet property="previousButton" destination="FCV-r1-BiZ" id="fP2-ZK-Ff3"/>
+                <outlet property="replaceAllButton" destination="fxe-UM-ZCK" id="UgL-wl-Ytq"/>
+                <outlet property="replaceBox" destination="4kx-6q-nJ8" id="fTS-By-eXX"/>
+                <outlet property="replaceButton" destination="3l4-91-BR7" id="7ao-WQ-KzS"/>
+                <outlet property="searchBox" destination="cdc-3d-gh5" id="9Se-Lu-XEN"/>
+                <outlet property="searchInputBox" destination="Ej6-th-OuJ" id="2SX-y1-k6p"/>
+                <outlet property="searchInputView" destination="xLT-x3-sTt" id="XDG-eW-Z14"/>
+                <outlet property="searchTitleLabel" destination="kXL-bh-JQK" id="FDZ-6m-m7N"/>
+                <outlet property="tabBox" destination="TYX-fO-lan" id="k0D-nW-DRi"/>
+                <outlet property="titleBarBox" destination="h69-NL-IH7" id="CIc-G8-vOa"/>
+                <outlet property="window" destination="F0z-JX-Cv5" id="gIp-Ho-8D9"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="F0z-JX-Cv5" customClass="KMSearchReplaceWindowController_Window" customModule="PDF_Reader_Pro" customModuleProvider="target">
+            <windowStyleMask key="styleMask" closable="YES" miniaturizable="YES" resizable="YES"/>
+            <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
+            <rect key="contentRect" x="196" y="240" width="280" height="388"/>
+            <rect key="screenRect" x="0.0" y="0.0" width="1440" height="875"/>
+            <value key="minSize" type="size" width="280" height="388"/>
+            <value key="maxSize" type="size" width="280" height="388"/>
+            <value key="minFullScreenContentSize" type="size" width="280" height="388"/>
+            <value key="maxFullScreenContentSize" type="size" width="280" height="388"/>
+            <view key="contentView" id="se5-gp-TjO">
+                <rect key="frame" x="0.0" y="0.0" width="280" height="388"/>
+                <autoresizingMask key="autoresizingMask"/>
+                <subviews>
+                    <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="h69-NL-IH7">
+                        <rect key="frame" x="0.0" y="348" width="280" height="40"/>
+                        <view key="contentView" id="Zea-eJ-KkO">
+                            <rect key="frame" x="1" y="1" width="278" height="38"/>
+                            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                            <subviews>
+                                <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="883-OE-nPf">
+                                    <rect key="frame" x="217" y="6" width="45" height="16"/>
+                                    <buttonCell key="cell" type="bevel" title="Button" bezelStyle="rounded" alignment="center" imageScaling="proportionallyDown" inset="2" id="Xc1-vH-gHT">
+                                        <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                        <font key="font" metaFont="system"/>
+                                    </buttonCell>
+                                </button>
+                            </subviews>
+                            <constraints>
+                                <constraint firstItem="883-OE-nPf" firstAttribute="top" secondItem="Zea-eJ-KkO" secondAttribute="top" constant="16" id="ggj-JC-6oK"/>
+                                <constraint firstAttribute="trailing" secondItem="883-OE-nPf" secondAttribute="trailing" constant="16" id="stY-bX-Fcc"/>
+                            </constraints>
+                        </view>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="40" id="QCO-3b-P69"/>
+                        </constraints>
+                    </box>
+                    <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="TYX-fO-lan">
+                        <rect key="frame" x="0.0" y="308" width="280" height="40"/>
+                        <view key="contentView" id="kB0-PA-LMT">
+                            <rect key="frame" x="1" y="1" width="278" height="38"/>
+                            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        </view>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="40" id="D6x-KS-trS"/>
+                        </constraints>
+                    </box>
+                    <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="cdc-3d-gh5">
+                        <rect key="frame" x="0.0" y="138" width="280" height="170"/>
+                        <view key="contentView" id="Vzf-SG-CWc">
+                            <rect key="frame" x="1" y="1" width="278" height="168"/>
+                            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                            <subviews>
+                                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="kXL-bh-JQK">
+                                    <rect key="frame" x="14" y="136" width="37" height="16"/>
+                                    <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="7B6-BJ-taz">
+                                        <font key="font" usesAppearanceFont="YES"/>
+                                        <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                        <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                    </textFieldCell>
+                                </textField>
+                                <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="Ej6-th-OuJ">
+                                    <rect key="frame" x="16" y="92" width="246" height="28"/>
+                                    <view key="contentView" id="dDd-h4-ZBa">
+                                        <rect key="frame" x="1" y="1" width="244" height="26"/>
+                                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                        <subviews>
+                                            <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="xLT-x3-sTt">
+                                                <rect key="frame" x="10" y="3" width="224" height="21"/>
+                                                <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" drawsBackground="YES" id="FSm-lM-7Vp">
+                                                    <font key="font" usesAppearanceFont="YES"/>
+                                                    <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                                                    <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                                </textFieldCell>
+                                            </textField>
+                                        </subviews>
+                                        <constraints>
+                                            <constraint firstItem="xLT-x3-sTt" firstAttribute="centerY" secondItem="dDd-h4-ZBa" secondAttribute="centerY" id="403-Zw-5QF"/>
+                                            <constraint firstItem="xLT-x3-sTt" firstAttribute="leading" secondItem="dDd-h4-ZBa" secondAttribute="leading" constant="10" id="XWP-B2-C1Y"/>
+                                            <constraint firstAttribute="trailing" secondItem="xLT-x3-sTt" secondAttribute="trailing" constant="10" id="t1z-gK-KkH"/>
+                                        </constraints>
+                                    </view>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="28" id="iyf-90-muH"/>
+                                    </constraints>
+                                </box>
+                                <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="tox-LJ-GtX">
+                                    <rect key="frame" x="14" y="59" width="65" height="18"/>
+                                    <buttonCell key="cell" type="check" title="Check" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="REg-su-rhq">
+                                        <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+                                        <font key="font" metaFont="system"/>
+                                    </buttonCell>
+                                </button>
+                                <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="X98-Hr-uLG">
+                                    <rect key="frame" x="14" y="27" width="65" height="18"/>
+                                    <buttonCell key="cell" type="check" title="Check" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="Q01-7e-7FJ">
+                                        <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+                                        <font key="font" metaFont="system"/>
+                                    </buttonCell>
+                                </button>
+                                <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="FCV-r1-BiZ">
+                                    <rect key="frame" x="194" y="-1" width="75" height="32"/>
+                                    <buttonCell key="cell" type="push" title="Button" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="dQv-AB-jAA">
+                                        <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                        <font key="font" metaFont="system"/>
+                                    </buttonCell>
+                                </button>
+                                <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="qxA-YM-xIq">
+                                    <rect key="frame" x="123" y="-1" width="75" height="32"/>
+                                    <buttonCell key="cell" type="push" title="Button" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="xRU-tm-8hM">
+                                        <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                        <font key="font" metaFont="system"/>
+                                    </buttonCell>
+                                </button>
+                            </subviews>
+                            <constraints>
+                                <constraint firstItem="Ej6-th-OuJ" firstAttribute="top" secondItem="kXL-bh-JQK" secondAttribute="bottom" constant="16" id="8bI-gj-X4I"/>
+                                <constraint firstAttribute="trailing" secondItem="Ej6-th-OuJ" secondAttribute="trailing" constant="16" id="9WP-kr-chZ"/>
+                                <constraint firstItem="kXL-bh-JQK" firstAttribute="leading" secondItem="Vzf-SG-CWc" secondAttribute="leading" constant="16" id="9sj-Vd-1tH"/>
+                                <constraint firstAttribute="bottom" secondItem="FCV-r1-BiZ" secondAttribute="bottom" constant="6" id="CGb-Je-HhI"/>
+                                <constraint firstItem="tox-LJ-GtX" firstAttribute="leading" secondItem="Vzf-SG-CWc" secondAttribute="leading" constant="16" id="E7U-lZ-LJN"/>
+                                <constraint firstItem="kXL-bh-JQK" firstAttribute="top" secondItem="Vzf-SG-CWc" secondAttribute="top" constant="16" id="Mnw-10-rKE"/>
+                                <constraint firstItem="Ej6-th-OuJ" firstAttribute="leading" secondItem="Vzf-SG-CWc" secondAttribute="leading" constant="16" id="Nmj-9n-m2E"/>
+                                <constraint firstItem="X98-Hr-uLG" firstAttribute="top" secondItem="tox-LJ-GtX" secondAttribute="bottom" constant="16" id="bUM-4P-TDa"/>
+                                <constraint firstAttribute="bottom" secondItem="qxA-YM-xIq" secondAttribute="bottom" constant="6" id="iuU-LI-HPQ"/>
+                                <constraint firstItem="X98-Hr-uLG" firstAttribute="leading" secondItem="Vzf-SG-CWc" secondAttribute="leading" constant="16" id="mdo-ib-fQk"/>
+                                <constraint firstItem="tox-LJ-GtX" firstAttribute="top" secondItem="Ej6-th-OuJ" secondAttribute="bottom" constant="16" id="ohP-Eh-4hD"/>
+                                <constraint firstAttribute="trailing" secondItem="FCV-r1-BiZ" secondAttribute="trailing" constant="16" id="roz-Ak-WYB"/>
+                                <constraint firstItem="FCV-r1-BiZ" firstAttribute="leading" secondItem="qxA-YM-xIq" secondAttribute="trailing" constant="10" id="xYi-mQ-Mwy"/>
+                            </constraints>
+                        </view>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="170" id="VG5-11-3Gh"/>
+                        </constraints>
+                    </box>
+                    <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="4kx-6q-nJ8">
+                        <rect key="frame" x="0.0" y="58" width="280" height="80"/>
+                        <view key="contentView" id="ghJ-Ir-m60">
+                            <rect key="frame" x="1" y="1" width="278" height="78"/>
+                            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        </view>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="80" id="qQI-0G-n5r"/>
+                        </constraints>
+                    </box>
+                    <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="aX3-LQ-PXi">
+                        <rect key="frame" x="0.0" y="0.0" width="280" height="52"/>
+                        <view key="contentView" id="FTe-Pe-5Wd">
+                            <rect key="frame" x="1" y="1" width="278" height="50"/>
+                            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                            <subviews>
+                                <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="fxe-UM-ZCK">
+                                    <rect key="frame" x="194" y="17" width="75" height="32"/>
+                                    <buttonCell key="cell" type="push" title="Button" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="LQk-fe-7It">
+                                        <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                        <font key="font" metaFont="system"/>
+                                    </buttonCell>
+                                </button>
+                                <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3l4-91-BR7">
+                                    <rect key="frame" x="123" y="17" width="75" height="32"/>
+                                    <buttonCell key="cell" type="push" title="Button" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Ub2-Qi-UVE">
+                                        <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                        <font key="font" metaFont="system"/>
+                                    </buttonCell>
+                                </button>
+                            </subviews>
+                            <constraints>
+                                <constraint firstItem="fxe-UM-ZCK" firstAttribute="leading" secondItem="3l4-91-BR7" secondAttribute="trailing" constant="10" id="0Uj-Be-luV"/>
+                                <constraint firstItem="fxe-UM-ZCK" firstAttribute="top" secondItem="FTe-Pe-5Wd" secondAttribute="top" constant="6" id="IkM-7X-gBB"/>
+                                <constraint firstAttribute="trailing" secondItem="fxe-UM-ZCK" secondAttribute="trailing" constant="16" id="SZ7-5x-DZf"/>
+                                <constraint firstItem="3l4-91-BR7" firstAttribute="top" secondItem="FTe-Pe-5Wd" secondAttribute="top" constant="6" id="ru8-zJ-SeL"/>
+                            </constraints>
+                        </view>
+                        <constraints>
+                            <constraint firstAttribute="height" constant="52" id="dW2-x8-dcV"/>
+                        </constraints>
+                    </box>
+                </subviews>
+                <constraints>
+                    <constraint firstItem="cdc-3d-gh5" firstAttribute="top" secondItem="TYX-fO-lan" secondAttribute="bottom" id="0Cv-jO-ixc"/>
+                    <constraint firstAttribute="trailing" secondItem="TYX-fO-lan" secondAttribute="trailing" id="5zp-6K-zSy"/>
+                    <constraint firstItem="TYX-fO-lan" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" id="961-QQ-EKQ"/>
+                    <constraint firstItem="h69-NL-IH7" firstAttribute="top" secondItem="se5-gp-TjO" secondAttribute="top" id="CTM-Ty-KCN"/>
+                    <constraint firstItem="cdc-3d-gh5" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" id="FBd-tQ-1Md"/>
+                    <constraint firstAttribute="trailing" secondItem="cdc-3d-gh5" secondAttribute="trailing" id="I0Z-uh-PdE"/>
+                    <constraint firstItem="TYX-fO-lan" firstAttribute="top" secondItem="h69-NL-IH7" secondAttribute="bottom" id="NFe-Vw-raH"/>
+                    <constraint firstAttribute="trailing" secondItem="h69-NL-IH7" secondAttribute="trailing" id="XLD-vC-gfq"/>
+                    <constraint firstAttribute="trailing" secondItem="4kx-6q-nJ8" secondAttribute="trailing" id="Zwi-0o-uvZ"/>
+                    <constraint firstItem="aX3-LQ-PXi" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" id="e7W-rd-KkH"/>
+                    <constraint firstItem="4kx-6q-nJ8" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" id="hfv-r4-LBp"/>
+                    <constraint firstAttribute="bottom" secondItem="aX3-LQ-PXi" secondAttribute="bottom" id="u5o-Tk-SGA"/>
+                    <constraint firstItem="h69-NL-IH7" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" id="vO3-NH-iBM"/>
+                    <constraint firstItem="4kx-6q-nJ8" firstAttribute="top" secondItem="cdc-3d-gh5" secondAttribute="bottom" id="xsV-yh-NkH"/>
+                    <constraint firstAttribute="trailing" secondItem="aX3-LQ-PXi" secondAttribute="trailing" id="zOc-g6-tpE"/>
+                </constraints>
+            </view>
+            <connections>
+                <outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
+            </connections>
+            <point key="canvasLocation" x="52" y="132"/>
+        </window>
+    </objects>
+</document>

+ 48 - 0
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -7,6 +7,15 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
+		65341C742C63CCFE00FE30F9 /* KMSearchReplaceWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65341C722C63CCFE00FE30F9 /* KMSearchReplaceWindowController.swift */; };
+		65341C752C63CCFE00FE30F9 /* KMSearchReplaceWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65341C722C63CCFE00FE30F9 /* KMSearchReplaceWindowController.swift */; };
+		65341C762C63CCFE00FE30F9 /* KMSearchReplaceWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65341C722C63CCFE00FE30F9 /* KMSearchReplaceWindowController.swift */; };
+		65341C772C63CCFE00FE30F9 /* KMSearchReplaceWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 65341C732C63CCFE00FE30F9 /* KMSearchReplaceWindowController.xib */; };
+		65341C782C63CCFE00FE30F9 /* KMSearchReplaceWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 65341C732C63CCFE00FE30F9 /* KMSearchReplaceWindowController.xib */; };
+		65341C792C63CCFE00FE30F9 /* KMSearchReplaceWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 65341C732C63CCFE00FE30F9 /* KMSearchReplaceWindowController.xib */; };
+		65341C7C2C646C6400FE30F9 /* KMSearchReplaceHanddler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65341C7B2C646C6400FE30F9 /* KMSearchReplaceHanddler.swift */; };
+		65341C7D2C646C6400FE30F9 /* KMSearchReplaceHanddler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65341C7B2C646C6400FE30F9 /* KMSearchReplaceHanddler.swift */; };
+		65341C7E2C646C6400FE30F9 /* KMSearchReplaceHanddler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65341C7B2C646C6400FE30F9 /* KMSearchReplaceHanddler.swift */; };
 		89316822296D73CC0073EA59 /* KMSignatureAnnotationViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 89316820296D73CC0073EA59 /* KMSignatureAnnotationViewController.m */; };
 		89316823296D73CC0073EA59 /* KMSignatureAnnotationViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 89316820296D73CC0073EA59 /* KMSignatureAnnotationViewController.m */; };
 		89316824296D73CC0073EA59 /* KMSignatureAnnotationViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 89316820296D73CC0073EA59 /* KMSignatureAnnotationViewController.m */; };
@@ -5430,6 +5439,9 @@
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
+		65341C722C63CCFE00FE30F9 /* KMSearchReplaceWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMSearchReplaceWindowController.swift; sourceTree = "<group>"; };
+		65341C732C63CCFE00FE30F9 /* KMSearchReplaceWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMSearchReplaceWindowController.xib; sourceTree = "<group>"; };
+		65341C7B2C646C6400FE30F9 /* KMSearchReplaceHanddler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMSearchReplaceHanddler.swift; sourceTree = "<group>"; };
 		8931681F296D73CC0073EA59 /* KMSignatureAnnotationViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KMSignatureAnnotationViewController.h; sourceTree = "<group>"; };
 		89316820296D73CC0073EA59 /* KMSignatureAnnotationViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KMSignatureAnnotationViewController.m; sourceTree = "<group>"; };
 		89316821296D73CC0073EA59 /* KMSignatureAnnotationViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMSignatureAnnotationViewController.xib; sourceTree = "<group>"; };
@@ -7692,6 +7704,32 @@
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
+		65341C702C63CC2500FE30F9 /* Search */ = {
+			isa = PBXGroup;
+			children = (
+				65341C7A2C646C4C00FE30F9 /* Tools */,
+				65341C712C63CC4C00FE30F9 /* Window */,
+			);
+			path = Search;
+			sourceTree = "<group>";
+		};
+		65341C712C63CC4C00FE30F9 /* Window */ = {
+			isa = PBXGroup;
+			children = (
+				65341C722C63CCFE00FE30F9 /* KMSearchReplaceWindowController.swift */,
+				65341C732C63CCFE00FE30F9 /* KMSearchReplaceWindowController.xib */,
+			);
+			path = Window;
+			sourceTree = "<group>";
+		};
+		65341C7A2C646C4C00FE30F9 /* Tools */ = {
+			isa = PBXGroup;
+			children = (
+				65341C7B2C646C6400FE30F9 /* KMSearchReplaceHanddler.swift */,
+			);
+			path = Tools;
+			sourceTree = "<group>";
+		};
 		8931681E296D73C10073EA59 /* Signature */ = {
 			isa = PBXGroup;
 			children = (
@@ -10952,6 +10990,7 @@
 		BB031B3D2C47BB070099F7AD /* Tools */ = {
 			isa = PBXGroup;
 			children = (
+				65341C702C63CC2500FE30F9 /* Search */,
 				BB031B3E2C47BB070099F7AD /* UserFeekback */,
 			);
 			path = Tools;
@@ -14616,6 +14655,7 @@
 				AD3AAD272B0B6FB100DE5FE7 /* KMCompareContentView.xib in Resources */,
 				BBD9223D2B50D6D600DB9585 /* rate_pic_star.pdf in Resources */,
 				BB1B0B042B4FC6E900889528 /* KMCustomColorGuideView.xib in Resources */,
+				65341C772C63CCFE00FE30F9 /* KMSearchReplaceWindowController.xib in Resources */,
 				BB853C672AF87502009C20C1 /* KMBatchOperateRemoveWatermarkViewController.xib in Resources */,
 				BB1BFF6D2AEA030F003EB179 /* KMBatchOperateSplitViewController.xib in Resources */,
 				BB6AAF562C2175A3009C4CB1 /* KMEditPDFPopToolBarController.xib in Resources */,
@@ -14972,6 +15012,7 @@
 				AD7D5CE92B96B3B2006562CD /* KMBookmarkOutlineSeparatorCellView.xib in Resources */,
 				9F72D20C2994BDAF00DCACF1 /* KMNotificationVC.xib in Resources */,
 				9F512CCB2B4640AB00EC0BC3 /* KMPageDisplayCustomThemesCollectionViewItem.xib in Resources */,
+				65341C782C63CCFE00FE30F9 /* KMSearchReplaceWindowController.xib in Resources */,
 				ADFCEB492B4FBA440001EBAF /* RemoteConfigDefaults.plist in Resources */,
 				9F3D819729A33A290087B5AD /* KMDesignDropdown.xib in Resources */,
 				BB03D6912B01C7AB008C9976 /* KMPDFEditInsertBlankPageWindow.xib in Resources */,
@@ -15707,6 +15748,7 @@
 				AD0FA4F729A8582C00EDEB50 /* KMComparativeTableView.xib in Resources */,
 				BB1BFF7F2AEA0BE8003EB179 /* KMBatchOperateRightViewController.xib in Resources */,
 				9F1F82DF292F84D60092C4B4 /* KMHomeInsertActionViewController.xib in Resources */,
+				65341C792C63CCFE00FE30F9 /* KMSearchReplaceWindowController.xib in Resources */,
 				BB183DE82B4EC0AF00F99C7E /* KMRepeatVerifyExpireController.xib in Resources */,
 				BB6347CA2AF24F6C00F5438E /* KMBatchoperateConvertCollectionViewItem.xib in Resources */,
 				BB6AAF582C2175A3009C4CB1 /* KMEditPDFPopToolBarController.xib in Resources */,
@@ -16343,6 +16385,7 @@
 				BBA5429C29F13A140041BAD0 /* KMMemorandumPattern.swift in Sources */,
 				BB276A582B038D1100AB5578 /* KMOCRPDFWindowController.swift in Sources */,
 				BB46CF4C2AFBB34900281EDF /* AutoSaveManager.swift in Sources */,
+				65341C742C63CCFE00FE30F9 /* KMSearchReplaceWindowController.swift in Sources */,
 				89E4E7352964148E002DBA6F /* KMAnnotationPropertiesViewController.m in Sources */,
 				9F221ED729A9EC0900978A59 /* KMFillSignTextPanel.swift in Sources */,
 				BBF8A4032AE8E10100788BAC /* KMBatchConvertParameter.swift in Sources */,
@@ -16419,6 +16462,7 @@
 				ADA9102A2A272CE2003352F0 /* KMEditPDFTextManager.swift in Sources */,
 				BB24FFE62B2863EF00A59054 /* KMTTSManager.swift in Sources */,
 				BB67EE202B54FFEF00573BF0 /* ASIDataDecompressor.m in Sources */,
+				65341C7C2C646C6400FE30F9 /* KMSearchReplaceHanddler.swift in Sources */,
 				BB897229294B08720045787C /* KMWatermarkAdjectiveTopBarItemModel.swift in Sources */,
 				BB00301D298CB799002DD1A0 /* KMPreferenceManager.swift in Sources */,
 				BBF729A32B19624500576AC5 /* KMAddBackgroundOperationQueue.swift in Sources */,
@@ -17777,6 +17821,7 @@
 				AD68782229A5FADC005B5210 /* KMLightMemberCache.swift in Sources */,
 				ADAFDA492AEA7F1300F084BC /* KMAdvertisementShowView.swift in Sources */,
 				9FE0BBF12B0F2FB000CD1CAC /* KMAnnotationLineWindowController.swift in Sources */,
+				65341C752C63CCFE00FE30F9 /* KMSearchReplaceWindowController.swift in Sources */,
 				AD8F06182999DB5900D93CBC /* KMPrintDrawPage.swift in Sources */,
 				BB147030299DC0D200784A6A /* OIDTokenUtilities.m in Sources */,
 				BB146FD6299DC0D100784A6A /* GTLRObject.m in Sources */,
@@ -17955,6 +18000,7 @@
 				9F0CB53A2986570600007028 /* KMDesignToken+BoxShadow.swift in Sources */,
 				9F02017A2A1B5C0300C9B673 /* KMAIServerConfig.swift in Sources */,
 				9F0CB4B62977BC1000007028 /* KMPropertiesPanelPreviewSubVC.swift in Sources */,
+				65341C7D2C646C6400FE30F9 /* KMSearchReplaceHanddler.swift in Sources */,
 				BB88109B2B4F7CD100AFA63E /* KMVerificationTrialViewController.m in Sources */,
 				9F1FE4E229406E4700E952CA /* GTMNSAnimation+Duration.m in Sources */,
 				BB49ED22293F527700C82CA2 /* KMConvertExcelSettingView.swift in Sources */,
@@ -18797,6 +18843,7 @@
 				BB2EDF7B296ECE17003BCF58 /* KMPageEditThumbnailItem.swift in Sources */,
 				9FD0FA4D29D43D6800F2AB0D /* KMDeviceBrowserWindowController.swift in Sources */,
 				BB146FC2299DC0D100784A6A /* GTMSessionFetcherLogging.m in Sources */,
+				65341C762C63CCFE00FE30F9 /* KMSearchReplaceWindowController.swift in Sources */,
 				ADDF83792B391A5D00A81A4E /* CDSignatureCertificateCustomViewController.swift in Sources */,
 				BB9599C52B31647B0062D346 /* KMRedactPropertiesWindowController.swift in Sources */,
 				AD2D74AF29F0CEB300EDC5E4 /* KMCancellationWindowController.swift in Sources */,
@@ -18873,6 +18920,7 @@
 				89D2D30A295A83B500BFF5FE /* KMEditPDFTextPropertyViewController.swift in Sources */,
 				BB03D69A2B0221FF008C9976 /* NSImage+KMExtension.swift in Sources */,
 				ADBC2CFC299CA6B9006280C8 /* KMPrintDuplexPrintingSetView.swift in Sources */,
+				65341C7E2C646C6400FE30F9 /* KMSearchReplaceHanddler.swift in Sources */,
 				BBC4F9EC2AEB58290098A1A8 /* KMAlertWindowController.swift in Sources */,
 				BB24FFE82B2863EF00A59054 /* KMTTSManager.swift in Sources */,
 				BB897248294C19980045787C /* KMWatermarkAdjectiveListController.swift in Sources */,