瀏覽代碼

【2025】【组件库】组件库完善

niehaoyu 1 天之前
父節點
當前提交
149f272b11

+ 20 - 0
PDF Office/KMComponentLibrary/KMComponentLibrary.xcodeproj/project.pbxproj

@@ -181,6 +181,9 @@
 		BB5A9D1C2CB64D4800F64C1F /* Component.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BB5A9C732CB64D4800F64C1F /* Component.xcassets */; };
 		BB5A9D1D2CB64D4800F64C1F /* brand-variables.json in Resources */ = {isa = PBXBuildFile; fileRef = BB5A9C742CB64D4800F64C1F /* brand-variables.json */; };
 		BB7221562CD1E3B500331DEA /* ComponentManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB7221552CD1E3B500331DEA /* ComponentManager.swift */; };
+		BB7929FA2CEF3CB7006FFD5D /* ComponentSwitchProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB7929F92CEF3CB7006FFD5D /* ComponentSwitchProperty.swift */; };
+		BB7929FC2CEF3CCC006FFD5D /* ComponentSwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB7929FB2CEF3CCC006FFD5D /* ComponentSwitch.swift */; };
+		BB7929FE2CEF3CD4006FFD5D /* ComponentSwitch.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB7929FD2CEF3CD4006FFD5D /* ComponentSwitch.xib */; };
 		BB79E7142CE60FDE0052CAD5 /* ComponentCSelectorItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB79E7132CE60FDE0052CAD5 /* ComponentCSelectorItem.swift */; };
 		BB79E7162CE60FEB0052CAD5 /* ComponentCSelectorItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB79E7152CE60FEB0052CAD5 /* ComponentCSelectorItem.xib */; };
 		BBE788472CBCFCD2008086E2 /* ComponentBaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBE788462CBCFCD2008086E2 /* ComponentBaseView.swift */; };
@@ -362,6 +365,9 @@
 		BB5A9C732CB64D4800F64C1F /* Component.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Component.xcassets; sourceTree = "<group>"; };
 		BB5A9C742CB64D4800F64C1F /* brand-variables.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "brand-variables.json"; sourceTree = "<group>"; };
 		BB7221552CD1E3B500331DEA /* ComponentManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComponentManager.swift; sourceTree = "<group>"; };
+		BB7929F92CEF3CB7006FFD5D /* ComponentSwitchProperty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComponentSwitchProperty.swift; sourceTree = "<group>"; };
+		BB7929FB2CEF3CCC006FFD5D /* ComponentSwitch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComponentSwitch.swift; sourceTree = "<group>"; };
+		BB7929FD2CEF3CD4006FFD5D /* ComponentSwitch.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ComponentSwitch.xib; sourceTree = "<group>"; };
 		BB79E7132CE60FDE0052CAD5 /* ComponentCSelectorItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComponentCSelectorItem.swift; sourceTree = "<group>"; };
 		BB79E7152CE60FEB0052CAD5 /* ComponentCSelectorItem.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ComponentCSelectorItem.xib; sourceTree = "<group>"; };
 		BBE788462CBCFCD2008086E2 /* ComponentBaseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComponentBaseView.swift; sourceTree = "<group>"; };
@@ -429,6 +435,7 @@
 				BB5A9C4F2CB64D4800F64C1F /* ComponentSecureTextField.swift */,
 				BB5A9C632CB64D4800F64C1F /* ComponentTextView.swift */,
 				BB5A9C6C2CB64D4800F64C1F /* NibLoadable.swift */,
+				BB7929F82CEF3C8F006FFD5D /* Switch */,
 				BB5A9B9F2CB64D4700F64C1F /* Tabs */,
 				BB5A9BA52CB64D4700F64C1F /* SideBar */,
 				BB5A9BAE2CB64D4700F64C1F /* Tree */,
@@ -986,6 +993,16 @@
 			path = Model;
 			sourceTree = "<group>";
 		};
+		BB7929F82CEF3C8F006FFD5D /* Switch */ = {
+			isa = PBXGroup;
+			children = (
+				BB7929F92CEF3CB7006FFD5D /* ComponentSwitchProperty.swift */,
+				BB7929FB2CEF3CCC006FFD5D /* ComponentSwitch.swift */,
+				BB7929FD2CEF3CD4006FFD5D /* ComponentSwitch.xib */,
+			);
+			path = Switch;
+			sourceTree = "<group>";
+		};
 /* End PBXGroup section */
 
 /* Begin PBXHeadersBuildPhase section */
