Browse Source

【2025】【Edit】水印模块完善

niehaoyu 4 months ago
parent
commit
12e3fcfefc
18 changed files with 897 additions and 259 deletions
  1. 6 6
      PDF Office/KMComponentLibrary/KMComponentLibrary/View/Input/ComponentInput/ComponentInput.swift
  2. 31 27
      PDF Office/KMComponentLibrary/KMComponentLibrary/View/Message/ComponentMessage.swift
  3. 7 7
      PDF Office/KMComponentLibrary/KMComponentLibrary/View/Message/ComponentMessage.xib
  4. 2 0
      PDF Office/PDF Master/Class/URLManager/KMURLConfigManager.swift
  5. 60 15
      PDF Office/PDF Master/KMClass/KMPDFViewController/KMMainViewController.swift
  6. 3 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/KMPDFViewManager.swift
  7. 57 7
      PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/KMWatermarkController.swift
  8. 16 1
      PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/KMNWatermarkPropertyController.swift
  9. 121 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/KMWatermarkSaveWindow.swift
  10. 121 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/KMWatermarkSaveWindow.xib
  11. 0 49
      PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/KMWatermarkToolbar.swift
  12. 0 130
      PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/KMWatermarkToolbar.xib
  13. 137 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/KMWatermarkToolbarView.swift
  14. 132 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/KMWatermarkToolbarView.xib
  15. 16 0
      PDF Office/PDF Master/KMClass/KMPDFViewController/Toolbar/KMPDFToolbarController.swift
  16. 17 0
      PDF Office/PDF Master/Class/Common/Category/NSView+KMExtension.swift
  17. 33 17
      PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj
  18. 138 0
      PDF Office/PDF Reader Pro.xcodeproj/xcuserdata/kdanmobile.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

+ 6 - 6
PDF Office/KMComponentLibrary/KMComponentLibrary/View/Input/ComponentInput/ComponentInput.swift

