Browse Source

Merge branch 'develop_2025' of git.kdan.cc:Mac_PDF/PDF_Office into develop_2025

niehaoyu 4 months ago
parent
commit
2ac70b6643

+ 257 - 194
PDF Office/PDF Master/KMClass/ImageToPDF/Base/KMBatchOperateLeftViewController.swift

@@ -10,34 +10,20 @@ import KMComponentLibrary
 
 
 let KMBatchDragType = "KMBatchDragType"
 let KMBatchDragType = "KMBatchDragType"
 
 
-class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegate,NSTableViewDataSource{
-    
+class KMBatchOperateLeftViewController: KMNBaseViewController {
     @IBOutlet var selectFileButton: KMLongerButton!
     @IBOutlet var selectFileButton: KMLongerButton!
-    
     @IBOutlet var deleteFileButton: NSButton!
     @IBOutlet var deleteFileButton: NSButton!
-    
     @IBOutlet var tableView: NSTableView!
     @IBOutlet var tableView: NSTableView!
-    
     @IBOutlet var indexTableColumn: NSTableColumn!
     @IBOutlet var indexTableColumn: NSTableColumn!
-    
     @IBOutlet var fileNameTableColumn: NSTableColumn!
     @IBOutlet var fileNameTableColumn: NSTableColumn!
-    
     @IBOutlet var pageRangeTableColumn: NSTableColumn!
     @IBOutlet var pageRangeTableColumn: NSTableColumn!
-    
     @IBOutlet var sizeTableColumn: NSTableColumn!
     @IBOutlet var sizeTableColumn: NSTableColumn!
-    
     @IBOutlet var stateTableColumn: NSTableColumn!
     @IBOutlet var stateTableColumn: NSTableColumn!
-    
     @IBOutlet var DPIColumn: NSTableColumn!
     @IBOutlet var DPIColumn: NSTableColumn!
-    
     @IBOutlet var dimensionsTableColumn: NSTableColumn!
     @IBOutlet var dimensionsTableColumn: NSTableColumn!
-    
     @IBOutlet var headerOperateView: NSView!
     @IBOutlet var headerOperateView: NSView!
-    
     @IBOutlet var showInFinderMenuItem: NSMenuItem!
     @IBOutlet var showInFinderMenuItem: NSMenuItem!
-    
     @IBOutlet var deleteMenuItem: NSMenuItem!
     @IBOutlet var deleteMenuItem: NSMenuItem!
-    
     @IBOutlet var blankView: KMBlankView!
     @IBOutlet var blankView: KMBlankView!
     
     
     var files: [KMBatchOperateFile] = []
     var files: [KMBatchOperateFile] = []
@@ -49,9 +35,7 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
     
     
     private var addFileButton_: ComponentDropdown?
     private var addFileButton_: ComponentDropdown?
     private var deleteButton_: ComponentButton?
     private var deleteButton_: ComponentButton?
-    
     private var groupView_: ComponentGroup?
     private var groupView_: ComponentGroup?
-    
     private var emptyViewTopLine: NSView = {
     private var emptyViewTopLine: NSView = {
         let view = NSView()
         let view = NSView()
         view.wantsLayer = true
         view.wantsLayer = true
@@ -63,15 +47,17 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
         return view
         return view
     }()
     }()
     
     
+    private var dividerColor_: NSColor?
+    
+    private var isSizeAsc_ = false
+    private var dimensionsAsc_ = false
+    private var fileNameAsc_ = false
+    
     deinit {
     deinit {
-        NotificationCenter.default.removeObserver(self)
         DistributedNotificationCenter.default().removeObserver(self)
         DistributedNotificationCenter.default().removeObserver(self)
     }
     }
     override func viewDidLoad() {
     override func viewDidLoad() {
         super.viewDidLoad()
         super.viewDidLoad()
-        NotificationCenter.default.addObserver(self.tableView!, selector: #selector(self.reloadData), name: NSNotification.Name(kNeedChangePageRangeNotification), object: nil)
-        NotificationCenter.default.addObserver(self, selector: #selector(imageToPDFSuccessNotification(aNotification:)), name: NSNotification.Name("KMBatchOperateImageToPDFSuccessNotification"), object: nil)
-        DistributedNotificationCenter.default.addObserver(self, selector: #selector(themeChanged(notification:)), name: NSNotification.Name("AppleInterfaceThemeChangedNotification"), object: nil)
         
         
         for i in 0..<self.tableView.tableColumns.count {
         for i in 0..<self.tableView.tableColumns.count {
             let column = self.tableView.tableColumns[i]
             let column = self.tableView.tableColumns[i]
@@ -89,35 +75,31 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
         self.dimensionsTableColumn.resizingMask =  []
         self.dimensionsTableColumn.resizingMask =  []
         self.tableView.moveColumn(5, toColumn: 2)
         self.tableView.moveColumn(5, toColumn: 2)
         
         
-        self.indexTableColumn.title = "  \(NSLocalizedString("Index", comment: ""))"
-        self.fileNameTableColumn.title = NSLocalizedString("File Name", comment: "")
-        self.pageRangeTableColumn.title = NSLocalizedString("Page Range", comment: "")
-        self.sizeTableColumn.title = NSLocalizedString("Size", comment: "")
-        self.stateTableColumn.title = NSLocalizedString("Status", comment: "")
-        self.DPIColumn.title = NSLocalizedString("DPI", comment: "")
-        self.dimensionsTableColumn.title = NSLocalizedString("Dimensions", comment: "")
+        self.indexTableColumn.title = "  \(KMLocalizedString("Index", comment: ""))"
+        self.fileNameTableColumn.title = KMLocalizedString("File Name", comment: "")
+        self.pageRangeTableColumn.title = KMLocalizedString("Page Range", comment: "")
+        self.sizeTableColumn.title = KMLocalizedString("Size", comment: "")
+        self.stateTableColumn.title = KMLocalizedString("Status", comment: "")
+        self.DPIColumn.title = KMLocalizedString("DPI", comment: "")
+        self.dimensionsTableColumn.title = KMLocalizedString("Dimensions", comment: "")
         
         
         self.DPIColumn.isHidden = true
         self.DPIColumn.isHidden = true
         self.tableView.intercellSpacing = CGSize(width: 0, height: 0)
         self.tableView.intercellSpacing = CGSize(width: 0, height: 0)
-//        self.tableView.backgroundColor = KMAppearance.Layout.bgColor()
         self.tableView.allowsColumnReordering = false
         self.tableView.allowsColumnReordering = false
         self.tableView.allowsMultipleSelection = true
         self.tableView.allowsMultipleSelection = true
         self.tableView.enclosingScrollView?.borderType = .noBorder
         self.tableView.enclosingScrollView?.borderType = .noBorder
         
         
         self.headerOperateView.wantsLayer = true
         self.headerOperateView.wantsLayer = true
         
         
-        self.tableView.registerForDraggedTypes([NSPasteboard.PasteboardType.string,NSPasteboard.PasteboardType.fileURL]) //[KMBatchDragType,NSFilenamesPboardType]
+        self.tableView.registerForDraggedTypes([NSPasteboard.PasteboardType.string,NSPasteboard.PasteboardType.fileURL, NSPasteboard.PasteboardType(KMBatchDragType)])
         self.lockFilePathArr = NSMutableArray()
         self.lockFilePathArr = NSMutableArray()
         self.lockFileIndex = 0
         self.lockFileIndex = 0
         self.progressInt = 0
         self.progressInt = 0
         
         
-//        self.selectFileButton.containerViewController = self
         selectFileButton.title = ""
         selectFileButton.title = ""
         addFileButton_ = ComponentDropdown()
         addFileButton_ = ComponentDropdown()
-//        addFileButton_?.properties = ComponentButtonProperty(type: .gray, size: .s, state: .normal, showLeftIcon: true,buttonText: KMLocalizedString("Add Files"), icon: NSImage(named: "KMImageNameAddFilesIcon"))
         addFileButton_?.properties = ComponentDropdownProperty(type: .split_graySecondary, size: .s, split: true, text: KMLocalizedString("Add Files..."))
         addFileButton_?.properties = ComponentDropdownProperty(type: .split_graySecondary, size: .s, split: true, text: KMLocalizedString("Add Files..."))
 //        addFileButton_?.splitRightButton.properties.icon = NSImage(named: "ImageToPDFDropdownButtonIcon")
 //        addFileButton_?.splitRightButton.properties.icon = NSImage(named: "ImageToPDFDropdownButtonIcon")
-//        addFileButton_?.setTarget(self, action: #selector(cancelButtonAction))
         
         
         selectFileButton.addSubview(addFileButton_!)
         selectFileButton.addSubview(addFileButton_!)
         addFileButton_?.frame = selectFileButton.bounds
         addFileButton_?.frame = selectFileButton.bounds
@@ -134,15 +116,10 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
         deleteButton_?.properties.propertyInfo.leftIcon_nor = NSImage(named: "KMImageNameDeleteFileIcon")
         deleteButton_?.properties.propertyInfo.leftIcon_nor = NSImage(named: "KMImageNameDeleteFileIcon")
         deleteButton_?.setTarget(self, action: #selector(buttonClicked_DeleteFile))
         deleteButton_?.setTarget(self, action: #selector(buttonClicked_DeleteFile))
         
         
-//        tableView.headerView?.wantsLayer = true
-//        tableView.headerView?.layer?.backgroundColor = NSColor.blue.cgColor
-//        var frame = tableView.headerView?.frame
-//        frame?.size.height = 32
-//        tableView.headerView?.frame = frame ?? .zero
         tableView.headerView = nil
         tableView.headerView = nil
         
         
-        self.showInFinderMenuItem.title = NSLocalizedString("Show in Finder", comment: "")
-        self.deleteMenuItem.title = NSLocalizedString("Delete", comment: "")
+        self.showInFinderMenuItem.title = KMLocalizedString("Show in Finder", comment: "")
+        self.deleteMenuItem.title = KMLocalizedString("Delete", comment: "")
         self.blankView.wantsLayer = true
         self.blankView.wantsLayer = true
         self.blankView.layer?.backgroundColor = NSColor.clear.cgColor
         self.blankView.layer?.backgroundColor = NSColor.clear.cgColor
         self.blankView.titleLabel.stringValue = ""
         self.blankView.titleLabel.stringValue = ""
@@ -150,17 +127,9 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
         self.blankView.addButton.isHidden = true
         self.blankView.addButton.isHidden = true
         self.blankView.secondTitleLabel.stringValue = ""
         self.blankView.secondTitleLabel.stringValue = ""
         self.blankView.mouseActionCallBack = { [weak self] mouseType in
         self.blankView.mouseActionCallBack = { [weak self] mouseType in
-//            guard let self = self else { return }
-//            if mouseType == .mouseEnter {
-//                self.blankView.imageView.image = NSImage(named: "KMImageNameEmptyListHov")
-//            } else if mouseType == .mouseExit {
-//                self.blankView.imageView.image = NSImage(named: "KMImageNameEmptyListNor")
-//            } else if mouseType == .mouseDown {
-//                self.blankView.imageView.image = NSImage(named: "KMImageNameEmptyListPre")
-//                self.chooseFile()
-//            } else if mouseType == .mouseUp {
-//                self.blankView.imageView.image = NSImage(named: "KMImageNameEmptyListHov")
-//            }
+             if mouseType == .mouseDown {
+                self?.chooseFile()
+            }
         }
         }
         self.blankView.addSubview(emptyView_)
         self.blankView.addSubview(emptyView_)
         
         
@@ -178,8 +147,13 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
         emptyView_.km_add_leading_constraint()
         emptyView_.km_add_leading_constraint()
         emptyView_.km_add_trailing_constraint()
         emptyView_.km_add_trailing_constraint()
         emptyView_.setTarget(self, action: #selector(emptyAddFileAction))
         emptyView_.setTarget(self, action: #selector(emptyAddFileAction))
+    }
+    
+    override func addNotifations() {
+        super.addNotifations()
         
         
-        updateViewColor()
+        NotificationCenter.default.addObserver(self.tableView!, selector: #selector(self.reloadData), name: NSNotification.Name(kNeedChangePageRangeNotification), object: nil)
+        NotificationCenter.default.addObserver(self, selector: #selector(imageToPDFSuccessNotification(aNotification:)), name: NSNotification.Name("KMBatchOperateImageToPDFSuccessNotification"), object: nil)
     }
     }
     
     
     override func updateUILanguage() {
     override func updateUILanguage() {
@@ -188,6 +162,20 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
         KMMainThreadExecute {
         KMMainThreadExecute {
             self.addFileButton_?.properties.text = KMLocalizedString("Add Files...")
             self.addFileButton_?.properties.text = KMLocalizedString("Add Files...")
             self.addFileButton_?.reloadData()
             self.addFileButton_?.reloadData()
+            
+            self.tableView.reloadData()
+        }
+    }
+    
+    override func updateUIThemeColor() {
+        super.updateUIThemeColor()
+        
+        self.dividerColor_ =  ComponentLibrary.shared.getComponentColorFromKey("colorBorder/divider")
+        
+        KMMainThreadExecute {
+            self.updateViewColor()
+            
+            self.tableView.reloadData()
         }
         }
     }
     }
     
     
@@ -213,18 +201,13 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
             self.tableView.reloadData()
             self.tableView.reloadData()
         }
         }
     }
     }
-    @objc func themeChanged(notification: Notification) {
-        DispatchQueue.main.asyncAfter(deadline: .now() + 0.3, execute: {
-            self.updateViewColor()
-        })
-    }
     
     
     func updateViewColor() {
     func updateViewColor() {
         self.view.wantsLayer = true
         self.view.wantsLayer = true
         if KMAppearance.isDarkMode() {
         if KMAppearance.isDarkMode() {
-//            self.headerOperateView.layer?.backgroundColor = NSColor(red: 0.055, green: 0.067, blue: 0.078, alpha: 1).cgColor
+            let color = ComponentLibrary.shared.getComponentColorFromKey("colorBg/layout-low")
+            view.layer?.backgroundColor = color.cgColor
         } else {
         } else {
-//            self.headerOperateView.layer?.backgroundColor = NSColor(red: 0.922, green: 0.925, blue: 0.941, alpha: 1).cgColor
             view.layer?.backgroundColor = .white
             view.layer?.backgroundColor = .white
         }
         }
     }
     }
@@ -256,7 +239,7 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
         panel.canChooseFiles = true
         panel.canChooseFiles = true
 #if VERSION_FREE
 #if VERSION_FREE
 #else
 #else
-        panel.message = NSLocalizedString("To select multiple files press cmd ⌘ button on keyboard and click on the target files one by one.", comment: "")
+        panel.message = KMLocalizedString("To select multiple files press cmd ⌘ button on keyboard and click on the target files one by one.", comment: "")
 #endif
 #endif
         panel.beginSheetModal(for: self.view.window!) {
         panel.beginSheetModal(for: self.view.window!) {
             (result) in
             (result) in
@@ -350,8 +333,8 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
             }
             }
         }
         }
     }
     }
+    
     func openPasswordWindow() {
     func openPasswordWindow() {
-        
         if lockFilePathArr!.count > lockFileIndex {
         if lockFilePathArr!.count > lockFileIndex {
             let filePath = lockFilePathArr![lockFileIndex] as! String
             let filePath = lockFilePathArr![lockFileIndex] as! String
             KMBaseWindowController.checkPassword(url: URL(fileURLWithPath: filePath), type: .owner) { [unowned self] success, resultPassword in
             KMBaseWindowController.checkPassword(url: URL(fileURLWithPath: filePath), type: .owner) { [unowned self] success, resultPassword in
@@ -373,10 +356,13 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
             }
             }
         }
         }
     }
     }
+    
     func closePwd() {
     func closePwd() {
         self.km_endSheet()
         self.km_endSheet()
     }
     }
     
     
+    // MARK: - Actions
+    
     func chooseFileFromCamera() {
     func chooseFileFromCamera() {
         self.progressInt = 0
         self.progressInt = 0
         let vc = KMDeviceBrowserWindowController.shared
         let vc = KMDeviceBrowserWindowController.shared
@@ -396,10 +382,6 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
         vc.showWindow(nil)
         vc.showWindow(nil)
     }
     }
     
     
-    @IBAction func buttonClicked_SelectFile(_ sender: Any) {
-        
-    }
-    
     
     
     @IBAction func blankViewAddFileAction(_ sender: Any) {
     @IBAction func blankViewAddFileAction(_ sender: Any) {
         self.chooseFile()
         self.chooseFile()
@@ -414,22 +396,17 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
             self.files = newArr as! [KMBatchOperateFile]
             self.files = newArr as! [KMBatchOperateFile]
             self.tableView.reloadData()
             self.tableView.reloadData()
         } else {
         } else {
-//            if KMAlertWindowController.needShowRemoveAllFilesHint() {
-                let alert = NSAlert()
-                alert.alertStyle = .critical
-                alert.messageText = KMLocalizedString("Clear All Recents", comment: "")+"?"
-                alert.addButton(withTitle: KMLocalizedString("Delete", comment: ""))
-                alert.addButton(withTitle: KMLocalizedString("Cancel", comment: ""))
-                alert.beginSheetModal(for: self.view.window!) {[weak self] response in
-                    if response == NSApplication.ModalResponse.alertFirstButtonReturn {
-                        self?.files.removeAll()
-                        self?.tableView.reloadData()
-                    }
+            let alert = NSAlert()
+            alert.alertStyle = .critical
+            alert.messageText = KMLocalizedString("Clear All Recents", comment: "")+"?"
+            alert.addButton(withTitle: KMLocalizedString("Delete", comment: ""))
+            alert.addButton(withTitle: KMLocalizedString("Cancel", comment: ""))
+            alert.beginSheetModal(for: self.view.window!) {[weak self] response in
+                if response == NSApplication.ModalResponse.alertFirstButtonReturn {
+                    self?.files.removeAll()
+                    self?.tableView.reloadData()
                 }
                 }
-//            } else {
-//                self.files.removeAll()
-//                self.tableView.reloadData()
-//            }
+            }
         }
         }
     }
     }
     func fetchAvailableFilesInFolder(_ folderPath: String) -> [String] {
     func fetchAvailableFilesInFolder(_ folderPath: String) -> [String] {
@@ -447,7 +424,6 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
                     array.append(path)
                     array.append(path)
                 }
                 }
             }
             }
-//            UTTypeString?.release()
         }
         }
         return array
         return array
     }
     }
