Bläddra i källkod

页面编辑-拆分窗口处理高保真

tangchao 1 år sedan
förälder
incheckning
21b3863389

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

@@ -1882,6 +1882,18 @@
 		BB0A55102A302DB700B6E84B /* KMTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0A550F2A302DB700B6E84B /* KMTextField.swift */; };
 		BB0A55112A302DB700B6E84B /* KMTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0A550F2A302DB700B6E84B /* KMTextField.swift */; };
 		BB0A55122A302DB700B6E84B /* KMTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0A550F2A302DB700B6E84B /* KMTextField.swift */; };
+		BB0A55142A3052F800B6E84B /* KMCustomTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0A55132A3052F800B6E84B /* KMCustomTextField.swift */; };
+		BB0A55152A3052F800B6E84B /* KMCustomTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0A55132A3052F800B6E84B /* KMCustomTextField.swift */; };
+		BB0A55162A3052F800B6E84B /* KMCustomTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0A55132A3052F800B6E84B /* KMCustomTextField.swift */; };
+		BB0A55182A3074F400B6E84B /* KMHoverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0A55172A3074F400B6E84B /* KMHoverView.swift */; };
+		BB0A55192A3074F400B6E84B /* KMHoverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0A55172A3074F400B6E84B /* KMHoverView.swift */; };
+		BB0A551A2A3074F400B6E84B /* KMHoverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0A55172A3074F400B6E84B /* KMHoverView.swift */; };
+		BB0A551D2A30793F00B6E84B /* KMDesignTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0A551C2A30793F00B6E84B /* KMDesignTextField.swift */; };
+		BB0A551E2A30793F00B6E84B /* KMDesignTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0A551C2A30793F00B6E84B /* KMDesignTextField.swift */; };
+		BB0A551F2A30793F00B6E84B /* KMDesignTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0A551C2A30793F00B6E84B /* KMDesignTextField.swift */; };
+		BB0A55212A30968900B6E84B /* KMDesignBaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0A55202A30968900B6E84B /* KMDesignBaseView.swift */; };
+		BB0A55222A30968900B6E84B /* KMDesignBaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0A55202A30968900B6E84B /* KMDesignBaseView.swift */; };
+		BB0A55232A30968900B6E84B /* KMDesignBaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0A55202A30968900B6E84B /* KMDesignBaseView.swift */; };
 		BB0A823229C00400002C5C1B /* KMCommonEnum.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0A823129C00400002C5C1B /* KMCommonEnum.swift */; };
 		BB0A823329C00400002C5C1B /* KMCommonEnum.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0A823129C00400002C5C1B /* KMCommonEnum.swift */; };
 		BB0A823429C00400002C5C1B /* KMCommonEnum.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0A823129C00400002C5C1B /* KMCommonEnum.swift */; };