@@ -141,10 +141,8 @@ public class ComponentInput: ComponentBaseXibView {
         NotificationCenter.default.addObserver(self, selector: #selector(textFieldDidEndEditingNotification(_:)), name: NSControl.textDidEndEditingNotification, object: inputField)
         
     }
-    
-    
+     
     // MARK: - Set & Get
- 
     public var properties: ComponentInputProperty {
         get {
             return _properties
@@ -159,8 +157,7 @@ public class ComponentInput: ComponentBaseXibView {
             refreshUI()
         }
     }
-    
-    
+     
     func setupUI() {
         if properties.isError == true {
             contendBoxBottomConst.constant = 18
@@ -248,6 +245,10 @@ public class ComponentInput: ComponentBaseXibView {
         refreshUI()
     }
     
+    public func beginEditing() {
+        window?.makeFirstResponder(inputField)
+    }
+    
     private func updateClearButtonState() {
         if properties.showClear == true &&
             inputField.stringValue.count > 0 &&
@@ -287,7 +288,6 @@ public class ComponentInput: ComponentBaseXibView {
     
     @objc func textFieldDidEndEditingNotification(_ notification: Notification) {
 
-        inputField.isResponder = false
         if properties.isDisabled == false {
             properties.state = .normal
         }

+ 31 - 27
PDF Office/KMComponentLibrary/KMComponentLibrary/View/Message/ComponentMessage.swift

@@ -127,40 +127,38 @@ public class ComponentMessage: ComponentBaseXibView {
         properties.propertyInfo.viewWidth = viewWidth
         properties.propertyInfo.viewHeight = 40
         
-        DispatchQueue.main.async {
-            if self.iconImage.isHidden == false {
-                self.iconImage.frame = CGRectMake((CGRectGetWidth(self.frame) - CGRectGetWidth(self.titleLabel.frame) - 20 - layoutGap)/2,
-                                                  CGRectGetHeight(self.frame)/2 - 10,
-                                                  20, 20)
+        if self.iconImage.isHidden == false {
+            self.iconImage.frame = CGRectMake(16,
+                                              CGRectGetHeight(self.frame)/2 - 10,
+                                              20, 20)
+            
+            self.titleLabel.frame = CGRectMake(CGRectGetMaxX(self.iconImage.frame) + layoutGap,
+                                               CGRectGetHeight(self.frame)/2 - CGRectGetHeight(self.titleLabel.frame)/2,
+                                               CGRectGetWidth(self.titleLabel.frame),
+                                               CGRectGetHeight(self.titleLabel.frame))
+            
+            
+        } else {
+            if self.progressItem.isHidden == false {
+                self.progressItem.frame = CGRectMake((CGRectGetWidth(self.frame) - CGRectGetWidth(self.titleLabel.frame) - 20 - layoutGap)/2,
+                                                     CGRectGetHeight(self.frame)/2 - 10,
+                                                     20, 20)
                 
-                self.titleLabel.frame = CGRectMake(CGRectGetMaxX(self.iconImage.frame) + layoutGap,
+                self.titleLabel.frame = CGRectMake(CGRectGetMaxX(self.progressItem.frame) + layoutGap,
                                                    CGRectGetHeight(self.frame)/2 - CGRectGetHeight(self.titleLabel.frame)/2,
                                                    CGRectGetWidth(self.titleLabel.frame),
                                                    CGRectGetHeight(self.titleLabel.frame))
-                
-                
             } else {
-                if self.progressItem.isHidden == false {
-                    self.progressItem.frame = CGRectMake((CGRectGetWidth(self.frame) - CGRectGetWidth(self.titleLabel.frame) - 20 - layoutGap)/2,
-                                                         CGRectGetHeight(self.frame)/2 - 10,
-                                                         20, 20)
-                    
-                    self.titleLabel.frame = CGRectMake(CGRectGetMaxX(self.progressItem.frame) + layoutGap,
-                                                       CGRectGetHeight(self.frame)/2 - CGRectGetHeight(self.titleLabel.frame)/2,
-                                                       CGRectGetWidth(self.titleLabel.frame),
-                                                       CGRectGetHeight(self.titleLabel.frame))
-                } else {
-                    self.titleLabel.frame = CGRectMake(CGRectGetWidth(self.frame)/2 - CGRectGetWidth(self.titleLabel.frame)/2,
-                                                       CGRectGetHeight(self.frame)/2 - CGRectGetHeight(self.titleLabel.frame)/2,
-                                                       CGRectGetWidth(self.titleLabel.frame),
-                                                       CGRectGetHeight(self.titleLabel.frame))
-                }
+                self.titleLabel.frame = CGRectMake(CGRectGetWidth(self.frame)/2 - CGRectGetWidth(self.titleLabel.frame)/2,
+                                                   CGRectGetHeight(self.frame)/2 - CGRectGetHeight(self.titleLabel.frame)/2,
+                                                   CGRectGetWidth(self.titleLabel.frame),
+                                                   CGRectGetHeight(self.titleLabel.frame))
             }
         }
         
-        iconImage.autoresizingMask = [.minXMargin, .maxXMargin, .minYMargin, .maxYMargin]
-        titleLabel.autoresizingMask = [.minXMargin, .maxXMargin, .minYMargin, .maxYMargin]
-         
+        iconImage.autoresizingMask = [.maxXMargin, .maxYMargin]
+        titleLabel.autoresizingMask = [.maxXMargin, .maxYMargin]
+        
     }
     
     public func reloadData() {
@@ -179,7 +177,13 @@ public class ComponentMessage: ComponentBaseXibView {
         positioningView?.addSubview(self)
         
         DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2) {
-            self.removeFromSuperview()
+            NSAnimationContext.runAnimationGroup({ context in
+                context.duration = 0.35 // 设置动画持续时间
+                context.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
+                self.animator().alphaValue = 0.0 // 动画化透明度
+            }, completionHandler: {
+                self.removeFromSuperview()
+            })
         }
     }
     

+ 7 - 7
PDF Office/KMComponentLibrary/KMComponentLibrary/View/Message/ComponentMessage.xib

@@ -6,7 +6,7 @@
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>
-        <customObject id="-2" userLabel="File's Owner" customClass="ComponentMessage" customModule="WComponentLibrary" customModuleProvider="target">
+        <customObject id="-2" userLabel="File's Owner" customClass="ComponentMessage" customModule="KMComponentLibrary" customModuleProvider="target">
             <connections>
                 <outlet property="contendBox" destination="hVn-Rp-cwe" id="Z5P-vp-Qjv"/>
                 <outlet property="iconImage" destination="br8-uy-Vsj" id="cmH-hU-P5u"/>
@@ -20,23 +20,23 @@
             <rect key="frame" x="0.0" y="0.0" width="239" height="40"/>
             <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
             <subviews>
-                <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="hVn-Rp-cwe">
+                <box boxType="custom" borderWidth="0.0" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="hVn-Rp-cwe">
                     <rect key="frame" x="0.0" y="0.0" width="239" height="40"/>
                     <view key="contentView" id="phx-p1-Vch">
-                        <rect key="frame" x="1" y="1" width="237" height="38"/>
+                        <rect key="frame" x="0.0" y="0.0" width="239" height="40"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <subviews>
-                            <customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="pIx-Dk-gKm" customClass="ComponentProgressCircle" customModule="WComponentLibrary" customModuleProvider="target">
-                                <rect key="frame" x="20" y="18" width="20" height="20"/>
+                            <customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="pIx-Dk-gKm" customClass="ComponentProgressCircle" customModule="KMComponentLibrary" customModuleProvider="target">
+                                <rect key="frame" x="20" y="20" width="20" height="20"/>
                                 <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
                             </customView>
                             <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="br8-uy-Vsj">
-                                <rect key="frame" x="20" y="10" width="20" height="20"/>
+                                <rect key="frame" x="20" y="12" width="20" height="20"/>
                                 <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                 <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="message_Info" id="dtu-D4-yXT"/>
                             </imageView>
                             <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="2sR-Z1-YSJ">
-                                <rect key="frame" x="50" y="10" width="37" height="16"/>
+                                <rect key="frame" x="50" y="12" width="37" height="16"/>
                                 <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                 <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="p6c-Xe-Hew">
                                     <font key="font" metaFont="system"/>

+ 2 - 0
PDF Office/PDF Master/Class/URLManager/KMURLConfigManager.swift

@@ -7,6 +7,8 @@
 
 import Foundation
 
+
+
 let APPMain_Link = NSLocalizedString("https://www.pdfreaderpro.com", comment: "")
 
 //跳转Store界面

+ 60 - 15
PDF Office/PDF Master/KMClass/KMPDFViewController/KMMainViewController.swift

@@ -61,6 +61,7 @@ import KMComponentLibrary
     
     //水印
     var watermarkViewController: KMWatermarkController?
+    var watermarkToolbarView: KMWatermarkToolbarView?
     
     //左边
     var botaViewController: KMNLeftSideViewController?
@@ -403,22 +404,22 @@ import KMComponentLibrary
     func refreshToolbarView() {
         
         let _manager = viewManager
-        
-        if _manager.toolMode == .Markup ||
-            _manager.toolMode == .Edit ||
-            _manager.toolMode == .Form ||
-            _manager.toolMode == .Fill ||
-            _manager.toolMode == .Convert ||
-            _manager.toolMode == .Protect ||
-            _manager.toolMode == .Tools {
+       
+        if _manager.isPageEditMode {
+            toolbarBoxHeightConst.constant = 80
+        } else if _manager.isWatermarkMode {
+            toolbarBoxHeightConst.constant = 40
+        } else if _manager.toolMode == .Markup ||
+                    _manager.toolMode == .Edit ||
+                    _manager.toolMode == .Form ||
+                    _manager.toolMode == .Fill ||
+                    _manager.toolMode == .Convert ||
+                    _manager.toolMode == .Protect ||
+                    _manager.toolMode == .Tools {
             
             toolbarBoxHeightConst.constant = 80
         } else {
-            if _manager.isPageEditMode {
-                toolbarBoxHeightConst.constant = 80
-            } else {
-                toolbarBoxHeightConst.constant = 40
-            }
+            toolbarBoxHeightConst.constant = 40
         }
         
     }
@@ -744,13 +745,30 @@ import KMComponentLibrary
     func showWatermarkController() {
         listView.isHidden = true
         
+        viewManager.isWatermarkMode = true
+        
+       if watermarkToolbarView == nil {
+           watermarkToolbarView = KMWatermarkToolbarView()
+       }
+       watermarkToolbarView?.frame = toolbarBox.bounds
+       if KMWatermarkManager.defaultManager.watermarks.count == 0 {
+           watermarkToolbarView?.watermarkMode = .AddWatermark
+       } else {
+           watermarkToolbarView?.watermarkMode = .Template
+       }
+       watermarkToolbarView?.delegate = self
+       watermarkToolbarView?.autoresizingMask = [.width, .height]
+       toolbarBox.contentView = watermarkToolbarView
+       
         if watermarkViewController == nil {
             watermarkViewController = KMWatermarkController.init()
         }
         watermarkViewController?.view.frame = CGRectMake(44, 0, CGRectGetWidth(bottomContendBox.frame)-44, CGRectGetHeight(bottomContendBox.frame))
         watermarkViewController?.view.autoresizingMask = [.maxXMargin, .width, .height]
         bottomContendBox.addSubview(watermarkViewController!.view)
-        
+         
+        watermarkViewController?.watermarkMode = watermarkToolbarView?.watermarkMode ?? .Template
+         
         updateWatermarkDocument()
     }
     
@@ -767,11 +785,17 @@ import KMComponentLibrary
     }
     
     func exitWatermarkController() {
-        listView.isHidden = true
+        listView.isHidden = false
+        viewManager.isWatermarkMode = false
+        
+        watermarkToolbarView?.removeFromSuperview()
+        watermarkToolbarView = nil
         
         watermarkViewController?.view.removeFromSuperview()
         watermarkViewController = nil
         
+        refreshToolbarView()
+        toolbarBox.contentView = pdfToolbarController?.view
     }
     
 }
@@ -1219,6 +1243,27 @@ extension KMMainViewController: KMSplitPDFViewControllerDelegate {
     }
 }
 
+//MARK: - KMWatermarkToolbarViewDelegate 水印相关代理
+
+extension KMMainViewController: KMWatermarkToolbarViewDelegate {
+    func kmWatermarkToolbarViewDidUpdateMode(_ view: KMWatermarkToolbarView) {
+        watermarkViewController?.watermarkMode = watermarkToolbarView?.watermarkMode ?? .Template
+
+    }
+    
+    func kmWatermarkToolbarViewDidChooseBatch(_ view: KMWatermarkToolbarView) {
+        
+    }
+    
+    func kmWatermarkToolbarViewDidChooseApply(_ view: KMWatermarkToolbarView) {
+        
+    }
+    
+    func kmWatermarkToolbarViewDidChooseExit(_ view: KMWatermarkToolbarView) {
+        exitWatermarkController()
+    }
+}
+
 //MARK: - CPDFViewDelegate PDFView代理
 
 extension KMMainViewController: CPDFViewDelegate,CPDFListViewDelegate {

+ 3 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/KMPDFViewManager.swift

@@ -24,6 +24,9 @@ class KMPDFViewManager: NSObject {
     
     var isPDFReadMode: Bool = false //阅读模式
     
+    var isWatermarkMode: Bool = false
+    
+    
     //分屏PDF
     var splitPDFFileURL: URL?
     var splitPDFFilePassword: String?

+ 57 - 7
PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/KMWatermarkController.swift

@@ -6,6 +6,14 @@
 //
 
 import Cocoa
+import KMComponentLibrary
+
+//工具类型
+@objc public enum KMWaterMarkModeType: Int, CaseIterable {
+    case Template = 0
+    case AddWatermark
+    case EditWatermark
+}
 
 class KMWatermarkController: NSViewController {
 
@@ -18,8 +26,17 @@ class KMWatermarkController: NSViewController {
     var propertyController: KMNWatermarkPropertyController = KMNWatermarkPropertyController.init()
     var templatesController: KMNWatermarkTemplateController = KMNWatermarkTemplateController()
     
+    var saveTemplateMessage: ComponentMessage = ComponentMessage()
+    
     var pdfDocument: CPDFDocument?
 
+    public var watermarkMode: KMWaterMarkModeType = .AddWatermark {
+        didSet {
+            resetUI()
+        }
+    }
+    
+    //MARK: - func
     override func viewDidLoad() {
         super.viewDidLoad()
         // Do view setup here.
@@ -30,10 +47,38 @@ class KMWatermarkController: NSViewController {
         
         propertyController.view.frame = propertyInfoView.bounds
         propertyController.view.autoresizingMask = [.width, .height]
-        propertyInfoView.addSubview(propertyController.view)
         propertyController.delegate = self
+        propertyController.view.isHidden = true
+        propertyInfoView.addSubview(propertyController.view)
         
+        templatesController.view.frame = propertyInfoView.bounds
+        templatesController.view.autoresizingMask = [.width, .height]
         templatesController.delegate = self
+        templatesController.view.isHidden = true
+        propertyInfoView.addSubview(templatesController.view)
+
+        setupProperty()
+    }
+    
+    func setupProperty() {
+        saveTemplateMessage.properties = ComponentMessageProperty(messageType: .success, title: KMLocalizedString("Saved Template"))
+        
+        
+    }
+    
+    func resetUI() {
+        propertyController.view.isHidden = true
+        templatesController.view.isHidden = true
+        
+        if watermarkMode == .Template {
+            templatesController.view.isHidden = false
+            
+        } else if watermarkMode == .AddWatermark {
+            propertyController.view.isHidden = false
+            
+        } else if watermarkMode == .EditWatermark {
+            
+        }
     }
  
     
@@ -90,12 +135,17 @@ extension KMWatermarkController: KMNWatermarkPropertyControllerDelegate {
     }
     
     func watermarkPropertyControllerDidChangetoTemplate(_ controller: KMNWatermarkPropertyController) {
-        propertyController.view.isHidden = true
-        
-        templatesController.view.frame = propertyInfoView.bounds
-        templatesController.view.autoresizingMask = [.width, .height]
-        propertyInfoView.addSubview(templatesController.view)
-
+       
+    }
+    
+    func watermarkPropertyControllerSaveTemplateSuccess(_ controller: KMNWatermarkPropertyController) {
+        saveTemplateMessage.frame = CGRectMake((CGRectGetWidth(self.view.frame) - saveTemplateMessage.properties.propertyInfo.viewWidth)/2,
+                                               CGRectGetHeight(self.view.frame) - saveTemplateMessage.properties.propertyInfo.viewHeight - 8,
+                                               saveTemplateMessage.properties.propertyInfo.viewWidth,
+                                               saveTemplateMessage.properties.propertyInfo.viewHeight)
+        saveTemplateMessage.reloadData()
+        
+        saveTemplateMessage.show(inView: self.view, autoHideSeconde: 2)
     }
     
 }

+ 16 - 1
PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/KMNWatermarkPropertyController.swift

@@ -10,10 +10,15 @@ import KMComponentLibrary
 
 @objc protocol KMNWatermarkPropertyControllerDelegate: AnyObject {
     
+    //水印数据有更新
     @objc optional func watermarkPropertyControllerDidUpdate(_ controller: KMNWatermarkPropertyController)
     
+    //切换到模板界面
     @objc optional func watermarkPropertyControllerDidChangetoTemplate(_ controller: KMNWatermarkPropertyController)
  
+    //成功保存到模板
+    @objc optional func watermarkPropertyControllerSaveTemplateSuccess(_ controller: KMNWatermarkPropertyController)
+
 }
 
 class KMNWatermarkPropertyController: NSViewController {
@@ -376,7 +381,17 @@ class KMNWatermarkPropertyController: NSViewController {
     }
     
     @objc func saveButtonClicked(_ sender: ComponentButton) {
-        KMWatermarkManager.defaultManager.addWatermark(watermark: watermarkModel)
+        let saveWindow: KMWatermarkSaveWindow = KMWatermarkSaveWindow(windowNibName: "KMWatermarkSaveWindow")
+        saveWindow.saveHandler = {[weak self] string in
+            guard let weakSelf = self else { return }
+            
+            weakSelf.delegate?.watermarkPropertyControllerSaveTemplateSuccess?(weakSelf)
+        }
+        saveWindow.own_beginSheetModal(for: view.window) { string in
+        
+        }
+        
+//        KMWatermarkManager.defaultManager.addWatermark(watermark: watermarkModel)
     }
     
 }

+ 121 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/KMWatermarkSaveWindow.swift

@@ -0,0 +1,121 @@
+//
+//  KMWatermarkSaveWindow.swift
+//  PDF Reader Pro
+//
+//  Created by Niehaoyu on 2024/11/5.
+//
+
+import Cocoa
+import KMComponentLibrary
+
+class KMWatermarkSaveWindow: KMNBaseWindowController {
+
+    @IBOutlet var contendView: NSView!
+    
+    @IBOutlet var titleLabel: NSTextField!
+    @IBOutlet var nameLabel: NSTextField!
+    @IBOutlet var nameInputView: ComponentInput!
+    @IBOutlet var cancelButton: ComponentButton!
+    @IBOutlet var saveButton: ComponentButton!
+    
+    public var saveHandler: ((String?) -> Void)!
+    
+    public var nameValue: String = "" {
+        didSet {
+            reloadData()
+        }
+    }
+    
+    override func windowDidLoad() {
+        super.windowDidLoad()
+
+        // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
+        
+        setupProperty()
+        
+    }
+    
+    override func beginSheetFinish() {
+        super.beginSheetFinish()
+        
+        window?.makeFirstResponder(nil)
+        
+        nameInputView.beginEditing()
+        
+    }
+    
+    func setupProperty() {
+        
+        contendView.wantsLayer = true
+        contendView.layer?.backgroundColor = ComponentLibrary.shared.getComponentColorFromKey("colorBg/popup").cgColor
+        
+        titleLabel.stringValue = KMLocalizedString("Add Watermark")
+        titleLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/1")
+        titleLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-m-medium")
+        
+        nameLabel.stringValue = KMLocalizedString("Name:")
+        nameLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("comp-field/colorText-filled-nor")
+        nameLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-m-regular")
+        
+        nameInputView.properties = ComponentInputProperty(size: .m,
+                                                          state:.normal,
+                                                          showClear: true,
+                                                          placeholder: "",
+                                                          text: "")
+        nameInputView.delegate = self
+        
+        cancelButton.properties = ComponentButtonProperty(type: .default_tertiary, size: .s, buttonText: KMLocalizedString("Cancel"), keepPressState: false)
+        cancelButton.setTarget(self, action: #selector(buttonClicked(_:)))
+        
+        saveButton.properties = ComponentButtonProperty(type: .primary, size: .s, buttonText: KMLocalizedString("Save"), keepPressState: false)
+        saveButton.setTarget(self, action: #selector(buttonClicked(_:)))
+        
+    }
+    
+    func reloadData() {
+        nameInputView.properties.text = nameValue
+        nameInputView.reloadData()
+        
+        if nameValue.isEmpty == true {
+            saveButton.properties.isDisabled = true
+        } else {
+            saveButton.properties.isDisabled = false
+        }
+        saveButton.reloadData()
+        
+    }
+    
+    //MARK: - action
+    @objc func buttonClicked(_ sender: ComponentButton) {
+        if sender == saveButton {
+            guard let callback = self.saveHandler else {
+                return
+            }
+            callback(nameInputView.properties.text)
+        }
+        self.own_closeEndSheet()
+    }
+    
+    //MARK: - MouseEvent
+    override func mouseDown(with event: NSEvent) {
+        super.mouseDown(with: event)
+        
+        window?.makeFirstResponder(nil)
+    }
+    
+}
+
+//MARK: - ComponentInputDelegate
+extension KMWatermarkSaveWindow: ComponentInputDelegate {
+    func componentInputDidChanged(inputView: ComponentInput) {
+        nameValue = inputView.properties.text
+        
+        reloadData()
+    }
+    
+    func componentInputDidEndEditing(inputView: ComponentInput) {
+        nameValue = inputView.properties.text
+        
+        reloadData()
+    }
+}

+ 121 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/KMWatermarkSaveWindow.xib

@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="22505" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22505"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMWatermarkSaveWindow" customModule="PDF_Reader_Pro" customModuleProvider="target">
+            <connections>
+                <outlet property="cancelButton" destination="OPU-EO-sdo" id="nul-IA-vG1"/>
+                <outlet property="contendView" destination="otd-xZ-CaL" id="PlH-bP-npz"/>
+                <outlet property="nameInputView" destination="Pqf-eZ-r7Z" id="rpQ-fB-KkF"/>
+                <outlet property="nameLabel" destination="wqv-2r-v7q" id="goQ-fr-QeP"/>
+                <outlet property="saveButton" destination="F6w-bk-eru" id="YES-Ce-vrd"/>
+                <outlet property="titleLabel" destination="D5l-2l-Hye" id="djf-7h-bbr"/>
+                <outlet property="window" destination="F0z-JX-Cv5" id="gIp-Ho-8D9"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" titlebarAppearsTransparent="YES" titleVisibility="hidden" id="F0z-JX-Cv5">
+            <windowStyleMask key="styleMask" titled="YES" fullSizeContentView="YES"/>
+            <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
+            <rect key="contentRect" x="196" y="240" width="480" height="164"/>
+            <rect key="screenRect" x="0.0" y="0.0" width="1920" height="1055"/>
+            <view key="contentView" id="se5-gp-TjO">
+                <rect key="frame" x="0.0" y="0.0" width="480" height="164"/>
+                <autoresizingMask key="autoresizingMask"/>
+                <subviews>
+                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="otd-xZ-CaL">
+                        <rect key="frame" x="0.0" y="0.0" width="480" height="164"/>
+                        <subviews>
+                            <customView translatesAutoresizingMaskIntoConstraints="NO" id="Ch5-gH-uU8">
+                                <rect key="frame" x="0.0" y="124" width="480" height="40"/>
+                                <subviews>
+                                    <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="D5l-2l-Hye">
+                                        <rect key="frame" x="22" y="8" width="110" height="16"/>
+                                        <textFieldCell key="cell" lineBreakMode="clipping" title="Save as Template" id="HfM-c9-dig">
+                                            <font key="font" usesAppearanceFont="YES"/>
+                                            <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                            <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                        </textFieldCell>
+                                    </textField>
+                                </subviews>
+                                <constraints>
+                                    <constraint firstItem="D5l-2l-Hye" firstAttribute="leading" secondItem="Ch5-gH-uU8" secondAttribute="leading" constant="24" id="FCM-LV-LEj"/>
+                                    <constraint firstAttribute="height" constant="40" id="LZi-1n-oAw"/>
+                                    <constraint firstItem="D5l-2l-Hye" firstAttribute="top" secondItem="Ch5-gH-uU8" secondAttribute="top" constant="16" id="Vhm-fC-UhK"/>
+                                </constraints>
+                            </customView>
+                            <customView translatesAutoresizingMaskIntoConstraints="NO" id="bi9-5r-WLN">
+                                <rect key="frame" x="0.0" y="68" width="480" height="56"/>
+                                <subviews>
+                                    <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="wqv-2r-v7q">
+                                        <rect key="frame" x="22" y="20" width="44" height="16"/>
+                                        <textFieldCell key="cell" lineBreakMode="clipping" title="Name:" id="lgt-n8-HTk">
+                                            <font key="font" usesAppearanceFont="YES"/>
+                                            <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                            <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                        </textFieldCell>
+                                    </textField>
+                                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="Pqf-eZ-r7Z" customClass="ComponentInput" customModule="KMComponentLibrary">
+                                        <rect key="frame" x="72" y="8" width="381" height="40"/>
+                                        <constraints>
+                                            <constraint firstAttribute="height" constant="40" id="DyX-FS-Pws"/>
+                                            <constraint firstAttribute="width" constant="381" id="sTs-e1-AeA"/>
+                                        </constraints>
+                                    </customView>
+                                </subviews>
+                                <constraints>
+                                    <constraint firstItem="wqv-2r-v7q" firstAttribute="centerY" secondItem="bi9-5r-WLN" secondAttribute="centerY" id="Sly-jQ-q8x"/>
+                                    <constraint firstItem="Pqf-eZ-r7Z" firstAttribute="centerY" secondItem="bi9-5r-WLN" secondAttribute="centerY" id="cAt-kr-yp1"/>
+                                    <constraint firstAttribute="height" constant="56" id="cNX-ML-cZq"/>
+                                    <constraint firstItem="Pqf-eZ-r7Z" firstAttribute="leading" secondItem="wqv-2r-v7q" secondAttribute="trailing" constant="8" id="dZE-kH-HeQ"/>
+                                    <constraint firstItem="wqv-2r-v7q" firstAttribute="leading" secondItem="bi9-5r-WLN" secondAttribute="leading" constant="24" id="xBG-u0-4tz"/>
+                                </constraints>
+                            </customView>
+                            <customView translatesAutoresizingMaskIntoConstraints="NO" id="OPU-EO-sdo" customClass="ComponentButton" customModule="KMComponentLibrary">
+                                <rect key="frame" x="322" y="20" width="70" height="32"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="32" id="5d6-eC-pGA"/>
+                                    <constraint firstAttribute="width" constant="70" id="oUK-vs-hGm"/>
+                                </constraints>
+                            </customView>
+                            <customView translatesAutoresizingMaskIntoConstraints="NO" id="F6w-bk-eru" customClass="ComponentButton" customModule="KMComponentLibrary">
+                                <rect key="frame" x="400" y="20" width="56" height="32"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" constant="56" id="boR-JL-2nr"/>
+                                    <constraint firstAttribute="height" constant="32" id="rW4-4q-4Hq"/>
+                                </constraints>
+                            </customView>
+                        </subviews>
+                        <constraints>
+                            <constraint firstItem="Ch5-gH-uU8" firstAttribute="top" secondItem="otd-xZ-CaL" secondAttribute="top" id="02H-Ex-v3e"/>
+                            <constraint firstAttribute="trailing" secondItem="F6w-bk-eru" secondAttribute="trailing" constant="24" id="5ho-MV-ujw"/>
+                            <constraint firstItem="Ch5-gH-uU8" firstAttribute="leading" secondItem="otd-xZ-CaL" secondAttribute="leading" id="5km-21-z3m"/>
+                            <constraint firstItem="OPU-EO-sdo" firstAttribute="top" secondItem="bi9-5r-WLN" secondAttribute="bottom" constant="16" id="8cS-fK-zMC"/>
+                            <constraint firstItem="F6w-bk-eru" firstAttribute="leading" secondItem="OPU-EO-sdo" secondAttribute="trailing" constant="8" id="Ia6-d4-C8a"/>
+                            <constraint firstAttribute="trailing" secondItem="bi9-5r-WLN" secondAttribute="trailing" id="L8E-kr-85C"/>
+                            <constraint firstAttribute="trailing" secondItem="Ch5-gH-uU8" secondAttribute="trailing" id="M2c-7J-3eF"/>
+                            <constraint firstItem="bi9-5r-WLN" firstAttribute="leading" secondItem="otd-xZ-CaL" secondAttribute="leading" id="Wi6-7b-1P3"/>
+                            <constraint firstItem="F6w-bk-eru" firstAttribute="top" secondItem="bi9-5r-WLN" secondAttribute="bottom" constant="16" id="cfk-Eq-xgT"/>
+                            <constraint firstItem="bi9-5r-WLN" firstAttribute="top" secondItem="Ch5-gH-uU8" secondAttribute="bottom" id="f0L-4Y-VwC"/>
+                        </constraints>
+                    </customView>
+                </subviews>
+                <constraints>
+                    <constraint firstItem="otd-xZ-CaL" firstAttribute="top" secondItem="se5-gp-TjO" secondAttribute="top" id="8hU-94-k3x"/>
+                    <constraint firstAttribute="trailing" secondItem="otd-xZ-CaL" secondAttribute="trailing" id="HMa-np-wwi"/>
+                    <constraint firstItem="otd-xZ-CaL" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" id="ncr-eb-3U0"/>
+                    <constraint firstAttribute="bottom" secondItem="otd-xZ-CaL" secondAttribute="bottom" id="zWU-4W-3eb"/>
+                </constraints>
+            </view>
+            <connections>
+                <outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
+            </connections>
+            <point key="canvasLocation" x="99" y="125"/>
+        </window>
+    </objects>
+</document>

+ 0 - 49
PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/KMWatermarkToolbar.swift

@@ -1,49 +0,0 @@
-//
-//  KMWatermarkToolbar.swift
-//  PDF Reader Pro
-//
-//  Created by Niehaoyu on 2024/11/5.
-//
-
-import Cocoa
-import KMComponentLibrary
-
-class KMWatermarkToolbar: NSViewController {
-
-    @IBOutlet var contendView: NSView!
-    
-    @IBOutlet var titleLabel: NSTextField!
-    @IBOutlet var pageSelectView: ComponentSelect!
-    @IBOutlet var sepDivider: ComponentDivider!
-    @IBOutlet var templateButton: ComponentButton!
-    @IBOutlet var addButton: ComponentButton!
-    @IBOutlet var batchButton: ComponentButton!
-    
-    @IBOutlet var applyButton: ComponentButton!
-    @IBOutlet var exitButton: ComponentButton!
-    
-    override func viewDidLoad() {
-        super.viewDidLoad()
-        // Do view setup here.
-        
-        setupProperty()
-    }
-    
-    func setupProperty() {
-        titleLabel.stringValue = KMLocalizedString("Add Watermark")
-        titleLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/1")
-        titleLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-m-medium")
-        
-        templateButton.properties = ComponentButtonProperty(type: .text_gray_opacity, size: .xs, showLeftIcon: true, buttonText: KMLocalizedString("Templates"), icon: NSImage(named: "icon_wm_template"))
-        
-        addButton.properties = ComponentButtonProperty(type: .text_gray_opacity, size: .xs, showLeftIcon: true, buttonText: KMLocalizedString("Add Watermark"), icon: NSImage(named: "toolbar_plus"))
-        
-        batchButton.properties = ComponentButtonProperty(type: .text_gray_opacity, size: .xs, showLeftIcon: true, buttonText: KMLocalizedString("Batch"), icon: NSImage(named: "tools_batch"), keepPressState: false)
-        
-        applyButton.properties = ComponentButtonProperty(type: .primary, size: .xs, buttonText: KMLocalizedString("Apply"), keepPressState: false)
-        
-        exitButton.properties = ComponentButtonProperty(type: .default_tertiary, size: .xs, buttonText: KMLocalizedString("Exit"), keepPressState: false)
-        
-    }
-    
-}

+ 0 - 130
PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/KMWatermarkToolbar.xib

@@ -1,130 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="22505" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
-    <dependencies>
-        <deployment identifier="macosx"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22505"/>
-        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
-    </dependencies>
-    <objects>
-        <customObject id="-2" userLabel="File's Owner" customClass="KMWatermarkToolbar" customModule="PDF_Reader_Pro" customModuleProvider="target">
-            <connections>
-                <outlet property="addButton" destination="zB0-WI-wRM" id="nLU-hb-OGg"/>
-                <outlet property="applyButton" destination="nhn-br-DcX" id="Jxl-eC-byl"/>
-                <outlet property="batchButton" destination="crt-PJ-kqP" id="onL-Rc-f2m"/>
-                <outlet property="contendView" destination="nwS-qg-oX3" id="u8n-nS-qnM"/>
-                <outlet property="exitButton" destination="PNU-U6-9TC" id="xBC-GQ-Ueh"/>
-                <outlet property="pageSelectView" destination="8Ba-BS-FWr" id="Lxb-jr-xlP"/>
-                <outlet property="sepDivider" destination="q3T-4u-jHu" id="UYs-kX-cFn"/>
-                <outlet property="templateButton" destination="p4t-zA-6cC" id="0gm-j3-wgA"/>
-                <outlet property="titleLabel" destination="w8E-ki-8er" id="gsk-bG-M5P"/>
-                <outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
-            </connections>
-        </customObject>
-        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
-        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
-        <customView id="Hz6-mo-xeY">
-            <rect key="frame" x="0.0" y="0.0" width="1071" height="28"/>
-            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
-            <subviews>
-                <customView translatesAutoresizingMaskIntoConstraints="NO" id="nwS-qg-oX3">
-                    <rect key="frame" x="0.0" y="0.0" width="1071" height="28"/>
-                    <subviews>
-                        <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="w8E-ki-8er">
-                            <rect key="frame" x="14" y="6" width="37" height="16"/>
-                            <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="xTC-es-R8r">
-                                <font key="font" usesAppearanceFont="YES"/>
-                                <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
-                                <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
-                            </textFieldCell>
-                        </textField>
-                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="gMY-5j-MQM">
-                            <rect key="frame" x="276" y="0.0" width="520" height="28"/>
-                            <subviews>
-                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="8Ba-BS-FWr" customClass="ComponentSelect" customModule="KMComponentLibrary">
-                                    <rect key="frame" x="0.0" y="0.0" width="144" height="28"/>
-                                    <constraints>
-                                        <constraint firstAttribute="width" constant="144" id="270-Gl-tKg"/>
-                                        <constraint firstAttribute="height" constant="28" id="hli-m8-PhO"/>
-                                    </constraints>
-                                </customView>
-                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="q3T-4u-jHu" customClass="ComponentDivider" customModule="KMComponentLibrary">
-                                    <rect key="frame" x="156" y="6" width="1" height="16"/>
-                                    <constraints>
-                                        <constraint firstAttribute="height" constant="16" id="7i9-Dg-glP"/>
-                                        <constraint firstAttribute="width" constant="1" id="Tjh-gJ-SBp"/>
-                                    </constraints>
-                                </customView>
-                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="p4t-zA-6cC" customClass="ComponentButton" customModule="KMComponentLibrary">
-                                    <rect key="frame" x="168" y="0.0" width="108" height="28"/>
-                                    <constraints>
-                                        <constraint firstAttribute="width" constant="108" id="AVx-nG-fSZ"/>
-                                        <constraint firstAttribute="height" constant="28" id="F2Q-aY-U4q"/>
-                                    </constraints>
-                                </customView>
-                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="zB0-WI-wRM" customClass="ComponentButton" customModule="KMComponentLibrary">
-                                    <rect key="frame" x="288" y="0.0" width="143" height="28"/>
-                                    <constraints>
-                                        <constraint firstAttribute="width" constant="143" id="3ga-l3-uIg"/>
-                                        <constraint firstAttribute="height" constant="28" id="cty-xN-dwd"/>
-                                    </constraints>
-                                </customView>
-                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="crt-PJ-kqP" customClass="ComponentButton" customModule="KMComponentLibrary">
-                                    <rect key="frame" x="443" y="0.0" width="78" height="28"/>
-                                    <constraints>
-                                        <constraint firstAttribute="width" constant="78" id="4Qp-2p-1rg"/>
-                                        <constraint firstAttribute="height" constant="28" id="JUl-1s-ccl"/>
-                                    </constraints>
-                                </customView>
-                            </subviews>
-                            <constraints>
-                                <constraint firstItem="q3T-4u-jHu" firstAttribute="leading" secondItem="8Ba-BS-FWr" secondAttribute="trailing" constant="12" id="034-vd-9Vb"/>
-                                <constraint firstItem="8Ba-BS-FWr" firstAttribute="leading" secondItem="gMY-5j-MQM" secondAttribute="leading" id="3T3-9M-9sG"/>
-                                <constraint firstItem="8Ba-BS-FWr" firstAttribute="centerY" secondItem="gMY-5j-MQM" secondAttribute="centerY" id="56R-0X-gxA"/>
-                                <constraint firstItem="p4t-zA-6cC" firstAttribute="leading" secondItem="8Ba-BS-FWr" secondAttribute="trailing" constant="24" id="C7z-go-ZUn"/>
-                                <constraint firstItem="zB0-WI-wRM" firstAttribute="centerY" secondItem="gMY-5j-MQM" secondAttribute="centerY" id="Jkx-jb-ScA"/>
-                                <constraint firstItem="crt-PJ-kqP" firstAttribute="leading" secondItem="zB0-WI-wRM" secondAttribute="trailing" constant="12" id="Vz7-Hm-ryi"/>
-                                <constraint firstItem="zB0-WI-wRM" firstAttribute="leading" secondItem="p4t-zA-6cC" secondAttribute="trailing" constant="12" id="WgN-eW-LuZ"/>
-                                <constraint firstAttribute="width" constant="520" id="fi7-hE-SrT"/>
-                                <constraint firstItem="crt-PJ-kqP" firstAttribute="centerY" secondItem="gMY-5j-MQM" secondAttribute="centerY" id="hgP-8r-WKM"/>
-                                <constraint firstItem="p4t-zA-6cC" firstAttribute="centerY" secondItem="gMY-5j-MQM" secondAttribute="centerY" id="nMN-M4-A7L"/>
-                                <constraint firstItem="q3T-4u-jHu" firstAttribute="centerY" secondItem="gMY-5j-MQM" secondAttribute="centerY" id="zhq-4V-cEK"/>
-                            </constraints>
-                        </customView>
-                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="nhn-br-DcX" customClass="ComponentButton" customModule="KMComponentLibrary">
-                            <rect key="frame" x="863" y="0.0" width="92" height="28"/>
-                            <constraints>
-                                <constraint firstAttribute="width" constant="92" id="OXT-xa-KmN"/>
-                                <constraint firstAttribute="height" constant="28" id="aw8-ix-w9m"/>
-                            </constraints>
-                        </customView>
-                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="PNU-U6-9TC" customClass="ComponentButton" customModule="KMComponentLibrary">
-                            <rect key="frame" x="963" y="0.0" width="92" height="28"/>
-                            <constraints>
-                                <constraint firstAttribute="width" constant="92" id="Fu5-XY-e1c"/>
-                                <constraint firstAttribute="height" constant="28" id="jv0-Sn-Rpk"/>
-                            </constraints>
-                        </customView>
-                    </subviews>
-                    <constraints>
-                        <constraint firstItem="PNU-U6-9TC" firstAttribute="centerY" secondItem="nwS-qg-oX3" secondAttribute="centerY" id="9mN-th-de4"/>
-                        <constraint firstAttribute="trailing" secondItem="PNU-U6-9TC" secondAttribute="trailing" constant="16" id="DEh-MU-g80"/>
-                        <constraint firstItem="gMY-5j-MQM" firstAttribute="centerX" secondItem="nwS-qg-oX3" secondAttribute="centerX" id="N68-xO-hfG"/>
-                        <constraint firstItem="nhn-br-DcX" firstAttribute="centerY" secondItem="nwS-qg-oX3" secondAttribute="centerY" id="Puq-68-jHs"/>
-                        <constraint firstItem="w8E-ki-8er" firstAttribute="centerY" secondItem="nwS-qg-oX3" secondAttribute="centerY" id="grp-PP-D25"/>
-                        <constraint firstItem="PNU-U6-9TC" firstAttribute="leading" secondItem="nhn-br-DcX" secondAttribute="trailing" constant="8" id="hur-3w-VBy"/>
-                        <constraint firstItem="w8E-ki-8er" firstAttribute="leading" secondItem="nwS-qg-oX3" secondAttribute="leading" constant="16" id="lNF-hl-ovF"/>
-                        <constraint firstItem="gMY-5j-MQM" firstAttribute="top" secondItem="nwS-qg-oX3" secondAttribute="top" id="mOw-uh-wjZ"/>
-                        <constraint firstAttribute="bottom" secondItem="gMY-5j-MQM" secondAttribute="bottom" id="yeR-L4-nVQ"/>
-                    </constraints>
-                </customView>
-            </subviews>
-            <constraints>
-                <constraint firstItem="nwS-qg-oX3" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" id="JYk-LM-JQj"/>
-                <constraint firstAttribute="bottom" secondItem="nwS-qg-oX3" secondAttribute="bottom" id="qEX-jx-sJj"/>
-                <constraint firstAttribute="trailing" secondItem="nwS-qg-oX3" secondAttribute="trailing" id="trc-0r-lyj"/>
-                <constraint firstItem="nwS-qg-oX3" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" id="v0e-2U-EUI"/>
-            </constraints>
-            <point key="canvasLocation" x="302.5" y="8"/>
-        </customView>
-    </objects>
-</document>

+ 137 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/KMWatermarkToolbarView.swift

@@ -0,0 +1,137 @@
+//
+//  KMWatermarkToolbarView.swift
+//  PDF Reader Pro
+//
+//  Created by Niehaoyu on 2024/11/5.
+//
+
+import Cocoa
+import KMComponentLibrary
+
+@objc protocol KMWatermarkToolbarViewDelegate: AnyObject {
+    
+    @objc optional func kmWatermarkToolbarViewDidUpdateMode(_ view: KMWatermarkToolbarView)
+    
+    @objc optional func kmWatermarkToolbarViewDidChooseBatch(_ view: KMWatermarkToolbarView)
+    
+    @objc optional func kmWatermarkToolbarViewDidChooseApply(_ view: KMWatermarkToolbarView)
+    
+    @objc optional func kmWatermarkToolbarViewDidChooseExit(_ view: KMWatermarkToolbarView)
+ 
+}
+
+class KMWatermarkToolbarView: BaseXibView {
+    
+    @IBOutlet var contendView: NSView!
+    
+    @IBOutlet var titleLabel: NSTextField!
+    @IBOutlet var pageSelectView: ComponentSelect!
+    @IBOutlet var sepDivider: ComponentDivider!
+    @IBOutlet var templateButton: ComponentButton!
+    @IBOutlet var addButton: ComponentButton!
+    @IBOutlet var batchButton: ComponentButton!
+    
+    @IBOutlet var applyButton: ComponentButton!
+    @IBOutlet var exitButton: ComponentButton!
+    
+    @IBOutlet var templateButtonWidthConst: NSLayoutConstraint!
+    @IBOutlet var addButtonWidthConst: NSLayoutConstraint!
+    @IBOutlet var batchButtonWidthConst: NSLayoutConstraint!
+    
+    weak open var delegate: KMWatermarkToolbarViewDelegate?
+
+    public var watermarkMode: KMWaterMarkModeType = .AddWatermark {
+        didSet {
+            reloadData()
+        }
+    }
+    
+    //MARK: - func
+    public override func draw(_ dirtyRect: NSRect) {
+        super.draw(dirtyRect)
+        
+        // Drawing code here.
+    }
+    
+    public required init?(coder decoder: NSCoder) {
+        super.init(coder: decoder)
+        
+    }
+    
+    override init(frame frameRect: NSRect) {
+        super.init(frame: frameRect)
+    }
+    
+    public override func awakeFromNib() {
+        super.awakeFromNib()
+        
+        self.setupProperty()
+    }
+    
+    func setupProperty() {
+        contendView.wantsLayer = true
+        contendView.layer?.backgroundColor = ComponentLibrary.shared.getComponentColorFromKey("colorBg/layout-middle").cgColor
+        
+        titleLabel.stringValue = KMLocalizedString("Add Watermark")
+        titleLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/1")
+        titleLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-m-medium")
+        
+        pageSelectView.properties = ComponentSelectProperties(size: .s,
+                                                              state: .normal,
+                                                              placeholder: nil,
+                                                              errorText: nil,
+                                                              creatable: true,
+                                                              text: KMLocalizedString("All Pages"))
+        
+        sepDivider.properties = ComponentDividerProperty(type: .vertical, dash: false)
+        
+        templateButton.properties = ComponentButtonProperty(type: .text_gray_opacity, size: .xs, showLeftIcon: true, buttonText: KMLocalizedString("Templates"), icon: NSImage(named: "icon_wm_template"))
+        templateButtonWidthConst.constant = templateButton.properties.propertyInfo.viewWidth
+        templateButton.setTarget(self, action: #selector(buttonClicked(_:)))
+        
+        addButton.properties = ComponentButtonProperty(type: .text_gray_opacity, size: .xs, showLeftIcon: true, buttonText: KMLocalizedString("Add Watermark"), icon: NSImage(named: "toolbar_plus"))
+        addButtonWidthConst.constant = addButton.properties.propertyInfo.viewWidth
+        addButton.setTarget(self, action: #selector(buttonClicked(_:)))
+        
+        batchButton.properties = ComponentButtonProperty(type: .text_gray_opacity, size: .xs, showLeftIcon: true, buttonText: KMLocalizedString("Batch"), icon: NSImage(named: "tools_batch"), keepPressState: false)
+        batchButtonWidthConst.constant = batchButton.properties.propertyInfo.viewWidth
+        batchButton.setTarget(self, action: #selector(buttonClicked(_:)))
+        
+        applyButton.properties = ComponentButtonProperty(type: .primary, size: .xs, buttonText: KMLocalizedString("Apply"), keepPressState: false)
+        applyButton.setTarget(self, action: #selector(buttonClicked(_:)))
+        
+        exitButton.properties = ComponentButtonProperty(type: .default_tertiary, size: .xs, buttonText: KMLocalizedString("Exit"), keepPressState: false)
+        exitButton.setTarget(self, action: #selector(buttonClicked(_:)))
+        
+    }
+    
+    func reloadData() {
+        if watermarkMode == .Template {
+            templateButton.properties.state = .pressed
+            addButton.properties.state = .normal
+        } else {
+            templateButton.properties.state = .normal
+            addButton.properties.state = .pressed
+        }
+        templateButton.reloadData()
+        addButton.reloadData()
+    }
+    
+    //MARK: - Action
+    @objc func buttonClicked(_ sender: ComponentButton) {
+        if sender == templateButton {
+            watermarkMode = .Template
+            delegate?.kmWatermarkToolbarViewDidUpdateMode?(self)
+        } else if sender == addButton {
+            watermarkMode = .AddWatermark
+            delegate?.kmWatermarkToolbarViewDidUpdateMode?(self)
+        } else if sender == batchButton {
+            delegate?.kmWatermarkToolbarViewDidChooseBatch?(self)
+        } else if sender == applyButton {
+            delegate?.kmWatermarkToolbarViewDidChooseApply?(self)
+        } else if sender == exitButton {
+            delegate?.kmWatermarkToolbarViewDidChooseExit?(self)
+        }
+    }
+    
+}

+ 132 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideViews/Watermark/New/Views/KMWatermarkToolbarView.xib

@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="22505" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22505"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMWatermarkToolbarView" customModule="PDF_Reader_Pro" customModuleProvider="target">
+            <connections>
+                <outlet property="addButton" destination="z0V-fq-9Ba" id="ehs-qk-IQr"/>
+                <outlet property="addButtonWidthConst" destination="AcA-08-x9u" id="1bo-JI-Trm"/>
+                <outlet property="applyButton" destination="g5L-Cx-D5n" id="pOC-RE-k4M"/>
+                <outlet property="batchButton" destination="00O-Ze-fRh" id="2AA-Wq-ovf"/>
+                <outlet property="batchButtonWidthConst" destination="SRb-Z3-Ys3" id="ng8-Bx-XLF"/>
+                <outlet property="contendView" destination="cPp-2W-Dp8" id="e96-OH-uCt"/>
+                <outlet property="exitButton" destination="vOi-FA-CTJ" id="yFh-98-Lbu"/>
+                <outlet property="pageSelectView" destination="E6s-24-hkC" id="fbQ-TW-BA7"/>
+                <outlet property="sepDivider" destination="kBC-Dn-b9V" id="0Wj-Pr-SaS"/>
+                <outlet property="templateButton" destination="W7g-83-dmr" id="fom-pH-jYb"/>
+                <outlet property="templateButtonWidthConst" destination="52h-iU-m1y" id="lMg-Td-rpP"/>
+                <outlet property="titleLabel" destination="tdB-X4-Upv" id="8kK-9e-8gh"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customView id="c22-O7-iKe">
+            <rect key="frame" x="0.0" y="0.0" width="1076" height="189"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <customView translatesAutoresizingMaskIntoConstraints="NO" id="cPp-2W-Dp8">
+                    <rect key="frame" x="0.0" y="0.0" width="1076" height="189"/>
+                    <subviews>
+                        <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="tdB-X4-Upv">
+                            <rect key="frame" x="14" y="87" width="37" height="16"/>
+                            <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="HXP-K6-pxh">
+                                <font key="font" usesAppearanceFont="YES"/>
+                                <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                            </textFieldCell>
+                        </textField>
+                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="fOZ-Vs-w15">
+                            <rect key="frame" x="278" y="0.0" width="521" height="189"/>
+                            <subviews>
+                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="E6s-24-hkC" customClass="ComponentSelect" customModule="KMComponentLibrary">
+                                    <rect key="frame" x="0.0" y="81" width="144" height="28"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="28" id="W7g-Ts-J3F"/>
+                                        <constraint firstAttribute="width" constant="144" id="u7e-EI-Z0t"/>
+                                    </constraints>
+                                </customView>
+                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="kBC-Dn-b9V" customClass="ComponentDivider" customModule="KMComponentLibrary">
+                                    <rect key="frame" x="156" y="87" width="1" height="16"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="16" id="cDC-n3-AZh"/>
+                                        <constraint firstAttribute="width" constant="1" id="nlJ-Cq-xSW"/>
+                                    </constraints>
+                                </customView>
+                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="W7g-83-dmr" customClass="ComponentButton" customModule="KMComponentLibrary">
+                                    <rect key="frame" x="168" y="81" width="108" height="28"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="108" id="52h-iU-m1y"/>
+                                        <constraint firstAttribute="height" constant="28" id="DqN-6L-ANc"/>
+                                    </constraints>
+                                </customView>
+                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="z0V-fq-9Ba" customClass="ComponentButton" customModule="KMComponentLibrary">
+                                    <rect key="frame" x="288" y="81" width="143" height="28"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="143" id="AcA-08-x9u"/>
+                                        <constraint firstAttribute="height" constant="28" id="OzA-qd-Xux"/>
+                                    </constraints>
+                                </customView>
+                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="00O-Ze-fRh" customClass="ComponentButton" customModule="KMComponentLibrary">
+                                    <rect key="frame" x="443" y="81" width="78" height="28"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="78" id="SRb-Z3-Ys3"/>
+                                        <constraint firstAttribute="height" constant="28" id="bJv-2u-xUz"/>
+                                    </constraints>
+                                </customView>
+                            </subviews>
+                            <constraints>
+                                <constraint firstItem="W7g-83-dmr" firstAttribute="centerY" secondItem="fOZ-Vs-w15" secondAttribute="centerY" id="2Co-gp-33T"/>
+                                <constraint firstItem="kBC-Dn-b9V" firstAttribute="centerY" secondItem="fOZ-Vs-w15" secondAttribute="centerY" id="CnT-bs-Ebz"/>
+                                <constraint firstItem="z0V-fq-9Ba" firstAttribute="centerY" secondItem="fOZ-Vs-w15" secondAttribute="centerY" id="Hhe-FM-5Ce"/>
+                                <constraint firstItem="E6s-24-hkC" firstAttribute="leading" secondItem="fOZ-Vs-w15" secondAttribute="leading" id="I4s-dO-5HT"/>
+                                <constraint firstAttribute="trailing" secondItem="00O-Ze-fRh" secondAttribute="trailing" id="SMR-y5-HIA"/>
+                                <constraint firstItem="E6s-24-hkC" firstAttribute="centerY" secondItem="fOZ-Vs-w15" secondAttribute="centerY" id="Tye-VS-yii"/>
+                                <constraint firstItem="00O-Ze-fRh" firstAttribute="centerY" secondItem="fOZ-Vs-w15" secondAttribute="centerY" id="iW7-qe-ivE"/>
+                                <constraint firstItem="W7g-83-dmr" firstAttribute="leading" secondItem="E6s-24-hkC" secondAttribute="trailing" constant="24" id="mgA-LY-l39"/>
+                                <constraint firstItem="kBC-Dn-b9V" firstAttribute="leading" secondItem="E6s-24-hkC" secondAttribute="trailing" constant="12" id="tJf-wB-zMI"/>
+                                <constraint firstItem="00O-Ze-fRh" firstAttribute="leading" secondItem="z0V-fq-9Ba" secondAttribute="trailing" constant="12" id="uIX-ze-dAC"/>
+                                <constraint firstItem="z0V-fq-9Ba" firstAttribute="leading" secondItem="W7g-83-dmr" secondAttribute="trailing" constant="12" id="xtL-iW-1Lc"/>
+                            </constraints>
+                        </customView>
+                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="g5L-Cx-D5n" customClass="ComponentButton" customModule="KMComponentLibrary">
+                            <rect key="frame" x="868" y="81" width="92" height="28"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="92" id="V1j-gh-YRL"/>
+                                <constraint firstAttribute="height" constant="28" id="c0B-3e-w97"/>
+                            </constraints>
+                        </customView>
+                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="vOi-FA-CTJ" customClass="ComponentButton" customModule="KMComponentLibrary">
+                            <rect key="frame" x="968" y="81" width="92" height="28"/>
+                            <constraints>
+                                <constraint firstAttribute="height" constant="28" id="KmS-p0-FpH"/>
+                                <constraint firstAttribute="width" constant="92" id="MKt-Xg-U9a"/>
+                            </constraints>
+                        </customView>
+                    </subviews>
+                    <constraints>
+                        <constraint firstItem="vOi-FA-CTJ" firstAttribute="centerY" secondItem="cPp-2W-Dp8" secondAttribute="centerY" id="5Sq-f0-Gxg"/>
+                        <constraint firstAttribute="bottom" secondItem="fOZ-Vs-w15" secondAttribute="bottom" id="EHF-Bk-Tsa"/>
+                        <constraint firstItem="tdB-X4-Upv" firstAttribute="centerY" secondItem="cPp-2W-Dp8" secondAttribute="centerY" id="QiR-Hv-Deo"/>
+                        <constraint firstItem="tdB-X4-Upv" firstAttribute="leading" secondItem="cPp-2W-Dp8" secondAttribute="leading" constant="16" id="RJS-An-0TR"/>
+                        <constraint firstAttribute="trailing" secondItem="vOi-FA-CTJ" secondAttribute="trailing" constant="16" id="Tfs-DK-6a3"/>
+                        <constraint firstItem="fOZ-Vs-w15" firstAttribute="centerX" secondItem="cPp-2W-Dp8" secondAttribute="centerX" id="fF0-hl-ZFO"/>
+                        <constraint firstItem="vOi-FA-CTJ" firstAttribute="leading" secondItem="g5L-Cx-D5n" secondAttribute="trailing" constant="8" id="qrD-PO-a9R"/>
+                        <constraint firstItem="fOZ-Vs-w15" firstAttribute="top" secondItem="cPp-2W-Dp8" secondAttribute="top" id="rFh-2H-Nbg"/>
+                        <constraint firstItem="g5L-Cx-D5n" firstAttribute="centerY" secondItem="cPp-2W-Dp8" secondAttribute="centerY" id="vN2-Q9-c6k"/>
+                    </constraints>
+                </customView>
+            </subviews>
+            <constraints>
+                <constraint firstItem="cPp-2W-Dp8" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" id="0bk-Y8-GUB"/>
+                <constraint firstItem="cPp-2W-Dp8" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" id="1DV-jf-ClD"/>
+                <constraint firstAttribute="bottom" secondItem="cPp-2W-Dp8" secondAttribute="bottom" id="cU3-4c-lMm"/>
+                <constraint firstAttribute="trailing" secondItem="cPp-2W-Dp8" secondAttribute="trailing" id="rjv-d5-0Ht"/>
+            </constraints>
+            <point key="canvasLocation" x="368" y="-113.5"/>
+        </customView>
+    </objects>
+</document>

+ 16 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/Toolbar/KMPDFToolbarController.swift

@@ -441,6 +441,22 @@ class KMPDFToolbarController: NSViewController {
         secondToolBar.refreshRightview()
     }
     
+    func clickWithIdentify(_ identify: String) {
+        guard let toolbarManager = self.toolbarManager, let viewManager = self.viewManager else {
+            return
+        }
+        if identify == KMPDFToolbar_PageEdit_Identifier {
+            pageButton.properties.state = viewManager.isPageEditMode ? .pressed : .normal
+            pageButton.reloadData()
+            
+            viewManager.toolMode = .None
+            
+            delegate?.kmPDFToolbarControllerDidToolbarItemClicked?(self, pageButton.properties.identifier)
+            
+            reloadData()
+        }
+    }
+    
     //MARK: - reloadData
     func reloadData() {
         reloadLeftIconView()

+ 17 - 0
PDF Office/PDF Master/Class/Common/Category/NSView+KMExtension.swift

@@ -115,6 +115,23 @@ extension NSView {
     override func km_window() -> NSWindow? {
         return self.window
     }
+    
+    func show(inView view: NSView, autoHideSeconde: CGFloat = 0) {
+        self.animator().alphaValue = 1
+        view.addSubview(self)
+        
+        if autoHideSeconde > 0 {
+            DispatchQueue.main.asyncAfter(deadline: .now() + autoHideSeconde) {
+                NSAnimationContext.runAnimationGroup({ context in
+                    context.duration = 0.3 // 设置动画持续时间
+                    context.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
+                    self.animator().alphaValue = 0.0 // 动画化透明度
+                }, completionHandler: {
+                    self.removeFromSuperview()
+                })
+            }
+        }
+    }
 }
 
 // MARK: - KMExtension

+ 33 - 17
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -2898,12 +2898,6 @@
 		BB10FAF62AFE2C2900F18D65 /* KMNumberArrayFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB10FAF52AFE2C2900F18D65 /* KMNumberArrayFormatter.swift */; };
 		BB10FAF72AFE2C2900F18D65 /* KMNumberArrayFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB10FAF52AFE2C2900F18D65 /* KMNumberArrayFormatter.swift */; };
 		BB10FAF82AFE2C2900F18D65 /* KMNumberArrayFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB10FAF52AFE2C2900F18D65 /* KMNumberArrayFormatter.swift */; };
-		BB11F0EE2CD9BCE3007656E4 /* KMWatermarkToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB11F0EC2CD9BCE3007656E4 /* KMWatermarkToolbar.swift */; };
-		BB11F0EF2CD9BCE3007656E4 /* KMWatermarkToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB11F0EC2CD9BCE3007656E4 /* KMWatermarkToolbar.swift */; };
-		BB11F0F02CD9BCE3007656E4 /* KMWatermarkToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB11F0EC2CD9BCE3007656E4 /* KMWatermarkToolbar.swift */; };
-		BB11F0F12CD9BCE3007656E4 /* KMWatermarkToolbar.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB11F0ED2CD9BCE3007656E4 /* KMWatermarkToolbar.xib */; };
-		BB11F0F22CD9BCE3007656E4 /* KMWatermarkToolbar.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB11F0ED2CD9BCE3007656E4 /* KMWatermarkToolbar.xib */; };
-		BB11F0F32CD9BCE4007656E4 /* KMWatermarkToolbar.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB11F0ED2CD9BCE3007656E4 /* KMWatermarkToolbar.xib */; };
 		BB13314E2AD78DC0008F6791 /* KMPDFMergeSizeTabelViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB13314D2AD78DC0008F6791 /* KMPDFMergeSizeTabelViewCell.swift */; };
 		BB13314F2AD78DC0008F6791 /* KMPDFMergeSizeTabelViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB13314D2AD78DC0008F6791 /* KMPDFMergeSizeTabelViewCell.swift */; };
 		BB1331502AD78DC0008F6791 /* KMPDFMergeSizeTabelViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB13314D2AD78DC0008F6791 /* KMPDFMergeSizeTabelViewCell.swift */; };
@@ -5021,6 +5015,18 @@
 		BBCE57182A72723600508EFC /* NSResponder+KMExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBCE57172A72723600508EFC /* NSResponder+KMExtension.swift */; };
 		BBCE57192A72723600508EFC /* NSResponder+KMExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBCE57172A72723600508EFC /* NSResponder+KMExtension.swift */; };
 		BBCE571A2A72723600508EFC /* NSResponder+KMExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBCE57172A72723600508EFC /* NSResponder+KMExtension.swift */; };
+		BBD14F562CDA02570077D52E /* KMWatermarkToolbarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD14F552CDA02570077D52E /* KMWatermarkToolbarView.swift */; };
+		BBD14F572CDA02570077D52E /* KMWatermarkToolbarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD14F552CDA02570077D52E /* KMWatermarkToolbarView.swift */; };
+		BBD14F582CDA02570077D52E /* KMWatermarkToolbarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD14F552CDA02570077D52E /* KMWatermarkToolbarView.swift */; };
+		BBD14F5A2CDA02640077D52E /* KMWatermarkToolbarView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBD14F592CDA02640077D52E /* KMWatermarkToolbarView.xib */; };
+		BBD14F5B2CDA02640077D52E /* KMWatermarkToolbarView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBD14F592CDA02640077D52E /* KMWatermarkToolbarView.xib */; };
+		BBD14F5C2CDA02640077D52E /* KMWatermarkToolbarView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBD14F592CDA02640077D52E /* KMWatermarkToolbarView.xib */; };
+		BBD14F5F2CDA16080077D52E /* KMWatermarkSaveWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD14F5D2CDA16080077D52E /* KMWatermarkSaveWindow.swift */; };
+		BBD14F602CDA16080077D52E /* KMWatermarkSaveWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD14F5D2CDA16080077D52E /* KMWatermarkSaveWindow.swift */; };
+		BBD14F612CDA16080077D52E /* KMWatermarkSaveWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD14F5D2CDA16080077D52E /* KMWatermarkSaveWindow.swift */; };
+		BBD14F622CDA16080077D52E /* KMWatermarkSaveWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBD14F5E2CDA16080077D52E /* KMWatermarkSaveWindow.xib */; };
+		BBD14F632CDA16080077D52E /* KMWatermarkSaveWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBD14F5E2CDA16080077D52E /* KMWatermarkSaveWindow.xib */; };
+		BBD14F642CDA16080077D52E /* KMWatermarkSaveWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBD14F5E2CDA16080077D52E /* KMWatermarkSaveWindow.xib */; };
 		BBD1F77C296F9BE000343885 /* KMPageEditSettingBaseWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD1F77A296F9BE000343885 /* KMPageEditSettingBaseWindowController.swift */; };
 		BBD1F77D296F9BE000343885 /* KMPageEditSettingBaseWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD1F77A296F9BE000343885 /* KMPageEditSettingBaseWindowController.swift */; };
 		BBD1F77E296F9BE000343885 /* KMPageEditSettingBaseWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD1F77A296F9BE000343885 /* KMPageEditSettingBaseWindowController.swift */; };