@@ -468,13 +444,13 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
                     containFile = true
                     containFile = true
                 }
                 }
             }
             }
-//            UTTypeString?.release()
             if containFile {
             if containFile {
                 break
                 break
             }
             }
         }
         }
         return containFile
         return containFile
     }
     }
+    
     func switchToOperateType(_ type: KMBatchOperationType) {
     func switchToOperateType(_ type: KMBatchOperationType) {
         self.type = type
         self.type = type
         self.indexTableColumn.isHidden = false
         self.indexTableColumn.isHidden = false
@@ -493,7 +469,7 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
         self.selectFileButton.isImageToPDF = type == .CreatePDF
         self.selectFileButton.isImageToPDF = type == .CreatePDF
         if type == .CreatePDF {
         if type == .CreatePDF {
             self.pageRangeTableColumn.isHidden = false
             self.pageRangeTableColumn.isHidden = false
-            self.pageRangeTableColumn.title = NSLocalizedString("Dimensions", comment: "")
+            self.pageRangeTableColumn.title = KMLocalizedString("Dimensions", comment: "")
         }
         }
         
         
         for i in 0..<self.files.count {
         for i in 0..<self.files.count {
@@ -527,14 +503,10 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
         for i in 0..<documentArray.count {
         for i in 0..<documentArray.count {
             let document = documentArray[i]
             let document = documentArray[i]
             let path: String = document.fileURL?.path ?? ""
             let path: String = document.fileURL?.path ?? ""
-//            let UTTypeString = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, path!.customPathExtension as CFString, nil)
             let UTTypeString = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, path.customPathExtension as CFString, nil)?.takeRetainedValue() as String?
             let UTTypeString = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, path.customPathExtension as CFString, nil)?.takeRetainedValue() as String?
             let TypeCFString = UTTypeString as CFString?
             let TypeCFString = UTTypeString as CFString?
             if UTTypeConformsTo(TypeCFString!, kUTTypePDF) {
             if UTTypeConformsTo(TypeCFString!, kUTTypePDF) {
                 pdfArray.add(path as Any)
                 pdfArray.add(path as Any)
-//                UTTypeString?.release()
-            } else {
-//                UTTypeString?.release()
             }
             }
         }
         }
         if !IAPProductsManager.default().isAvailableAllFunction() {
         if !IAPProductsManager.default().isAvailableAllFunction() {
@@ -548,8 +520,6 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
         addFilesToList(addArray: pdfArray)
         addFilesToList(addArray: pdfArray)
     }
     }
     
     
-    // MARK: - Actions
-    
     @objc func emptyAddFileAction() {
     @objc func emptyAddFileAction() {
         self.chooseFile()
         self.chooseFile()
     }
     }
@@ -616,7 +586,7 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
             document = CPDFDocument(data: data)
             document = CPDFDocument(data: data)
             
             
         } else if let outError = outError {
         } else if let outError = outError {
-            outError.pointee = NSError(domain: "SKDocumentErrorDomain", code: 3, userInfo: [NSLocalizedDescriptionKey: NSLocalizedString("Unable to load data from clipboard", comment: "Error description")])
+            outError.pointee = NSError(domain: "SKDocumentErrorDomain", code: 3, userInfo: [NSLocalizedDescriptionKey: KMLocalizedString("Unable to load data from clipboard", comment: "Error description")])
         }
         }
     
     
         return document
         return document