@@ -1064,6 +1081,7 @@
 				BB5A9CAB2CB64D4800F64C1F /* ComponentProgressLine.xib in Resources */,
 				BB5A9CAF2CB64D4800F64C1F /* ComponentPasswordView.xib in Resources */,
 				BB5A9CED2CB64D4800F64C1F /* ComponentCColorGroup.xib in Resources */,
+				BB7929FE2CEF3CD4006FFD5D /* ComponentSwitch.xib in Resources */,
 				BB5A9D102CB64D4800F64C1F /* ComponentTag.xib in Resources */,
 				BB5A9C832CB64D4800F64C1F /* ComponentSideBarItem.xib in Resources */,
 				BB5A9CE32CB64D4800F64C1F /* ComponentCSelectorGroup.xib in Resources */,
@@ -1192,6 +1210,8 @@
 				BB5A9C872CB64D4800F64C1F /* ComponentDropdown.swift in Sources */,
 				BB5A9CAC2CB64D4800F64C1F /* ComponentProgressCircle.swift in Sources */,
 				BB5A9D092CB64D4800F64C1F /* ComponentGroup.swift in Sources */,
+				BB7929FC2CEF3CCC006FFD5D /* ComponentSwitch.swift in Sources */,
+				BB7929FA2CEF3CB7006FFD5D /* ComponentSwitchProperty.swift in Sources */,
 				BB5A9CFE2CB64D4800F64C1F /* ComponentBaseXibView.swift in Sources */,
 				BB5A9C772CB64D4800F64C1F /* ComponentFormatter.swift in Sources */,
 				BB5A9CEC2CB64D4800F64C1F /* ComponentCColorItem.swift in Sources */,

+ 163 - 0
PDF Office/KMComponentLibrary/KMComponentLibrary/View/Switch/ComponentSwitch.swift

@@ -0,0 +1,163 @@
+//
+//  ComponentSwitch.swift
+//  KMComponentLibrary
+//
+//  Created by Niehaoyu on 2024/11/21.
+//
+
+import Cocoa
+
+public class ComponentSwitch: ComponentBaseXibView {
+
+    @IBOutlet var contendView: NSView!
+    @IBOutlet var iconView: NSView!
+    
+    @IBOutlet var iconWidthConst: NSLayoutConstraint!
+    @IBOutlet var iconLeftConst: NSLayoutConstraint!
+     
+    // MARK: Private Property
+    private var _properties : ComponentSwitchProperty = ComponentSwitchProperty()
+    
+    private var action: Selector?   // 点击事件
+    private weak var target: AnyObject? // 对象目标
+    
+    public var _tagIndex: Int = 0
+    
+    public override func draw(_ dirtyRect: NSRect) {
+        super.draw(dirtyRect)
+        
+        // Drawing code here.
+    }
+    
+    // MARK: 初始化
+    deinit {
+        NotificationCenter.default.removeObserver(self)
+        
+    }
+    
+    public required init?(coder decoder: NSCoder) {
+        super.init(coder: decoder)
+        
+    }
+    
+    override init(frame frameRect: NSRect) {
+        super.init(frame: frameRect)
+    }
+    
+    public override func awakeFromNib() {
+        super.awakeFromNib()
+          
+    }
+    
+    public override func layout() {
+        super.layout()
+        
+    }
+    
+    public var properties : ComponentSwitchProperty {
+        get {
+            return _properties
+        }
+        set {
+            _properties = newValue
+            
+            ComponentLibrary.shared.configSwitchComponent(properties: _properties)
+            
+            setupUI()
+            
+            refreshUI()
+        }
+    }
+    
+    //MARK: - SetupUI
+    func setupUI() {
+        
+        contendView.wantsLayer = true
+        
+        contendView.layer?.masksToBounds = true
+         
+        iconView.wantsLayer = true
+        iconView.layer?.masksToBounds = true
+        iconView.layer?.backgroundColor = properties.propertyInfo.borderColor_nor.cgColor
+        
+        if properties.size == .m {
+            contendView.layer?.cornerRadius = 12
+            iconWidthConst.constant = 16
+            iconView.layer?.cornerRadius = 8
+        } else {
+            contendView.layer?.cornerRadius = 10
+            iconWidthConst.constant = 12
+            iconView.layer?.cornerRadius = 6
+        }
+    }
+    
+    func refreshUI() {
+        if properties.isDisabled == true {
+            if properties.open {
+                contendView.layer?.backgroundColor = properties.propertyInfo.color_hov.cgColor
+            } else {
+                contendView.layer?.backgroundColor = properties.propertyInfo.color_dis.cgColor
+            }
+        } else {
+            if properties.open {
+                contendView.layer?.backgroundColor = properties.propertyInfo.color_active.cgColor
+            } else {
+                contendView.layer?.backgroundColor = properties.propertyInfo.color_nor.cgColor
+            }
+        }
+        
+        if properties.open {
+            iconLeftConst.constant = CGRectGetWidth(self.bounds) - iconWidthConst.constant - 4
+        } else {
+            iconLeftConst.constant = 4
+        }
+    }
+    
+    public func reloadData() {
+        setupUI()
+        
+        refreshUI()
+    }
+    
+    public func setTarget(_ target: AnyObject?, action: Selector?) {
+        self.target = target!
+        self.action = action!
+    }
+    
+    //MARK: - MouseEvent
+    public override func mouseEntered(with event: NSEvent) {
+        super.mouseEntered(with: event)
+          
+    }
+    
+    public override func mouseMoved(with event: NSEvent) {
+        super.mouseMoved(with: event)
+         
+    }
+    
+    public override func mouseExited(with event: NSEvent) {
+        super.mouseExited(with: event)
+         
+    }
+    
+    public override func mouseDown(with event: NSEvent) {
+        super.mouseDown(with: event)
+        
+        if properties.isDisabled == false {
+            properties.open = !properties.open
+            
+            refreshUI()
+        }
+        
+    }
+    
+    public override func mouseUp(with event: NSEvent) {
+        super.mouseUp(with: event)
+        
+        if let target = target, let action = action {
+            _ = target.perform(action, with: self)
+        }
+    }
+    
+    
+}