@@ -7046,8 +7052,6 @@
 		BB10FAED2AFE233C00F18D65 /* KMLineInspector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMLineInspector.swift; sourceTree = "<group>"; };
 		BB10FAF12AFE23BE00F18D65 /* LineInspector.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LineInspector.xib; sourceTree = "<group>"; };
 		BB10FAF52AFE2C2900F18D65 /* KMNumberArrayFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMNumberArrayFormatter.swift; sourceTree = "<group>"; };
-		BB11F0EC2CD9BCE3007656E4 /* KMWatermarkToolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMWatermarkToolbar.swift; sourceTree = "<group>"; };
-		BB11F0ED2CD9BCE3007656E4 /* KMWatermarkToolbar.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMWatermarkToolbar.xib; sourceTree = "<group>"; };
 		BB13314D2AD78DC0008F6791 /* KMPDFMergeSizeTabelViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPDFMergeSizeTabelViewCell.swift; sourceTree = "<group>"; };
 		BB1331532AD7A6A1008F6791 /* KMFileAttribute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMFileAttribute.swift; sourceTree = "<group>"; };
 		BB135C2929B6CD9A00FD5965 /* KMTools.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMTools.swift; sourceTree = "<group>"; };
@@ -7929,6 +7933,10 @@
 		BBCE570F2A72712200508EFC /* NSWindowController+KMExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSWindowController+KMExtension.swift"; sourceTree = "<group>"; };
 		BBCE57132A72713A00508EFC /* NSViewController+KMExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSViewController+KMExtension.swift"; sourceTree = "<group>"; };
 		BBCE57172A72723600508EFC /* NSResponder+KMExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSResponder+KMExtension.swift"; sourceTree = "<group>"; };
+		BBD14F552CDA02570077D52E /* KMWatermarkToolbarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMWatermarkToolbarView.swift; sourceTree = "<group>"; };
+		BBD14F592CDA02640077D52E /* KMWatermarkToolbarView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMWatermarkToolbarView.xib; sourceTree = "<group>"; };
+		BBD14F5D2CDA16080077D52E /* KMWatermarkSaveWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMWatermarkSaveWindow.swift; sourceTree = "<group>"; };
+		BBD14F5E2CDA16080077D52E /* KMWatermarkSaveWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMWatermarkSaveWindow.xib; sourceTree = "<group>"; };
 		BBD1F77A296F9BE000343885 /* KMPageEditSettingBaseWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPageEditSettingBaseWindowController.swift; sourceTree = "<group>"; };
 		BBD1F77B296F9BE000343885 /* KMPageEditSettingBaseWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMPageEditSettingBaseWindowController.xib; sourceTree = "<group>"; };
 		BBD1F786296FAC7C00343885 /* KMPageEditSettingBaseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPageEditSettingBaseView.swift; sourceTree = "<group>"; };
@@ -9481,6 +9489,7 @@
 				9FBC48BE299E23B100CA39D7 /* NSViewController+DesignToken.swift */,
 				9F3D818D29A22AD90087B5AD /* Date+KMExtensions.swift */,
 				9F81ADC529B9B12C002251F4 /* NSButton+DesignToken.swift */,