@@ -655,7 +625,133 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
         }
         }
     }
     }
     
     
+    private func _initHeaderCellView(cellView: KMNTableHeaderCellView) {
+        var dividerColor = self.dividerColor_
+        if dividerColor == nil {
+            dividerColor = ComponentLibrary.shared.getComponentColorFromKey("colorBorder/divider")
+        }
+        
+        cellView.leftLine.wantsLayer = true
+        cellView.leftLine.layer?.backgroundColor = dividerColor?.cgColor ?? .black
+        cellView.rightLine.wantsLayer = true
+        cellView.rightLine.layer?.backgroundColor = dividerColor?.cgColor ?? .black
+        cellView.bottomLine.wantsLayer = true
+        cellView.bottomLine.layer?.backgroundColor = dividerColor?.cgColor ?? .black
+    }
+    
+    private func _addFolderAction() {
+        let openPanel = NSOpenPanel()
+//        openPanel.title = NSLocalizedString("选择并合并文件。按下键盘上的命令按钮,逐次点击目标文件,即可选择多个文件", comment: "")
+        openPanel.canChooseDirectories = true
+        openPanel.canChooseFiles = false
+        openPanel.allowsMultipleSelection = true
+        
+        openPanel.beginSheetModal(for: view.window!, completionHandler: { [self] result in
+            if result != .OK {
+                
+            } else {
+                var result: [URL] = []
+                for folderURL in openPanel.urls {
+                    _findAllFiles(folder: folderURL, result: &result)
+                }
+                
+                var paths: [String] = []
+                for url in result {
+                    paths.append(url.path)
+                }
+                self.addFilesToList(addArray: NSMutableArray(array: paths))
+            }
+        })
+    }
     
     
+    private func _findAllFiles(folder: URL, result: inout [URL]) {
+        let fileManager = FileManager.default
+        var isDirectory: ObjCBool = ObjCBool(false)
+        fileManager.fileExists(atPath: folder.path, isDirectory: &isDirectory)
+        if (!isDirectory.boolValue) {
+            return
+        }
+        
+        let contents = try?fileManager.contentsOfDirectory(at: folder, includingPropertiesForKeys: nil)
+        if contents?.count == 0 {
+            return
+        }
+        
+        let array = ["jpg","cur","bmp","jpeg","gif","png","tiff","tif","ico","icns","tga","psd","eps","hdr","jp2","jpc","pict","sgi","heic"]
+        for documentURL in contents! {
+            var isDirectory: ObjCBool = ObjCBool(false)
+            fileManager.fileExists(atPath: documentURL.path, isDirectory: &isDirectory)
+            if (isDirectory.boolValue) {
+                _findAllFiles(folder: documentURL, result: &result)
+            } else {
+                if !array.contains(documentURL.pathExtension.lowercased()) {
+                    continue
+                }
+                
+                result.append(documentURL)
+            }
+        }
+    }
+    
+    func switchToOperateType(_ operateType: KMBatchOperationType, files: [KMBatchOperateFile]) {
+        switchToOperateType(operateType)
+        self.files = files 
+        self.tableView.reloadData()
+    }
+    func checkNeedPasswordSwitchToOperateType(_ operateType: KMBatchOperationType, files: [KMBatchOperateFile]) {
+        switchToOperateType(operateType)
+        var arr: [String] = []
+        for i in 0..<files.count {
+            let file = files[i]
+            arr.append(file.filePath)
+        }
+        
+        self.files = files
+        self.files.removeAll()
+        addFilesToList(addArray: NSMutableArray.init(array: arr))
+        self.tableView.reloadData()
+    }
+    func reloadFile(_ file: KMBatchOperateFile) {
+        var rowIndexSet = IndexSet()
+        for i in 0..<self.files.count {
+            if file.filePath == self.files[i].filePath {
+                rowIndexSet.insert(i)
+                break
+            }
+        }
+        var columnIndexSet = IndexSet()
+        for i in 0..<self.tableView.numberOfColumns {
+            let identifier = self.tableView.tableColumns[i].identifier
+            if identifier.rawValue == "status" {
+                columnIndexSet.insert(i)
+                break
+            }
+        }
+        
+        if Thread.isMainThread {
+            self.tableView.reloadData(forRowIndexes: rowIndexSet, columnIndexes: columnIndexSet)
+        } else {
+            DispatchQueue.main.async {
+                self.tableView.reloadData(forRowIndexes: rowIndexSet, columnIndexes: columnIndexSet)
+            }
+        }
+    }
+    func refreshConvertProgress(_ progress: CGFloat, file: KMBatchOperateFile) {
+        self.tableView.reloadData()
+    }
+    func reloadConvertInterface(withType type: KMConvertWithPDFType) {
+        if type == .WordAdvance || type == .WordStandard || type == .Excel || type == .PowerPoint || type == .RTF || type == .CSV || type == .HTML || type == .Text || type == .Json {
+            self.DPIColumn.isHidden = true
+        } else {
+            self.DPIColumn.isHidden = false
+        }
+        self.tableView.reloadData()
+    }
+}
+
+// MARK: - NSTableViewDelegate,NSTableViewDataSource
+
+extension KMBatchOperateLeftViewController: NSTableViewDelegate,NSTableViewDataSource {
     func numberOfRows(in tableView: NSTableView) -> Int {
     func numberOfRows(in tableView: NSTableView) -> Int {
         NotificationCenter.default.post(name: NSNotification.Name(rawValue: "KMBatchFilesCountNotification"), object: self.files, userInfo: [kObjectKey : self])
         NotificationCenter.default.post(name: NSNotification.Name(rawValue: "KMBatchFilesCountNotification"), object: self.files, userInfo: [kObjectKey : self])
         self.deleteFileButton.isEnabled = self.files.count > 0
         self.deleteFileButton.isEnabled = self.files.count > 0
@@ -666,6 +762,7 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
         }
         }
         return self.files.count + 1;
         return self.files.count + 1;
     }
     }
