Browse Source

【手绘注释】属性面板UI

tangchao 7 months ago
parent
commit
50ec1aca7a

+ 1 - 1
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/BookMarks/KMBookMarkViewController.swift

@@ -73,7 +73,7 @@ class KMBookMarkViewController: NSViewController, NSTextFieldDelegate {
         self.titleTextField.font = NSFont.SFProTextSemiboldFont(14.0)
 //        self.titleTextField.textColor = NSColor.km_init(hex: "#252629")
         self.titleTextField.stringValue = NSLocalizedString("Bookmarks", comment: "")
-        self.addBookButton.toolTip = NSLocalizedString("Add Bookmark", comment: "")
+//        self.addBookButton.toolTip = NSLocalizedString("Add Bookmark", comment: "")
         self.addBookButton.image = NSImage(named: "KMImageNameBotaBookmarkMoreIcon")
         self.sortButton.image = NSImage(named: "KMImageNameBotaBookmarkSortIcon")
         

+ 26 - 10
PDF Office/PDF Master/Class/PDFWindowController/Side/RightSide/AnnotationProperty/KMAnnotationPropertiesViewController.m

@@ -408,11 +408,19 @@
         self.propertiesBox.contentView = vc.view;
         self.contentViewController = vc;
     } else {
-        KMGeneralAnnotationViewController *vc = [[KMGeneralAnnotationViewController alloc] init];
-        vc.pdfView = self.pdfView;
-        vc.annotationModel = annotationModel;
-        self.propertiesBox.contentView = vc.view;
-        self.contentViewController = vc;
+        if ([annotation isKindOfClass:[CPDFInkAnnotation class]]) {
+            KMFreehandAnnotationController *vc = [[KMFreehandAnnotationController alloc] init];
+            vc.pdfView = self.pdfView;
+            vc.annotationModel = annotationModel;
+            self.propertiesBox.contentView = vc.view;
+            self.contentViewController = vc;
+        } else {
+            KMGeneralAnnotationViewController *vc = [[KMGeneralAnnotationViewController alloc] init];
+            vc.pdfView = self.pdfView;
+            vc.annotationModel = annotationModel;
+            self.propertiesBox.contentView = vc.view;
+            self.contentViewController = vc;
+        }
     }
     
 //    self.buttonbuttonLayoutConstraint.constant = self.buttonView.hidden ? -36 : 0;
@@ -570,11 +578,19 @@
         if(_annotations.count > 1) {
             annotationModel = [[CPDFAnnotationModel alloc] initWithPDFAnnotations:_annotations];
         }