+				BBD54ED32A1CBD720012A230 /* NSView+KMExtension.swift */,
 			);
 			path = Category;
 			sourceTree = "<group>";
@@ -11989,7 +11998,6 @@
 				BBB1A3A529F6B66400E54E47 /* NSPanel+KMExtension.swift */,
 				BBB3FF9B2B56852700145C4A /* NSDocument+KMExtensions.swift */,
 				BBB7B48C2A0384E100B58A5A /* NSCollectionViewItem+KMExtension.swift */,
-				BBD54ED32A1CBD720012A230 /* NSView+KMExtension.swift */,
 				BBBF68832A3C3AF10058E14E /* NSDocumentController+KMExtension.swift */,
 				BBCE57132A72713A00508EFC /* NSViewController+KMExtension.swift */,
 				BBCE57172A72723600508EFC /* NSResponder+KMExtension.swift */,
@@ -14639,8 +14647,10 @@
 				BB11F0EA2CD9BCC8007656E4 /* Model */,
 				BBDF18132CD4853C00ACDB15 /* KMNWatermarkPropertyController.swift */,
 				BBDF18142CD4853C00ACDB15 /* KMNWatermarkPropertyController.xib */,
-				BB11F0EC2CD9BCE3007656E4 /* KMWatermarkToolbar.swift */,
-				BB11F0ED2CD9BCE3007656E4 /* KMWatermarkToolbar.xib */,
+				BBD14F552CDA02570077D52E /* KMWatermarkToolbarView.swift */,
+				BBD14F592CDA02640077D52E /* KMWatermarkToolbarView.xib */,
+				BBD14F5D2CDA16080077D52E /* KMWatermarkSaveWindow.swift */,
+				BBD14F5E2CDA16080077D52E /* KMWatermarkSaveWindow.xib */,
 				BB955EC22CD8ECE20042FDE1 /* Templates */,
 			);
 			path = Views;
