瀏覽代碼

【2025】【Edit】图片编辑模块完善

niehaoyu 6 天之前
父節點
當前提交
992b1f6115
共有 16 個文件被更改,包括 923 次插入2155 次删除
  1. 150 133
      PDF Office/KMComponentLibrary/KMComponentLibrary/View/InputNumber/ComponentInputNumber.swift
  2. 3 3
      PDF Office/KMComponentLibrary/KMComponentLibrary/View/InputNumber/ComponentInputNumber.xib
  3. 3 0
      PDF Office/KMComponentLibrary/KMComponentLibrary/View/InputNumber/ComponentInputNumberProperty.swift
  4. 300 65
      PDF Office/PDF Master/Class/PDFWindowController/PDFListView/CPDFListViewExtension/CPDFListView+Edit.swift
  5. 3 7
      PDF Office/PDF Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift
  6. 1 8
      PDF Office/PDF Master/Class/PDFWindowController/ViewController/KMMainViewController+UI.swift
  7. 4 4
      PDF Office/PDF Master/KMClass/KMPDFViewController/EditTool/KMLinkViewController/KMLinkViewController.swift
  8. 18 6
      PDF Office/PDF Master/KMClass/KMPDFViewController/EditTool/KMLinkViewController/Views/KMNLinkMultiController/KMNMultiController.swift
  9. 2 2
      PDF Office/PDF Master/KMClass/KMPDFViewController/EditTool/KMLinkViewController/Views/KMNLinkMultiController/KMNMultiController.xib
  10. 171 33
      PDF Office/PDF Master/KMClass/KMPDFViewController/KMMainViewController.swift
  11. 149 72
      PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideController/Views/EditPDF/KMEditImageController.swift
  12. 17 6
      PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideController/Views/EditPDF/KMEditImageController.xib
  13. 0 1201
      PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideController/Views/EditPDF/KMEditImagePropertyViewController.swift
  14. 0 451
      PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideController/Views/EditPDF/KMEditImagePropertyViewController.xib
  15. 19 35
      PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj
  16. 83 129
      PDF Office/PDF Reader Pro.xcodeproj/xcuserdata/kdanmobile.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

+ 150 - 133
PDF Office/KMComponentLibrary/KMComponentLibrary/View/InputNumber/ComponentInputNumber.swift