-        KMGeneralAnnotationViewController *vc = [[KMGeneralAnnotationViewController alloc] init];
-        vc.pdfView = self.pdfView;
-        vc.annotationModel = annotationModel;
-        self.propertiesBox.contentView = vc.view;
-        self.contentViewController = vc;
+        if (annotationMode == CAnnotationTypeInk) {
+            KMFreehandAnnotationController *vc = [[KMFreehandAnnotationController alloc] init];
+            vc.pdfView = self.pdfView;
+            vc.annotationModel = annotationModel;
+            self.propertiesBox.contentView = vc.view;
+            self.contentViewController = vc;
+        } else {
+            KMGeneralAnnotationViewController *vc = [[KMGeneralAnnotationViewController alloc] init];
+            vc.pdfView = self.pdfView;
+            vc.annotationModel = annotationModel;
+            self.propertiesBox.contentView = vc.view;
+            self.contentViewController = vc;
+        }
     } else if (annotationMode == CAnnotationTypeLink) {
     } else if (annotationMode == CAnnotationTypeRadioButton ||
                annotationMode == CAnnotationTypeCheckBox ||

+ 13 - 5
PDF Office/PDF Master/Class/PDFWindowController/Side/RightSide/AnnotationProperty/KMGeneralAnnotationViewController.swift

@@ -167,12 +167,20 @@ let KMColorPickerViewHeight: CGFloat = 64
     @IBOutlet private weak var lineWidthComboBox: KMComboBox!
     @IBOutlet private weak var lineWidthSlider: NSSlider!
     @IBOutlet private weak var lineTypeLabel: NSTextField!
-    @IBOutlet private weak var lineStyleButton: KMButton!
-    @IBOutlet private weak var dottedLineStyleButton: KMButton!
+    @IBOutlet weak var lineStyleButton: KMButton!
+    @IBOutlet weak var dottedLineStyleButton: KMButton!
     @IBOutlet private weak var rightArrowStyleButton: KMButton!
-
-    @IBOutlet private weak var lineStyleBox: NSBox!
-    @IBOutlet private weak var dottedLineStyleBox: NSBox!
+    
+    @IBOutlet weak var borderItemButtonHeightConst: NSLayoutConstraint!
+    
+    var kBorderAndLineView: NSView {
+        get {
+            return self.borderAndLineView
+        }
+    }
+    
+    @IBOutlet weak var lineStyleBox: NSBox!
+    @IBOutlet weak var dottedLineStyleBox: NSBox!
     @IBOutlet private weak var rightArrowStyleBox: NSBox!
 
     @IBOutlet private weak var borderViewTopConstant: NSLayoutConstraint!

+ 2 - 1
PDF Office/PDF Master/Class/PDFWindowController/Side/RightSide/AnnotationProperty/KMGeneralAnnotationViewController.xib

@@ -17,6 +17,7 @@
                 <outlet property="borderColorBox" destination="6SO-cv-qRu" id="FLk-kb-XsM"/>
                 <outlet property="borderColorBoxConstraint" destination="KTc-KX-Zyt" id="APh-jM-c0A"/>
                 <outlet property="borderColorPickerView" destination="ZtW-i2-s3s" id="vhV-cW-nNc"/>
+                <outlet property="borderItemButtonHeightConst" destination="zW5-tC-COX" id="bvW-c3-KrH"/>
                 <outlet property="borderLabel" destination="lwg-7N-a25" id="dKJ-pY-bxN"/>
                 <outlet property="borderViewTopConstant" destination="OD6-u0-btp" id="b7X-M5-alN"/>
                 <outlet property="centerAlignButton" destination="lv5-5o-kZW" id="fuk-8m-PDQ"/>
@@ -624,7 +625,7 @@
                                 </constraints>
                             </customView>
                             <customView translatesAutoresizingMaskIntoConstraints="NO" id="RvS-7l-bgc">
-                                <rect key="frame" x="16" y="820" width="449" height="54"/>
+                                <rect key="frame" x="16" y="817" width="449" height="51"/>
                                 <subviews>
                                     <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="FwF-01-QBW">
                                         <rect key="frame" x="-2" y="34" width="453" height="20"/>

+ 103 - 0
PDF Office/PDF Master/Class/PDFWindowController/Side/RightSide/Freehand/Controller/KMFreehandAnnotationController.swift

@@ -0,0 +1,103 @@
+//
+//  KMFreehandAnnotationController.swift
+//  PDF Reader Pro
+//
+//  Created by User-Tangchao on 2024/8/9.
+//
+
+import Cocoa
+
+@objcMembers class KMFreehandAnnotationController: KMGeneralAnnotationViewController {
+    var lineAndBorderItemView: KMLineAndBorderItemView?
+    
+    deinit {
+        KMPrint("KMFreehandAnnotationController deinit.")
+    }
+    
+    convenience init() {
+        self.init(nibName: "KMGeneralAnnotationViewController", bundle: nil)
+    }
+    
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        
+        self.initDefaultValue()
+    }
+    
+    func initDefaultValue() {
+        self.borderItemButtonHeightConst.constant = 64
+        self.lineStyleBox.isHidden = true
+        self.lineStyleButton.isHidden = true
+        self.dottedLineStyleBox.isHidden = true
+        self.dottedLineStyleButton.isHidden = true
+        
+        let view = KMLineAndBorderItemView.createFromNib()
+        self.lineAndBorderItemView = view
+        let borderAndLineView = self.kBorderAndLineView
+        let width = NSWidth(borderAndLineView.frame)
+        view?.frame = NSMakeRect(0, 0, width, 64)
+        view?.autoresizingMask = [.width]
+        self.kBorderAndLineView.addSubview(view!)
+        
+        view?.lineImageButon.imagePosition = .imageOnly
+        view?.lineImageButon.image = self.borderStyleSolid(false)
+        
+        view?.dashImageButton.imagePosition = .imageOnly
+        view?.dashImageButton.image = self.borderStyleDashed(false)
+    }
+    
+    override func borderStyleSolid(_ isSelect: Bool) -> NSImage {
+        let size = NSSize(width: 120, height: 12.0)
+        let image = NSImage(size: size, flipped: false, drawingHandler: { rect in
+            let path = NSBezierPath(rect: NSRect(x: 2.0, y: 5.0, width: 116, height: 1.0))
+            path.lineWidth = 1.0
+            isSelect ? KMAppearance.Layout.m_1Color().setStroke() : KMAppearance.Layout.m_1Color().setStroke()
+            path.stroke()
+            return true
+        })
+        return image
+    }
+    
+    override func borderStyleDashed(_ isSelect: Bool) -> NSImage {
+        let size = NSSize(width: 120, height: 12.0)
+        let image = NSImage(size: size, flipped: false, drawingHandler: { rect in
+            let path = NSBezierPath()
+            path.move(to: NSPoint(x: 4.0, y: 5.0))
+            path.line(to: NSPoint(x: 8.0, y: 5.0))
+            path.move(to: NSPoint(x: 12.0, y: 5.0))
+            path.line(to: NSPoint(x: 16.0, y: 5.0))
+            path.move(to: NSPoint(x: 20.0, y: 5.0))
+            path.line(to: NSPoint(x: 24.0, y: 5.0))
+            path.move(to: NSPoint(x: 28.0, y: 5.0))
+            path.line(to: NSPoint(x: 32.0, y: 5.0))
+            path.move(to: NSPoint(x: 36.0, y: 5.0))
+            path.line(to: NSPoint(x: 40.0, y: 5.0))
+            path.move(to: NSPoint(x: 44.0, y: 5.0))
+            path.line(to: NSPoint(x: 48.0, y: 5.0))
+            path.move(to: NSPoint(x: 52.0, y: 5.0))
+            path.line(to: NSPoint(x: 56.0, y: 5.0))
+            path.move(to: NSPoint(x: 60.0, y: 5.0))
+            path.line(to: NSPoint(x: 64.0, y: 5.0))
+            path.move(to: NSPoint(x: 68.0, y: 5.0))
+            path.line(to: NSPoint(x: 72.0, y: 5.0))
+            path.move(to: NSPoint(x: 76.0, y: 5.0))
+            path.line(to: NSPoint(x: 80.0, y: 5.0))
+            path.move(to: NSPoint(x: 84.0, y: 5.0))
+            path.line(to: NSPoint(x: 88.0, y: 5.0))
+            path.move(to: NSPoint(x: 92.0, y: 5.0))
+            path.line(to: NSPoint(x: 96.0, y: 5.0))
+            path.move(to: NSPoint(x: 100.0, y: 5.0))
+            path.line(to: NSPoint(x: 104.0, y: 5.0))
+            path.move(to: NSPoint(x: 108.0, y: 5.0))
+            path.line(to: NSPoint(x: 112.0, y: 5.0))
+            path.move(to: NSPoint(x: 116.0, y: 5.0))
+            path.line(to: NSPoint(x: 118.0, y: 5.0))
+            path.lineWidth = 2.0
+            isSelect ? KMAppearance.Layout.m_1Color().setStroke() : KMAppearance.Layout.m_1Color().setStroke()
+            path.stroke()
+            return true
+        })
+        return image
+    }
+    
+}