@@ -4111,6 +4123,10 @@
 		BB003034298D356E002DD1A0 /* KMPreferenceMarkupColorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPreferenceMarkupColorView.swift; sourceTree = "<group>"; };
 		BB0542142965705D00F2665C /* KMCropTipView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMCropTipView.swift; sourceTree = "<group>"; };
 		BB0A550F2A302DB700B6E84B /* KMTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMTextField.swift; sourceTree = "<group>"; };
+		BB0A55132A3052F800B6E84B /* KMCustomTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMCustomTextField.swift; sourceTree = "<group>"; };
+		BB0A55172A3074F400B6E84B /* KMHoverView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMHoverView.swift; sourceTree = "<group>"; };
+		BB0A551C2A30793F00B6E84B /* KMDesignTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMDesignTextField.swift; sourceTree = "<group>"; };
+		BB0A55202A30968900B6E84B /* KMDesignBaseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMDesignBaseView.swift; sourceTree = "<group>"; };
 		BB0A823129C00400002C5C1B /* KMCommonEnum.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMCommonEnum.swift; sourceTree = "<group>"; };
 		BB135C2929B6CD9A00FD5965 /* KMTools.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMTools.swift; sourceTree = "<group>"; };
 		BB146F2F299DC0CF00784A6A /* GTLRBatchQuery.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTLRBatchQuery.m; sourceTree = "<group>"; };
@@ -7192,9 +7208,19 @@
 			path = Tools;
 			sourceTree = "<group>";
 		};
+		BB0A551B2A3078EB00B6E84B /* Designs */ = {
+			isa = PBXGroup;
+			children = (
+				BB0A551C2A30793F00B6E84B /* KMDesignTextField.swift */,
+				BB0A55202A30968900B6E84B /* KMDesignBaseView.swift */,
+			);
+			path = Designs;
+			sourceTree = "<group>";
+		};
 		BB135C2629B6CD4500FD5965 /* Common */ = {
 			isa = PBXGroup;
 			children = (
+				BB0A551B2A3078EB00B6E84B /* Designs */,
 				BB6B43642A04913200E02B54 /* Base */,
 				BBA5429A29F139730041BAD0 /* Control */,
 				BB5F8A0329BB04EF00365ADB /* OC */,
@@ -7881,6 +7907,7 @@
 			children = (
 				BB6B43652A04919200E02B54 /* KMBaseViewController.swift */,
 				BB2F18492A0C911B0003F65E /* KMBaseWindowController.swift */,
+				BB0A55172A3074F400B6E84B /* KMHoverView.swift */,
 			);
 			path = Base;
 			sourceTree = "<group>";
@@ -8315,6 +8342,7 @@
 				BBA5429B29F13A140041BAD0 /* KMMemorandumPattern.swift */,
 				BBB7B4882A033F6200B58A5A /* KMThumbnailView.swift */,
 				BB0A550F2A302DB700B6E84B /* KMTextField.swift */,
+				BB0A55132A3052F800B6E84B /* KMCustomTextField.swift */,
 			);
 			path = Control;
 			sourceTree = "<group>";
@@ -10313,6 +10341,7 @@
 				BB98080529CA945F00BEEB81 /* WaitingView.m in Sources */,
 				ADCB98E12924776F00B51A03 /* KMBatchProcessingSizeTableCell.swift in Sources */,
 				F3599222292CA27B000D25DE /* CPDFListViewRuntime.m in Sources */,
+				BB0A55182A3074F400B6E84B /* KMHoverView.swift in Sources */,
 				9F0CB4C4298625F400007028 /* NSColor+KMExtensions.swift in Sources */,
 				AD4B454D294072B90076FA14 /* KMOCRWindowController.swift in Sources */,
 				BBD1F78F296FE6A500343885 /* KMPageEditSplitWindowController.swift in Sources */,
@@ -10484,6 +10513,7 @@
 				BBB9B325299A5D6D004F3235 /* GTMKeychain_macOS.m in Sources */,
 				BB146FAE299DC0D100784A6A /* GTLRService.m in Sources */,
 				BB86C21928F561C7005AD968 /* NSColor_SKExtensions.m in Sources */,
+				BB0A551D2A30793F00B6E84B /* KMDesignTextField.swift in Sources */,
 				BBD1F798296FF78C00343885 /* KMPageEditSettingBaseModel.swift in Sources */,
 				9FAAA33E290FECA70046FFCE /* NSImage+QuickLook.swift in Sources */,
 				AD53B70529ACC65500D61E81 /* KMMailHelper.m in Sources */,
@@ -10565,6 +10595,7 @@
 				BBFE6E5D2930809A00142C01 /* KMMergeCollectionPageViewItem.swift in Sources */,
 				89E4E7132963D7FF002DBA6F /* NSFont_SKExtensions.m in Sources */,
 				89316849296E436B0073EA59 /* KMSignatureManager.m in Sources */,
+				BB0A55212A30968900B6E84B /* KMDesignBaseView.swift in Sources */,
 				BB147005299DC0D100784A6A /* OIDFieldMapping.m in Sources */,
 				BB003015298CA446002DD1A0 /* KMPreferenceGeneralController.swift in Sources */,
 				BBB9B32E299A5D6D004F3235 /* GTMAppAuthFetcherAuthorization.m in Sources */,
@@ -10579,6 +10610,7 @@
 				89E4E77329658E1D002DBA6F /* CStampObject.m in Sources */,
 				BB897265294C724D0045787C /* KMWatermarkAdjectiveOutsideView.swift in Sources */,
 				BBC2BCC6295DA8F30036B983 /* KMCropPreviewController.swift in Sources */,
+				BB0A55142A3052F800B6E84B /* KMCustomTextField.swift in Sources */,
 				ADE3C1FD29A5C44700793B13 /* KMLightMemberManager.swift in Sources */,
 				BB14701A299DC0D100784A6A /* OIDURLSessionProvider.m in Sources */,
 				BBA8B7AF293600D70097D183 /* KMPasswordInputWindow.swift in Sources */,
@@ -11130,6 +11162,7 @@
 				BB51074029A61B4100978662 /* SKProgressController.m in Sources */,
 				BBEC00C0295C306400A26C98 /* KMBatesPropertyController.swift in Sources */,
 				9F080B10298A55A300FC27DA /* KMConvertURLToPDF.m in Sources */,
+				BB0A55222A30968900B6E84B /* KMDesignBaseView.swift in Sources */,
 				89E4E6ED2963D1B7002DBA6F /* KMColorPickerViewController.m in Sources */,
 				ADCB98EA2924778C00B51A03 /* KMBatchProcessingStateTableCell.swift in Sources */,
 				89752E1E2942CB04003FF08E /* KMSearchMode.swift in Sources */,
@@ -11221,6 +11254,7 @@
 				ADC25DFA2923BA710080A3F6 /* KMImageToPDFWindowController.swift in Sources */,
 				BB4EEF4529764FEF003A3537 /* KMWatermarkAligementView.swift in Sources */,
 				BBEC00B0295C2AF300A26C98 /* KMBatesPreviewController.swift in Sources */,
+				BB0A551E2A30793F00B6E84B /* KMDesignTextField.swift in Sources */,
 				9F0CB50E2986564500007028 /* KMDesignToken+BorderLeft.swift in Sources */,
 				9FBC489C2996500300CA39D7 /* KMDocumentController.swift in Sources */,
 				BBC348342955A118008D2CD1 /* KMCreateBackgroundController.swift in Sources */,
@@ -11507,6 +11541,7 @@
 				9F1FE4FA29406E4700E952CA /* CTTabStripView.m in Sources */,
 				9F0CB48829683DC400007028 /* KMPropertiesPanelPresetColorSubVC.swift in Sources */,
 				ADCB98C2292472F200B51A03 /* KMBatchProcessingTableViewPresenter.swift in Sources */,
+				BB0A55192A3074F400B6E84B /* KMHoverView.swift in Sources */,
 				9F1FE4C129406E4700E952CA /* NSWindow+CTThemed.m in Sources */,
 				ADCB990C292B6ADC00B51A03 /* KMImageToPDFChoosePresenter.swift in Sources */,
 				ADCB98C2292472F200B51A03 /* KMBatchProcessingTableViewPresenter.swift in Sources */,
@@ -11580,6 +11615,7 @@
 				89E4E6E42963CD82002DBA6F /* KMGeneralAnnotationViewController.m in Sources */,
 				9F0CB4BE2977C06300007028 /* KMPropertiesPanelColorSubVC.swift in Sources */,
 				AD1CA41A2A061CE10070541F /* KMAnnotationScreenTypeViewItem.swift in Sources */,
+				BB0A55152A3052F800B6E84B /* KMCustomTextField.swift in Sources */,
 				BBB9B329299A5D6D004F3235 /* GTMAppAuthFetcherAuthorization+Keychain.m in Sources */,
 				89752DBE2936FAD0003FF08E /* NSWindow+PopOver.m in Sources */,
 				9F1FE4A329406E4700E952CA /* CTToolbarController.m in Sources */,
@@ -11715,6 +11751,7 @@
 				9F1FE51329407B4000E952CA /* KMFileSearchView.swift in Sources */,
 				BBEC00B1295C2AF300A26C98 /* KMBatesPreviewController.swift in Sources */,
 				BB897260294C5DDA0045787C /* KMWatermarkPropertyInfoController.swift in Sources */,
+				BB0A55162A3052F800B6E84B /* KMCustomTextField.swift in Sources */,
 				F3732316292DF9410013862C /* CPDFTextAnnotation+PDFListView.m in Sources */,
 				BBB1A3A029F6128200E54E47 /* KMSystemMenu.swift in Sources */,
 				F37322EC292DF9410013862C /* CPDFStampAnnotation+PDFListView.m in Sources */,
@@ -11729,6 +11766,7 @@
 				AD015FB929AB484400A57062 /* KMLightMemberConfig.swift in Sources */,
 				ADBC2D13299CCD05006280C8 /* KMTextfieldButton.swift in Sources */,
 				BB162E90294FFC0C0088E9D1 /* KMWatermarkPDFView.swift in Sources */,
+				BB0A55232A30968900B6E84B /* KMDesignBaseView.swift in Sources */,
 				AD9527C8295295110039D2BC /* KMPrintPrinterModel.swift in Sources */,
 				BBB9B32A299A5D6D004F3235 /* GTMAppAuthFetcherAuthorization+Keychain.m in Sources */,
 				BB146FB0299DC0D100784A6A /* GTLRService.m in Sources */,
@@ -11961,6 +11999,7 @@
 				BB897248294C19980045787C /* KMWatermarkAdjectiveListController.swift in Sources */,
 				BBD1F795296FE92500343885 /* KMPageEditSplitSettingView.swift in Sources */,
 				BBEC00DB295C39FD00A26C98 /* KMBatesPropertyInfoController.swift in Sources */,
+				BB0A551A2A3074F400B6E84B /* KMHoverView.swift in Sources */,
 				9F1FE4AA29406E4700E952CA /* CTBrowserWindowController.m in Sources */,
 				ADE3C1AD29A4779E00793B13 /* KMPrintAccessoryController.swift in Sources */,
 				ADC075B829866962006C752F /* KMBatchConverPDFWordView.swift in Sources */,
@@ -12035,6 +12074,7 @@
 				89752DC42937033F003FF08E /* KMPopMenuButtonCell.m in Sources */,
 				89E4E6F72963D1E9002DBA6F /* KMAnnotationPropertiesColorManager.m in Sources */,
 				ADCB98CB2924741B00B51A03 /* KMBatchProcessingView.swift in Sources */,
+				BB0A551F2A30793F00B6E84B /* KMDesignTextField.swift in Sources */,
 				BB146FCE299DC0D100784A6A /* GTMSessionUploadFetcher.m in Sources */,
 				BB89724F294C1DCE0045787C /* KMWatermarkAdjectiveListTableCellView.swift in Sources */,
 				ADD1B6E62946C00800C3FFF7 /* KMPrintChoosePageSizePosterView.swift in Sources */,

+ 61 - 0
PDF Office/PDF Master/Class/Common/Base/KMHoverView.swift

@@ -0,0 +1,61 @@
+//
+//  KMHoverView.swift
+//  PDF Master
+//
+//  Created by tangchao on 2023/6/7.
+//
+
+import Cocoa
+
+enum KMHoverAction: Int {
+    case enter      = 1
+    case move       = 2
+    case exit       = 3
+}
+
+// hover 基类
+class KMHoverView: NSView {
+    private var _area: NSTrackingArea?
+    var hoverAction: ((KMHoverView, KMHoverAction)->Void)?
+    
+    deinit {
+        if let area_ = self._area {
+            self.removeTrackingArea(area_)
+        }
+    }
+    
+    override func updateTrackingAreas() {
+        super.updateTrackingAreas()
+        
+        if let area_ = self._area {
+            self.removeTrackingArea(area_)
+            self._area = nil
+        }
+        
+        self._area = NSTrackingArea(rect: self.bounds, options: [.mouseEnteredAndExited, .mouseMoved, .activeAlways], owner: self)
+        if let area_ = self._area {
+            self.addTrackingArea(area_)
+        }
+    }
+    
+    override func mouseEntered(with event: NSEvent) {
+        guard let callback = self.hoverAction else {
+            return
+        }
+        callback(self, .enter)
+    }
+    
+    override func mouseExited(with event: NSEvent) {
+        guard let callback = self.hoverAction else {
+            return
+        }
+        callback(self, .exit)
+    }
+    
+    override func mouseMoved(with event: NSEvent) {
+        guard let callback = self.hoverAction else {
+            return
+        }
+        callback(self, .move)
+    }
+}

+ 244 - 0
PDF Office/PDF Master/Class/Common/Control/KMCustomTextField.swift

@@ -0,0 +1,244 @@
+//
+//  KMCustomTextField.swift
+//  PDF Master
+//
+//  Created by tangchao on 2023/6/7.
+//
+
+protocol KMCustomTextFieldDelegate: AnyObject {
+    func km_controlTextShouldBeginEditing(textField: KMCustomTextField) -> Bool
+    func km_controlTextDidBeginEditing(textField: KMCustomTextField)
+    func km_controlTextDidChange(textField: KMCustomTextField)
+    func km_controlTextShouldEndEditing(textField: KMCustomTextField) -> Bool
+    func km_controlTextDidEndEditing(textField: KMCustomTextField)
+    
+    func km_didBecomeFirstResponder(textField: KMCustomTextField)
+}
+
+extension KMCustomTextFieldDelegate {
+    func km_controlTextShouldBeginEditing(textField: KMCustomTextField) -> Bool { return true }
+    func km_controlTextDidBeginEditing(textField: KMCustomTextField) {}
+    func km_controlTextDidChange(textField: KMCustomTextField) {}
+    func km_controlTextShouldEndEditing(textField: KMCustomTextField) -> Bool { return true }
+    func km_controlTextDidEndEditing(textField: KMCustomTextField) {}
+    func km_didBecomeFirstResponder(textField: KMCustomTextField) {}
+}
+
+class KMCustomTextField: KMHoverView {
+    private var _backgroundView = NSView()
+    var backgroundView: NSView {
+        get {
+            return self._backgroundView
+        }
+    }
+    private var _textFiled = KMTextField()
+    var rightView: NSView? {
+        willSet {
+            self.rightView?.removeFromSuperview()
+        }
+        didSet {
+            if let view = self.rightView {
+                self.addSubview(view)
+                self.layoutSubtreeIfNeeded()
+            }
+            
+            self.updateRightViewStateIfNeed(editing: self.kmEnabled)
+        }
+    }
+
+    var rightViewMode: KMSecureTextFiledViewMode = .whileEditing {
+        didSet {
+            self.updateRightViewStateIfNeed(editing: self.kmEnabled)
+        }
+    }
+    
+    var kmEnabled = true {
+        didSet {
+            self._textFiled.isEnabled = self.kmEnabled
+            
+            self.updateRightViewStateIfNeed(editing: self.kmEnabled)
+        }
+        
+    }
+    
+    var placeholderString: String? {
+        didSet {
+            self._textFiled.placeholderString = self.placeholderString ?? ""
+        }
+    }
+    
+    var stringValue: String? {
+        didSet {
+            self._textFiled.stringValue = self.stringValue ?? ""
+        }
+    }
+    
+    var borderThickness: CGFloat = 1 {
+        didSet {
+            self._textFiled.borderThickness = self.borderThickness
+        }
+    }
+    var offset: CGFloat = 8.0 {
+        didSet {
+            self._textFiled.offset = self.offset
+        }
+    }
+    
+    weak var delegate: KMCustomTextFieldDelegate?
+    
+    override init(frame frameRect: NSRect) {
+        super.init(frame: frameRect)
+        
+        self.initSubViews()
+        self.initDefaultValue()
+    }
+    
+    required init?(coder: NSCoder) {
+        super.init(coder: coder)
+    }
+    
+    override func awakeFromNib() {
+        super.awakeFromNib()
+        
+        self.initSubViews()
+        self.initDefaultValue()
+    }
+    
+    func initDefaultValue() {
+        self._textFiled.isBezeled = false
+        self._textFiled.focusRingType = .none
+        self._textFiled.lineBreakMode = .byTruncatingTail
+        self._textFiled.drawsBackground = false
+        self._textFiled.delegate = self
+        
+        self._textFiled.firstResponderHandler = { [unowned self] result in
+            self.updateRightViewStateIfNeed(editing: result)
+
+            self.delegate?.km_didBecomeFirstResponder(textField: self)
+        }
+    }
+    
+    func initSubViews() {
+        self.addSubview(self.backgroundView)
+        self.addSubview(self._textFiled)
+    }
+    
+    override func layout() {
+        super.layout()
+        
+        let width: CGFloat = NSWidth(self.bounds)
+        let height: CGFloat = NSHeight(self.bounds)
+        
+        self.backgroundView.frame = self.bounds
+        
+        var tfH: CGFloat = 22
+        if let font = self._textFiled.font {
+            tfH = font.pointSize * 1.5
+        }
+        let tfX: CGFloat = 12
+        if let rightView = self.rightView {
+            let rightWidth = NSWidth(rightView.frame)
+            rightView.frame = NSMakeRect(width-rightWidth, 0, rightWidth, height)
+            
+            let textFieldFrame = NSMakeRect(tfX, (height-tfH)*0.5, width-tfX*2-rightWidth-5, tfH)
+            self._textFiled.frame = textFieldFrame
+        } else {
+            let textFieldFrame = NSMakeRect(tfX, (height-tfH)*0.5, width-tfX*2, tfH)
+            self._textFiled.frame = textFieldFrame
+        }
+    }
+    
+    func clear() {
+        self._textFiled.stringValue = ""
+        
+        self.delegate?.km_controlTextDidChange(textField: self)
+    }
+    
+    
+    override func becomeFirstResponder() -> Bool {
+        self.window?.makeFirstResponder(self._textFiled)
+        
+        return super.becomeFirstResponder()
+    }
+    
+    internal func updateRightViewStateIfNeed(editing: Bool) {
+        guard let view = self.rightView else {
+            return
+        }
+        
+        if (self.rightViewMode == .always) {
+            view.isHidden = false
+            return
+        }
+        if (self.rightViewMode == .never) {
+            view.isHidden = true
+            return
+        }
+        
+        if (editing) { // 开始编辑
+            view.isHidden = self.rightViewMode != .whileEditing
+        } else { // 结束编辑
+            view.isHidden = self.rightViewMode == .whileEditing
+        }
+    }
+}
+
+extension KMCustomTextField: NSTextFieldDelegate {
+    func control(_ control: NSControl, textShouldBeginEditing fieldEditor: NSText) -> Bool {
+        if let should = self.delegate?.km_controlTextShouldBeginEditing(textField: self) {
+            return should
+        }
+        return true
+    }
+    
+    func controlTextDidBeginEditing(_ obj: Notification) {
+        if (!self._textFiled.isEqual(to: obj.object)) {
+            return
+        }
+        
+        self.delegate?.km_controlTextDidBeginEditing(textField: self)
+    }
+    
+    func controlTextDidChange(_ obj: Notification) {
+        if (!self._textFiled.isEqual(to: obj.object)) {
+            return
+        }
+        
+        self.delegate?.km_controlTextDidChange(textField: self)
+    }
+    
+    func control(_ control: NSControl, textShouldEndEditing fieldEditor: NSText) -> Bool {
+        if let should = self.delegate?.km_controlTextShouldEndEditing(textField: self) {
+            return should
+        }
+        return true
+    }
+    
+    func controlTextDidEndEditing(_ obj: Notification) {
+        if (!self._textFiled.isEqual(to: obj.object)) {
+            return
+        }
+        
+        self.updateRightViewStateIfNeed(editing: false)
+        
+        self.delegate?.km_controlTextDidEndEditing(textField: self)
+    }
+    
+    func control(_ control: NSControl, textView: NSTextView, doCommandBy commandSelector: Selector) -> Bool {
+        switch commandSelector {
+        case #selector(NSResponder.insertNewline(_:)):
+            if let inputView = control as? NSTextField {
+//                //当当前TextField按下enter
+                if inputView == self._textFiled {
+//                    guard let callBack = enterAction else { return false}
+                    
+//                    callBack()
+                }
+            }
+            return true
+        default:
+            return false
+        }
+    }
+}
+

+ 16 - 4
PDF Office/PDF Master/Class/Common/Control/KMTextField.swift

@@ -7,10 +7,11 @@
 
 import Cocoa
 
-// KMCustomTextField
 class KMTextField: NSTextField {
     private class _KMTextFieldCell: NSTextFieldCell {
+        // 边框粗细
         var borderThickness: CGFloat = 1
+        // 左右两边缩进
         var offset: CGFloat = 8.0
 
         override func drawingRect(forBounds theRect: NSRect) -> NSRect {
@@ -57,8 +58,7 @@ class KMTextField: NSTextField {
                 _cell.borderThickness = self.borderThickness
             }
             
-            self.setNeedsDisplay()
-//            self.
+            self.needsDisplay = true
         }
     }
     var offset: CGFloat = 8.0 {
@@ -67,7 +67,7 @@ class KMTextField: NSTextField {
                 _cell.offset = self.offset
             }
             
-            self.setNeedsDisplay()
+            self.needsDisplay = true
         }
     }
     
@@ -79,6 +79,8 @@ class KMTextField: NSTextField {
 //        }
     }
     
+    var firstResponderHandler: ((Bool)->Void)?
+    
     required init?(coder: NSCoder) {
         super.init(coder: coder)
         
@@ -96,4 +98,14 @@ class KMTextField: NSTextField {
         }
     }
     
+    override func becomeFirstResponder() -> Bool {
+        let result = super.becomeFirstResponder()
+        
+        guard let callback = self.firstResponderHandler else {
+            return result
+        }
+        callback(result)
+        
+        return result
+    }
 }

