Forráskód Böngészése

【工具栏】自定义工具栏补充窗口控制器

tangchao 9 hónapja
szülő
commit
0f3e00e2a1

+ 305 - 1
PDF Office/PDF Master/Class/PDFWindowController/Toolbar/Controller/KMToolbarConfigViewController.swift

@@ -8,6 +8,13 @@
 import Cocoa
 
 class KMToolbarConfigViewController: NSViewController {
+    
+    @IBOutlet weak var collectionView: NSCollectionView!
+    
+    private let cellIdentifier_ = NSUserInterfaceItemIdentifier(rawValue: "ToolbarConfigCellIdentifier")
+    
+    var model = KMToolbarConfigModel()
+    
     deinit {
         Swift.debugPrint("KMToolbarConfigViewController deinit.")
     }
@@ -18,7 +25,304 @@ class KMToolbarConfigViewController: NSViewController {
 
     override func viewDidLoad() {
         super.viewDidLoad()
-        // Do view setup here.
+        
+        self.view.wantsLayer = true
+        self.view.layer?.backgroundColor = NSColor.red.cgColor
+        
+        self.initDefalutValue()
+    }
+    
+    func initDefalutValue() {
+        self.collectionView.delegate = self
+        self.collectionView.dataSource = self
+        
+//        let layout = NSCollectionViewFlowLayout()
+//        layout.sectionInset = NSEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
+//        layout.minimumInteritemSpacing = 20
+//        layout.minimumLineSpacing = 30
+//        layout.itemSize = NSSize(width: 60, height: 44)
+//        self.collectionView.collectionViewLayout = layout
+        
+        self.collectionView.register(KMToolbarConfigViewItem.self, forItemWithIdentifier: self.cellIdentifier_)
+    }
+    
+    private func _setupMainItem(_ item: KMToolbarItemView?) {
+        let identifier = item?.itemIdentifier
+        if identifier == KMLeftControlToolbarItemIdentifier {
+            item?.image = NSImage(named: "KMImageNameUXIconBtnTriLeftNor")
+            item?.titleName = NSLocalizedString("Panel", comment: "")
+            item?.target = self
+            item?.toolTip = NSLocalizedString("View Settings", comment: "")
+            item?.boxImagePosition = .imageAbove
+            item?.selectBackgroundType = .imageBox
+        } else if identifier == KMDocumentZoomToolbarItemIdentifier {
+            item?.image = NSImage(named: "KMImageNameUXIconToolbarZoominNor")
+            item?.titleName = NSLocalizedString("", comment: "")
+            item?.target = self
+            item?.btnTag = 1
+            item?.toolTip = NSLocalizedString("Zoom In", comment: "")
+            item?.boxImagePosition = .imageAbove
+        } else if identifier == KMDocumentZoomOutToolbarItemIdentifier {
+            item?.image = NSImage(named: "KMImageNameUXIconToolbarZoomoutNor")
+            item?.titleName = NSLocalizedString("", comment: "")
+            item?.target = self
+            item?.btnTag = 0
+            item?.toolTip = NSLocalizedString("Zoom Out", comment: "")
+            item?.boxImagePosition = .imageAbove
+        } else if identifier == KMDocumentZoomViewToolbarItemIdentifier{
+            item?.titleName = NSLocalizedString("Zoom", comment: "")
+            item?.target = self
+
+            let view = KMToolbarZoomItemView(zoomView: nil)
+            item?.customizeView = view
+        } else if identifier == KMDocumentNextPageToolbarItemIdentifier {
+            item?.image = NSImage(named: "KMImageNameToolbarPagenextNor")
+            item?.titleName = NSLocalizedString("Next", comment: "")
+            item?.target = self
+            item?.toolTip = NSLocalizedString("Go To Next Page", comment: "")
+            item?.boxImagePosition = .imageAbove
+        } else if identifier == KMDocumentPreviousPageToolbarItemIdentifier {
+            item?.titleName = NSLocalizedString("Zoom", comment: "")
+            item?.target = self
+
+            let view = KMToolbarPreviousNextItemView()
+            item?.customizeView = view
+        } else if identifier == KMDocumentHomeToolbarItemIdentifier {
+            item?.image = NSImage(named: "KMImageNameToolbarHomeNor")
+            item?.titleName = NSLocalizedString("Home", comment: "")
+            item?.target = self
+            item?.toolTip = NSLocalizedString("A Welcome Gift from Us", comment: "")
+            item?.boxImagePosition = .imageAbove
+            item?.selectBackgroundType = .imageBox
+        } else if identifier == KMDocumentAnnotationToolbarItemIdentifier {
+            item?.titleName = NSLocalizedString("Tools", comment: "")
+            item?.image = NSImage(named: "KMImageNameUXIconToolbarMytoolsNor")
+            item?.target = self
+            item?.toolTip = String(format: "%@: %@, %@, %@, %@",  KMLocalizedString("Tool Mode", nil),KMLocalizedString("Annotate", nil),KMLocalizedString("Scroll", nil),KMLocalizedString("Magnify", nil),KMLocalizedString("Select", nil))
+            item?.btnTag = KMToolbarViewType.Annatiton.rawValue
+            item?.boxImagePosition = .imageAbove
+            item?.selectBackgroundType = .imageBox
+        } else if identifier == KMDocumentPageToolbarItemIdentifier {
+            item?.titleName = NSLocalizedString("Page Edit", comment: "")
+            item?.target = self
+            item?.image = NSImage(named: "KMImageNameUXIconToolbarPageeditNor")
+            item?.toolTip = NSLocalizedString("PDF page editor: insert, delete, extract, rotate, reposition, and replace pages in a PDF", comment: "")
+            item?.btnTag = KMToolbarViewType.Page.rawValue
+            item?.boxImagePosition = .imageAbove
+            item?.selectBackgroundType = .imageBox
+        } else if identifier == KMDocumentConversonToolbarItemIdentifier {
+            item?.titleName = NSLocalizedString("Converter", comment: "")
+            item?.target = self
+            item?.image = NSImage(named: "KMImageNameUXIconToolbarConvertNor")
+            item?.toolTip = NSLocalizedString("Convert PDFs to Microsoft Word, PowerPoint, Excel, RTF, Text, Image, CSV, and more Offline", comment: "")
+            item?.btnTag = KMToolbarViewType.Conversion.rawValue
+            item?.boxImagePosition = .imageAbove
+            item?.selectBackgroundType = .imageBox
+            item?.promptIdentifier = identifier
+
+        } else if identifier == KMDocumentScanOCRToolbarItemIdentifier {
+            item?.titleName = NSLocalizedString("OCR", comment: "")
+            item?.target = self
+            item?.image = NSImage(named: "KMImageNameToolbarOCRNor")
+            item?.boxImagePosition = .imageAbove
+            item?.toolTip = NSLocalizedString("Recognize text from Image-based or Scanned PDF with OCR", comment: "")
+            item?.selectBackgroundType = .imageBox
+            item?.promptIdentifier = identifier
+        } else if identifier == KMToolbarToolEnhancedScanIdentifier {
+            item?.image = NSImage(named: "KMImageNameMainToolEnhancedScan")
+            item?.target = self
+            item?.btnTag = 0
+            item?.toolTip = NSLocalizedString("Enhanced Scan", comment: "")
+            item?.titleName = NSLocalizedString("Enhanced Scan", comment: "")
+            item?.boxImagePosition = .imageLeft
+            item?.selectBackgroundType = .imageBox
+        } else if identifier == KMToolbarToolOCRTextIdentifier {
+            item?.image = NSImage(named: "KMImageNameMainToolOCRText")
+            item?.target = self
+            item?.toolTip = NSLocalizedString("OCR Text Recognition", comment: "")
+            item?.titleName = NSLocalizedString("OCR Text Recognition", comment: "")
+            item?.boxImagePosition = .imageLeft
+            item?.selectBackgroundType = .imageBox
+            item?.promptIdentifier = identifier
+
+        } else if identifier == KMDocumentEditToolbarItemIdentifier {
+            item?.titleName = NSLocalizedString("Edit PDF", comment: "")
+            item?.target = self
+            item?.image = NSImage(named: "KMImageNameUXIconToolbarEditNor")
+            item?.boxImagePosition = .imageAbove
+            item?.btnTag = KMToolbarViewType.editPDF.rawValue
+            item?.toolTip = NSLocalizedString("Edit text and image in PDF ", comment: "")
+            item?.selectBackgroundType = .imageBox
+            item?.promptIdentifier = identifier
+
+        } else if identifier == KMDocumentFormToolbarItemIdentifier {
+            item?.titleName = NSLocalizedString("Forms", comment: "")
+            item?.target = self
+            item?.image = NSImage(named: "KMImageNameUXIconToolbarFormNor")
+            item?.boxImagePosition = .imageAbove
+            item?.btnTag = KMToolbarViewType.Form.rawValue
+            item?.toolTip = NSLocalizedString("Edit PDF Form", comment: "")
+            item?.selectBackgroundType = .imageBox
+            item?.promptIdentifier = identifier
+        }
+        
+        else if identifier == KMDocumentFillSginToolbarItemIdentifier {
+            item?.titleName = NSLocalizedString("Fill & Sign", comment: "")
+            item?.target = self
+            item?.image = NSImage(named: "KMImageNameUXIconToolbarFillsignNor")
+            item?.boxImagePosition = .imageAbove
+            item?.btnTag = KMToolbarViewType.FillSign.rawValue
+            item?.toolTip = NSLocalizedString("Fill and sign forms", comment: "")
+            item?.selectBackgroundType = .imageBox
+            item?.promptIdentifier = identifier
+        } else if identifier == KMDocumentToolToolbarItemIdentifier {
+            item?.titleName = NSLocalizedString("Editor", comment: "")
+            item?.target = self
+            item?.image = NSImage(named: "KMImageNameUXIconToolbarEdittoolNor")
+            item?.boxImagePosition = .imageAbove
+            item?.btnTag = KMToolbarViewType.Tool.rawValue
+            item?.toolTip = NSLocalizedString("Edit, delete, cut, copy, paste, and insert text in PDFs", comment: "")
+            item?.selectBackgroundType = .imageBox
+            item?.promptIdentifier = identifier
+        } else if identifier == KMDocumentRedactToolbarItemIdentifier {
+            item?.titleName = NSLocalizedString("Redact Text", comment: "")
+            item?.target = self
+            item?.image = NSImage(named: "KMImageNameUXIconToolbarRedactNor")
+            item?.boxImagePosition = .imageAbove
+            item?.toolTip = NSLocalizedString("Mark for redaction", comment: "")
+            item?.selectBackgroundType = .imageBox
+            item?.promptIdentifier = identifier
+        } else if identifier == KMDocumentAITranslationToolbarItemIdentifier {
+            item?.image = NSImage(named: "ic_function_other_AITranslation")
+            item?.titleName = "AI Translation"
+            item?.target = self
+            item?.toolTip = NSLocalizedString("AI Translation", comment: "")
+            item?.boxImagePosition = .imageOnly
+            item?.promptIdentifier = identifier
+        } else if identifier == KMDocumentPrintToolbarItemIdentifier {
+            item?.image = NSImage(named: "KMImageNameMainToolbarPrint")
+            item?.titleName = "Print"
+            item?.target = self
+            item?.toolTip = NSLocalizedString("Print", comment: "")
+            item?.boxImagePosition = .imageOnly
+        } else if identifier == KMDocumentViewDisplayToolbarItemIdentifier {
+            item?.image = NSImage(named: "KMImageNameUXIconToolbarPageviewNor")
+            item?.titleName = NSLocalizedString("Page Display", comment: "")
+            item?.target = self
+            item?.toolTip = NSLocalizedString("Page Display", comment: "")
+            item?.boxImagePosition = .imageAbove
+            item?.selectBackgroundType = .imageBox
+            item?.promptIdentifier = identifier
+        } else if identifier == KMDocumentAIToolsToolbarItemIdentifier {
+            item?.image = NSImage(named: "KMImageNameUXIconAINor")
+            item?.titleName = NSLocalizedString("AI Tools", comment: "")
+            item?.target = self
+            item?.toolTip = NSLocalizedString("AI Tools", comment: "")
+            item?.boxImagePosition = .imageAbove
+            item?.selectBackgroundType = .imageBox
+            item?.promptIdentifier = identifier
+        } else if identifier == KMDocumentShareToolbarItemIdentifier {
+            item?.image = NSImage(named: "KMImageNameUXIconToolbarShareNor")
+            item?.titleName = NSLocalizedString("Share", comment: "")
+            item?.target = self
+//            item?.toolTip = NSLocalizedString("Share the file with others", comment: "")
+            item?.boxImagePosition = .imageAbove
+            item?.selectBackgroundType = .imageBox
+        } else if identifier == KMDocumentSearchToolbarItemIdentifier {
+            item?.titleName = NSLocalizedString("Search", comment: "")
+            item?.target = self
+            let view = NSView()
+            view.frame = NSMakeRect(0, 0, 150, 40)
+            let boxView = NSView()
+            boxView.frame = NSMakeRect(0, 16, 150, 22)
+            view.addSubview(boxView)
+            let searchView = NSSearchField()
+            searchView.frame = NSMakeRect(0, 0, 150, 22)
+            searchView.placeholderString = NSLocalizedString("Search", comment: "")
+            searchView.sendsWholeSearchString = true
+            searchView.sendsSearchStringImmediately = true
+            searchView.drawsBackground = false
+//            searchView.delegate = self
+//            self.searchField = searchView
+
+//            self.refreshSearchBarMenu()
+
+            boxView.addSubview(searchView)
+            let titleLabel = NSTextField(labelWithString: NSLocalizedString("Search", comment: ""))
+            view.addSubview(titleLabel)
+            titleLabel.frame = NSMakeRect(0, 0, 130, 14)
+            titleLabel.alignment = .center
+            titleLabel.textColor = KMAppearance.subtitleColor()
+            titleLabel.font = KMToolbarMainItemView.textFont
+
+            item?.customizeView = view
+        } else if identifier == KMRightControlToolbarItemIdentifier {
+            item?.image = NSImage(named: "KMImageNameUXIconBtnTriRightNor")
+            item?.titleName = NSLocalizedString("Properties", comment: "")
+            item?.target = self
+            item?.toolTip = NSLocalizedString("Show/Hide Annotation Properties Panel", comment: "")
+            item?.boxImagePosition = .imageAbove
+            item?.selectBackgroundType = .imageBox
+        } else if identifier == KMToolbarToolRedactItemIdentifier {
+            item?.image = NSImage(named: "KMImageNameMainToolsRedact")
+            item?.target = self
+            item?.btnTag = KMToolbarType.redact.rawValue
+            item?.toolTip = NSLocalizedString("Redact", comment: "")
+            item?.titleName = NSLocalizedString("Redact", comment: "")
+            item?.selectBackgroundType = .imageBox
+            item?.promptIdentifier = identifier
+        } else if identifier == KMDocumentDigitalSignToolbarItemIdentifier {
+            item?.image = NSImage(named: "DigitalSign_icon")
+            item?.target = self
+            item?.toolTip = NSLocalizedString("Digital signature ensures the authenticity and integrity of digital files. Click and drag the cursor to create a signature field on the page.", comment: "")
+            item?.titleName = NSLocalizedString("Digital Sign", comment: "")
+            item?.selectBackgroundType = .imageBox
+            item?.boxImagePosition = .imageAbove
+            item?.promptIdentifier = identifier
+        }
+    }
+    
+}
+
+extension KMToolbarConfigViewController: NSCollectionViewDelegate, NSCollectionViewDataSource, NSCollectionViewDelegateFlowLayout {
+    func numberOfSections(in collectionView: NSCollectionView) -> Int {
+        return 1
+    }
+    
+    func collectionView(_ collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int {
+        return self.model.cellIdentifiers?.count ?? 0
     }
     
+    func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem {
+        let cell = collectionView.makeItem(withIdentifier: self.cellIdentifier_, for: indexPath) as! KMToolbarConfigViewItem
+        let itemId = self.model.cellIdentifiers?[indexPath.item] ?? ""
+        let item = KMToolbarItemView(itemIdentifier: itemId)
+        self._setupMainItem(item)
+        cell.itemView = item
+        
+        return cell
+    }
+    
+    // Layout
+    
+    func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> NSSize {
+        let itemId = self.model.cellIdentifiers?[indexPath.item] ?? ""
+        let item = KMToolbarItemView(itemIdentifier: itemId)
+        self._setupMainItem(item)
+        return NSSize(width: item.itemWidth, height: 48)
+    }
+    
+    func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
+        return 100
+    }
+    
+    func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
+        return 20
+    }
+    
+    func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, insetForSectionAt section: Int) -> NSEdgeInsets {
+        return .init(top: 10, left: 20, bottom: 5, right: 40)
+    }
+    
+    
 }