+ 39 - 0
PDF Office/PDF Master/Class/PDFWindowController/Side/RightSide/Freehand/View/KMLineAndBorderItemView.swift

@@ -0,0 +1,39 @@
+//
+//  KMLineAndBorderItemView.swift
+//  PDF Reader Pro
+//
+//  Created by User-Tangchao on 2024/8/11.
+//
+
+import Cocoa
+
+class KMLineAndBorderItemView: NSView, NibLoadable {
+
+    @IBOutlet weak var lineRadio: NSButton!
+    @IBOutlet weak var dashRadio: NSButton!
+    
+    @IBOutlet weak var lineImageButon: NSButton!
+    @IBOutlet weak var dashImageButton: NSButton!
+    
+    @IBOutlet weak var dashComboBox: KMComboBox!
+    
+    override func awakeFromNib() {
+        super.awakeFromNib()
+        
+        self.dashComboBox.type = .none
+        self.dashComboBox.comboxRect = self.dashComboBox.bounds
+        
+        self.dashComboBox.wantsLayer = true
+        self.dashComboBox.layer?.borderWidth = 1.0
+        self.dashComboBox.layer?.cornerRadius = 1.0
+        
+        self.dashComboBox.removeAllItems()
+        self.dashComboBox.addItems(withObjectValues: ["1 pt", "3 pt", "6 pt", "9 Pt", "12 Pt", "15 pt", "18 pt"])
+    }
+
+    override func draw(_ dirtyRect: NSRect) {
+        super.draw(dirtyRect)
+
+        // Drawing code here.
+    }
+}