+ 78 - 0
PDF Office/PDF Master/Class/Common/Designs/KMDesignBaseView.swift

@@ -0,0 +1,78 @@
+//
+//  KMDesignBaseView.swift
+//  PDF Master
+//
+//  Created by tangchao on 2023/6/7.
+//
+
+import Cocoa
+
+@objc enum KMDesignSize: Int {
+    case large      = 0     // 大
+    case medium     = 1     // 中
+    case small      = 2     // 小
+}
+
+class KMDesignBaseView: NSView {
+    var height: CGFloat = 0.0
+    var horizontalPadding: CGFloat = 0.0
+    var borderColor: NSColor = .clear
+    var borderRadius: CGFloat = 4.0
+    var borderWidth: CGFloat = 1.0
+    var fillColor: NSColor = .clear
+    
+    var state: KMDesignTokenState = .Norm {
+        didSet {
+            self.updateUI(state: self.state)
+        }
+    }
+    var kmEnabled = true {
+        didSet {
+            if (self.kmEnabled) {
+                self.state = .Norm
+            } else {
+                self.state = .Disabled
+            }
+        }
+    }
+    
+    override init(frame frameRect: NSRect) {
+        super.init(frame: frameRect)
+        
+        self.initSubViews()
+        self.initDefaultValue()
+    }
+    
+    required init?(coder: NSCoder) {
+        super.init(coder: coder)
+        
+        self.initSubViews()
+        self.initDefaultValue()
+    }
+    
+    func initSubViews() {}
+    func initDefaultValue() {}
+    
+    func find_bgToken(state: KMDesignTokenState) -> String { return "" }
+    func updateUI(state: KMDesignTokenState) {
+        let token = self.find_bgToken(state: state)
+        if (token.isEmpty) {
+            KMPrint("token invalid.")
+            return
+        }
+        
+        let model = KMDesignToken.shared.tokenUsesModel(withToken: token)
+        if let data = model.border as? String {
+            self.borderColor = NSColor(hex: data)
+        }
+        if let data = model.borderRadius as? String, let _value = Float(data) {
+            self.borderRadius = CGFloat(_value)
+        }
+        if let data = model.borderWidth as? String, let _value = Float(data) {
+            self.borderWidth = CGFloat(_value)
+        }
+        if let data = model.fill as? String {
+            self.fillColor = NSColor(hex: data)
+        }
+    }
+}