+ 44 - 5
PDF Office/PDF Master/Class/PDFWindowController/Toolbar/Controller/KMToolbarConfigViewController.xib

@@ -1,19 +1,58 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11134" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+<?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>
-        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11134"/>
+        <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" customClass="KMToolbarConfigViewController" customModuleProvider="target">
+        <customObject id="-2" userLabel="File's Owner" customClass="KMToolbarConfigViewController" customModule="PDF_Reader_Pro" customModuleProvider="target">
             <connections>
+                <outlet property="collectionView" destination="C4M-vA-SRV" id="hm4-3W-khn"/>
                 <outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
             </connections>
         </customObject>
         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
         <customObject id="-3" userLabel="Application" customClass="NSObject"/>
         <customView id="Hz6-mo-xeY">
-            <rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
+            <rect key="frame" x="0.0" y="0.0" width="1400" height="400"/>
             <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <scrollView wantsLayer="YES" autohidesScrollers="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="pVa-qa-L5j">
+                    <rect key="frame" x="0.0" y="320" width="1400" height="60"/>
+                    <clipView key="contentView" id="hQo-vN-bfQ">
+                        <rect key="frame" x="1" y="1" width="1398" height="58"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <collectionView id="C4M-vA-SRV">
+                                <rect key="frame" x="0.0" y="0.0" width="1398" height="158"/>
+                                <autoresizingMask key="autoresizingMask" widthSizable="YES"/>
+                                <collectionViewFlowLayout key="collectionViewLayout" minimumInteritemSpacing="10" minimumLineSpacing="10" id="Ut1-FD-oCR">
+                                    <size key="itemSize" width="50" height="50"/>
+                                </collectionViewFlowLayout>
+                                <color key="primaryBackgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
+                            </collectionView>
+                        </subviews>
+                    </clipView>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="60" id="GDp-1c-eHI"/>
+                    </constraints>
+                    <scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="4yz-zP-zak">
+                        <rect key="frame" x="1" y="144" width="233" height="15"/>
+                        <autoresizingMask key="autoresizingMask"/>
+                    </scroller>
+                    <scroller key="verticalScroller" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="vbr-Re-CHy">
+                        <rect key="frame" x="1383" y="1" width="16" height="58"/>
+                        <autoresizingMask key="autoresizingMask"/>
+                    </scroller>
+                </scrollView>
+            </subviews>
+            <constraints>
+                <constraint firstAttribute="trailing" secondItem="pVa-qa-L5j" secondAttribute="trailing" id="PQD-Wn-jYz"/>
+                <constraint firstItem="pVa-qa-L5j" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="20" id="i2X-DD-H49"/>
+                <constraint firstItem="pVa-qa-L5j" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" id="r1p-CD-TUo"/>
+            </constraints>
+            <point key="canvasLocation" x="44" y="154"/>
         </customView>
     </objects>
 </document>