@@ -15720,6 +15730,7 @@
 				BB2F9AA62AFC8D5A00F9DD93 /* KMProfileInfoWindowController.xib in Resources */,
 				BB65A0502AF8B64B003A27A0 /* DisplayPreferences.xib in Resources */,
 				ADE86AFB2B0AF5A400414DFA /* KMCompareContentSettingView.xib in Resources */,
+				BBD14F622CDA16080077D52E /* KMWatermarkSaveWindow.xib in Resources */,
 				BB19A7632CB7CFBC008204DC /* KMHomeQuickToolsView.xib in Resources */,
 				AD1CA3FA2A05FCB60070541F /* KMAnnotationScreenViewController.xib in Resources */,
 				BBC2BCC9295DA8F30036B983 /* KMCropPreviewController.xib in Resources */,
@@ -15803,7 +15814,6 @@
 				BB9599C72B3164B40062D346 /* KMRedactPropertiesWindowController.xib in Resources */,
 				BBFE6E822930EBD400142C01 /* KMCompressWindowController.xib in Resources */,
 				ADF6B8702A480CCE0090CB78 /* KMComparativeView.xib in Resources */,
-				BB11F0F12CD9BCE3007656E4 /* KMWatermarkToolbar.xib in Resources */,
 				BB5F8A1C29BB15AD00365ADB /* KMEmailSubWindowController.xib in Resources */,
 				9F221EDA29A9EC0900978A59 /* KMFillSignTextPanel.xib in Resources */,
 				BBB2ACE02B5943F800098854 /* Quick Start Guide.pdf in Resources */,
