소스 검색

密文标记-新增工具栏入口和密文标记工具栏

tangchao 2 년 전
부모
커밋
d0f3ca4985

+ 24 - 0
PDF Office/PDF Office.xcodeproj/project.pbxproj

@@ -1099,6 +1099,9 @@
 		BB35C4992974E18D00D46EE2 /* CustomAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = BB35C4982974E18D00D46EE2 /* CustomAlertView.m */; };
 		BB35C49A2974E18D00D46EE2 /* CustomAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = BB35C4982974E18D00D46EE2 /* CustomAlertView.m */; };
 		BB35C49B2974E18D00D46EE2 /* CustomAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = BB35C4982974E18D00D46EE2 /* CustomAlertView.m */; };
+		BB35C49F2975362900D46EE2 /* KMRedactTopToolBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB35C49E2975362900D46EE2 /* KMRedactTopToolBar.swift */; };
+		BB35C4A02975362900D46EE2 /* KMRedactTopToolBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB35C49E2975362900D46EE2 /* KMRedactTopToolBar.swift */; };
+		BB35C4A12975362900D46EE2 /* KMRedactTopToolBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB35C49E2975362900D46EE2 /* KMRedactTopToolBar.swift */; };
 		BB3EAEAD293E3D6000D92407 /* KMConvertBaseWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB3EAEAB293E3D6000D92407 /* KMConvertBaseWindowController.swift */; };
 		BB3EAEAE293E3D6000D92407 /* KMConvertBaseWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB3EAEAB293E3D6000D92407 /* KMConvertBaseWindowController.swift */; };
 		BB3EAEAF293E3D6000D92407 /* KMConvertBaseWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB3EAEAB293E3D6000D92407 /* KMConvertBaseWindowController.swift */; };