+ 121 - 0
PDF Office/PDF Master/Class/Common/Designs/KMDesignTextField.swift

@@ -0,0 +1,121 @@
+//
+//  KMDesignTextField.swift
+//  PDF Master
+//
+//  Created by tangchao on 2023/6/7.
+//
+
+class KMDesignTextField: KMDesignBaseView {
+    private var textField: KMCustomTextField?
+    
+    private var _designSize: KMDesignSize = .medium
+    var designSize: KMDesignSize {
+        get {
+            return self._designSize
+        }
+    }
+    
+    var stringValue: String? {
+        didSet {
+            self.textField?.stringValue = self.stringValue ?? ""
+        }
+    }
+    
+    override var kmEnabled: Bool {
+        get {
+            return super.kmEnabled
+        }
+        set {
+            super.kmEnabled = newValue
+            
+            if (newValue) {
+                self.window?.makeFirstResponder(self.textField)
+            } else {
+                self.window?.makeFirstResponder(nil)
+            }
+        }
+    }
+    
+    convenience init(designSize: KMDesignSize = .medium) {
+        self.init()
+        
+        self._designSize = designSize
+    }
+    
+    override func initSubViews() {
+        super.initSubViews()
+        
+        let textFiled = KMCustomTextField()
+        self.addSubview(textFiled)
+        self.textField = textFiled
+        self.textField?.delegate = self
+    }
+    
+    override func initDefaultValue() {
+        super.initDefaultValue()
+        
+        self.textField?.backgroundView.wantsLayer = true
+        self.textField?.hoverAction = { [unowned self] sender, action in
+            if (action == .enter) {
+                self.state = .Hov
+            } else if (action == .exit) {
+                self.state = .Norm
+            }
+        }
+        
+        let model = KMDesignToken.shared.tokenUsesModel(withToken: self.find_bgToken(state: .Norm))
+        if let data = model.height as? String, let _height = Float(data) {
+            self.height = CGFloat(_height)
+        }
+        if let data = model.horizontalPadding as? String, let _vSpace = Float(data) {
+            self.horizontalPadding = CGFloat(_vSpace)
+            self.textField?.offset = self.horizontalPadding
+        }
+        
+        self.state = .Norm
+    }
+    
+    override func layout() {
+        super.layout()
+        
+        let width: CGFloat = NSWidth(self.bounds)
+        let heigth: CGFloat = NSHeight(self.bounds)
+        
+        let y: CGFloat = (heigth - self.height) * 0.5
+        self.textField?.frame = NSMakeRect(0, y, width, self.height)
+    }
+    
+    override func find_bgToken(state: KMDesignTokenState) -> String {
+        if (state == .Norm) {
+            return self.designSize == .medium ? "input.m.bg.norm" : "input.s.bg.norm"
+        } else if (state == .Hov) {
+            return self.designSize == .medium ? "input.m.bg.hov" : "input.s.bg.hov"
+        } else if (state == .Focus) {
+            return self.designSize == .medium ? "input.m.bg.focus" : "input.s.bg.focus"
+        } else if (state == .Disabled) {
+            return self.designSize == .medium ? "input.m.bg.dis" : "input.s.bg.dis"
+        } else if (state == .Error_def) {
+            return self.designSize == .medium ? "input.m.bg.error-def" : "input.s.bg.error-def"
+        } else if (state == .Error_focus) {
+            return self.designSize == .medium ? "input.m.bg.error-focus" : "input.s.bg.error-focus"
+        }
+        return ""
+    }
+    
+    override func updateUI(state: KMDesignTokenState) {
+        super.updateUI(state: state)
+        
+        self.textField?.backgroundView.layer?.backgroundColor = self.fillColor.cgColor
+        self.textField?.backgroundView.layer?.borderWidth = self.borderWidth
+        self.textField?.backgroundView.layer?.borderColor = self.borderColor.cgColor
+        self.textField?.backgroundView.layer?.cornerRadius = self.borderRadius
+    }
+}
+
+extension KMDesignTextField: KMCustomTextFieldDelegate {
+    func km_didBecomeFirstResponder(textField: KMCustomTextField) {
+        if (textField.isEqual(to: self.textField)) {
+            self.state = .Focus
+        }
+    }
+}