+    
     func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
     func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
         let identifier = tableColumn?.identifier
         let identifier = tableColumn?.identifier
         
         
@@ -673,7 +770,6 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
         let file = self.files[rowIdx]
         let file = self.files[rowIdx]
         
         
         let cellColor = ComponentLibrary.shared.getComponentColorFromKey("olorFill/4")
         let cellColor = ComponentLibrary.shared.getComponentColorFromKey("olorFill/4")
-        let dividerColor = ComponentLibrary.shared.getComponentColorFromKey("colorBorder/divider")
         let titleFont = ComponentLibrary.shared.getFontFromKey("mac/body-s-medium")
         let titleFont = ComponentLibrary.shared.getFontFromKey("mac/body-s-medium")
         let titleColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/1")
         let titleColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/1")
       
       
@@ -686,17 +782,12 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
 
 
                 cellView.titleLabel.stringValue = KMLocalizedString("")
                 cellView.titleLabel.stringValue = KMLocalizedString("")
                 
                 
-                cellView.leftLine.wantsLayer = true
-                cellView.leftLine.layer?.backgroundColor = dividerColor.cgColor
-                cellView.rightLine.wantsLayer = true
-                cellView.rightLine.layer?.backgroundColor = dividerColor.cgColor
-                cellView.bottomLine.wantsLayer = true
-                cellView.bottomLine.layer?.backgroundColor = dividerColor.cgColor
+                _initHeaderCellView(cellView: cellView)
                 return cellView
                 return cellView
             }
             }
             let cellView = KMBatchTableCellView(type: .Size)
             let cellView = KMBatchTableCellView(type: .Size)
             _ = row + 1
             _ = row + 1