@@ -16107,6 +16117,7 @@
 				ADB2D6FD294882B70029D2B3 /* KMTextFieldStepperView.xib in Resources */,
 				BB69C95F299116FD0001A9B1 /* plaid.pdf in Resources */,
 				89D2D2FE294C806000BFF5FE /* KMPDFThumbnailItem.xib in Resources */,
+				BBD14F5A2CDA02640077D52E /* KMWatermarkToolbarView.xib in Resources */,
 				BB52F5782CC236B6007418DB /* KMLinkWebView.xib in Resources */,
 				AD055E282B70B3C10035F824 /* KMBookmarkController.xib in Resources */,
 				BBF62C6C2B033B5B007B7E86 /* KMPDFEditExtractWindow.xib in Resources */,
@@ -16431,7 +16442,6 @@
 				65341C782C63CCFE00FE30F9 /* KMSearchReplaceWindowController.xib in Resources */,
 				ADFCEB492B4FBA440001EBAF /* RemoteConfigDefaults.plist in Resources */,
 				9F3D819729A33A290087B5AD /* KMDesignDropdown.xib in Resources */,
-				BB11F0F22CD9BCE3007656E4 /* KMWatermarkToolbar.xib in Resources */,
 				BB52F5932CC245B3007418DB /* KMLinkPopupEmailView.xib in Resources */,
 				BB03D6912B01C7AB008C9976 /* KMPDFEditInsertBlankPageWindow.xib in Resources */,
 				BBE788822CBD2463008086E2 /* WCCompWindowController.xib in Resources */,