+ 49 - 0
PDF Office/KMComponentLibrary/KMComponentLibrary/View/Switch/ComponentSwitch.xib

@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="22505" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22505"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="ComponentSwitch" customModule="KMComponentLibrary" customModuleProvider="target">
+            <connections>
+                <outlet property="contendView" destination="5mk-j0-dVq" id="ltw-D2-ea1"/>
+                <outlet property="iconLeftConst" destination="U8o-1d-4jI" id="sg4-qH-jrb"/>
+                <outlet property="iconView" destination="3ag-IM-JoY" id="F8e-0Z-Lcy"/>
+                <outlet property="iconWidthConst" destination="tKs-Ss-7tv" id="Qy0-af-IE6"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customView id="c22-O7-iKe">
+            <rect key="frame" x="0.0" y="0.0" width="44" height="24"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <customView translatesAutoresizingMaskIntoConstraints="NO" id="5mk-j0-dVq">
+                    <rect key="frame" x="0.0" y="0.0" width="44" height="24"/>
+                    <subviews>
+                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="3ag-IM-JoY">
+                            <rect key="frame" x="4" y="4" width="16" height="16"/>
+                            <constraints>
+                                <constraint firstAttribute="width" secondItem="3ag-IM-JoY" secondAttribute="height" multiplier="1:1" id="noU-Ur-15y"/>
+                                <constraint firstAttribute="width" constant="16" id="tKs-Ss-7tv"/>
+                            </constraints>
+                        </customView>
+                    </subviews>
+                    <constraints>
+                        <constraint firstItem="3ag-IM-JoY" firstAttribute="leading" secondItem="5mk-j0-dVq" secondAttribute="leading" constant="4" id="U8o-1d-4jI"/>
+                        <constraint firstItem="3ag-IM-JoY" firstAttribute="centerY" secondItem="5mk-j0-dVq" secondAttribute="centerY" id="ms9-Sl-US8"/>
+                    </constraints>
+                </customView>
+            </subviews>
+            <constraints>
+                <constraint firstItem="5mk-j0-dVq" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" id="ACR-Lx-GMi"/>
+                <constraint firstItem="5mk-j0-dVq" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" id="BKo-XK-TkD"/>
+                <constraint firstAttribute="bottom" secondItem="5mk-j0-dVq" secondAttribute="bottom" id="BLI-5J-Cs0"/>
+                <constraint firstAttribute="trailing" secondItem="5mk-j0-dVq" secondAttribute="trailing" id="w68-Mj-UyB"/>
+            </constraints>
+            <point key="canvasLocation" x="-40" y="195"/>
+        </customView>
+    </objects>
+</document>

+ 63 - 0
PDF Office/KMComponentLibrary/KMComponentLibrary/View/Switch/ComponentSwitchProperty.swift