-            cellView.textField?.stringValue = String(format: "%d", row + 1);
+            cellView.textField?.stringValue = String(format: "%d", row);
             return cellView;
             return cellView;
         } else if identifier?.rawValue == "pageRange"{
         } else if identifier?.rawValue == "pageRange"{
             if (file.currentOperateType == .CreatePDF) {
             if (file.currentOperateType == .CreatePDF) {
@@ -709,12 +800,19 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
                     cellView.titleLabel.font = titleFont
                     cellView.titleLabel.font = titleFont
                     cellView.titleLabel.textColor = titleColor
                     cellView.titleLabel.textColor = titleColor
 
 
-                    cellView.leftLine.wantsLayer = true
-                    cellView.leftLine.layer?.backgroundColor = dividerColor.cgColor
-                    cellView.rightLine.wantsLayer = true
-                    cellView.rightLine.layer?.backgroundColor = dividerColor.cgColor
-                    cellView.bottomLine.wantsLayer = true
-                    cellView.bottomLine.layer?.backgroundColor = dividerColor.cgColor
+                    _initHeaderCellView(cellView: cellView)
+                    cellView.itemClick = { [weak self] idx, _ in
+                        if idx == 1 { // 排序
+                            let asc = self?.dimensionsAsc_ ?? false
+                            if asc {
+                                self?.files.sort(){$0.dimensions > $1.dimensions}
+                            } else {
+                                self?.files.sort(){$0.dimensions <= $1.dimensions}
+                            }
+                            self?.dimensionsAsc_ = !asc
+                            self?.reloadData()
+                        }
+                    }
                     return cellView
                     return cellView
                 }
                 }
                 let cellView = KMBatchTableCellView(type: .Size)
                 let cellView = KMBatchTableCellView(type: .Size)
@@ -722,6 +820,7 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
                 if (file.fileType == .Image) {
                 if (file.fileType == .Image) {
                     let image = NSImage(contentsOfFile: file.filePath)
                     let image = NSImage(contentsOfFile: file.filePath)
                     cellView.textField?.stringValue = String(Int(image?.size.width ?? 0)) + "x" + String(Int(image?.size.height ?? 0))
                     cellView.textField?.stringValue = String(Int(image?.size.width ?? 0)) + "x" + String(Int(image?.size.height ?? 0))
+                    file.dimensions = Float((image?.size.width ?? 0) * (image?.size.height ?? 0))
                 }
                 }
              
              
                 return cellView;
                 return cellView;
@@ -740,12 +839,7 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
                 cellView.titleLabel.font = titleFont
                 cellView.titleLabel.font = titleFont
                 cellView.titleLabel.textColor = titleColor
                 cellView.titleLabel.textColor = titleColor
                 
                 
-                cellView.leftLine.wantsLayer = true
-                cellView.leftLine.layer?.backgroundColor = dividerColor.cgColor
-                cellView.rightLine.wantsLayer = true
-                cellView.rightLine.layer?.backgroundColor = dividerColor.cgColor
-                cellView.bottomLine.wantsLayer = true
-                cellView.bottomLine.layer?.backgroundColor = dividerColor.cgColor
+                _initHeaderCellView(cellView: cellView)
                 return cellView
                 return cellView
             }
             }
             let cellView = KMBatchTableCellView(type: .Status)
             let cellView = KMBatchTableCellView(type: .Status)