+ 11 - 5
PDF Office/PDF Master/Class/PDFWindowController/Toolbar/KMToolbarView.swift

@@ -93,6 +93,7 @@ private let KMToolbarItemSpace = 8.0
     private var _rightWidth: CGFloat = 0
     
     var allowsUserCustomization = false
+    private var configWindowC_: KMToolbarConfigWindowController?
     
     deinit {
         Swift.debugPrint("KMToolbarView deinit")
@@ -129,12 +130,17 @@ private let KMToolbarItemSpace = 8.0
     // MARK: - Private Methods
 
     @objc private func _customToolbarItemAction(_ sender: NSMenuItem?) {
-        let pop = NSPopover()
-        let popViewController = KMToolbarConfigViewController()
-        pop.contentViewController = popViewController
-        
-        pop.show(relativeTo: self.bounds, of: self, preferredEdge: .maxY)
+        if self.configWindowC_ == nil {
+            self.configWindowC_ = KMToolbarConfigWindowController()
+        }
         
+        var cellIdentifiers: [String] = self.delegate?.toolbarLeftDefaultItemIdentifiers?(self) ?? []
+        cellIdentifiers += (self.delegate?.toolbarDefaultItemIdentifiers?(self) ?? [])
+        cellIdentifiers += (self.delegate?.toolbarRightDefaultItemIdentifiers?(self) ?? [])
+        self.configWindowC_?.cellIdentifiers = cellIdentifiers
+        self.window?.beginSheet((self.configWindowC_?.window)!, completionHandler: { [weak self] resp in
+            self?.configWindowC_ = nil
+        })
     }
     
     private func _addTrackingArea() {

+ 14 - 0
PDF Office/PDF Master/Class/PDFWindowController/Toolbar/Model/KMToolbarConfigModel.swift

@@ -0,0 +1,14 @@
+//
+//  KMToolbarConfigModel.swift
+//  PDF Reader Pro
+//
+//  Created by tangchao on 2024/5/28.
+//
+
+import Cocoa
+
+class KMToolbarConfigModel: NSObject {
+    
+    var cellIdentifiers: [String]?
+
+}

+ 25 - 0
PDF Office/PDF Master/Class/PDFWindowController/Toolbar/View/KMToolbarConfigViewItem.swift

@@ -0,0 +1,25 @@
+//
+//  KMToolbarConfigViewItem.swift
+//  PDF Reader Pro
+//
+//  Created by tangchao on 2024/5/28.
+//
+
+import Cocoa
+
+class KMToolbarConfigViewItem: NSCollectionViewItem {
+    
+    @IBOutlet weak var contentBox: NSBox!
+    
+    var itemView: KMToolbarItemView? {
+        didSet {
+            self.contentBox.contentView = self.itemView
+        }
+    }
+
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        // Do view setup here.
+    }
+    
+}

+ 38 - 0
PDF Office/PDF Master/Class/PDFWindowController/Toolbar/View/KMToolbarConfigViewItem.xib

@@ -0,0 +1,38 @@
+<?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" customClass="KMToolbarConfigViewItem" customModule="PDF_Reader_Pro" customModuleProvider="target">
+            <connections>
+                <outlet property="contentBox" destination="qd7-dJ-S7n" id="gRx-AA-Jc9"/>
+                <outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customView id="Hz6-mo-xeY">
+            <rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="qd7-dJ-S7n">
+                    <rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
+                    <view key="contentView" id="sXo-ib-JEz">
+                        <rect key="frame" x="1" y="1" width="478" height="270"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                    </view>
+                </box>
+            </subviews>
+            <constraints>
+                <constraint firstAttribute="bottom" secondItem="qd7-dJ-S7n" secondAttribute="bottom" id="D8f-hD-Yt5"/>
+                <constraint firstItem="qd7-dJ-S7n" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" id="Lsf-oV-NLj"/>
+                <constraint firstItem="qd7-dJ-S7n" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" id="UsH-t5-ARh"/>
+                <constraint firstAttribute="trailing" secondItem="qd7-dJ-S7n" secondAttribute="trailing" id="aor-09-Hd9"/>
+            </constraints>
+            <point key="canvasLocation" x="139" y="154"/>
+        </customView>
+    </objects>
+</document>

+ 38 - 0
PDF Office/PDF Master/Class/PDFWindowController/Toolbar/Window/KMToolbarConfigWindowController.swift

@@ -0,0 +1,38 @@
+//
+//  KMToolbarConfigWindowController.swift
+//  PDF Reader Pro
+//
+//  Created by tangchao on 2024/5/28.
+//
+
+import Cocoa
+
+class KMToolbarConfigWindowController: NSWindowController {
+    deinit {
+        KMPrint("KMToolbarConfigWindowController deinit.")
+    }
+    
+    var cellIdentifiers: [String]? {
+        didSet {
+            self.viewC_.model.cellIdentifiers = self.cellIdentifiers
+        }
+    }
+    
+    private let viewC_ = KMToolbarConfigViewController()
+    
+    override var windowNibName: NSNib.Name? {
+        return "KMToolbarConfigWindowController"
+    }
+    
+    override func windowDidLoad() {
+        super.windowDidLoad()
+        
+        self.window?.styleMask.insert(.fullSizeContentView)
+        self.window?.contentViewController = self.viewC_
+    }
+    
+    override func mouseDown(with event: NSEvent) {
+        self.window?.sheetParent?.endSheet(self.window!, returnCode: .cancel)
+    }
+    
+}

+ 28 - 0
PDF Office/PDF Master/Class/PDFWindowController/Toolbar/Window/KMToolbarConfigWindowController.xib

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11163" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11163"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMToolbarConfigWindowController" customModuleProvider="target">
+            <connections>
+                <outlet property="window" destination="F0z-JX-Cv5" id="gIp-Ho-8D9"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="F0z-JX-Cv5">
+            <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
+            <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
+            <rect key="contentRect" x="196" y="240" width="480" height="270"/>
+            <rect key="screenRect" x="0.0" y="0.0" width="1440" height="877"/>
+            <view key="contentView" id="se5-gp-TjO">
+                <rect key="frame" x="0.0" y="0.0" width="480" height="270"/>
+                <autoresizingMask key="autoresizingMask"/>
+            </view>
+            <connections>
+                <outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
+            </connections>
+        </window>
+    </objects>
+</document>

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

@@ -2686,6 +2686,21 @@
 		BB0542152965705D00F2665C /* KMCropTipView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0542142965705D00F2665C /* KMCropTipView.swift */; };
 		BB0542162965705D00F2665C /* KMCropTipView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0542142965705D00F2665C /* KMCropTipView.swift */; };
 		BB0542172965705D00F2665C /* KMCropTipView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0542142965705D00F2665C /* KMCropTipView.swift */; };
