Sfoglia il codice sorgente

【书签】添加书签UI

lizhe 1 anno fa
parent
commit
0a379c56a0

+ 6 - 6
PDF Office/PDF Master/Class/Document/KMMainDocument.swift

@@ -17,6 +17,7 @@ typealias KMMainDocumentCloudUploadHanddler = (@escaping(Bool, String)->()) -> (
     var mainViewController: KMMainViewController?
     var mainViewController: KMMainViewController?
     var homeWindowController: KMHomeWindowController?
     var homeWindowController: KMHomeWindowController?
     var homeViewController: KMHomeViewController?
     var homeViewController: KMHomeViewController?
+    var bookmarkSheetController: KMBookmarkSheetController?
     var isNewCreated: Bool = false
     var isNewCreated: Bool = false
     var closedByUserGestureFlag: Bool = false   // 标记 closedByUserGesture 这个状态需要延后存储(如果需要)
     var closedByUserGestureFlag: Bool = false   // 标记 closedByUserGesture 这个状态需要延后存储(如果需要)
     var cloud: Bool = false
     var cloud: Bool = false
@@ -650,10 +651,9 @@ typealias KMMainDocumentCloudUploadHanddler = (@escaping(Bool, String)->()) -> (
             return
             return
         }
         }
         
         
-        var bookmarkSheetController: KMBookmarkSheetController?
-        if item.tag == 2 {
+        if item.tag == 3 {
             KMPrint("Edit Bookmark")
             KMPrint("Edit Bookmark")
-        } else if item.tag == 1 {
+        } else if item.tag == 2 {
             KMPrint("session Bookmark")
             KMPrint("session Bookmark")
             bookmarkSheetController = KMBookmarkSheetController.showBookmarkSheetController(type: .session)
             bookmarkSheetController = KMBookmarkSheetController.showBookmarkSheetController(type: .session)
         } else if item.tag == 0 {
         } else if item.tag == 0 {
@@ -674,8 +674,8 @@ typealias KMMainDocumentCloudUploadHanddler = (@escaping(Bool, String)->()) -> (
                 let mainViewController = mainViewController
                 let mainViewController = mainViewController
                 
                 
                 if let page = mainViewController?.listView.currentPage() {
                 if let page = mainViewController?.listView.currentPage() {
-                    let pageIndex = page.pageIndex
-                    bookmark = KMBookmark.bookmark(url: self.fileURL!, pageIndex: pageIndex(), label: label)
+                    let index: UInt = page.pageIndex()
+                    bookmark = KMBookmark.bookmark(url: self.fileURL!, pageIndex: index, label: label)
                 }
                 }
 //            case .setup:
 //            case .setup:
 //                if let setup = currentDocumentSetup {
 //                if let setup = currentDocumentSetup {
@@ -683,7 +683,7 @@ typealias KMMainDocumentCloudUploadHanddler = (@escaping(Bool, String)->()) -> (
 //                }
 //                }
             case .session:
             case .session:
                 let setups = NSApp.orderedDocuments.compactMap { $0.value(forKey:"currentDocumentSetup") }
                 let setups = NSApp.orderedDocuments.compactMap { $0.value(forKey:"currentDocumentSetup") }
-                bookmark = KMBookmark.bookmarkSession(setups: setups as NSArray, label: label)
+                bookmark = KMSessionBookmark.bookmarkSession(setups: setups as NSArray, label: label)
             default:
             default:
                 break
                 break
             }
             }

+ 13 - 24
PDF Office/PDF Master/Class/PDFTools/KMBookmark/Controller/KMBookmarkSheetController.swift

@@ -12,8 +12,7 @@ typealias KMBookmarkSheetControllerDoneAction = (_ controller: KMBookmarkSheetCo
 typealias KMBookmarkSheetControllerCancelAction = (_ controller: KMBookmarkSheetController, _ type: KMBookmarkType) -> ()
 typealias KMBookmarkSheetControllerCancelAction = (_ controller: KMBookmarkSheetController, _ type: KMBookmarkType) -> ()
 
 
 class KMBookmarkSheetController: NSWindowController {
 class KMBookmarkSheetController: NSWindowController {
-    @IBOutlet weak var folderPopUp: NSPopUpButton!
-    @IBOutlet weak var bookmarkTextField: NSTextField!
+    @IBOutlet weak var bookmarkSheetView: KMBookmarkSheetView!
     
     
     var doneAction: KMBookmarkSheetControllerDoneAction?
     var doneAction: KMBookmarkSheetControllerDoneAction?
     var cancelAction: KMBookmarkSheetControllerCancelAction?
     var cancelAction: KMBookmarkSheetControllerCancelAction?
@@ -22,22 +21,22 @@ class KMBookmarkSheetController: NSWindowController {
 
 
     static func showBookmarkSheetController(type: KMBookmarkType) -> KMBookmarkSheetController {
     static func showBookmarkSheetController(type: KMBookmarkType) -> KMBookmarkSheetController {
         let controller = KMBookmarkSheetController.init(windowNibName: "KMBookmarkSheetController")
         let controller = KMBookmarkSheetController.init(windowNibName: "KMBookmarkSheetController")
+        
         controller.type = type
         controller.type = type
         NSWindow.currentWindow().beginSheet(controller.window!)
         NSWindow.currentWindow().beginSheet(controller.window!)
         
         
         return controller
         return controller
     }
     }
-
-    func addMenuItems(forBookmarks bookmarks: [KMBookmark], level: Int, toMenu menu: NSMenu) {
-        for bm in bookmarks {
-            if bm.bookmarkType == .folder {
-                let label = bm.label
-                let item = menu.addItem(withTitle: label, action: nil, keyEquivalent: "")
-                item.setImageAndSize(bm.icon)
-                item.indentationLevel = level
-                item.representedObject = bm
-                addMenuItems(forBookmarks: bm.children, level: level + 1, toMenu: menu)
-            }
+    
+    override func windowDidLoad() {
+        self.bookmarkSheetView.type = type
+        self.bookmarkSheetView.cancelAction = { [unowned self] view, type in
+            self.cancelAction?(self, type)
+            self.window?.close()
+        }
+        
+        self.bookmarkSheetView.doneAction = { [unowned self] view, type, label in
+            self.doneAction?(self, type, label)
         }
         }
     }
     }
     
     
@@ -62,16 +61,6 @@ class KMBookmarkSheetController: NSWindowController {
     // MARK: Accessors
     // MARK: Accessors
     
     
     var selectedFolder: KMBookmark? {
     var selectedFolder: KMBookmark? {
-        return folderPopUp.selectedItem?.representedObject as? KMBookmark
+        return bookmarkSheetView.folderPopUp.selectedItem?.representedObject as? KMBookmark
     }
     }
-    
-    @IBAction func cancelButtonAction(_ sender: Any) {
-        self.cancelAction?(self, type)
-        self.window?.close()
-    }
-    
-    @IBAction func doneButtonAction(_ sender: Any) {
-        self.doneAction?(self, type, bookmarkTextField.stringValue)
-    }
-    
 }
 }

+ 7 - 85
PDF Office/PDF Master/Class/PDFTools/KMBookmark/Controller/KMBookmarkSheetController.xib

@@ -8,8 +8,7 @@
     <objects>
     <objects>
         <customObject id="-2" userLabel="File's Owner" customClass="KMBookmarkSheetController" customModule="PDF_Reader_Pro" customModuleProvider="target">
         <customObject id="-2" userLabel="File's Owner" customClass="KMBookmarkSheetController" customModule="PDF_Reader_Pro" customModuleProvider="target">
             <connections>
             <connections>
-                <outlet property="bookmarkTextField" destination="p8e-MI-ByW" id="1fq-NO-s3r"/>
-                <outlet property="folderPopUp" destination="plc-mT-b5y" id="n7t-l2-yr6"/>
+                <outlet property="bookmarkSheetView" destination="s8b-7w-41D" id="rq4-xI-QGO"/>
                 <outlet property="window" destination="F0z-JX-Cv5" id="gIp-Ho-8D9"/>
                 <outlet property="window" destination="F0z-JX-Cv5" id="gIp-Ho-8D9"/>
             </connections>
             </connections>
         </customObject>
         </customObject>
@@ -24,92 +23,15 @@
                 <rect key="frame" x="0.0" y="0.0" width="350" height="122"/>
                 <rect key="frame" x="0.0" y="0.0" width="350" height="122"/>
                 <autoresizingMask key="autoresizingMask"/>
                 <autoresizingMask key="autoresizingMask"/>
                 <subviews>
                 <subviews>
-                    <view translatesAutoresizingMaskIntoConstraints="NO" id="rTZ-Vg-N1g">
+                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="s8b-7w-41D" customClass="KMBookmarkSheetView" customModule="PDF_Reader_Pro" customModuleProvider="target">
                         <rect key="frame" x="0.0" y="0.0" width="350" height="122"/>
                         <rect key="frame" x="0.0" y="0.0" width="350" height="122"/>
-                        <subviews>
-                            <textField focusRingType="none" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="s1L-CE-Y2L">
-                                <rect key="frame" x="17" y="84" width="72" height="17"/>
-                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
-                                <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Bookmark:" id="YqR-LW-fxz">
-                                    <font key="font" metaFont="system"/>
-                                    <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
-                                    <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
-                                </textFieldCell>
-                            </textField>
-                            <button tag="1" imageHugsTitle="YES" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="3eE-dU-7Kz">
-                                <rect key="frame" x="254" y="12" width="82" height="32"/>
-                                <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
-                                <buttonCell key="cell" type="push" title="OK" bezelStyle="rounded" alignment="center" borderStyle="border" tag="1" inset="2" id="e3e-c6-KCC">
-                                    <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
-                                    <font key="font" metaFont="system"/>
-                                    <string key="keyEquivalent" base64-UTF8="YES">
-DQ
-</string>
-                                </buttonCell>
-                                <connections>
-                                    <accessibilityConnection property="link" destination="zqw-vB-SGL" id="Hgc-3q-yde"/>
-                                    <action selector="doneButtonAction:" target="-2" id="yEz-I2-vKT"/>
-                                </connections>
-                            </button>
-                            <button imageHugsTitle="YES" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="zqw-vB-SGL">
-                                <rect key="frame" x="172" y="12" width="82" height="32"/>
-                                <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
-                                <buttonCell key="cell" type="push" title="Cancel" bezelStyle="rounded" alignment="center" borderStyle="border" inset="2" id="OXC-ec-E6o">
-                                    <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
-                                    <font key="font" metaFont="system"/>
-                                    <string key="keyEquivalent" base64-UTF8="YES">
-Gw
-</string>
-                                </buttonCell>
-                                <connections>
-                                    <action selector="cancelButtonAction:" target="-2" id="a9d-Ar-EB5"/>
-                                </connections>
-                            </button>
-                            <textField focusRingType="none" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="p8e-MI-ByW">
-                                <rect key="frame" x="94" y="82" width="236" height="22"/>
-                                <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
-                                <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="sgQ-rS-y3Y">
-                                    <font key="font" metaFont="system"/>
-                                    <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
-                                    <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
-                                </textFieldCell>
-                                <connections>
-                                    <accessibilityConnection property="title" destination="s1L-CE-Y2L" id="D6l-IC-4WG"/>
-                                </connections>
-                            </textField>
-                            <popUpButton imageHugsTitle="YES" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="plc-mT-b5y">
-                                <rect key="frame" x="91" y="50" width="242" height="26"/>
-                                <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
-                                <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" selectedItem="Ez5-vL-MEw" id="gFv-pL-Na1">
-                                    <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
-                                    <font key="font" metaFont="menu"/>
-                                    <menu key="menu" id="QCH-VJ-LAu">
-                                        <items>
-                                            <menuItem state="on" id="Ez5-vL-MEw"/>
-                                        </items>
-                                    </menu>
-                                </popUpButtonCell>
-                                <connections>
-                                    <accessibilityConnection property="title" destination="P1I-FS-CN8" id="M9d-Do-Pz9"/>
-                                </connections>
-                            </popUpButton>
-                            <textField focusRingType="none" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="P1I-FS-CN8">
-                                <rect key="frame" x="17" y="56" width="72" height="17"/>
-                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
-                                <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Add to:" id="zVX-Pd-Udl">
-                                    <font key="font" metaFont="system"/>
-                                    <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
-                                    <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
-                                </textFieldCell>
-                            </textField>
-                        </subviews>
-                    </view>
+                    </customView>
                 </subviews>
                 </subviews>
                 <constraints>
                 <constraints>
-                    <constraint firstItem="rTZ-Vg-N1g" firstAttribute="top" secondItem="se5-gp-TjO" secondAttribute="top" id="CbT-17-jAy"/>
-                    <constraint firstItem="rTZ-Vg-N1g" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" id="RSb-z8-wLI"/>
-                    <constraint firstAttribute="trailing" secondItem="rTZ-Vg-N1g" secondAttribute="trailing" id="cP2-Rq-AiR"/>
-                    <constraint firstAttribute="bottom" secondItem="rTZ-Vg-N1g" secondAttribute="bottom" id="ckS-9L-4qA"/>
+                    <constraint firstItem="s8b-7w-41D" firstAttribute="top" secondItem="se5-gp-TjO" secondAttribute="top" id="PpM-1p-0qs"/>
+                    <constraint firstAttribute="trailing" secondItem="s8b-7w-41D" secondAttribute="trailing" id="gUj-IJ-UZg"/>
+                    <constraint firstItem="s8b-7w-41D" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" id="ghW-Rf-Lqs"/>
+                    <constraint firstAttribute="bottom" secondItem="s8b-7w-41D" secondAttribute="bottom" id="rGK-qU-jRk"/>
                 </constraints>
                 </constraints>
             </view>
             </view>
             <connections>
             <connections>

+ 40 - 0
PDF Office/PDF Master/Class/PDFTools/KMBookmark/Manager/KMBookmarkManager.swift

@@ -0,0 +1,40 @@
+//
+//  KMBookmarkManager.swift
+//  PDF Reader Pro
+//
+//  Created by lizhe on 2024/2/7.
+//
+
+import Cocoa
+
+let bookmarksIdentifier = Bundle.main.bundleIdentifier?.stringByAppendingPathComponent(".bookmarks")
+
+class KMBookmarkManager: NSObject {
+    static let manager = KMBookmarkManager()
+    
+    var recentDocuments: [NSDictionary] = []
+    var rootBookmark: KMBookmark = KMBookmark()
+    
+    
+    func reloadData() {
+        var bookmarkDictionary: NSDictionary = UserDefaults.standard.persistentDomain(forName: bookmarksIdentifier!)! as NSDictionary
+        var documents: NSArray = bookmarkDictionary.object(forKey: "recentDocuments") as! NSArray
+        for info in documents {
+            recentDocuments.append(info as! NSDictionary)
+        }
+        
+        rootBookmark = KMBookmark.bookmark(properties: bookmarkDictionary["bookmarks"] as! NSDictionary)
+    }
+    
+    func saveData() {
+        let bookmarksDictionary: [String: Any] = [
+            "bookmarks": (self.rootBookmark.children as NSArray).value(forKey: "properties") as Any,
+            "recentDocuments": recentDocuments as Any
+        ]
+
+//        UserDefaults.standard.setPersistentDomain(bookmarksDictionary, forName: SKBookmarksIdentifier)
+//
+//        NSDictionary *bookmarksDictionary = [NSDictionary dictionaryWithObjectsAndKeys:[[bookmarkRoot children] valueForKey:@"properties"], BOOKMARKS_KEY, recentDocuments, RECENTDOCUMENTS_KEY, nil];
+//        [[NSUserDefaults standardUserDefaults] setPersistentDomain:bookmarksDictionary forName:SKBookmarksIdentifier];
+    }
+}

+ 118 - 17
PDF Office/PDF Master/Class/PDFTools/KMBookmark/Model/KMBookmark.swift

@@ -23,34 +23,135 @@ class KMBookmark: NSObject {
     var fileURL: URL?
     var fileURL: URL?
     var pageIndex: UInt = 0
     var pageIndex: UInt = 0
     var pageNumber: NSNumber = 0
     var pageNumber: NSNumber = 0
-    var parent: KMBookmark = KMBookmark()
     
     
-    var children: [KMBookmark] = []
+    var documentSetup: [String: String] = [:]//文档
+    var parent: KMBookmark?
+    var children: [KMBookmark] = [] //子
     
     
-    func initSessionWithSetups() {
-        var childs: [KMBookmark] = []
-//        for setup in setups {
-//            let child = KMBookmark.init
-//        }
-//        for (NSDictionary *setup in aSetupDicts) {
-//            if ((child = [[KMBookmark alloc] initWithSetup:setup label:""])) {
-//                [aChildren addObject:child];
+    static func bookmark(url: URL, pageIndex: UInt, label: String) -> KMBookmark {
+        var bookmark = KMBookmark()
+        bookmark.fileURL = url
+        bookmark.pageIndex = pageIndex
+        bookmark.label = label
+        return bookmark
+    }
+    
+    func initWithProperties(properties: NSDictionary) -> KMBookmark {
+        
+        return KMBookmark()
+    }
+    
+    static func bookmark(properties: NSDictionary) -> KMBookmark {
+        return KMBookmark()
+    }
+    
+//        - (id)initWithProperties:(NSDictionary *)dictionary {
+//            NSString *type = [dictionary objectForKey:TYPE_KEY];
+//            if ([type isEqualToString:SEPARATOR_STRING]) {
+//                return (id)[[SKSeparatorBookmark alloc] init];
+//            } else if ([type isEqualToString:FOLDER_STRING] || [type isEqualToString:SESSION_STRING]) {
+//                Class bookmarkClass = [type isEqualToString:FOLDER_STRING] ? [SKFolderBookmark class] : [SKSessionBookmark class];
+//                NSMutableArray *newChildren = [NSMutableArray array];
+//                SKBookmark *child;
+//                for (NSDictionary *dict in [dictionary objectForKey:CHILDREN_KEY]) {
+//                    if ((child = [[SKBookmark alloc] initWithProperties:dict])) {
+//                        [newChildren addObject:child];
+//                        [child release];
+//                    } else
+//                        NSLog(@"Failed to read child bookmark: %@", dict);
+//                }
+//                return (id)[[bookmarkClass alloc] initFolderWithChildren:newChildren label:[dictionary objectForKey:LABEL_KEY]];
+//            } else if ([dictionary objectForKey:@"windowFrame"]) {
+//                return (id)[[SKFileBookmark alloc] initWithSetup:dictionary label:[dictionary objectForKey:LABEL_KEY]];
+//            } else {
+//                NSNumber *pageIndex = [dictionary objectForKey:PAGEINDEX_KEY];
+//                return (id)[[SKFileBookmark alloc] initWithAliasData:[dictionary objectForKey:ALIASDATA_KEY] pageIndex:(pageIndex ? [pageIndex unsignedIntegerValue] : NSNotFound) label:[dictionary objectForKey:LABEL_KEY]];
 //            }
 //            }
 //        }
 //        }
+}
+
+//MARK: Folder
+class KMFolderBookmark: KMBookmark {
+    override var bookmarkType: KMBookmarkType {
+        get {
+            return .folder
+        }
+        set {
+            
+        }
     }
     }
     
     
+    override func initWithProperties(properties: NSDictionary) -> KMBookmark {
+        return KMFolderBookmark()
+    }
     
     
-    static func bookmarkSession(setups: NSArray, label: String) -> KMBookmark {
-        var bookmark = KMBookmark()
-        
+    static func bookmarkRoot(childrenProperties: NSArray) -> KMFolderBookmark {
+        var bookmark = KMFolderBookmark()
+        var childs: [KMBookmark] = []
+        for setup in childrenProperties {
+            let bookmark = KMBookmark()
+            bookmark.documentSetup = setup as! [String : String]
+            childs.append(bookmark)
+        }
+        bookmark.children = childs
+        bookmark.label = NSLocalizedString("Bookmarks Menu", comment: "")
         return bookmark
         return bookmark
     }
     }
     
     
-    static func bookmark(url: URL, pageIndex: UInt, label: String) -> KMBookmark {
-        var bookmark = KMBookmark()
-        bookmark.fileURL = url
-        bookmark.pageIndex = pageIndex
+//    - (id)initRootWithChildrenProperties:(NSArray *)childrenProperties {
+//        NSMutableArray *aChildren = [NSMutableArray array];
+//        SKBookmark *child;
+//        for (NSDictionary *dict in childrenProperties) {
+//            if ((child = [[SKBookmark alloc] initWithProperties:dict])) {
+//                [aChildren addObject:child];
+//                [child release];
+//            }
+//        }
+//        return (id)[[SKRootBookmark alloc] initFolderWithChildren:aChildren label:NSLocalizedString(@"Bookmarks Menu", @"Menu item title")];
+//    }
+}
+
+//MARK: Session
+class KMSessionBookmark: KMBookmark {
+    override var bookmarkType: KMBookmarkType {
+        get {
+            return .session
+        }
+        set {
+            
+        }
+    }
+    
+    static func bookmarkSession(setups: NSArray, label: String) -> KMSessionBookmark {
+        var bookmark = KMSessionBookmark()
+        var childs: [KMBookmark] = []
+        for setup in setups {
+            let bookmark = KMBookmark()
+            bookmark.documentSetup = setup as! [String : String]
+            childs.append(bookmark)
+        }
+        bookmark.children = childs
         bookmark.label = label
         bookmark.label = label
         return bookmark
         return bookmark
     }
     }
+    
+    override func initWithProperties(properties: NSDictionary) -> KMBookmark {
+        return KMSessionBookmark()
+    }
+}
+
+//MARK: Separator
+class KMSeparatorBookmark: KMBookmark {
+    override var bookmarkType: KMBookmarkType {
+        get {
+            return .separator
+        }
+        set {
+            
+        }
+    }
+    
+    override func initWithProperties(properties: NSDictionary) -> KMBookmark {
+        return KMSeparatorBookmark()
+    }
 }
 }

+ 0 - 13
PDF Office/PDF Master/Class/PDFTools/KMBookmark/Model/KMFileBookmark.swift

@@ -1,13 +0,0 @@
-//
-//  KMFileBookmark.swift
-//  PDF Reader Pro
-//
-//  Created by lizhe on 2024/2/6.
-//
-
-import Cocoa
-
-class KMFileBookmark: KMBookmark {
-    var fileInfo: NSDictionary?
-    
-}

+ 0 - 12
PDF Office/PDF Master/Class/PDFTools/KMBookmark/Model/KMFolderBookmark.swift

@@ -1,12 +0,0 @@
-//
-//  KMFolderBookmark.swift
-//  PDF Reader Pro
-//
-//  Created by lizhe on 2024/2/6.
-//
-
-import Cocoa
-
-class KMFolderBookmark: KMBookmark {
-
-}

+ 55 - 0
PDF Office/PDF Master/Class/PDFTools/KMBookmark/View/KMBookmarkSheetView.swift

@@ -0,0 +1,55 @@
+//
+//  KMBookmarkSheetView.swift
+//  PDF Reader Pro
+//
+//  Created by lizhe on 2024/2/6.
+//
+
+import Cocoa
+
+typealias KMBookmarkSheetViewDoneAction = (_ view: KMBookmarkSheetView, _ type: KMBookmarkType, _ label: String) -> ()
+typealias KMBookmarkSheetViewCancelAction = (_ view: KMBookmarkSheetView, _ type: KMBookmarkType) -> ()
+
+class KMBookmarkSheetView: KMBaseXibView {
+    @IBOutlet weak var folderPopUp: NSPopUpButton!
+    @IBOutlet weak var bookmarkTextField: NSTextField!
+    
+    var type: KMBookmarkType = .bookmark
+    
+    var doneAction: KMBookmarkSheetViewDoneAction?
+    var cancelAction: KMBookmarkSheetViewCancelAction?
+    
+    override func draw(_ dirtyRect: NSRect) {
+        super.draw(dirtyRect)
+
+        // Drawing code here.
+    }
+    
+    override func setup() {
+        let root = KMBookmarkManager.manager.rootBookmark
+        self.folderPopUp.removeAllItems()
+        addMenuItems(forBookmarks: [root], level: 0, toMenu: self.folderPopUp.menu!)
+        self.folderPopUp.selectItem(at: 0)
+    }
+    
+    func addMenuItems(forBookmarks bookmarks: [KMBookmark], level: Int, toMenu menu: NSMenu) {
+        for bm in bookmarks {
+            if bm.bookmarkType == .folder {
+                let label = bm.label
+                let item = menu.addItem(withTitle: label, action: nil, keyEquivalent: "")
+                item.setImageAndSize(bm.icon)
+                item.indentationLevel = level
+                item.representedObject = bm
+                addMenuItems(forBookmarks: bm.children, level: level + 1, toMenu: menu)
+            }
+        }
+    }
+    
+    @IBAction func cancelButtonAction(_ sender: Any) {
+        self.cancelAction?(self, type)
+    }
+    
+    @IBAction func doneButtonAction(_ sender: Any) {
+        self.doneAction?(self, type, bookmarkTextField.stringValue)
+    }
+}

+ 110 - 0
PDF Office/PDF Master/Class/PDFTools/KMBookmark/View/KMBookmarkSheetView.xib

@@ -0,0 +1,110 @@
+<?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="KMBookmarkSheetView" customModule="PDF_Reader_Pro" customModuleProvider="target">
+            <connections>
+                <outlet property="bookmarkTextField" destination="JfC-Xt-6sp" id="Vnq-oG-K26"/>
+                <outlet property="folderPopUp" destination="nnv-Ab-zoW" id="Q25-bd-OIP"/>
+            </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="419" height="133"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <view translatesAutoresizingMaskIntoConstraints="NO" id="vpi-F6-kU4">
+                    <rect key="frame" x="0.0" y="0.0" width="419" height="133"/>
+                    <subviews>
+                        <textField focusRingType="none" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="x2a-qn-CtF">
+                            <rect key="frame" x="17" y="95" width="72" height="17"/>
+                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+                            <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Bookmark:" id="3yh-00-L4H">
+                                <font key="font" metaFont="system"/>
+                                <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                                <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+                            </textFieldCell>
+                        </textField>
+                        <button tag="1" imageHugsTitle="YES" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="2M6-Tb-aBd">
+                            <rect key="frame" x="323" y="12" width="82" height="32"/>
+                            <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
+                            <buttonCell key="cell" type="push" title="OK" bezelStyle="rounded" alignment="center" borderStyle="border" tag="1" inset="2" id="OEL-Rx-zzT">
+                                <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                <font key="font" metaFont="system"/>
+                                <string key="keyEquivalent" base64-UTF8="YES">
+DQ
+</string>
+                            </buttonCell>
+                            <connections>
+                                <action selector="doneButtonAction:" target="-2" id="Ekt-la-7Tu"/>
+                            </connections>
+                        </button>
+                        <button imageHugsTitle="YES" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="c0W-EN-Dbx">
+                            <rect key="frame" x="241" y="12" width="82" height="32"/>
+                            <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
+                            <buttonCell key="cell" type="push" title="Cancel" bezelStyle="rounded" alignment="center" borderStyle="border" inset="2" id="Y3P-tP-iyF">
+                                <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                <font key="font" metaFont="system"/>
+                                <string key="keyEquivalent" base64-UTF8="YES">
+Gw
+</string>
+                            </buttonCell>
+                            <connections>
+                                <action selector="cancelButtonAction:" target="-2" id="wZb-JY-q8l"/>
+                            </connections>
+                        </button>
+                        <textField focusRingType="none" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="JfC-Xt-6sp">
+                            <rect key="frame" x="94" y="93" width="305" height="22"/>
+                            <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
+                            <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="Fzy-OH-zcp">
+                                <font key="font" metaFont="system"/>
+                                <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                                <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                            </textFieldCell>
+                            <connections>
+                                <accessibilityConnection property="title" destination="x2a-qn-CtF" id="CCX-Bj-rBB"/>
+                            </connections>
+                        </textField>
+                        <popUpButton imageHugsTitle="YES" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="nnv-Ab-zoW">
+                            <rect key="frame" x="91" y="61" width="311" height="26"/>
+                            <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
+                            <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" selectedItem="0bc-pe-GcI" id="JN0-yy-avr">
+                                <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
+                                <font key="font" metaFont="menu"/>
+                                <menu key="menu" id="FZd-8s-5Ob">
+                                    <items>
+                                        <menuItem state="on" id="0bc-pe-GcI"/>
+                                    </items>
+                                </menu>
+                            </popUpButtonCell>
+                            <connections>
+                                <accessibilityConnection property="title" destination="CTS-t0-V89" id="L5c-ds-Mqc"/>
+                            </connections>
+                        </popUpButton>
+                        <textField focusRingType="none" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="CTS-t0-V89">
+                            <rect key="frame" x="17" y="67" width="72" height="17"/>
+                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+                            <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Add to:" id="Xcc-Sg-Yc6">
+                                <font key="font" metaFont="system"/>
+                                <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                                <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+                            </textFieldCell>
+                        </textField>
+                    </subviews>
+                </view>
+            </subviews>
+            <constraints>
+                <constraint firstAttribute="bottom" secondItem="vpi-F6-kU4" secondAttribute="bottom" id="08R-CF-vhq"/>
+                <constraint firstItem="vpi-F6-kU4" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" id="3CI-Kj-9ST"/>
+                <constraint firstAttribute="trailing" secondItem="vpi-F6-kU4" secondAttribute="trailing" id="Klh-B5-D9o"/>
+                <constraint firstItem="vpi-F6-kU4" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" id="fkq-O3-G9m"/>
+            </constraints>
+            <point key="canvasLocation" x="-58.5" y="75.5"/>
+        </customView>
+    </objects>
+</document>

+ 40 - 16
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -1234,12 +1234,15 @@
 		AD055E302B70B3D50035F824 /* KMBookmarkSheetController.xib in Resources */ = {isa = PBXBuildFile; fileRef = AD055E2C2B70B3D50035F824 /* KMBookmarkSheetController.xib */; };
 		AD055E302B70B3D50035F824 /* KMBookmarkSheetController.xib in Resources */ = {isa = PBXBuildFile; fileRef = AD055E2C2B70B3D50035F824 /* KMBookmarkSheetController.xib */; };
 		AD055E312B70B3D50035F824 /* KMBookmarkSheetController.xib in Resources */ = {isa = PBXBuildFile; fileRef = AD055E2C2B70B3D50035F824 /* KMBookmarkSheetController.xib */; };
 		AD055E312B70B3D50035F824 /* KMBookmarkSheetController.xib in Resources */ = {isa = PBXBuildFile; fileRef = AD055E2C2B70B3D50035F824 /* KMBookmarkSheetController.xib */; };
 		AD055E322B70B3D50035F824 /* KMBookmarkSheetController.xib in Resources */ = {isa = PBXBuildFile; fileRef = AD055E2C2B70B3D50035F824 /* KMBookmarkSheetController.xib */; };
 		AD055E322B70B3D50035F824 /* KMBookmarkSheetController.xib in Resources */ = {isa = PBXBuildFile; fileRef = AD055E2C2B70B3D50035F824 /* KMBookmarkSheetController.xib */; };
-		AD055E352B72090A0035F824 /* KMFolderBookmark.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD055E342B72090A0035F824 /* KMFolderBookmark.swift */; };
-		AD055E362B72090A0035F824 /* KMFolderBookmark.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD055E342B72090A0035F824 /* KMFolderBookmark.swift */; };
-		AD055E372B72090A0035F824 /* KMFolderBookmark.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD055E342B72090A0035F824 /* KMFolderBookmark.swift */; };
-		AD055E392B7209280035F824 /* KMFileBookmark.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD055E382B7209280035F824 /* KMFileBookmark.swift */; };
-		AD055E3A2B7209280035F824 /* KMFileBookmark.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD055E382B7209280035F824 /* KMFileBookmark.swift */; };
-		AD055E3B2B7209280035F824 /* KMFileBookmark.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD055E382B7209280035F824 /* KMFileBookmark.swift */; };
+		AD055E4A2B72346E0035F824 /* KMBookmarkSheetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD055E492B72346E0035F824 /* KMBookmarkSheetView.swift */; };
+		AD055E4B2B72346E0035F824 /* KMBookmarkSheetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD055E492B72346E0035F824 /* KMBookmarkSheetView.swift */; };
+		AD055E4C2B72346E0035F824 /* KMBookmarkSheetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD055E492B72346E0035F824 /* KMBookmarkSheetView.swift */; };
+		AD055E4E2B7234810035F824 /* KMBookmarkSheetView.xib in Resources */ = {isa = PBXBuildFile; fileRef = AD055E4D2B7234810035F824 /* KMBookmarkSheetView.xib */; };
+		AD055E4F2B7234810035F824 /* KMBookmarkSheetView.xib in Resources */ = {isa = PBXBuildFile; fileRef = AD055E4D2B7234810035F824 /* KMBookmarkSheetView.xib */; };
+		AD055E502B7234810035F824 /* KMBookmarkSheetView.xib in Resources */ = {isa = PBXBuildFile; fileRef = AD055E4D2B7234810035F824 /* KMBookmarkSheetView.xib */; };
+		AD055E532B73220A0035F824 /* KMBookmarkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD055E522B73220A0035F824 /* KMBookmarkManager.swift */; };
+		AD055E542B73220A0035F824 /* KMBookmarkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD055E522B73220A0035F824 /* KMBookmarkManager.swift */; };
+		AD055E552B73220A0035F824 /* KMBookmarkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD055E522B73220A0035F824 /* KMBookmarkManager.swift */; };
 		AD0E8AB02A31B76300DBFD3C /* KMInAppPurchaseManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD0E8AAF2A31B76300DBFD3C /* KMInAppPurchaseManager.swift */; };
 		AD0E8AB02A31B76300DBFD3C /* KMInAppPurchaseManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD0E8AAF2A31B76300DBFD3C /* KMInAppPurchaseManager.swift */; };
 		AD0E8AB12A31B76300DBFD3C /* KMInAppPurchaseManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD0E8AAF2A31B76300DBFD3C /* KMInAppPurchaseManager.swift */; };
 		AD0E8AB12A31B76300DBFD3C /* KMInAppPurchaseManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD0E8AAF2A31B76300DBFD3C /* KMInAppPurchaseManager.swift */; };
 		AD0E8AB42A31B78900DBFD3C /* KMDMGPurchaseManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD0E8AB32A31B78900DBFD3C /* KMDMGPurchaseManager.swift */; };
 		AD0E8AB42A31B78900DBFD3C /* KMDMGPurchaseManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD0E8AB32A31B78900DBFD3C /* KMDMGPurchaseManager.swift */; };