@@ -2335,6 +2338,7 @@
 		BB2F61572966B69D001CB369 /* KMWatermarkPropertyHomeController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMWatermarkPropertyHomeController.xib; sourceTree = "<group>"; };
 		BB35C4972974E18C00D46EE2 /* CustomAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomAlertView.h; sourceTree = "<group>"; };
 		BB35C4982974E18D00D46EE2 /* CustomAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomAlertView.m; sourceTree = "<group>"; };
+		BB35C49E2975362900D46EE2 /* KMRedactTopToolBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMRedactTopToolBar.swift; sourceTree = "<group>"; };
 		BB3EAEAB293E3D6000D92407 /* KMConvertBaseWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMConvertBaseWindowController.swift; sourceTree = "<group>"; };
 		BB3EAEAC293E3D6000D92407 /* KMConvertBaseWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMConvertBaseWindowController.xib; sourceTree = "<group>"; };
 		BB49ECDB293EED6100C82CA2 /* KMConvertWordWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMConvertWordWindowController.swift; sourceTree = "<group>"; };
@@ -3092,6 +3096,7 @@
 		9F1F82C6292F631A0092C4B4 /* PDFTools */ = {
 			isa = PBXGroup;
 			children = (
+				BB35C49C297535C800D46EE2 /* Redact */,
 				BB1EC7FA2967B24100EC0BC3 /* PageEdit */,
 				BBC2BCC2295DA8700036B983 /* Crop */,
 				BBEC00AB295C2AB500A26C98 /* Bates */,
@@ -4012,6 +4017,22 @@
 			path = View;
 			sourceTree = "<group>";
 		};
+		BB35C49C297535C800D46EE2 /* Redact */ = {
+			isa = PBXGroup;
+			children = (
+				BB35C49D297535C800D46EE2 /* View */,
+			);
+			path = Redact;
+			sourceTree = "<group>";
+		};
+		BB35C49D297535C800D46EE2 /* View */ = {
+			isa = PBXGroup;
+			children = (
+				BB35C49E2975362900D46EE2 /* KMRedactTopToolBar.swift */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
 		BB3EAEA9293E3BA200D92407 /* Convert */ = {
 			isa = PBXGroup;
 			children = (
@@ -6103,6 +6124,7 @@
 				ADD1B70A29471FA500C3FFF7 /* KMPrintChoosePresenter.swift in Sources */,
 				F3599173292B62F5000D25DE /* CStringConstants.m in Sources */,
 				89752DF229389F82003FF08E /* KMToolbarItem.m in Sources */,
+				BB35C49F2975362900D46EE2 /* KMRedactTopToolBar.swift in Sources */,
 				BB49ECE9293F32A400C82CA2 /* KMConvertWordSettingView.swift in Sources */,
 				89D2D308295A83B500BFF5FE /* KMEditPDFTextPropertyViewController.swift in Sources */,
 				ADCB98D92924774F00B51A03 /* KMBatchProcessingOrderTableCell.swift in Sources */,
@@ -6555,6 +6577,7 @@
 				F373228D292CCA650013862C /* CPDFListViewAnimatedBorderlessWindow.m in Sources */,
 				F373228D292CCA650013862C /* CPDFListViewAnimatedBorderlessWindow.m in Sources */,
 				9F8539C729430AC400DF644E /* KMToolbarRightView.swift in Sources */,
+				BB35C4A02975362900D46EE2 /* KMRedactTopToolBar.swift in Sources */,
 				BB49ECEE293F3B0D00C82CA2 /* KMConvertOCRSettingItemView.swift in Sources */,
 				89D2D309295A83B500BFF5FE /* KMEditPDFTextPropertyViewController.swift in Sources */,
 				9F1FE49A29406E4700E952CA /* NewTabButton.m in Sources */,
@@ -6976,6 +6999,7 @@
 				F3599175292B62F5000D25DE /* CStringConstants.m in Sources */,
 				89E4E748296418ED002DBA6F /* TextFieldFormatter.m in Sources */,
 				9F1FE50129406E4700E952CA /* CTTabStripModel.m in Sources */,
+				BB35C4A12975362900D46EE2 /* KMRedactTopToolBar.swift in Sources */,
 				F34BF93C29530951002C25A2 /* NSEvent+PDFListView.m in Sources */,
 				9F1FE4CB29406E4700E952CA /* CTTabContents.m in Sources */,
 				9F78EFC428F7E395001E66F4 /* KMHomeViewController+Action.swift in Sources */,

BIN
PDF Office/PDF Office.xcodeproj/project.xcworkspace/xcuserdata/kdanmobile.xcuserdatad/UserInterfaceState.xcuserstate


+ 55 - 21
PDF Office/PDF Office/Class/PDFTools/PageEdit/Controller/KMPDFEditViewController.swift

@@ -34,6 +34,8 @@ class KMPDFEditViewController: NSViewController, KMPDFThumbnailViewDelegate {
     private var lockedFiles: Array<URL> = []
     private var passwordInputWindow: KMPasswordInputWindow!
     
+    private var undoRedoManager: UndoManager = UndoManager()
+    
     deinit {
         NSEvent.removeMonitor(self.localMonitor)
         self.localMonitor = nil
@@ -162,17 +164,35 @@ class KMPDFEditViewController: NSViewController, KMPDFThumbnailViewDelegate {
         menu.delegate = self
         self.view.menu = menu
         
-        self.localMonitor = NSEvent.addLocalMonitorForEvents(matching: .keyUp, handler: {
+        self.localMonitor = NSEvent.addLocalMonitorForEvents(matching: [.keyUp,.keyDown], handler: {
             [weak self] (event: NSEvent) -> NSEvent in
-            if (event.keyCode == 8) { /// 复制
+            
+            var commandKeyDown: Bool = (event.modifierFlags.rawValue & NSEvent.ModifierFlags.command.rawValue) == NSEvent.ModifierFlags.command.rawValue
+            if (event.keyCode == 8 && commandKeyDown && event.type == .keyUp) { /// 复制
                 self?.copyPages(with: (self?.thumbnailView.collectionView.selectionIndexes)!)
                 return event
             }
-            if (event.keyCode == 9) { /// 粘贴
+            if (event.keyCode == 9 && commandKeyDown && event.type == .keyUp) { /// 粘贴
                 self?.pastePages(at: (self?.thumbnailView.collectionView.selectionIndexes.last)!)
                 return event
             }
             
+            if (event.keyCode == 6 && event.type == .keyUp) { /// 撤销
+                var shiftKeyDown: Bool = (event.modifierFlags.rawValue & NSEvent.ModifierFlags.shift.rawValue) == NSEvent.ModifierFlags.shift.rawValue
+                if (commandKeyDown && shiftKeyDown) {
+                    if ((self?.undoRedoManager.canRedo)!) {
+                        self?.undoRedoManager.redo()
+                    }
+                } else if (commandKeyDown) {
+                    if ((self?.undoRedoManager.canUndo)!) {
+                        self?.undoRedoManager.undo()
+                    }
+
+                }
+                
+                return event
+            }
+            
             return event
         })
     }
@@ -273,6 +293,36 @@ class KMPDFEditViewController: NSViewController, KMPDFThumbnailViewDelegate {
         }
     }
     
+    // MARK: Undo / Redo
+    
+    @objc private func leftRotate(indexs: IndexSet) {
+        for i in 0 ..< (self.listView?.document.pageCount)!-1 {
+            if (indexs.contains(IndexSet.Element(i))) {
+                var page: CPDFPage = (self.listView?.document.page(at: i))!
+                page.rotation = page.rotation - 90
+            }
+        }
+        
+        self.undoRedoManager.registerUndo(withTarget: self, selector: #selector(rightRotate), object: indexs)
+        
+        self.listView?.layoutDocumentView()
+        self.thumbnailView.refreshUI()
+    }
+    
+    @objc private func rightRotate(indexs: IndexSet) {
+        for i in 0 ..< (self.listView?.document.pageCount)!-1 {
+            if (indexs.contains(IndexSet.Element(i))) {
+                var page: CPDFPage = (self.listView?.document.page(at: i))!
+                page.rotation = page.rotation + 90
+            }
+        }
+        
+        self.undoRedoManager.registerUndo(withTarget: self, selector: #selector(leftRotate), object: indexs)
+        
+        self.listView?.layoutDocumentView()
+        self.thumbnailView.refreshUI()
+    }
+    
     // MARK: topBar 事件
     
     @objc func zoomOutButtonAction(sender: NSButton) {
@@ -424,15 +474,7 @@ class KMPDFEditViewController: NSViewController, KMPDFThumbnailViewDelegate {
             indexs.insert(indexpath.item)
         }
         
-        for i in 0 ..< (self.listView?.document.pageCount)!-1 {
-            if (indexs.contains(IndexSet.Element(i))) {
-                var page: CPDFPage = (self.listView?.document.page(at: i))!
-                page.rotation = page.rotation - 90
-            }
-        }
-        
-        self.listView?.layoutDocumentView()
-        self.thumbnailView.refreshUI()
+        self.leftRotate(indexs: indexs)
     }
     
     @objc func rightRotateMenuAction(sender: KMToolbarClickButton) {
@@ -442,15 +484,7 @@ class KMPDFEditViewController: NSViewController, KMPDFThumbnailViewDelegate {
             indexs.insert(indexpath.item)
         }
         
-        for i in 0 ..< (self.listView?.document.pageCount)!-1 {
-            if (indexs.contains(IndexSet.Element(i))) {
-                var page: CPDFPage = (self.listView?.document.page(at: i))!
-                page.rotation = page.rotation + 90
-            }
-        }
-        
-        self.listView?.layoutDocumentView()
-        self.thumbnailView.refreshUI()
+        self.rightRotate(indexs: indexs)
     }
     
     @objc func insertMenuAction(sender: KMToolbarClickButton) {

+ 235 - 0
PDF Office/PDF Office/Class/PDFTools/Redact/View/KMRedactTopToolBar.swift

@@ -0,0 +1,235 @@
+//
+//  KMRedactTopToolBar.swift
+//  PDF Office
+//
+//  Created by tangchao on 2023/1/16.
+//
+
+import Cocoa
+typealias KMRedactTopToolBarItemViewItemClick = (_ index: Int) -> ()
+private class KMRedactTopToolBarItemView: NSView {
+    var imageView = NSImageView()
+    var titleLabel = NSTextField(labelWithString: "")
+    var bottomLine = NSView()
+    var button = NSButton()
+    
+    var itemID: Int = 0
+    
+    private var myIsSelected: Bool = false
+    var isSelected: Bool {
+        get {
+            return myIsSelected
+        }
+        set {
+            myIsSelected = newValue
+            
+            if (myIsSelected) {
+                self.bottomLine.isHidden = false
+            } else {
+                self.bottomLine.isHidden = true
+            }
+        }
+    }
+    
+    var itemClick: KMRedactTopToolBarItemViewItemClick!
+    
+    override init(frame frameRect: NSRect) {
+        super.init(frame: frameRect)
+        
+        initSubViews()
+    }
+    
+    required init?(coder: NSCoder) {
+        super.init(coder: coder)
+        
+        initSubViews()
+    }
+    
+    func initSubViews() {
+        self.addSubview(self.imageView)
+        self.addSubview(self.titleLabel)
+        self.addSubview(self.bottomLine)
+        
+        self.bottomLine.wantsLayer = true
+        self.bottomLine.layer?.backgroundColor = NSColor.black.cgColor
+        
+        self.addSubview(self.button)
+        self.button.isBordered = false
+        self.button.title = ""
+        self.button.target = self
+        self.button.action = #selector(buttonAction)
+    }
+    
+    override func layout() {
+        super.layout()
+        
+        let width: CGFloat = NSWidth(self.bounds)
+        let heigth: CGFloat = NSHeight(self.bounds)
+        
+        let imageSize: NSSize = NSSize(width: 14, height: 15)
+        let imageY: CGFloat = (heigth-imageSize.height)*0.5
+        self.imageView.frame = NSMakeRect(0, imageY, imageSize.width, imageSize.height)
+        
+        let titleH: CGFloat = 20
+        let titleY: CGFloat = (heigth-titleH)*0.5
+        let titleX: CGFloat = self.imageView.frame.maxX+8
+        self.titleLabel.frame = NSMakeRect(titleX, titleY, width-titleX, titleH)
+        
+        self.bottomLine.frame = NSMakeRect(0, 0, width, 1)
+        
+        self.button.frame = self.bounds
+    }
+    
+    @objc func buttonAction() {
+        guard let callback = self.itemClick else {
+            return
+        }
+        
+        callback(self.itemID)
+    }
+}
+
+typealias KMRedactTopToolBarItemClick = (_ index: Int) -> ()
+class KMRedactTopToolBar: NSView {
+    private var textAndImageItemView = KMRedactTopToolBarItemView()
+    private var pageItemView = KMRedactTopToolBarItemView()
+    
+    private var applyButton = NSButton()
+    private var clearButton = NSButton()
+    private var closeButton = NSButton()
+    
+    var itemClick: KMRedactTopToolBarItemClick!
+    
+    override init(frame frameRect: NSRect) {
+        super.init(frame: frameRect)
+        
+        initSubViews()
+    }
+    
+    required init?(coder: NSCoder) {
+        super.init(coder: coder)
+        
+        initSubViews()
+    }
+    
+    public func initSubViews() {
+        self.addSubview(self.textAndImageItemView)
+        self.addSubview(self.pageItemView)
+        self.addSubview(self.applyButton)
+        self.addSubview(self.clearButton)
+        self.addSubview(self.closeButton)
+        
+        self.textAndImageItemView.titleLabel.stringValue = "文本和图像标记密文"
+        self.textAndImageItemView.itemClick = { [weak self] index in
+            self!.selectItem(0)
+            
+            guard let callback = self!.itemClick else {
+                return
+            }
+            
+            callback(4)
+        }
+        self.pageItemView.titleLabel.stringValue = "页面标记密文"
+        self.pageItemView.itemClick = { [weak self] index in
+            self!.selectItem(1)
+            
+            guard let callback = self!.itemClick else {
+                return
+            }
+            
+            callback(5)
+        }
+        
+        self.applyButton.isBordered = false
+        self.applyButton.title = "应用密文"
+        self.applyButton.wantsLayer = true
+        self.applyButton.layer?.backgroundColor = NSColor.black.cgColor
+        self.applyButton.attributedTitle = NSAttributedString(string: self.applyButton.title, attributes: [NSAttributedString.Key.foregroundColor : NSColor.white])
+        self.applyButton.layer?.cornerRadius = 4
+        self.applyButton.target = self
+        self.applyButton.action = #selector(applyButtonAction)
+        
+        self.clearButton.isBordered = false
+        self.clearButton.title = "擦除密文"
+        self.clearButton.wantsLayer = true
+        self.clearButton.layer?.backgroundColor = NSColor.black.cgColor
+        self.clearButton.attributedTitle = NSAttributedString(string: self.clearButton.title, attributes: [NSAttributedString.Key.foregroundColor : NSColor.white])
+        self.clearButton.layer?.cornerRadius = 4
+        self.clearButton.target = self
+        self.clearButton.action = #selector(clearButtonAction)
+        
+        self.closeButton.isBordered = false
+        self.closeButton.title = "关闭"
+        self.closeButton.wantsLayer = true
+        self.closeButton.layer?.cornerRadius = 4
+        self.closeButton.layer?.borderWidth = 1
+        self.closeButton.layer?.borderColor = NSColor.black.cgColor
+        self.closeButton.target = self
+        self.closeButton.action = #selector(closeButtonAction)
+    }
+    
+    override func layout() {
+        super.layout()
+        
+        let width: CGFloat = NSWidth(self.bounds)
+        let height: CGFloat = NSHeight(self.bounds)
+        
+        let itemX: CGFloat = (width-280)*0.5
+        self.textAndImageItemView.frame = NSMakeRect(itemX, 0, 140, height)
+        self.pageItemView.frame = NSMakeRect(self.textAndImageItemView.frame.maxX, 0, 140, height)
+        
+        let buttonH: CGFloat = 24
+        let buttonY: CGFloat = (height-buttonH)*0.5
+        
+        let closeW: CGFloat = 44
+        let closeX: CGFloat = width-12-closeW
+        let closeY: CGFloat = (height-buttonH)*0.5
+        self.closeButton.frame = NSMakeRect(closeX, closeY, closeW, buttonH)
+        
+        let clearW: CGFloat = 68
+        let clearX: CGFloat = self.closeButton.frame.minX-8-clearW
+        self.clearButton.frame = NSMakeRect(clearX, buttonY, clearW, buttonH)
+        
+        let applyW: CGFloat = 68
+        let applyX: CGFloat = self.clearButton.frame.minX-8-applyW
+        self.applyButton.frame = NSMakeRect(applyX, buttonY, applyW, buttonH)
+    }
+    
+    @objc private func applyButtonAction() {
+        guard let callback = self.itemClick else {
+            return
+        }
+        
+        callback(3)
+    }
+    
+    @objc private func clearButtonAction() {
+        guard let callback = self.itemClick else {
+            return
+        }
+        
+        callback(2)
+    }
+    
+    @objc private func closeButtonAction() {
+        guard let callback = self.itemClick else {
+            return
+        }
+        
+        callback(1)
+    }
+    
+    public func selectItem(_ index: Int) {
+        var count: Int = 0
+        for item in [self.textAndImageItemView,
+                     self.pageItemView] {
+            if (index == count) {
+                item.isSelected = true
+            } else {
+                item.isSelected = false
+            }
+            count += 1
+        }
+    }
+    
+}

+ 31 - 0
PDF Office/PDF Office/Class/PDFWindowController/Toolbar/KMToolbarController.swift

@@ -182,6 +182,33 @@ class KMToolbarController: NSViewController {
         return topBarView
     }
     
+    func enterRedact() {
+        self.toolbarType = .None
+        
+        let topBarView = KMRedactTopToolBar()
+        topBarView.frame = (self.mainToolBarView?.toolbar.bounds)!
+        self.mainToolBarView?.toolbar.addSubview(topBarView)
+        topBarView.autoresizingMask = NSView.AutoresizingMask(rawValue: 18)
+        topBarView.wantsLayer = true
+        topBarView.layer?.backgroundColor = NSColor.white.cgColor
+        
+        topBarView.selectItem(0)
+        self.delegate?.clickChildTool!(type: .redact, index: 4)
+        
+        topBarView.itemClick = { [weak self] index in
+            self!.delegate?.clickChildTool!(type: .redact, index: index)
+        }
+    }
+    
+    func exitRedact() {
+        let topBarView = self.mainToolBarView?.toolbar.subviews.last
+        if (topBarView == nil || topBarView?.isKind(of: KMRedactTopToolBar.self) == false) {
+            return
+        }
+        
+        topBarView?.removeFromSuperview()
+    }
+    
     // MARK: NSNotification
     
     @objc func selectedShapAnnotationChangeNotification(_ notification: Notification) -> Void {
@@ -269,6 +296,10 @@ extension KMToolbarController: KMToolbarViewControllerDelegate {
             toolbarItem.isSelected = false
             
             self.enterWatermarkAdjective(clickChaildToolType, [["添加水印", "移除"], ["批量"]])
+        } else if (clickChaildToolType == .redact) {
+            toolbarItem.isSelected = false
+            
+            self.enterRedact()
         }
     }
 }

+ 19 - 2
PDF Office/PDF Office/Class/PDFWindowController/Toolbar/KMToolbarViewController.swift

@@ -31,7 +31,7 @@ import Cocoa
     case merge = 8001
     case fileCompare = 8002
     case secure = 8003
-    case encryptText = 8004
+    case redact = 8004
     case watermark = 8005
     case background = 8006
     case headerAndFooter = 8007
@@ -129,6 +129,10 @@ class KMToolbarViewController: NSViewController {
     @objc func watermarkMenuAction(sender: KMToolbarClickButton) {
         self.delegate?.toolbarViewController?(self, clickChaildToolType: .watermark, toolbar: sender.clickObject as! KMToolBoxItem)
     }
+    
+    @objc func redactMenuAction(sender: KMToolbarClickButton) {
+        self.delegate?.toolbarViewController?(self, clickChaildToolType: .redact, toolbar: sender.clickObject as! KMToolBoxItem)
+    }
 }
 
 extension KMToolbarViewController : KMNewToolbarDelegate {
@@ -179,7 +183,8 @@ extension KMToolbarViewController : KMNewToolbarDelegate {
         case .Page:
             return []
         case .Tool:
-            return [KMToolbarToolWatermarkItemIdentifier,
+            return [KMToolbarToolRedactItemIdentifier,
+                    KMToolbarToolWatermarkItemIdentifier,
                     KMToolbarToolBackgroundItemIdentifier,
                     KMToolbarToolHeaderFooterItemIdentifier,
                     KMToolbarToolBatesItemIdentifier,
@@ -725,6 +730,18 @@ extension KMToolbarViewController : KMNewToolbarDelegate {
                 let menuItem = NSMenuItem.init(title: "SignBox", action: #selector(changeAnnotationMode), target: self)
                 menuItem?.tag = item!.btnTag
                 item?.menuFormRepresentation = menuItem
+            } else if identifier == KMToolbarToolRedactItemIdentifier {
+                item?.image = NSImage(named: "KMImageNameMainToolbarrRight")
+                item?.alternateImage = NSImage(named: "KMImageNameMainToolbarrRight")
+                item?.target = self
+                item?.btnTag = KMToolbarType.redact.rawValue
+                item?.toolTip = NSLocalizedString("密文", comment: "")
+                item?.titleName = NSLocalizedString("密文", comment: "")
+                item?.btnAction = #selector(redactMenuAction)
+                
+                let menuItem = NSMenuItem.init(title: "密文", action: #selector(changeAnnotationMode), target: self)
+                menuItem?.tag = item!.btnTag
+                item?.menuFormRepresentation = menuItem
             }
         }
         return item

+ 1 - 0
PDF Office/PDF Office/Class/PDFWindowController/Toolbar/PublicKey.swift

@@ -67,6 +67,7 @@ let KMToolbarToolBatesItemIdentifier =  "KMToolbarToolBatesItemIdentifier"
 let KMToolbarToolHeaderFooterItemIdentifier =  "KMToolbarToolHeaderFooterItemIdentifier"
 let KMToolbarToolBackgroundItemIdentifier =  "KMToolbarToolBackgroundItemIdentifier"
 let KMToolbarToolWatermarkItemIdentifier =  "KMToolbarToolWatermarkItemIdentifier"
+let KMToolbarToolRedactItemIdentifier =  "KMToolbarToolRedactItemIdentifier"
 
 /// Form
 let KMToolbarToolTextFieldItemIdentifier =  "KMToolbarToolTextFieldItemIdentifier"

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

@@ -741,7 +741,25 @@ extension KMMainViewController : KMMainToolbarControllerDelegate {
             ///  新增
             self.rightSideViewController.view.isHidden = false
             self.rightSideViewController.subViewType = KMWatermarkAdjectiveTools.KMToolBarTypeToRightSubViewType(type)
-        } 
+        } else if (type == .redact) { /// 标记密文
+            if (index == 1) { /// 取消
+                self.toolbarController.exitRedact()
+                return
+            }
+            if (index == 2) { /// 擦除
+                return
+            }
+            if (index == 3) { /// 应用
+                return
+            }
+            if (index == 4) { /// 文本&图像
+                self.listView.toolMode = .redactToolMode
+                return
+            }
+            if (index == 5) { /// 页面
+                return
+            }
+        }
     }
 }