Browse Source

【综合】搜索补充内容编辑的模式

tangchao 6 months ago
parent
commit
870c90d715

+ 3 - 0
PDF Office/PDF Master/Class/PDFTools/EditPDF/Tools/KMEditPDfHanddler.swift

@@ -115,6 +115,9 @@ class KMEditPDfHanddler: NSObject {
     private var startPoint_: NSPoint = .zero
     
     func enterEditPDF() {
+        self.viewC?.search(searchString: "", isCase: false, display: true, needShowAll: false)
+        self.viewC?.leftSideViewController.showSearchMode("")
+        
         let toolMode = self.listView?.toolMode ?? .none
         if toolMode != .editPDFToolMode { // 退出
             self.listView?.updateActiveAnnotations([])

+ 6 - 0
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/KMLeftSideViewController.swift

@@ -1280,6 +1280,12 @@ extension KMLeftSideViewController: NSTableViewDelegate, NSTableViewDataSource {
             let row = self.findTableView.selectedRow
             if row >= 0 {
                 let model = self.searchResults[row]
+                let isEditing =  self.listView?.isEditing() ?? false
+                if isEditing {
+                    self.mainViewController?.srHanddler.showSelection(model.selection)
+                    return
+                }
+                
                 self.listView?.go(to: model.selection, animated: true)
 //                self.listView?.setHighlightedSelection(model.selection, animated: true)
                 DispatchQueue.main.asyncAfter(deadline: .now()+0.3) {

+ 67 - 0
PDF Office/PDF Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift

@@ -9,6 +9,73 @@ import Foundation
 
 extension KMMainViewController {
     func search(searchString: String, isCase: Bool, display: Bool = true, needShowAll: Bool = false) {
+        let isEditing = self.listView?.isEditing() ?? false
+        if isEditing {
+            if searchString.isEmpty {
+                self.listView.setHighlightedSelection(nil, animated: false)
+                self.leftSideViewController.searchResults = []
+                
+                if display {
+                    if self.leftSideViewController.findPaneState == .singular {
+                        self.leftSideViewController.displayFindViewAnimating(true)
+                    } else {
+                        self.leftSideViewController.displayGroupedFindViewAnimating(true)
+                    }
+                }
+                return
+            }
+            let isWholeWord = self.leftSideViewController.mwcFlags.wholeWordSearch == 1
+//            self.srHanddler.newSearch(keyword: searchString, isCase: isCase, isWholeWord: isWholeWord) { models in
+//                KMPrint("")
+//            }
+            var opt = CPDFSearchOptions()
+            if isCase == false {
+                opt.insert(.caseSensitive)
+            }
+            if isWholeWord {
+                opt.insert(.matchWholeWord)
+            }
+            
+            let datas = self.srHanddler.pdfView?.document.findEditAllPageString(searchString, with: opt) ?? []
+            if let sel = datas.first?.first {
+                self.srHanddler.showSelection(sel)
+            }
+            
+            self.searchResults.removeAll()
+            var _selections: [CPDFSelection] = []
+            for selections in datas {
+                for selection in selections {
+                    let mode : KMSearchMode = KMSearchMode()
+                    mode.selection = selection
+                    mode.attributedString = KMOCToolClass.getAttributedString(selection: selection, keyword: searchString)
+                    mode.selectionPageIndex = self.listView.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.listView.setHighlightedSelections(_selections)
+            }
+            if _selections.isEmpty {
+                self.listView.setHighlightedSelection(nil, animated: false)
+            }
+            self.listView.setNeedsDisplayAnnotationViewForVisiblePages()
+            self.leftSideViewController.searchResults = self.searchResults
+            
+            if display {
+                if self.leftSideViewController.findPaneState == .singular {
+                    self.leftSideViewController.displayFindViewAnimating(true)
+                } else {
+                    self.leftSideViewController.displayGroupedFindViewAnimating(true)
+                }
+            }
+            return
+        }
+        
         let document = self.listView.document
         if let data = document?.isFinding, data {
             document?.cancelFindString()

+ 3 - 0
PDF Office/PDF Master/Class/PDFWindowController/ViewController/KMMainViewController.swift

@@ -210,6 +210,8 @@ import Cocoa
     var distanceMeasureInfoWindowController: CDistanceMeasureInfoWindowController?
     var perimeterMeasureInfoWindowController: CPerimeterMeasureInfoWindowController?
     var areaMeasureInfoWindowController: CAreaMeasureInfoWindowController?
+    
+    var srHanddler: KMSearchReplaceHanddler = KMSearchReplaceHanddler()
 
     deinit {
         NotificationCenter.default.removeObserver(self)
@@ -364,6 +366,7 @@ import Cocoa
         mwcFlags.settingUpWindow = 1
         toolbarController.delegate = self
         self.editPDFHanddler.viewC = self
+        self.srHanddler.pdfView = self.listView
         
         //TODO: 先让项目运行,看后面怎么调整这段逻辑,目前最外层是 KMBrowserWindowController
         toolbarBox.contentView = toolbarController.view

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

@@ -124,6 +124,50 @@ class KMSearchReplaceHanddler: NSObject {
         }
     }
     
+    func newSearch(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 findEdit
     
     func replace(searchS: String, replaceS: String?, sel: CPDFSelection, callback: @escaping ((CPDFSelection?)->Void)) -> Bool {