@@ -5548,8 +5551,9 @@
 		AD055E242B70B3C10035F824 /* KMBookmarkController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMBookmarkController.xib; sourceTree = "<group>"; };
 		AD055E242B70B3C10035F824 /* KMBookmarkController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMBookmarkController.xib; sourceTree = "<group>"; };
 		AD055E2B2B70B3D50035F824 /* KMBookmarkSheetController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBookmarkSheetController.swift; sourceTree = "<group>"; };
 		AD055E2B2B70B3D50035F824 /* KMBookmarkSheetController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBookmarkSheetController.swift; sourceTree = "<group>"; };
 		AD055E2C2B70B3D50035F824 /* KMBookmarkSheetController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMBookmarkSheetController.xib; sourceTree = "<group>"; };
 		AD055E2C2B70B3D50035F824 /* KMBookmarkSheetController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMBookmarkSheetController.xib; sourceTree = "<group>"; };
-		AD055E342B72090A0035F824 /* KMFolderBookmark.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMFolderBookmark.swift; sourceTree = "<group>"; };
-		AD055E382B7209280035F824 /* KMFileBookmark.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMFileBookmark.swift; sourceTree = "<group>"; };
+		AD055E492B72346E0035F824 /* KMBookmarkSheetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBookmarkSheetView.swift; sourceTree = "<group>"; };
+		AD055E4D2B7234810035F824 /* KMBookmarkSheetView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMBookmarkSheetView.xib; sourceTree = "<group>"; };
+		AD055E522B73220A0035F824 /* KMBookmarkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBookmarkManager.swift; sourceTree = "<group>"; };
 		AD0E8AAF2A31B76300DBFD3C /* KMInAppPurchaseManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMInAppPurchaseManager.swift; sourceTree = "<group>"; };
 		AD0E8AAF2A31B76300DBFD3C /* KMInAppPurchaseManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMInAppPurchaseManager.swift; sourceTree = "<group>"; };
 		AD0E8AB32A31B78900DBFD3C /* KMDMGPurchaseManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMDMGPurchaseManager.swift; sourceTree = "<group>"; };
 		AD0E8AB32A31B78900DBFD3C /* KMDMGPurchaseManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMDMGPurchaseManager.swift; sourceTree = "<group>"; };
 		AD0E8AB82A31BDDD00DBFD3C /* KMProduct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMProduct.swift; sourceTree = "<group>"; };
 		AD0E8AB82A31BDDD00DBFD3C /* KMProduct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMProduct.swift; sourceTree = "<group>"; };
@@ -8239,6 +8243,8 @@
 		AD055E1A2B70B2460035F824 /* KMBookmark */ = {
 		AD055E1A2B70B2460035F824 /* KMBookmark */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
+				AD055E512B7321EB0035F824 /* Manager */,
+				AD055E482B7234530035F824 /* View */,
 				AD055E1D2B70B3660035F824 /* Model */,
 				AD055E1D2B70B3660035F824 /* Model */,
 				AD055E1C2B70B3580035F824 /* Controller */,
 				AD055E1C2B70B3580035F824 /* Controller */,
 			);
 			);