@@ -16535,6 +16545,7 @@
 				AD1CA41D2A061CE10070541F /* KMAnnotationScreenTypeViewItem.xib in Resources */,
 				655B91BA2CCB47690080AE6E /* KMNPreView.xib in Resources */,
 				89E4E7302963FBA2002DBA6F /* KMPropertiesViewPopController.xib in Resources */,
+				BBD14F632CDA16080077D52E /* KMWatermarkSaveWindow.xib in Resources */,
 				ADE614B229779C6D00F62ED7 /* KMImageTitleButton.xib in Resources */,
 				9F221EDB29A9EC0900978A59 /* KMFillSignTextPanel.xib in Resources */,
 				BB6347C92AF24F6C00F5438E /* KMBatchoperateConvertCollectionViewItem.xib in Resources */,
@@ -16626,6 +16637,7 @@
 				9F5752ED2B58FF73005DC303 /* KMAnnotationFromViewController.xib in Resources */,
 				BB04FD112B206F4000D80F7B /* KMPlanViewController.xib in Resources */,
 				BBB376AB2B10A7FD009539CC /* a_3a.png in Resources */,
+				BBD14F5B2CDA02640077D52E /* KMWatermarkToolbarView.xib in Resources */,
 				F3EF17A02CD5FF8D0007D364 /* KMNThumnailHeaderViewController.xib in Resources */,
 				BB955EC02CD8E4600042FDE1 /* KMNWatermarkTemplateController.xib in Resources */,
 				BB5E2EFD2C2BF3FF00657A61 /* KMEditPDFCropComfirmWindowController.xib in Resources */,
@@ -16941,6 +16953,7 @@
 				89E4E7432964160F002DBA6F /* KMAnnotationLinkViewController.xib in Resources */,
 				ADBC373929CA975B00D93208 /* KMCompatative.xcassets in Resources */,
 				BB19A7652CB7CFBC008204DC /* KMHomeQuickToolsView.xib in Resources */,
+				BBD14F642CDA16080077D52E /* KMWatermarkSaveWindow.xib in Resources */,
 				BBB376A02B10A7FD009539CC /* a_4a.png in Resources */,
 				ADD5AE5B2A64DD2600C14249 /* KMPurchaseAlertView.xib in Resources */,
 				BB8F454C295A9CDC0037EA22 /* KMHeaderFooterListController.xib in Resources */,
@@ -16976,7 +16989,6 @@
 				9F853A042947137500DF644E /* default-icon.pdf in Resources */,
 				ADE86AF42B0AF56C00414DFA /* KMCompareCoveringSettingView.xib in Resources */,
 				9F8539ED2947131F00DF644E /* KMChromiumTabView.xib in Resources */,
-				BB11F0F32CD9BCE4007656E4 /* KMWatermarkToolbar.xib in Resources */,
 				BBE788A12CBD2463008086E2 /* TreeVC.xib in Resources */,
 				AD1D48402AFB81F4007AC1F0 /* KMMergeBlankView.xib in Resources */,
 				BB986AE92AD5376100ADF172 /* WelcomeWindowController.xib in Resources */,
@@ -17172,6 +17184,7 @@
 				BB276A5E2B038D3A00AB5578 /* KMOCRPDFWindowController.xib in Resources */,
 				AD1FE81C2BD7C98300AA4A9B /* KMPDFMultiplePrintWindowController.xib in Resources */,
 				AD0FA50029A8DD8700EDEB50 /* KMRegisterSuccessView.xib in Resources */,
+				BBD14F5C2CDA02640077D52E /* KMWatermarkToolbarView.xib in Resources */,
 				899700FB28F4051B009AF911 /* KMAnnotationViewController.xib in Resources */,
 				BBC821E52B0D9F72004B7E8E /* KMStampCreaterWindowController.xib in Resources */,
 				BB7F7C0229AA586900A3E4E7 /* signAdd.png in Resources */,
@@ -17844,6 +17857,7 @@
 				BBF8A4012AE8B4E200788BAC /* KMBatchBaseParameter.swift in Sources */,
 				656C1E3A2CD0745200295F82 /* KMConvertWordSettingView.swift in Sources */,
 				AD867FC129DFC39400F00440 /* KMBOTAAnnotationItem.swift in Sources */,
+				BBD14F5F2CDA16080077D52E /* KMWatermarkSaveWindow.swift in Sources */,
 				BB9EA1572B1EEAAC00EAFD9B /* KMImageModel.swift in Sources */,
 				BBDA8A6D2A31F9A6006A2C4E /* KMDesignStepperView.swift in Sources */,
 				F30B227C2CB7DAF10041002E /* KMNQuickToolWindowController.swift in Sources */,
@@ -18038,6 +18052,7 @@
 				BB24FFE62B2863EF00A59054 /* KMTTSManager.swift in Sources */,
 				65D88ED22C85826A00DD06E0 /* KMRSAUtils.swift in Sources */,
 				BB67EE202B54FFEF00573BF0 /* ASIDataDecompressor.m in Sources */,
+				BBD14F562CDA02570077D52E /* KMWatermarkToolbarView.swift in Sources */,
 				65341C7C2C646C6400FE30F9 /* KMSearchReplaceHanddler.swift in Sources */,
 				BB897229294B08720045787C /* KMWatermarkAdjectiveTopBarItemModel.swift in Sources */,
 				BB00301D298CB799002DD1A0 /* KMPreferenceManager.swift in Sources */,