+ 89 - 0
PDF Office/PDF Master/Class/PDFWindowController/Side/RightSide/Freehand/View/KMLineAndBorderItemView.xib

@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21507" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21507"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner"/>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customView id="c22-O7-iKe" customClass="KMLineAndBorderItemView" customModule="PDF_Reader_Pro" customModuleProvider="target">
+            <rect key="frame" x="0.0" y="0.0" width="480" height="64"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="67j-As-mBf">
+                    <rect key="frame" x="-2" y="36" width="18" height="18"/>
+                    <buttonCell key="cell" type="radio" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="WNz-Jj-VQc">
+                        <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+                        <font key="font" metaFont="system"/>
+                    </buttonCell>
+                </button>
+                <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="UO9-2v-nZz">
+                    <rect key="frame" x="-2" y="12" width="18" height="18"/>
+                    <buttonCell key="cell" type="radio" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="F37-wf-WCg">
+                        <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+                        <font key="font" metaFont="system"/>
+                    </buttonCell>
+                </button>
+                <button horizontalHuggingPriority="249" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="uyo-Zq-jZm">
+                    <rect key="frame" x="26" y="37" width="120" height="16"/>
+                    <constraints>
+                        <constraint firstAttribute="width" constant="120" id="jqR-Zq-enj"/>
+                    </constraints>
+                    <buttonCell key="cell" type="bevel" title="Button" bezelStyle="rounded" alignment="center" imageScaling="proportionallyDown" inset="2" id="fZV-k4-9pF">
+                        <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                        <font key="font" metaFont="system"/>
+                    </buttonCell>
+                </button>
+                <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="g5f-qC-9FJ">
+                    <rect key="frame" x="26" y="13" width="120" height="16"/>
+                    <constraints>
+                        <constraint firstAttribute="width" constant="120" id="uCR-k6-tz4"/>
+                    </constraints>
+                    <buttonCell key="cell" type="bevel" title="Button" bezelStyle="rounded" alignment="center" imageScaling="proportionallyDown" inset="2" id="Zaa-vp-XD2">
+                        <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                        <font key="font" metaFont="system"/>
+                    </buttonCell>
+                </button>
+                <comboBox verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="NjD-L6-JbM" customClass="KMComboBox" customModule="PDF_Reader_Pro" customModuleProvider="target">
+                    <rect key="frame" x="154" y="8" width="72" height="25"/>
+                    <constraints>
+                        <constraint firstAttribute="width" constant="69" id="cAi-0H-IlA"/>
+                    </constraints>
+                    <comboBoxCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" drawsBackground="YES" completes="NO" numberOfVisibleItems="5" id="KFZ-fE-2ch">
+                        <font key="font" metaFont="system"/>
+                        <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                        <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                        <objectValues>
+                            <string>Item 1</string>
+                            <string>Item 2</string>
+                            <string>Item 3</string>
+                        </objectValues>
+                    </comboBoxCell>
+                </comboBox>
+            </subviews>
+            <constraints>
+                <constraint firstItem="67j-As-mBf" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" id="6xm-8H-ND4"/>
+                <constraint firstItem="NjD-L6-JbM" firstAttribute="centerY" secondItem="g5f-qC-9FJ" secondAttribute="centerY" id="9u8-Ba-1Ld"/>
+                <constraint firstItem="g5f-qC-9FJ" firstAttribute="centerY" secondItem="UO9-2v-nZz" secondAttribute="centerY" id="DLS-O4-k6n"/>
+                <constraint firstItem="g5f-qC-9FJ" firstAttribute="leading" secondItem="UO9-2v-nZz" secondAttribute="trailing" constant="12" id="E1Z-xv-ciB"/>
+                <constraint firstItem="uyo-Zq-jZm" firstAttribute="centerY" secondItem="67j-As-mBf" secondAttribute="centerY" id="FQn-81-686"/>
+                <constraint firstItem="67j-As-mBf" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" constant="12" id="Oa6-oz-kTt"/>
+                <constraint firstItem="uyo-Zq-jZm" firstAttribute="leading" secondItem="67j-As-mBf" secondAttribute="trailing" constant="12" id="RxB-8z-UuS"/>
+                <constraint firstItem="UO9-2v-nZz" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" constant="36" id="ZSd-LL-5em"/>
+                <constraint firstItem="NjD-L6-JbM" firstAttribute="leading" secondItem="g5f-qC-9FJ" secondAttribute="trailing" constant="8" id="ccC-kb-7Xf"/>
+                <constraint firstItem="UO9-2v-nZz" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" id="ld6-r3-OlZ"/>
+            </constraints>
+            <connections>
+                <outlet property="dashComboBox" destination="NjD-L6-JbM" id="xCY-Mo-MJK"/>
+                <outlet property="dashImageButton" destination="g5f-qC-9FJ" id="pMC-31-qKy"/>
+                <outlet property="dashRadio" destination="UO9-2v-nZz" id="kwB-pE-ZES"/>
+                <outlet property="lineImageButon" destination="uyo-Zq-jZm" id="25n-2s-NjW"/>
+                <outlet property="lineRadio" destination="67j-As-mBf" id="LpT-OF-c18"/>
+            </connections>
+            <point key="canvasLocation" x="-193" y="-17"/>
+        </customView>
+    </objects>
+</document>