+		BB072D562C057BD600779B45 /* KMToolbarConfigWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB072D542C057BD600779B45 /* KMToolbarConfigWindowController.swift */; };
+		BB072D572C057BD600779B45 /* KMToolbarConfigWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB072D542C057BD600779B45 /* KMToolbarConfigWindowController.swift */; };
+		BB072D582C057BD600779B45 /* KMToolbarConfigWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB072D542C057BD600779B45 /* KMToolbarConfigWindowController.swift */; };
+		BB072D592C057BD600779B45 /* KMToolbarConfigWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB072D552C057BD600779B45 /* KMToolbarConfigWindowController.xib */; };
+		BB072D5A2C057BD600779B45 /* KMToolbarConfigWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB072D552C057BD600779B45 /* KMToolbarConfigWindowController.xib */; };
+		BB072D5B2C057BD600779B45 /* KMToolbarConfigWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB072D552C057BD600779B45 /* KMToolbarConfigWindowController.xib */; };
+		BB072D5E2C05AC8F00779B45 /* KMToolbarConfigViewItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB072D5C2C05AC8F00779B45 /* KMToolbarConfigViewItem.swift */; };
+		BB072D5F2C05AC8F00779B45 /* KMToolbarConfigViewItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB072D5C2C05AC8F00779B45 /* KMToolbarConfigViewItem.swift */; };
+		BB072D602C05AC8F00779B45 /* KMToolbarConfigViewItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB072D5C2C05AC8F00779B45 /* KMToolbarConfigViewItem.swift */; };
+		BB072D612C05AC8F00779B45 /* KMToolbarConfigViewItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB072D5D2C05AC8F00779B45 /* KMToolbarConfigViewItem.xib */; };
+		BB072D622C05AC8F00779B45 /* KMToolbarConfigViewItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB072D5D2C05AC8F00779B45 /* KMToolbarConfigViewItem.xib */; };
+		BB072D632C05AC8F00779B45 /* KMToolbarConfigViewItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB072D5D2C05AC8F00779B45 /* KMToolbarConfigViewItem.xib */; };
+		BB072D662C05B44300779B45 /* KMToolbarConfigModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB072D652C05B44300779B45 /* KMToolbarConfigModel.swift */; };
+		BB072D672C05B44300779B45 /* KMToolbarConfigModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB072D652C05B44300779B45 /* KMToolbarConfigModel.swift */; };
+		BB072D682C05B44300779B45 /* KMToolbarConfigModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB072D652C05B44300779B45 /* KMToolbarConfigModel.swift */; };
 		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 */; };