@@ -11,11 +11,14 @@ import AppKit
 @objc public protocol ComponentInputNumberDelegate: AnyObject {
     
     @objc optional func componentInputNumberDidValueChanged(inputNumber: ComponentInputNumber?)
-  
+    
+    @objc optional func componentInputNumberDidIncrease(inputNumber: ComponentInputNumber?)
+    
+    @objc optional func componentInputNumberDidDecrease(inputNumber: ComponentInputNumber?)
 }
 
 public class ComponentInputNumber: ComponentBaseXibView {
-
+    
     @IBOutlet var contendBox: NSBox!
     @IBOutlet var lefticonImage: NSImageView!
     @IBOutlet var righticonImage: NSImageView!
@@ -53,176 +56,185 @@ public class ComponentInputNumber: ComponentBaseXibView {
     public override func awakeFromNib() {
         super.awakeFromNib()
         
-//        formatter.regexString = "^[0123456789]*$"
-//        formatter.controlSize = true
-//        
-//        self.inputField.formatter = formatter
-        self.inputField.componentDelegate = self
-        self.inputField.focusRingType = .none
+        //        formatter.regexString = "^[0123456789]*$"
+        //        formatter.controlSize = true
+        //
+        //        inputField.formatter = formatter
+        inputField.componentDelegate = self
+        inputField.focusRingType = .none
         
-        self.stepperView.componentDelegate = self
+        stepperView.componentDelegate = self
         
         NotificationCenter.default.addObserver(self, selector: #selector(textFieldDidBeginEditingNotification(_:)), name: NSControl.textDidBeginEditingNotification, object: inputField)
         NotificationCenter.default.addObserver(self, selector: #selector(textFieldDidChangeNotification(_:)), name: NSControl.textDidChangeNotification, object: inputField)
         NotificationCenter.default.addObserver(self, selector: #selector(textFieldDidEndEditingNotification(_:)), name: NSControl.textDidEndEditingNotification, object: inputField)
     }
- 
+    
     // MARK: - Set & Get
     
     public var properties : ComponentInputNumberProperty {
         get {
-           return _properties
+            return _properties
         }
         set {
             _properties = newValue
             
             ComponentLibrary.shared.configInputNumberComponent(properties: _properties)
             
-            self.reloadData()
+            reloadData()
         }
     }
     
     public func reloadData() {
         
-        self.setupUI()
+        setupUI()
         
-        self.refreshUI()
+        refreshUI()
     }
     
     func setupUI() {
         
-        if self.properties.size == .m {
-            self.stepperHeightConst.constant = 28
-        } else if self.properties.size == .s {
-            self.stepperHeightConst.constant = 24
+        if properties.size == .m {
+            stepperHeightConst.constant = 28
+        } else if properties.size == .s {
+            stepperHeightConst.constant = 24
         }
         
-        self.inputField.alignment = properties.alignment
-         
-        if self.properties.showPrefix == true {
-            self.lefticonImage.isHidden = false
+        inputField.alignment = properties.alignment
+        
+        if properties.showPrefix == true {
+            lefticonImage.isHidden = false
             lefticonImage.image = properties.leftIcon
-            self.inputFieldLeftConst.constant = 32
+            inputFieldLeftConst.constant = 32
         } else {
-            self.lefticonImage.isHidden = true
-            self.inputFieldLeftConst.constant = 8
+            lefticonImage.isHidden = true
+            inputFieldLeftConst.constant = 8
         }
         
-        if self.properties.showSuffix == true {
-            self.righticonImage.isHidden = false
+        if properties.showSuffix == true {
+            righticonImage.isHidden = false
             righticonImage.image = properties.rightIcon
-            self.inputFieldRightConst.constant = 56
+            inputFieldRightConst.constant = 56
         } else {
-            self.righticonImage.isHidden = true
-            self.inputFieldRightConst.constant = 32
+            righticonImage.isHidden = true
+            inputFieldRightConst.constant = 32
         }
         
-        self.reloadStepperViewEnable()
+        reloadStepperViewEnable()
         
-        self.inputField.stringValue = properties.text ?? ""
-        self.inputField.placeholderString = String(format: "%d~%d", self.properties.minSize, self.properties.maxSize)
+        inputField.stringValue = properties.text ?? ""
+        inputField.placeholderString = String(format: "%d~%d", properties.minSize, properties.maxSize)
         
         formatter.minSize = properties.minSize
         formatter.maxSize = properties.maxSize
-         
+        
     }
     
     func refreshUI() {
         
-        if self.properties.isError == true && properties.showErrorInfo {
-            self.errorTipLabel.isHidden = false
-            self.contendBoxBottomConst.constant = 18
+        if properties.isError == true && properties.showErrorInfo {
+            errorTipLabel.isHidden = false
+            contendBoxBottomConst.constant = 18
         } else {
-            self.errorTipLabel.isHidden = true
-            self.contendBoxBottomConst.constant = 0
+            errorTipLabel.isHidden = true
+            contendBoxBottomConst.constant = 0
         }
         
-        self.contendBox.cornerRadius = self.properties.propertyInfo.cornerRadius
-        self.contendBox.borderWidth = self.properties.propertyInfo.borderWidth
+        contendBox.cornerRadius = properties.propertyInfo.cornerRadius
+        contendBox.borderWidth = properties.propertyInfo.borderWidth
         
         var fillColor = NSColor.clear
         var borderColor = NSColor.clear
-        if self.properties.state == .normal {
-            fillColor = (self.properties.propertyInfo.color_nor)
-            borderColor = (self.properties.propertyInfo.borderColor_nor)
+        if properties.state == .normal {
+            fillColor = (properties.propertyInfo.color_nor)
+            borderColor = (properties.propertyInfo.borderColor_nor)
             
-        } else if self.properties.state == .hover {
-            fillColor = (self.properties.propertyInfo.color_hov)
-            if self.properties.isError == true {
-                fillColor = (self.properties.propertyInfo.color_error_hov)
+        } else if properties.state == .hover {
+            fillColor = (properties.propertyInfo.color_hov)
+            if properties.isError == true {
+                fillColor = (properties.propertyInfo.color_error_hov)
             }
-            borderColor = (self.properties.propertyInfo.borderColor_hov)
+            borderColor = (properties.propertyInfo.borderColor_hov)
             
-        } else if self.properties.state == .pressed {
-            fillColor = (self.properties.propertyInfo.color_active)
-            borderColor = (self.properties.propertyInfo.borderColor_active)
+        } else if properties.state == .pressed {
+            fillColor = (properties.propertyInfo.color_active)
+            borderColor = (properties.propertyInfo.borderColor_active)
             
         }
         
-        if self.properties.isDisabled == true {
-            fillColor = (self.properties.propertyInfo.color_dis)
-            borderColor = (self.properties.propertyInfo.borderColor_dis)
+        if properties.isDisabled == true {
+            fillColor = (properties.propertyInfo.color_dis)
+            borderColor = (properties.propertyInfo.borderColor_dis)
             
         }
         
-        if self.properties.isError == true {
-            borderColor = (self.properties.propertyInfo.borderColor_error)
+        if properties.isError == true {
+            borderColor = (properties.propertyInfo.borderColor_error)
         }
         
-        self.contendBox.fillColor = fillColor
-        self.contendBox.borderColor = borderColor
-    
-        if self.properties.isDisabled == false {
-            self.inputField.isEditable = true
+        contendBox.fillColor = fillColor
+        contendBox.borderColor = borderColor
+        
+        if properties.isDisabled == false {
+            inputField.isEditable = true
+            
+            if properties.multiState == true {
+                inputField.isEditable = false
+            }
         } else {
-            self.inputField.isEditable = false
+            inputField.isEditable = false
         }
-        self.inputField.font = self.properties.propertyInfo.textFont
+        inputField.font = properties.propertyInfo.textFont
         
-        self.errorTipLabel.textColor = self.properties.propertyInfo.errorTipTextColor
-        self.errorTipLabel.font = self.properties.propertyInfo.errorTipTextFont
+        errorTipLabel.textColor = properties.propertyInfo.errorTipTextColor
+        errorTipLabel.font = properties.propertyInfo.errorTipTextFont
         
     }
     
     func reloadStepperViewEnable() {
         
-        if self.properties.isDisabled == true {
-            self.stepperView.upEnable = false
-            self.stepperView.downEnable = false
+        if properties.isDisabled == true {
+            stepperView.upEnable = false
+            stepperView.downEnable = false
         } else {
-            self.stepperView.upEnable = true
-            self.stepperView.downEnable = true
+            stepperView.upEnable = true
+            stepperView.downEnable = true
             
-            let curValue = self.inputField.intValue
-            if curValue >= self.properties.maxSize {
-                self.stepperView.upEnable = false
-                self.stepperView.downEnable = true
-            }
-            if curValue <= self.properties.minSize {
-                self.stepperView.upEnable = true
-                self.stepperView.downEnable = false
+            if properties.multiState == false {
+                let curValue = inputField.intValue
+                if curValue >= properties.maxSize {
+                    stepperView.upEnable = false
+                    stepperView.downEnable = true
+                }
+                if curValue <= properties.minSize {
+                    stepperView.upEnable = true
+                    stepperView.downEnable = false
+                }
             }
-            
         }
-        self.stepperView.reloadData()
+        stepperView.reloadData()
     }
     
     func inputFieldStringDidChanged() {
         
-        if self.inputField.stringValue.isEmpty {
-            self.properties.isError = false
+        if inputField.stringValue.isEmpty {
+            properties.isError = false
         } else {
-            if properties.valueType == .intType {
-                let curValue = self.inputField.intValue
-                if curValue > self.properties.maxSize ||
-                    curValue < self.properties.minSize {
-                    self.properties.isError = true
-                } else {
-                    self.properties.isError = false
+            if properties.multiState == true {
+                properties.isError = false
+            } else {
+                if properties.valueType == .intType {
+                    let curValue = inputField.intValue
+                    if curValue > properties.maxSize ||
+                        curValue < properties.minSize {
+                        properties.isError = true
+                    } else {
+                        properties.isError = false
+                    }
                 }
             }
         }
-        self.reloadStepperViewEnable()
+        reloadStepperViewEnable()
         
         if inputField.stringValue.isEmpty == false {
             if properties.valueType == .intType {
@@ -238,7 +250,7 @@ public class ComponentInputNumber: ComponentBaseXibView {
             inputField.stringValue = properties.text ?? ""
         }
         
-        self.delegate?.componentInputNumberDidValueChanged?(inputNumber: self)
+        delegate?.componentInputNumberDidValueChanged?(inputNumber: self)
     }
     
     //MARK: - TextNotification
@@ -247,34 +259,34 @@ public class ComponentInputNumber: ComponentBaseXibView {
     }
     
     @objc func textFieldDidChangeNotification(_ notification: Notification) {
-  
-        self.inputFieldStringDidChanged()
         
-        self.refreshUI()
+        inputFieldStringDidChanged()
+        
+        refreshUI()
         
     }
     
     @objc func textFieldDidEndEditingNotification(_ notification: Notification) {
         
-        self.inputField.isResponder = false
-        if self.properties.isDisabled == false {
-            self.properties.state = .normal
+        inputField.isResponder = false
+        if properties.isDisabled == false {
+            properties.state = .normal
         }
-         
-        self.refreshUI()
         
-        self.inputFieldStringDidChanged()
+        refreshUI()
+        
+        inputFieldStringDidChanged()
     }
     
     //MARK: - MouseEvent
     public override func mouseEntered(with event: NSEvent) {
         super.mouseEntered(with: event)
-         
-        if self.properties.isDisabled == false &&
-            self.inputField.isResponder == false {
-            self.properties.state = .hover
+        
+        if properties.isDisabled == false &&
+            inputField.isResponder == false {
+            properties.state = .hover
         }
-        self.refreshUI()
+        refreshUI()
     }
     
     public override func mouseMoved(with event: NSEvent) {
@@ -282,31 +294,31 @@ public class ComponentInputNumber: ComponentBaseXibView {
         
         
     }
-     
+    
     public override func mouseExited(with event: NSEvent) {
         super.mouseExited(with: event)
         
-        if self.properties.isDisabled == false &&
-            self.inputField.isResponder == false{
-            self.properties.state = .normal
+        if properties.isDisabled == false &&
+            inputField.isResponder == false{
+            properties.state = .normal
         }
         
-        self.refreshUI()
+        refreshUI()
     }
     
     public override func mouseDown(with event: NSEvent) {
         super.mouseDown(with: event)
-    
+        
     }
     
     public override func mouseUp(with event: NSEvent) {
         super.mouseUp(with: event)
         
-        if self.properties.isDisabled == false &&
-            self.inputField.isResponder == false {
-            self.properties.state = .normal
+        if properties.isDisabled == false &&
+            inputField.isResponder == false {
+            properties.state = .normal
         }
-        self.refreshUI()
+        refreshUI()
         
     }
 }
@@ -314,14 +326,14 @@ public class ComponentInputNumber: ComponentBaseXibView {
 extension ComponentInputNumber: ComponentTextFieldDelegate {
     
     func componentTextFieldDidResponderChanged(textField: NSTextField) {
-        if self.properties.isDisabled == false {
-            if self.inputField.isResponder {
-                self.properties.state = .pressed
+        if properties.isDisabled == false {
+            if inputField.isResponder {
+                properties.state = .pressed
             } else {
-                self.properties.state = .normal
+                properties.state = .normal
             }
         }
-        self.refreshUI()
+        refreshUI()
         
         
     }
@@ -330,27 +342,32 @@ extension ComponentInputNumber: ComponentTextFieldDelegate {
 extension ComponentInputNumber: ComponentStepperDelegate {
     func componentStepperDidIncrease(stepper: ComponentStepper) {
         if properties.valueType == .intType {
-            let curValue = self.inputField.intValue + 1
-            self.inputField.stringValue = String(curValue)
+            let curValue = inputField.intValue + 1
+            inputField.stringValue = String(curValue)
         } else if properties.valueType == .floatType {
-            let curValue = self.inputField.floatValue + 0.1
-            self.inputField.stringValue = String(format: "%.1f", curValue)
+            let curValue = inputField.floatValue + 0.1
+            inputField.stringValue = String(format: "%.1f", curValue)
         }
         
-        self.inputFieldStringDidChanged()
-        self.reloadStepperViewEnable()
+        inputFieldStringDidChanged()
+        reloadStepperViewEnable()
+        
+        delegate?.componentInputNumberDidIncrease?(inputNumber: self)
     }
     
     func componentStepperDidDecrease(stepper: ComponentStepper) {
         if properties.valueType == .intType {
-            let curValue = self.inputField.intValue
-            self.inputField.stringValue = String(curValue-1)
+            let curValue = inputField.intValue
+            inputField.stringValue = String(curValue-1)
         } else if properties.valueType == .floatType {
-            let curValue = self.inputField.floatValue - 0.1
-            self.inputField.stringValue = String(format: "%.1f", curValue)
+            let curValue = inputField.floatValue - 0.1
+            inputField.stringValue = String(format: "%.1f", curValue)
         }
         
-        self.inputFieldStringDidChanged()
-        self.reloadStepperViewEnable()
+        inputFieldStringDidChanged()
+        reloadStepperViewEnable()
+        
+        delegate?.componentInputNumberDidDecrease?(inputNumber: self)
+        
     }
 }

+ 3 - 3
PDF Office/KMComponentLibrary/KMComponentLibrary/View/InputNumber/ComponentInputNumber.xib

@@ -48,9 +48,9 @@
                                 </constraints>
                                 <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="test" id="ZlC-lQ-2ur"/>
                             </imageView>
-                            <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="wab-bq-yga" customClass="ComponentTextField" customModule="KMComponentLibrary" customModuleProvider="target">
+                            <textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="wab-bq-yga" customClass="ComponentTextField" customModule="KMComponentLibrary" customModuleProvider="target">
                                 <rect key="frame" x="6" y="11" width="142" height="16"/>
-                                <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" alignment="left" title="0.1" placeholderString="Please enter..." id="d5c-b9-YUt">
+                                <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" alignment="left" title="-" placeholderString="Please enter..." id="d5c-b9-YUt">
                                     <font key="font" metaFont="system"/>
                                     <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                                     <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
@@ -77,7 +77,7 @@
                         </constraints>
                     </view>
                 </box>
-                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3CO-a7-I1m">
+                <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3CO-a7-I1m">
                     <rect key="frame" x="-2" y="0.0" width="236" height="16"/>
                     <textFieldCell key="cell" lineBreakMode="clipping" title="Here is the error message description." id="s91-qk-V86">
                         <font key="font" usesAppearanceFont="YES"/>

+ 3 - 0
PDF Office/KMComponentLibrary/KMComponentLibrary/View/InputNumber/ComponentInputNumberProperty.swift

@@ -30,6 +30,7 @@ public class ComponentInputNumberProperty: NSObject {
     public var minSize: Int = 0 //最小值
     public var maxSize: Int = 10 //最大值
     public var text: String? = nil //当前值
+    public var multiState: Bool = false
     public var valueType: inputNumberValueType = .intType
     
     public var propertyInfo = InputNumberPropertyInfo()
@@ -47,6 +48,7 @@ public class ComponentInputNumberProperty: NSObject {
                 minSize: Int = 0,
                 maxSize: Int = 10,
                 text: String? = nil,
+                multiState: Bool = false,
                 valueType: inputNumberValueType = .intType) {
         
         self.size = size
@@ -62,6 +64,7 @@ public class ComponentInputNumberProperty: NSObject {
         self.minSize = minSize
         self.maxSize = maxSize
         self.text = text
+        self.multiState = multiState
         self.valueType = valueType
         
     }

+ 300 - 65
PDF Office/PDF Master/Class/PDFWindowController/PDFListView/CPDFListViewExtension/CPDFListView+Edit.swift

@@ -142,12 +142,8 @@ extension CPDFListView {
     }
     
     //MARK: - 开始&结束编辑
-    func enterEditPDF() {
-        self.updateActiveAnnotations([])
-        self.setNeedsDisplayForVisiblePages()
-        self.commitEditFormText()
-        self.annotationType = .editTextImage
-        
+    func configPDFEditingInfo() {
+ 
         // 设置边框颜色
         self.editingConfig().editingBorderColor = .clear
         
@@ -170,17 +166,6 @@ extension CPDFListView {
         self.editingConfig().editingMouseSelectionBorderDashPattern = [3, 3, 3]
     }
     
-    func exitEditPDF() {
-        self.updateActiveAnnotations([])
-        
-        self.setNeedsDisplayForVisiblePages()
-        
-        self.commitEditFormText()
-        
-        self.commitEditing()
-        
-        self.layoutDocumentView()
-    }
     
     
 }
@@ -211,7 +196,7 @@ extension CPDFListView {
         let areas = self.km_editingTextAreas()
         for area in areas {
             self.setEditSelectionCFont(font, with: area)
-            let cFont = self.editingSelectionCFont(with: area)
+            _ = self.editingSelectionCFont(with: area)
             print("1")
         }
     }
@@ -317,7 +302,7 @@ extension CPDFListView {
                     return
                 }
                 let pdfdocument = CPDFDocument()
-                pdfdocument?.km_insert(image: image, at: 0)
+                let _ = pdfdocument?.km_insert(image: image, at: 0)
                 let savePanel = NSSavePanel()
                 savePanel.allowedFileTypes = ["pdf"]
                 savePanel.beginSheetModal(for: self.window!) { response in
@@ -346,52 +331,52 @@ extension CPDFListView {
                 }
             }
         } else if areas.count > 1 {
-//            let panel = NSOpenPanel()
-//            panel.canChooseFiles = false
-//            panel.canChooseDirectories = true
-//            panel.canCreateDirectories = true
-//            panel.allowsMultipleSelection = false
-//            panel.beginSheetModal(for: NSApp.mainWindow!) { response in
-//                if response == .OK {
-//                    let outputURL = panel.url
-//                    let s = self.listView?.document?.documentURL.lastPathComponent
-//                    let folderPath = (self.listView?.document?.documentURL.deletingPathExtension().lastPathComponent ?? "") + "_extract"
-//                    var filePath = outputURL?.path.stringByAppendingPathComponent(folderPath)
-//                    
-//                    var i = 1
-//                    let testFilePath = filePath
-//                    while FileManager.default.fileExists(atPath: filePath!) {
-//                        filePath = testFilePath! + "\(i)"
-//                        i = i + 1
-//                    }
-//                    try? FileManager.default.createDirectory(atPath: filePath!, withIntermediateDirectories: false, attributes: nil)
-//                    var saveURLs : [URL] = []
-//                    let pageIndex = self.listView?.currentPageIndex ?? 0
-//                    for j in 0 ..< areas.count {
-//                        let documentFileName = self.listView?.document?.documentURL.deletingPathExtension().lastPathComponent ?? ""
-//                        var outPath = filePath!
-//                        outPath = outPath.stringByAppendingPathComponent(documentFileName)
-//                        outPath = outPath + "_page\(pageIndex+1)_\(j+1)"
-//                        outPath = outPath.stringByAppendingPathExtension(format)
-//                        if KMTools.isPDFType(format) {
-//                            if let image = areas[j].thumbnailImage {
-//                                let pdfdocument = CPDFDocument()
-//                                pdfdocument?.km_insert(image: image, at: 0)
-//                                let suc = pdfdocument?.write(toFile: outPath) ?? false
-//                                if suc {
-//                                    saveURLs.append(URL(fileURLWithPath: outPath))
-//                                }
-//                            }
-//                        } else {
-//                            let result = self.listView?.extractImage(with: areas[j], toImagePath: outPath) ?? false
-//                            if result {
-//                                saveURLs.append(URL(fileURLWithPath: outPath))
-//                            }
-//                        }
-//                    }
-//                    NSWorkspace.shared.activateFileViewerSelecting(saveURLs)
-//                }
-//            }
+            let panel = NSOpenPanel()
+            panel.canChooseFiles = false
+            panel.canChooseDirectories = true
+            panel.canCreateDirectories = true
+            panel.allowsMultipleSelection = false
+            panel.beginSheetModal(for: self.window!) { response in
+                if response == .OK {
+                    let outputURL = panel.url
+                    let s = self.document?.documentURL.lastPathComponent
+                    let folderPath = (self.document?.documentURL.deletingPathExtension().lastPathComponent ?? "") + "_extract"
+                    var filePath = outputURL?.path.stringByAppendingPathComponent(folderPath)
+                    
+                    var i = 1
+                    let testFilePath = filePath
+                    while FileManager.default.fileExists(atPath: filePath!) {
+                        filePath = testFilePath! + "\(i)"
+                        i = i + 1
+                    }
+                    try? FileManager.default.createDirectory(atPath: filePath!, withIntermediateDirectories: false, attributes: nil)
+                    var saveURLs : [URL] = []
+                    let pageIndex = self.currentPageIndex
+                    for j in 0 ..< areas.count {
+                        let documentFileName = self.document?.documentURL.deletingPathExtension().lastPathComponent ?? ""
+                        var outPath = filePath!
+                        outPath = outPath.stringByAppendingPathComponent(documentFileName)
+                        outPath = outPath + "_page\(pageIndex+1)_\(j+1)"
+                        outPath = outPath.stringByAppendingPathExtension(format)
+                        if ["pdf"].contains(format) {
+                            if let image = areas[j].thumbnailImage {
+                                let pdfdocument = CPDFDocument()
+                                let _ = pdfdocument?.km_insert(image: image, at: 0)
+                                let suc = pdfdocument?.write(toFile: outPath) ?? false
+                                if suc {
+                                    saveURLs.append(URL(fileURLWithPath: outPath))
+                                }
+                            }
+                        } else {
+                            let result = self.extractImage(with: areas[j], toImagePath: outPath)
+                            if result {
+                                saveURLs.append(URL(fileURLWithPath: outPath))
+                            }
+                        }
+                    }
+                    NSWorkspace.shared.activateFileViewerSelecting(saveURLs)
+                }
+            }
         }
     }
     
@@ -434,4 +419,254 @@ extension CPDFListView {
         }
         self.cropCancelAction()
     }
+    
+    //MARK: - updateFrame
+    func updateArea(_ area: CPDFEditImageArea, newWidth width: CGFloat, _ syncChanged: Bool) {
+        self.editAreaBoundUpdating = true
+        
+        var bounds = area.bounds
+        var width = width
+        if width == 0 {
+            return
+        }
+        let pageBounds = area.page?.bounds ?? .zero
+        if width > NSWidth(pageBounds) {
+            width = NSWidth(pageBounds)
+            let value = String(format: "%.1f", width)
+        }
+        let wOffset = width-bounds.size.width
+        bounds.origin.x = max(0, bounds.origin.x-wOffset * 0.5)
+        bounds.origin.x = min(bounds.origin.x, pageBounds.size.width-width)
+        
+        if syncChanged {
+            var scale: CGFloat = 0
+            if bounds.size.width != 0 {
+                scale = width / bounds.size.width
+            }
+            bounds.size.height *= scale
+            bounds.size.width = width
+        } else {
+            bounds.size.width = width
+        }
+        self.setBoundsEditArea(area, withBounds: bounds)
+         self.editAreaBoundUpdating = false
+        
+    }
+    
+    func updateArea(_ area: CPDFEditImageArea, newHeight height: CGFloat, _ syncChanged: Bool) {
+        self.editAreaBoundUpdating = true
+        var bounds = area.bounds
+        var height = height
+        if height == 0 {
+            return
+        }
+        let pageBounds = area.page?.bounds ?? .zero
+        if height > NSHeight(pageBounds) {
+            height = NSHeight(pageBounds)
+        }
+        let hOffset = height-bounds.size.height
+        bounds.origin.y = max(0, bounds.origin.y-hOffset * 0.5)
+        bounds.origin.y = min(bounds.origin.y, pageBounds.size.height-height)
+        if syncChanged { // 寛高约束
+            var scale: CGFloat = 0
+            if bounds.size.height != 0 {
+                scale = height / bounds.size.height
+            }
+            bounds.size.width *= scale
+            bounds.size.height = height
+        } else {
+            bounds.size.height = height
+        }
+        self.setBoundsEditArea(area, withBounds: bounds)
+        self.editAreaBoundUpdating = false
+        
+    }
+    
+    //MARK: -修改对齐方式
+    func changeEditingAreas(_ alignType: KMPDFActiveFormsAlignType) {
+         let editingAreas = self.km_EditingAreas()
+        
+        if editingAreas.count >= 2 {
+            
+            var zeroRect = NSRect.null
+            var highestRect = NSZeroRect
+            var widthestRect = NSZeroRect
+            
+            let fristArea : CPDFEditArea = editingAreas.first as! CPDFEditArea
+            var leftestRect = fristArea.bounds
+            var rightestRect = fristArea.bounds
+            var topestRect = fristArea.bounds
+            var bottomestRect = fristArea.bounds
+            
+            var leftestArea : CPDFEditArea = fristArea
+            var rightestArea : CPDFEditArea = fristArea
+            var topestArea : CPDFEditArea = fristArea
+            var bottomestArea : CPDFEditArea = fristArea
+            
+            var totalWidth = 0.0
+            var totalHeight = 0.0
+            
+            for i in 0 ... editingAreas.count-1 {
+                let area : CPDFEditArea = editingAreas[i] 
+                zeroRect = zeroRect.union(area.bounds)
+                totalWidth = totalWidth + area.bounds.width
+                totalHeight = totalHeight + area.bounds.height
+                
+                if area.bounds.height > highestRect.height {
+                    highestRect = area.bounds
+                }
+                
+                if area.bounds.width > widthestRect.width {
+                    widthestRect = area.bounds
+                }
+                
+                if leftestRect.minX > area.bounds.minX {
+                    leftestRect = area.bounds
+                    leftestArea = area
+                }
+                
+                if area.bounds.maxX > rightestRect.maxX {
+                    rightestRect = area.bounds
+                    rightestArea = area
+                }
+                
+                if area.bounds.maxY > topestRect.maxY {
+                    topestRect = area.bounds
+                    topestArea = area
+                }
+                
+                if bottomestRect.minY > area.bounds.minY {
+                    bottomestRect = area.bounds
+                    bottomestArea = area
+                }
+            }
+            
+            var resultAreasArray: [Any] = []
+            var newBoundsArray: [String] = []
+            if alignType == .left {
+                for i in 0 ... editingAreas.count-1 {
+                    let areas = editingAreas[i]
+                    var bounds = areas.bounds
+                    bounds.origin.x = zeroRect.origin.x
+                    newBoundsArray.append(NSStringFromRect(bounds))
+                }
+                resultAreasArray = editingAreas
+            } else if alignType == .right {
+                for i in 0 ... editingAreas.count-1 {
+                    let areas = editingAreas[i] 
+                    var bounds = areas.bounds
+                    bounds.origin.x = zeroRect.maxX - bounds.size.width
+                    newBoundsArray.append(NSStringFromRect(bounds))
+                }
+                resultAreasArray = editingAreas
+            } else if alignType == .top {
+                for i in 0 ... editingAreas.count-1 {
+                    let areas = editingAreas[i] 
+                    var bounds = areas.bounds
+                    bounds.origin.y = zeroRect.maxY - bounds.size.height
+                    newBoundsArray.append(NSStringFromRect(bounds))
+                }
+                resultAreasArray = editingAreas
+            } else if alignType == .bottom {
+                for i in 0 ... editingAreas.count-1 {
+                    let areas = editingAreas[i] 
+                    var bounds = areas.bounds
+                    bounds.origin.y = zeroRect.minY
+                    newBoundsArray.append(NSStringFromRect(bounds))
+                }
+                resultAreasArray = editingAreas
+            } else if alignType == .vertical {
+                for i in 0 ... editingAreas.count-1 {
+                    let areas = editingAreas[i] 
+                    var bounds = areas.bounds
+                    bounds.origin.y = highestRect.midY - bounds.height/2
+                    newBoundsArray.append(NSStringFromRect(bounds))
+                }
+                resultAreasArray = editingAreas
+            } else if alignType == .horizontally {
+                for i in 0 ... editingAreas.count-1 {
+                    let areas = editingAreas[i] 
+                    var bounds = areas.bounds
+                    bounds.origin.x = widthestRect.midX - bounds.width/2
+                    newBoundsArray.append(NSStringFromRect(bounds))
+                }
+                resultAreasArray = editingAreas
+            } else if alignType == .disHorizontally {
+                let middleGap = zeroRect.width - leftestRect.width - rightestRect.width
+                let otherAreasTotalWidth = totalWidth - leftestRect.width - rightestRect.width
+                
+                let gap = (middleGap - otherAreasTotalWidth)/CGFloat(editingAreas.count - 1)
+                var areasCopyArray : [CPDFEditArea] = editingAreas 
+                areasCopyArray.sorted(by: { obj1, obj2 in
+                    let area1 = obj1
+                    let area2 = obj2
+                    if area1.bounds.origin.x < area2.bounds.origin.x {
+                        return true
+                    } else {
+                        return false
+                    }
+                })
+                
+                if let index = areasCopyArray.firstIndex(of: leftestArea) {
+                    areasCopyArray.remove(at: index)
+                }
+                
+                if let index = areasCopyArray.firstIndex(of: rightestArea) {
+                    areasCopyArray.remove(at: index)
+                }
+                
+                var leftStartX = leftestRect.maxX + gap
+                for i in 0 ... areasCopyArray.count-1 {
+                    let areas = areasCopyArray[i]
+                    var bounds = areas.bounds
+                    bounds.origin.x = leftStartX
+                    newBoundsArray.append(NSStringFromRect(bounds))
+                    leftStartX = leftStartX + bounds.width + gap
+                }
+                resultAreasArray = areasCopyArray
+            } else if alignType == .disVertical {
+                let middleGap = zeroRect.height - topestRect.height - bottomestRect.height
+                let otherAreasTotalHeight = totalHeight - topestRect.height - bottomestRect.height
+                
+                let gap = (middleGap - otherAreasTotalHeight)/CGFloat(editingAreas.count - 1)
+                var areasCopyArray : [CPDFEditArea] = editingAreas
+                areasCopyArray.sorted(by: { obj1, obj2 in
+                    let area1 = obj1
+                    let area2 = obj2
+                    if area1.bounds.origin.x < area2.bounds.origin.x {
+                        return true
+                    } else {
+                        return false
+                    }
+                })
+                if let index = areasCopyArray.firstIndex(of: topestArea) {
+                    areasCopyArray.remove(at: index)
+                }
+                
+                if let index = areasCopyArray.firstIndex(of: bottomestArea) {
+                    areasCopyArray.remove(at: index)
+                }
+                
+                var bottomStartY = bottomestRect.maxY + gap
+                for i in 0 ... areasCopyArray.count-1 {
+                    let areas = areasCopyArray[i]
+                    var bounds = areas.bounds
+                    bounds.origin.y = bottomStartY
+                    newBoundsArray.append(NSStringFromRect(bounds))
+                    bottomStartY = bottomStartY + bounds.height + gap
+                }
+                resultAreasArray = areasCopyArray
+            }
+            
+            for i in 0 ... resultAreasArray.count-1 {
+                let area : CPDFEditArea = resultAreasArray[i] as! CPDFEditArea
+                if newBoundsArray.count > i {
+                    let boundString = newBoundsArray[i] 
+                    self.setBoundsEditArea(area, withBounds: NSRectFromString(boundString))
+                }
+            }
+            self.setNeedsDisplayForVisiblePages()
+            
+        }
+    }
 }

+ 3 - 7
PDF Office/PDF Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift

@@ -763,7 +763,6 @@ extension KMMainViewController {
     
     @objc func menuItemEditingClick_CutImage(sender: NSMenuItem) {
         
-        self.editPDFHanddler?.cropAction()
     }
     
     @objc func menuItemEditingClick_ReplaceImage(sender: NSMenuItem) {
@@ -3132,7 +3131,7 @@ extension KMMainViewController : KMToolbarViewControllerDelegate {
                 self.enterPageEdit(pages)
             }
         } else if type == .editPDF {
-            self.enterEditPDF()
+            
         } else if type == .Annatiton {
 
         } else if type == .redact {
@@ -3907,10 +3906,7 @@ extension KMMainViewController : KMToolbarViewControllerDelegate {
                     }
                     toolbarItem.isSelected = !toolbarItem.isSelected
                     self.toggleRightPane()
-                    
-                    if self.listView.toolMode == .editPDFToolMode {
-                        self.editPDFHanddler?.rightSideLastState = toolbarItem.isSelected ? .open : .close
-                    }
+                     
                 } else if itemID == KMDocumentRedactToolbarItemIdentifier {
                     self.listView.toolMode = .redactToolMode
                     self.enterRedact()
@@ -4208,7 +4204,7 @@ extension KMMainViewController : KMToolbarViewControllerDelegate {
         } else if toolbarItem.itemIdentifier == KMDocumentScanOCRToolbarItemIdentifier {
             self.showOCRWindow()
         } else if toolbarItem.itemIdentifier == KMDocumentEditToolbarItemIdentifier {
-             self.enterEditPDF()
+             
         } else if toolbarItem.itemIdentifier == KMDocumentFillSginToolbarItemIdentifier {
          } else if toolbarItem.itemIdentifier == KMDocumentFormToolbarItemIdentifier {
          } else if itemId == KMDocumentDigitalSignToolbarItemIdentifier {

+ 1 - 8
PDF Office/PDF Master/Class/PDFWindowController/ViewController/KMMainViewController+UI.swift

@@ -550,14 +550,7 @@ extension KMMainViewController {
     }
      
 }
-
-// MARK: - KMEditImagePropertyViewControllerDelegate
-
-extension KMMainViewController: KMEditImagePropertyViewControllerDelegate {
-    func editImagePropertyViewControllerDidChanged(controller: KMEditImagePropertyViewController, type: KMEditImagePropertyViewControllerChangeType) {
-        self.model.isPDFTextImageEdited = true
-    }
-}
+ 
 
 // MARK: - KMSnapshotWindowControllerDelegate
 

+ 4 - 4
PDF Office/PDF Master/KMClass/KMPDFViewController/EditTool/KMLinkViewController/KMLinkViewController.swift

@@ -43,7 +43,7 @@ import KMComponentLibrary
     
     private var annotation: CPDFLinkAnnotation? = nil
     
-    var multiController: KMNMultiController = KMNMultiController.init() //注释多选界面
+    var multiController: KMNAlignmentController = KMNAlignmentController.init() //注释多选界面
     
     let pageProperty = ComponentTabsProperty(tabsType: .underline_Fill, state: .normal, showIcon: false, title: NSLocalizedString("Page", comment: ""))
     let webProperty = ComponentTabsProperty(tabsType: .underline_Fill, state: .normal, showIcon: false, title: NSLocalizedString("Web", comment: ""))
@@ -311,9 +311,9 @@ extension KMLinkViewController: KMLinkEmailViewDelegate {
     
 }
 
-//MARK: - KMNMultiControllerDelegate
-extension KMLinkViewController: KMNMultiControllerDelegate {
-    func multiControllerDidClick(_ controller: KMNMultiController, _ alignmentType: KMPDFActiveFormsAlignType) {
+//MARK: - KMNAlignmentControllerDelegate
+extension KMLinkViewController: KMNAlignmentControllerDelegate {
+    func alignmentControllerDidClick(_ controller: KMNAlignmentController, _ alignmentType: KMPDFActiveFormsAlignType) {
          
         pdfView?.change(annotations, alignmentType: alignmentType)
         

+ 18 - 6
PDF Office/PDF Master/KMClass/KMPDFViewController/EditTool/KMLinkViewController/Views/KMNLinkMultiController/KMNMultiController.swift

@@ -1,5 +1,5 @@
 //
-//  KMNMultiController.swift
+//  KMNAlignmentController.swift
 //  PDF Reader Pro
 //
 //  Created by Niehaoyu on 2024/10/21.
@@ -8,13 +8,13 @@
 import Cocoa
 import KMComponentLibrary
 
-@objc protocol KMNMultiControllerDelegate: AnyObject {
+@objc protocol KMNAlignmentControllerDelegate: AnyObject {
     
-    @objc optional func multiControllerDidClick(_ controller: KMNMultiController, _ alignmentType: KMPDFActiveFormsAlignType)
+    @objc optional func alignmentControllerDidClick(_ controller: KMNAlignmentController, _ alignmentType: KMPDFActiveFormsAlignType)
  
 }
  
-class KMNMultiController: NSViewController {
+class KMNAlignmentController: NSViewController {
 
     @IBOutlet var contendBox: NSBox!
     @IBOutlet var titleLabel: NSTextField!
@@ -28,7 +28,7 @@ class KMNMultiController: NSViewController {
     @IBOutlet var aligHorizontalXButton: ComponentButton!
     @IBOutlet var aligVerticalYButton: ComponentButton!
     
-    weak open var delegate: KMNMultiControllerDelegate?
+    weak open var delegate: KMNAlignmentControllerDelegate?
     
     override func viewDidLoad() {
         super.viewDidLoad()
@@ -70,6 +70,18 @@ class KMNMultiController: NSViewController {
         }
         
     }
+    
+    func updateMulti(_ enable: Bool) {
+        if enable == true {
+            aligHorizontalXButton.properties.isDisabled = false
+            aligVerticalYButton.properties.isDisabled = false
+        } else {
+            aligHorizontalXButton.properties.isDisabled = true
+            aligVerticalYButton.properties.isDisabled = true
+        }
+        aligHorizontalXButton.reloadData()
+        aligVerticalYButton.reloadData()
+    }
    
     @objc func buttonClicked(_ sender: ComponentButton) {
         var alignType: KMPDFActiveFormsAlignType = .left
@@ -92,7 +104,7 @@ class KMNMultiController: NSViewController {
             alignType = .disVertical
         }
        
-        delegate?.multiControllerDidClick?(self, alignType)
+        delegate?.alignmentControllerDidClick?(self, alignType)
     }
     
 }

+ 2 - 2
PDF Office/PDF Master/KMClass/KMPDFViewController/EditTool/KMLinkViewController/Views/KMNLinkMultiController/KMNMultiController.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="KMNMultiController">
+        <customObject id="-2" userLabel="File's Owner" customClass="KMNAlignmentController" customModule="PDF_Reader_Pro" customModuleProvider="target">
             <connections>
                 <outlet property="aligBottomButton" destination="c5m-oJ-Mrg" id="cTD-cq-fos"/>
                 <outlet property="aligHorizontalXButton" destination="xex-s9-yRv" id="u2j-y5-9is"/>
@@ -36,7 +36,7 @@
                             <customView translatesAutoresizingMaskIntoConstraints="NO" id="uts-mo-cZM">
                                 <rect key="frame" x="0.0" y="72" width="232" height="40"/>
                                 <subviews>
-                                    <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="5ez-oE-1Ci">
+                                    <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="5ez-oE-1Ci">
                                         <rect key="frame" x="-2" y="12" width="37" height="16"/>
                                         <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="sSS-VW-cXZ">
                                             <font key="font" usesAppearanceFont="YES"/>

+ 171 - 33
PDF Office/PDF Master/KMClass/KMPDFViewController/KMMainViewController.swift

@@ -76,9 +76,7 @@ import KMComponentLibrary
     
     //右边
     var rightSideController: KMRightSideController?
-    
-    var editPDFHanddler: KMEditPDfHanddler?
-    
+     
     //MARK: - 旧代码,有需要用到的拿出来,写好备注
     
     @IBOutlet weak var leftView: NSView!
@@ -268,7 +266,6 @@ import KMComponentLibrary
         self.listView.delegate = nil
         self.listView.document?.delegate = nil
         
-        self.editPDFHanddler?.clearData()
         self.removeEventMonitor()
         self.removeKeyEventMonitor()
     }
@@ -349,36 +346,52 @@ import KMComponentLibrary
     
     func updatePDFViewAnnotationMode() {
         let toolbarMode = viewManager.toolMode
-        
-        listView.toolMode = .noteToolMode
-        
         let subToolMode = viewManager.subToolMode
         
         if toolbarMode == .None {
             listView.annotationType = .unkown
             
+            listView.toolMode = .noteToolMode
+            
         } else if toolbarMode == .Markup {
+            listView.toolMode = .noteToolMode
             
         } else if toolbarMode == .Edit {
-            listView.toolMode = .editPDFToolMode
-            if editPDFHanddler == nil {
-                editPDFHanddler = KMEditPDfHanddler()
-            }
-            editPDFHanddler?.listView = self.listView
-            
-            
             if subToolMode == .None {
-                self.listView.exitEditPDF()
+                if listView.toolMode != .editPDFToolMode {
+                    listView.toolMode = .editPDFToolMode
+                    listView.configPDFEditingInfo()
+                }
+                listView.annotationType = .editTextImage
+                listView.setShouAddEdit([])
+                listView.change([.text, .image])
+                
             } else if subToolMode == .Edit_text {
-                 self.listView.enterEditPDF()
+                if listView.toolMode != .editPDFToolMode {
+                    listView.toolMode = .editPDFToolMode
+                    listView.configPDFEditingInfo()
+                }
+                listView.annotationType = .addText
+                listView.setShouAddEdit([.text])
+                listView.change(.text)
+                 
             } else if subToolMode == .Edit_Image {
-                 self.listView.enterEditPDF()
+                if listView.toolMode != .editPDFToolMode {
+                    listView.toolMode = .editPDFToolMode
+                    listView.configPDFEditingInfo()
+                }
+                listView.annotationType = .addImage
+                listView.setShouAddEdit([.image])
+                listView.change(.image)
+                 
             } else if subToolMode == .Edit_Link {
                 listView.toolMode = .noteToolMode
                 
                 listView.annotationType = .link
                 
             }
+             
+            
         } else if toolbarMode == .Form {
             
         } else if toolbarMode == .Fill {
@@ -1978,7 +1991,7 @@ extension KMMainViewController: CPDFViewDelegate,CPDFListViewDelegate {
     //MARK: -编辑模块
     func pdfViewEditingSelectionDidChanged(_ pdfView: CPDFView!) {
         // 文本区块 选中文本已经变化
-        self.editPDFHanddler?.pdfViewEditingSelectionDidChanged(pdfView)
+
     }
     
     func pdfViewEditingAreaDidChanged(_ pdfView: CPDFView!) {
@@ -1998,10 +2011,142 @@ extension KMMainViewController: CPDFViewDelegate,CPDFListViewDelegate {
     
     //编辑PDF 创建图片区域回调
     func pdfViewEditingAddImageArea(_ pdfView: CPDFView!, add page: CPDFPage!, add rect: CGRect) {
-
+        if (pdfView as! CPDFListView).isEditImage {
+            
+            return
+        }
+        
+        if rect.size.width < 5 && rect.size.height < 5 {
+            pdfView.updateEditing([])
+            
+            return
+        }
+        
+        let panel = NSOpenPanel()
+        panel.allowsMultipleSelection = false
+        panel.allowedFileTypes = ["png","jpg"]
+        panel.beginSheetModal(for: NSApp.mainWindow!) { response in
+            if response == .OK {
+                var filePath = panel.url?.path
+                let image = NSImage.init(contentsOf: panel.url!)
+                //图片自适应范围
+                if image != nil {
+                    var imageRect = rect
+                    let imageSize = image!.size
+                    var previewSize = rect.size
+                    var isChangeSize = false
+                    if previewSize.width == 0 && previewSize.height == 0 {
+                        previewSize = CGSize(width: 500, height: 500)
+                        isChangeSize = true
+                    }
+                    
+                    var scale = min(previewSize.width / imageSize.width, previewSize.height / imageSize.height)
+                    if scale < 1 { // 大于 500
+                        
+                    } else {
+                        let wh = max(imageSize.width, imageSize.height)
+                        if wh >= 72 {
+                            scale = min(scale, 1)
+                        } else {
+                            scale = min(72 / imageSize.width, 72 / imageSize.height)
+                        }
+                    }
+                    
+                    let newSize = CGSize(width: imageSize.width * scale, height: imageSize.height * scale)
+                    
+                    if isChangeSize {
+                        imageRect.origin.x = imageRect.origin.x - newSize.width / 2
+                        imageRect.origin.y = imageRect.origin.y - newSize.height / 2
+                    } else {
+                        imageRect.origin.x = imageRect.origin.x + imageRect.width / 2 - newSize.width / 2
+                        imageRect.origin.y = imageRect.origin.y + imageRect.height / 2 - newSize.height / 2
+                    }
+                    
+                    imageRect.size = newSize
+                    let limitWidth = 1920.0
+                    if imageSize.width > limitWidth || imageSize.height > limitWidth {
+                        filePath = KMImageOptimization.needCompressImageLosslessly(image: image!,
+                                                                                   targetSize: CGSize(width: limitWidth, height: limitWidth),
+                                                                                   maxSizeInBytes: 1024 * 1024 * 5,
+                                                                                   targetCompression: 1.0)
+                    }
+                    
+                    //自适应page
+                    let pageRect = self.listView.currentPage().bounds ?? .zero
+                    if imageRect.width > pageRect.width ||
+                        imageRect.height > pageRect.height {
+                        let pageScale = min(pageRect.width / imageSize.width, pageRect.height / imageSize.height)
+                        imageRect = CGRect(x: imageRect.origin.x,
+                                           y: imageRect.origin.y,
+                                           width: imageRect.width * pageScale,
+                                           height: imageRect.height * pageScale)
+                    }
+                    
+                    if imageRect.origin.x < 0 {
+                        imageRect.origin.x = 5
+                    }
+                    
+                    if imageRect.origin.y < 0 {
+                        imageRect.origin.y = 5
+                    }
+                    
+                    if imageRect.origin.x + imageRect.width > pageRect.width ||
+                        imageRect.origin.y + imageRect.height > pageRect.height {
+                        let offsetX = imageRect.origin.x + imageRect.width - pageRect.width
+                        let offsetY = imageRect.origin.y + imageRect.height - pageRect.height
+                        
+                        imageRect.origin.x = imageRect.origin.x - offsetX - 5
+                        imageRect.origin.y = imageRect.origin.y - offsetY - 5
+                    }
+                    DispatchQueue.main.async {
+                        self.listView.createImagePath(filePath, rect: imageRect, page: pdfView.currentPage())
+                    }
+                }
+            }
+        }
     }
     
     func pdfViewEditingAddTextArea(_ pdfView: CPDFView!, add page: CPDFPage!, add rect: CGRect) {
+        
+        if rect.size.width < 5 && rect.size.height < 5 {
+            let areas = self.listView.km_EditingAreas()
+            if let area = areas.last {
+                if let data = area as? CPDFEditTextArea {
+                    if let str = data.editTextAreaString(), str.isEmpty {
+                        self.listView.remove(with: area)
+                    } else {
+                        self.listView.updateEditing([])
+                    }
+                }
+            }
+            return
+        }
+        
+        var newRect = rect
+        if rect.size.equalTo(.zero) {
+            newRect = CGRect(x: rect.origin.x, y: rect.origin.y - 12, width: 20, height: 12)
+        } else {
+            newRect = CGRect(x: rect.origin.x, y: rect.origin.y + rect.size.height - 12, width: rect.size.width, height: 12)
+        }
+        
+        let model = KMEditPDFTextManager.manager.fetchUserDefaultData(type: .commonly)
+        let fontSize = model.fontSize
+        let fontColor = model.color
+        let fontAlign = model.alignment
+        NSColorPanel.shared.color = fontColor
+        
+        let cfont = CPDFFont(familyName: model.fontName, fontStyle: model.fontStyle)
+        let fontNameZ = CPDFFont.convertAppleFont(cfont)
+        let font = NSFont(name: fontNameZ ?? "Helvetica", size: fontSize)
+        
+        let attri = CEditAttributes()
+        attri.font = font!
+        attri.fontColor = fontColor
+        attri.alignment = fontAlign
+        attri.isBold = model.bold
+        attri.isItalic = model.italic
+        
+        self.listView.createStringBounds(newRect, with: attri, page: page)
 
     }
     
@@ -2040,7 +2185,7 @@ extension KMMainViewController: CPDFViewDelegate,CPDFListViewDelegate {
     }
     
     func pdfViewEditingDoubleClick(_ pdfView: CPDFView!, imageArea editArea: CPDFEditArea!) {
-        self.editPDFHanddler?.pdfViewEditingDoubleClick(pdfView, imageArea: editArea)
+
     }
     
     func pdfListViewKeyDownIsContinue(_ pdfListView: CPDFListView!, theEvent: NSEvent!) -> Bool {
@@ -2959,7 +3104,6 @@ extension KMMainViewController {
             self.removeEventMonitor()
         }
         
-        self.editPDFHanddler?.hiddenWindows()
     }
     
     func viewWillLayoutFunction() {
@@ -3572,7 +3716,6 @@ extension KMMainViewController {
         
         
         
-        self.editPDFHanddler?.clearData()
         
         let controller = KMPDFEditViewController(self.listView.document)
         
@@ -3642,12 +3785,7 @@ extension KMMainViewController {
     open func hasEnterPageEdit() -> Bool {
         return self.getPDFEditController() != nil
     }
-    
-    // MARK: - Edit PDF
-    
-    func enterEditPDF() {
-        
-    }
+  
     
     // MARK: - 数字签名
     
@@ -4320,7 +4458,7 @@ extension KMMainViewController {
             if event.keyCode == 53 {
                 if let data = self?.interactionMode, data == .presentation { // 幻灯片模式下
                     self?.exitFullScreen()
-                    return nil
+                    return event
                 }
                 if self?.listView.toolMode == .editPDFToolMode {
                     if self != nil {
@@ -4361,14 +4499,14 @@ extension KMMainViewController {
             } else {
                 if let data = self?.interactionMode, data == .presentation { // 幻灯片模式下
                     self?.listView.keyDown(with: event)
-                    return nil
+                    return event
                 } else {
                     let cmd = event.modifierFlags.contains(.command)
                     let shift = event.modifierFlags.contains(.shift)
                     if event.keyCode == 6 { // z
-                        let editPDFIng = self?.editPDFHanddler?.isEditing ?? false
+                        let editPDFIng = self?.listView.isEditing() ?? false
                         if cmd && shift { // 恢复
-                            let can = self?.editPDFHanddler?.listView?.canEditTextRedo() ?? false
+                            let can = self?.listView.canEditTextRedo() ?? false
                             if can == false {
                                 return event
                             }
@@ -4377,7 +4515,7 @@ extension KMMainViewController {
                                 
                             }
                         } else if cmd { // 撤回
-                            let can = self?.editPDFHanddler?.listView?.canEditTextUndo() ?? false
+                            let can = self?.listView.canEditTextUndo() ?? false
                             if can == false {
                                 return event
                             }

+ 149 - 72
PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideController/Views/EditPDF/KMEditImageController.swift

@@ -18,8 +18,7 @@ class KMEditImageController: NSViewController {
     @IBOutlet var sizeSyncButton: ComponentButton!
     @IBOutlet var sizeWidthInput: ComponentInputNumber!
     @IBOutlet var sizeHeightInput: ComponentInputNumber!
-    
-    
+     
     @IBOutlet var rotateBGView: NSView!
     @IBOutlet var rotateLabel: NSTextField!
     @IBOutlet var rotateSelect: ComponentSelect!
@@ -35,11 +34,15 @@ class KMEditImageController: NSViewController {
     
     @IBOutlet var cropButton: ComponentButton!
     @IBOutlet var replaceButton: ComponentButton!
-    @IBOutlet var ExtrackButton: ComponentButton!
+    @IBOutlet var extractButton: ComponentButton!
+    @IBOutlet var extractBtnTopConst: NSLayoutConstraint!
     
+    @IBOutlet var alignmentBGView: NSView!
+     
     private var syncChangeBounds: Bool = true //同步修改宽高
     
     private var groupView: ComponentGroup!
+    private var alignmentController: KMNAlignmentController?
     
     var pdfView: CPDFListView? {
         didSet {
@@ -47,7 +50,7 @@ class KMEditImageController: NSViewController {
         }
     }
     
-    var currentArea: CPDFEditImageArea?
+    var areas: [CPDFEditImageArea] = []
     
     //MARK: - func
     override func viewDidAppear() {
@@ -160,24 +163,74 @@ class KMEditImageController: NSViewController {
         replaceButton.properties = ComponentButtonProperty(type: .default_tertiary, size: .s, buttonText: KMLocalizedString("Replace"), keepPressState: false)
         replaceButton.setTarget(self, action: #selector(buttonClicked(_:)))
         
-        ExtrackButton.properties = ComponentButtonProperty(type: .default_tertiary, size: .s, buttonText: KMLocalizedString("Extract"), keepPressState: false)
-        ExtrackButton.setTarget(self, action: #selector(buttonClicked(_:)))
+        extractButton.properties = ComponentButtonProperty(type: .default_tertiary, size: .s, buttonText: KMLocalizedString("Extract"), keepPressState: false)
+        extractButton.setTarget(self, action: #selector(buttonClicked(_:)))
         
+        if alignmentController == nil {
+            alignmentController = KMNAlignmentController.init()
+        }
+        alignmentController?.view.frame = alignmentBGView.bounds
+        alignmentController?.view.autoresizingMask = [.width, .height]
+        alignmentController?.delegate = self
+        alignmentBGView.addSubview(alignmentController!.view)
         
     }
     
     func reloadData() {
         
-        let areas = pdfView?.km_editingImageAreas() ?? []
+        areas = pdfView?.km_editingImageAreas() ?? []
+        
         if areas.count == 0 {
-            currentArea = nil
+            
         } else if areas.count == 1 {
-            currentArea = areas.first
-        } else if areas.count == 2 {
-            currentArea = nil
+            cropButton.isHidden = false
+            replaceButton.isHidden = false
+            extractBtnTopConst.constant = 112
+            
+            alignmentBGView.isHidden = true
+            
+        } else if areas.count > 1 {
+            cropButton.isHidden = true
+            replaceButton.isHidden = true
+            extractBtnTopConst.constant = 16
+            
+            alignmentBGView.isHidden = false
+            if areas.count == 2 {
+                alignmentController?.updateMulti(false)
+            } else {
+                alignmentController?.updateMulti(true)
+            }
         }
         
-        if let area = currentArea {
+        sizeWidthInput.properties.isDisabled = pdfView?.isEditImage == true
+        sizeHeightInput.properties.isDisabled = pdfView?.isEditImage == true
+        sizeSyncButton.properties.isDisabled = pdfView?.isEditImage == true
+         rotateSelect.properties.isDisabled = pdfView?.isEditImage == true
+        
+        rotateLeftButton.properties.isDisabled = pdfView?.isEditImage == true
+        rotateLeftButton.reloadData()
+        
+        rotateRightButton.properties.isDisabled = pdfView?.isEditImage == true
+        rotateRightButton.reloadData()
+        
+        flipVerticalButton.properties.isDisabled = pdfView?.isEditImage == true
+        flipVerticalButton.reloadData()
+        
+        flipHorizontalButton.properties.isDisabled = pdfView?.isEditImage == true
+        flipHorizontalButton.reloadData()
+        
+        opacitySlider.properties.isDisabled = pdfView?.isEditImage == true
+        opacitySlider.reloadData()
+        
+        opacitySelect.properties.isDisabled = pdfView?.isEditImage == true
+        
+        replaceButton.properties.isDisabled = pdfView?.isEditImage == true
+        replaceButton.reloadData()
+         
+        extractButton.properties.isDisabled = pdfView?.isEditImage == true
+        extractButton.reloadData()
+        
+        if let area = areas.first {
             //Size
             if syncChangeBounds {
                 sizeSyncButton.properties.state = .pressed
@@ -186,17 +239,30 @@ class KMEditImageController: NSViewController {
             }
             sizeSyncButton.reloadData()
             
-            let areaFrame = area.bounds
-            sizeWidthInput.properties.text = String(format: "%.1f", areaFrame.size.width)
+            if areas.count > 1 {
+                sizeWidthInput.properties.text = "-"
+                sizeWidthInput.properties.multiState = true
+                
+                sizeHeightInput.properties.text = "-"
+                sizeHeightInput.properties.multiState = true
+            } else {
+                let areaFrame = area.bounds
+                sizeWidthInput.properties.text = String(format: "%.1f", areaFrame.size.width)
+                sizeWidthInput.properties.multiState = false
+                
+                sizeHeightInput.properties.text = String(format: "%.1f", areaFrame.size.height)
+                sizeHeightInput.properties.multiState = false
+            }
+            sizeWidthInput.properties.maxSize = Int(area.page.bounds.size.width)
+            sizeHeightInput.properties.maxSize = Int(area.page.bounds.size.height)
+
             sizeWidthInput.reloadData()
-            
-            sizeHeightInput.properties.text = String(format: "%.1f", areaFrame.size.height)
             sizeHeightInput.reloadData()
             
             //Rotate
             if let rotates = pdfView?.km_editAreasRotates([area]) {
                 if rotates.count > 0 {
-                    var rotate = rotates.first ?? 1
+                    let rotate = rotates.first ?? 1
                     
                     rotateSelect.properties.text = String(format: "%.0f%@", rotate, "°")
                     rotateSelect.reloadData()
@@ -219,7 +285,6 @@ class KMEditImageController: NSViewController {
                 }
             }
             
-            
             if pdfView?.isEditImage == true {
                 cropButton.properties.buttonText = KMLocalizedString("Cancel Crop")
             } else {
@@ -274,7 +339,7 @@ class KMEditImageController: NSViewController {
                     }
                 }
             }
-        } else if sender == ExtrackButton {
+        } else if sender == extractButton {
             extractAction()
         }
         
@@ -290,7 +355,6 @@ class KMEditImageController: NSViewController {
         for (i, value) in items {
             let properties_Menuitem: ComponentMenuitemProperty = ComponentMenuitemProperty(multipleSelect: false,
                                                                                            itemSelected: false,
-                                                                                           isDisabled: false,
                                                                                            keyEquivalent: nil,
                                                                                            text: KMLocalizedString(i),
                                                                                            identifier: value)
@@ -301,9 +365,9 @@ class KMEditImageController: NSViewController {
             groupView = ComponentGroup.createFromNib(in: ComponentLibrary.shared.componentBundle())
         }
         groupView.groupDelegate = self
-        groupView?.frame = CGRectMake(0, 0, ExtrackButton.frame.size.width, 36*3+8)
+        groupView?.frame = CGRectMake(0, 0, extractButton.frame.size.width, 36*3+8)
         groupView.updateGroupInfo(menuItemArr)
-        if let point: CGPoint = ExtrackButton.superview?.convert(ExtrackButton.frame.origin, to: self.view.window?.contentView) {
+        if let point: CGPoint = extractButton.superview?.convert(extractButton.frame.origin, to: self.view.window?.contentView) {
             groupView.showWithPoint(CGPoint(x: point.x, y: point.y - CGRectGetHeight(groupView.frame)-4), relativeTo: self.view)
         }
     }
@@ -317,69 +381,73 @@ class KMEditImageController: NSViewController {
     
 }
 
+//MARK: - ComponentInputNumberDelegate
 extension KMEditImageController: ComponentInputNumberDelegate {
     func componentInputNumberDidValueChanged(inputNumber: ComponentInputNumber?) {
+        if areas.count > 1 || areas.count == 0 {
+            return
+        }
+        
+        var textValue = inputNumber?.properties.text?.stringToCGFloat() ?? 0
         if inputNumber == sizeWidthInput {
             let areas = self.pdfView?.km_editingImageAreas() ?? []
-            self.pdfView?.editAreaBoundUpdating = true
             for area in areas {
-                var bounds = area.bounds
-                var width = inputNumber?.properties.text?.stringToCGFloat() ?? 0
-                if width == 0 {
-                    return
-                }
-                let pageBounds = area.page?.bounds ?? .zero
-                if width > NSWidth(pageBounds) {
-                    width = NSWidth(pageBounds)
-                    let value = String(format: "%.1f", width)
-                }
-                let wOffset = width-bounds.size.width
-                bounds.origin.x = max(0, bounds.origin.x-wOffset * 0.5)
-                bounds.origin.x = min(bounds.origin.x, pageBounds.size.width-width)
-                
-                if syncChangeBounds {
-                    var scale: CGFloat = 0
-                    if bounds.size.width != 0 {
-                        scale = width / bounds.size.width
-                    }
-                    bounds.size.height *= scale
-                    bounds.size.width = width
-                } else {
-                    bounds.size.width = width
-                }
-                self.pdfView?.setBoundsEditArea(area, withBounds: bounds)
+                pdfView?.updateArea(area, newWidth: textValue, syncChangeBounds)
             }
         } else if inputNumber == sizeHeightInput {
             let areas = self.pdfView?.km_editingImageAreas() ?? []
-            self.pdfView?.editAreaBoundUpdating = true
             for area in areas {
-                var bounds = area.bounds
-                var height = inputNumber?.properties.text?.stringToCGFloat() ?? 0
-                if height == 0 {
-                    return
-                }
-                let pageBounds = area.page?.bounds ?? .zero
-                if height > NSHeight(pageBounds) {
-                    height = NSHeight(pageBounds)
-                }
-                let hOffset = height-bounds.size.height
-                bounds.origin.y = max(0, bounds.origin.y-hOffset * 0.5)
-                bounds.origin.y = min(bounds.origin.y, pageBounds.size.height-height)
-                if syncChangeBounds { // 寛高约束
-                    var scale: CGFloat = 0
-                    if bounds.size.height != 0 {
-                        scale = height / bounds.size.height
-                    }
-                    bounds.size.width *= scale
-                    bounds.size.height = height
-                } else {
-                    bounds.size.height = height
-                }
-                self.pdfView?.setBoundsEditArea(area, withBounds: bounds)
+                pdfView?.updateArea(area, newHeight: textValue, syncChangeBounds)
+            }
+         }
+        reloadData()
+    }
+    
+    func componentInputNumberDidIncrease(inputNumber: ComponentInputNumber?) {
+        if areas.count == 1 || areas.count == 0 {
+            return
+        }
+        //只处理多选状态
+        var textValue = inputNumber?.properties.text?.stringToCGFloat() ?? 0
+        if inputNumber == sizeWidthInput {
+            let areas = self.pdfView?.km_editingImageAreas() ?? []
+            for area in areas {
+                textValue = area.bounds.size.width + 1
+                pdfView?.updateArea(area, newWidth: textValue, syncChangeBounds)
+            }
+        } else if inputNumber == sizeHeightInput {
+            let areas = self.pdfView?.km_editingImageAreas() ?? []
+            for area in areas {
+                textValue = area.bounds.size.height + 1
+                pdfView?.updateArea(area, newHeight: textValue, syncChangeBounds)
+            }
+        }
+        reloadData()
+    }
+    
+    func componentInputNumberDidDecrease(inputNumber: ComponentInputNumber?) {
+        if areas.count == 1 || areas.count == 0 {
+            return
+        }
+        //只处理多选状态
+        var textValue = inputNumber?.properties.text?.stringToCGFloat() ?? 0
+        if inputNumber == sizeWidthInput {
+            let areas = self.pdfView?.km_editingImageAreas() ?? []
+            for area in areas {
+                textValue = area.bounds.size.width - 1
+                pdfView?.updateArea(area, newWidth: textValue, syncChangeBounds)
+            }
+        } else if inputNumber == sizeHeightInput {
+            let areas = self.pdfView?.km_editingImageAreas() ?? []
+            for area in areas {
+                textValue = area.bounds.size.height - 1
+                pdfView?.updateArea(area, newHeight: textValue, syncChangeBounds)
             }
         }
         reloadData()
     }
+    
+    
 }
 
 //MARK: - ComponentSelectDelegate
@@ -461,3 +529,12 @@ extension KMEditImageController: ComponentGroupDelegate {
     }
     
 }
+
+
+//MARK: - KMNAlignmentControllerDelegate
+extension KMEditImageController: KMNAlignmentControllerDelegate {
+    func alignmentControllerDidClick(_ controller: KMNAlignmentController, _ alignmentType: KMPDFActiveFormsAlignType) {
+        pdfView?.changeEditingAreas(alignmentType)
+        
+    }
+}

+ 17 - 6
PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideController/Views/EditPDF/KMEditImageController.xib

@@ -8,9 +8,11 @@
     <objects>
         <customObject id="-2" userLabel="File's Owner" customClass="KMEditImageController" customModule="PDF_Reader_Pro" customModuleProvider="target">
             <connections>
-                <outlet property="ExtrackButton" destination="CkA-vp-ac0" id="IOn-Jb-qIk"/>
+                <outlet property="alignmentBGView" destination="Ord-eK-7hC" id="peK-ys-71M"/>
                 <outlet property="contendView" destination="5d4-9i-VqM" id="Zz9-Aa-SrJ"/>
                 <outlet property="cropButton" destination="V5t-7B-Xe1" id="kBN-y7-R9f"/>
+                <outlet property="extractBtnTopConst" destination="0j8-h3-LP5" id="iF1-HW-agP"/>
+                <outlet property="extractButton" destination="CkA-vp-ac0" id="c5y-cS-4xd"/>
                 <outlet property="flipHorizontalButton" destination="JYo-PF-eR4" id="vQO-zY-WrV"/>
                 <outlet property="flipVerticalButton" destination="Gx1-06-lSN" id="GFE-Nk-kQo"/>
                 <outlet property="opacityBGView" destination="7ge-14-THB" id="byg-j9-eEx"/>
@@ -301,6 +303,13 @@
                                 <constraint firstAttribute="width" constant="232" id="S7H-HD-BWs"/>
                             </constraints>
                         </customView>
+                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="UTd-IX-9gP" customClass="ComponentButton" customModule="KMComponentLibrary">
+                            <rect key="frame" x="12" y="355" width="232" height="32"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="232" id="CZk-DA-weR"/>
+                                <constraint firstAttribute="height" constant="32" id="WWS-wJ-59r"/>
+                            </constraints>
+                        </customView>
                         <customView translatesAutoresizingMaskIntoConstraints="NO" id="CkA-vp-ac0" customClass="ComponentButton" customModule="KMComponentLibrary">
                             <rect key="frame" x="12" y="307" width="232" height="32"/>
                             <constraints>
@@ -308,21 +317,22 @@
                                 <constraint firstAttribute="width" constant="232" id="kHb-FV-MRk"/>
                             </constraints>
                         </customView>
-                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="UTd-IX-9gP" customClass="ComponentButton" customModule="KMComponentLibrary">
-                            <rect key="frame" x="12" y="355" width="232" height="32"/>
+                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="Ord-eK-7hC">
+                            <rect key="frame" x="12" y="275" width="232" height="112"/>
                             <constraints>
-                                <constraint firstAttribute="width" constant="232" id="CZk-DA-weR"/>
-                                <constraint firstAttribute="height" constant="32" id="WWS-wJ-59r"/>
+                                <constraint firstAttribute="width" constant="232" id="Yy0-8Z-Sba"/>
+                                <constraint firstAttribute="height" constant="112" id="dDA-XT-PfV"/>
                             </constraints>
                         </customView>
                     </subviews>
                     <constraints>
+                        <constraint firstItem="CkA-vp-ac0" firstAttribute="top" secondItem="gdP-34-FsW" secondAttribute="bottom" constant="112" id="0j8-h3-LP5"/>
                         <constraint firstItem="Pzv-Qn-Qjl" firstAttribute="top" secondItem="5d4-9i-VqM" secondAttribute="top" id="5XC-B1-7y4"/>
                         <constraint firstItem="V5t-7B-Xe1" firstAttribute="centerX" secondItem="5d4-9i-VqM" secondAttribute="centerX" id="BTV-ja-7Uc"/>
                         <constraint firstItem="7ge-14-THB" firstAttribute="centerX" secondItem="5d4-9i-VqM" secondAttribute="centerX" id="Dyb-ea-rmC"/>
+                        <constraint firstItem="Ord-eK-7hC" firstAttribute="top" secondItem="V5t-7B-Xe1" secondAttribute="bottom" constant="16" id="TVh-Nv-jx7"/>
                         <constraint firstItem="Pzv-Qn-Qjl" firstAttribute="centerX" secondItem="5d4-9i-VqM" secondAttribute="centerX" id="WwA-IT-SmF"/>
                         <constraint firstItem="gdP-34-FsW" firstAttribute="centerX" secondItem="5d4-9i-VqM" secondAttribute="centerX" id="Xnk-KO-7Bg"/>
-                        <constraint firstItem="CkA-vp-ac0" firstAttribute="top" secondItem="UTd-IX-9gP" secondAttribute="bottom" constant="16" id="e00-zP-hFu"/>
                         <constraint firstItem="pRo-Pb-Vwc" firstAttribute="top" secondItem="Pzv-Qn-Qjl" secondAttribute="bottom" constant="16" id="ivK-cd-DUh"/>
                         <constraint firstItem="UTd-IX-9gP" firstAttribute="centerX" secondItem="5d4-9i-VqM" secondAttribute="centerX" id="lAL-Hb-VMQ"/>
                         <constraint firstItem="pRo-Pb-Vwc" firstAttribute="centerX" secondItem="5d4-9i-VqM" secondAttribute="centerX" id="lEW-2D-6rT"/>
@@ -331,6 +341,7 @@
                         <constraint firstItem="V5t-7B-Xe1" firstAttribute="top" secondItem="gdP-34-FsW" secondAttribute="bottom" constant="16" id="sZ3-Bm-nOm"/>
                         <constraint firstItem="7ge-14-THB" firstAttribute="top" secondItem="pRo-Pb-Vwc" secondAttribute="bottom" constant="16" id="u3C-T8-X8Z"/>
                         <constraint firstItem="CkA-vp-ac0" firstAttribute="centerX" secondItem="5d4-9i-VqM" secondAttribute="centerX" id="uQg-UM-9Al"/>
+                        <constraint firstItem="Ord-eK-7hC" firstAttribute="centerX" secondItem="5d4-9i-VqM" secondAttribute="centerX" id="wHl-48-1YR"/>
                     </constraints>
                 </view>
             </subviews>

文件差異過大導致無法顯示
+ 0 - 1201
PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideController/Views/EditPDF/KMEditImagePropertyViewController.swift


+ 0 - 451
PDF Office/PDF Master/KMClass/KMPDFViewController/RightSideController/Views/EditPDF/KMEditImagePropertyViewController.xib

@@ -1,451 +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="KMEditImagePropertyViewController" customModule="PDF_Reader_Pro" customModuleProvider="target">
-            <connections>
-                <outlet property="alignmentView" destination="3AP-7h-Nfc" id="loc-yn-FkQ"/>
-                <outlet property="alignmentViewTopConstraint" destination="Vog-68-6WN" id="Qqk-9Z-zrD"/>
-                <outlet property="backgroundView" destination="wc3-Ma-X7s" id="OBB-N0-9wC"/>
-                <outlet property="buttonBox" destination="9za-vG-ihA" id="m1z-pN-ORp"/>
-                <outlet property="buttonBoxHeight" destination="q4K-hM-hqe" id="4Tg-z0-d6c"/>
-                <outlet property="cancelBox" destination="vr8-ml-OC0" id="kUB-8H-yo0"/>
-                <outlet property="confirmBox" destination="xPh-yv-2Ch" id="sdk-Wa-ZAR"/>
-                <outlet property="cropBox" destination="AAt-gQ-hOo" id="MP2-gY-56R"/>
-                <outlet property="exportBox" destination="8lZ-Kd-hWi" id="36X-Q5-M0Z"/>
-                <outlet property="hTextFieldItemView" destination="x7h-ZX-NVn" id="Wc0-I9-yoe"/>
-                <outlet property="headerBox" destination="6yW-By-Sg9" id="7g9-Ja-zZN"/>
-                <outlet property="headerBoxHeight" destination="2Nc-Uj-EEg" id="g90-0Y-Ajz"/>
-                <outlet property="leftRotateBox" destination="AY8-Zu-th7" id="48R-Eo-XLL"/>
-                <outlet property="noBackgroundView" destination="2cv-Bg-EQU" id="cnu-G8-tbS"/>
-                <outlet property="noImageView" destination="H4i-ha-vev" id="gD9-lE-GQS"/>
-                <outlet property="noSubtitleLabel" destination="xT8-m7-QlU" id="jpw-rp-mZf"/>
-                <outlet property="noTitleLabel" destination="cBS-ZD-gNe" id="CNC-wX-q31"/>
-                <outlet property="opacityBox" destination="9ig-7b-xDq" id="Nlc-yf-4BI"/>
-                <outlet property="opacityBoxBottomMaginConstraint" destination="agw-2V-YyY" id="rjO-EG-goy"/>
-                <outlet property="opacityBoxHeight" destination="pQN-DI-xiY" id="xvF-Br-Df7"/>
-                <outlet property="opacityBoxTopConstraint" destination="pMH-jX-v3E" id="0oh-Dc-ukD"/>
-                <outlet property="opacitySlider" destination="Z0O-zt-cBQ" id="lW1-SW-S3f"/>
-                <outlet property="opacityTitleLabel" destination="XPI-yz-g9u" id="NH7-jW-9Vn"/>
-                <outlet property="replaceBox" destination="dSf-T8-3R3" id="WIv-EB-D9V"/>
-                <outlet property="reverseXBox" destination="pHm-Cq-n6Z" id="ak2-Ac-aCQ"/>
-                <outlet property="reverseYBox" destination="TIB-HX-1bX" id="bjx-v7-q3V"/>
-                <outlet property="rightRotateBox" destination="aan-vb-NGS" id="wKm-ld-4Bc"/>
-                <outlet property="rotateTextFieldItemView" destination="VIp-mo-ECx" id="i18-Uy-KWH"/>
-                <outlet property="rotateTitleLabel" destination="hif-FL-3vF" id="YSr-DN-HIC"/>
-                <outlet property="titleLabel" destination="x6y-yu-lpY" id="Vpa-k7-N5v"/>
-                <outlet property="toolsTitleLabel" destination="dbS-0w-mS5" id="ktz-JI-eEj"/>
-                <outlet property="turnOverBox" destination="eqj-Xy-OX5" id="FcQ-ZT-09Z"/>
-                <outlet property="turnOverTitleLabel" destination="eCo-1Z-05J" id="pho-EN-qZP"/>
-                <outlet property="view" destination="rCh-Bx-sa8" id="Yfd-9x-Vhe"/>
-                <outlet property="wTextFieldItemView" destination="PmV-dZ-BhA" id="eib-qo-q7Z"/>
-                <outlet property="whBox" destination="9WM-Yr-3Hr" id="n6t-nx-pXp"/>
-                <outlet property="whTitleLabel" destination="hgU-r9-q9f" id="DC1-LO-qvZ"/>
-            </connections>
-        </customObject>
-        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
-        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
-        <scrollView borderType="none" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" hasVerticalScroller="NO" usesPredominantAxisScrolling="NO" id="rCh-Bx-sa8">
-            <rect key="frame" x="0.0" y="0.0" width="260" height="500"/>
-            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
-            <clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="gMq-4a-g5G">
-                <rect key="frame" x="0.0" y="0.0" width="260" height="500"/>
-                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                <subviews>
-                    <view id="wc3-Ma-X7s">
-                        <rect key="frame" x="0.0" y="0.0" width="260" height="500"/>
-                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                        <subviews>
-                            <customView translatesAutoresizingMaskIntoConstraints="NO" id="2cv-Bg-EQU">
-                                <rect key="frame" x="0.0" y="0.0" width="260" height="452"/>
-                                <subviews>
-                                    <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="H4i-ha-vev">
-                                        <rect key="frame" x="66" y="176" width="128" height="128"/>
-                                        <constraints>
-                                            <constraint firstAttribute="width" constant="128" id="FLb-Ah-Fr8"/>
-                                            <constraint firstAttribute="height" constant="128" id="YnP-4V-emy"/>
-                                        </constraints>
-                                        <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" id="VmL-3i-3hR"/>
-                                    </imageView>
-                                    <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="cBS-ZD-gNe">
-                                        <rect key="frame" x="94" y="152" width="73" height="16"/>
-                                        <textFieldCell key="cell" lineBreakMode="clipping" alignment="center" title="Add Image" id="BJo-l6-NBY">
-                                            <font key="font" metaFont="system"/>
-                                            <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
-                                            <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
-                                        </textFieldCell>
-                                    </textField>
-                                    <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="xT8-m7-QlU">
-                                        <rect key="frame" x="44" y="112" width="172" height="40"/>
-                                        <constraints>
-                                            <constraint firstAttribute="width" constant="168" id="Fhy-XT-ZBN"/>
-                                            <constraint firstAttribute="height" constant="40" id="yDh-34-pSM"/>
-                                        </constraints>
-                                        <textFieldCell key="cell" alignment="center" title="Select an area on the page to insert the image." id="xdg-6Z-zNm">
-                                            <font key="font" metaFont="system"/>
-                                            <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
-                                            <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
-                                        </textFieldCell>
-                                    </textField>
-                                </subviews>
-                                <constraints>
-                                    <constraint firstItem="xT8-m7-QlU" firstAttribute="centerX" secondItem="2cv-Bg-EQU" secondAttribute="centerX" id="5H8-mW-VWd"/>
-                                    <constraint firstItem="cBS-ZD-gNe" firstAttribute="top" secondItem="H4i-ha-vev" secondAttribute="bottom" constant="8" id="Ue4-ch-F5B"/>
-                                    <constraint firstItem="H4i-ha-vev" firstAttribute="top" secondItem="2cv-Bg-EQU" secondAttribute="top" constant="148" id="bZ7-ca-xYL"/>
-                                    <constraint firstItem="cBS-ZD-gNe" firstAttribute="centerX" secondItem="2cv-Bg-EQU" secondAttribute="centerX" id="l55-Ii-Ogm"/>
-                                    <constraint firstItem="xT8-m7-QlU" firstAttribute="top" secondItem="cBS-ZD-gNe" secondAttribute="bottom" id="oJf-qh-MQT"/>
-                                    <constraint firstItem="H4i-ha-vev" firstAttribute="centerX" secondItem="2cv-Bg-EQU" secondAttribute="centerX" id="whS-c7-dyX"/>
-                                </constraints>
-                            </customView>
-                            <box borderType="none" title="Box" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="6yW-By-Sg9">
-                                <rect key="frame" x="0.0" y="324" width="260" height="176"/>
-                                <view key="contentView" id="IgG-3G-s7G">
-                                    <rect key="frame" x="0.0" y="0.0" width="260" height="176"/>
-                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                                    <subviews>
-                                        <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="x6y-yu-lpY">
-                                            <rect key="frame" x="14" y="144" width="41" height="16"/>
-                                            <textFieldCell key="cell" lineBreakMode="clipping" title="Image" id="F3k-6q-vFG">
-                                                <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>
-                                        <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="hgU-r9-q9f">
-                                            <rect key="frame" x="14" y="110" width="37" height="16"/>
-                                            <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="5Xn-4H-Ifh">
-                                                <font key="font" metaFont="system"/>
-                                                <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
-                                                <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
-                                            </textFieldCell>
-                                        </textField>
-                                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="PmV-dZ-BhA" customClass="KMCustomTextField" customModule="PDF_Reader_Pro" customModuleProvider="target">
-                                            <rect key="frame" x="16" y="70" width="94" height="32"/>
-                                            <constraints>
-                                                <constraint firstAttribute="width" constant="94" id="3qk-F4-LsX"/>
-                                                <constraint firstAttribute="height" constant="32" id="Ftc-BY-iyg"/>
-                                            </constraints>
-                                        </customView>
-                                        <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="9WM-Yr-3Hr">
-                                            <rect key="frame" x="118" y="70" width="32" height="32"/>
-                                            <view key="contentView" id="67e-I9-UTy">
-                                                <rect key="frame" x="1" y="1" width="30" height="30"/>
-                                                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                                            </view>
-                                            <constraints>
-                                                <constraint firstAttribute="height" constant="32" id="NvB-0H-Qeq"/>
-                                                <constraint firstAttribute="width" constant="32" id="VJJ-De-3Zx"/>
-                                            </constraints>
-                                        </box>
-                                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="x7h-ZX-NVn" customClass="KMCustomTextField" customModule="PDF_Reader_Pro" customModuleProvider="target">
-                                            <rect key="frame" x="158" y="70" width="94" height="32"/>
-                                            <constraints>
-                                                <constraint firstAttribute="height" constant="32" id="9wX-j7-49e"/>
-                                                <constraint firstAttribute="width" constant="94" id="cEC-d9-E3a"/>
-                                            </constraints>
-                                        </customView>
-                                        <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="hif-FL-3vF">
-                                            <rect key="frame" x="14" y="42" width="37" height="16"/>
-                                            <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="79h-GY-A9Z">
-                                                <font key="font" metaFont="system"/>
-                                                <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
-                                                <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
-                                            </textFieldCell>
-                                        </textField>
-                                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="VIp-mo-ECx" customClass="KMDesignTextField" customModule="PDF_Reader_Pro" customModuleProvider="target">
-                                            <rect key="frame" x="16" y="2" width="160" height="32"/>
-                                            <constraints>
-                                                <constraint firstAttribute="width" constant="160" id="fBp-iI-vL7"/>
-                                                <constraint firstAttribute="height" constant="32" id="gpq-nb-TT2"/>
-                                            </constraints>
-                                        </customView>
-                                        <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="AY8-Zu-th7">
-                                            <rect key="frame" x="184" y="2" width="32" height="32"/>
-                                            <view key="contentView" id="sHE-gV-Ntc">
-                                                <rect key="frame" x="1" y="1" width="30" height="30"/>
-                                                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                                            </view>
-                                            <constraints>
-                                                <constraint firstAttribute="height" constant="32" id="BON-Z9-lFL"/>
-                                                <constraint firstAttribute="width" constant="32" id="gNM-3z-jbV"/>
-                                            </constraints>
-                                        </box>
-                                        <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="aan-vb-NGS">
-                                            <rect key="frame" x="224" y="2" width="32" height="32"/>
-                                            <view key="contentView" id="RuT-lT-vTn">
-                                                <rect key="frame" x="1" y="1" width="30" height="30"/>
-                                                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                                            </view>
-                                            <constraints>
-                                                <constraint firstAttribute="height" constant="32" id="Jqe-ph-ith"/>
-                                                <constraint firstAttribute="width" constant="32" id="aSz-e3-vIv"/>
-                                            </constraints>
-                                        </box>
-                                    </subviews>
-                                    <constraints>
-                                        <constraint firstItem="aan-vb-NGS" firstAttribute="centerY" secondItem="AY8-Zu-th7" secondAttribute="centerY" id="55I-3l-aHT"/>
-                                        <constraint firstItem="AY8-Zu-th7" firstAttribute="leading" secondItem="VIp-mo-ECx" secondAttribute="trailing" constant="8" id="BnB-6T-kSB"/>
-                                        <constraint firstItem="x7h-ZX-NVn" firstAttribute="leading" secondItem="PmV-dZ-BhA" secondAttribute="trailing" constant="48" id="DP3-N8-lVQ"/>
-                                        <constraint firstItem="9WM-Yr-3Hr" firstAttribute="centerY" secondItem="PmV-dZ-BhA" secondAttribute="centerY" id="FiW-GK-JHx"/>
-                                        <constraint firstItem="hif-FL-3vF" firstAttribute="leading" secondItem="IgG-3G-s7G" secondAttribute="leading" constant="16" id="Hop-3W-XWW"/>
-                                        <constraint firstItem="x7h-ZX-NVn" firstAttribute="centerY" secondItem="PmV-dZ-BhA" secondAttribute="centerY" id="Pu5-G0-uQm"/>
-                                        <constraint firstItem="x6y-yu-lpY" firstAttribute="top" secondItem="IgG-3G-s7G" secondAttribute="top" constant="16" id="RkI-P7-x7J"/>
-                                        <constraint firstItem="x6y-yu-lpY" firstAttribute="leading" secondItem="IgG-3G-s7G" secondAttribute="leading" constant="16" id="Ug4-5f-oyS"/>
-                                        <constraint firstItem="AY8-Zu-th7" firstAttribute="trailing" secondItem="aan-vb-NGS" secondAttribute="leading" constant="-8" id="VtC-Yb-d4b"/>
-                                        <constraint firstItem="AY8-Zu-th7" firstAttribute="centerY" secondItem="VIp-mo-ECx" secondAttribute="centerY" id="YrA-TV-dgi"/>
-                                        <constraint firstItem="PmV-dZ-BhA" firstAttribute="leading" secondItem="IgG-3G-s7G" secondAttribute="leading" constant="16" id="aMd-Ep-UKp"/>
-                                        <constraint firstItem="hif-FL-3vF" firstAttribute="bottom" secondItem="VIp-mo-ECx" secondAttribute="top" constant="-8" id="cQU-GB-7fd"/>
-                                        <constraint firstItem="9WM-Yr-3Hr" firstAttribute="leading" secondItem="PmV-dZ-BhA" secondAttribute="trailing" constant="8" id="hTg-41-AkP"/>
-                                        <constraint firstItem="VIp-mo-ECx" firstAttribute="leading" secondItem="IgG-3G-s7G" secondAttribute="leading" constant="16" id="hyW-Ed-4Tk"/>
-                                        <constraint firstItem="PmV-dZ-BhA" firstAttribute="top" secondItem="hgU-r9-q9f" secondAttribute="bottom" constant="8" id="kFJ-Id-V99"/>
-                                        <constraint firstItem="hgU-r9-q9f" firstAttribute="top" secondItem="IgG-3G-s7G" secondAttribute="top" constant="50" id="mHW-3r-V3a"/>
-                                        <constraint firstItem="hif-FL-3vF" firstAttribute="top" secondItem="x7h-ZX-NVn" secondAttribute="bottom" constant="12" id="obY-0q-GUd"/>
-                                        <constraint firstItem="hgU-r9-q9f" firstAttribute="leading" secondItem="IgG-3G-s7G" secondAttribute="leading" constant="16" id="wq0-tg-1cn"/>
-                                    </constraints>
-                                </view>
-                                <constraints>
-                                    <constraint firstAttribute="height" constant="176" id="2Nc-Uj-EEg"/>
-                                </constraints>
-                            </box>
-                            <box borderType="none" title="Box" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="qjn-Az-nK1">
-                                <rect key="frame" x="0.0" y="252" width="260" height="56"/>
-                                <view key="contentView" id="vpF-9O-Amq">
-                                    <rect key="frame" x="0.0" y="0.0" width="260" height="56"/>
-                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                                    <subviews>
-                                        <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="XPI-yz-g9u">
-                                            <rect key="frame" x="14" y="40" width="49" height="16"/>
-                                            <textFieldCell key="cell" lineBreakMode="clipping" title="opacity" id="LXH-cy-YvE">
-                                                <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="GOt-dw-CGs">
-                                            <rect key="frame" x="16" y="0.0" width="228" height="32"/>
-                                            <subviews>
-                                                <slider verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Z0O-zt-cBQ">
-                                                    <rect key="frame" x="-2" y="0.0" width="144" height="28"/>
-                                                    <constraints>
-                                                        <constraint firstAttribute="width" constant="140" id="A1a-kp-h7d"/>
-                                                    </constraints>
-                                                    <sliderCell key="cell" state="on" alignment="left" maxValue="1" doubleValue="1" tickMarkPosition="above" sliderType="linear" id="RhD-fs-Ulr"/>
-                                                </slider>
-                                                <box boxType="custom" borderWidth="0.0" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="9ig-7b-xDq">
-                                                    <rect key="frame" x="146" y="0.0" width="82" height="32"/>
-                                                    <view key="contentView" id="fr5-qz-wFC">
-                                                        <rect key="frame" x="0.0" y="0.0" width="82" height="32"/>
-                                                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                                                    </view>
-                                                    <constraints>
-                                                        <constraint firstAttribute="height" constant="32" id="Dmg-68-qJJ"/>
-                                                        <constraint firstAttribute="width" constant="82" id="Mz0-Qc-LQy"/>
-                                                    </constraints>
-                                                    <color key="fillColor" red="0.92156862750000001" green="0.92156862750000001" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                                                </box>
-                                            </subviews>
-                                            <constraints>
-                                                <constraint firstAttribute="height" constant="32" id="FpK-nl-Vpn"/>
-                                                <constraint firstItem="Z0O-zt-cBQ" firstAttribute="centerY" secondItem="GOt-dw-CGs" secondAttribute="centerY" id="P9w-fE-L7Y"/>
-                                                <constraint firstAttribute="trailing" secondItem="9ig-7b-xDq" secondAttribute="trailing" id="Ury-AM-MzK"/>
-                                                <constraint firstItem="Z0O-zt-cBQ" firstAttribute="leading" secondItem="GOt-dw-CGs" secondAttribute="leading" id="bb1-du-jW7"/>
-                                                <constraint firstItem="9ig-7b-xDq" firstAttribute="centerY" secondItem="GOt-dw-CGs" secondAttribute="centerY" id="g0Z-NM-DMr"/>
-                                            </constraints>
-                                        </customView>
-                                    </subviews>
-                                    <constraints>
-                                        <constraint firstItem="GOt-dw-CGs" firstAttribute="leading" secondItem="vpF-9O-Amq" secondAttribute="leading" constant="16" id="GF9-3C-ECz"/>
-                                        <constraint firstItem="GOt-dw-CGs" firstAttribute="top" secondItem="XPI-yz-g9u" secondAttribute="bottom" constant="8" id="Gn6-Q3-jUN"/>
-                                        <constraint firstAttribute="trailing" secondItem="GOt-dw-CGs" secondAttribute="trailing" constant="16" id="m5R-JO-ivq"/>
-                                        <constraint firstItem="XPI-yz-g9u" firstAttribute="leading" secondItem="vpF-9O-Amq" secondAttribute="leading" constant="16" id="nfZ-u0-N6t"/>
-                                        <constraint firstItem="XPI-yz-g9u" firstAttribute="top" secondItem="vpF-9O-Amq" secondAttribute="top" id="tze-rK-ov2"/>
-                                    </constraints>
-                                </view>
-                                <constraints>
-                                    <constraint firstAttribute="height" constant="56" id="pQN-DI-xiY"/>
-                                </constraints>
-                            </box>
-                            <box boxType="custom" borderWidth="0.0" cornerRadius="4" title="Box" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="eqj-Xy-OX5">
-                                <rect key="frame" x="0.0" y="194" width="260" height="58"/>
-                                <view key="contentView" id="zu8-9v-SFi">
-                                    <rect key="frame" x="0.0" y="0.0" width="260" height="58"/>
-                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                                    <subviews>
-                                        <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="eCo-1Z-05J">
-                                            <rect key="frame" x="14" y="42" width="37" height="16"/>
-                                            <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="7YT-SN-29T">
-                                                <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="pHm-Cq-n6Z">
-                                            <rect key="frame" x="16" y="2" width="32" height="32"/>
-                                            <constraints>
-                                                <constraint firstAttribute="height" constant="32" id="oOn-jX-72Q"/>
-                                                <constraint firstAttribute="width" constant="32" id="pvO-Es-hOd"/>
-                                            </constraints>
-                                        </customView>
-                                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="TIB-HX-1bX">
-                                            <rect key="frame" x="56" y="2" width="32" height="32"/>
-                                            <constraints>
-                                                <constraint firstAttribute="width" constant="32" id="9P6-QH-u9g"/>
-                                                <constraint firstAttribute="height" constant="32" id="GGr-l4-f11"/>
-                                            </constraints>
-                                        </customView>
-                                    </subviews>
-                                    <constraints>
-                                        <constraint firstItem="TIB-HX-1bX" firstAttribute="leading" secondItem="pHm-Cq-n6Z" secondAttribute="trailing" constant="8" id="B37-Tv-bom"/>
-                                        <constraint firstItem="pHm-Cq-n6Z" firstAttribute="top" secondItem="eCo-1Z-05J" secondAttribute="bottom" constant="8" id="GoE-2W-WAa"/>
-                                        <constraint firstItem="pHm-Cq-n6Z" firstAttribute="leading" secondItem="zu8-9v-SFi" secondAttribute="leading" constant="16" id="Rbw-f7-88Z"/>
-                                        <constraint firstItem="TIB-HX-1bX" firstAttribute="centerY" secondItem="pHm-Cq-n6Z" secondAttribute="centerY" id="dCL-JX-XD8"/>
-                                        <constraint firstItem="eCo-1Z-05J" firstAttribute="top" secondItem="zu8-9v-SFi" secondAttribute="top" id="fh4-Q9-Yv2"/>
-                                        <constraint firstItem="eCo-1Z-05J" firstAttribute="leading" secondItem="zu8-9v-SFi" secondAttribute="leading" constant="16" id="ixR-CK-Py4"/>
-                                    </constraints>
-                                </view>
-                                <constraints>
-                                    <constraint firstAttribute="height" constant="58" id="Ijq-FJ-Uda"/>
-                                </constraints>
-                            </box>
-                            <box boxType="custom" borderType="none" borderWidth="0.0" title="Box" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="9za-vG-ihA">
-                                <rect key="frame" x="16" y="50" width="228" height="136"/>
-                                <view key="contentView" id="ZP8-0e-bWE">
-                                    <rect key="frame" x="0.0" y="0.0" width="228" height="136"/>
-                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                                    <subviews>
-                                        <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="dbS-0w-mS5">
-                                            <rect key="frame" x="-2" y="120" width="37" height="16"/>
-                                            <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="Tba-gg-Mvz">
-                                                <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>
-                                        <box boxType="custom" borderWidth="0.0" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="vr8-ml-OC0">
-                                            <rect key="frame" x="118" y="80" width="110" height="32"/>
-                                            <view key="contentView" id="5bE-LY-pCd">
-                                                <rect key="frame" x="0.0" y="0.0" width="110" height="32"/>
-                                                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                                            </view>
-                                            <constraints>
-                                                <constraint firstAttribute="height" constant="32" id="10w-cb-xaQ"/>
-                                                <constraint firstAttribute="width" constant="110" id="pkB-tF-Moj"/>
-                                            </constraints>
-                                            <color key="fillColor" red="0.92156862750000001" green="0.92156862750000001" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                                        </box>
-                                        <box boxType="custom" borderWidth="0.0" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="xPh-yv-2Ch">
-                                            <rect key="frame" x="0.0" y="80" width="110" height="32"/>
-                                            <view key="contentView" id="c74-wl-dsk">
-                                                <rect key="frame" x="0.0" y="0.0" width="110" height="32"/>
-                                                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                                            </view>
-                                            <constraints>
-                                                <constraint firstAttribute="width" constant="110" id="lB6-As-b1d"/>
-                                                <constraint firstAttribute="height" constant="32" id="nvo-44-swu"/>
-                                            </constraints>
-                                            <color key="fillColor" red="0.92156862750000001" green="0.92156862750000001" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                                        </box>
-                                        <box boxType="custom" borderWidth="0.0" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="AAt-gQ-hOo">
-                                            <rect key="frame" x="0.0" y="80" width="228" height="32"/>
-                                            <view key="contentView" id="d4R-c0-wzQ">
-                                                <rect key="frame" x="0.0" y="0.0" width="228" height="32"/>
-                                                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                                            </view>
-                                            <constraints>
-                                                <constraint firstAttribute="height" constant="32" id="xlS-I7-s9w"/>
-                                            </constraints>
-                                            <color key="fillColor" red="0.92156862750000001" green="0.92156862750000001" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                                        </box>
-                                        <box boxType="custom" borderWidth="0.0" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="dSf-T8-3R3">
-                                            <rect key="frame" x="0.0" y="40" width="228" height="32"/>
-                                            <view key="contentView" id="GME-VV-ihH">
-                                                <rect key="frame" x="0.0" y="0.0" width="228" height="32"/>
-                                                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                                            </view>
-                                            <constraints>
-                                                <constraint firstAttribute="height" constant="32" id="IkQ-Rq-cIN"/>
-                                            </constraints>
-                                            <color key="fillColor" red="0.92156862750000001" green="0.92156862750000001" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                                        </box>
-                                        <box boxType="custom" borderWidth="0.0" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="8lZ-Kd-hWi">
-                                            <rect key="frame" x="0.0" y="0.0" width="228" height="32"/>
-                                            <view key="contentView" id="dx8-kP-W3q">
-                                                <rect key="frame" x="0.0" y="0.0" width="228" height="32"/>
-                                                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                                            </view>
-                                            <constraints>
-                                                <constraint firstAttribute="height" constant="32" id="BnB-Ke-4fG"/>
-                                            </constraints>
-                                            <color key="fillColor" red="0.92156862750000001" green="0.92156862750000001" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                                        </box>
-                                    </subviews>
-                                    <constraints>
-                                        <constraint firstItem="8lZ-Kd-hWi" firstAttribute="top" secondItem="dSf-T8-3R3" secondAttribute="bottom" constant="8" id="1cM-b0-HG6"/>
-                                        <constraint firstItem="vr8-ml-OC0" firstAttribute="top" secondItem="ZP8-0e-bWE" secondAttribute="top" constant="24" id="7eg-5O-Noy"/>
-                                        <constraint firstItem="dSf-T8-3R3" firstAttribute="leading" secondItem="AAt-gQ-hOo" secondAttribute="leading" id="DLy-ZC-KU3"/>
-                                        <constraint firstItem="dbS-0w-mS5" firstAttribute="top" secondItem="ZP8-0e-bWE" secondAttribute="top" id="Jqr-5w-XfE"/>
-                                        <constraint firstItem="dbS-0w-mS5" firstAttribute="leading" secondItem="ZP8-0e-bWE" secondAttribute="leading" id="O7u-oY-fGr"/>
-                                        <constraint firstAttribute="trailing" secondItem="AAt-gQ-hOo" secondAttribute="trailing" id="ahn-mQ-E04"/>
-                                        <constraint firstItem="xPh-yv-2Ch" firstAttribute="top" secondItem="ZP8-0e-bWE" secondAttribute="top" constant="24" id="cR6-6m-qQi"/>
-                                        <constraint firstItem="dSf-T8-3R3" firstAttribute="top" secondItem="AAt-gQ-hOo" secondAttribute="bottom" constant="8" id="duj-XY-A1h"/>
-                                        <constraint firstAttribute="trailing" secondItem="vr8-ml-OC0" secondAttribute="trailing" id="fu2-Bc-acA"/>
-                                        <constraint firstItem="dSf-T8-3R3" firstAttribute="trailing" secondItem="vr8-ml-OC0" secondAttribute="trailing" id="iAd-S8-C1J"/>
-                                        <constraint firstItem="AAt-gQ-hOo" firstAttribute="top" secondItem="ZP8-0e-bWE" secondAttribute="top" constant="24" id="lsl-8s-FyF"/>
-                                        <constraint firstItem="xPh-yv-2Ch" firstAttribute="leading" secondItem="ZP8-0e-bWE" secondAttribute="leading" id="mOu-vx-pMD"/>
-                                        <constraint firstItem="AAt-gQ-hOo" firstAttribute="leading" secondItem="ZP8-0e-bWE" secondAttribute="leading" id="n2m-zi-EMC"/>
-                                        <constraint firstItem="dSf-T8-3R3" firstAttribute="trailing" secondItem="8lZ-Kd-hWi" secondAttribute="trailing" id="ouP-EF-VqU"/>
-                                        <constraint firstItem="dSf-T8-3R3" firstAttribute="leading" secondItem="8lZ-Kd-hWi" secondAttribute="leading" id="yw5-GG-lZH"/>
-                                    </constraints>
-                                </view>
-                                <constraints>
-                                    <constraint firstAttribute="height" constant="136" id="q4K-hM-hqe"/>
-                                </constraints>
-                            </box>
-                            <customView translatesAutoresizingMaskIntoConstraints="NO" id="3AP-7h-Nfc" customClass="KMEditPropertyAlignmentView" customModule="PDF_Reader_Pro" customModuleProvider="target">
-                                <rect key="frame" x="16" y="-66" width="228" height="100"/>
-                                <constraints>
-                                    <constraint firstAttribute="height" constant="100" id="fcW-mh-2WD"/>
-                                </constraints>
-                            </customView>
-                        </subviews>
-                        <constraints>
-                            <constraint firstAttribute="bottom" secondItem="2cv-Bg-EQU" secondAttribute="bottom" id="4oe-1N-VuF"/>
-                            <constraint firstItem="qjn-Az-nK1" firstAttribute="bottom" secondItem="eqj-Xy-OX5" secondAttribute="top" id="88P-ym-ngd"/>
-                            <constraint firstAttribute="trailing" secondItem="eqj-Xy-OX5" secondAttribute="trailing" id="Bkm-2V-KKh"/>
-                            <constraint firstAttribute="trailing" secondItem="3AP-7h-Nfc" secondAttribute="trailing" constant="16" id="DPV-qc-7Mx"/>
-                            <constraint firstAttribute="trailing" secondItem="6yW-By-Sg9" secondAttribute="trailing" id="HzJ-TZ-atu"/>
-                            <constraint firstItem="6yW-By-Sg9" firstAttribute="top" secondItem="wc3-Ma-X7s" secondAttribute="top" id="IFt-ky-q6h"/>
-                            <constraint firstItem="2cv-Bg-EQU" firstAttribute="leading" secondItem="wc3-Ma-X7s" secondAttribute="leading" id="TQi-cc-SCm"/>
-                            <constraint firstItem="3AP-7h-Nfc" firstAttribute="top" secondItem="9za-vG-ihA" secondAttribute="bottom" constant="16" id="Vog-68-6WN"/>
-                            <constraint firstItem="qjn-Az-nK1" firstAttribute="leading" secondItem="wc3-Ma-X7s" secondAttribute="leading" id="WQh-6J-l34"/>
-                            <constraint firstAttribute="trailing" secondItem="qjn-Az-nK1" secondAttribute="trailing" id="Z7T-fd-4CF"/>
-                            <constraint firstItem="9za-vG-ihA" firstAttribute="top" secondItem="qjn-Az-nK1" secondAttribute="bottom" constant="66" id="agw-2V-YyY"/>
-                            <constraint firstItem="eqj-Xy-OX5" firstAttribute="leading" secondItem="wc3-Ma-X7s" secondAttribute="leading" id="b5o-0P-XZb"/>
-                            <constraint firstItem="3AP-7h-Nfc" firstAttribute="leading" secondItem="wc3-Ma-X7s" secondAttribute="leading" constant="16" id="bxW-A6-7ur"/>
-                            <constraint firstAttribute="trailing" secondItem="9za-vG-ihA" secondAttribute="trailing" constant="16" id="guW-jF-VVi"/>
-                            <constraint firstItem="6yW-By-Sg9" firstAttribute="leading" secondItem="wc3-Ma-X7s" secondAttribute="leading" id="hFm-HD-mvX"/>
-                            <constraint firstAttribute="trailing" secondItem="2cv-Bg-EQU" secondAttribute="trailing" id="iuO-oD-bAG"/>
-                            <constraint firstItem="9za-vG-ihA" firstAttribute="leading" secondItem="wc3-Ma-X7s" secondAttribute="leading" constant="16" id="n7q-6r-Hka"/>
-                            <constraint firstItem="qjn-Az-nK1" firstAttribute="top" secondItem="6yW-By-Sg9" secondAttribute="bottom" constant="16" id="pMH-jX-v3E"/>
-                            <constraint firstItem="2cv-Bg-EQU" firstAttribute="top" secondItem="wc3-Ma-X7s" secondAttribute="top" constant="48" id="ybe-LO-sGP"/>
-                        </constraints>
-                    </view>
-                </subviews>
-                <color key="backgroundColor" red="0.96862745098039216" green="0.97254901960784312" blue="0.98039215686274506" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-            </clipView>
-            <scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="t4X-eE-fv9">
-                <rect key="frame" x="-100" y="-100" width="273" height="15"/>
-                <autoresizingMask key="autoresizingMask"/>
-            </scroller>
-            <scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="byq-FR-ZQB">
-                <rect key="frame" x="-100" y="-100" width="15" height="536"/>
-                <autoresizingMask key="autoresizingMask"/>
-            </scroller>
-            <point key="canvasLocation" x="97" y="-1124"/>
-        </scrollView>
-    </objects>
-</document>

+ 19 - 35
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -477,10 +477,6 @@
 		89E9B3F9295BE2EC00AEFA61 /* KMEditPDFTextPropertyViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 89E9B3F8295BE2EC00AEFA61 /* KMEditPDFTextPropertyViewController.xib */; };
 		89E9B3FA295BE2EC00AEFA61 /* KMEditPDFTextPropertyViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 89E9B3F8295BE2EC00AEFA61 /* KMEditPDFTextPropertyViewController.xib */; };
 		89E9B3FB295BE2EC00AEFA61 /* KMEditPDFTextPropertyViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 89E9B3F8295BE2EC00AEFA61 /* KMEditPDFTextPropertyViewController.xib */; };
-		89E9B406295D268E00AEFA61 /* KMEditImagePropertyViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89E9B404295D268E00AEFA61 /* KMEditImagePropertyViewController.swift */; };
-		89E9B407295D268E00AEFA61 /* KMEditImagePropertyViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89E9B404295D268E00AEFA61 /* KMEditImagePropertyViewController.swift */; };
-		89E9B409295D268E00AEFA61 /* KMEditImagePropertyViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 89E9B405295D268E00AEFA61 /* KMEditImagePropertyViewController.xib */; };
-		89E9B40A295D268E00AEFA61 /* KMEditImagePropertyViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 89E9B405295D268E00AEFA61 /* KMEditImagePropertyViewController.xib */; };
 		9F00CCBB2A2F1E0F00AC462E /* dsa_priv.pem in Resources */ = {isa = PBXBuildFile; fileRef = 9F00CCB72A2F1E0F00AC462E /* dsa_priv.pem */; };
 		9F00CCBC2A2F1E0F00AC462E /* dsa_pub.pem in Resources */ = {isa = PBXBuildFile; fileRef = 9F00CCB82A2F1E0F00AC462E /* dsa_pub.pem */; };
 		9F00CCC02A2F251800AC462E /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F00CCB32A2F1E0100AC462E /* Sparkle.framework */; };
@@ -488,7 +484,6 @@
 		9F00CCC52A2F2E2400AC462E /* AppCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F00CCC22A2F2E2300AC462E /* AppCenter.framework */; };
 		9F00CCC62A2F2E2400AC462E /* AppCenterAnalytics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F00CCC32A2F2E2400AC462E /* AppCenterAnalytics.framework */; };
 		9F00CCC72A2F2E2400AC462E /* AppCenterCrashes.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F00CCC42A2F2E2400AC462E /* AppCenterCrashes.framework */; };
-		9F00CCEF2A309E8E00AC462E /* KMEditImagePropertyViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 89E9B405295D268E00AEFA61 /* KMEditImagePropertyViewController.xib */; };
 		9F00CF4D2A38655500AC462E /* FirebaseCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F00CF4B2A38655300AC462E /* FirebaseCore.framework */; };
 		9F00CF4E2A38655500AC462E /* FirebaseCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F00CF4B2A38655300AC462E /* FirebaseCore.framework */; };
 		9F00CF4F2A38655500AC462E /* FirebaseCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F00CF4B2A38655300AC462E /* FirebaseCore.framework */; };
@@ -4188,12 +4183,12 @@
 		BB89DD7E2953F863007C3FFA /* KMWatermarkFileOutsideView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB89DD7D2953F863007C3FFA /* KMWatermarkFileOutsideView.swift */; };
 		BB89DD7F2953F863007C3FFA /* KMWatermarkFileOutsideView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB89DD7D2953F863007C3FFA /* KMWatermarkFileOutsideView.swift */; };
 		BB89DD802953F863007C3FFA /* KMWatermarkFileOutsideView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB89DD7D2953F863007C3FFA /* KMWatermarkFileOutsideView.swift */; };
-		BB8AA5382CC65C900084F183 /* KMNMultiController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8AA5362CC65C900084F183 /* KMNMultiController.swift */; };
-		BB8AA5392CC65C900084F183 /* KMNMultiController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8AA5362CC65C900084F183 /* KMNMultiController.swift */; };
-		BB8AA53A2CC65C900084F183 /* KMNMultiController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8AA5362CC65C900084F183 /* KMNMultiController.swift */; };
-		BB8AA53B2CC65C900084F183 /* KMNMultiController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB8AA5372CC65C900084F183 /* KMNMultiController.xib */; };
-		BB8AA53C2CC65C900084F183 /* KMNMultiController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB8AA5372CC65C900084F183 /* KMNMultiController.xib */; };
-		BB8AA53D2CC65C900084F183 /* KMNMultiController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB8AA5372CC65C900084F183 /* KMNMultiController.xib */; };
+		BB8AA5382CC65C900084F183 /* KMNAlignmentController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8AA5362CC65C900084F183 /* KMNAlignmentController.swift */; };
+		BB8AA5392CC65C900084F183 /* KMNAlignmentController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8AA5362CC65C900084F183 /* KMNAlignmentController.swift */; };
+		BB8AA53A2CC65C900084F183 /* KMNAlignmentController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8AA5362CC65C900084F183 /* KMNAlignmentController.swift */; };
+		BB8AA53B2CC65C900084F183 /* KMNAlignmentController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB8AA5372CC65C900084F183 /* KMNAlignmentController.xib */; };
+		BB8AA53C2CC65C900084F183 /* KMNAlignmentController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB8AA5372CC65C900084F183 /* KMNAlignmentController.xib */; };
+		BB8AA53D2CC65C900084F183 /* KMNAlignmentController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB8AA5372CC65C900084F183 /* KMNAlignmentController.xib */; };
 		BB8AA53F2CC66E490084F183 /* PDFImages.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BB8AA53E2CC66E490084F183 /* PDFImages.xcassets */; };
 		BB8AA5402CC66E490084F183 /* PDFImages.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BB8AA53E2CC66E490084F183 /* PDFImages.xcassets */; };
 		BB8AA5412CC66E490084F183 /* PDFImages.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BB8AA53E2CC66E490084F183 /* PDFImages.xcassets */; };
@@ -4899,7 +4894,6 @@
 		BBD7FE002A13210C00F96075 /* ComPDFKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = ADA08A7C29F13EA0009B2A7B /* ComPDFKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		BBD7FE032A13218E00F96075 /* KMWatermarkAdjectivePropertyBaseController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB897234294B38DC0045787C /* KMWatermarkAdjectivePropertyBaseController.swift */; };
 		BBD7FE042A13218F00F96075 /* KMWatermarkAdjectivePropertyBaseController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB897234294B38DC0045787C /* KMWatermarkAdjectivePropertyBaseController.swift */; };
-		BBD7FE052A1323A400F96075 /* KMEditImagePropertyViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89E9B404295D268E00AEFA61 /* KMEditImagePropertyViewController.swift */; };
 		BBD8EE902B8EC86900EB05FE /* AutoSavePopController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBD8EE8B2B8EC86900EB05FE /* AutoSavePopController.xib */; };
 		BBD8EE912B8EC86900EB05FE /* AutoSavePopController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBD8EE8B2B8EC86900EB05FE /* AutoSavePopController.xib */; };
 		BBD8EE922B8EC86900EB05FE /* AutoSavePopController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBD8EE8B2B8EC86900EB05FE /* AutoSavePopController.xib */; };
@@ -5943,8 +5937,6 @@
 		89E4E7802967BF5A002DBA6F /* KMCustomizeStampViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KMCustomizeStampViewController.m; sourceTree = "<group>"; };
 		89E4E7812967BF5A002DBA6F /* KMCustomizeStampViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMCustomizeStampViewController.xib; sourceTree = "<group>"; };
 		89E9B3F8295BE2EC00AEFA61 /* KMEditPDFTextPropertyViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMEditPDFTextPropertyViewController.xib; sourceTree = "<group>"; };
-		89E9B404295D268E00AEFA61 /* KMEditImagePropertyViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMEditImagePropertyViewController.swift; sourceTree = "<group>"; };
-		89E9B405295D268E00AEFA61 /* KMEditImagePropertyViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMEditImagePropertyViewController.xib; sourceTree = "<group>"; };
 		9F00CCB32A2F1E0100AC462E /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sparkle.framework; sourceTree = "<group>"; };
 		9F00CCB72A2F1E0F00AC462E /* dsa_priv.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = dsa_priv.pem; sourceTree = "<group>"; };
 		9F00CCB82A2F1E0F00AC462E /* dsa_pub.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = dsa_pub.pem; sourceTree = "<group>"; };
@@ -7438,8 +7430,8 @@
 		BB897274294DC04F0045787C /* KMWatermartAdjectivePageRangeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMWatermartAdjectivePageRangeView.swift; sourceTree = "<group>"; };
 		BB897278294DFD1E0045787C /* KMWatermarkTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMWatermarkTextView.swift; sourceTree = "<group>"; };
 		BB89DD7D2953F863007C3FFA /* KMWatermarkFileOutsideView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMWatermarkFileOutsideView.swift; sourceTree = "<group>"; };
-		BB8AA5362CC65C900084F183 /* KMNMultiController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMNMultiController.swift; sourceTree = "<group>"; };
-		BB8AA5372CC65C900084F183 /* KMNMultiController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMNMultiController.xib; sourceTree = "<group>"; };
+		BB8AA5362CC65C900084F183 /* KMNAlignmentController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMNAlignmentController.swift; sourceTree = "<group>"; };
+		BB8AA5372CC65C900084F183 /* KMNAlignmentController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMNAlignmentController.xib; sourceTree = "<group>"; };
 		BB8AA53E2CC66E490084F183 /* PDFImages.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = PDFImages.xcassets; sourceTree = "<group>"; };
 		BB8AA5422CC6711B0084F183 /* KMPDFConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPDFConfig.swift; sourceTree = "<group>"; };
 		BB8B17312907B63D001C5EA5 /* CipherTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CipherTextView.swift; sourceTree = "<group>"; };
@@ -8664,8 +8656,6 @@
 				89E9B3F8295BE2EC00AEFA61 /* KMEditPDFTextPropertyViewController.xib */,
 				BB79E7172CE617CB0052CAD5 /* KMEditImageController.swift */,
 				BB79E7182CE617CB0052CAD5 /* KMEditImageController.xib */,
-				89E9B404295D268E00AEFA61 /* KMEditImagePropertyViewController.swift */,
-				89E9B405295D268E00AEFA61 /* KMEditImagePropertyViewController.xib */,
 			);
 			path = EditPDF;
 			sourceTree = "<group>";
@@ -11459,6 +11449,7 @@
 			children = (
 				BBD14F552CDA02570077D52E /* KMEditToolbarView.swift */,
 				BBD14F592CDA02640077D52E /* KMEditToolbarView.xib */,
+				BB8AA5342CC65C310084F183 /* KMNAlignmentController */,
 				BB0F585F2CDB70BD00B4D353 /* SinglePagePDFController */,
 				BBEC00AB295C2AB500A26C98 /* Bates */,
 				BB5DF1E52959C5760025CDA1 /* HeaderFooter */,
@@ -12706,7 +12697,6 @@
 		BB52F5572CC1FB60007418DB /* Views */ = {
 			isa = PBXGroup;
 			children = (
-				BB8AA5342CC65C310084F183 /* KMNLinkMultiController */,
 				BB52F55A2CC1FB9A007418DB /* KMLinkEmailView */,
 				BB52F5592CC1FB91007418DB /* KMLinkWebView */,
 				BB52F5582CC1FB86007418DB /* KMLinkPageView */,
@@ -13517,13 +13507,13 @@
 			path = Model;
 			sourceTree = "<group>";
 		};
-		BB8AA5342CC65C310084F183 /* KMNLinkMultiController */ = {
+		BB8AA5342CC65C310084F183 /* KMNAlignmentController */ = {
 			isa = PBXGroup;
 			children = (
-				BB8AA5362CC65C900084F183 /* KMNMultiController.swift */,
-				BB8AA5372CC65C900084F183 /* KMNMultiController.xib */,
+				BB8AA5362CC65C900084F183 /* KMNAlignmentController.swift */,
+				BB8AA5372CC65C900084F183 /* KMNAlignmentController.xib */,
 			);
-			path = KMNLinkMultiController;
+			path = KMNAlignmentController;
 			sourceTree = "<group>";
 		};
 		BB8B172F2907A81E001C5EA5 /* RightSide */ = {
@@ -15406,7 +15396,7 @@
 				BBE788A22CBD2463008086E2 /* DropdownDemoVC.xib in Resources */,
 				9F0CB4622966C9E200007028 /* KMFormPropertPanelViewController.xib in Resources */,
 				BB10E16A2CDC94E300471D47 /* KMBGTemplateItem.xib in Resources */,
-				BB8AA53B2CC65C900084F183 /* KMNMultiController.xib in Resources */,
+				BB8AA53B2CC65C900084F183 /* KMNAlignmentController.xib in Resources */,
 				658FDBB52C9D90CE00EFA72E /* KMNoteFilterStateCollevtionViewItem.xib in Resources */,
 				BB5F8A1929BB15AD00365ADB /* pic_mail.pdf in Resources */,
 				9FDD0F962952FF4D000C4DAD /* $metadata.json in Resources */,
@@ -15725,7 +15715,6 @@
 				9F3A48C82C8017FA0047F565 /* KMPurchaseEmbeddedWindowController.xib in Resources */,
 				ADBC2D3A299F0A5A006280C8 /* KMPrintHelpViewController.xib in Resources */,
 				9FF371BA2C69A6BB005F9CC5 /* KMMeasureSideVC.xib in Resources */,
-				89E9B409295D268E00AEFA61 /* KMEditImagePropertyViewController.xib in Resources */,
 				BB897249294C19980045787C /* KMWatermarkAdjectiveListController.xib in Resources */,
 				BB716D732CDDB73B009787ED /* KMHeaderFooterController.xib in Resources */,
 				BB2E666229C885550000FEBC /* KMSignatureHelpViewController.xib in Resources */,
@@ -15819,7 +15808,6 @@
 			files = (
 				9F8539F72947137500DF644E /* sadfavicon.png in Resources */,
 				BBA922292B4E96450061057A /* KMPurchaseCompareWindowController.xib in Resources */,
-				89E9B40A295D268E00AEFA61 /* KMEditImagePropertyViewController.xib in Resources */,
 				BB89724A294C19980045787C /* KMWatermarkAdjectiveListController.xib in Resources */,
 				F337CC202CC6456D00D46AF4 /* KMNThumbnailBaseViewController.xib in Resources */,
 				BBA8B7A72935CD740097D183 /* KMRemovePasswordAlertWindowController.xib in Resources */,
@@ -15992,7 +15980,7 @@
 				658FDBB62C9D90CE00EFA72E /* KMNoteFilterStateCollevtionViewItem.xib in Resources */,
 				AD1D481D2AFB6B96007AC1F0 /* KMMergeWindowController.xib in Resources */,
 				ADFCEB652B4FBFC50001EBAF /* ad_cancel_button00@2x.png in Resources */,
-				BB8AA53C2CC65C900084F183 /* KMNMultiController.xib in Resources */,
+				BB8AA53C2CC65C900084F183 /* KMNAlignmentController.xib in Resources */,
 				BB19A7532CB7C710008204DC /* KMHistoryFileThumbItem.xib in Resources */,
 				BBFE6E69293097A600142C01 /* KMPageRangePickerWindowController.xib in Resources */,
 				652E95532C6914770061FA40 /* KMLineAndBorderItemView.xib in Resources */,
@@ -16714,7 +16702,7 @@
 				9F56648C2988B16F00020985 /* KMTextfieldVC.xib in Resources */,
 				9FA607E328FD4C9F00B46586 /* KMHomePopViewController.xib in Resources */,
 				F356720A29AF184A00740FF3 /* CPDFListAnnotationNoteWindowController.xib in Resources */,
-				BB8AA53D2CC65C900084F183 /* KMNMultiController.xib in Resources */,
+				BB8AA53D2CC65C900084F183 /* KMNAlignmentController.xib in Resources */,
 				658FDBB72C9D90CE00EFA72E /* KMNoteFilterStateCollevtionViewItem.xib in Resources */,
 				BB10FAF42AFE23BE00F18D65 /* LineInspector.xib in Resources */,
 				BB183DD62B4EAD5400F99C7E /* Ubuntu-Bold.ttf in Resources */,
@@ -16790,7 +16778,6 @@
 				BBFE14D42BFD7FC300176992 /* KMCouponDueWindowController.xib in Resources */,
 				BB5F8A1B29BB15AD00365ADB /* pic_mail.pdf in Resources */,
 				AD3AAD952B1034C000DE5FE7 /* KMHeaderFooterView.xib in Resources */,
-				9F00CCEF2A309E8E00AC462E /* KMEditImagePropertyViewController.xib in Resources */,
 				BB1B0B0C2B4FC6E900889528 /* KMGuideInfoWindow.xib in Resources */,
 				BB1B0AC42B4FC6E900889528 /* KMFunctionGuideWindowController.xib in Resources */,
 				BBC4F9F02AEB58470098A1A8 /* KMAlertWindowController.xib in Resources */,
@@ -17135,7 +17122,6 @@
 				BB2A984A2B26A99A00647AF3 /* KMBatchAddWatermarkOperation.swift in Sources */,
 				BBB9B30D299A5D6D004F3235 /* KMCloudUploadOperationQueue.m in Sources */,
 				BB146FC6299DC0D100784A6A /* GTMSessionFetcherService.m in Sources */,
-				89E9B406295D268E00AEFA61 /* KMEditImagePropertyViewController.swift in Sources */,
 				899700F628F4051B009AF911 /* KMAnnotationViewController.swift in Sources */,
 				F359916929261F0D000D25DE /* CPDFListView+Tool.m in Sources */,
 				9F3D819329A33A290087B5AD /* KMDesignDropdown.swift in Sources */,
@@ -18272,7 +18258,7 @@
 				BB4A94A42B04DA0C00940F8B /* KMGOCRManagerNew.swift in Sources */,
 				BB3D07632CD0821F00EB94DF /* KMPDFSplitView.swift in Sources */,
 				9F1FE3DE293EE51F00E952CA /* KMMainDocument.swift in Sources */,
-				BB8AA5382CC65C900084F183 /* KMNMultiController.swift in Sources */,
+				BB8AA5382CC65C900084F183 /* KMNAlignmentController.swift in Sources */,
 				AD85D1A42AF09864000F4D28 /* KMHomeQuickToolsWindowController.swift in Sources */,
 				BBB9B31F299A5D6D004F3235 /* KMGoogleDriveManager.m in Sources */,
 				BB1BFF8E2AEA547B003EB179 /* NSButton+CustomAppearance.swift in Sources */,
@@ -18454,7 +18440,6 @@
 				BB146FC7299DC0D100784A6A /* GTMSessionFetcherService.m in Sources */,
 				BB52F5972CC245BF007418DB /* KMLinkPopupWebView.swift in Sources */,
 				BB8B17332907B63D001C5EA5 /* CipherTextView.swift in Sources */,
-				89E9B407295D268E00AEFA61 /* KMEditImagePropertyViewController.swift in Sources */,
 				ADDF83812B391A5D00A81A4E /* DSignatureSaveFolderViewController.swift in Sources */,
 				F3A0F85A2CC940DD00E7373F /* KMNPDFInsertBlankWindowController.swift in Sources */,
 				BB9599C42B31647B0062D346 /* KMRedactPropertiesWindowController.swift in Sources */,
@@ -19409,7 +19394,7 @@
 				BB7256B42CDB816100B6CE64 /* KMBackgroundPropertyController.swift in Sources */,
 				BB146FE5299DC0D100784A6A /* GTLRURITemplate.m in Sources */,
 				9F1FE4F129406E4700E952CA /* BackgroundGradientView.m in Sources */,
-				BB8AA5392CC65C900084F183 /* KMNMultiController.swift in Sources */,
+				BB8AA5392CC65C900084F183 /* KMNAlignmentController.swift in Sources */,
 				BBAC26A52AFE134300563A08 /* KMToolbarItemPopViewController.swift in Sources */,
 				9F0CB4BE2977C06300007028 /* KMPropertiesPanelColorSubVC.swift in Sources */,
 				9F94617E2BD643720076574B /* KMTableAnnotation.m in Sources */,
@@ -20003,7 +19988,6 @@
 				ADFA8EFF2B5649AE002595A4 /* KMAutoFlowOptionsSheetController.swift in Sources */,
 				BB88109C2B4F7CD100AFA63E /* KMVerificationTrialViewController.m in Sources */,
 				BB2EDF6C296ECE17003BCF58 /* KMPageEditInsertTypeItemView.swift in Sources */,
-				BBD7FE052A1323A400F96075 /* KMEditImagePropertyViewController.swift in Sources */,
 				BBBB6CD02AD13E210035AA66 /* CPDFButtonWidgetAnnotation+PDFListView.swift in Sources */,
 				BBB789AD2BE8BF2400F7E09C /* AIChatDefaultTIpItem.swift in Sources */,
 				9F1FE4D729406E4700E952CA /* NSPasteboard+Utils.m in Sources */,
@@ -20522,7 +20506,7 @@
 				ADE3C1A129A3894900793B13 /* KMSearchTableRowView.swift in Sources */,
 				BB2C845C2BAE6DC100AF6142 /* KMLeftMethodMode.swift in Sources */,
 				AD1CA41B2A061CE10070541F /* KMAnnotationScreenTypeViewItem.swift in Sources */,
-				BB8AA53A2CC65C900084F183 /* KMNMultiController.swift in Sources */,
+				BB8AA53A2CC65C900084F183 /* KMNAlignmentController.swift in Sources */,
 				BBE0689C2CDDF137000512BC /* KMBatesTemplateController.swift in Sources */,
 				BB276A4E2B03760000AB5578 /* KMOperationQueue.swift in Sources */,
 				9F94617F2BD643720076574B /* KMTableAnnotation.m in Sources */,

+ 83 - 129
PDF Office/PDF Reader Pro.xcodeproj/xcuserdata/kdanmobile.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -14,28 +14,28 @@
             filePath = "PDF Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "2914"
-            endingLineNumber = "2914"
+            startingLineNumber = "2913"
+            endingLineNumber = "2913"
             landmarkName = "toolbarViewController(_:zoomModel:)"
             landmarkType = "7">
             <Locations>
                <Location
-                  uuid = "CBD5F2A0-D33B-4635-AABA-000A5C35975E - 89ff5705237bd04f"
+                  uuid = "CBD5F2A0-D33B-4635-AABA-000A5C35975E - b2a76df9271149d3"
                   shouldBeEnabled = "Yes"
                   ignoreCount = "0"
                   continueAfterRunningActions = "No"
-                  symbolName = "PDF_Reader_Pro.KMMainViewController.changeModelAction(mode: __C.CToolMode) -&gt; ()"
+                  symbolName = "PDF_Reader_Pro.KMMainViewController.toolbarViewController(_: PDF_Reader_Pro.KMToolbarViewController, zoomModel: Swift.Int) -&gt; ()"
                   moduleName = "PDF Reader Pro"
                   usesParentBreakpointCondition = "Yes"
                   urlString = "file:///Users/kdanmobile/Documents/Git/PDF_Office/PDF%20Office/PDF%20Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift"
                   startingColumnNumber = "9223372036854775807"
                   endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "2915"
-                  endingLineNumber = "2915"
-                  offsetFromSymbolStart = "52">
+                  startingLineNumber = "2913"
+                  endingLineNumber = "2913"
+                  offsetFromSymbolStart = "180">
                </Location>
                <Location
-                  uuid = "CBD5F2A0-D33B-4635-AABA-000A5C35975E - b2a76df9271149fc"
+                  uuid = "CBD5F2A0-D33B-4635-AABA-000A5C35975E - b2a76df9271149d3"
                   shouldBeEnabled = "Yes"
                   ignoreCount = "0"
                   continueAfterRunningActions = "No"
@@ -45,8 +45,8 @@
                   urlString = "file:///Users/kdanmobile/Documents/Git/PDF_Office/PDF%20Office/PDF%20Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift"
                   startingColumnNumber = "9223372036854775807"
                   endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "2914"
-                  endingLineNumber = "2914"
+                  startingLineNumber = "2913"
+                  endingLineNumber = "2913"
                   offsetFromSymbolStart = "192">
                </Location>
             </Locations>
@@ -479,22 +479,6 @@
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "3CCC19B0-DCF3-4277-8D66-6A8C8E688349"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "PDF Master/Class/PDFTools/Merge/OCPart/KMBlankView.swift"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "165"
-            endingLineNumber = "165"
-            landmarkName = "mouseUp(with:)"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
@@ -1246,22 +1230,6 @@
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "E4416545-D9DE-4C3C-93D7-71A1ED6C4C1B"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "PDF Master/Class/PDFTools/Merge/OCPart/KMBlankView.swift"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "156"
-            endingLineNumber = "156"
-            landmarkName = "mouseDown(with:)"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
@@ -2146,26 +2114,11 @@
             filePath = "PDF Master/KMClass/KMPDFViewController/KMMainViewController.swift"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "225"
-            endingLineNumber = "225"
+            startingLineNumber = "223"
+            endingLineNumber = "223"
             landmarkName = "setDocument"
             landmarkType = "24">
             <Locations>
-               <Location
-                  uuid = "E3962D60-30EF-4185-BF07-EA1A34784887 - d80aac5b2f97b27d"
-                  shouldBeEnabled = "Yes"
-                  ignoreCount = "0"
-                  continueAfterRunningActions = "No"
-                  symbolName = "PDF_Reader_Pro.KMMainViewController.setDocument.getter : 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 = "223"
-                  endingLineNumber = "223"
-                  offsetFromSymbolStart = "28">
-               </Location>
                <Location
                   uuid = "E3962D60-30EF-4185-BF07-EA1A34784887 - c44283d1f17e1a62"
                   shouldBeEnabled = "Yes"
@@ -2196,21 +2149,6 @@
                   endingLineNumber = "0"
                   offsetFromSymbolStart = "20">
                </Location>
-               <Location
-                  uuid = "E3962D60-30EF-4185-BF07-EA1A34784887 - c44283d1f17e1a20"
-                  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 = "225"
-                  endingLineNumber = "225"
-                  offsetFromSymbolStart = "0">
-               </Location>
             </Locations>
          </BreakpointContent>
       </BreakpointProxy>
@@ -2368,13 +2306,13 @@
             filePath = "PDF Master/KMClass/KMPDFViewController/KMMainViewController.swift"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "922"
-            endingLineNumber = "922"
+            startingLineNumber = "935"
+            endingLineNumber = "935"
             landmarkName = "removePDFWatermark()"
             landmarkType = "7">
             <Locations>
                <Location
-                  uuid = "14EF9D11-330E-4DB1-A4D2-AA533CF55782 - ae5dbea256bda162"
+                  uuid = "14EF9D11-330E-4DB1-A4D2-AA533CF55782 - ae5dbea256bdaeb1"
                   shouldBeEnabled = "Yes"
                   ignoreCount = "0"
                   continueAfterRunningActions = "No"
@@ -2384,12 +2322,12 @@
                   urlString = "file:///Users/kdanmobile/Documents/Git/PDF_Office/PDF%20Office/PDF%20Master/KMClass/KMPDFViewController/KMMainViewController.swift"
                   startingColumnNumber = "9223372036854775807"
                   endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "922"
-                  endingLineNumber = "922"
-                  offsetFromSymbolStart = "1464">
+                  startingLineNumber = "935"
+                  endingLineNumber = "935"
+                  offsetFromSymbolStart = "1740">
                </Location>
                <Location
-                  uuid = "14EF9D11-330E-4DB1-A4D2-AA533CF55782 - ae5dbea256bda162"
+                  uuid = "14EF9D11-330E-4DB1-A4D2-AA533CF55782 - ae5dbea256bdaeb1"
                   shouldBeEnabled = "Yes"
                   ignoreCount = "0"
                   continueAfterRunningActions = "No"
@@ -2399,8 +2337,8 @@
                   urlString = "file:///Users/kdanmobile/Documents/Git/PDF_Office/PDF%20Office/PDF%20Master/KMClass/KMPDFViewController/KMMainViewController.swift"
                   startingColumnNumber = "9223372036854775807"
                   endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "922"
-                  endingLineNumber = "922"
+                  startingLineNumber = "935"
+                  endingLineNumber = "935"
                   offsetFromSymbolStart = "1496">
                </Location>
             </Locations>
@@ -3287,80 +3225,96 @@
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "BACB85CB-4643-458B-8AE5-1F468C92C60D"
+            uuid = "0AC8459B-171D-4BAD-824D-4B2F6D9C84FB"
             shouldBeEnabled = "Yes"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
-            filePath = "PDF Master/KMClass/KMPDFViewController/KMMainViewController.swift"
+            filePath = "PDF Master/KMClass/KMPDFViewController/RightSideController/Views/EditPDF/Manager/KMEditPDfHanddler.swift"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "2043"
-            endingLineNumber = "2043"
-            landmarkName = "pdfViewEditingDoubleClick(_:imageArea:)"
+            startingLineNumber = "837"
+            endingLineNumber = "837"
+            landmarkName = "cropCancelAction()"
             landmarkType = "7">
-            <Locations>
-               <Location
-                  uuid = "BACB85CB-4643-458B-8AE5-1F468C92C60D - 680781a5883eb184"
-                  shouldBeEnabled = "Yes"
-                  ignoreCount = "0"
-                  continueAfterRunningActions = "No"
-                  symbolName = "PDF_Reader_Pro.KMMainViewController.pdfListViewKeyDownIsContinue(_: Swift.Optional&lt;__C.CPDFListView&gt;, theEvent: Swift.Optional&lt;__C.NSEvent&gt;) -&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 = "2044"
-                  endingLineNumber = "2044"
-                  offsetFromSymbolStart = "176">
-               </Location>
-               <Location
-                  uuid = "BACB85CB-4643-458B-8AE5-1F468C92C60D - e2025f40cf5bd635"
-                  shouldBeEnabled = "Yes"
-                  ignoreCount = "0"
-                  continueAfterRunningActions = "No"
-                  symbolName = "PDF_Reader_Pro.KMMainViewController.pdfViewEditingDoubleClick(_: Swift.Optional&lt;__C.CPDFView&gt;, imageArea: Swift.Optional&lt;__C.CPDFEditArea&gt;) -&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 = "2043"
-                  endingLineNumber = "2043"
-                  offsetFromSymbolStart = "64">
-               </Location>
-            </Locations>
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "0AC8459B-171D-4BAD-824D-4B2F6D9C84FB"
+            uuid = "32DA0514-DAF0-4092-95CB-BBDEA54524EB"
             shouldBeEnabled = "Yes"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "PDF Master/KMClass/KMPDFViewController/RightSideController/Views/EditPDF/Manager/KMEditPDfHanddler.swift"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "837"
-            endingLineNumber = "837"
-            landmarkName = "cropCancelAction()"
+            startingLineNumber = "1285"
+            endingLineNumber = "1285"
+            landmarkName = "pdfViewEditingCropBoundsDidChanged(_:editing:)"
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "32DA0514-DAF0-4092-95CB-BBDEA54524EB"
+            uuid = "37DBDC3C-A131-4FE2-B891-A9F6290F1C21"
             shouldBeEnabled = "Yes"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
-            filePath = "PDF Master/KMClass/KMPDFViewController/RightSideController/Views/EditPDF/Manager/KMEditPDfHanddler.swift"
+            filePath = "PDF Master/Class/PDFTools/Print/KMPrintWindowController.swift"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "1285"
-            endingLineNumber = "1285"
-            landmarkName = "pdfViewEditingCropBoundsDidChanged(_:editing:)"
+            startingLineNumber = "95"
+            endingLineNumber = "95"
+            landmarkName = "windowDidLoad()"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "8EDB3030-91EA-445E-8D64-BFBB1A2CD276"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "PDF Master/KMClass/ImageToPDF/Controller/KMBatchOperateImageToPDFViewController.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "235"
+            endingLineNumber = "235"
+            landmarkName = "updateUILanguage()"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "842AC4D6-5CA6-440F-A002-6D891884C3CD"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "PDF Master/KMClass/KMPDFViewController/KMMainViewController.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "2014"
+            endingLineNumber = "2014"
+            landmarkName = "pdfViewEditingAddImageArea(_:add:add:)"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "18021D19-EAF7-4279-A121-953E8941B3AE"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "PDF Master/KMClass/KMPDFViewController/KMMainViewController.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "1994"
+            endingLineNumber = "1994"
+            landmarkName = "pdfViewEditingSelectionDidChanged(_:)"
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>