瀏覽代碼

综合-页面编辑整理代码

tangchao 1 年之前
父節點
當前提交
f1df3da36b

+ 8 - 0
PDF Office/PDF Master.xcodeproj/project.pbxproj

@@ -2663,6 +2663,9 @@
 		BBB7B48D2A0384E100B58A5A /* NSCollectionViewItem+KMExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB7B48C2A0384E100B58A5A /* NSCollectionViewItem+KMExtension.swift */; };
 		BBB7B48E2A0384E100B58A5A /* NSCollectionViewItem+KMExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB7B48C2A0384E100B58A5A /* NSCollectionViewItem+KMExtension.swift */; };
 		BBB7B48F2A0384E100B58A5A /* NSCollectionViewItem+KMExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB7B48C2A0384E100B58A5A /* NSCollectionViewItem+KMExtension.swift */; };
+		BBB7B4912A03AD2A00B58A5A /* KMPDFEditToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB7B4902A03AD2A00B58A5A /* KMPDFEditToolbar.swift */; };
+		BBB7B4922A03AD2A00B58A5A /* KMPDFEditToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB7B4902A03AD2A00B58A5A /* KMPDFEditToolbar.swift */; };
+		BBB7B4932A03AD2A00B58A5A /* KMPDFEditToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB7B4902A03AD2A00B58A5A /* KMPDFEditToolbar.swift */; };
 		BBB9B30D299A5D6D004F3235 /* KMCloudUploadOperationQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = BBB9B2F2299A5D6C004F3235 /* KMCloudUploadOperationQueue.m */; };
 		BBB9B30E299A5D6D004F3235 /* KMCloudUploadOperationQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = BBB9B2F2299A5D6C004F3235 /* KMCloudUploadOperationQueue.m */; };
 		BBB9B30F299A5D6D004F3235 /* KMCloudUploadOperationQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = BBB9B2F2299A5D6C004F3235 /* KMCloudUploadOperationQueue.m */; };
@@ -4360,6 +4363,7 @@
 		BBB5C80629F4CEE40054F261 /* KMLinkAnnotationPropertyEmptyController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMLinkAnnotationPropertyEmptyController.swift; sourceTree = "<group>"; };
 		BBB7B4882A033F6200B58A5A /* KMThumbnailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMThumbnailView.swift; sourceTree = "<group>"; };
 		BBB7B48C2A0384E100B58A5A /* NSCollectionViewItem+KMExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSCollectionViewItem+KMExtension.swift"; sourceTree = "<group>"; };
+		BBB7B4902A03AD2A00B58A5A /* KMPDFEditToolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPDFEditToolbar.swift; sourceTree = "<group>"; };
 		BBB9B2EA299A5D6C004F3235 /* DropboxModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DropboxModel.h; sourceTree = "<group>"; };
 		BBB9B2EB299A5D6C004F3235 /* KMCloudDownloadOperationQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMCloudDownloadOperationQueue.h; sourceTree = "<group>"; };
 		BBB9B2EC299A5D6C004F3235 /* KMCloudOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMCloudOperation.h; sourceTree = "<group>"; };
@@ -7337,6 +7341,7 @@
 				BB2EDF69296ECE17003BCF58 /* KMPageEditThumbnailItem.swift */,
 				BBD1F78A296FACA300343885 /* KMPageEditExtractSettingView.swift */,
 				BBD1F792296FE92500343885 /* KMPageEditSplitSettingView.swift */,
+				BBB7B4902A03AD2A00B58A5A /* KMPDFEditToolbar.swift */,
 			);
 			path = View;
 			sourceTree = "<group>";
@@ -9943,6 +9948,7 @@
 				8931683A296E436B0073EA59 /* KMSignatureWindowController.m in Sources */,
 				BBF38A5A294F2B760086D025 /* KMWatermarkPositionView.swift in Sources */,
 				89E93EDE2999DA6D00F10F66 /* KMNoteFilterCollevtionViewItem.m in Sources */,
+				BBB7B4912A03AD2A00B58A5A /* KMPDFEditToolbar.swift in Sources */,
 				BB8F4586295B19AC0037EA22 /* KMHeaderFooterDateInfoView.swift in Sources */,
 				ADF9ED2F29A8507400C4A943 /* KMAccountInfoView.swift in Sources */,
 				896933D029AEED520055327F /* SKTextFieldSheetController.m in Sources */,
@@ -10707,6 +10713,7 @@
 				8931683B296E436B0073EA59 /* KMSignatureWindowController.m in Sources */,
 				9FDD0FB329534FEA000C4DAD /* KMGlobal.swift in Sources */,
 				89E93EDF2999DA6D00F10F66 /* KMNoteFilterCollevtionViewItem.m in Sources */,
+				BBB7B4922A03AD2A00B58A5A /* KMPDFEditToolbar.swift in Sources */,
 				BB8F4587295B19AC0037EA22 /* KMHeaderFooterDateInfoView.swift in Sources */,
 				ADF9ED3029A8507400C4A943 /* KMAccountInfoView.swift in Sources */,
 				896933D129AEED520055327F /* SKTextFieldSheetController.m in Sources */,
@@ -11441,6 +11448,7 @@
 				BB99ACD1292E2AEF0048AFD9 /* KMMergeCollectionViewItem.swift in Sources */,
 				9F0CB51F2986569B00007028 /* KMDesignToken+BorderRadiusBottomRight.swift in Sources */,
 				BB86C1EF28F544F4005AD968 /* CPDFListView+Event.m in Sources */,
+				BBB7B4932A03AD2A00B58A5A /* KMPDFEditToolbar.swift in Sources */,
 				BB86C1EF28F544F4005AD968 /* CPDFListView+Event.m in Sources */,
 				ADBC2D39299F0A5A006280C8 /* KMPrintHelpViewController.swift in Sources */,
 				8931684B296E436B0073EA59 /* KMSignatureManager.m in Sources */,

+ 0 - 48
PDF Office/PDF Master.xcodeproj/xcuserdata/kdanmobile.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -676,38 +676,6 @@
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "D2641C8F-B379-4B56-80EE-24B98F44DBB0"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "PDF Master/Class/PDFWindowController/Side/LeftSide/KMLeftSideViewController.swift"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "414"
-            endingLineNumber = "414"
-            landmarkName = "tableView(_:viewFor:row:)"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "E7585438-6934-4AF6-A992-B39D1EC28EA4"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "PDF Master/Class/PDFWindowController/Side/LeftSide/KMLeftSideViewController.swift"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "416"
-            endingLineNumber = "416"
-            landmarkName = "tableView(_:viewFor:row:)"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
@@ -772,21 +740,5 @@
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "4D954E4F-BA5A-4FA0-8CAE-A120CA85CBEE"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "PDF Master/Class/PDFWindowController/Side/LeftSide/Thumbnail/KMPDFThumbnailItem.swift"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "131"
-            endingLineNumber = "131"
-            landmarkName = "isSelected"
-            landmarkType = "24">
-         </BreakpointContent>
-      </BreakpointProxy>
    </Breakpoints>
 </Bucket>

+ 3 - 0
PDF Office/PDF Master/Class/Common/KMCommonEnum.swift

@@ -51,6 +51,9 @@ import Foundation
     case odd        // 偶数
     case even       // 当前页
     case custom     // 自定义