+ 48 - 0
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -7,6 +7,15 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
+		652E953D2C6670CE0061FA40 /* KMFreehandAnnotationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 652E953C2C6670CE0061FA40 /* KMFreehandAnnotationController.swift */; };
+		652E953E2C6670CE0061FA40 /* KMFreehandAnnotationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 652E953C2C6670CE0061FA40 /* KMFreehandAnnotationController.swift */; };
+		652E953F2C6670CE0061FA40 /* KMFreehandAnnotationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 652E953C2C6670CE0061FA40 /* KMFreehandAnnotationController.swift */; };
+		652E95422C6913C20061FA40 /* KMLineAndBorderItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 652E95412C6913C20061FA40 /* KMLineAndBorderItemView.swift */; };
+		652E95432C6913C20061FA40 /* KMLineAndBorderItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 652E95412C6913C20061FA40 /* KMLineAndBorderItemView.swift */; };
+		652E95442C6913C20061FA40 /* KMLineAndBorderItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 652E95412C6913C20061FA40 /* KMLineAndBorderItemView.swift */; };
+		652E95522C6914770061FA40 /* KMLineAndBorderItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 652E95512C6914770061FA40 /* KMLineAndBorderItemView.xib */; };
+		652E95532C6914770061FA40 /* KMLineAndBorderItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 652E95512C6914770061FA40 /* KMLineAndBorderItemView.xib */; };
+		652E95542C6914770061FA40 /* KMLineAndBorderItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 652E95512C6914770061FA40 /* KMLineAndBorderItemView.xib */; };
 		65341C742C63CCFE00FE30F9 /* KMSearchReplaceWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65341C722C63CCFE00FE30F9 /* KMSearchReplaceWindowController.swift */; };
 		65341C752C63CCFE00FE30F9 /* KMSearchReplaceWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65341C722C63CCFE00FE30F9 /* KMSearchReplaceWindowController.swift */; };
 		65341C762C63CCFE00FE30F9 /* KMSearchReplaceWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65341C722C63CCFE00FE30F9 /* KMSearchReplaceWindowController.swift */; };