@@ -18281,7 +18296,6 @@
 				AD867FAF29DFBB1200F00440 /* KMAnnotationOutlineCellView.swift in Sources */,
 				AD867F9429D955BF00F00440 /* KMBOTAOutlineCellView.swift in Sources */,
 				F3DB85F22CCA209600D0AFDE /* KMNBaseWindowController.swift in Sources */,
-				BB11F0EE2CD9BCE3007656E4 /* KMWatermarkToolbar.swift in Sources */,
 				9F1FE4A529406E4700E952CA /* CTToolbarView.m in Sources */,
 				BBB7899C2BE8BF2400F7E09C /* CustomCornerView.swift in Sources */,
 				BB162E92294FFE020088E9D1 /* KMWatermarkModel.swift in Sources */,
@@ -19280,6 +19294,7 @@
 				ADC63E492A49BEDD00854E02 /* KMSubscribeWaterMarkCollectionItem.swift in Sources */,
 				ADDF83212B391A5C00A81A4E /* KMPDFDigitalSignViewController.swift in Sources */,
 				AD1FE8452BD7C98300AA4A9B /* KMPDFPosterPrintWindowController.m in Sources */,
+				BBD14F602CDA16080077D52E /* KMWatermarkSaveWindow.swift in Sources */,
 				BBF38A5F294F42FF0086D025 /* KMWatermarkAdjectiveStepper.swift in Sources */,
 				ADBC17502A2991F700959CEE /* KMPurchaseManager.swift in Sources */,
 				BBD9222C2B50D50A00DB9585 /* iRate.m in Sources */,
@@ -19360,7 +19375,6 @@
 				ADDF83272B391A5C00A81A4E /* CPDFDigtalView.m in Sources */,
 				BB00301E298CB799002DD1A0 /* KMPreferenceManager.swift in Sources */,
 				ADA9102F2A272CEA003352F0 /* KMImageOptimization.swift in Sources */,
-				BB11F0EF2CD9BCE3007656E4 /* KMWatermarkToolbar.swift in Sources */,
 				AD9527DC2952EE700039D2BC /* KMPrintPage_C.swift in Sources */,
 				ADBC2D29299DCA76006280C8 /* NSTextField+Layer.swift in Sources */,
 				9F0CB4702967E63100007028 /* KMPropertiesPanelNameSubVC.swift in Sources */,
@@ -20162,6 +20176,7 @@
 				9F0CB53E2986571A00007028 /* KMDesignToken+Typography.swift in Sources */,
 				9FCFEC712AC40F9B00EAD2CB /* CStampSignatureObject.swift in Sources */,
 				BBD7FE032A13218E00F96075 /* KMWatermarkAdjectivePropertyBaseController.swift in Sources */,
+				BBD14F572CDA02570077D52E /* KMWatermarkToolbarView.swift in Sources */,
 				BB2EDF4D296E63E5003BCF58 /* KMPageEditInsertCustomPageWindowController.swift in Sources */,
 				BB3A66AC2B078FB200575343 /* KMNoteTableViewCell.swift in Sources */,
 				9F0CB522298656AA00007028 /* KMDesignToken+BorderRadiusBottomLeft.swift in Sources */,
@@ -20279,6 +20294,7 @@
 				BB83639C2C199C20002CE43A /* KMBotaModel.swift in Sources */,
 				BBB612B32AF4C388000F3724 /* KMBatchOperateAddWatermarkViewController.swift in Sources */,
 				BB5726F22B20707D0089D283 /* CPDFMarkupAnnotation+PDFListView.swift in Sources */,
+				BBD14F612CDA16080077D52E /* KMWatermarkSaveWindow.swift in Sources */,
 				9FF371E52C69D2F8005F9CC5 /* CPDFPolygonAnnotation+PDFListView.swift in Sources */,
 				9F0CB49929683E1000007028 /* KMPropertiesPanelTextSubVC.swift in Sources */,
 				BB4BD9CE2909026500A66A65 /* KMRightSideViewController.swift in Sources */,
@@ -20373,6 +20389,7 @@
 				BBB789922BE8BF2300F7E09C /* AITypeItemChooseView.swift in Sources */,
 				BBEFD0262AFA065F003FABD8 /* KMBatchAddHeaderFooterOperation.swift in Sources */,
 				BB8F4580295B00130037EA22 /* KMWatermarkAdjectiveTools.swift in Sources */,
+				BBD14F582CDA02570077D52E /* KMWatermarkToolbarView.swift in Sources */,
 				BBB9B312299A5D6D004F3235 /* KMCloudDownloadOperationQueue.m in Sources */,
 				BB147046299DC0D200784A6A /* OIDURLQueryComponent.m in Sources */,
 				BB67EE2B2B54FFEF00573BF0 /* ASIDownloadCache.m in Sources */,
@@ -20801,7 +20818,6 @@
 				BB0A551F2A30793F00B6E84B /* KMDesignTextField.swift in Sources */,
 				BB146FCE299DC0D100784A6A /* GTMSessionUploadFetcher.m in Sources */,
 				BB10FAF82AFE2C2900F18D65 /* KMNumberArrayFormatter.swift in Sources */,
-				BB11F0F02CD9BCE3007656E4 /* KMWatermarkToolbar.swift in Sources */,
 				65A9712A2CBA1792008DB0F9 /* KMToolbarPageInputItemView.swift in Sources */,
 				BB3198142AC5142900107371 /* NSMenu+KMExtension.swift in Sources */,
 				9F5752EB2B58FF73005DC303 /* KMAnnotationFromViewController.swift in Sources */,

+ 138 - 0
PDF Office/PDF Reader Pro.xcodeproj/xcuserdata/kdanmobile.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -2212,6 +2212,36 @@
                   endingLineNumber = "235"
                   offsetFromSymbolStart = "28">
                </Location>
+               <Location
+                  uuid = "E3962D60-30EF-4185-BF07-EA1A34784887 - c44283d1f17e19ee"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "PDF_Reader_Pro.KMMainViewController.setDocument.modify : Swift.Optional&lt;__C.CPDFDocument&gt;"
+                  moduleName = "PDF Reader Pro"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/kdanmobile/Documents/Git/PDF_Office/PDF%20Office/PDF%20Master/KMClass/KMPDFViewController/KMMainViewController.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "235"
+                  endingLineNumber = "235"
+                  offsetFromSymbolStart = "0">
+               </Location>
+               <Location
+                  uuid = "E3962D60-30EF-4185-BF07-EA1A34784887 - 7a215de82f00776e"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "PDF_Reader_Pro.KMMainViewController.setDocument.modify : Swift.Optional&lt;__C.CPDFDocument&gt; with unmangled suffix &quot;.resume.0&quot;"
+                  moduleName = "PDF Reader Pro"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/kdanmobile/Documents/Git/PDF_Office/PDF%20Office/%3Ccompiler-generated%3E"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "0"
+                  endingLineNumber = "0"
+                  offsetFromSymbolStart = "20">
+               </Location>
             </Locations>
          </BreakpointContent>
       </BreakpointProxy>
@@ -2276,6 +2306,21 @@
                   endingLineNumber = "317"
                   offsetFromSymbolStart = "120">
                </Location>
+               <Location
+                  uuid = "D206E0B7-814F-4B14-B67E-A227181643C3 - 3a681dc077fd068d"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "PDF_Reader_Pro.KMMainViewController.leftSidePaneIsOpen() -&gt; Swift.Bool"
+                  moduleName = "PDF Reader Pro"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/kdanmobile/Documents/Git/PDF_Office/PDF%20Office/PDF%20Master/KMClass/KMPDFViewController/KMMainViewController.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "317"
+                  endingLineNumber = "317"
+                  offsetFromSymbolStart = "108">
+               </Location>
             </Locations>
          </BreakpointContent>
       </BreakpointProxy>
@@ -2324,6 +2369,21 @@
                   endingLineNumber = "325"
                   offsetFromSymbolStart = "172">
                </Location>
+               <Location
+                  uuid = "E9CA18F4-1E31-433F-B721-D83769733F83 - 702999c0d437ed5c"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "PDF_Reader_Pro.KMMainViewController.toggleOpenLeftSide(pdfSideBarType: PDF_Reader_Pro.KMPDFSidebarType) -&gt; ()"
+                  moduleName = "PDF Reader Pro"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/kdanmobile/Documents/Git/PDF_Office/PDF%20Office/PDF%20Master/KMClass/KMPDFViewController/KMMainViewController.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "325"
+                  endingLineNumber = "325"
+                  offsetFromSymbolStart = "160">
+               </Location>
             </Locations>
          </BreakpointContent>
       </BreakpointProxy>
@@ -2372,6 +2432,21 @@
                   endingLineNumber = "344"
                   offsetFromSymbolStart = "96">
                </Location>
+               <Location
+                  uuid = "21491771-A89E-431C-A345-8F8239B11B3D - f8e46c602084e37d"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "PDF_Reader_Pro.KMMainViewController.toggleCloseLeftSide() -&gt; ()"
+                  moduleName = "PDF Reader Pro"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/kdanmobile/Documents/Git/PDF_Office/PDF%20Office/PDF%20Master/KMClass/KMPDFViewController/KMMainViewController.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "344"
+                  endingLineNumber = "344"
+                  offsetFromSymbolStart = "84">
+               </Location>
             </Locations>
          </BreakpointContent>
       </BreakpointProxy>
@@ -2439,5 +2514,68 @@
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "11EA05BB-5295-4047-A0A4-643A381C19CD"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "KMComponentLibrary/KMComponentLibrary/View/Input/ComponentInput/ComponentInput.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "341"
+            endingLineNumber = "341"
+            landmarkName = "mouseUp(with:)"
+            landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "11EA05BB-5295-4047-A0A4-643A381C19CD - 97d00fbdd5c99ea5"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "KMComponentLibrary.ComponentInput.mouseUp(with: __C.NSEvent) -&gt; ()"
+                  moduleName = "KMComponentLibrary"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/kdanmobile/Documents/Git/PDF_Office/PDF%20Office/KMComponentLibrary/KMComponentLibrary/View/Input/ComponentInput/ComponentInput.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "342"
+                  endingLineNumber = "342"
+                  offsetFromSymbolStart = "660">
+               </Location>
+               <Location
+                  uuid = "11EA05BB-5295-4047-A0A4-643A381C19CD - 97d00fbdd5c99e84"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "KMComponentLibrary.ComponentInput.mouseUp(with: __C.NSEvent) -&gt; ()"
+                  moduleName = "KMComponentLibrary"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/kdanmobile/Documents/Git/PDF_Office/PDF%20Office/KMComponentLibrary/KMComponentLibrary/View/Input/ComponentInput/ComponentInput.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "341"
+                  endingLineNumber = "341"
+                  offsetFromSymbolStart = "588">
+               </Location>
+               <Location
+                  uuid = "11EA05BB-5295-4047-A0A4-643A381C19CD - 97d00fbdd5c99e84"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "KMComponentLibrary.ComponentInput.mouseUp(with: __C.NSEvent) -&gt; ()"
+                  moduleName = "KMComponentLibrary"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/kdanmobile/Documents/Git/PDF_Office/PDF%20Office/KMComponentLibrary/KMComponentLibrary/View/Input/ComponentInput/ComponentInput.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "341"
+                  endingLineNumber = "341"
+                  offsetFromSymbolStart = "600">
+               </Location>
+            </Locations>
+         </BreakpointContent>
+      </BreakpointProxy>
    </Breakpoints>
 </Bucket>