+    
+    case horizontal // 横向
+    case vertical   // 纵向
 }
 
 @objc enum KMItemKey: Int {

+ 4 - 0
PDF Office/PDF Master/Class/Common/Tools/KMTools.swift

@@ -291,6 +291,10 @@ extension KMTools {
             return NSLocalizedString("Even Pages", comment: "")
         case .custom:
             return NSLocalizedString("Customize", comment: "")
+        case .horizontal:
+            return NSLocalizedString("Horizontal Pages", comment: "")
+        case .vertical:
+            return NSLocalizedString("Vertical Pages", comment: "")
         }
         
         return ""

+ 184 - 385
PDF Office/PDF Master/Class/PDFTools/PageEdit/Controller/KMPDFEditViewController.swift

@@ -7,60 +7,12 @@
 
 import Cocoa
 
-enum KMPageEditType: Int {
-    case pageRange = 1
-    case leftRotate = 2
-    case rightRotate = 3
-    case insert = 4
-    case extract = 5
-    case replace = 6
-    case split = 7
-    case reverse = 8
-    case delete = 9
-}
-
 class KMPDFEditViewController: NSViewController {
 
     @IBOutlet weak var topBarBox: NSBox!
     @IBOutlet weak var contentBox: NSBox!
     
-    var pageRangeView: KMDesignSelect?
-    var pageRangeViewItems = [NSLocalizedString("All Pages", comment: ""),
-                              NSLocalizedString("Odd Pages", comment: ""),
-                              NSLocalizedString("Even Pages", comment: ""),
-                              NSLocalizedString("Horizontal Pages", comment: ""),
-                              NSLocalizedString("Vertical Pages", comment: ""),
-                              NSLocalizedString("Customized", comment: "")]
-    
-    var toolBar = KMToolbar()
-    private var zoomOutButton: NSButton?
-    private var zoomInButton: NSButton?
-    lazy var rightItemView: NSView = {
-        let view = NSView()
-        
-        let size: CGFloat = 28
-        let y: CGFloat = 6
-        let zoomOutButton = NSButton()
-        view.addSubview(zoomOutButton)
-        zoomOutButton.frame = NSMakeRect(0, y, size, size)
-        zoomOutButton.isBordered = false
-        zoomOutButton.image = NSImage(named: "KMImageNamePageEditZoomOut")
-        zoomOutButton.target = self
-        zoomOutButton.action = #selector(zoomOutButtonAction)
-        self.zoomOutButton = zoomOutButton
-        
-        let zoomInButton = NSButton()
-        view.addSubview(zoomInButton)
-        zoomInButton.frame = NSMakeRect(size+7, y, size, size)
-        zoomInButton.isBordered = false
-        zoomInButton.image = NSImage(named: "KMImageNamePageEditZoomIn")
-        zoomInButton.target = self
-        zoomInButton.action = #selector(zoomInButtonAction)
-        self.zoomInButton = zoomInButton
-        
-        return view
-    }()
-    
+    var toolBar = KMPDFEditToolbar(frame: NSZeroRect)
     var thumbnailView = KMPageEditThumbnailView()
     
     private var pdfDocument: CPDFDocument?
@@ -112,8 +64,8 @@ class KMPDFEditViewController: NSViewController {
             }
             
             self.selectPages(indexs: IndexSet(integer: index))
-            self.pageRangeView?.stringValue = "\(index+1)"
-            self.pageRangeView?.editable = true
+            self.toolBar.pageRangeView?.stringValue = "\(index+1)"
+            self.toolBar.pageRangeView?.editable = true
         } else {
             var indexs: IndexSet = []
             for pageIndex in self.selectedPages {
@@ -126,8 +78,8 @@ class KMPDFEditViewController: NSViewController {
             
             self.selectPages(indexs: indexs)
             
-            self.pageRangeView?.editable = true
-            self.pageRangeView?.stringValue = KMPageRangeTools.newParseSelectedIndexs(selectedIndex: indexs.sorted())
+            self.toolBar.pageRangeView?.editable = true
+            self.toolBar.pageRangeView?.stringValue = KMPageRangeTools.newParseSelectedIndexs(selectedIndex: indexs.sorted())
         }
         
         self.view.window?.makeFirstResponder(self)
@@ -142,13 +94,44 @@ class KMPDFEditViewController: NSViewController {
         self.topBarBox.contentView?.addSubview(toolBar)
         toolBar.frame = self.topBarBox.contentView!.bounds
         toolBar.autoresizingMask = [.width, .height]
-        toolBar.delegate = self
         self.topBarBox.fillColor = NSColor(hex: "#F7F8FA")
-        
-        let rightItemView = self.rightItemView
-        self.topBarBox.contentView?.addSubview(rightItemView)
-        rightItemView.frame = NSMakeRect(NSWidth(self.topBarBox.contentView!.frame)-80, 0, 80, NSHeight(self.topBarBox.contentView!.frame))
-        rightItemView.autoresizingMask = [.minXMargin]
+        toolBar.itemClick = { [unowned self] item, index in
+            guard let type = KMPageEditType(rawValue: index) else {
+                if (index == KMPageEditType.insert_files) {
+                    self.item_insertFile(sender: nil)
+                } else if (index == KMPageEditType.insert_blank_page) {
+                    self.item_insertBlankPage(sender: nil)
+                } else if (index == KMPageEditType.insert_custom_page) {
+                    self.item_insertCustomPage(sender: nil)
+                }
+                return
+            }
+            
+            if (type == .leftRotate) {
+                self.leftRotatePageItemAction(menu: nil)
+            } else if (type == .rightRotate) {
+                self.rotatePageItemAction(menu: nil)
+            } else if (type == .zoomOut) {
+                self.zoomOutButtonAction(sender: item?.zoomOutButton)
+            } else if (type == .zoomIn) {
+                self.zoomInButtonAction(sender: item?.zoomInButton)
+            } else if (type == .extract) {
+                self.extractPageItemAction(menu: nil)
+            } else if (type == .replace) {
+                self.replacePageItemAction(menu: nil)
+            } else if (type == .split) {
+                self.splitMenuAction(sender: nil)
+            } else if (type == .reverse) {
+                self.reverseMenuAction(sender: nil)
+            } else if (type == .delete) {
+                self.deleteMenuAction(sender: nil)
+            } else if (type == .pageRange) {
+                self.km_comboBoxSelectionDidChange((item?.pageRangeView)!)
+            }
+        }
+        toolBar.pageRangeValueDidChange = { [unowned self] value, _ in
+            self.km_controlTextDidEndEditing(self.toolBar.pageRangeView!)
+        }
         
         let view = self.thumbnailView
         self.contentBox.contentView?.addSubview(view)
@@ -168,17 +151,17 @@ class KMPDFEditViewController: NSViewController {
                 enabled = true
             }
             
-            if (self?.toolBar.items == nil) {
+            if (self?.toolBar.toolBar.items == nil) {
                 return
             }
             
             var replaceItem: KMToolBoxItem?
-            for i in 0 ..< (self?.toolBar.items.count)! {
-                let item: KMToolBoxItem = (self?.toolBar.items[i])!
+            for i in 0 ..< (self?.toolBar.toolBar.items.count)! {
+                let item: KMToolBoxItem = (self?.toolBar.toolBar.items[i])!
                 if (item.itemIdentifier == KMToolbarPageEditReplaceItemIdentifier) {
                     replaceItem = item
                 }
-                
+
                 if (item.itemIdentifier == KMToolbarPageEditExtractItemIdentifier ||
                     item.itemIdentifier == KMToolbarPageEditReverseItemIdentifier ||
                     item.itemIdentifier == KMToolbarPageEditDeleteItemIdentifier ||
@@ -204,8 +187,8 @@ class KMPDFEditViewController: NSViewController {
             
             indexs.sort(){$0 < $1}
             
-            self?.pageRangeView?.editable = true;
-            self?.pageRangeView?.stringValue = KMPageRangeTools.newParseSelectedIndexs(selectedIndex: indexs)
+            self?.toolBar.pageRangeView?.editable = true;
+            self?.toolBar.pageRangeView?.stringValue = KMPageRangeTools.newParseSelectedIndexs(selectedIndex: indexs)
         }
         
         let menu = NSMenu()
@@ -619,7 +602,7 @@ class KMPDFEditViewController: NSViewController {
     
     // MARK: topBar 事件
     
-    @objc func zoomOutButtonAction(sender: NSButton) {
+    @objc func zoomOutButtonAction(sender: NSButton?) {
         if (self.itemSize.width > self.defaultItemSize.width) {
             return
         }
@@ -628,15 +611,15 @@ class KMPDFEditViewController: NSViewController {
         } else if (self.itemSize.width == self.defaultItemSize.width) {
             self.itemSize = NSSize(width: self.defaultItemSize.width*1.5, height: self.defaultItemSize.height*1.5)
         }
-        
-        self.zoomInButton?.isEnabled = true
+
+        self.toolBar.zoomInButton?.isEnabled = true
         if (self.itemSize.width > self.defaultItemSize.width) {
-            sender.isEnabled = false
+            sender?.isEnabled = false
         }
         self.thumbnailView.zoomOut()
     }
     
-    @objc func zoomInButtonAction(sender: NSButton) {
+    @objc func zoomInButtonAction(sender: NSButton?) {
         if (self.itemSize.width < self.defaultItemSize.width) {
             return
         }
@@ -645,10 +628,10 @@ class KMPDFEditViewController: NSViewController {
         } else if (self.itemSize.width == self.defaultItemSize.width) {
             self.itemSize = NSSize(width: self.defaultItemSize.width*0.5, height: self.defaultItemSize.height*0.5)
         }
-        
-        self.zoomOutButton?.isEnabled = true
+
+        self.toolBar.zoomOutButton?.isEnabled = true
         if (self.itemSize.width < self.defaultItemSize.width) {
-            sender.isEnabled = false
+            sender?.isEnabled = false
         }
         self.thumbnailView.zoomIn()
     }
@@ -773,142 +756,9 @@ class KMPDFEditViewController: NSViewController {
         }
     }
     
-    // MARK: toolBar 菜单事件
-    
-    @objc func pageRangeMenuAction(sender: KMToolbarClickButton) {
-        
-    }
-    
-    @objc func leftRotateMenuAction(sender: KMToolbarClickButton?) {
-        let selectedIndexs = self.thumbnailView.selectionIndexPaths
-        var indexs: IndexSet = []
-        for indexpath in selectedIndexs {
-            indexs.insert(indexpath.item)
-        }
-        
-        self.leftRotate(indexs: indexs)
-    }
-    
-    @objc func rightRotateMenuAction(sender: KMToolbarClickButton?) {
-        let selectedIndexs = self.thumbnailView.selectionIndexPaths
-        var indexs: IndexSet = []
-        for indexpath in selectedIndexs {
-            indexs.insert(indexpath.item)
-        }
-        
-        self.rightRotate(indexs: indexs)
-    }
-    
-    @objc func insertMenuAction(sender: KMToolbarClickButton) {
-        let menu = NSMenu()
-        let insertFileItem = NSMenuItem(title: "Insert File", action: #selector(item_insertFile), target: self)
-        menu.addItem(insertFileItem!)
-        let insertBlankPageItem = NSMenuItem(title: "Insert a blank page", action: #selector(item_insertBlankPage), target: self)
-        menu.addItem(insertBlankPageItem!)
-        let insertCustomPageItem = NSMenuItem(title: "Insert custom page", action: #selector(item_insertCustomPage), target: self)
-        menu.addItem(insertCustomPageItem!)
-        menu.popUp(positioning: nil, at: NSPoint(x: 0, y: 40), in: sender)
-    }
-    
-    @objc func extractMenuAction(sender: KMToolbarClickButton?) {
-        if (self.thumbnailView.selectionIndexPaths.count == 0) {
-            let alert = NSAlert()
-            alert.messageText = "请选择需要提取的页面"
-            alert.runModal()
-            return
-        }
-        
-        let windowController = KMPageEditExtractWindowController(windowNibName: "KMPageEditSettingBaseWindowController")
-        self.view.window?.beginSheet(windowController.window!)
-        self.windowController = windowController
-        
-        windowController.itemClick = { [weak self] index, value in
-            if (index == 1) { /// 取消
-                self?.view.window?.endSheet((self?.windowController?.window)!)
-                self?.windowController = nil
-                return
-            }
-            
-            let windowController_extract: KMPageEditExtractWindowController = self?.windowController as! KMPageEditExtractWindowController
-            /// 提取设置项
-            let settingView: KMPageEditExtractSettingView = windowController_extract.settingView! as! KMPageEditExtractSettingView
-            let oneDocumentPerPage: Bool = settingView.independentPerPageCheck.state != .on
-            let extractAfterDelete: Bool = settingView.extractAfterDeletePageCheck.state == .on
-            
-            self?.view.window?.endSheet((self?.windowController!.window)!)
-            self?.windowController = nil
-            
-//            /// 提取的页面
-            let indexpaths = self?.thumbnailView.selectionIndexPaths
-            var indexs: IndexSet = []
-            var extractPages: Array<CPDFPage> = []
-            for indexpath in indexpaths! {
-                let page = self?.listView?.document.page(at: UInt(indexpath.item))
-                if (page != nil) {
-                    extractPages.append(page!)
-                }
-                indexs.insert(indexpath.item)
-            }
+//    // MARK: toolBar 菜单事件
 
-            KMPageEditTools.extract((self?.listView?.document)!, indexs, oneDocumentPerPage, (self?.view.window)!) { result, urls, error in
-                if (result == false) {
-                    return
-                }
-                
-                if (extractAfterDelete) {
-                    var indexs: IndexSet = IndexSet()
-                    for page in extractPages {
-                        let indexPage: Int = Int((self?.listView?.document.index(for: page))!)
-                        indexs.insert(indexPage)
-                    }
-                    self?.deletePages(indexs: indexs)
-                }
-            }
-        }
-    }
-    
-    @objc func replaceMenuAction(sender: KMToolbarClickButton?) {
-        let panel = NSOpenPanel()
-        panel.allowedFileTypes = ["pdf"]
-        panel.allowsMultipleSelection = true
-        panel.beginSheetModal(for: self.view.window!) { [weak self] response in
-            if (response == .cancel) {
-                return
-            }
-            
-            /// 处理page
-            var pages: Array<CPDFPage> = []
-            let selectedIndex: Int = (self?.getSelecteIndex())!
-            self?.listView?.document.removePage(at: UInt(selectedIndex))
-            
-            var insertIndex: Int = selectedIndex
-            self?.lockedFiles.removeAll()
-            for fileURL in panel.urls {
-                let document = CPDFDocument(url: fileURL)
-                if ((document?.isLocked)!) {
-                    self?.lockedFiles.append(fileURL)
-                    continue
-                }
-                
-                for i in 0 ..< document!.pageCount {
-                    let page = document?.page(at: i)
-                    pages.append(page!)
-                    self!.listView?.document.insertPageObject(page, at:UInt(insertIndex))
-                    insertIndex += 1
-                }
-            }
-            
-            if ((self?.lockedFiles.count)! <= 0) {
-                self?.refreshUI()
-                return
-            }
-            
-            self?.refreshUI()
-            self!.showPasswordWindow(insertIndex)
-        }
-    }
-    
-    @objc func splitMenuAction(sender: KMToolbarClickButton) {
+    @objc func splitMenuAction(sender: AnyObject?) {
         let model = KMPageEditSplitSettingModel()
         model.documentURL = self.listView?.document.documentURL
         model.fileName = model.documentURL.lastPathComponent
@@ -985,7 +835,7 @@ class KMPDFEditViewController: NSViewController {
         }
     }
     
-    @objc func reverseMenuAction(sender: KMToolbarClickButton) {
+    @objc func reverseMenuAction(sender: AnyObject?) {
         let selectedIndexs = self.thumbnailView.selectionIndexPaths
         if (selectedIndexs.count < 2 ) {
             let _ = CustomAlertView(message: "请先选择至少两个页面进行编辑操作", from: self.thumbnailView, with: .blue)
@@ -1000,7 +850,7 @@ class KMPDFEditViewController: NSViewController {
         self.reversePages(indexs: indexs)
     }
     
-    @objc func deleteMenuAction(sender: KMToolbarClickButton) {
+    @objc func deleteMenuAction(sender: AnyObject?) {
         Task { @MainActor in
             if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
                 let _ = KMComparativeTableViewController.show(window: self.view.window!)
@@ -1021,155 +871,7 @@ class KMPDFEditViewController: NSViewController {
 // MARK: -
 // MARK: KMNewToolbarDelegate
 
-extension KMPDFEditViewController: KMNewToolbarDelegate {
-    func toolbarDefaultItemIdentifiers(_ toolbar: KMToolbar!) -> [String]! {
-        return [KMToolbarPageEditPageRangeItemIdentifier,
-                KMToolbarPageEditLeftRotateItemIdentifier,
-                KMToolbarPageEditRightRotateItemIdentifier,
-//                KMToolbarDividerItemIdentifier,
-//                KMToolbarPageEditInsetItemIdentifier,
-//                KMToolbarPageEditExtractItemIdentifier,
-//                KMToolbarPageEditReplaceItemIdentifier,
-//                KMToolbarPageEditSplitItemIdentifier,
-//                KMToolbarPageEditReverseItemIdentifier,
-                KMToolbarDividerItemIdentifier,
-                KMToolbarPageEditDeleteItemIdentifier]
-    }
-    
-    func toolbar(_ toolbar: KMToolbar!, itemForItemIdentifier identifier: String!) -> KMToolBoxItem! {
-        let item = KMToolBoxItem(itemIdentifier: identifier)
-        if (identifier == KMToolbarPageEditPageRangeItemIdentifier) {
-//            item?.image = NSImage(named: "KMImageNameMainToolbarrRight")
-            item?.alternateImage = NSImage(named: "KMImageNameMainToolbarrRight")
-            item?.target = self
-            item?.btnTag = KMPageEditType.pageRange.rawValue
-//            item?.toolTip = NSLocalizedString("pageRange", comment: "")
-            item?.titleName = NSLocalizedString("pageRange    ", comment: "")
-            item?.boxImagePosition = KMToolBoxImagePosition.left
-            item?.btnAction = #selector(pageRangeMenuAction)
-            
-            let view = NSView()
-            item?.addSubview(view)
-            view.frame = item!.bounds
-            view.autoresizingMask = [.width,.height]
-            view.wantsLayer = true
-            view.layer?.backgroundColor = NSColor(hex: "#F7F8FA").cgColor
-            
-            let comBoxView = KMDesignSelect(withType: .Combox)
-            view.addSubview(comBoxView.view)
-            comBoxView.view.frame = NSMakeRect(0, 8, NSWidth(view.frame), 24)
-            comBoxView.view.autoresizingMask = [.width]
-            comBoxView.removeAllItems()
-            comBoxView.addItems(withObjectValues: self.pageRangeViewItems)
-            comBoxView.selectItem(at: 0)
-            comBoxView.placeholderString = NSLocalizedString("eg .1,3-5,10", comment: "")
-            comBoxView.editable = false
-            comBoxView.delete = self
-            pageRangeView = comBoxView
-            
-            let menuItem = NSMenuItem.init(title: "pageRange", action: #selector(pageRangeMenuAction), target: self)
-            item?.menuFormRepresentation = menuItem
-        } else if (identifier == KMToolbarPageEditLeftRotateItemIdentifier) {
-            item?.image = NSImage(named: "KMImageNameMainToolPageLeftRotate")
-            item?.alternateImage = NSImage(named: "KMImageNameMainToolPageLeftRotate")
-            item?.target = self
-            item?.btnTag = KMPageEditType.leftRotate.rawValue
-            item?.toolTip = NSLocalizedString("Rotate Left", comment: "")
-            item?.titleName = NSLocalizedString("", comment: "")
-            item?.boxImagePosition = KMToolBoxImagePosition.left
-            item?.btnAction = #selector(leftRotateMenuAction)
-            
-            let menuItem = NSMenuItem.init(title: "", action: #selector(leftRotateMenuAction), target: self)
-            item?.menuFormRepresentation = menuItem
-        } else if (identifier == KMToolbarPageEditRightRotateItemIdentifier) {
-            item?.image = NSImage(named: "KMImageNameMainToolPageRightRotate")
-            item?.alternateImage = NSImage(named: "KMImageNameMainToolPageRightRotate")
-            item?.target = self
-            item?.btnTag = KMPageEditType.rightRotate.rawValue
-            item?.toolTip = NSLocalizedString("Rotate Right", comment: "")
-            item?.titleName = NSLocalizedString("", comment: "")
-            item?.boxImagePosition = KMToolBoxImagePosition.left
-            item?.btnAction = #selector(rightRotateMenuAction)
-            
-            let menuItem = NSMenuItem.init(title: "", action: #selector(rightRotateMenuAction), target: self)
-            item?.menuFormRepresentation = menuItem
-        } else if (identifier == KMToolbarPageEditInsetItemIdentifier) {
-            item?.image = NSImage(named: "KMImageNameMainToolPageInsert")
-            item?.alternateImage = NSImage(named: "KMImageNameMainToolPageInsert")
-            item?.target = self
-            item?.btnTag = KMPageEditType.insert.rawValue
-            item?.toolTip = NSLocalizedString("Insert", comment: "")
-            item?.titleName = NSLocalizedString("Insert", comment: "")
-            item?.boxImagePosition = KMToolBoxImagePosition.left
-            item?.btnAction = #selector(insertMenuAction)
-            
-            let menuItem = NSMenuItem.init(title: "Insert", action: #selector(insertMenuAction), target: self)
-            item?.menuFormRepresentation = menuItem
-        } else if (identifier == KMToolbarPageEditExtractItemIdentifier) {
-            item?.image = NSImage(named: "KMImageNameMainToolPageExtract")
-            item?.alternateImage = NSImage(named: "KMImageNameMainToolPageExtract")
-            item?.target = self
-            item?.btnTag = KMPageEditType.extract.rawValue
-            item?.toolTip = NSLocalizedString("Extract", comment: "")
-            item?.titleName = NSLocalizedString("Extract", comment: "")
-            item?.boxImagePosition = KMToolBoxImagePosition.left
-            item?.btnAction = #selector(extractMenuAction)
-            
-            let menuItem = NSMenuItem.init(title: "Extract", action: #selector(extractMenuAction), target: self)
-            item?.menuFormRepresentation = menuItem
-        } else if (identifier == KMToolbarPageEditReplaceItemIdentifier) {
-            item?.image = NSImage(named: "KMImageNameMainToolPageReplace")
-            item?.alternateImage = NSImage(named: "KMImageNameMainToolPageReplace")
-            item?.target = self
-            item?.btnTag = KMPageEditType.replace.rawValue
-            item?.toolTip = NSLocalizedString("Replace", comment: "")
-            item?.titleName = NSLocalizedString("Replace", comment: "")
-            item?.boxImagePosition = KMToolBoxImagePosition.left
-            item?.btnAction = #selector(replaceMenuAction)
-            
-            let menuItem = NSMenuItem.init(title: "Replace", action: #selector(replaceMenuAction), target: self)
-            item?.menuFormRepresentation = menuItem
-        } else if (identifier == KMToolbarPageEditSplitItemIdentifier) {
-            item?.image = NSImage(named: "KMImageNameMainToolPageSplit")
-            item?.alternateImage = NSImage(named: "KMImageNameMainToolPageSplit")
-            item?.target = self
-            item?.btnTag = KMPageEditType.split.rawValue
-            item?.toolTip = NSLocalizedString("Split the PDF into multiple files", comment: "")
-            item?.titleName = NSLocalizedString("Split", comment: "")
-            item?.boxImagePosition = KMToolBoxImagePosition.left
-            item?.btnAction = #selector(splitMenuAction)
-            
-            let menuItem = NSMenuItem.init(title: "Split", action: #selector(splitMenuAction), target: self)
-            item?.menuFormRepresentation = menuItem
-        } else if (identifier == KMToolbarPageEditReverseItemIdentifier) {
-            item?.image = NSImage(named: "KMImageNameMainToolPageReverse")
-            item?.alternateImage = NSImage(named: "KMImageNameMainToolPageReverse")
-            item?.target = self
-            item?.btnTag = KMPageEditType.reverse.rawValue
-            item?.toolTip = NSLocalizedString("Reverse", comment: "")
-            item?.titleName = NSLocalizedString("Reverse", comment: "")
-            item?.boxImagePosition = KMToolBoxImagePosition.left
-            item?.btnAction = #selector(reverseMenuAction)
-            
-            let menuItem = NSMenuItem.init(title: "Reverse", action: #selector(reverseMenuAction), target: self)
-            item?.menuFormRepresentation = menuItem
-        } else if (identifier == KMToolbarPageEditDeleteItemIdentifier) {
-            item?.image = NSImage(named: "KMImageNameMainToolPageDelete")
-            item?.alternateImage = NSImage(named: "KMImageNameMainToolPageDelete")
-            item?.target = self
-            item?.btnTag = KMPageEditType.delete.rawValue
-            item?.toolTip = NSLocalizedString("Delete", comment: "")
-            item?.titleName = NSLocalizedString("", comment: "")
-            item?.boxImagePosition = KMToolBoxImagePosition.left
-            item?.btnAction = #selector(deleteMenuAction)
-            
-            let menuItem = NSMenuItem.init(title: "Delete", action: #selector(deleteMenuAction), target: self)
-            item?.menuFormRepresentation = menuItem
-        } 
-        
-        return item
-    }
-    
+extension KMPDFEditViewController {
     //MARK: menu Action
     
     @objc func insertPageItemAction(menu:NSMenuItem) {
@@ -1182,20 +884,122 @@ extension KMPDFEditViewController: KMNewToolbarDelegate {
         }
     }
     
-    @objc func rotatePageItemAction(menu:NSMenuItem) {
-        rightRotateMenuAction(sender: nil)
+    @objc func rotatePageItemAction(menu:NSMenuItem?) {
+        let selectedIndexs = self.thumbnailView.selectionIndexPaths
+        var indexs: IndexSet = []
+        for indexpath in selectedIndexs {
+            indexs.insert(indexpath.item)
+        }
+        
+        self.rightRotate(indexs: indexs)
     }
     
-    @objc func leftRotatePageItemAction(menu:NSMenuItem) {
-        leftRotateMenuAction(sender: nil)
+    @objc func leftRotatePageItemAction(menu:NSMenuItem?) {
+        let selectedIndexs = self.thumbnailView.selectionIndexPaths
+        var indexs: IndexSet = []
+        for indexpath in selectedIndexs {
+            indexs.insert(indexpath.item)
+        }
+        
+        self.leftRotate(indexs: indexs)
     }
     
-    @objc func extractPageItemAction(menu:NSMenuItem) {
-        extractMenuAction(sender: nil)
+    @objc func extractPageItemAction(menu:NSMenuItem?) {
+        if (self.thumbnailView.selectionIndexPaths.count == 0) {
+            let alert = NSAlert()
+            alert.messageText = "请选择需要提取的页面"
+            alert.runModal()
+            return
+        }
+        
+        let windowController = KMPageEditExtractWindowController(windowNibName: "KMPageEditSettingBaseWindowController")
+        self.view.window?.beginSheet(windowController.window!)
+        self.windowController = windowController
+        
+        windowController.itemClick = { [weak self] index, value in
+            if (index == 1) { /// 取消
+                self?.view.window?.endSheet((self?.windowController?.window)!)
+                self?.windowController = nil
+                return
+            }
+            
+            let windowController_extract: KMPageEditExtractWindowController = self?.windowController as! KMPageEditExtractWindowController
+            /// 提取设置项
+            let settingView: KMPageEditExtractSettingView = windowController_extract.settingView! as! KMPageEditExtractSettingView
+            let oneDocumentPerPage: Bool = settingView.independentPerPageCheck.state != .on
+            let extractAfterDelete: Bool = settingView.extractAfterDeletePageCheck.state == .on
+            
+            self?.view.window?.endSheet((self?.windowController!.window)!)
+            self?.windowController = nil
+            
+            //            /// 提取的页面
+            let indexpaths = self?.thumbnailView.selectionIndexPaths
+            var indexs: IndexSet = []
+            var extractPages: Array<CPDFPage> = []
+            for indexpath in indexpaths! {
+                let page = self?.listView?.document.page(at: UInt(indexpath.item))
+                if (page != nil) {
+                    extractPages.append(page!)
+                }
+                indexs.insert(indexpath.item)
+            }
+            
+            KMPageEditTools.extract((self?.listView?.document)!, indexs, oneDocumentPerPage, (self?.view.window)!) { result, urls, error in
+                if (result == false) {
+                    return
+                }
+                
+                if (extractAfterDelete) {
+                    var indexs: IndexSet = IndexSet()
+                    for page in extractPages {
+                        let indexPage: Int = Int((self?.listView?.document.index(for: page))!)
+                        indexs.insert(indexPage)
+                    }
+                    self?.deletePages(indexs: indexs)
+                }
+            }
+        }
     }
     
-    @objc func replacePageItemAction(menu:NSMenuItem) {
-        replaceMenuAction(sender: nil)
+    @objc func replacePageItemAction(menu:NSMenuItem?) {
+        let panel = NSOpenPanel()
+        panel.allowedFileTypes = ["pdf"]
+        panel.allowsMultipleSelection = true
+        panel.beginSheetModal(for: self.view.window!) { [weak self] response in
+            if (response == .cancel) {
+                return
+            }
+            
+            /// 处理page
+            var pages: Array<CPDFPage> = []
+            let selectedIndex: Int = (self?.getSelecteIndex())!
+            self?.listView?.document.removePage(at: UInt(selectedIndex))
+            
+            var insertIndex: Int = selectedIndex
+            self?.lockedFiles.removeAll()
+            for fileURL in panel.urls {
+                let document = CPDFDocument(url: fileURL)
+                if ((document?.isLocked)!) {
+                    self?.lockedFiles.append(fileURL)
+                    continue
+                }
+                
+                for i in 0 ..< document!.pageCount {
+                    let page = document?.page(at: i)
+                    pages.append(page!)
+                    self!.listView?.document.insertPageObject(page, at:UInt(insertIndex))
+                    insertIndex += 1
+                }
+            }
+            
+            if ((self?.lockedFiles.count)! <= 0) {
+                self?.refreshUI()
+                return
+            }
+            
+            self?.refreshUI()
+            self!.showPasswordWindow(insertIndex)
+        }
     }
     
     @objc func deletePageItemAction(menu:NSMenuItem) {
@@ -1414,15 +1218,14 @@ extension KMPDFEditViewController : NSMenuDelegate,NSMenuItemValidation {
     }
 }
 
-// MARK: -
-// MARK: KMSelectPopButtonDelegate
+// MARK: - KMSelectPopButtonDelegate
 
-extension KMPDFEditViewController: KMSelectPopButtonDelegate {
+extension KMPDFEditViewController {
     func km_comboBoxSelectionDidChange(_ obj: KMDesignSelect) {
-        let index: Int = self.pageRangeView!.indexOfSelectedItem
+        let index: Int = self.toolBar.pageRangeView!.indexOfSelectedItem
         var indexpaths: Set<IndexPath> = []
         if (index <= 0) { /// 全部页面
-            self.pageRangeView?.editable = false
+            self.toolBar.pageRangeView?.editable = false
             for i in 0 ..< (self.listView?.document.pageCount)! {
                 indexpaths.insert(IndexPath(item: Int(i), section: 0))
             }
@@ -1430,7 +1233,7 @@ extension KMPDFEditViewController: KMSelectPopButtonDelegate {
             self.pageIsUpdate = false
             self.thumbnailView.selectPages(at: indexpaths)
         } else if (index == 1) { /// 奇数页
-            self.pageRangeView?.editable = false
+            self.toolBar.pageRangeView?.editable = false
             for i in 0 ..< (self.listView?.document.pageCount)! {
                 if (i % 2 == 1) {
                     continue
@@ -1440,7 +1243,7 @@ extension KMPDFEditViewController: KMSelectPopButtonDelegate {
             self.pageIsUpdate = false
             self.thumbnailView.selectPages(at: indexpaths)
         } else if (index == 2) { /// 偶数页
-            self.pageRangeView?.editable = false
+            self.toolBar.pageRangeView?.editable = false
             for i in 0 ..< (self.listView?.document.pageCount)! {
                 if (i % 2 == 0) {
                     continue
@@ -1450,7 +1253,7 @@ extension KMPDFEditViewController: KMSelectPopButtonDelegate {
             self.pageIsUpdate = false
             self.thumbnailView.selectPages(at: indexpaths)
         } else if (index == 3) { /// 横向页
-            self.pageRangeView?.editable = false
+            self.toolBar.pageRangeView?.editable = false
             for i in 0 ..< (self.listView?.document.pageCount)! {
                 let page = self.listView?.document.page(at: i)
                 if (page?.rotation == 0 || page?.rotation == 180 || page?.rotation == -180) {
@@ -1461,7 +1264,7 @@ extension KMPDFEditViewController: KMSelectPopButtonDelegate {
             self.pageIsUpdate = false
             self.thumbnailView.selectPages(at: indexpaths)
         } else if (index == 4) { /// 纵向页
-            self.pageRangeView?.editable = false
+            self.toolBar.pageRangeView?.editable = false
             for i in 0 ..< (self.listView?.document.pageCount)! {
                 let page = self.listView?.document.page(at: i)
                 if (page?.rotation == 90 || page?.rotation == 270 || page?.rotation == -90 || page?.rotation == -270) {
@@ -1473,28 +1276,24 @@ extension KMPDFEditViewController: KMSelectPopButtonDelegate {
             self.thumbnailView.selectPages(at: indexpaths)
         } else { /// 自定义
             self.pageIsUpdate = false
-            self.pageRangeView?.editable = true
+            self.toolBar.pageRangeView?.editable = true
             self.clearSelectPages()
             DispatchQueue.main.async {
-                self.pageRangeView?.stringValue = ""
+                self.toolBar.pageRangeView?.stringValue = ""
             }
         }
     }
     
-    func km_controlTextDidChange(_ obj: KMDesignSelect) {
-        
-    }
-    
     func km_controlTextDidEndEditing(_ obj: KMDesignSelect) {
         self.view.window?.makeFirstResponder(self)
         
-        for index in 0 ..< self.pageRangeView!.numberOfItems {
-            if (self.pageRangeViewItems[index] == self.pageRangeView!.stringValue) {
+        for index in 0 ..< obj.numberOfItems {
+            if (obj.items[index] == obj.stringValue) {
                 return
             }
         }
         
-        let pages = KMPageRangeTools.findSelectPage(pageRangeString: self.pageRangeView!.stringValue, pageCount: Int((self.listView?.document.pageCount)!))
+        let pages = KMPageRangeTools.findSelectPage(pageRangeString: self.toolBar.pageRangeView!.stringValue, pageCount: Int((self.listView?.document.pageCount)!))
         if (pages.isEmpty) {
             let alert = NSAlert()
             alert.messageText = NSLocalizedString("Invalid page range or the page number is out of range. Please try again.", comment: "")

+ 415 - 0
PDF Office/PDF Master/Class/PDFTools/PageEdit/View/KMPDFEditToolbar.swift

@@ -0,0 +1,415 @@
+//
+//  KMPDFEditToolbar.swift
+//  PDF Master
+//
+//  Created by tangchao on 2023/5/4.
+//
+
+import Cocoa
+
+enum KMPageEditType: Int {
+    case pageRange = 1
+    case leftRotate
+    case rightRotate
+    case insert
+    case extract
+    case replace
+    case split
+    case reverse
+    case delete
+    
+    case zoomOut
+    case zoomIn
+    
+    static var insert_files: Int {
+        get {
+            return self.insert.rawValue + 1000
+        }
+    }
+    static var insert_blank_page: Int {
+        get {
+            return self.insert.rawValue  + 1001
+        }
+    }
+    static var insert_custom_page: Int {
+        get {
+            return self.insert.rawValue + 1002
+        }
+    }
+}
+
+class KMPDFEditToolbar: NSView {
+    private var toolBar_ = KMToolbar()
+    var toolBar: KMToolbar {
+        get {
+            return self.toolBar_
+        }
+    }
+    
+    private var zoomOutButton_: NSButton?
+    private var zoomInButton_: NSButton?
+    
+    open var zoomOutButton: NSButton? {
+        get {
+            return self.zoomOutButton_
+        }
+    }
+    open var zoomInButton: NSButton? {
+        get {
+            return self.zoomInButton_
+        }
+    }
+    
+    private var pageRangeView_: KMDesignSelect?
+    open var pageRangeView: KMDesignSelect? {
+        get {
+            return self.pageRangeView_
+        }
+    }
+    private var pageRangeViewItems = [KMTools.pageRangeTypeString(pageRange: .all),
+                              KMTools.pageRangeTypeString(pageRange: .odd),
+                              KMTools.pageRangeTypeString(pageRange: .even),
+                              KMTools.pageRangeTypeString(pageRange: .horizontal),
+                              KMTools.pageRangeTypeString(pageRange: .vertical),
+                              KMTools.pageRangeTypeString(pageRange: .custom)]
+    
+    var itemClick: KMItemClickBlock<KMPDFEditToolbar>?
+    var pageRangeValueDidChange: KMValueDidChangeBlock?
+    
+    override init(frame frameRect: NSRect) {
+        super.init(frame: frameRect)
+        
+        self.initDefaultValue()
+        self.initSubViews()
+    }
+    
+    required init?(coder: NSCoder) {
+        super.init(coder: coder)
+        
+        self.initDefaultValue()
+        self.initSubViews()
+    }
+    
+    public func initDefaultValue() {
+        
+    }
+    
+    public func initSubViews() {
+        self.addSubview(self.toolBar)
+        self.toolBar.frame = self.bounds
+        self.toolBar.autoresizingMask = [.width, .height]
+        self.toolBar.delegate = self
+        
+        let rightItemView = self.rightItemView
+        self.addSubview(rightItemView)
+        rightItemView.frame = NSMakeRect(NSWidth(self.frame)-80, 0, 80, NSHeight(self.frame))
+        rightItemView.autoresizingMask = [.minXMargin, .height]
+    }
+    
+    // MARK: - Publick Methods
+    
+    
+    
+    // MARK: - Actions
+    
+    @objc private func zoomOutButtonAction() {
+        guard let callback = self.itemClick else {
+            return
+        }
+        callback(self, KMPageEditType.zoomOut.rawValue)
+    }
+    
+    @objc private func zoomInButtonAction() {
+        guard let callback = self.itemClick else {
+            return
+        }
+        callback(self, KMPageEditType.zoomIn.rawValue)
+    }
+    
+    // MARK: toolBar 菜单事件
+    
+    @objc func pageRangeMenuAction(sender: KMToolbarClickButton) {
+        
+    }
+    
+    @objc func leftRotateMenuAction(sender: KMToolbarClickButton?) {
+        guard let callback = self.itemClick else {
+            return
+        }
+        callback(self, KMPageEditType.leftRotate.rawValue)
+    }
+    
+    @objc func rightRotateMenuAction(sender: KMToolbarClickButton?) {
+        guard let callback = self.itemClick else {
+            return
+        }
+        callback(self, KMPageEditType.rightRotate.rawValue)
+    }
+    
+    @objc func insertMenuAction(sender: KMToolbarClickButton) {
+        let menu = NSMenu()
+        let insertFileItem = NSMenuItem(title: NSLocalizedString("Insert File", comment: ""), action: #selector(item_insertFile), target: self)
+        menu.addItem(insertFileItem!)
+        let insertBlankPageItem = NSMenuItem(title: NSLocalizedString("Insert a blank page", comment: ""), action: #selector(item_insertBlankPage), target: self)
+        menu.addItem(insertBlankPageItem!)
+        let insertCustomPageItem = NSMenuItem(title: NSLocalizedString("Insert custom page", comment: ""), action: #selector(item_insertCustomPage), target: self)
+        menu.addItem(insertCustomPageItem!)
+        menu.popUp(positioning: nil, at: NSPoint(x: 0, y: 40), in: sender)
+    }
+    
+    @objc func extractMenuAction(sender: KMToolbarClickButton?) {
+        guard let callback = self.itemClick else {
+            return
+        }
+        callback(self, KMPageEditType.extract.rawValue)
+    }
+    
+    @objc func replaceMenuAction(sender: KMToolbarClickButton?) {
+        guard let callback = self.itemClick else {
+            return
+        }
+        callback(self, KMPageEditType.replace.rawValue)
+    }
+    
+    @objc func splitMenuAction(sender: KMToolbarClickButton) {
+        guard let callback = self.itemClick else {
+            return
+        }
+        callback(self, KMPageEditType.split.rawValue)
+    }
+    
+    @objc func reverseMenuAction(sender: KMToolbarClickButton) {
+        guard let callback = self.itemClick else {
+            return
+        }
+        callback(self, KMPageEditType.reverse.rawValue)
+    }
+    
+    @objc func deleteMenuAction(sender: KMToolbarClickButton) {
+        guard let callback = self.itemClick else {
+            return
+        }
+        callback(self, KMPageEditType.delete.rawValue)
+    }
+    
+    @objc func item_insertFile(sender: NSMenuItem?) {
+        guard let callback = self.itemClick else {
+            return
+        }
+        callback(self, KMPageEditType.insert_files)
+    }
+    
+    @objc func item_insertBlankPage(sender: NSMenuItem?) {
+        guard let callback = self.itemClick else {
+            return
+        }
+        callback(self, KMPageEditType.insert_blank_page)
+    }
+    
+    @objc func item_insertCustomPage(sender: NSMenuItem?) {
+        guard let callback = self.itemClick else {
+            return
+        }
+        callback(self, KMPageEditType.insert_custom_page)
+    }
+    
+    private lazy var rightItemView: NSView = {
+        let view = NSView()
+        
+        let size: CGFloat = 28
+        let y: CGFloat = 6
+        let zoomOutButton = NSButton()
+        view.addSubview(zoomOutButton)
+        zoomOutButton.frame = NSMakeRect(0, y, size, size)
+        zoomOutButton.isBordered = false
+        zoomOutButton.image = NSImage(named: "KMImageNamePageEditZoomOut")
+        zoomOutButton.target = self
+        zoomOutButton.action = #selector(zoomOutButtonAction)
+        self.zoomOutButton_ = zoomOutButton
+        
+        let zoomInButton = NSButton()
+        view.addSubview(zoomInButton)
+        zoomInButton.frame = NSMakeRect(size+7, y, size, size)
+        zoomInButton.isBordered = false
+        zoomInButton.image = NSImage(named: "KMImageNamePageEditZoomIn")
+        zoomInButton.target = self
+        zoomInButton.action = #selector(zoomInButtonAction)
+        self.zoomInButton_ = zoomInButton
+        
+        return view
+    }()
+}
+
+// MARK: - KMNewToolbarDelegate
+
+extension KMPDFEditToolbar: KMNewToolbarDelegate {
+    func toolbarDefaultItemIdentifiers(_ toolbar: KMToolbar!) -> [String]! {
+        return [KMToolbarPageEditPageRangeItemIdentifier,
+                KMToolbarPageEditLeftRotateItemIdentifier,
+                KMToolbarPageEditRightRotateItemIdentifier,
+//                KMToolbarDividerItemIdentifier,
+//                KMToolbarPageEditInsetItemIdentifier,
+//                KMToolbarPageEditExtractItemIdentifier,
+//                KMToolbarPageEditReplaceItemIdentifier,
+//                KMToolbarPageEditSplitItemIdentifier,
+//                KMToolbarPageEditReverseItemIdentifier,
+                KMToolbarDividerItemIdentifier,
+                KMToolbarPageEditDeleteItemIdentifier]
+    }
+    
+    func toolbar(_ toolbar: KMToolbar!, itemForItemIdentifier identifier: String!) -> KMToolBoxItem! {
+        let item = KMToolBoxItem(itemIdentifier: identifier)
+        if (identifier == KMToolbarPageEditPageRangeItemIdentifier) {
+//            item?.image = NSImage(named: "KMImageNameMainToolbarrRight")
+            item?.alternateImage = NSImage(named: "KMImageNameMainToolbarrRight")
+            item?.target = self
+            item?.btnTag = KMPageEditType.pageRange.rawValue
+//            item?.toolTip = NSLocalizedString("pageRange", comment: "")
+            item?.titleName = NSLocalizedString("pageRange    ", comment: "")
+            item?.boxImagePosition = KMToolBoxImagePosition.left
+            item?.btnAction = #selector(pageRangeMenuAction)
+            
+            let view = NSView()
+            item?.addSubview(view)
+            view.frame = item!.bounds
+            view.autoresizingMask = [.width,.height]
+            view.wantsLayer = true
+            view.layer?.backgroundColor = NSColor(hex: "#F7F8FA").cgColor
+            
+            let comBoxView = KMDesignSelect(withType: .Combox)
+            view.addSubview(comBoxView.view)
+            comBoxView.view.frame = NSMakeRect(0, 8, NSWidth(view.frame), 24)
+            comBoxView.view.autoresizingMask = [.width]
+            comBoxView.removeAllItems()
+            comBoxView.addItems(withObjectValues: self.pageRangeViewItems)
+            comBoxView.selectItem(at: 0)
+            comBoxView.placeholderString = NSLocalizedString("eg .1,3-5,10", comment: "")
+            comBoxView.editable = false
+            comBoxView.delete = self
+            self.pageRangeView_ = comBoxView
+            
+            let menuItem = NSMenuItem.init(title: "pageRange", action: #selector(pageRangeMenuAction), target: self)
+            item?.menuFormRepresentation = menuItem
+        } else if (identifier == KMToolbarPageEditLeftRotateItemIdentifier) {
+            item?.image = NSImage(named: "KMImageNameMainToolPageLeftRotate")
+            item?.alternateImage = NSImage(named: "KMImageNameMainToolPageLeftRotate")
+            item?.target = self
+            item?.btnTag = KMPageEditType.leftRotate.rawValue
+            item?.toolTip = NSLocalizedString("Rotate Left", comment: "")
+            item?.titleName = NSLocalizedString("", comment: "")
+            item?.boxImagePosition = KMToolBoxImagePosition.left
+            item?.btnAction = #selector(leftRotateMenuAction)
+            
+            let menuItem = NSMenuItem.init(title: "", action: #selector(leftRotateMenuAction), target: self)
+            item?.menuFormRepresentation = menuItem
+        } else if (identifier == KMToolbarPageEditRightRotateItemIdentifier) {
+            item?.image = NSImage(named: "KMImageNameMainToolPageRightRotate")
+            item?.alternateImage = NSImage(named: "KMImageNameMainToolPageRightRotate")
+            item?.target = self
+            item?.btnTag = KMPageEditType.rightRotate.rawValue
+            item?.toolTip = NSLocalizedString("Rotate Right", comment: "")
+            item?.titleName = NSLocalizedString("", comment: "")
+            item?.boxImagePosition = KMToolBoxImagePosition.left
+            item?.btnAction = #selector(rightRotateMenuAction)
+            
+            let menuItem = NSMenuItem.init(title: "", action: #selector(rightRotateMenuAction), target: self)
+            item?.menuFormRepresentation = menuItem
+        } else if (identifier == KMToolbarPageEditInsetItemIdentifier) {
+            item?.image = NSImage(named: "KMImageNameMainToolPageInsert")
+            item?.alternateImage = NSImage(named: "KMImageNameMainToolPageInsert")
+            item?.target = self
+            item?.btnTag = KMPageEditType.insert.rawValue
+            item?.toolTip = NSLocalizedString("Insert", comment: "")
+            item?.titleName = NSLocalizedString("Insert", comment: "")
+            item?.boxImagePosition = KMToolBoxImagePosition.left
+            item?.btnAction = #selector(insertMenuAction)
+            
+            let menuItem = NSMenuItem.init(title: "Insert", action: #selector(insertMenuAction), target: self)
+            item?.menuFormRepresentation = menuItem
+        } else if (identifier == KMToolbarPageEditExtractItemIdentifier) {
+            item?.image = NSImage(named: "KMImageNameMainToolPageExtract")
+            item?.alternateImage = NSImage(named: "KMImageNameMainToolPageExtract")
+            item?.target = self
+            item?.btnTag = KMPageEditType.extract.rawValue
+            item?.toolTip = NSLocalizedString("Extract", comment: "")
+            item?.titleName = NSLocalizedString("Extract", comment: "")
+            item?.boxImagePosition = KMToolBoxImagePosition.left
+            item?.btnAction = #selector(extractMenuAction)
+            
+            let menuItem = NSMenuItem.init(title: "Extract", action: #selector(extractMenuAction), target: self)
+            item?.menuFormRepresentation = menuItem
+        } else if (identifier == KMToolbarPageEditReplaceItemIdentifier) {
+            item?.image = NSImage(named: "KMImageNameMainToolPageReplace")
+            item?.alternateImage = NSImage(named: "KMImageNameMainToolPageReplace")
+            item?.target = self
+            item?.btnTag = KMPageEditType.replace.rawValue
+            item?.toolTip = NSLocalizedString("Replace", comment: "")
+            item?.titleName = NSLocalizedString("Replace", comment: "")
+            item?.boxImagePosition = KMToolBoxImagePosition.left
+            item?.btnAction = #selector(replaceMenuAction)
+            
+            let menuItem = NSMenuItem.init(title: "Replace", action: #selector(replaceMenuAction), target: self)
+            item?.menuFormRepresentation = menuItem
+        } else if (identifier == KMToolbarPageEditSplitItemIdentifier) {
+            item?.image = NSImage(named: "KMImageNameMainToolPageSplit")
+            item?.alternateImage = NSImage(named: "KMImageNameMainToolPageSplit")
+            item?.target = self
+            item?.btnTag = KMPageEditType.split.rawValue
+            item?.toolTip = NSLocalizedString("Split the PDF into multiple files", comment: "")
+            item?.titleName = NSLocalizedString("Split", comment: "")
+            item?.boxImagePosition = KMToolBoxImagePosition.left
+            item?.btnAction = #selector(splitMenuAction)
+            
+            let menuItem = NSMenuItem.init(title: "Split", action: #selector(splitMenuAction), target: self)
+            item?.menuFormRepresentation = menuItem
+        } else if (identifier == KMToolbarPageEditReverseItemIdentifier) {
+            item?.image = NSImage(named: "KMImageNameMainToolPageReverse")
+            item?.alternateImage = NSImage(named: "KMImageNameMainToolPageReverse")
+            item?.target = self
+            item?.btnTag = KMPageEditType.reverse.rawValue
+            item?.toolTip = NSLocalizedString("Reverse", comment: "")
+            item?.titleName = NSLocalizedString("Reverse", comment: "")
+            item?.boxImagePosition = KMToolBoxImagePosition.left
+            item?.btnAction = #selector(reverseMenuAction)
+            
+            let menuItem = NSMenuItem.init(title: "Reverse", action: #selector(reverseMenuAction), target: self)
+            item?.menuFormRepresentation = menuItem
+        } else if (identifier == KMToolbarPageEditDeleteItemIdentifier) {
+            item?.image = NSImage(named: "KMImageNameMainToolPageDelete")
+            item?.alternateImage = NSImage(named: "KMImageNameMainToolPageDelete")
+            item?.target = self
+            item?.btnTag = KMPageEditType.delete.rawValue
+            item?.toolTip = NSLocalizedString("Delete", comment: "")
+            item?.titleName = NSLocalizedString("", comment: "")
+            item?.boxImagePosition = KMToolBoxImagePosition.left
+            item?.btnAction = #selector(deleteMenuAction)
+            
+            let menuItem = NSMenuItem.init(title: "Delete", action: #selector(deleteMenuAction), target: self)
+            item?.menuFormRepresentation = menuItem
+        }
+        
+        return item
+    }
+}
+
+// MARK: - KMSelectPopButtonDelegate
+
+extension KMPDFEditToolbar: KMSelectPopButtonDelegate {
+    func km_comboBoxSelectionDidChange(_ obj: KMDesignSelect) {
+        guard let callback = self.itemClick else {
+            return
+        }
+        callback(self, KMPageEditType.pageRange.rawValue)
+    }
+    
+    func km_controlTextDidChange(_ obj: KMDesignSelect) {
+        
+    }
+    
+    func km_controlTextDidEndEditing(_ obj: KMDesignSelect) {
+        guard let callback = self.pageRangeValueDidChange else {
+            return
+        }
+        callback(self.pageRangeView?.stringValue, nil)
+    }
+}