@@ -5439,6 +5448,9 @@
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
+		652E953C2C6670CE0061FA40 /* KMFreehandAnnotationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMFreehandAnnotationController.swift; sourceTree = "<group>"; };
+		652E95412C6913C20061FA40 /* KMLineAndBorderItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMLineAndBorderItemView.swift; sourceTree = "<group>"; };
+		652E95512C6914770061FA40 /* KMLineAndBorderItemView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMLineAndBorderItemView.xib; sourceTree = "<group>"; };
 		65341C722C63CCFE00FE30F9 /* KMSearchReplaceWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMSearchReplaceWindowController.swift; sourceTree = "<group>"; };
 		65341C732C63CCFE00FE30F9 /* KMSearchReplaceWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMSearchReplaceWindowController.xib; sourceTree = "<group>"; };
 		65341C7B2C646C6400FE30F9 /* KMSearchReplaceHanddler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMSearchReplaceHanddler.swift; sourceTree = "<group>"; };
@@ -7704,6 +7716,32 @@
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
+		652E953A2C66707E0061FA40 /* Freehand */ = {
+			isa = PBXGroup;
+			children = (
+				652E95402C6913830061FA40 /* View */,
+				652E953B2C66707E0061FA40 /* Controller */,
+			);
+			path = Freehand;
+			sourceTree = "<group>";
+		};
+		652E953B2C66707E0061FA40 /* Controller */ = {
+			isa = PBXGroup;
+			children = (
+				652E953C2C6670CE0061FA40 /* KMFreehandAnnotationController.swift */,
+			);
+			path = Controller;
+			sourceTree = "<group>";
+		};
+		652E95402C6913830061FA40 /* View */ = {
+			isa = PBXGroup;
+			children = (
+				652E95412C6913C20061FA40 /* KMLineAndBorderItemView.swift */,
+				652E95512C6914770061FA40 /* KMLineAndBorderItemView.xib */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
 		65341C702C63CC2500FE30F9 /* Search */ = {
 			isa = PBXGroup;
 			children = (
@@ -12885,6 +12923,7 @@
 		BB8B172F2907A81E001C5EA5 /* RightSide */ = {
 			isa = PBXGroup;
 			children = (
+				652E953A2C66707E0061FA40 /* Freehand */,
 				89E4E6D72963C6AA002DBA6F /* AnnotationProperty */,
 				BB8B17302907B48E001C5EA5 /* CipherTextView */,
 				8996CFE4295BE15800D32783 /* EditPDF */,
@@ -14742,6 +14781,7 @@
 				BB1B0AC22B4FC6E900889528 /* KMFunctionGuideWindowController.xib in Resources */,
 				BBBE20972B21B1DF00509C4E /* KMPDFInsertWindowController.xib in Resources */,
 				9F00CF542A38657400AC462E /* GoogleService-Info.plist in Resources */,
+				652E95522C6914770061FA40 /* KMLineAndBorderItemView.xib in Resources */,
 				AD88108729A719E500178CA1 /* KMRegisterView.xib in Resources */,
 				BB1EC8012967B26700EC0BC3 /* KMPDFEditViewController.xib in Resources */,
 				AD1D48132AFB1912007AC1F0 /* KMCompressView.xib in Resources */,
@@ -15083,6 +15123,7 @@
 				ADFCEB652B4FBFC50001EBAF /* ad_cancel_button00@2x.png in Resources */,
 				8997010228F40710009AF911 /* KMBookMarkViewController.xib in Resources */,
 				BBFE6E69293097A600142C01 /* KMPageRangePickerWindowController.xib in Resources */,
+				652E95532C6914770061FA40 /* KMLineAndBorderItemView.xib in Resources */,
 				89752DB12936F505003FF08E /* KMCustomButtonPopMenuViewController.xib in Resources */,
 				9F705F7A291A3A84005199AD /* KMHistoryFileDeleteWindowController.xib in Resources */,
 				BB031B6A2C47BB080099F7AD /* KMUserFbEmailItemView.xib in Resources */,
@@ -15835,6 +15876,7 @@
 				BBC4F9F02AEB58470098A1A8 /* KMAlertWindowController.xib in Resources */,
 				BBBE20992B21B1DF00509C4E /* KMPDFInsertWindowController.xib in Resources */,
 				BB6710632BC672260018CE54 /* KMSignatureWindowController.xib in Resources */,
+				652E95542C6914770061FA40 /* KMLineAndBorderItemView.xib in Resources */,
 				ADBC2CF7299C7B3E006280C8 /* Print.xcassets in Resources */,
 				9F0CB48C29683DC400007028 /* KMPropertiesPanelPresetColorSubVC.xib in Resources */,
 				BBAC26AA2AFE138800563A08 /* KMToolbarItemPopViewController.xib in Resources */,
@@ -16117,6 +16159,7 @@
 				AD055E7E2B88294F0035F824 /* SKBookmarkSheetController.m in Sources */,
 				BB031B6F2C47BB080099F7AD /* KMUserFbTypeItemView.swift in Sources */,
 				BB897246294C19980045787C /* KMWatermarkAdjectiveListController.swift in Sources */,
+				652E95422C6913C20061FA40 /* KMLineAndBorderItemView.swift in Sources */,
 				BBA8B66F2B9027D700CB07B0 /* SKFileUpdateChecker.m in Sources */,
 				BBC347FD295448DE008D2CD1 /* KMWatermarkTemplateModel.swift in Sources */,
 				ADDEEA5E2AD39DC500EF675D /* KMSignatureManager.swift in Sources */,
@@ -16435,6 +16478,7 @@
 				ADDF83562B391A5C00A81A4E /* DSignatureCreateViewController.swift in Sources */,
 				AD0FA50A29A9E74200EDEB50 /* KMLoginInputPasswordView.swift in Sources */,
 				8942F80329262B2E00389627 /* KMSideViewController.swift in Sources */,
+				652E953D2C6670CE0061FA40 /* KMFreehandAnnotationController.swift in Sources */,
 				BBFA1CC92B60967A0053AD4A /* KMScreenShotHandler.swift in Sources */,
 				AD59993E2AD7E88600412F8B /* KMStampManager.swift in Sources */,
 				BB147014299DC0D100784A6A /* OIDAuthState.m in Sources */,
@@ -17779,6 +17823,7 @@
 				9F1FE49429406E4700E952CA /* common.m in Sources */,
 				ADDF83AE2B391A5D00A81A4E /* DSignatureConfig.swift in Sources */,
 				BB6347C52AF24F6300F5438E /* KMBatchoperateConvertCollectionViewItem.swift in Sources */,
+				652E953E2C6670CE0061FA40 /* KMFreehandAnnotationController.swift in Sources */,
 				BB1B0AC92B4FC6E900889528 /* KMGuideConfig.swift in Sources */,
 				BB6710652BC672260018CE54 /* KMSignatureWindowController.m in Sources */,
 				AD0FA51329A9FA8600EDEB50 /* KMResetPasswordView.swift in Sources */,
@@ -17836,6 +17881,7 @@
 				AD7D5CC32B9566D0006562CD /* KMBookmarkOutlineView.swift in Sources */,
 				BBFA1CCE2B609E890053AD4A /* KMScreenShotMaskWindowController.swift in Sources */,
 				9F5664882988B16F00020985 /* KMTextfieldVC.swift in Sources */,
+				652E95432C6913C20061FA40 /* KMLineAndBorderItemView.swift in Sources */,
 				89D2D2FC294C806000BFF5FE /* KMPDFThumbnailItem.swift in Sources */,
 				BB3D970B2B2FEAC8007094C8 /* KMPDFRedactViewController.swift in Sources */,
 				ADDF83302B391A5C00A81A4E /* NSGeometry+PDFListView.m in Sources */,
@@ -18575,6 +18621,7 @@
 				BB897243294C028A0045787C /* KMWatermarkAdjectiveSegementControl.swift in Sources */,
 				BB031B712C47BB080099F7AD /* KMUserFbTypeItemView.swift in Sources */,
 				ADE3C1EF29A5AFB100793B13 /* KMRequestServerManager.swift in Sources */,
+				652E95442C6913C20061FA40 /* KMLineAndBorderItemView.swift in Sources */,
 				BBC70EB22AEA80EC00AC1585 /* KMToolbarCustomWindowController.swift in Sources */,
 				9F1FE4B629406E4700E952CA /* CTBrowser.m in Sources */,
 				AD055E272B70B3C10035F824 /* KMBookmarkController.swift in Sources */,
@@ -18893,6 +18940,7 @@
 				AD055E2F2B70B3D50035F824 /* KMBookmarkSheetController.swift in Sources */,
 				BB97BE262BC3E02D00BECEA8 /* SKExportAccessoryController.m in Sources */,
 				BB42A5DA2B8F0F860092C524 /* KMTabbingHintWindowController.swift in Sources */,
+				652E953F2C6670CE0061FA40 /* KMFreehandAnnotationController.swift in Sources */,
 				ADDDCE232B43A32A005B4AB5 /* AppSandboxFileAccessPersist.m in Sources */,
 				AD199DFA2B26A36500D56FEE /* KMPrintPosterPreviewView.swift in Sources */,
 				ADFA8EFF2B5649AE002595A4 /* KMAutoFlowOptionsSheetController.swift in Sources */,