@@ -769,12 +863,19 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
                 cellView.titleLabel.font = titleFont
                 cellView.titleLabel.font = titleFont
                 cellView.titleLabel.textColor = titleColor
                 cellView.titleLabel.textColor = titleColor
 
 
-                cellView.leftLine.wantsLayer = true
-                cellView.leftLine.layer?.backgroundColor = dividerColor.cgColor
-                cellView.rightLine.wantsLayer = true
-                cellView.rightLine.layer?.backgroundColor = dividerColor.cgColor
-                cellView.bottomLine.wantsLayer = true
-                cellView.bottomLine.layer?.backgroundColor = dividerColor.cgColor
+                _initHeaderCellView(cellView: cellView)
+                cellView.itemClick = { [weak self] idx, _ in
+                    if idx == 1 { // 排序
+                        let asc = self?.isSizeAsc_ ?? false
+                        if asc {
+                            self?.files.sort(){$0.fileSize > $1.fileSize}
+                        } else {
+                            self?.files.sort(){$0.fileSize <= $1.fileSize}
+                        }
+                        self?.isSizeAsc_ = !asc
+                        self?.reloadData()
+                    }
+                }
                 return cellView
                 return cellView
             }
             }
             let cellView = KMBatchTableCellView(type: .Size)
             let cellView = KMBatchTableCellView(type: .Size)
@@ -790,12 +891,19 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
                 cellView.titleLabel.font = titleFont
                 cellView.titleLabel.font = titleFont
                 cellView.titleLabel.textColor = titleColor
                 cellView.titleLabel.textColor = titleColor
 
 
-                cellView.leftLine.wantsLayer = true
-                cellView.leftLine.layer?.backgroundColor = dividerColor.cgColor
-                cellView.rightLine.wantsLayer = true
-                cellView.rightLine.layer?.backgroundColor = dividerColor.cgColor
-                cellView.bottomLine.wantsLayer = true
-                cellView.bottomLine.layer?.backgroundColor = dividerColor.cgColor
+                _initHeaderCellView(cellView: cellView)
+                cellView.itemClick = { [weak self] idx, _ in
+                    if idx == 1 { // 排序
+                        let asc = self?.fileNameAsc_ ?? false
+                        if asc {
+                            self?.files.sort(){$0.filePath.lastPathComponent > $1.filePath.lastPathComponent}
+                        } else {
+                            self?.files.sort(){$0.filePath.lastPathComponent <= $1.filePath.lastPathComponent}
+                        }
+                        self?.fileNameAsc_ = !asc
+                        self?.reloadData()
+                    }
+                }
                 return cellView
                 return cellView
             }
             }
             let cellView = KMBatchTableCellView(type: .FileName)
             let cellView = KMBatchTableCellView(type: .FileName)
@@ -824,13 +932,7 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
                 cellView.titleLabel.font = titleFont
                 cellView.titleLabel.font = titleFont
                 cellView.titleLabel.textColor = titleColor
                 cellView.titleLabel.textColor = titleColor
 
 
-                cellView.leftLine.wantsLayer = true
-                cellView.leftLine.layer?.backgroundColor = dividerColor.cgColor
-                cellView.rightLine.wantsLayer = true
-                cellView.rightLine.layer?.backgroundColor = dividerColor.cgColor
-                cellView.bottomLine.wantsLayer = true
-                cellView.bottomLine.layer?.backgroundColor = dividerColor.cgColor
-//                cellView.
+                _initHeaderCellView(cellView: cellView)
                 return cellView
                 return cellView
             }
             }
             let cellView = KMBatchTableCellView(type: .Size)
             let cellView = KMBatchTableCellView(type: .Size)