@@ -0,0 +1,63 @@
+//
+//  ComponentSwitchProperty.swift
+//  KMComponentLibrary
+//
+//  Created by Niehaoyu on 2024/11/21.
+//
+
+import Cocoa
+
+public class ComponentSwitchProperty: NSObject {
+    
+    public var size: ComponentSize = .m
+    public var open: Bool = false
+    public var isDisabled: Bool = false //禁用状态
+    public var identifier: String = ""
+    
+    public var propertyInfo = SwitchPropertyInfo()
+    
+    public init(size: ComponentSize = .m,
+                open: Bool = false,
+                isDisabled: Bool = false,
+                identifier: String = "") {
+        
+        self.size = size
+        self.open = open
+        self.isDisabled = isDisabled
+        self.identifier = identifier
+        
+    }
+}
+
+public class SwitchPropertyInfo: ComponentPropertyInfo {
+    
+    //MARK: - Function
+    override init() {
+        super.init()
+         
+    }
+    
+}
+
+//MARK: - ComponentLibrary
+extension ComponentLibrary {
+    func configSwitchComponent(properties: ComponentSwitchProperty) -> Void {
+        if properties.size == .m {
+            properties.propertyInfo.viewWidth = 44
+            properties.propertyInfo.viewHeight = 24
+        } else {
+            properties.propertyInfo.viewWidth = 36
+            properties.propertyInfo.viewHeight = 20
+        }
+        
+        properties.propertyInfo.color_nor = ComponentLibrary.shared.getComponentColorFromKey("colorFill/1") //关闭开放状态
+        properties.propertyInfo.color_dis = ComponentLibrary.shared.getComponentColorFromKey("colorFill/dis") //关闭,禁用状态
+        
+        properties.propertyInfo.color_active = ComponentLibrary.shared.getComponentColorFromKey("colorPrimary/base") //Open开放状态
+        properties.propertyInfo.color_hov = ComponentLibrary.shared.getComponentColorFromKey("colorPrimary/fillDis") //Open,禁用状态
+     
+        properties.propertyInfo.borderColor_nor = ComponentLibrary.shared.getComponentColorFromKey("colorFill/hight") //圆圈颜色
+ 
+    }
+    
+}

+ 7 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/EditTool/Crop/Views/KMCropPropertyController.swift

