浏览代码

【综合】整理代码

tangchao 3 月之前
父节点
当前提交
4007242354

+ 15 - 1
PDF Office/PDF Master/KMClass/Left/Outline/Controller/KMOutlineViewController.swift

@@ -35,6 +35,7 @@ class KMOutlineViewController: KMNBaseViewController {
     var handdler = KMNOutlineHanddler()
     
     private weak var popover_: NSPopover?
+    private var ignoreCase_ = false
     
     private lazy var searchButton_: ComponentButton = {
         let view = ComponentButton()
@@ -115,11 +116,20 @@ class KMOutlineViewController: KMNBaseViewController {
         _hideHeaderSearch()
         headerSearchView_?.itemClick = { [weak self] idx, _ in
             if idx == 1 { // 忽略大小写
-                
+                let ignoreCase = self?.ignoreCase_ ?? false
+                self?.ignoreCase_ = !ignoreCase
             } else if idx == 2 { // 关闭搜索
                 self?._hideHeaderSearch()
+                
+                self?.reloadData()
             }
         }
+        headerSearchView_?.valueDidChange = { [weak self] sender, info in
+            let value = info?[.newKey] as? String ?? ""
+            
+            self?.BOTAOutlineView.searchKey = value
+            self?.reloadData()
+        }
         
         emptyView.wantsLayer = true
         bigTipLabel.stringValue = ""
@@ -356,10 +366,14 @@ class KMOutlineViewController: KMNBaseViewController {
     }
     
     private func _showHeaderSearch() {
+        BOTAOutlineView.isSearchMode = true
+        
+        headerSearchView_?.ignoreCase = ignoreCase_
         headerSearchView_?.isHidden = false
     }
     
     private func _hideHeaderSearch() {
+        BOTAOutlineView.isSearchMode = false
         headerSearchView_?.isHidden = true
     }
     

+ 64 - 0
PDF Office/PDF Master/KMClass/Left/Outline/View/KMBOTAOutlineView.swift

@@ -33,6 +33,9 @@ class KMBOTAOutlineView: BaseXibView {
     
     var dragPDFOutline: KMBOTAOutlineItem!
     
+    var isSearchMode = false
+    var searchKey = ""
+    
     override func draw(_ dirtyRect: NSRect) {
         super.draw(dirtyRect)
 
@@ -111,6 +114,41 @@ class KMBOTAOutlineView: BaseXibView {
         
     }
     
+    func hasContainString(_ searchString: String, rootOutline outline: CPDFOutline) -> Bool {
+        var label = outline.label ?? ""
+        var searchLabel = searchString
+//        if self.outlineIgnoreCaseFlag {
+//            label = label.lowercased()
+//            searchLabel = searchLabel.lowercased()
+//        }
+        if label.contains(searchLabel) {
+//        if ([outline.label rangeOfString:searchString options:self.outlineIgnoreCaseFlag?NSCaseInsensitiveSearch:0].location != NSNotFound){
+            return true
+        } else {
+            var subHas = false
+            for i in 0 ..< outline.numberOfChildren {
+                if let subOutline = outline.child(at: i) {
+                    subHas = self.hasContainString(searchString, rootOutline: subOutline)
+                } else {
+                    continue
+                }
+                if (subHas) {
+                    break
+                }
+            }
+            return subHas
+        }
+    }
+    
+    func fetchOutlines(for item: KMBOTAOutlineItem, searchString: String) -> [KMBOTAOutlineItem] {
+        var items: [KMBOTAOutlineItem] = []
+        for childI in item.children {
+            if self.hasContainString(searchString, rootOutline: childI.outline) {
+                items.append(childI)
+            }
+        }
+        return items
+    }
 }
 
 //MARK: NSOutlineViewDataSource,NSOutlineViewDelegate
@@ -118,8 +156,21 @@ extension KMBOTAOutlineView : NSOutlineViewDataSource,NSOutlineViewDelegate {
     func outlineView(_ outlineView: NSOutlineView, numberOfChildrenOfItem item: Any?) -> Int {
         let outline = item as? KMBOTAOutlineItem
         if outline != nil {
+            if isSearchMode {
+                let ols = self.fetchOutlines(for: outline!, searchString: searchKey)
+                return ols.count
+            }
             return outline?.children.count ?? 0
         } else {
+            if self.isSearchMode { // 是否为搜索模块
+                if self.hasContainString(searchKey, rootOutline: outline!.outline) == false {
+//                    self.showSearchOutlineBlankState(true)
+                    return 0
+                }
+//                self.showSearchOutlineBlankState(false)
+                let ols = self.fetchOutlines(for: outline!, searchString: searchKey)
+                return ols.count
+            }
             return Int(self.data?.outline.numberOfChildren ?? 0)
         }
     }
@@ -127,8 +178,21 @@ extension KMBOTAOutlineView : NSOutlineViewDataSource,NSOutlineViewDelegate {
     func outlineView(_ outlineView: NSOutlineView, child index: Int, ofItem item: Any?) -> Any {
         let outline = item as? KMBOTAOutlineItem
         if outline != nil {
+            if isSearchMode {
+                let ols = self.fetchOutlines(for: outline!, searchString: searchKey)
+                return ols.safe_element(for: index) as Any
+            }
             return outline?.children[index] as Any
         } else {
+            if self.isSearchMode { // 是否为搜索模块
+                if self.hasContainString(searchKey, rootOutline: outline!.outline) == false {
+//                    self.showSearchOutlineBlankState(true)
+                    return 0
+                }
+//                self.showSearchOutlineBlankState(false)
+                let ols = self.fetchOutlines(for: outline!, searchString: searchKey)
+                return ols.count
+            }
             return self.data?.children[index] as Any
         }
     }

+ 4 - 1
PDF Office/PDF Master/KMClass/Left/Outline/View/KMNBotaHeaderSearchView.swift

@@ -18,6 +18,8 @@ class KMNBotaHeaderSearchView: NSView, NibLoadable {
     var itemClick: KMCommonClickBlock?
     var valueDidChange: KMValueDidChangeBlock?
     
+    var ignoreCase = false
+    
     private var groupView_: ComponentGroup?
     
     private lazy var searchButton_: ComponentButton = {
@@ -65,7 +67,7 @@ class KMNBotaHeaderSearchView: NSView, NibLoadable {
         var menuItemArr: [ComponentMenuitemProperty] = []
         let titles = ["Ignore Case"]
         for i in titles {
-            let menuI: ComponentMenuitemProperty = ComponentMenuitemProperty(multipleSelect: false, itemSelected: false, isDisabled: false, keyEquivalent: nil, text: KMLocalizedString(i))
+            let menuI: ComponentMenuitemProperty = ComponentMenuitemProperty(multipleSelect: true, itemSelected: ignoreCase, isDisabled: false, keyEquivalent: nil, text: KMLocalizedString(i))
             menuItemArr.append(menuI)
             viewHeight += 36
         }
@@ -98,6 +100,7 @@ extension KMNBotaHeaderSearchView: ComponentInputDelegate {
 
 extension KMNBotaHeaderSearchView: ComponentGroupDelegate {
     func componentGroupDidSelect(group: ComponentGroup?, menuItemProperty: ComponentMenuitemProperty?) {
+        ignoreCase = !ignoreCase
         itemClick?(1)
     }