@@ -882,12 +984,24 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
         return rowView
         return rowView
     }
     }
     func tableView(_ tableView: NSTableView, writeRowsWith rowIndexes: IndexSet, to pboard: NSPasteboard) -> Bool {
     func tableView(_ tableView: NSTableView, writeRowsWith rowIndexes: IndexSet, to pboard: NSPasteboard) -> Bool {
-        let indexSetData = try? NSKeyedArchiver.archivedData(withRootObject: rowIndexes, requiringSecureCoding: true)
+        if rowIndexes.first == 0 {
+            return false
+        }
+        
+        var theIndex = IndexSet()
+        for idx in rowIndexes {
+            theIndex.insert(idx-1)
+        }
+        
+        let indexSetData = try? NSKeyedArchiver.archivedData(withRootObject: theIndex, requiringSecureCoding: true)
         pboard.declareTypes([NSPasteboard.PasteboardType.string], owner: self)
         pboard.declareTypes([NSPasteboard.PasteboardType.string], owner: self)
         pboard.setData(indexSetData, forType: NSPasteboard.PasteboardType(rawValue: KMBatchDragType) )
         pboard.setData(indexSetData, forType: NSPasteboard.PasteboardType(rawValue: KMBatchDragType) )
         return true
         return true
     }
     }
     func tableView(_ tableView: NSTableView, validateDrop info: NSDraggingInfo, proposedRow row: Int, proposedDropOperation dropOperation: NSTableView.DropOperation) -> NSDragOperation {
     func tableView(_ tableView: NSTableView, validateDrop info: NSDraggingInfo, proposedRow row: Int, proposedDropOperation dropOperation: NSTableView.DropOperation) -> NSDragOperation {
+        if row == 0 {
+            return NSDragOperation(rawValue: 0)
+        }
         var isCanDrag = false
         var isCanDrag = false
         var result: NSDragOperation = []
         var result: NSDragOperation = []
         let pboard = info.draggingPasteboard
         let pboard = info.draggingPasteboard
@@ -942,18 +1056,20 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
             let backUpArray = self.files
             let backUpArray = self.files
             var referenceIndex = -1
             var referenceIndex = -1
             rowIndexes.enumerate(options: .reverse, using: { (idx, stop) in
             rowIndexes.enumerate(options: .reverse, using: { (idx, stop) in
-                let sortFile = backUpArray[idx]
+                let theIdx = max(0, idx)
+                let sortFile = backUpArray[theIdx]
+                let theRow = row-1
                 if referenceIndex < 0 {
                 if referenceIndex < 0 {
-                    if idx > row {
+                    if idx > theRow {
                         self.files.remove(at: idx)
                         self.files.remove(at: idx)
-                        self.files.insert(sortFile, at: row)
-                    } else if idx < row {
-                        if row > self.files.count {
+                        self.files.insert(sortFile, at: theRow)
+                    } else if idx < theRow {
+                        if theRow > self.files.count {
                             self.files.remove(at: idx)
                             self.files.remove(at: idx)
                             self.files.append(sortFile)
                             self.files.append(sortFile)
                         } else {
                         } else {
                             self.files.remove(at: idx)
                             self.files.remove(at: idx)
-                            self.files.insert(sortFile, at: row - 1)
+                            self.files.insert(sortFile, at: theRow - 1)
                         }
                         }
                     }
                     }
                     referenceIndex = self.files.firstIndex(of: sortFile) ?? -1
                     referenceIndex = self.files.firstIndex(of: sortFile) ?? -1
@@ -1008,7 +1124,7 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
                         if !pdf.allowsPrinting || !pdf.allowsCopying {
                         if !pdf.allowsPrinting || !pdf.allowsCopying {
                             let alert = NSAlert()
                             let alert = NSAlert()
                             alert.alertStyle = .critical
                             alert.alertStyle = .critical
-                            alert.messageText = NSLocalizedString("This is a secured document. Editing is not permitted.", comment: "")
+                            alert.messageText = KMLocalizedString("This is a secured document. Editing is not permitted.", comment: "")
                             alert.runModal()
                             alert.runModal()
                             continue
                             continue
                         } else if document?.isLocked ?? false {
                         } else if document?.isLocked ?? false {
@@ -1050,63 +1166,11 @@ class KMBatchOperateLeftViewController: KMNBaseViewController,NSTableViewDelegat
         }
         }
         return false
         return false
     }
     }
-    func switchToOperateType(_ operateType: KMBatchOperationType, files: [KMBatchOperateFile]) {
-        switchToOperateType(operateType)
-        self.files = files 
-        self.tableView.reloadData()
-    }
-    func checkNeedPasswordSwitchToOperateType(_ operateType: KMBatchOperationType, files: [KMBatchOperateFile]) {
-        switchToOperateType(operateType)
-        var arr: [String] = []
-        for i in 0..<files.count {
-            let file = files[i]
-            arr.append(file.filePath)
-        }
-        
-        self.files = files
-        self.files.removeAll()
-        addFilesToList(addArray: NSMutableArray.init(array: arr))
-        self.tableView.reloadData()
-    }
-    func reloadFile(_ file: KMBatchOperateFile) {
-        var rowIndexSet = IndexSet()
-        for i in 0..<self.files.count {
-            if file.filePath == self.files[i].filePath {
-                rowIndexSet.insert(i)
-                break
-            }
-        }
-        var columnIndexSet = IndexSet()
-        for i in 0..<self.tableView.numberOfColumns {
-            let identifier = self.tableView.tableColumns[i].identifier
-            if identifier.rawValue == "status" {
-                columnIndexSet.insert(i)
-                break
-            }
-        }
-        
-        if Thread.isMainThread {
-            self.tableView.reloadData(forRowIndexes: rowIndexSet, columnIndexes: columnIndexSet)
-        } else {
-            DispatchQueue.main.async {
-                self.tableView.reloadData(forRowIndexes: rowIndexSet, columnIndexes: columnIndexSet)
-            }
-        }
-    }
-    func refreshConvertProgress(_ progress: CGFloat, file: KMBatchOperateFile) {
-        self.tableView.reloadData()
-    }
-    func reloadConvertInterface(withType type: KMConvertWithPDFType) {
-        if type == .WordAdvance || type == .WordStandard || type == .Excel || type == .PowerPoint || type == .RTF || type == .CSV || type == .HTML || type == .Text || type == .Json {
-            self.DPIColumn.isHidden = true
-        } else {
-            self.DPIColumn.isHidden = false
-        }
-        self.tableView.reloadData()
-    }
 }
 }
 
 
-extension KMBatchOperateLeftViewController: NSMenuDelegate, NSMenuItemValidation{
+// MARK: - NSMenuDelegate, NSMenuItemValidation
+
+extension KMBatchOperateLeftViewController: NSMenuDelegate, NSMenuItemValidation {
     func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
     func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
         let action = menuItem.action
         let action = menuItem.action
         if action == #selector(menuItem_ShowInFinder(_:)) || action == #selector(menuItem_Delete(_:)) {
         if action == #selector(menuItem_ShowInFinder(_:)) || action == #selector(menuItem_Delete(_:)) {
@@ -1131,7 +1195,6 @@ extension KMBatchOperateLeftViewController: ComponentDropdownDelegate {
 
 
 extension KMBatchOperateLeftViewController: ComponentGroupDelegate {
 extension KMBatchOperateLeftViewController: ComponentGroupDelegate {
     func componentGroupDidDismiss(group: ComponentGroup?) {
     func componentGroupDidDismiss(group: ComponentGroup?) {
-        
         removeGroupView()
         removeGroupView()
     }
     }
     
     
@@ -1141,7 +1204,7 @@ extension KMBatchOperateLeftViewController: ComponentGroupDelegate {
             if index == 0 {
             if index == 0 {
                 chooseFile()
                 chooseFile()
             } else if index == 1 {
             } else if index == 1 {
-                chooseFile()
+                _addFolderAction()
             } else if index == 2 {
             } else if index == 2 {
                 let pboard = NSPasteboard.general
                 let pboard = NSPasteboard.general
                 if let document = self.openDocumentWithImageFromPasteboard(pboard, error: nil) {
                 if let document = self.openDocumentWithImageFromPasteboard(pboard, error: nil) {

+ 6 - 1
PDF Office/PDF Master/KMClass/ImageToPDF/Model/KMBatchOperateFile.swift

@@ -12,11 +12,16 @@ import Cocoa
     var password: String = ""
     var password: String = ""
     var filePath: String = ""
     var filePath: String = ""
     var outputFilePath: String = ""
     var outputFilePath: String = ""
+    
+    var fileSize: Float = 0
+    var dimensions: Float = 0
     lazy var sizeString: String = {
     lazy var sizeString: String = {
         guard let dict = try? FileManager.default.attributesOfItem(atPath: self.filePath) as NSDictionary else {
         guard let dict = try? FileManager.default.attributesOfItem(atPath: self.filePath) as NSDictionary else {
             return "0"
             return "0"
         }
         }
-        let _sizeString = self.fileSizeString(fSize: Float(dict.fileSize()))
+        fileSize = Float(dict.fileSize())
+        let _sizeString = self.fileSizeString(fSize: fileSize)
+        
         return _sizeString
         return _sizeString
     }()
     }()
     var fileType: KMBatchOperateFileType?
     var fileType: KMBatchOperateFileType?

+ 20 - 0
PDF Office/PDF Master/KMClass/ImageToPDF/View/KMNTableHeaderCellView.swift

@@ -37,6 +37,13 @@ class KMNTableHeaderCellView: NSTableCellView {
         return view
         return view
     }()
     }()
     
     
+    private var button_: NSButton = {
+        let view = NSButton()
+        view.isBordered = false
+        view.title = ""
+        return view
+    }()
+    
     var titleLabel: NSTextField {
     var titleLabel: NSTextField {
         get {
         get {
             return self.titleLabel_
             return self.titleLabel_
@@ -60,6 +67,8 @@ class KMNTableHeaderCellView: NSTableCellView {
             return self.bottomLine_
             return self.bottomLine_
         }
         }
     }
     }
+    
+    var itemClick: KMCommonClickBlock?
 
 
     override func draw(_ dirtyRect: NSRect) {
     override func draw(_ dirtyRect: NSRect) {
         super.draw(dirtyRect)
         super.draw(dirtyRect)
@@ -107,6 +116,17 @@ class KMNTableHeaderCellView: NSTableCellView {
         bottomLine_.km_add_height_constraint(constant: 1)
         bottomLine_.km_add_height_constraint(constant: 1)
         
         
         contentBox.fillColor = .clear
         contentBox.fillColor = .clear
+        
+        contentBox.addSubview(button_)
+        button_.bounds = contentBox.contentView?.bounds ?? .zero
+        button_.autoresizingMask = [.width, .height]
+        button_.target = self
+        button_.action = #selector(_buttonAction)
     }
     }
     
     
+    // MARK: - Private Methods
+    
+    @objc private func _buttonAction() {
+        self.itemClick?(1)
+    }
 }
 }

+ 5 - 5
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -8590,16 +8590,16 @@
 			children = (
 			children = (
 				653647CF2CDCA6CB00CDB13E /* KMBatchOperateBaseViewController.swift */,
 				653647CF2CDCA6CB00CDB13E /* KMBatchOperateBaseViewController.swift */,
 				653647CE2CDCA6CB00CDB13E /* KMBatchOperateBaseViewController.xib */,
 				653647CE2CDCA6CB00CDB13E /* KMBatchOperateBaseViewController.xib */,
+				653647AF2CDCA5DE00CDB13E /* KMBatchOperateBaseWindowController.swift */,
+				653647A82CDCA5DE00CDB13E /* KMBatchOperateBaseWindowController.xib */,
+				653647AC2CDCA5DE00CDB13E /* KMBatchOperateLeftViewController.swift */,
 				653647A62CDCA5DE00CDB13E /* KMBatchOperateLeftViewController.xib */,
 				653647A62CDCA5DE00CDB13E /* KMBatchOperateLeftViewController.xib */,
+				653647AD2CDCA5DE00CDB13E /* KMBatchOperateRightViewController.swift */,
 				653647A72CDCA5DE00CDB13E /* KMBatchOperateRightViewController.xib */,
 				653647A72CDCA5DE00CDB13E /* KMBatchOperateRightViewController.xib */,
-				653647A82CDCA5DE00CDB13E /* KMBatchOperateBaseWindowController.xib */,
 				653647A92CDCA5DE00CDB13E /* KMBatchOperateSplitViewController.swift */,
 				653647A92CDCA5DE00CDB13E /* KMBatchOperateSplitViewController.swift */,
-				653647AA2CDCA5DE00CDB13E /* KMBatchOperateWindowController.xib */,
 				653647AB2CDCA5DE00CDB13E /* KMBatchOperateSplitViewController.xib */,
 				653647AB2CDCA5DE00CDB13E /* KMBatchOperateSplitViewController.xib */,
-				653647AC2CDCA5DE00CDB13E /* KMBatchOperateLeftViewController.swift */,
-				653647AD2CDCA5DE00CDB13E /* KMBatchOperateRightViewController.swift */,
 				653647AE2CDCA5DE00CDB13E /* KMBatchOperateWindowController.swift */,
 				653647AE2CDCA5DE00CDB13E /* KMBatchOperateWindowController.swift */,
-				653647AF2CDCA5DE00CDB13E /* KMBatchOperateBaseWindowController.swift */,
+				653647AA2CDCA5DE00CDB13E /* KMBatchOperateWindowController.xib */,
 			);
 			);
 			path = Base;
 			path = Base;
 			sourceTree = "<group>";
 			sourceTree = "<group>";