@@ -17,8 +17,11 @@ class KMCropPropertyController: NSViewController {
     @IBOutlet var whiteMarginLabel: NSTextField!
     @IBOutlet var separateLabel: NSTextField!
     @IBOutlet var separateTip: ComponentToolTipsHelp!
+    @IBOutlet var separateSwitch: ComponentSwitch!
+    
     @IBOutlet var autoLabel: NSTextField!
     @IBOutlet var autoTipsView: ComponentToolTipsHelp!
+    @IBOutlet var autoSwitch: ComponentSwitch!
     
     //PageSize
     @IBOutlet var pageSizeBGView: NSView!
@@ -65,6 +68,8 @@ class KMCropPropertyController: NSViewController {
         separateLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("comp-form/colorText-label")
         separateLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-m-regular")
         
+        separateSwitch.properties = ComponentSwitchProperty(size: .s, open: false, isDisabled: false)
+        
         autoLabel.stringValue = KMLocalizedString("Auto")
         autoLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("comp-form/colorText-label")
         autoLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-m-regular")
@@ -73,6 +78,8 @@ class KMCropPropertyController: NSViewController {
         
         autoTipsView.toolTip = KMLocalizedString("autoTipsView tooltips")
         
+        autoSwitch.properties = ComponentSwitchProperty(size: .s, open: false, isDisabled: false)
+        
         //PageSize
         whiteMarginLabel.stringValue = KMLocalizedString("Crop Page Size")
         whiteMarginLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/2")

+ 4 - 2
PDF Office/PDF Master/KMClass/KMPDFViewController/EditTool/Crop/Views/KMCropPropertyController.xib

@@ -9,6 +9,7 @@
         <customObject id="-2" userLabel="File's Owner" customClass="KMCropPropertyController" customModule="PDF_Reader_Pro" customModuleProvider="target">
             <connections>
                 <outlet property="autoLabel" destination="Pox-Aj-ggV" id="Evv-OH-wFo"/>
+                <outlet property="autoSwitch" destination="Nqx-6k-Ums" id="cph-8E-24c"/>
                 <outlet property="autoTipsView" destination="zBZ-lT-HHX" id="Ose-Nv-jq0"/>
                 <outlet property="contendView" destination="mW3-ql-4lm" id="UJi-rb-ZKz"/>
                 <outlet property="cropButton" destination="d54-4L-Wyh" id="Szz-Fu-V5p"/>
@@ -24,6 +25,7 @@
                 <outlet property="pageTopInput" destination="Q5l-Fj-BXV" id="w6L-DZ-FOZ"/>
                 <outlet property="pangeRangeSelectView" destination="Yzw-1e-BI2" id="lpY-0v-Up5"/>
                 <outlet property="separateLabel" destination="YMx-pu-p3t" id="SNn-DC-Td7"/>
+                <outlet property="separateSwitch" destination="kuE-KQ-x2a" id="sj0-L8-fMs"/>
                 <outlet property="separateTip" destination="f9e-Is-qUS" id="Tx1-UW-hcM"/>
                 <outlet property="sizeHeightInput" destination="PrT-SI-riy" id="Zzg-ei-qqQ"/>
                 <outlet property="sizeSyncButton" destination="Uz6-6u-Mps" id="dj2-qH-Z6o"/>
@@ -84,7 +86,7 @@
                                                         <constraint firstAttribute="width" constant="16" id="ywL-hF-dLq"/>
                                                     </constraints>
                                                 </customView>
-                                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="kuE-KQ-x2a">
+                                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="kuE-KQ-x2a" customClass="ComponentSwitch" customModule="KMComponentLibrary">
                                                     <rect key="frame" x="196" y="0.0" width="36" height="20"/>
                                                     <constraints>
                                                         <constraint firstAttribute="height" constant="20" id="y8B-LC-kr0"/>
@@ -120,7 +122,7 @@
                                                         <constraint firstAttribute="height" constant="16" id="mfe-su-iAo"/>
                                                     </constraints>
                                                 </customView>
-                                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="Nqx-6k-Ums">
+                                                <customView translatesAutoresizingMaskIntoConstraints="NO" id="Nqx-6k-Ums" customClass="ComponentSwitch" customModule="KMComponentLibrary">
                                                     <rect key="frame" x="196" y="0.0" width="36" height="20"/>
                                                     <constraints>
                                                         <constraint firstAttribute="width" constant="36" id="Iaz-oP-ENG"/>

PDF Office/PDF Master/KMClass/Tools/NSImage+Extension/NSImage+Extension.swift → PDF Office/PDF Master/KMClass/Tools/Category/NSImage+Extension.swift


PDF Office/PDF Master/KMClass/KMPDFViewController/EditTool/KMPageRangeSelectView.swift → PDF Office/PDF Master/KMClass/Tools/CustomViews/KMPageRangeSelectView.swift


+ 10 - 2
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -9386,6 +9386,7 @@
 				9F3D818D29A22AD90087B5AD /* Date+KMExtensions.swift */,
 				9F81ADC529B9B12C002251F4 /* NSButton+DesignToken.swift */,
 				BBD54ED32A1CBD720012A230 /* NSView+KMExtension.swift */,
+				BB4583C52CC91543005737F3 /* NSImage+Extension.swift */,
 			);
 			path = Category;
 			sourceTree = "<group>";
@@ -11465,7 +11466,6 @@
 			children = (
 				BBD14F552CDA02570077D52E /* KMEditToolbarView.swift */,
 				BBD14F592CDA02640077D52E /* KMEditToolbarView.xib */,
-				BB7929F42CEF342D006FFD5D /* KMPageRangeSelectView.swift */,
 				BB9138332CEE07D200BAB4A7 /* Crop */,
 				BB8AA5342CC65C310084F183 /* KMNAlignmentController */,
 				BB0F585F2CDB70BD00B4D353 /* SinglePagePDFController */,
@@ -12545,7 +12545,6 @@
 		BB4583C42CC91531005737F3 /* NSImage+Extension */ = {
 			isa = PBXGroup;
 			children = (
-				BB4583C52CC91543005737F3 /* NSImage+Extension.swift */,
 			);
 			path = "NSImage+Extension";
 			sourceTree = "<group>";
@@ -13182,6 +13181,14 @@
 			path = Views;
 			sourceTree = "<group>";
 		};
+		BB7929FF2CEF4B96006FFD5D /* CustomViews */ = {
+			isa = PBXGroup;
+			children = (
+				BB7929F42CEF342D006FFD5D /* KMPageRangeSelectView.swift */,
+			);
+			path = CustomViews;
+			sourceTree = "<group>";
+		};
 		BB7F7BFD29AA585E00A3E4E7 /* images */ = {
 			isa = PBXGroup;
 			children = (
@@ -14908,6 +14915,7 @@
 		F3D395632CBD2BE7000C6729 /* Tools */ = {
 			isa = PBXGroup;
 			children = (
+				BB7929FF2CEF4B96006FFD5D /* CustomViews */,
 				F321C1E02CD9EF73009982C8 /* Secure */,
 				9FAAA33C290FEC4D0046FFCE /* Category */,
 				650FF6732CC896D90019FAE1 /* PDFPreview */,