@@ -8260,12 +8266,27 @@
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
 				AD055E1E2B70B3840035F824 /* KMBookmark.swift */,
 				AD055E1E2B70B3840035F824 /* KMBookmark.swift */,
-				AD055E342B72090A0035F824 /* KMFolderBookmark.swift */,
-				AD055E382B7209280035F824 /* KMFileBookmark.swift */,
 			);
 			);
 			path = Model;
 			path = Model;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
+		AD055E482B7234530035F824 /* View */ = {
+			isa = PBXGroup;
+			children = (
+				AD055E492B72346E0035F824 /* KMBookmarkSheetView.swift */,
+				AD055E4D2B7234810035F824 /* KMBookmarkSheetView.xib */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		AD055E512B7321EB0035F824 /* Manager */ = {
+			isa = PBXGroup;
+			children = (
+				AD055E522B73220A0035F824 /* KMBookmarkManager.swift */,
+			);
+			path = Manager;
+			sourceTree = "<group>";
+		};
 		AD0E8AAD2A31B6F300DBFD3C /* Appstore */ = {
 		AD0E8AAD2A31B6F300DBFD3C /* Appstore */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
@@ -13497,6 +13518,7 @@
 				ADE8BC3329F9261900570F89 /* KMSearchCellView.xib in Resources */,
 				ADE8BC3329F9261900570F89 /* KMSearchCellView.xib in Resources */,
 				AD3AAD492B0B7B8900DE5FE7 /* KMCompareToolbar.xib in Resources */,
 				AD3AAD492B0B7B8900DE5FE7 /* KMCompareToolbar.xib in Resources */,
 				BBC348362955A118008D2CD1 /* KMCreateBackgroundController.xib in Resources */,
 				BBC348362955A118008D2CD1 /* KMCreateBackgroundController.xib in Resources */,
+				AD055E4E2B7234810035F824 /* KMBookmarkSheetView.xib in Resources */,
 				9F0CB4C02977C06300007028 /* KMPropertiesPanelColorSubVC.xib in Resources */,
 				9F0CB4C02977C06300007028 /* KMPropertiesPanelColorSubVC.xib in Resources */,
 				ADD1B6F42946C07800C3FFF7 /* KMPrintChoosePageSizePosterView.xib in Resources */,
 				ADD1B6F42946C07800C3FFF7 /* KMPrintChoosePageSizePosterView.xib in Resources */,
 				BB1BFF612AE9FA6C003EB179 /* KMBatchOperateBaseWindowController.xib in Resources */,
 				BB1BFF612AE9FA6C003EB179 /* KMBatchOperateBaseWindowController.xib in Resources */,
@@ -13879,6 +13901,7 @@
 				ADF1569D29A63CBF001D1018 /* KMLightMember.xcassets in Resources */,
 				ADF1569D29A63CBF001D1018 /* KMLightMember.xcassets in Resources */,
 				BB6CA4D0298BB0D000A13864 /* KMPreferenceWindowController.xib in Resources */,
 				BB6CA4D0298BB0D000A13864 /* KMPreferenceWindowController.xib in Resources */,
 				BB003019298CA446002DD1A0 /* KMPreferenceGeneralController.xib in Resources */,
 				BB003019298CA446002DD1A0 /* KMPreferenceGeneralController.xib in Resources */,
+				AD055E4F2B7234810035F824 /* KMBookmarkSheetView.xib in Resources */,
 				BB986AE82AD5376100ADF172 /* WelcomeWindowController.xib in Resources */,
 				BB986AE82AD5376100ADF172 /* WelcomeWindowController.xib in Resources */,
 				ADBC376229CC637900D93208 /* KMReadModelView.xib in Resources */,
 				ADBC376229CC637900D93208 /* KMReadModelView.xib in Resources */,
 				9F1F82D6292F6D510092C4B4 /* KMPDFInsertPreviewViewController.xib in Resources */,
 				9F1F82D6292F6D510092C4B4 /* KMPDFInsertPreviewViewController.xib in Resources */,
@@ -14511,6 +14534,7 @@
 				9F1F82CF292F6CF90092C4B4 /* KMPDFInsertPageWindow.xib in Resources */,
 				9F1F82CF292F6CF90092C4B4 /* KMPDFInsertPageWindow.xib in Resources */,
 				9F0201772A1B488C00C9B673 /* KMAITranslationVC.xib in Resources */,
 				9F0201772A1B488C00C9B673 /* KMAITranslationVC.xib in Resources */,
 				BB1BFF632AE9FA6C003EB179 /* KMBatchOperateBaseWindowController.xib in Resources */,
 				BB1BFF632AE9FA6C003EB179 /* KMBatchOperateBaseWindowController.xib in Resources */,
+				AD055E502B7234810035F824 /* KMBookmarkSheetView.xib in Resources */,
 				ADC31FAE2A0E0C3900ED44A2 /* KMEditPropertyAlignmentView.xib in Resources */,
 				ADC31FAE2A0E0C3900ED44A2 /* KMEditPropertyAlignmentView.xib in Resources */,
 				AD3AAD4B2B0B7B8900DE5FE7 /* KMCompareToolbar.xib in Resources */,
 				AD3AAD4B2B0B7B8900DE5FE7 /* KMCompareToolbar.xib in Resources */,
 				BBADCF5A2AF3C7B3004ECE0C /* KMBatchOperateAddWatermarkViewController.xib in Resources */,
 				BBADCF5A2AF3C7B3004ECE0C /* KMBatchOperateAddWatermarkViewController.xib in Resources */,
@@ -14783,7 +14807,6 @@
 				ADBC372929CA950500D93208 /* KMComparativeOutlineView.swift in Sources */,
 				ADBC372929CA950500D93208 /* KMComparativeOutlineView.swift in Sources */,
 				9FDD0F64294AB645000C4DAD /* KMMainViewController.swift in Sources */,
 				9FDD0F64294AB645000C4DAD /* KMMainViewController.swift in Sources */,
 				BBD4267F2B4FCF1500AC8660 /* KMTextFieldCell.swift in Sources */,
 				BBD4267F2B4FCF1500AC8660 /* KMTextFieldCell.swift in Sources */,
-				AD055E392B7209280035F824 /* KMFileBookmark.swift in Sources */,
 				89D2D2FB294C806000BFF5FE /* KMPDFThumbnailItem.swift in Sources */,
 				89D2D2FB294C806000BFF5FE /* KMPDFThumbnailItem.swift in Sources */,
 				BB9599CB2B3184230062D346 /* KMRedactSelectPagesWindowController.swift in Sources */,
 				BB9599CB2B3184230062D346 /* KMRedactSelectPagesWindowController.swift in Sources */,
 				BBB9B313299A5D6D004F3235 /* DropboxModel.m in Sources */,
 				BBB9B313299A5D6D004F3235 /* DropboxModel.m in Sources */,
@@ -14829,6 +14852,7 @@
 				ADE86ADD2B0AF4B600414DFA /* KMCompareContentSettingWindowController.swift in Sources */,
 				ADE86ADD2B0AF4B600414DFA /* KMCompareContentSettingWindowController.swift in Sources */,
 				AD1CA4112A061CCD0070541F /* KMAnnotationScreenColorViewItem.swift in Sources */,
 				AD1CA4112A061CCD0070541F /* KMAnnotationScreenColorViewItem.swift in Sources */,
 				ADDDCE242B43A32A005B4AB5 /* AppSandboxFileAccess.m in Sources */,
 				ADDDCE242B43A32A005B4AB5 /* AppSandboxFileAccess.m in Sources */,
+				AD055E532B73220A0035F824 /* KMBookmarkManager.swift in Sources */,
 				BBF8A4012AE8B4E200788BAC /* KMBatchBaseParameter.swift in Sources */,
 				BBF8A4012AE8B4E200788BAC /* KMBatchBaseParameter.swift in Sources */,
 				AD867FC129DFC39400F00440 /* KMBOTAAnnotationItem.swift in Sources */,
 				AD867FC129DFC39400F00440 /* KMBOTAAnnotationItem.swift in Sources */,
 				BB9EA1572B1EEAAC00EAFD9B /* KMImageModel.swift in Sources */,
 				BB9EA1572B1EEAAC00EAFD9B /* KMImageModel.swift in Sources */,
@@ -15153,6 +15177,7 @@
 				ADD1B6E82946C02600C3FFF7 /* KMPrintChoosePageSizeMultipageView.swift in Sources */,
 				ADD1B6E82946C02600C3FFF7 /* KMPrintChoosePageSizeMultipageView.swift in Sources */,
 				AD58F40E2B1DAAA800299EE0 /* KMPrintDefaultView.swift in Sources */,
 				AD58F40E2B1DAAA800299EE0 /* KMPrintDefaultView.swift in Sources */,
 				9F1FE4ED29406E4700E952CA /* ThrobberView.m in Sources */,
 				9F1FE4ED29406E4700E952CA /* ThrobberView.m in Sources */,
+				AD055E4A2B72346E0035F824 /* KMBookmarkSheetView.swift in Sources */,
 				9F0CB4F9298655E500007028 /* KMDesignToken+Border.swift in Sources */,
 				9F0CB4F9298655E500007028 /* KMDesignToken+Border.swift in Sources */,
 				BBFDFAA62AF3899400E08AA2 /* PasswordWindowController.swift in Sources */,
 				BBFDFAA62AF3899400E08AA2 /* PasswordWindowController.swift in Sources */,
 				9F0CB45F2966C9E200007028 /* KMFormPropertPanelViewController.swift in Sources */,
 				9F0CB45F2966C9E200007028 /* KMFormPropertPanelViewController.swift in Sources */,
@@ -15203,7 +15228,6 @@
 				ADDF83412B391A5C00A81A4E /* DSignatureConfigWindowController.swift in Sources */,
 				ADDF83412B391A5C00A81A4E /* DSignatureConfigWindowController.swift in Sources */,
 				AD199DE72B230A9300D56FEE /* KMPrintMultipageView.swift in Sources */,
 				AD199DE72B230A9300D56FEE /* KMPrintMultipageView.swift in Sources */,
 				BB6719FD2AD2CE1B003D44D5 /* CPDFSquareAnnotation+PDFListView.swift in Sources */,
 				BB6719FD2AD2CE1B003D44D5 /* CPDFSquareAnnotation+PDFListView.swift in Sources */,
-				AD055E352B72090A0035F824 /* KMFolderBookmark.swift in Sources */,
 				BB146FC3299DC0D100784A6A /* GTMReadMonitorInputStream.m in Sources */,
 				BB146FC3299DC0D100784A6A /* GTMReadMonitorInputStream.m in Sources */,
 				BB8115FB29924A5F0008F536 /* KMSecureEncryptCheckCellView.swift in Sources */,
 				BB8115FB29924A5F0008F536 /* KMSecureEncryptCheckCellView.swift in Sources */,
 				AD867FAF29DFBB1200F00440 /* KMAnnotationOutlineCellView.swift in Sources */,
 				AD867FAF29DFBB1200F00440 /* KMAnnotationOutlineCellView.swift in Sources */,
@@ -15835,7 +15859,6 @@
 				BBFE6E88293210AB00142C01 /* KMCompressCellView.swift in Sources */,
 				BBFE6E88293210AB00142C01 /* KMCompressCellView.swift in Sources */,
 				899700F728F4051B009AF911 /* KMAnnotationViewController.swift in Sources */,
 				899700F728F4051B009AF911 /* KMAnnotationViewController.swift in Sources */,
 				9F1FE4C429406E4700E952CA /* CTPageTransition.c in Sources */,
 				9F1FE4C429406E4700E952CA /* CTPageTransition.c in Sources */,
-				AD055E362B72090A0035F824 /* KMFolderBookmark.swift in Sources */,
 				BBB9B311299A5D6D004F3235 /* KMCloudDownloadOperationQueue.m in Sources */,
 				BBB9B311299A5D6D004F3235 /* KMCloudDownloadOperationQueue.m in Sources */,
 				BBFCCE092B56988C003742B3 /* KMPreferenceCommon.swift in Sources */,
 				BBFCCE092B56988C003742B3 /* KMPreferenceCommon.swift in Sources */,
 				ADDF834E2B391A5C00A81A4E /* DSignatureCertifyDetailViewController.swift in Sources */,
 				ADDF834E2B391A5C00A81A4E /* DSignatureCertifyDetailViewController.swift in Sources */,
@@ -16056,6 +16079,7 @@
 				BB0A55222A30968900B6E84B /* KMDesignBaseView.swift in Sources */,
 				BB0A55222A30968900B6E84B /* KMDesignBaseView.swift in Sources */,
 				BB61F2132B59120F00777E27 /* KMScroller.swift in Sources */,
 				BB61F2132B59120F00777E27 /* KMScroller.swift in Sources */,
 				9FCFEC992AD14EEF00EAD2CB /* KMMailHelper.swift in Sources */,
 				9FCFEC992AD14EEF00EAD2CB /* KMMailHelper.swift in Sources */,
+				AD055E542B73220A0035F824 /* KMBookmarkManager.swift in Sources */,
 				89E4E6ED2963D1B7002DBA6F /* KMColorPickerViewController.m in Sources */,
 				89E4E6ED2963D1B7002DBA6F /* KMColorPickerViewController.m in Sources */,
 				ADAFDA172AE8DD6600F084BC /* KMAdvertisementCollectionHeadView.swift in Sources */,
 				ADAFDA172AE8DD6600F084BC /* KMAdvertisementCollectionHeadView.swift in Sources */,
 				ADDF839C2B391A5D00A81A4E /* PDFCertExportAccessoryView.swift in Sources */,
 				ADDF839C2B391A5D00A81A4E /* PDFCertExportAccessoryView.swift in Sources */,
@@ -16104,6 +16128,7 @@
 				AD68783429A60FA7005B5210 /* KMLoginView.swift in Sources */,
 				AD68783429A60FA7005B5210 /* KMLoginView.swift in Sources */,
 				9F0CB532298656EA00007028 /* KMDesignToken+BorderWidthBottom.swift in Sources */,
 				9F0CB532298656EA00007028 /* KMDesignToken+BorderWidthBottom.swift in Sources */,
 				BB981E562AD4F638001988CA /* KMPageIndicator.swift in Sources */,
 				BB981E562AD4F638001988CA /* KMPageIndicator.swift in Sources */,
+				AD055E4B2B72346E0035F824 /* KMBookmarkSheetView.swift in Sources */,
 				BB3A669B2B07520800575343 /* KMCustomOutlineView.swift in Sources */,
 				BB3A669B2B07520800575343 /* KMCustomOutlineView.swift in Sources */,
 				BB04FD0D2B206F3600D80F7B /* KMPlanViewController.swift in Sources */,
 				BB04FD0D2B206F3600D80F7B /* KMPlanViewController.swift in Sources */,
 				9FF816EB2AFA5D760087EFC5 /* KMTableCellData.swift in Sources */,
 				9FF816EB2AFA5D760087EFC5 /* KMTableCellData.swift in Sources */,
@@ -16697,7 +16722,6 @@
 				ADB5E51A2A3711CB007110A8 /* KMSubscribeWaterMarkView.swift in Sources */,
 				ADB5E51A2A3711CB007110A8 /* KMSubscribeWaterMarkView.swift in Sources */,
 				BB8F456E295AC1220037EA22 /* KMHeaderFooterAdjectiveModel.swift in Sources */,
 				BB8F456E295AC1220037EA22 /* KMHeaderFooterAdjectiveModel.swift in Sources */,
 				F3599174292B62F5000D25DE /* CStringConstants.m in Sources */,
 				F3599174292B62F5000D25DE /* CStringConstants.m in Sources */,
-				AD055E3A2B7209280035F824 /* KMFileBookmark.swift in Sources */,
 				BBC8A7692B05EB8000FA9377 /* KMThumbnailTableviewCell.swift in Sources */,
 				BBC8A7692B05EB8000FA9377 /* KMThumbnailTableviewCell.swift in Sources */,
 				BB6D2DA82B674A6300624C24 /* CPDFOutline+KMExtension.swift in Sources */,
 				BB6D2DA82B674A6300624C24 /* CPDFOutline+KMExtension.swift in Sources */,
 				89752DEB293875FC003FF08E /* KMMainToolbarController.swift in Sources */,
 				89752DEB293875FC003FF08E /* KMMainToolbarController.swift in Sources */,
@@ -17042,7 +17066,6 @@
 				BB6DD823293497B6001F0544 /* KMSecureEncryptModel.swift in Sources */,
 				BB6DD823293497B6001F0544 /* KMSecureEncryptModel.swift in Sources */,
 				ADE86AF02B0AF56200414DFA /* KMCompareCoveringSettingView.swift in Sources */,
 				ADE86AF02B0AF56200414DFA /* KMCompareCoveringSettingView.swift in Sources */,
 				BB35732F2AF50068004CDA92 /* KMBatchOperateConvertViewController.swift in Sources */,
 				BB35732F2AF50068004CDA92 /* KMBatchOperateConvertViewController.swift in Sources */,
-				AD055E3B2B7209280035F824 /* KMFileBookmark.swift in Sources */,
 				89D2D2E0294C451400BFF5FE /* KMThumbnailViewController.swift in Sources */,
 				89D2D2E0294C451400BFF5FE /* KMThumbnailViewController.swift in Sources */,
 				BB0FE0622B7351AA001E0F88 /* AIInfoManager.m in Sources */,
 				BB0FE0622B7351AA001E0F88 /* AIInfoManager.m in Sources */,
 				ADDEEA642AD3A6E700EF675D /* KMPDFSignatureTextView.swift in Sources */,
 				ADDEEA642AD3A6E700EF675D /* KMPDFSignatureTextView.swift in Sources */,
@@ -17706,6 +17729,7 @@
 				ADE3C1A129A3894900793B13 /* KMSearchTableRowView.swift in Sources */,
 				ADE3C1A129A3894900793B13 /* KMSearchTableRowView.swift in Sources */,
 				AD1CA41B2A061CE10070541F /* KMAnnotationScreenTypeViewItem.swift in Sources */,
 				AD1CA41B2A061CE10070541F /* KMAnnotationScreenTypeViewItem.swift in Sources */,
 				BB276A4E2B03760000AB5578 /* KMOperationQueue.swift in Sources */,
 				BB276A4E2B03760000AB5578 /* KMOperationQueue.swift in Sources */,
+				AD055E552B73220A0035F824 /* KMBookmarkManager.swift in Sources */,
 				AD8810A229A8459000178CA1 /* KMComparativeTableViewController.swift in Sources */,
 				AD8810A229A8459000178CA1 /* KMComparativeTableViewController.swift in Sources */,
 				9F0CB4A129683E2600007028 /* KMPropertiesPanelSizeSubVC.swift in Sources */,
 				9F0CB4A129683E2600007028 /* KMPropertiesPanelSizeSubVC.swift in Sources */,
 				AD0E8AB62A31B78900DBFD3C /* KMDMGPurchaseManager.swift in Sources */,
 				AD0E8AB62A31B78900DBFD3C /* KMDMGPurchaseManager.swift in Sources */,
@@ -17929,7 +17953,6 @@
 				BBF1705A2AE296B90013CE02 /* KMView.swift in Sources */,
 				BBF1705A2AE296B90013CE02 /* KMView.swift in Sources */,
 				BBD3C8B82B2C438F00EB0867 /* KMToolbarPreviousNextItemView.swift in Sources */,
 				BBD3C8B82B2C438F00EB0867 /* KMToolbarPreviousNextItemView.swift in Sources */,
 				ADDEEA7C2AD3F4C800EF675D /* KMPopUpButton.swift in Sources */,
 				ADDEEA7C2AD3F4C800EF675D /* KMPopUpButton.swift in Sources */,
-				AD055E372B72090A0035F824 /* KMFolderBookmark.swift in Sources */,
 				BB93CDE72AE757A000B29C57 /* KMToolbarItemView.swift in Sources */,
 				BB93CDE72AE757A000B29C57 /* KMToolbarItemView.swift in Sources */,
 				BB24FFDF2B28578C00A59054 /* KMTTSWindowController.swift in Sources */,
 				BB24FFDF2B28578C00A59054 /* KMTTSWindowController.swift in Sources */,
 				9F705F8F291E579F005199AD /* KMHistoryFileTableView.swift in Sources */,
 				9F705F8F291E579F005199AD /* KMHistoryFileTableView.swift in Sources */,
@@ -17951,6 +17974,7 @@
 				9F0CB5032986560D00007028 /* KMDesignToken+BorderTop.swift in Sources */,
 				9F0CB5032986560D00007028 /* KMDesignToken+BorderTop.swift in Sources */,
 				9F88108F2B56614600F69815 /* KMAnnotationChoiceWidgetAppearanceViewController.swift in Sources */,
 				9F88108F2B56614600F69815 /* KMAnnotationChoiceWidgetAppearanceViewController.swift in Sources */,
 				9F0CB4CB2986533F00007028 /* KMDesignToken+Sizing.swift in Sources */,
 				9F0CB4CB2986533F00007028 /* KMDesignToken+Sizing.swift in Sources */,
+				AD055E4C2B72346E0035F824 /* KMBookmarkSheetView.swift in Sources */,
 				BB1B0AC72B4FC6E900889528 /* KMGuideInfoWindow.swift in Sources */,
 				BB1B0AC72B4FC6E900889528 /* KMGuideInfoWindow.swift in Sources */,
 				ADD1B70C29471FA500C3FFF7 /* KMPrintChoosePresenter.swift in Sources */,
 				ADD1B70C29471FA500C3FFF7 /* KMPrintChoosePresenter.swift in Sources */,
 				9F0CB4692967E5CB00007028 /* KMPropertiesPanelSubViewController.swift in Sources */,
 				9F0CB4692967E5CB00007028 /* KMPropertiesPanelSubViewController.swift in Sources */,