@@ -6310,6 +6325,11 @@
 		BB04FD0B2B206F3600D80F7B /* KMPlanViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPlanViewController.swift; sourceTree = "<group>"; };
 		BB04FD0F2B206F4000D80F7B /* KMPlanViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMPlanViewController.xib; sourceTree = "<group>"; };
 		BB0542142965705D00F2665C /* KMCropTipView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMCropTipView.swift; sourceTree = "<group>"; };
+		BB072D542C057BD600779B45 /* KMToolbarConfigWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMToolbarConfigWindowController.swift; sourceTree = "<group>"; };
+		BB072D552C057BD600779B45 /* KMToolbarConfigWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMToolbarConfigWindowController.xib; sourceTree = "<group>"; };
+		BB072D5C2C05AC8F00779B45 /* KMToolbarConfigViewItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMToolbarConfigViewItem.swift; sourceTree = "<group>"; };
+		BB072D5D2C05AC8F00779B45 /* KMToolbarConfigViewItem.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMToolbarConfigViewItem.xib; sourceTree = "<group>"; };
+		BB072D652C05B44300779B45 /* KMToolbarConfigModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMToolbarConfigModel.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>"; };
@@ -7591,6 +7611,8 @@
 		89752D982936E4DE003FF08E /* Toolbar */ = {
 			isa = PBXGroup;
 			children = (
+				BB072D642C05B41600779B45 /* Model */,
+				BB072D532C057B7F00779B45 /* Window */,
 				BB948CFB2BFF6393000FBA01 /* Controller */,
 				BBA00AC22B157BE90043D903 /* View */,
 				89752DF52938A236003FF08E /* PublicKey.swift */,
@@ -10774,6 +10796,23 @@
 			path = CPDFDocumentExtensions;
 			sourceTree = "<group>";
 		};
+		BB072D532C057B7F00779B45 /* Window */ = {
+			isa = PBXGroup;
+			children = (
+				BB072D542C057BD600779B45 /* KMToolbarConfigWindowController.swift */,
+				BB072D552C057BD600779B45 /* KMToolbarConfigWindowController.xib */,
+			);
+			path = Window;
+			sourceTree = "<group>";
+		};
+		BB072D642C05B41600779B45 /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				BB072D652C05B44300779B45 /* KMToolbarConfigModel.swift */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
 		BB0A551B2A3078EB00B6E84B /* Designs */ = {
 			isa = PBXGroup;
 			children = (
@@ -12687,6 +12726,8 @@
 				BBA00AC32B157C880043D903 /* KMToolbarZoomItemView.swift */,
 				BBD3C8B52B2C438F00EB0867 /* KMToolbarPreviousNextItemView.swift */,
 				BBDE52BA2BF3676C000545B2 /* KMPresentTableViewCell.swift */,
+				BB072D5C2C05AC8F00779B45 /* KMToolbarConfigViewItem.swift */,
+				BB072D5D2C05AC8F00779B45 /* KMToolbarConfigViewItem.xib */,
 			);
 			path = View;
 			sourceTree = "<group>";
@@ -14110,6 +14151,7 @@
 				ADBC375829CAE95700D93208 /* KMComparativeOutlineSectionCell.xib in Resources */,
 				BB234F042BA3D798008B3754 /* KMAIIconGuideView.xib in Resources */,
 				ADDF83982B391A5D00A81A4E /* PDFCertExportAccessoryView.xib in Resources */,
+				BB072D592C057BD600779B45 /* KMToolbarConfigWindowController.xib in Resources */,
 				AD867FBB29DFBB3B00F00440 /* KMAnnotationOutlineSectionView.xib in Resources */,
 				AD0FA50629A8E61B00EDEB50 /* KMLightMemberAlertView.xib in Resources */,
 				ADCFFC0629C04617007D3657 /* BOTA.xcassets in Resources */,
@@ -14225,6 +14267,7 @@
 				BB99ACC5292DE22E0048AFD9 /* KMMergeViewController.xib in Resources */,
 				BB6347B82AF224E200F5438E /* KMConvertCollectionViewHeader.xib in Resources */,
 				8942F7F32926087200389627 /* KMSearchViewController.xib in Resources */,
+				BB072D612C05AC8F00779B45 /* KMToolbarConfigViewItem.xib in Resources */,
 				ADF9ED3329A850D200C4A943 /* KMAccountInfoView.xib in Resources */,
 				ADAAC1672BD645DB001F2DA6 /* KMRecommondPopWindow.xib in Resources */,
 				BB46CF482AFB7E5C00281EDF /* InitialUserDefaults.plist in Resources */,
@@ -14640,6 +14683,7 @@
 				ADE3C1E829A5ABC200793B13 /* KMLoginWindowController.xib in Resources */,
 				BB49ED02293F459500C82CA2 /* KMConvertPPTsWindowController.xib in Resources */,
 				AD3AAD312B0B700500DE5FE7 /* KMCompareCoveringView.xib in Resources */,
+				BB072D622C05AC8F00779B45 /* KMToolbarConfigViewItem.xib in Resources */,
 				AD2BF2322B5620110029F03F /* SF-Pro-Text-Regular.otf in Resources */,
 				BB8F455B295AA1270037EA22 /* KMHeaderFooterPropertyInfoController.xib in Resources */,
 				BB7F7BFB29AA469F00A3E4E7 /* KMSigntureViewItem.xib in Resources */,
@@ -14806,6 +14850,7 @@
 				ADD1B6AF2941E97F00C3FFF7 /* KMPrintWindowController.xib in Resources */,
 				9FA607E228FD4C9F00B46586 /* KMHomePopViewController.xib in Resources */,
 				AD7D5C992B8F20FE006562CD /* synctex_parser_readme.txt in Resources */,
+				BB072D5A2C057BD600779B45 /* KMToolbarConfigWindowController.xib in Resources */,
 				ADD1B6DC2946BE1700C3FFF7 /* KMPrintChoosePageSizeView.xib in Resources */,
 				BBD922412B50D6D600DB9585 /* rate_pic_free.pdf in Resources */,
 				BBA19F3329ADAC81001A285A /* signPicture_hover.pdf in Resources */,
@@ -15173,6 +15218,7 @@
 				89E4E7312963FBA2002DBA6F /* KMPropertiesViewPopController.xib in Resources */,
 				BB3AAB9529878CE000992A5A /* KMWatermarkAdjectivePropertyMainController.xib in Resources */,
 				ADDF839A2B391A5D00A81A4E /* PDFCertExportAccessoryView.xib in Resources */,
+				BB072D5B2C057BD600779B45 /* KMToolbarConfigWindowController.xib in Resources */,
 				ADD1B6B02941E97F00C3FFF7 /* KMPrintWindowController.xib in Resources */,
 				ADE86ABC2B0343F100414DFA /* KMWatermarkView.xib in Resources */,
 				AD3AAD612B0DA3D400DE5FE7 /* KMCompareTextViewItem.xib in Resources */,
@@ -15288,6 +15334,7 @@
 				BB9007232B8DE85B00623B78 /* GeneralPreferences.xib in Resources */,
 				AD1D48152AFB1912007AC1F0 /* KMCompressView.xib in Resources */,
 				BBD8EE922B8EC86900EB05FE /* AutoSavePopController.xib in Resources */,
+				BB072D632C05AC8F00779B45 /* KMToolbarConfigViewItem.xib in Resources */,
 				AD88109C29A78AEC00178CA1 /* KMVerificationCodeView.xib in Resources */,
 				89E4E7872967BF5A002DBA6F /* KMCustomizeStampViewController.xib in Resources */,
 				BBBE20912B2164CD00509C4E /* KMPDFEditWindowController.xib in Resources */,
@@ -15785,9 +15832,11 @@
 				ADF9ED2F29A8507400C4A943 /* KMAccountInfoView.swift in Sources */,
 				9FDD0FAE29534FDC000C4DAD /* KMCompLight.swift in Sources */,
 				AD055EC42B8846EB0035F824 /* SKOutlineView.m in Sources */,
+				BB072D5E2C05AC8F00779B45 /* KMToolbarConfigViewItem.swift in Sources */,
 				AD7D5CA52B8F35D1006562CD /* SKPDFSyncRecord.m in Sources */,
 				9F1F82F229373D6E0092C4B4 /* String+KMExtensions.swift in Sources */,
 				BB897236294B38DC0045787C /* KMWatermarkAdjectivePropertyBaseController.swift in Sources */,
+				BB072D562C057BD600779B45 /* KMToolbarConfigWindowController.swift in Sources */,
 				AD85D19E2AEF927D000F4D28 /* KMQucikToolsModel.swift in Sources */,
 				BB10FAF62AFE2C2900F18D65 /* KMNumberArrayFormatter.swift in Sources */,
 				ADFCEB362B4F78220001EBAF /* KMFile.swift in Sources */,
@@ -16424,6 +16473,7 @@
 				899700E828F3E4D3009AF911 /* MainWindowController.swift in Sources */,
 				BB6DD81C29348F31001F0544 /* KMSecureTextFiled.swift in Sources */,
 				BB8F4572295ACE380037EA22 /* KMHeaderFooterAdjectiveListCell.swift in Sources */,
+				BB072D662C05B44300779B45 /* KMToolbarConfigModel.swift in Sources */,
 				BB0FE04C2B734DD1001E0F88 /* AIPurchaseWindowController.swift in Sources */,
 				9FCFEC8C2AD10A4400EAD2CB /* KMTextFieldSheetController.swift in Sources */,
 				BB00300F298CA383002DD1A0 /* KMPreferenceSegementControl.swift in Sources */,
@@ -16833,6 +16883,7 @@
 				AD055E5D2B85C9A70035F824 /* KMSeparatorCell.swift in Sources */,
 				ADE86A9E2B031FDB00414DFA /* KMCompareWindowController.swift in Sources */,
 				BB99ACC3292DE22E0048AFD9 /* KMMergeViewController.swift in Sources */,
+				BB072D572C057BD600779B45 /* KMToolbarConfigWindowController.swift in Sources */,
 				9F5752EA2B58FF73005DC303 /* KMAnnotationFromViewController.swift in Sources */,
 				9F8810962B56877C00F69815 /* KMAnnotationChoiceWidgetOptionsViewController.swift in Sources */,
 				9F78EFC728F7E965001E66F4 /* KMHomeViewController+UI.swift in Sources */,
@@ -17204,6 +17255,7 @@
 				BB4EEF3D29764578003A3537 /* KMRedactPropertyContentView.swift in Sources */,
 				BB48F8722BE07DAA002DA996 /* KMMainModel.swift in Sources */,
 				BBFEF7242B3A78BC00C28AC0 /* KMSystemGotoMenu.swift in Sources */,
+				BB072D672C05B44300779B45 /* KMToolbarConfigModel.swift in Sources */,
 				BB147024299DC0D100784A6A /* OIDResponseTypes.m in Sources */,
 				BB162E93294FFE020088E9D1 /* KMWatermarkModel.swift in Sources */,
 				BB03D6992B0221FF008C9976 /* NSImage+KMExtension.swift in Sources */,
@@ -17282,6 +17334,7 @@
 				AD5999432AD8DC2000412F8B /* KMDynamicStampViewController.swift in Sources */,
 				BBD1F794296FE92500343885 /* KMPageEditSplitSettingView.swift in Sources */,
 				899700FF28F40710009AF911 /* KMBookMarkViewController.swift in Sources */,
+				BB072D5F2C05AC8F00779B45 /* KMToolbarConfigViewItem.swift in Sources */,
 				9F3D818F29A22AD90087B5AD /* Date+KMExtensions.swift in Sources */,
 				89E4E756296427E5002DBA6F /* NSImage_SKExtensions.m in Sources */,
 				AD1D481A2AFB6B96007AC1F0 /* KMMergeWindowController.swift in Sources */,
@@ -18181,9 +18234,11 @@
 				BB6DD823293497B6001F0544 /* KMSecureEncryptModel.swift in Sources */,
 				ADE86AF02B0AF56200414DFA /* KMCompareCoveringSettingView.swift in Sources */,
 				BB35732F2AF50068004CDA92 /* KMBatchOperateConvertViewController.swift in Sources */,
+				BB072D602C05AC8F00779B45 /* KMToolbarConfigViewItem.swift in Sources */,
 				89D2D2E0294C451400BFF5FE /* KMThumbnailViewController.swift in Sources */,
 				BB0FE0622B7351AA001E0F88 /* AIInfoManager.m in Sources */,
 				ADDEEA642AD3A6E700EF675D /* KMPDFSignatureTextView.swift in Sources */,
+				BB072D582C057BD600779B45 /* KMToolbarConfigWindowController.swift in Sources */,
 				9FAAA334290BD0A20046FFCE /* KMHistoryFileCollectionViewItem.swift in Sources */,
 				89752DF82938A236003FF08E /* PublicKey.swift in Sources */,
 				BB67EE282B54FFEF00573BF0 /* ASINetworkQueue.m in Sources */,
@@ -18820,6 +18875,7 @@
 				89E4E7372964148E002DBA6F /* KMAnnotationPropertiesViewController.m in Sources */,
 				BB276A542B03776200AB5578 /* KMConvertOperationQueue.swift in Sources */,
 				AD055E8A2B882E7F0035F824 /* SKBookmark.m in Sources */,
+				BB072D682C05B44300779B45 /* KMToolbarConfigModel.swift in Sources */,
 				ADDF83462B391A5C00A81A4E /* DSignatureManager.swift in Sources */,
 				BB1BFF7B2AEA0B8E003EB179 /* KMBatchOperateRightViewController.swift in Sources */,
 				F37322F8292DF9410013862C /* CSelfSignAnnotation.m in Sources */,