Browse Source

【2025】【Edit】页眉页脚逻辑完善

niehaoyu 4 months ago
parent
commit
5129079de8

+ 5 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/EditTool/Bates/KMBatesController.swift

@@ -76,10 +76,12 @@ class KMBatesController: NSViewController {
             
         } else if editSubType == .add {
             propertyController.view.isHidden = false
+            propertyController.editSubType = editSubType
             propertyController.reloadData()
             
         } else if editSubType == .edit {
             propertyController.view.isHidden = false
+            propertyController.editSubType = editSubType
             propertyController.reloadData()
          }
     }
@@ -145,6 +147,7 @@ extension KMBatesController: KMBatesPropertyControllerDelegate {
     
     func batesPropertyControllerDidChangetoTemplate(_ controller: KMBatesPropertyController) {
         editSubType = .template
+        resetUI()
         
         batesModel = nil
         
@@ -169,6 +172,7 @@ extension KMBatesController: KMBatesTemplateControllerDelegate {
     
     func templateControllerDidAddData(_ controller: KMBatesTemplateController) {
         editSubType = .add
+        resetUI()
         
         propertyController.clearData()
         propertyController.batesModel = KMBatesModel()
@@ -182,6 +186,7 @@ extension KMBatesController: KMBatesTemplateControllerDelegate {
     
     func templateControllerDidEditData(_ controller: KMBatesTemplateController, _ data: KMBatesModel) {
         editSubType = .edit
+        resetUI()
         
         propertyController.batesModel = data
         

+ 1 - 1
PDF Office/PDF Master/KMClass/KMPDFViewController/EditTool/Bates/KMBatesManager.swift

@@ -177,7 +177,7 @@ class KMBatesManager: NSObject {
     /**
         `Private Methods`
      */
-    private func parseModel(model: KMBatesModel) -> Dictionary<String, Any> {
+    func parseModel(model: KMBatesModel) -> Dictionary<String, Any> {
         var dict: [String : Any] = [:]
         /// 字体相关
 //        switch model.textFont {

+ 55 - 3
PDF Office/PDF Master/KMClass/KMPDFViewController/EditTool/Bates/Views/KMBatesPropertyController.swift

@@ -20,7 +20,7 @@ import KMComponentLibrary
     @objc optional func batesPropertyControllerSaveTemplateSuccess(_ controller: KMBatesPropertyController, _ data: KMBatesModel)
     
     //取消修改模板信息
-    //    @objc optional func headerFooterPropertyControllerCancelTemplateEdit(_ controller: KMNWatermarkPropertyController)
+    @objc optional func batesPropertyControllerCancelTemplateEdit(_ controller: KMBatesPropertyController)
     
 }
 
@@ -30,6 +30,7 @@ class KMBatesPropertyController: NSViewController {
     
     @IBOutlet var titleLabel: NSTextField!
     @IBOutlet var templateButton: ComponentButton!
+    @IBOutlet var leftTopButton: ComponentButton!
     
     //Font
     @IBOutlet var fontBGView: NSView!
@@ -74,9 +75,12 @@ class KMBatesPropertyController: NSViewController {
     private var familyNames = CPDFFont.familyNames
     private var positionSelRow: Int = -1
     private var positionSelColumn: Int = -1
-     
-    var totalPDFCount: Int = 1
+    private var isEditModeChanged: Bool = false //修改时,记录是否有做过调整
+    
     var batesModel: KMBatesModel = KMBatesModel()
+    var totalPDFCount: Int = 1
+    var originalDataDict: Dictionary<String, Any>?
+    var editSubType: KMPDFEditSubModeType = .none
     
     weak open var delegate: KMBatesPropertyControllerDelegate?
     
@@ -100,6 +104,9 @@ class KMBatesPropertyController: NSViewController {
         templateButton.properties = ComponentButtonProperty(type: .text_gray, size: .xxs, onlyIcon: true, icon: NSImage(named: "icon_wm_template"), keepPressState: false)
         templateButton.setTarget(self, action: #selector(componentButtonClicked(_:)))
         
+        leftTopButton.properties = ComponentButtonProperty(type: .text_gray, size: .xxs, onlyIcon: true, icon: NSImage(named: "watermark_arrowLeft"), keepPressState: false)
+        leftTopButton.setTarget(self, action: #selector(leftTopButtonClicked(_:)))
+ 
         //Font
         fontLabel.stringValue = KMLocalizedString("Font")
         fontLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/2")
@@ -232,6 +239,19 @@ class KMBatesPropertyController: NSViewController {
     }
     
     func reloadData() {
+        
+        titleLabel.stringValue = KMLocalizedString("Add Bates")
+        leftTopButton.isHidden = true
+        saveTemplateBGView.isHidden = false
+        templateButton.properties.icon = NSImage(named: "icon_wm_template")
+        if editSubType == .edit {
+            titleLabel.stringValue = KMLocalizedString("Edit Bates")
+            leftTopButton.isHidden = false
+            saveTemplateBGView.isHidden = true
+            templateButton.properties.icon = NSImage(named: "edit_save")
+        }
+        templateButton.reloadData()
+        
         //Font
         if let index = familyNames.firstIndex(of: batesModel.fontName){
             fontNameSelect.selectItemAtIndex(index)
@@ -327,6 +347,38 @@ class KMBatesPropertyController: NSViewController {
     }
     
     //MARK: - Action
+    @objc func leftTopButtonClicked(_ sender: ComponentButton) {
+        if sender == leftTopButton {
+            if isEditModeChanged == true {
+                let alert = NSAlert()
+                alert.alertStyle = .critical
+                alert.messageText = KMLocalizedString("Save template changes?")
+                alert.informativeText = KMLocalizedString("Cancel and they will not be saved.")
+                alert.addButton(withTitle: KMLocalizedString("Save"))
+                alert.addButton(withTitle: KMLocalizedString("Cancel"))
+                alert.beginSheetModal(for: NSApp.mainWindow!) { (response) in
+                    if response == NSApplication.ModalResponse.alertFirstButtonReturn {
+//                        let _ = KMHeaderFooterManager.defaultManager.updateHeaderFooter(theModel: self.headerFooterModel)
+
+                        self.isEditModeChanged = false
+                    } else {
+                        if let dict = self.originalDataDict {
+//                            KMHeaderFooterManager.defaultManager.updateModel(self.headerFooterModel, with: dict as NSDictionary)
+//                            let _ = KMHeaderFooterManager.defaultManager.updateHeaderFooter(theModel: self.headerFooterModel)
+                        }
+                        self.delegate?.batesPropertyControllerCancelTemplateEdit?(self)
+                        
+                        self.isEditModeChanged = false
+                    }
+                }
+            } else {
+                delegate?.batesPropertyControllerCancelTemplateEdit?(self)
+
+                isEditModeChanged = false
+            }
+        }
+    }
+    
     @objc func componentButtonClicked(_ sender: ComponentButton) {
         if sender == templateButton {
             delegate?.batesPropertyControllerDidChangetoTemplate?(self)

+ 10 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/EditTool/Bates/Views/KMBatesPropertyController.xib

@@ -23,6 +23,7 @@
                 <outlet property="layoutLabel" destination="GFB-ba-xZF" id="ZGo-IA-qTv"/>
                 <outlet property="layoutPosition" destination="DWX-yy-Go7" id="KNB-bG-BUf"/>
                 <outlet property="layoutTextarea" destination="LsP-FL-G4W" id="C90-mh-Jz4"/>
+                <outlet property="leftTopButton" destination="yw0-h6-ede" id="Uy7-Fh-719"/>
                 <outlet property="marginBGView" destination="TJy-wt-qBY" id="Ps8-VM-kpC"/>
                 <outlet property="marginBottomInput" destination="zzh-Lv-dWe" id="0Ou-Ik-rUk"/>
                 <outlet property="marginLabel" destination="fp5-OG-xQL" id="Qty-AW-6Vi"/>
@@ -75,6 +76,13 @@
                                         <constraint firstAttribute="height" constant="1" id="9le-PX-nVC"/>
                                     </constraints>
                                 </customView>
+                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="yw0-h6-ede" customClass="ComponentButton" customModule="KMComponentLibrary">
+                                    <rect key="frame" x="8" y="8" width="24" height="24"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="24" id="8RO-7t-lqz"/>
+                                        <constraint firstAttribute="width" constant="24" id="MKv-5H-lh8"/>
+                                    </constraints>
+                                </customView>
                             </subviews>
                             <constraints>
                                 <constraint firstAttribute="trailing" secondItem="coz-u2-B90" secondAttribute="trailing" id="7k2-Mc-Ade"/>
@@ -82,8 +90,10 @@
                                 <constraint firstItem="kE5-gY-d9o" firstAttribute="centerY" secondItem="rT8-vR-Jg5" secondAttribute="centerY" id="L08-DP-fA9"/>
                                 <constraint firstAttribute="bottom" secondItem="coz-u2-B90" secondAttribute="bottom" id="WW5-ga-PvO"/>
                                 <constraint firstItem="P8U-H2-bhU" firstAttribute="centerY" secondItem="rT8-vR-Jg5" secondAttribute="centerY" id="Ywj-Ti-Upq"/>
+                                <constraint firstItem="yw0-h6-ede" firstAttribute="leading" secondItem="rT8-vR-Jg5" secondAttribute="leading" constant="8" id="rii-IV-6UD"/>
                                 <constraint firstItem="P8U-H2-bhU" firstAttribute="centerX" secondItem="rT8-vR-Jg5" secondAttribute="centerX" id="sDY-CK-V4q"/>
                                 <constraint firstItem="coz-u2-B90" firstAttribute="leading" secondItem="rT8-vR-Jg5" secondAttribute="leading" id="wQK-DZ-q4k"/>
+                                <constraint firstItem="yw0-h6-ede" firstAttribute="centerY" secondItem="rT8-vR-Jg5" secondAttribute="centerY" id="yLX-xe-YU1"/>
                                 <constraint firstAttribute="height" constant="40" id="yel-iW-dN3"/>
                             </constraints>
                         </customView>

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

@@ -432,7 +432,7 @@ class KMNWatermarkPropertyController: NSViewController {
                     } else {
                         if let dict = self.originalDataDict {
                             KMWatermarkManager.defaultManager.setDictToWatermarK(dict: dict as NSDictionary, self.watermarkData)
-                            KMWatermarkManager.defaultManager.updateWatermark(watermark: self.watermarkData)
+                            let _ = KMWatermarkManager.defaultManager.updateWatermark(watermark: self.watermarkData)
                         }
                         self.delegate?.watermarkPropertyControllerCancelTemplateEdit?(self)
                         

+ 5 - 5
PDF Office/PDF Master/KMClass/KMPDFViewController/EditTool/Watermark/New/Views/KMNWatermarkPropertyController.xib

@@ -65,7 +65,7 @@
                                         <constraint firstAttribute="width" constant="24" id="V6G-e8-fcR"/>
                                     </constraints>
                                 </customView>
-                                <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="jkG-Uv-4gv">
+                                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="jkG-Uv-4gv">
                                     <rect key="frame" x="88" y="12" width="98" height="16"/>
                                     <textFieldCell key="cell" lineBreakMode="clipping" title="Add Watermark" id="7Za-QS-Sai">
                                         <font key="font" usesAppearanceFont="YES"/>
@@ -207,7 +207,7 @@
                                         <customView translatesAutoresizingMaskIntoConstraints="NO" id="5EC-ec-yKw">
                                             <rect key="frame" x="0.0" y="184" width="232" height="40"/>
                                             <subviews>
-                                                <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Zph-wi-6i3">
+                                                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Zph-wi-6i3">
                                                     <rect key="frame" x="-2" y="12" width="77" height="16"/>
                                                     <textFieldCell key="cell" lineBreakMode="clipping" title="Appearance" id="34Z-Ne-M34">
                                                         <font key="font" usesAppearanceFont="YES"/>
@@ -322,7 +322,7 @@
                                         <customView translatesAutoresizingMaskIntoConstraints="NO" id="wp3-Sk-MRP">
                                             <rect key="frame" x="0.0" y="152" width="232" height="40"/>
                                             <subviews>
-                                                <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gTg-8Q-bmp">
+                                                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gTg-8Q-bmp">
                                                     <rect key="frame" x="-2" y="12" width="85" height="16"/>
                                                     <textFieldCell key="cell" lineBreakMode="clipping" title="Position(mm)" id="oaL-Vx-zTi">
                                                         <font key="font" usesAppearanceFont="YES"/>
@@ -344,7 +344,7 @@
                                                 <constraint firstAttribute="height" constant="72" id="pLe-tX-JlT"/>
                                             </constraints>
                                         </customView>
-                                        <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="qVQ-To-3Au">
+                                        <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="qVQ-To-3Au">
                                             <rect key="frame" x="119" y="128" width="17" height="16"/>
                                             <textFieldCell key="cell" lineBreakMode="clipping" title="X:" id="zUo-XG-CKN">
                                                 <font key="font" usesAppearanceFont="YES"/>
@@ -359,7 +359,7 @@
                                                 <constraint firstAttribute="width" constant="96" id="mzL-IX-KEf"/>
                                             </constraints>
                                         </customView>
-                                        <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="yrr-gh-114">
+                                        <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="yrr-gh-114">
                                             <rect key="frame" x="120" y="88" width="16" height="16"/>
                                             <textFieldCell key="cell" lineBreakMode="clipping" title="Y:" id="kZA-Cu-HgA">
                                                 <font key="font" usesAppearanceFont="YES"/>

+ 24 - 1
PDF Office/PDF Master/KMClass/KMPDFViewController/HeaderFooter/KMHeaderFooterController.swift

@@ -75,10 +75,12 @@ class KMHeaderFooterController: NSViewController {
             
         } else if editSubType == .add {
             propertyController.view.isHidden = false
+            propertyController.editSubType = editSubType
             propertyController.reloadData()
             
         } else if editSubType == .edit {
             propertyController.view.isHidden = false
+            propertyController.editSubType = editSubType
             propertyController.reloadData()
             
         }
@@ -145,6 +147,7 @@ extension KMHeaderFooterController: KMHeaderPropertyControllerDelegate {
     
     func headerFooterPropertyControllerDidChangetoTemplate(_ controller: KMHeaderPropertyController) {
         editSubType = .template
+        resetUI()
         
         headerFooterModel = nil
         
@@ -159,13 +162,30 @@ extension KMHeaderFooterController: KMHeaderPropertyControllerDelegate {
     
     func headerFooterPropertyControllerSaveTemplateSuccess(_ controller: KMHeaderPropertyController, _ data: KMHeaderFooterObject) {
         editSubType = .template
+        resetUI()
         
         reloadData()
         
+        updatePDFDocumentHeaderFooter()
+        
         delegate?.kmHeaderFooterControllerDidUpdateMode?(self)
         
         delegate?.kmHeaderFooterControllerDidModelDataUpdated?(self)
     }
+    
+    func headerFooterPropertyControllerCancelTemplateEdit(_ controller: KMHeaderPropertyController) {
+        editSubType = .template
+        resetUI()
+        
+        updatePDFDocumentHeaderFooter()
+        
+        reloadData()
+        
+        delegate?.kmHeaderFooterControllerDidUpdateMode?(self)
+        
+        delegate?.kmHeaderFooterControllerDidModelDataUpdated?(self)
+        
+    }
 }
 
 
@@ -181,9 +201,10 @@ extension KMHeaderFooterController: KMHFTemplateControllerDelegate {
     
     func templateControllerDidAddData(_ controller: KMHFTemplateController) {
         editSubType = .add
+        resetUI()
     
         propertyController.clearData()
-        propertyController.headerFooterModel = KMHeaderFooterObject.defaultData()
+        propertyController.headerFooterModel = KMHeaderFooterObject()
         
         updatePDFDocumentHeaderFooter()
         
@@ -197,7 +218,9 @@ extension KMHeaderFooterController: KMHFTemplateControllerDelegate {
     
     func templateControllerDidEditData(_ controller: KMHFTemplateController, _ data: KMHeaderFooterObject) {
         editSubType = .edit
+        resetUI()
         
+        propertyController.originalDataDict = KMHeaderFooterManager.defaultManager.parseModel(model: data)
         propertyController.headerFooterModel = data
         
         updatePDFDocumentHeaderFooter()

+ 77 - 5
PDF Office/PDF Master/KMClass/KMPDFViewController/HeaderFooter/KMHeaderFooterManager.swift

@@ -114,8 +114,78 @@ class KMHeaderFooterManager: NSObject {
         return result
     }
     
+    func updateHeaderFooter(theModel: KMHeaderFooterObject) -> Bool {
+         
+        var flagModel: KMHeaderFooterObject!
+        for model in self.headFooterObjects {
+            if (model.tag == theModel.tag) {
+                flagModel = model
+                break
+            }
+        }
+        
+        if (flagModel == nil) {
+            return false
+        }
+        
+        let dict = NSDictionary(contentsOfFile: kHeaderFooterPlistPath!)
+        var newDict:NSMutableDictionary!
+        if (dict != nil) {
+            newDict = NSMutableDictionary(dictionary: dict!)
+        } else {
+            newDict = NSMutableDictionary()
+        }
+        
+        let watermarkDict = self.parseModel(model: theModel)
+        if (watermarkDict.isEmpty) {
+            let alert = NSAlert()
+            alert.alertStyle = .critical
+//            alert.messageText = NSLocalizedString("文件\(watermark.imagePath?.lastPathComponent)已损坏", comment: "")
+            alert.runModal()
+            return false
+        }
+        
+        newDict.setObject(watermarkDict, forKey: flagModel.tag as NSCopying)
+        let result = newDict.write(toFile: kHeaderFooterPlistPath!, atomically: true)
+        if (result) {
+            if let index = self.headFooterObjects.firstIndex(of: flagModel) {
+                self.headFooterObjects[index] = theModel
+            }
+        }
+        
+        return result
+    }
+    
+    
+    func updateModel(_ model: KMHeaderFooterObject, with dict: NSDictionary) {
+        model.fontName = dict.object(forKey: "fontName") as! String
+        model.fontsize = dict.object(forKey: "fontsize") as! CGFloat
+        
+        if let value = dict.object(forKey: "color") {
+            model.color = NSColor.km_init(hex: value as! String)
+        }
+        
+        model.leftMargin = dict.object(forKey: "leftMargin") as! Int
+        model.rightMargin = dict.object(forKey: "rightMargin") as! Int
+        model.bottomMargin = dict.object(forKey: "bottomMargin") as! Int
+        model.topMargin = dict.object(forKey: "topMargin") as! Int
+        
+        model.topLeftString = dict.object(forKey: "topLeftString") as! String
+        model.topCenterString = dict.object(forKey: "topCenterString") as! String
+        model.topRightString = dict.object(forKey: "topRightString") as! String
+        model.bottomLeftString = dict.object(forKey: "bottomLeftString") as! String
+        model.bottomCenterString = dict.object(forKey: "bottomCenterString") as! String
+        model.bottomRightString = dict.object(forKey: "bottomRightString") as! String
+        
+        model.dateFormatString = dict.object(forKey: "dateFormatString") as! String
+        model.pageFormatString = dict.object(forKey: "pageFormatString") as! String
+        model.startString = dict.object(forKey: "startString") as! String
+        model.name = dict.object(forKey: "name") as! String
+        model.tag = dict.object(forKey: "tag") as! String
+    }
+    
     //Parse
-    private func parseModel(model: KMHeaderFooterObject) -> Dictionary<String, Any> {
+    func parseModel(model: KMHeaderFooterObject) -> Dictionary<String, Any> {
         var dict: [String : Any] = [:]
         
         dict["fontName"] = model.fontName
@@ -174,6 +244,8 @@ class KMHeaderFooterManager: NSObject {
          
         return model
     }
+    
+    
 
     func fetchHeaderFooterAvailableName() -> String {
         var availableIndex = 0
@@ -193,13 +265,13 @@ class KMHeaderFooterManager: NSObject {
 
 extension KMHeaderFooterManager {
     func fetchPlistData() -> [KMHeaderFooterObject] {
-
-            return []
-
+        
+        return []
+        
     }
     
     func savePlistData() {
-
+        
     }
 }
 

+ 3 - 31
PDF Office/PDF Master/KMClass/KMPDFViewController/HeaderFooter/KMHeaderFooterObject.swift

@@ -37,34 +37,6 @@ class KMHeaderFooterObject: NSObject {
         
         self.name = ""
     }
-     
-    class func defaultData() -> KMHeaderFooterObject {
-        let data = KMHeaderFooterObject()
-        
-//        data.type = .color
-// 
-//        if let color = KMPDFWatermarkData.watermarkDefaultColors().first {
-//            data.color = color
-//        }
-//        
-//        data.imagePath = nil
-//        data.rotation = 0
-//        data.opacity = 1
-//        
-//        data.isScale = false
-//        data.scale = 1
-//      
-//        data.verticalMode = 1
-//        data.horizontalMode = 1
-//        
-//        data.verticalSpace = 0
-//        data.horizontalSpace = 0
-//        
-//        data.backgroundID = NSString.tagString()
-//        data.name = KMBackgroundManager.defaultManager.fetchAvailableBackgroundName()
-        
-        return data
-    }
     
     static func parseModel(model: KMHeaderFooterObject, pageCount: Int) -> [String] {
         var topLeftString: String = ""
@@ -141,13 +113,13 @@ class KMHeaderFooterObject: NSObject {
         var result: String = formatString
         for dateFormat in KMHeaderFooterManager.getdateFormatArray() {
             if (result.contains(dateFormat)) {
-                var formatString: String = dateFormat.replacingOccurrences(of: "m", with: "M")
-                var replace = "<<\(dateFormat)>>"
+                let formatString: String = dateFormat.replacingOccurrences(of: "m", with: "M")
+                let replace = "<<\(dateFormat)>>"
                 
                 let date = Date()
                 let dateFormatter = DateFormatter()
                 dateFormatter.dateFormat = formatString
-                var dateString = dateFormatter.string(from: date)
+                let dateString = dateFormatter.string(from: date)
                 result = result.replacingOccurrences(of: replace, with: dateString)
             }
         }

+ 65 - 4
PDF Office/PDF Master/KMClass/KMPDFViewController/HeaderFooter/Views/KMHeaderPropertyController.swift

@@ -20,7 +20,7 @@ import KMComponentLibrary
     @objc optional func headerFooterPropertyControllerSaveTemplateSuccess(_ controller: KMHeaderPropertyController, _ data: KMHeaderFooterObject)
 
     //取消修改模板信息
-//    @objc optional func headerFooterPropertyControllerCancelTemplateEdit(_ controller: KMNWatermarkPropertyController)
+    @objc optional func headerFooterPropertyControllerCancelTemplateEdit(_ controller: KMHeaderPropertyController)
 
 }
 
@@ -30,6 +30,7 @@ class KMHeaderPropertyController: NSViewController {
     
     @IBOutlet var titleLabel: NSTextField!
     @IBOutlet var templateButton: ComponentButton!
+    @IBOutlet var leftTopButton: ComponentButton!
     
     //Font
     @IBOutlet var fontBGView: NSView!
@@ -73,8 +74,11 @@ class KMHeaderPropertyController: NSViewController {
     
     private var positionSelRow: Int = -1
     private var positionSelColumn: Int = -1
+     
+    private var isEditModeChanged: Bool = false //修改时,记录是否有做过调整
     
     var totalPDFCount: Int = 1
+    var originalDataDict: Dictionary<String, Any>?
     var headerFooterModel: KMHeaderFooterObject = KMHeaderFooterObject()
     
     weak open var delegate: KMHeaderPropertyControllerDelegate?
@@ -100,6 +104,9 @@ class KMHeaderPropertyController: NSViewController {
         templateButton.properties = ComponentButtonProperty(type: .text_gray, size: .xxs, onlyIcon: true, icon: NSImage(named: "icon_wm_template"), keepPressState: false)
         templateButton.setTarget(self, action: #selector(componentButtonClicked(_:)))
         
+        leftTopButton.properties = ComponentButtonProperty(type: .text_gray, size: .xxs, onlyIcon: true, icon: NSImage(named: "watermark_arrowLeft"), keepPressState: false)
+        leftTopButton.setTarget(self, action: #selector(leftTopButtonClicked(_:)))
+ 
         //Font
         fontLabel.stringValue = KMLocalizedString("Font")
         fontLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/2")
@@ -240,6 +247,18 @@ class KMHeaderPropertyController: NSViewController {
     
     func reloadData() {
         
+        titleLabel.stringValue = KMLocalizedString("Add Header & Footer")
+        leftTopButton.isHidden = true
+        saveTemplateBGView.isHidden = false
+        templateButton.properties.icon = NSImage(named: "icon_wm_template")
+        if editSubType == .edit {
+            titleLabel.stringValue = KMLocalizedString("Edit Header & Footer")
+            leftTopButton.isHidden = false
+            saveTemplateBGView.isHidden = true
+            templateButton.properties.icon = NSImage(named: "edit_save")
+        }
+        templateButton.reloadData()
+        
         //Font
         if let index = familyNames.firstIndex(of: headerFooterModel.fontName) {
             fontNameSelect.selectItemAtIndex(index)
@@ -345,6 +364,37 @@ class KMHeaderPropertyController: NSViewController {
     }
     
     //MARK: - Action
+    @objc func leftTopButtonClicked(_ sender: ComponentButton) {
+        if sender == leftTopButton {
+            if isEditModeChanged == true {
+                let alert = NSAlert()
+                alert.alertStyle = .critical
+                alert.messageText = KMLocalizedString("Save template changes?")
+                alert.informativeText = KMLocalizedString("Cancel and they will not be saved.")
+                alert.addButton(withTitle: KMLocalizedString("Save"))
+                alert.addButton(withTitle: KMLocalizedString("Cancel"))
+                alert.beginSheetModal(for: NSApp.mainWindow!) { (response) in
+                    if response == NSApplication.ModalResponse.alertFirstButtonReturn {
+                        let _ = KMHeaderFooterManager.defaultManager.updateHeaderFooter(theModel: self.headerFooterModel)
+
+                        self.isEditModeChanged = false
+                    } else {
+                        if let dict = self.originalDataDict {
+                            KMHeaderFooterManager.defaultManager.updateModel(self.headerFooterModel, with: dict as NSDictionary)
+                            let _ = KMHeaderFooterManager.defaultManager.updateHeaderFooter(theModel: self.headerFooterModel)
+                        }
+                        self.delegate?.headerFooterPropertyControllerCancelTemplateEdit?(self)
+                        
+                        self.isEditModeChanged = false
+                    }
+                }
+            } else {
+                delegate?.headerFooterPropertyControllerCancelTemplateEdit?(self)
+
+                isEditModeChanged = false
+            }
+        }
+    }
     
     @objc func componentButtonClicked(_ sender: ComponentButton) {
         if sender == templateButton {
@@ -404,6 +454,9 @@ extension KMHeaderPropertyController: ComponentCColorDelegate {
         reloadData()
         
         delegate?.headerFooterPropertyControllerDidUpdate?(self)
+        
+        isEditModeChanged = true
+        
     }
 }
 
@@ -429,8 +482,9 @@ extension KMHeaderPropertyController: ComponentInputNumberDelegate {
         }
         reloadData()
         
-        delegate?.headerFooterPropertyControllerDidUpdate?(self)
+        isEditModeChanged = true
         
+        delegate?.headerFooterPropertyControllerDidUpdate?(self)
     }
 }
 
@@ -461,6 +515,8 @@ extension KMHeaderPropertyController: ComponentSelectDelegate {
         
         reloadData()
         
+        isEditModeChanged = true
+        
         delegate?.headerFooterPropertyControllerDidUpdate?(self)
         
     }
@@ -507,9 +563,10 @@ extension KMHeaderPropertyController: ComponentGroupDelegate {
                 }
             }
         }
-        
         reloadData()
         
+        isEditModeChanged = true
+        
         updateTextAreaText()
         
         delegate?.headerFooterPropertyControllerDidUpdate?(self)
@@ -527,7 +584,9 @@ extension KMHeaderPropertyController: ComponentCPositionDelegate {
             positionSelColumn = column
             
             reloadData()
-             
+            
+            isEditModeChanged = true
+            
             delegate?.headerFooterPropertyControllerDidUpdate?(self)
             
         }
@@ -554,6 +613,8 @@ extension KMHeaderPropertyController: ComponentTextareaDelegate {
         
         reloadData()
         
+        isEditModeChanged = true
+        
         delegate?.headerFooterPropertyControllerDidUpdate?(self)
         
     }

+ 18 - 8
PDF Office/PDF Master/KMClass/KMPDFViewController/HeaderFooter/Views/KMHeaderPropertyController.xib

@@ -23,6 +23,7 @@
                 <outlet property="layoutLabel" destination="Xg1-2G-aDD" id="bnC-3r-Fzp"/>
                 <outlet property="layoutPosition" destination="kcs-nJ-GJk" id="J0v-3c-IoW"/>
                 <outlet property="layoutTextarea" destination="CPM-7y-iCy" id="HL4-ea-loX"/>
+                <outlet property="leftTopButton" destination="j35-RL-Fa9" id="RwJ-wM-oke"/>
                 <outlet property="marginBGView" destination="G5t-fV-I9G" id="aeZ-Bk-w7w"/>
                 <outlet property="marginBottomInput" destination="v1E-X3-hce" id="VGh-YB-ssn"/>
                 <outlet property="marginLabel" destination="fMm-Yh-O6N" id="plS-sl-tgr"/>
@@ -52,7 +53,7 @@
                         <customView translatesAutoresizingMaskIntoConstraints="NO" id="oDv-te-osP">
                             <rect key="frame" x="0.0" y="791" width="320" height="40"/>
                             <subviews>
-                                <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="XcY-yp-Dg5">
+                                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="XcY-yp-Dg5">
                                     <rect key="frame" x="94" y="12" width="132" height="16"/>
                                     <textFieldCell key="cell" lineBreakMode="clipping" title="Add Header &amp; Footer" id="5aw-vJ-O3w">
                                         <font key="font" usesAppearanceFont="YES"/>
@@ -73,6 +74,13 @@
                                         <constraint firstAttribute="height" constant="1" id="ozN-IS-VIf"/>
                                     </constraints>
                                 </customView>
+                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="j35-RL-Fa9" customClass="ComponentButton" customModule="KMComponentLibrary">
+                                    <rect key="frame" x="8" y="8" width="24" height="24"/>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="24" id="JAz-cq-aLt"/>
+                                        <constraint firstAttribute="width" constant="24" id="MiN-XM-kdw"/>
+                                    </constraints>
+                                </customView>
                             </subviews>
                             <constraints>
                                 <constraint firstAttribute="trailing" secondItem="dTb-pK-bqO" secondAttribute="trailing" id="60d-JN-au1"/>
@@ -82,7 +90,9 @@
                                 <constraint firstAttribute="trailing" secondItem="2ZK-TB-54l" secondAttribute="trailing" constant="8" id="dsv-PE-BTH"/>
                                 <constraint firstItem="2ZK-TB-54l" firstAttribute="centerY" secondItem="oDv-te-osP" secondAttribute="centerY" id="gue-tA-wjT"/>
                                 <constraint firstItem="dTb-pK-bqO" firstAttribute="leading" secondItem="oDv-te-osP" secondAttribute="leading" id="jfg-LU-HQk"/>
+                                <constraint firstItem="j35-RL-Fa9" firstAttribute="leading" secondItem="oDv-te-osP" secondAttribute="leading" constant="8" id="kDI-VY-s90"/>
                                 <constraint firstItem="XcY-yp-Dg5" firstAttribute="centerY" secondItem="oDv-te-osP" secondAttribute="centerY" id="tom-cu-78F"/>
+                                <constraint firstItem="j35-RL-Fa9" firstAttribute="centerY" secondItem="oDv-te-osP" secondAttribute="centerY" id="wg5-0q-BJZ"/>
                             </constraints>
                         </customView>
                         <customView translatesAutoresizingMaskIntoConstraints="NO" id="nYi-Nx-K3Z">
@@ -94,7 +104,7 @@
                                         <customView translatesAutoresizingMaskIntoConstraints="NO" id="COI-6x-UXb">
                                             <rect key="frame" x="0.0" y="72" width="232" height="40"/>
                                             <subviews>
-                                                <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="bpS-cS-091">
+                                                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="bpS-cS-091">
                                                     <rect key="frame" x="-2" y="12" width="32" height="16"/>
                                                     <textFieldCell key="cell" lineBreakMode="clipping" title="Font" id="rZY-dw-5M0">
                                                         <font key="font" usesAppearanceFont="YES"/>
@@ -151,7 +161,7 @@
                                         <customView translatesAutoresizingMaskIntoConstraints="NO" id="WET-Do-OrY">
                                             <rect key="frame" x="0.0" y="72" width="232" height="40"/>
                                             <subviews>
-                                                <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="fMm-Yh-O6N">
+                                                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="fMm-Yh-O6N">
                                                     <rect key="frame" x="-2" y="12" width="82" height="16"/>
                                                     <textFieldCell key="cell" lineBreakMode="clipping" title="Margin (mm)" id="UcQ-3y-2HK">
                                                         <font key="font" usesAppearanceFont="YES"/>
@@ -268,7 +278,7 @@
                                         <customView translatesAutoresizingMaskIntoConstraints="NO" id="lDc-1g-lQL">
                                             <rect key="frame" x="0.0" y="112" width="232" height="40"/>
                                             <subviews>
-                                                <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Gmb-UW-4Dx">
+                                                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Gmb-UW-4Dx">
                                                     <rect key="frame" x="-2" y="12" width="49" height="16"/>
                                                     <textFieldCell key="cell" lineBreakMode="clipping" title="Display" id="mR2-q4-DPD">
                                                         <font key="font" usesAppearanceFont="YES"/>
@@ -283,7 +293,7 @@
                                                 <constraint firstItem="Gmb-UW-4Dx" firstAttribute="centerY" secondItem="lDc-1g-lQL" secondAttribute="centerY" id="JLb-nz-FbX"/>
                                             </constraints>
                                         </customView>
-                                        <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="TNS-KG-jRl">
+                                        <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="TNS-KG-jRl">
                                             <rect key="frame" x="-2" y="88" width="37" height="16"/>
                                             <textFieldCell key="cell" lineBreakMode="clipping" title="Date:" id="yng-gX-MHn">
                                                 <font key="font" usesAppearanceFont="YES"/>
@@ -297,7 +307,7 @@
                                                 <constraint firstAttribute="height" constant="32" id="xiM-uk-RKG"/>
                                             </constraints>
                                         </customView>
-                                        <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="VCq-Ro-Dfg">
+                                        <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="VCq-Ro-Dfg">
                                             <rect key="frame" x="-2" y="48" width="42" height="16"/>
                                             <textFieldCell key="cell" lineBreakMode="clipping" title="Page: " id="hkj-dn-rz8">
                                                 <font key="font" usesAppearanceFont="YES"/>
@@ -311,7 +321,7 @@
                                                 <constraint firstAttribute="height" constant="32" id="8WU-xb-NwW"/>
                                             </constraints>
                                         </customView>
-                                        <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="iYo-cq-cCE">
+                                        <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="iYo-cq-cCE">
                                             <rect key="frame" x="-2" y="8" width="75" height="16"/>
                                             <textFieldCell key="cell" lineBreakMode="clipping" title="Start Page: " id="v5L-Rc-Xgp">
                                                 <font key="font" usesAppearanceFont="YES"/>
@@ -355,7 +365,7 @@
                                         <customView translatesAutoresizingMaskIntoConstraints="NO" id="6Ox-DM-ufe">
                                             <rect key="frame" x="0.0" y="120" width="232" height="40"/>
                                             <subviews>
-                                                <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Xg1-2G-aDD">
+                                                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Xg1-2G-aDD">
                                                     <rect key="frame" x="-2" y="12" width="110" height="16"/>
                                                     <textFieldCell key="cell" lineBreakMode="clipping" title="Layout &amp; Content" id="Led-Ha-rjq">
                                                         <font key="font" usesAppearanceFont="YES"/>

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

@@ -11972,8 +11972,8 @@
 				BB5DF1E52959C5760025CDA1 /* HeaderFooter */,
 				BB0F58602CDB70DE00B4D353 /* Background */,
 				BB0F585F2CDB70BD00B4D353 /* SinglePagePDFController */,
-				BB52F54E2CC1FA8F007418DB /* KMLinkViewController */,
 				BB897213294AED3E0045787C /* Watermark */,
+				BB52F54E2CC1FA8F007418DB /* KMLinkViewController */,
 			);
 			path = EditTool;
 			sourceTree = "<group>";

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

@@ -2886,5 +2886,21 @@
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "DF5CF1FD-BB6E-442F-8130-2AAD75E20FDC"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "PDF Master/KMClass/KMPDFViewController/HeaderFooter/Views/KMHeaderPropertyController.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "377"
+            endingLineNumber = "377"
+            landmarkName = "leftTopButtonClicked(_:)"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
    </Breakpoints>
 </Bucket>