+ 4 - 8
PDF Office/PDF Master/Class/PDFTools/PageEdit/View/KMPageEditSplitSettingView.swift

@@ -44,7 +44,7 @@ class KMPageEditSplitSettingView: KMPageEditSettingBaseView {
     private var tagVC: KMDesignButton?
     private var sepVC: KMDesignButton?
     
-    private var tTextField: KMTextField?
+    private var tTextField: KMDesignTextField?
     
     var type: Int {
         get {
@@ -143,16 +143,11 @@ class KMPageEditSplitSettingView: KMPageEditSettingBaseView {
         self.safe_selectCheck(sender: self.tagVC)
         
         self.tagTextField.isHidden = true
-        self.tTextField = KMTextField()
+        self.tTextField = KMDesignTextField(designSize: .medium)
         self.tagView.addSubview(self.tTextField!)
         self.tTextField?.frame = self.tagView.bounds
         self.tTextField?.autoresizingMask = [.width, .height]
         self.tTextField?.stringValue = "part"
-        self.tTextField?.isEditable = true
-        self.tTextField?.wantsLayer = true
-        self.tTextField?.layer?.borderWidth = 1
-        self.tTextField?.layer?.borderColor = .black
-        self.tTextField?.lineBreakMode = .byTruncatingTail
         
         self.sepVC = KMDesignButton(withType: .CheckBox)
         self.sepCheck.addSubview(self.sepVC!.view)
@@ -293,7 +288,8 @@ class KMPageEditSplitSettingView: KMPageEditSettingBaseView {
         sender.state = sender.state == .Checked ? .Norm : .Checked
         
         if (sender.isEqual(to: self.tagVC)) {
-            self.tagTextField.isEnabled = sender.state == .Checked
+//            self.tagTextField.isEnabled = sender.state == .Checked
+            self.tTextField?.kmEnabled = sender.state == .Checked
         } else if (sender.isEqual(to: self.sepVC)) {
             self.sepTextView.isEnabled = sender.state == .Checked
         }