Browse Source

【综合】书签列表整理代码

tangchao 4 months ago
parent
commit
b7785253ad

+ 0 - 21
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/BookMarks/View/KMCellEmptyView.h

@@ -1,21 +0,0 @@
-//
-//  KMCellEmptyView.h
-//  PDF Reader Pro
-//
-//  Created by Niehaoyu on 2023/2/28.
-//
-
-#import <Cocoa/Cocoa.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface KMCellEmptyView : NSView
-
-@property (nonatomic, assign) NSInteger itemIndex;
-
-@property (nonatomic, copy) void(^mouseEventHandle)(BOOL mouseEnter, BOOL mouseExit);
-
-
-@end
-
-NS_ASSUME_NONNULL_END

+ 0 - 61
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/BookMarks/View/KMCellEmptyView.m

@@ -1,61 +0,0 @@
-//
-//  KMCellEmptyView.m
-//  PDF Reader Pro
-//
-//  Created by Niehaoyu on 2023/2/28.
-//
-
-#import "KMCellEmptyView.h"
-
-@interface KMCellEmptyView ()
-
-@property (nonatomic, copy) NSTrackingArea *trackingArea;
-
-@end
-
-@implementation KMCellEmptyView
-
-- (void)drawRect:(NSRect)dirtyRect {
-    [super drawRect:dirtyRect];
-    
-    // Drawing code here.
-}
-
-- (id)init {
-    self = [super init];
-    if (self) {
-        [self setUp];
-    }
-    return self;
-}
-
-- (id)initWithFrame:(NSRect)frameRect {
-    self = [super initWithFrame:frameRect];
-    if (self) {
-        [self setUp];
-    }
-    return self;
-}
-
-- (void)setUp {
-    self.trackingArea = [[NSTrackingArea alloc] initWithRect:self.bounds options:NSTrackingMouseEnteredAndExited | NSTrackingInVisibleRect | NSTrackingActiveInKeyWindow owner:self userInfo:nil];
-    [self addTrackingArea:self.trackingArea];
-}
-
-- (void)mouseEntered:(NSEvent *)event {
-    [super mouseEntered:event];
-    
-    if (self.mouseEventHandle) {
-        self.mouseEventHandle(YES, NO);
-    }
-}
-
-- (void)mouseExited:(NSEvent *)event {
-    [super mouseExited:event];
-    
-    if (self.mouseEventHandle) {
-        self.mouseEventHandle(NO, YES);
-    }
-}
-
-@end

+ 8 - 0
PDF Office/PDF Master/KMClass/KMPDFViewController/KMMainViewController.swift

@@ -2666,6 +2666,14 @@ extension KMMainViewController: KMNLeftSideViewControllerDelegate {
             listView.go(toPageIndex: pageIndex, animated: true)
         }
     }
+    
+    func addBookmarkForLeftC(controller: KMNLeftSideViewController, bookmark: CPDFBookmark?, info: [String : Any]?) {
+        if let result = info?["result"] as? Bool {
+            if result == false {
+                let message = KMNCustomAlertView.alertView(message: KMLocalizedString("This page has been bookmarked"), type: .normal_custom, fromView: self.view, point:CGPointMake(self.view.frame.origin.x + self.view.frame.size.width/2, self.view.bounds.size.height - 30))
+            }
+        }
+    }
 }
 
 

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

@@ -11,7 +11,7 @@ import KMComponentLibrary
 typealias KMBookMarkViewControllerBookMarkDidChange = (_ controller: KMBookMarkViewController, _ bookMarks: [KMBookMarkItem]) -> Void
 
 @objc protocol KMBookMarkViewControllerDelegate: NSObjectProtocol {
-    @objc optional func bkControllerAddAction(controller: KMBookMarkViewController)
+    @objc optional func bkControllerAddAction(controller: KMBookMarkViewController, bookmark: CPDFBookmark?, info: [String : Any]?)
 }
 
 class KMBookMarkViewController: KMNBaseViewController {
@@ -26,11 +26,11 @@ class KMBookMarkViewController: KMNBaseViewController {
     @IBOutlet weak var bigTipLabel: NSTextField!
     @IBOutlet weak var tipLabel: NSTextField!
     
-    var dataSource: [KMBookMarkItem]!
-    var renameTextField: NSTextField!
-    var renamePDFBook: KMBookMarkItem!
-    var renameCellView: KMBookCellView!
-//    var listView: CPDFListView!
+    var dataSource: [KMBookMarkItem] = []
+    var renameTextField: NSTextField?
+    var renamePDFBook: KMBookMarkItem?
+    var renameCellView: KMBookCellView?
+    
     weak var document: CPDFDocument?
     
     var isLocalEvent: Bool = false //区分外部点击还是内部点击
@@ -81,74 +81,32 @@ class KMBookMarkViewController: KMNBaseViewController {
         addButton_.autoresizingMask = [.width, .height]
         addButton_.setTarget(self, action: #selector(addBookmarkAction))
             
-        self.bookTableView.style = NSTableView.Style.plain
-        self.bookTableView.allowsMultipleSelection = true
-        self.bookTableView.doubleAction = #selector(renameBookAction)
-//        self.bookTableView.selectionHighlightStyle = NSTableView.SelectionHighlightStyle.none;
+        bookTableView.style = NSTableView.Style.plain
+        bookTableView.allowsMultipleSelection = true
+        bookTableView.doubleAction = #selector(renameBookAction)
+        
         bookTableView.hasImageToolTips = true
         bookTableView.botaDelegate = self
         
-//        bookTableView.menuClickedAction = { point in
-//            var viewHeight: CGFloat = 0
-//            let items: [(String, String)] = [("", ""),("Page Edit", "ThumbnailMenuIdentifier_PageEdit")]
-//            var menuItemArr: [ComponentMenuitemProperty] = []
-//            for (i, value) in items {
-//                if value.count == 0 {
-//                    let property: ComponentMenuitemProperty = ComponentMenuitemProperty.divider()
-//                    menuItemArr.append(property)
-//                    viewHeight += 8
-//                } else {
-//                    let properties_Menuitem: ComponentMenuitemProperty = ComponentMenuitemProperty(multipleSelect: false,
-//                                                                                                   itemSelected: false,
-//                                                                                                   isDisabled: false,
-//                                                                                                   keyEquivalent: nil,
-//                                                                                                   text: KMLocalizedString(i),
-//                                                                                                   identifier: value)
-//
-//                    menuItemArr.append(properties_Menuitem)
-//                    viewHeight += 36
-//                }
-//            }
-//
-//            if self.groupView != nil {
-//                self.groupView?.clickedAutoHide = false
-////                self.groupView?.groupDelegate = self
-//                self.groupView?.frame = CGRectMake(0, 0, 180, viewHeight)
-//                self.groupView?.updateGroupInfo(menuItemArr)
-//
-//                self.groupView?.showWithPoint(CGPoint(x: point.x, y: point.y - viewHeight), relativeTo: self.bookTableView)
-//
-//            }
-//            return NSMenu()
-//        }
-        
-        self.sortButton.target = self
-        self.sortButton.action = #selector(sortAction)
-        
-        self.emptyView.addSubview(emptyView_)
-        
-//        blankView.addSubview(emptyViewTopLine)
-//        emptyViewTopLine.km_add_top_constraint(constant: 4)
-//        emptyViewTopLine.km_add_left_constraint(constant: 24)
-//        emptyViewTopLine.km_add_right_constraint(constant: -24)
-//        emptyViewTopLine.km_add_height_constraint(constant: 1)
-//        emptyViewTopLine.wantsLayer = true
-//        let dividerColor = ComponentLibrary.shared.getComponentColorFromKey("colorBorder/divider")
-//        emptyViewTopLine.layer?.backgroundColor = dividerColor.cgColor
+        sortButton.image = NSImage(named: "KMImageNameBotaBookmarkSortIcon")
+        sortButton.target = self
+        sortButton.action = #selector(sortAction)
         
+        emptyView.addSubview(emptyView_)
         emptyView_.km_add_top_constraint(constant: 232)
         emptyView_.km_add_bottom_constraint()
         emptyView_.km_add_leading_constraint()
         emptyView_.km_add_trailing_constraint()
         
-        self.refreshUI()
         self.reloadData()
     }
     
     override func updateUILanguage() {
         super.updateUILanguage()
         
-        KMMainThreadExecute {}
+        KMMainThreadExecute {
+            self.titleTextField.stringValue = KMLocalizedString("Bookmarks")
+        }
     }
     
     override func updateUIThemeColor() {
@@ -166,26 +124,6 @@ class KMBookMarkViewController: KMNBaseViewController {
         }
     }
     
-    func refreshUI() {
-        self.titleTextField.font = NSFont.SFProTextSemiboldFont(14.0)
-//        self.titleTextField.textColor = NSColor.km_init(hex: "#252629")
-        self.titleTextField.stringValue = NSLocalizedString("Bookmarks", comment: "")
-//        self.addBookButton.toolTip = NSLocalizedString("Add Bookmark", comment: "")
-//        self.addBookButton.image = NSImage(named: "KMImageNameBotaBookmarkMoreIcon")
-        self.sortButton.image = NSImage(named: "KMImageNameBotaBookmarkSortIcon")
-        
-        self.bigTipLabel.font = NSFont.SFProTextRegularFont(14.0)
-        self.bigTipLabel.textColor = NSColor.km_init(hex: "#616469")
-        self.bigTipLabel.stringValue = NSLocalizedString("No Bookmarks", comment: "")
-        
-        let title = NSLocalizedString("To create a bookmark, please right-click on the selected page and choose \"Add Bookmark\", or click \"Add\" button in the upper right corner.", comment: "")
-        let paragraphStyle = NSMutableParagraphStyle()
-        paragraphStyle.lineHeightMultiple = 1.32
-        paragraphStyle.alignment = .center
-        self.tipLabel.attributedStringValue = NSMutableAttributedString(string: title, attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle, .foregroundColor : NSColor.km_init(hex: "#94989C")])
-        self.tipLabel.isHidden = true
-    }
-    
     func reloadData() {
         let array = document?.bookmarks() ?? [CPDFBookmark]()
         var bookMarks: [KMBookMarkItem] = []
@@ -209,7 +147,6 @@ class KMBookMarkViewController: KMNBaseViewController {
     }
     
     func addBookMarkAndEdit(newBookMark: KMBookMarkItem) {
-
         _ = self.dataSource.contains { KMBookMarkItem in
             if KMBookMarkItem.bookMark == newBookMark.bookMark {
                 let index = KMOCToolClass.arrayIndexOf(array: self.dataSource, item: KMBookMarkItem) ?? 0
@@ -228,29 +165,7 @@ class KMBookMarkViewController: KMNBaseViewController {
         NotificationCenter.default.addObserver(self, selector: #selector(documentPageCountChangedNotification), name: NSNotification.Name.init(rawValue: "CPDFDocumentPageCountChangedNotification"), object: nil)
     }
     
-    private func addMenuTitle(view: NSView, event: NSEvent) {
-        let menus : NSMenu = NSMenu(title: "")
-        menus.delegate = self
-        let addItem = self.menuItemWithTitle(title: NSLocalizedString("Rename", comment: ""), action: #selector(renameBookAction))
-        let addChildItem = self.menuItemWithTitle(title: NSLocalizedString("Change Destination", comment: ""), action: #selector(changeLocationAction))
-        let addHigherItem = self.menuItemWithTitle(title: NSLocalizedString("Delete", comment: ""), action: #selector(deleteBookAction))
-
-        menus.addItem(addItem)
-        menus.addItem(addChildItem)
-        menus.addItem(addHigherItem)
-
-        let point = view.convert(event.locationInWindow, from: nil)
-        menus.popUp(positioning: nil, at: point, in: view)
-//        self.bookTableView.menu = menus
-    }
-
-    func menuItemWithTitle(title:String, action:Selector?) -> NSMenuItem {
-        let menuItem = NSMenuItem.init(title: title as String, action: action, keyEquivalent: "")
-        menuItem.target = self
-        return menuItem
-    }
-    
-    //MARK: Menu Action
+    //MARK: - Menu Action
     
     @objc func renameBookAction() {
         if self.bookTableView.selectedRowIndexes.count == 1 {
@@ -266,19 +181,16 @@ class KMBookMarkViewController: KMNBaseViewController {
     }
     
     @IBAction func addBookmarkAction(_ sender: Any) {
-        delegate?.bkControllerAddAction?(controller: self)
-        handdler.addCurrentBookmark(callback: { [weak self] bookmark in
-            self?.reloadData()
-        })
+        let currentPageIndex = handdler.currentPageIndex
+        if let data = handdler.bookmark(for: currentPageIndex) {
+            delegate?.bkControllerAddAction?(controller: self, bookmark: data, info: ["result" : false])
+            return
+        }
         
-//        let menu = NSMenu()
-//        let removeItem = NSMenuItem(title: NSLocalizedString("Remove Bookmark", comment: ""), action: #selector(removeBookmark), keyEquivalent: "")
-//        removeItem.target = self
-//        menu.addItem(removeItem)
-//        let removeAllItem = NSMenuItem(title: NSLocalizedString("Remove All Bookmarks", comment: ""), action: #selector(removeAllBookmark), keyEquivalent: "")
-//        menu.addItem(removeAllItem)
-//        removeAllItem.target = self
-//        menu.popUp(positioning: removeItem, at: .init(x: 0, y: 24), in: sender as? NSView)
+        handdler.addCurrentBookmark(callback: { [unowned self] bookmark in
+            self.delegate?.bkControllerAddAction?(controller: self, bookmark: bookmark, info: nil)
+            self.reloadData()
+        })
     }
     
     @objc func changeLocationAction() {
@@ -286,15 +198,15 @@ class KMBookMarkViewController: KMNBaseViewController {
             let item = self.dataSource[self.bookTableView.selectedRowIndexes.first!]
             let alter = NSAlert()
             alter.alertStyle = NSAlert.Style.informational
-            alter.messageText = NSLocalizedString("Are you sure you want to set the selected page as the bookmark location?", comment: "")
-            alter.addButton(withTitle: NSLocalizedString("Yes", comment:""))
-            alter.addButton(withTitle: NSLocalizedString("No", comment:""))
+            alter.messageText = KMLocalizedString("Are you sure you want to set the selected page as the bookmark location?", comment: "")
+            alter.addButton(withTitle: KMLocalizedString("Yes", comment:""))
+            alter.addButton(withTitle: KMLocalizedString("No", comment:""))
             let modlres = alter.runModal()
             if modlres == NSApplication.ModalResponse.alertFirstButtonReturn {
                 let bookMark = KMBookMarkItem()
                 bookMark.bookMark = item.bookMark
                 bookMark.label = item.label
-//                bookMark.index = UInt(self.listView.currentPageIndex)
+                bookMark.index = UInt(handdler.currentPageIndex)
                 self.changeLocation(oldBookMark: item,
                                     newBookMark: bookMark)
             }
@@ -318,11 +230,11 @@ class KMBookMarkViewController: KMNBaseViewController {
     
     private func renameBookWithRow(row: Int) {
         self.renamePDFBook = self.dataSource[row]
-        self.renameCellView = self.bookTableView.view(atColumn: 0, row: row, makeIfNecessary: true) as! KMBookCellView
-        self.renameTextField = self.renameCellView.inputTF
-        self.renameTextField.delegate = self
-        self.renameTextField.isEditable = true
-        self.renameTextField.becomeFirstResponder()
+        self.renameCellView = self.bookTableView.view(atColumn: 0, row: row, makeIfNecessary: true) as? KMBookCellView
+        self.renameTextField = self.renameCellView?.inputTF
+        self.renameTextField?.delegate = self
+        self.renameTextField?.isEditable = true
+        self.renameTextField?.becomeFirstResponder()
     }
     
     @objc func sortAction(_ sender: NSButton) {
@@ -336,7 +248,8 @@ class KMBookMarkViewController: KMNBaseViewController {
         self.reloadData()
     }
     
-    //MARK: Noti
+    //MARK: - Noti
+    
     @objc func KMPDFViewCurrentPageDidChangedNotification(notification: NSNotification) {
         if notification.object is CPDFDocument {
             let pdfdocument : CPDFDocument = notification.object as! CPDFDocument
@@ -344,11 +257,11 @@ class KMBookMarkViewController: KMNBaseViewController {
                 if !isLocalEvent {
                     var containSelIndex:Bool = false
                     for (index, value) in self.dataSource.enumerated() {
-//                        if value.bookMark == document?.bookmark(forPageIndex: UInt(self.listView.currentPageIndex)) {
+                        if value.bookMark == document?.bookmark(forPageIndex: UInt(handdler.currentPageIndex)) {
                             containSelIndex = true
                             self.didSelectItem(row: index, event: NSEvent())
                             break
-//                        }
+                        }
                     }
                     if !containSelIndex {
                         self.cancelSelect()
@@ -376,11 +289,10 @@ class KMBookMarkViewController: KMNBaseViewController {
 
 extension KMBookMarkViewController: NSTextFieldDelegate {
     func controlTextDidEndEditing(_ obj: Notification) {
-        if (self.renameTextField.isEqual(obj.object)) {
+        if (self.renameTextField!.isEqual(obj.object)) {
             let textField : NSTextField = obj.object as! NSTextField
-//            self.renamePDFBook(bookmark: self.renamePDFBook, label: textField.stringValue)
-            handdler.rename(bookmark: renamePDFBook.bookMark, label: textField.stringValue)
-            self.renameTextField.isEditable = false
+            handdler.rename(bookmark: renamePDFBook!.bookMark, label: textField.stringValue)
+            self.renameTextField?.isEditable = false
         }
     }
 }
@@ -389,7 +301,7 @@ extension KMBookMarkViewController: NSTextFieldDelegate {
 
 extension KMBookMarkViewController : NSTableViewDelegate,NSTableViewDataSource {
     func numberOfRows(in tableView: NSTableView) -> Int {
-        let count = self.dataSource?.count ?? 0
+        let count = self.dataSource.count
         if count == 0 {
             self.emptyView.isHidden = false
         } else {
@@ -413,16 +325,9 @@ extension KMBookMarkViewController : NSTableViewDelegate,NSTableViewDataSource {
             } else {
                 cell.dateLabel.stringValue = ""
             }
-//            if let page = document?.page(at: UInt(item.bookMark.pageIndex)) {
-//                if let data = page.PDFListViewTIFFData(for: page.bounds) {
-//                    let image = NSImage(data: data)
-//                    cell.iconIv.image = image
-//                }
-//            }
             
             cell.textFieldDidEndEditingCallback = { [weak self] textF in
                 self?.renameCellView = cell
-//                self?.renamePDFBook(bookmark: item, label: textF.stringValue)
                 self?.handdler.rename(bookmark: item.bookMark, label: textF.stringValue)
             }
             return cell
@@ -436,39 +341,36 @@ extension KMBookMarkViewController : NSTableViewDelegate,NSTableViewDataSource {
         if row < self.dataSource.count {
             rowView.model = self.dataSource[row]
             
-//            let addItem = self.menuItemWithTitle(title: NSLocalizedString("Rename", comment: ""), action: #selector(renameBookAction))
-//            let addChildItem = self.menuItemWithTitle(title: NSLocalizedString("Change Destination", comment: ""), action: #selector(changeLocationAction))
-//            let addHigherItem = self.menuItemWithTitle(title: NSLocalizedString("Delete", comment: ""), action: #selector(deleteBookAction))
-            rowView.menuClickedAction = { point in
-                let tempView = self.bookTableView.rowView(atRow: row, makeIfNecessary: false)
+            rowView.menuClickedAction = { [weak self] point in
+                let idxs = self?.bookTableView.selectedRowIndexes.count ?? 0
+                
+                let tempView = self?.bookTableView.rowView(atRow: row, makeIfNecessary: false)
                 var viewHeight: CGFloat = 0
                 let items: [String] = ["Delete", "Add", "Rename", "Delete All"]
                 var menuItemArr: [ComponentMenuitemProperty] = []
                 for value in items {
-                    if value.count == 0 {
-                        let property: ComponentMenuitemProperty = ComponentMenuitemProperty.divider()
-                        menuItemArr.append(property)
-                        viewHeight += 8
-                    } else {
-                        let properties_Menuitem: ComponentMenuitemProperty = ComponentMenuitemProperty(multipleSelect: false,
+                    let properties_Menuitem: ComponentMenuitemProperty = ComponentMenuitemProperty(multipleSelect: false,
                                                                                                        itemSelected: false,
                                                                                                        isDisabled: false,
                                                                                                        keyEquivalent: nil,
                                                                                                        text: KMLocalizedString(value),
                                                                                                        identifier: value)
                         
-                        menuItemArr.append(properties_Menuitem)
-                        viewHeight += 36
-                    }
+                    menuItemArr.append(properties_Menuitem)
+                    viewHeight += 36
+                }
+                if idxs > 1 {
+                    (menuItemArr.safe_element(for: 1) as? ComponentMenuitemProperty)?.isDisabled = true
+                    (menuItemArr.safe_element(for: 2) as? ComponentMenuitemProperty)?.isDisabled = true
                 }
                 
-                if self.groupView != nil {
-                    self.groupView?.clickedAutoHide = false
-                    self.groupView?.groupDelegate = self
-                    self.groupView?.frame = CGRectMake(0, 0, 180, viewHeight)
-                    self.groupView?.updateGroupInfo(menuItemArr)
+                if self?.groupView != nil {
+                    self?.groupView?.clickedAutoHide = false
+                    self?.groupView?.groupDelegate = self
+                    self?.groupView?.frame = CGRectMake(0, 0, 180, viewHeight)
+                    self?.groupView?.updateGroupInfo(menuItemArr)
                     
-                    self.groupView?.showWithPoint(CGPoint(x: point.x, y: point.y - viewHeight), relativeTo: tempView)
+                    self?.groupView?.showWithPoint(CGPoint(x: point.x, y: point.y - viewHeight), relativeTo: tempView)
                 }
                 return NSMenu()
             }
@@ -486,9 +388,6 @@ extension KMBookMarkViewController : NSTableViewDelegate,NSTableViewDataSource {
                 if row < 0 || row >= self.dataSource.count {
                     return
                 }
-//                if self.bookTableView.rowView(atRow: row, makeIfNecessary: false) != nil {
-//
-//                }
             }
             
             rowView.hoverCallback = { [unowned self] (mouseEntered, mouseBox) in
@@ -614,67 +513,35 @@ extension KMBookMarkViewController : NSTableViewDelegate,NSTableViewDataSource {
     }
     
     func updateAddBookMarkState() {
-//        self.addBookButton.isEnabled = self.canAddBorkMark()
+        addButton_.properties.isDisabled = !canAddBorkMark()
+        addButton_.reloadData()
     }
     
     func canAddBorkMark() -> Bool {
         if document?.bookmarks() != nil && document?.bookmarks()?.count != 0 {
             for bookMark in document?.bookmarks() ?? [] {
-//                if bookMark.pageIndex == self.listView.currentPageIndex {
-//                    return false
-//                }
+                if bookMark.pageIndex == handdler.currentPageIndex {
+                    return false
+                }
             }
         }
         return true
     }
-    
-    @objc func removeBookmark(_ sender: NSMenuItem) {
-        let row = self.bookTableView.selectedRow
-        if let item = self.dataSource.safe_element(for: row) as? KMBookMarkItem {
-//            self.listView.document.removeBookmark(forPageIndex: UInt(item.bookMark.pageIndex))
-            self.deleteBookMark(bookMarks: [item])
-        }
-//        DispatchQueue.main.async {
-//            self.reloadData()
-//        }
-    }
-    
-    @objc func removeAllBookmark(_ sender: NSMenuItem) {
-//        for data in self.dataSource {
-//            self.listView.document.removeBookmark(forPageIndex: UInt(data.bookMark.pageIndex))
-//        }
-//        DispatchQueue.main.async {
-//            self.reloadData()
-//        }
-        self.deleteBookMark(bookMarks: self.dataSource)
-    }
 }
 
+// MARK: - KMBotaTableViewDelegate
+
 extension KMBookMarkViewController: KMBotaTableViewDelegate {
     func tableView(_ aTableView: NSTableView, imageContextForRow rowIndex: Int) -> AnyObject? {
         if aTableView.isEqual(to: self.bookTableView) {
-            let cnt = self.dataSource?.count ?? 0
+            let cnt = self.dataSource.count
             if rowIndex >= cnt {
                 return nil
             }
             let model = self.dataSource[rowIndex]
-//            let selection = model.selection
-//            let x = selection.bounds.origin.x + NSWidth(selection.bounds) * 0.5
-//            let y = selection.bounds.origin.y + NSHeight(selection.bounds) * 0.5
-//            let point = NSPoint(x: x, y: y)
-//            return CPDFDestination(document: self.pdfDocument(), pageIndex: Int(model.selectionPageIndex), at: point, zoom: self.scaleFactor().cgFloat)
             return model.bookMark
             
         }
-//        else if aTableView.isEqual(to: self.groupedFindTableView) {
-//            if rowIndex >= self.groupSearchResults.count {
-//                return nil
-//            }
-////            let model = self.groupSearchResults[rowIndex]
-////            let selection = model.selection
-////            let point = NSPoint(x: NSWidth(selection.bounds) * 0.5, y: NSHeight(selection.bounds) * 0.5)
-////            return CPDFDestination(document: self.listView.document, pageIndex: Int(selection.page.pageIndex()), at: point, zoom: self.listView.scaleFactor)
-//        }
         return nil
     }
 }
@@ -687,11 +554,6 @@ extension KMBookMarkViewController {
         document?.addBookmark(newBookMark.label, forPageIndex: newBookMark.index)
         
         reloadData()
-//        self.listView.setNeedsDisplayForVisiblePages()
-        
-//        self.listView.undoManager?.registerUndo(withTarget: self) { [unowned self] targetType in
-//            self.changeLocation(oldBookMark: newBookMark, newBookMark: oldBookMark)
-//        }
     }
     
     func renamePDFBook(bookmark : KMBookMarkItem! , label:String) {
@@ -704,13 +566,8 @@ extension KMBookMarkViewController {
         self.reloadData()
         
         var indexSet = IndexSet()
-        indexSet.insert(self.bookTableView.row(for: self.renameCellView))
+        indexSet.insert(self.bookTableView.row(for: self.renameCellView!))
         self.bookTableView.selectRowIndexes(indexSet, byExtendingSelection: false)
-        
-//        self.listView.undoManager?.registerUndo(withTarget: self) { [weak self] targetType in
-//            bookmark.bookMark.label = label
-//            self?.renamePDFBook(bookmark: bookmark, label: temp ?? bookmark.label)
-//        }
     }
     
     func deleteBookMark(bookMarks: [KMBookMarkItem]) {
@@ -719,16 +576,8 @@ extension KMBookMarkViewController {
                 KMPrint("删除标签成功")
             }
         }
-//        self.listView.setNeedsDisplayForVisiblePages()
         self.reloadData()
         
-        //undo redo
-        var saveBooks:[KMBookMarkItem] = bookMarks
-//        self.listView.undoManager?.registerUndo(withTarget: self) { [weak self] targetType in
-//            saveBooks.sort(){$0.index > $1.index}
-//            self?.addBookMark(bookMarks: bookMarks)
-//        }
-        
         guard let callBack = bookMarkDidChange else { return }
         
         callBack(self, bookMarks)
@@ -738,7 +587,6 @@ extension KMBookMarkViewController {
         for bookMark in bookMarks {
             document?.addBookmark(bookMark.label, forPageIndex: UInt(bookMark.index))
         }
-//        self.listView.setNeedsDisplayForVisiblePages()
         self.reloadData()
         
         if bookMarks.count == 1 {
@@ -753,28 +601,17 @@ extension KMBookMarkViewController {
             }
         }
         
-        //undo redo
-        var saveBooks:[KMBookMarkItem] = bookMarks
-//        self.listView.undoManager?.registerUndo(withTarget: self) { [weak self] targetType in
-//            saveBooks.sort(){$0.index > $1.index}
-//            self?.deleteBookMark(bookMarks: saveBooks)
-//        }
-        
         guard let callBack = bookMarkDidChange else { return }
         
         callBack(self, bookMarks)
     }
     
     @IBAction func undo(_ sender: Any) {
-//        if (self.listView.undoManager?.canUndo ?? false) {
-//            self.listView.undoManager?.undo()
-//        }
+        handdler.undo()
     }
     
     @IBAction func redo(_ sender: Any) {
-//        if (self.listView.undoManager?.canRedo ?? false) {
-//            self.listView.undoManager?.redo()
-//        }
+        handdler.redo()
     }
 }
 
@@ -784,10 +621,10 @@ extension KMBookMarkViewController: NSMenuDelegate, NSMenuItemValidation {
     func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
         let action = menuItem.action
         if (action == #selector(undo)) {
-//            return self.listView.undoManager?.canUndo ?? false
+            return handdler.canUndo()
         }
         if (action == #selector(redo)) {
-//            return self.listView.undoManager?.canRedo ?? false
+            return handdler.canRedo()
         }
         
         if action == #selector(renameBookAction) ||
@@ -803,23 +640,12 @@ extension KMBookMarkViewController: NSMenuDelegate, NSMenuItemValidation {
                 return true
             } else {
                 if self.bookTableView.selectedRowIndexes.count == 0 {
-                    if action == #selector(changeLocationAction) {
-                        //                    if self.listView.document.bookmark(forPageIndex: UInt(self.listView.currentPageIndex)) != nil {
-                        //                        return false
-                        //                    }
-                    }
+                    if action == #selector(changeLocationAction) {}
                 } else {
                     return false
                 }
             }
         }
-        if action == #selector(removeBookmark) {
-            let row = self.bookTableView.selectedRow
-            return row >= 0 && row < self.dataSource.count
-        }
-        if action == #selector(removeAllBookmark) {
-            return self.dataSource.count > 0
-        }
         return true
     }
 }
@@ -855,10 +681,14 @@ extension KMBookMarkViewController: ComponentGroupDelegate {
         if let selItem = menuItemProperty {
             let index = group?.menuItemArr.firstIndex(of: selItem)
             if index == 0 {
-                let row = bookTableView.selectedRow
-                if let item = dataSource.safe_element(for: row) as? KMBookMarkItem {
-                    _ = handdler.removeBookmark(for: item.bookMark.pageIndex)
+                group?.removeFromSuperview()
+                var pageIndexs = IndexSet()
+                for i in bookTableView.selectedRowIndexes {
+                    if let item = dataSource.safe_element(for: i) as? KMBookMarkItem {
+                        pageIndexs.insert(item.bookMark.pageIndex)
+                    }
                 }
+                _ = handdler.removeBookmarks(for: pageIndexs)
             } else if index == 1 {
 
             } else if index == 2 {

PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/BookMarks/KMBookMarkViewController.xib → PDF Office/PDF Master/KMClass/Left/Bookmark/KMBookMarkViewController.xib


+ 42 - 50
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/BookMarks/Tools/KMNBookmarkHanddler.swift

@@ -26,32 +26,41 @@ class KMNBookmarkHanddler: NSObject {
         }
     }
     
-//    convenience init(pdfView: CPDFView) {
-//        self.init()
-//
-//        self.pdfView = pdfView
-//    }
+    var currentPageIndex: Int {
+        get {
+            return pdfView?.currentPageIndex ?? 0
+        }
+    }
+    
+    func canUndo() -> Bool {
+        return pdfView?.undoManager?.canUndo ?? false
+    }
+    
+    func canRedo() -> Bool {
+        return pdfView?.undoManager?.canRedo ?? false
+    }
+    
+    func undo() {
+        if canUndo() {
+            pdfView?.undoManager?.undo()
+        }
+    }
+    
+    func redo() {
+        if canRedo() {
+            pdfView?.undoManager?.redo()
+        }
+    }
     
     func addCurrentBookmark(callback: ((CPDFBookmark?)->Void)?) {
-        let currentPageIndex = self.pdfView?.currentPageIndex ?? 0
-        
-        if let bk = bookmark(for: currentPageIndex) {
-            //            let bookMark = self.pdfView?.document?.bookmark(forPageIndex: UInt(currentPageIndex)
-            //            self.dataSource.contains { KMBookMarkItem in
-            //                if KMBookMarkItem.bookMark == bookMark {
-            //                    let index = Int(KMBookMarkItem.index)
-            //                    self.bookTableView.selectRowIndexes(IndexSet(integer: index), byExtendingSelection: false)
-            //                    self.didSelectItem(row: index, event: NSEvent())
-            //                    return true
-            //                }
-            //                return false
-            //            }
+        let currentPageIndex = self.currentPageIndex
+        if let _ = bookmark(for: currentPageIndex) {
+
         } else {
             let label = "\(NSLocalizedString("Page", comment:"")) \(currentPageIndex + 1)"
             let bookMark = KMBookMarkItem()
             bookMark.label = label
             bookMark.index = UInt(currentPageIndex)
-//            self.addBookMark(bookMarks: [bookMark])
             self._undo_add(label: label, index: currentPageIndex)
             callback?(self.bookmark(for: currentPageIndex))
         }
@@ -65,6 +74,20 @@ class KMNBookmarkHanddler: NSObject {
         return true
     }
     
+    func removeBookmarks(for indexs: IndexSet) -> Bool {
+        var bks: [CPDFBookmark] = []
+        for i in indexs {
+            if let bk = self.bookmark(for: i) {
+                bks.append(bk)
+            }
+        }
+        if bks.isEmpty {
+            return false
+        }
+        _undo_removeAll(bookmarks: bks)
+        return true
+    }
+    
     func removeAllBookmarks() -> Bool {
         guard let bks = document?.bookmarks(), bks.isEmpty == false else {
             return false
@@ -81,37 +104,6 @@ class KMNBookmarkHanddler: NSObject {
         _undo_rename(bookmark: bookmark, label: label)
     }
     
-    func addBookmarkItems(bookMarks: [KMBookMarkItem]) {
-//        for bookMark in bookMarks {
-//            document?.addBookmark(bookMark.label, forPageIndex: UInt(bookMark.index))
-//        }
-//        pdfView?.setNeedsDisplayForVisiblePages()
-//        self.reloadData()
-        
-//        if bookMarks.count == 1 {
-//            DispatchQueue.main.async { [self] in
-//                if document?.bookmark(forPageIndex: UInt(bookMarks.first!.index)) != nil {
-//                    let item = KMBookMarkItem()
-//                    item.bookMark = (document?.bookmark(forPageIndex: UInt(bookMarks.first!.index)))!
-//                    item.label = item.bookMark.label
-//                    item.index = UInt(item.bookMark.pageIndex)
-//                    self.addBookMarkAndEdit(newBookMark: item)
-//                }
-//            }
-//        }
-        
-        //undo redo
-//        var saveBooks:[KMBookMarkItem] = bookMarks
-//        self.listView.undoManager?.registerUndo(withTarget: self) { [weak self] targetType in
-//            saveBooks.sort(){$0.index > $1.index}
-//            self?.deleteBookMark(bookMarks: saveBooks)
-//        }
-        
-//        guard let callBack = bookMarkDidChange else { return }
-        
-//        callBack(self, bookMarks)
-    }
-    
     func bookmark(for pageIndex: Int) -> CPDFBookmark? {
         return document?.bookmark(forPageIndex: UInt(pageIndex))
     }

+ 11 - 30
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/BookMarks/View/KMBookCellView.swift

@@ -18,25 +18,19 @@ class KMBookCellView: NSTableCellView {
     
     override func awakeFromNib() {
         super.awakeFromNib()
-//        self.bookTitle.textColor = NSColor.km_init(hex: "#252629")
+
         bookTitle.isHidden = true
-        self.bookTitle.font = NSFont.SFProTextRegularFont(13.0)
-        self.bookTitle.textColor = KMAppearance.titleColor()
-        self.dateLabel.font = NSFont.SFProTextRegularFont(12)
-        self.dateLabel.textColor = NSColor.km_init(hex: "#757780")
-//        self.inputTF.textColor = KMAppearance.titleColor()
-//        self.inputTF.focusRingType = .exterior
-//        self.iconIv.wantsLayer = true
-//        self.iconIv.layer?.borderWidth = 0.5
-//        self.iconIv.layer?.borderColor = NSColor.km_init(hex: "#757780").cgColor
-        self.inputTF.isBordered = false
-        self.inputTF.drawsBackground = false
-        self.inputTF.delegate = self
-        self.inputBox.cornerRadius = 0
-//        self.inputTF.isEditable = false
-        self.inputTF.isHighlighted = false
+        bookTitle.font = NSFont.SFProTextRegularFont(13.0)
+        bookTitle.textColor = KMAppearance.titleColor()
+        dateLabel.font = NSFont.SFProTextRegularFont(12)
+        dateLabel.textColor = NSColor.km_init(hex: "#757780")
+        inputTF.isBordered = false
+        inputTF.drawsBackground = false
+        inputTF.delegate = self
+        inputBox.cornerRadius = 0
+        inputTF.isHighlighted = false
         
-        self.inputTF.firstResponderHandler = { [weak self] firstResp in
+        inputTF.firstResponderHandler = { [weak self] firstResp in
             if firstResp {
                 DispatchQueue.main.async {
                     self?.inputBox.borderWidth = 1
@@ -65,17 +59,4 @@ extension KMBookCellView: NSTextFieldDelegate {
             self.textFieldDidEndEditingCallback?(self.inputTF)
         }
     }
-    
-    func control(_ control: NSControl, textShouldBeginEditing fieldEditor: NSText) -> Bool {
-        if self.inputTF.isEqual(to: control) {
-//            self.inputBox.borderWidth = 0
-        }
-        return true
-    }
-    
-    func controlTextDidBeginEditing(_ obj: Notification) {
-        if self.inputTF.isEqual(to: obj.object) {
-//            self.inputBox.borderWidth = 0
-        }
-    }
 }

PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/BookMarks/View/KMBookMarkRowView.swift → PDF Office/PDF Master/KMClass/Left/Bookmark/View/KMBookMarkRowView.swift


+ 1 - 28
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/BookMarks/View/KMBookMarkTableRowView.swift

@@ -44,8 +44,7 @@ class KMBookMarkTableRowView: NSTableRowView {
             self.box?.layer?.masksToBounds = true
             self.box = KMBox(frame: rect)
             self.box?.borderWidth = 0
-//                self.box?.borderColor = NSColor.km_init(hex: "#EDEEF0")
-//            self.box?.layer?.cornerRadius = 8
+
             self.box?.boxType = .custom
             self.addSubview(self.box!, positioned: NSWindow.OrderingMode.below, relativeTo: self)
             self.box?.autoresizingMask = [.width, .height]
@@ -103,37 +102,11 @@ extension KMBookMarkTableRowView {
     
     func drawView(_ color: NSColor = NSColor.km_init(hex: "#EDEEF0")) {
         if self.model!.select {
-            // #227AFF4D
-//            let isDark = KMAppearance.isDarkMode()
-//            if isDark {
-//                self.box?.backgroundColor(NSColor.km_init(hex: "#227AFF", alpha: 0.3))
-//            } else { // #4982E633
-//                self.box?.backgroundColor(NSColor.km_init(hex: "#CED0D4", alpha: 0.6))
-//                self.box?.backgroundColor(NSColor.km_init(hex: "#4982E6", alpha: 0.2))
-//            }
             self.box?.fillColor =  ComponentLibrary.shared.getComponentColorFromKey("colorPrimary/bg-opacity-dark")
-//            self.box?.layer?.cornerRadius = 4
-//            self.box?.borderColor = NSColor.km_init(hex: "#CED0D4")
-//            self.box?.borderWidth = 0
         } else if self.model.hover {
-//            let isDark = KMAppearance.isDarkMode()
-//            if isDark {
-//                self.box?.backgroundColor(NSColor(hex: "#56585A"))
-//            } else {
-//                self.box?.backgroundColor(NSColor.km_init(hex: "#EDEEF0"))
-//            }
             self.box?.fillColor = ComponentLibrary.shared.getComponentColorFromKey("colorFill/hov-opacity")
-//            self.box?.layer?.cornerRadius = 4
-//            self.box?.borderWidth = 0
         } else {
-//            let isDark = KMAppearance.isDarkMode()
-//            if isDark {
-//                self.box?.backgroundColor(.clear)
-//            } else {
-//                self.box?.backgroundColor(NSColor.km_init(hex: "#F7F8FA"))
-//            }
             self.box?.fillColor = .clear
-//            self.box?.borderWidth = 0
         }
     }
 }

+ 4 - 2
PDF Office/PDF Master/KMClass/Left/KMNLeftSideViewController.swift

@@ -13,6 +13,8 @@ import KMComponentLibrary
     @objc optional func enterPageEditLeftSideViewController(leftSideViewController:KMNLeftSideViewController)
     
     @objc optional func changeSelectePageLeftSideViewController(leftSideViewController:KMNLeftSideViewController,pageIndex:Int)
+    
+    @objc optional func addBookmarkForLeftC(controller: KMNLeftSideViewController, bookmark: CPDFBookmark?, info: [String : Any]?)
 
 }
 
@@ -137,7 +139,7 @@ extension KMNLeftSideViewController: KMNThumnailViewControllerDelegate {
 }
 
 extension KMNLeftSideViewController: KMBookMarkViewControllerDelegate {
-    func bkControllerAddAction(controller: KMBookMarkViewController) {
-
+    func bkControllerAddAction(controller: KMBookMarkViewController, bookmark: CPDFBookmark?, info: [String : Any]?) {
+        leftSideViewDelegate?.addBookmarkForLeftC?(controller: self, bookmark: bookmark, info: info)
     }
 }

+ 0 - 1
PDF Office/PDF Master/PDF_Reader_Pro DMG-Bridging-Header.h

@@ -38,7 +38,6 @@
 
 #import "CStringConstants.h"
 
-#import "KMCellEmptyView.h"
 #import "GBDeviceInfo.h"
 #import "KMEmailSubWindowController.h"
 #import "SKKeychain.h"

+ 1 - 2
PDF Office/PDF Master/PDF_Reader_Pro Edition-Bridging-Header.h

@@ -7,7 +7,7 @@
 #import "CPDFListView+Event.h"
 #import "ComPDFUIKit.h"
 #import <ComPDFKit/ComPDFKit.h>
-#import <ComPDFKit/CPDFFont.h>l
+#import <ComPDFKit/CPDFFont.h>
 
 #import "KMToolbarItem.h"
 #import <ComPDFKit_Conversion/ComPDFKit_Conversion.h>
@@ -38,7 +38,6 @@
 
 #import "CStringConstants.h"
 
-#import "KMCellEmptyView.h"
 #import "GBDeviceInfo.h"
 #import "KMEmailSubWindowController.h"
 #import "SKKeychain.h"

+ 0 - 1
PDF Office/PDF Master/PDF_Reader_Pro-Bridging-Header.h

@@ -38,7 +38,6 @@
 
 #import "CStringConstants.h"
 
-#import "KMCellEmptyView.h"
 #import "GBDeviceInfo.h"
 #import "KMEmailSubWindowController.h"
 #import "SKKeychain.h"

+ 72 - 82
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -189,6 +189,24 @@
 		656C1E622CD0DFF400295F82 /* KMConvertJsonSettingView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 656C1E612CD0DFF400295F82 /* KMConvertJsonSettingView.xib */; };
 		656C1E632CD0DFF400295F82 /* KMConvertJsonSettingView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 656C1E612CD0DFF400295F82 /* KMConvertJsonSettingView.xib */; };
 		656C1E642CD0DFF400295F82 /* KMConvertJsonSettingView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 656C1E612CD0DFF400295F82 /* KMConvertJsonSettingView.xib */; };
+		657865F32CE1E7DD00AFE2DB /* KMNBookmarkHanddler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 657865EA2CE1E7DD00AFE2DB /* KMNBookmarkHanddler.swift */; };
+		657865F42CE1E7DD00AFE2DB /* KMNBookmarkHanddler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 657865EA2CE1E7DD00AFE2DB /* KMNBookmarkHanddler.swift */; };
+		657865F52CE1E7DD00AFE2DB /* KMNBookmarkHanddler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 657865EA2CE1E7DD00AFE2DB /* KMNBookmarkHanddler.swift */; };
+		657865F62CE1E7DD00AFE2DB /* KMBookMarkViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 657865EB2CE1E7DD00AFE2DB /* KMBookMarkViewController.xib */; };
+		657865F72CE1E7DD00AFE2DB /* KMBookMarkViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 657865EB2CE1E7DD00AFE2DB /* KMBookMarkViewController.xib */; };
+		657865F82CE1E7DD00AFE2DB /* KMBookMarkViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 657865EB2CE1E7DD00AFE2DB /* KMBookMarkViewController.xib */; };
+		657865F92CE1E7DD00AFE2DB /* KMBookMarkViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 657865EC2CE1E7DD00AFE2DB /* KMBookMarkViewController.swift */; };
+		657865FA2CE1E7DD00AFE2DB /* KMBookMarkViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 657865EC2CE1E7DD00AFE2DB /* KMBookMarkViewController.swift */; };
+		657865FB2CE1E7DD00AFE2DB /* KMBookMarkViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 657865EC2CE1E7DD00AFE2DB /* KMBookMarkViewController.swift */; };
+		657865FC2CE1E7DD00AFE2DB /* KMBookMarkRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 657865EE2CE1E7DD00AFE2DB /* KMBookMarkRowView.swift */; };
+		657865FD2CE1E7DD00AFE2DB /* KMBookMarkRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 657865EE2CE1E7DD00AFE2DB /* KMBookMarkRowView.swift */; };
+		657865FE2CE1E7DD00AFE2DB /* KMBookMarkRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 657865EE2CE1E7DD00AFE2DB /* KMBookMarkRowView.swift */; };
+		657865FF2CE1E7DD00AFE2DB /* KMBookMarkTableRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 657865EF2CE1E7DD00AFE2DB /* KMBookMarkTableRowView.swift */; };
+		657866002CE1E7DD00AFE2DB /* KMBookMarkTableRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 657865EF2CE1E7DD00AFE2DB /* KMBookMarkTableRowView.swift */; };
+		657866012CE1E7DD00AFE2DB /* KMBookMarkTableRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 657865EF2CE1E7DD00AFE2DB /* KMBookMarkTableRowView.swift */; };
+		657866052CE1E7DD00AFE2DB /* KMBookCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 657865F22CE1E7DD00AFE2DB /* KMBookCellView.swift */; };
+		657866062CE1E7DD00AFE2DB /* KMBookCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 657865F22CE1E7DD00AFE2DB /* KMBookCellView.swift */; };
+		657866072CE1E7DD00AFE2DB /* KMBookCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 657865F22CE1E7DD00AFE2DB /* KMBookCellView.swift */; };
 		658FDBA92C9D4B3100EFA72E /* KMNoteReplyCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 658FDBA82C9D4B3100EFA72E /* KMNoteReplyCellView.swift */; };
 		658FDBAA2C9D4B3100EFA72E /* KMNoteReplyCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 658FDBA82C9D4B3100EFA72E /* KMNoteReplyCellView.swift */; };
 		658FDBAB2C9D4B3100EFA72E /* KMNoteReplyCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 658FDBA82C9D4B3100EFA72E /* KMNoteReplyCellView.swift */; };
@@ -245,9 +263,6 @@
 		65ECFCF82CA3D79400942AC9 /* KMDrawViewSDK_Mac.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F326EE2A2CA2D25600EAE792 /* KMDrawViewSDK_Mac.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		65ECFCF92CA3D79800942AC9 /* KMDrawViewSDK_Mac.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F326EE2A2CA2D25600EAE792 /* KMDrawViewSDK_Mac.framework */; };
 		65ECFCFA2CA3D79800942AC9 /* KMDrawViewSDK_Mac.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F326EE2A2CA2D25600EAE792 /* KMDrawViewSDK_Mac.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
-		65EEEB0F2CDD202F007EF295 /* KMNBookmarkHanddler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65EEEB0E2CDD202F007EF295 /* KMNBookmarkHanddler.swift */; };
-		65EEEB102CDD202F007EF295 /* KMNBookmarkHanddler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65EEEB0E2CDD202F007EF295 /* KMNBookmarkHanddler.swift */; };
-		65EEEB112CDD202F007EF295 /* KMNBookmarkHanddler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65EEEB0E2CDD202F007EF295 /* KMNBookmarkHanddler.swift */; };
 		65EF3A7D2C81C1F500CCFC8F /* KMVerificationRSA.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65EF3A7C2C81C1F500CCFC8F /* KMVerificationRSA.swift */; };
 		65EF3A7E2C81C1F500CCFC8F /* KMVerificationRSA.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65EF3A7C2C81C1F500CCFC8F /* KMVerificationRSA.swift */; };
 		65EF3A7F2C81C1F500CCFC8F /* KMVerificationRSA.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65EF3A7C2C81C1F500CCFC8F /* KMVerificationRSA.swift */; };
@@ -266,9 +281,6 @@
 		89316855296E45CA0073EA59 /* KMImageAccessoryController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 89316851296E45CA0073EA59 /* KMImageAccessoryController.xib */; };
 		89316856296E45CA0073EA59 /* KMImageAccessoryController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 89316851296E45CA0073EA59 /* KMImageAccessoryController.xib */; };
 		89316857296E45CA0073EA59 /* KMImageAccessoryController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 89316851296E45CA0073EA59 /* KMImageAccessoryController.xib */; };
-		8942F7BB29222C7E00389627 /* KMBookCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8942F7BA29222C7E00389627 /* KMBookCellView.swift */; };
-		8942F7BC29222C7E00389627 /* KMBookCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8942F7BA29222C7E00389627 /* KMBookCellView.swift */; };
-		8942F7BD29222C7E00389627 /* KMBookCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8942F7BA29222C7E00389627 /* KMBookCellView.swift */; };
 		8942F7F02926087200389627 /* KMSearchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8942F7EE2926087200389627 /* KMSearchViewController.swift */; };
 		8942F7F12926087200389627 /* KMSearchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8942F7EE2926087200389627 /* KMSearchViewController.swift */; };
 		8942F7F22926087200389627 /* KMSearchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8942F7EE2926087200389627 /* KMSearchViewController.swift */; };
@@ -329,12 +341,6 @@
 		899700F928F4051B009AF911 /* KMAnnotationViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 899700F528F4051B009AF911 /* KMAnnotationViewController.xib */; };
 		899700FA28F4051B009AF911 /* KMAnnotationViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 899700F528F4051B009AF911 /* KMAnnotationViewController.xib */; };
 		899700FB28F4051B009AF911 /* KMAnnotationViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 899700F528F4051B009AF911 /* KMAnnotationViewController.xib */; };
-		899700FE28F40710009AF911 /* KMBookMarkViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 899700FC28F40710009AF911 /* KMBookMarkViewController.swift */; };
-		899700FF28F40710009AF911 /* KMBookMarkViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 899700FC28F40710009AF911 /* KMBookMarkViewController.swift */; };
-		8997010028F40710009AF911 /* KMBookMarkViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 899700FC28F40710009AF911 /* KMBookMarkViewController.swift */; };
-		8997010128F40710009AF911 /* KMBookMarkViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 899700FD28F40710009AF911 /* KMBookMarkViewController.xib */; };
-		8997010228F40710009AF911 /* KMBookMarkViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 899700FD28F40710009AF911 /* KMBookMarkViewController.xib */; };
-		8997010328F40710009AF911 /* KMBookMarkViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 899700FD28F40710009AF911 /* KMBookMarkViewController.xib */; };
 		8997010628F4082C009AF911 /* KMFromViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8997010428F4082C009AF911 /* KMFromViewController.swift */; };
 		8997010728F4082C009AF911 /* KMFromViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8997010428F4082C009AF911 /* KMFromViewController.swift */; };
 		8997010828F4082C009AF911 /* KMFromViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8997010428F4082C009AF911 /* KMFromViewController.swift */; };
@@ -2219,9 +2225,6 @@
 		ADC63E4B2A49BEDD00854E02 /* KMSubscribeWaterMarkCollectionItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADC63E472A49BEDD00854E02 /* KMSubscribeWaterMarkCollectionItem.xib */; };
 		ADC63E4C2A49BEDD00854E02 /* KMSubscribeWaterMarkCollectionItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADC63E472A49BEDD00854E02 /* KMSubscribeWaterMarkCollectionItem.xib */; };
 		ADC63E4D2A49BEDD00854E02 /* KMSubscribeWaterMarkCollectionItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADC63E472A49BEDD00854E02 /* KMSubscribeWaterMarkCollectionItem.xib */; };
-		ADCFFC0229C004AD007D3657 /* KMBookMarkTableRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADCFFC0129C004AD007D3657 /* KMBookMarkTableRowView.swift */; };
-		ADCFFC0329C004AD007D3657 /* KMBookMarkTableRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADCFFC0129C004AD007D3657 /* KMBookMarkTableRowView.swift */; };
-		ADCFFC0429C004AD007D3657 /* KMBookMarkTableRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADCFFC0129C004AD007D3657 /* KMBookMarkTableRowView.swift */; };
 		ADCFFC0629C04617007D3657 /* BOTA.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = ADCFFC0529C04617007D3657 /* BOTA.xcassets */; };
 		ADCFFC0729C04617007D3657 /* BOTA.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = ADCFFC0529C04617007D3657 /* BOTA.xcassets */; };
 		ADCFFC0829C04617007D3657 /* BOTA.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = ADCFFC0529C04617007D3657 /* BOTA.xcassets */; };
@@ -4595,12 +4598,6 @@
 		BBA19F3629ADACC5001A285A /* signPicture_nor.pdf in Resources */ = {isa = PBXBuildFile; fileRef = BBA19F3529ADACC5001A285A /* signPicture_nor.pdf */; };
 		BBA19F3729ADACC5001A285A /* signPicture_nor.pdf in Resources */ = {isa = PBXBuildFile; fileRef = BBA19F3529ADACC5001A285A /* signPicture_nor.pdf */; };
 		BBA19F3829ADACC5001A285A /* signPicture_nor.pdf in Resources */ = {isa = PBXBuildFile; fileRef = BBA19F3529ADACC5001A285A /* signPicture_nor.pdf */; };
-		BBA19F3F29ADE40A001A285A /* KMCellEmptyView.m in Sources */ = {isa = PBXBuildFile; fileRef = BBA19F3E29ADE40A001A285A /* KMCellEmptyView.m */; };
-		BBA19F4029ADE40A001A285A /* KMCellEmptyView.m in Sources */ = {isa = PBXBuildFile; fileRef = BBA19F3E29ADE40A001A285A /* KMCellEmptyView.m */; };
-		BBA19F4129ADE40A001A285A /* KMCellEmptyView.m in Sources */ = {isa = PBXBuildFile; fileRef = BBA19F3E29ADE40A001A285A /* KMCellEmptyView.m */; };
-		BBA19F4329ADE6A3001A285A /* KMBookMarkRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBA19F4229ADE6A2001A285A /* KMBookMarkRowView.swift */; };
-		BBA19F4429ADE6A3001A285A /* KMBookMarkRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBA19F4229ADE6A2001A285A /* KMBookMarkRowView.swift */; };
-		BBA19F4529ADE6A3001A285A /* KMBookMarkRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBA19F4229ADE6A2001A285A /* KMBookMarkRowView.swift */; };
 		BBA19F4729AE27DA001A285A /* KMAnnotationTableRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBA19F4629AE27DA001A285A /* KMAnnotationTableRowView.swift */; };
 		BBA19F4829AE27DA001A285A /* KMAnnotationTableRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBA19F4629AE27DA001A285A /* KMAnnotationTableRowView.swift */; };
 		BBA19F4929AE27DB001A285A /* KMAnnotationTableRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBA19F4629AE27DA001A285A /* KMAnnotationTableRowView.swift */; };
@@ -6048,6 +6045,12 @@
 		656C1E592CD0DF1B00295F82 /* KMConvertJsonWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMConvertJsonWindowController.swift; sourceTree = "<group>"; };
 		656C1E5D2CD0DFE900295F82 /* KMConvertJsonSettingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMConvertJsonSettingView.swift; sourceTree = "<group>"; };
 		656C1E612CD0DFF400295F82 /* KMConvertJsonSettingView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMConvertJsonSettingView.xib; sourceTree = "<group>"; };
+		657865EA2CE1E7DD00AFE2DB /* KMNBookmarkHanddler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMNBookmarkHanddler.swift; sourceTree = "<group>"; };
+		657865EB2CE1E7DD00AFE2DB /* KMBookMarkViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMBookMarkViewController.xib; sourceTree = "<group>"; };
+		657865EC2CE1E7DD00AFE2DB /* KMBookMarkViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMBookMarkViewController.swift; sourceTree = "<group>"; };
+		657865EE2CE1E7DD00AFE2DB /* KMBookMarkRowView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMBookMarkRowView.swift; sourceTree = "<group>"; };
+		657865EF2CE1E7DD00AFE2DB /* KMBookMarkTableRowView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMBookMarkTableRowView.swift; sourceTree = "<group>"; };
+		657865F22CE1E7DD00AFE2DB /* KMBookCellView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMBookCellView.swift; sourceTree = "<group>"; };
 		658FDBA82C9D4B3100EFA72E /* KMNoteReplyCellView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMNoteReplyCellView.swift; sourceTree = "<group>"; };
 		658FDBAC2C9D4B9600EFA72E /* KMNoteReplyCellView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMNoteReplyCellView.xib; sourceTree = "<group>"; };
 		658FDBB02C9D90CE00EFA72E /* KMNoteFilterStateCollevtionViewItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMNoteFilterStateCollevtionViewItem.swift; sourceTree = "<group>"; };
@@ -6063,7 +6066,6 @@
 		65D684052C6A250C003A532E /* KMWavyLineAnnotationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMWavyLineAnnotationController.swift; sourceTree = "<group>"; };
 		65D6840B2C6A3669003A532E /* KMEraserAnnotationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMEraserAnnotationController.swift; sourceTree = "<group>"; };
 		65D88ED12C85826A00DD06E0 /* KMRSAUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMRSAUtils.swift; sourceTree = "<group>"; };
-		65EEEB0E2CDD202F007EF295 /* KMNBookmarkHanddler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMNBookmarkHanddler.swift; sourceTree = "<group>"; };
 		65EF3A7C2C81C1F500CCFC8F /* KMVerificationRSA.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMVerificationRSA.swift; sourceTree = "<group>"; };
 		65FABB302C9AFB0C00AA92E5 /* KMSectionCellView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMSectionCellView.swift; sourceTree = "<group>"; };
 		65FABB342C9AFB1F00AA92E5 /* KMSectionCellView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMSectionCellView.xib; sourceTree = "<group>"; };
@@ -6071,7 +6073,6 @@
 		89316820296D73CC0073EA59 /* KMSignatureAnnotationViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KMSignatureAnnotationViewController.m; sourceTree = "<group>"; };
 		89316821296D73CC0073EA59 /* KMSignatureAnnotationViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMSignatureAnnotationViewController.xib; sourceTree = "<group>"; };
 		89316851296E45CA0073EA59 /* KMImageAccessoryController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMImageAccessoryController.xib; sourceTree = "<group>"; };
-		8942F7BA29222C7E00389627 /* KMBookCellView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBookCellView.swift; sourceTree = "<group>"; };
 		8942F7EE2926087200389627 /* KMSearchViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMSearchViewController.swift; sourceTree = "<group>"; };
 		8942F7EF2926087200389627 /* KMSearchViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMSearchViewController.xib; sourceTree = "<group>"; };
 		8942F7F62926089200389627 /* KMSignatureViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMSignatureViewController.swift; sourceTree = "<group>"; };
@@ -6092,8 +6093,6 @@
 		899700E728F3E4D3009AF911 /* MainWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindowController.xib; sourceTree = "<group>"; };
 		899700F428F4051B009AF911 /* KMAnnotationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMAnnotationViewController.swift; sourceTree = "<group>"; };
 		899700F528F4051B009AF911 /* KMAnnotationViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMAnnotationViewController.xib; sourceTree = "<group>"; };
-		899700FC28F40710009AF911 /* KMBookMarkViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBookMarkViewController.swift; sourceTree = "<group>"; };
-		899700FD28F40710009AF911 /* KMBookMarkViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMBookMarkViewController.xib; sourceTree = "<group>"; };
 		8997010428F4082C009AF911 /* KMFromViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMFromViewController.swift; sourceTree = "<group>"; };
 		8997010528F4082C009AF911 /* KMFromViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMFromViewController.xib; sourceTree = "<group>"; };
 		8997010C28F40842009AF911 /* KMOutlineViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMOutlineViewController.swift; sourceTree = "<group>"; };
@@ -6833,7 +6832,6 @@
 		ADC63E422A49817400854E02 /* KMSubscribeSuccessView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMSubscribeSuccessView.xib; sourceTree = "<group>"; };
 		ADC63E462A49BEDD00854E02 /* KMSubscribeWaterMarkCollectionItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMSubscribeWaterMarkCollectionItem.swift; sourceTree = "<group>"; };
 		ADC63E472A49BEDD00854E02 /* KMSubscribeWaterMarkCollectionItem.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMSubscribeWaterMarkCollectionItem.xib; sourceTree = "<group>"; };
-		ADCFFC0129C004AD007D3657 /* KMBookMarkTableRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBookMarkTableRowView.swift; sourceTree = "<group>"; };
 		ADCFFC0529C04617007D3657 /* BOTA.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = BOTA.xcassets; sourceTree = "<group>"; };
 		ADD1B6A92941E97F00C3FFF7 /* KMPrintWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPrintWindowController.swift; sourceTree = "<group>"; };
 		ADD1B6AA2941E97F00C3FFF7 /* KMPrintWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMPrintWindowController.xib; sourceTree = "<group>"; };
@@ -7793,9 +7791,6 @@
 		BBA00AC32B157C880043D903 /* KMToolbarZoomItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMToolbarZoomItemView.swift; sourceTree = "<group>"; };
 		BBA19F3129ADAC81001A285A /* signPicture_hover.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = signPicture_hover.pdf; sourceTree = "<group>"; };
 		BBA19F3529ADACC5001A285A /* signPicture_nor.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = signPicture_nor.pdf; sourceTree = "<group>"; };
-		BBA19F3D29ADE40A001A285A /* KMCellEmptyView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KMCellEmptyView.h; sourceTree = "<group>"; };
-		BBA19F3E29ADE40A001A285A /* KMCellEmptyView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KMCellEmptyView.m; sourceTree = "<group>"; };
-		BBA19F4229ADE6A2001A285A /* KMBookMarkRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBookMarkRowView.swift; sourceTree = "<group>"; };
 		BBA19F4629AE27DA001A285A /* KMAnnotationTableRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMAnnotationTableRowView.swift; sourceTree = "<group>"; };
 		BBA2108F29ACBFDA00E6B346 /* nosign.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = nosign.pdf; sourceTree = "<group>"; };
 		BBA2109329ACC10F00E6B346 /* signlist_add.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = signlist_add.pdf; sourceTree = "<group>"; };
@@ -8662,6 +8657,35 @@
 			path = Window;
 			sourceTree = "<group>";
 		};
+		657865E82CE1E7DD00AFE2DB /* Bookmark */ = {
+			isa = PBXGroup;
+			children = (
+				657865E92CE1E7DD00AFE2DB /* Tools */,
+				657865EB2CE1E7DD00AFE2DB /* KMBookMarkViewController.xib */,
+				657865EC2CE1E7DD00AFE2DB /* KMBookMarkViewController.swift */,
+				657865ED2CE1E7DD00AFE2DB /* View */,
+			);
+			path = Bookmark;
+			sourceTree = "<group>";
+		};
+		657865E92CE1E7DD00AFE2DB /* Tools */ = {
+			isa = PBXGroup;
+			children = (
+				657865EA2CE1E7DD00AFE2DB /* KMNBookmarkHanddler.swift */,
+			);
+			path = Tools;
+			sourceTree = "<group>";
+		};
+		657865ED2CE1E7DD00AFE2DB /* View */ = {
+			isa = PBXGroup;
+			children = (
+				657865EE2CE1E7DD00AFE2DB /* KMBookMarkRowView.swift */,
+				657865EF2CE1E7DD00AFE2DB /* KMBookMarkTableRowView.swift */,
+				657865F22CE1E7DD00AFE2DB /* KMBookCellView.swift */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
 		65AD98872CB615D200927779 /* ViewModel */ = {
 			isa = PBXGroup;
 			children = (
@@ -8718,14 +8742,6 @@
 			path = Controller;
 			sourceTree = "<group>";
 		};
-		65EEEB0C2CDD1E93007EF295 /* Tools */ = {
-			isa = PBXGroup;
-			children = (
-				65EEEB0E2CDD202F007EF295 /* KMNBookmarkHanddler.swift */,
-			);
-			path = Tools;
-			sourceTree = "<group>";
-		};
 		65EF3A7B2C81C1F500CCFC8F /* Tools */ = {
 			isa = PBXGroup;
 			children = (
@@ -8760,18 +8776,6 @@
 			path = Signature;
 			sourceTree = "<group>";
 		};
-		8942F7B52922148E00389627 /* View */ = {
-			isa = PBXGroup;
-			children = (
-				8942F7BA29222C7E00389627 /* KMBookCellView.swift */,
-				BBA19F4229ADE6A2001A285A /* KMBookMarkRowView.swift */,
-				BBA19F3D29ADE40A001A285A /* KMCellEmptyView.h */,
-				BBA19F3E29ADE40A001A285A /* KMCellEmptyView.m */,
-				ADCFFC0129C004AD007D3657 /* KMBookMarkTableRowView.swift */,
-			);
-			path = View;
-			sourceTree = "<group>";
-		};
 		8942F7EC2926084400389627 /* Search */ = {
 			isa = PBXGroup;
 			children = (
@@ -8925,7 +8929,6 @@
 				BB6BA4C32B0B4A0F00462CAE /* KMLeftSideEmptyFileViewController.swift */,
 				BB6BA4C72B0B4A4100462CAE /* KMLeftSideEmptyFileViewController.xib */,
 				899700F128F40308009AF911 /* Annotation */,
-				899700F228F40308009AF911 /* BookMarks */,
 				899700F028F40308009AF911 /* From */,
 				899700F328F40308009AF911 /* Outline */,
 				899700EF28F40308009AF911 /* Thumbnail */,
@@ -8976,17 +8979,6 @@
 			path = Annotation;
 			sourceTree = "<group>";
 		};
-		899700F228F40308009AF911 /* BookMarks */ = {
-			isa = PBXGroup;
-			children = (
-				65EEEB0C2CDD1E93007EF295 /* Tools */,
-				899700FC28F40710009AF911 /* KMBookMarkViewController.swift */,
-				899700FD28F40710009AF911 /* KMBookMarkViewController.xib */,
-				8942F7B52922148E00389627 /* View */,
-			);
-			path = BookMarks;
-			sourceTree = "<group>";
-		};
 		899700F328F40308009AF911 /* Outline */ = {
 			isa = PBXGroup;
 			children = (
@@ -15492,6 +15484,7 @@
 		F3EF17812CD5FC230007D364 /* Left */ = {
 			isa = PBXGroup;
 			children = (
+				657865E82CE1E7DD00AFE2DB /* Bookmark */,
 				F3EF17952CD5FDCB0007D364 /* ThumnailView */,
 				F3EF178D2CD5FD4B0007D364 /* KMNLeftSideViewController.swift */,
 				F3EF178E2CD5FD4B0007D364 /* KMNLeftSideViewController.xib */,
@@ -16002,6 +15995,7 @@
 				ADDF83502B391A5C00A81A4E /* CDSignatureCertificateCustomViewController.xib in Resources */,
 				F3A0F85C2CC940DD00E7373F /* KMNPDFInsertBlankWindowController.xib in Resources */,
 				9FA607E128FD4C9F00B46586 /* KMHomePopViewController.xib in Resources */,
+				657865F62CE1E7DD00AFE2DB /* KMBookMarkViewController.xib in Resources */,
 				AD1FE81A2BD7C98300AA4A9B /* KMPDFMultiplePrintWindowController.xib in Resources */,
 				655B91B92CCB47690080AE6E /* KMNPreView.xib in Resources */,
 				9F0CB4B82977BC1000007028 /* KMPropertiesPanelPreviewSubVC.xib in Resources */,
@@ -16285,7 +16279,6 @@
 				BBFE6E782930E53000142C01 /* KMMergePopoverViewController.xib in Resources */,
 				AD58F41A2B1DAC1500299EE0 /* KMPrintSettingView.xib in Resources */,
 				9F8539DA294318D600DF644E /* TabsImage.xcassets in Resources */,
-				8997010128F40710009AF911 /* KMBookMarkViewController.xib in Resources */,
 				BBE788A52CBD2463008086E2 /* SliderVC.xib in Resources */,
 				89E4E7382964148E002DBA6F /* KMAnnotationPropertiesViewController.xib in Resources */,
 				9F56648A2988B16F00020985 /* KMTextfieldVC.xib in Resources */,
@@ -16591,7 +16584,6 @@
 				AD1D481D2AFB6B96007AC1F0 /* KMMergeWindowController.xib in Resources */,
 				ADFCEB652B4FBFC50001EBAF /* ad_cancel_button00@2x.png in Resources */,
 				BB8AA53C2CC65C900084F183 /* KMNLinkMultiController.xib in Resources */,
-				8997010228F40710009AF911 /* KMBookMarkViewController.xib in Resources */,
 				BB19A7532CB7C710008204DC /* KMHistoryFileThumbItem.xib in Resources */,
 				BBFE6E69293097A600142C01 /* KMPageRangePickerWindowController.xib in Resources */,
 				652E95532C6914770061FA40 /* KMLineAndBorderItemView.xib in Resources */,
@@ -16986,6 +16978,7 @@
 				BBDF18192CD4853C00ACDB15 /* KMNWatermarkPropertyController.xib in Resources */,
 				BB3A429B2B4BC75D006D0642 /* NotesPanel.xib in Resources */,
 				BBB789B82BE8BF2400F7E09C /* AIChatDefaultTIpItem.xib in Resources */,
+				657865F72CE1E7DD00AFE2DB /* KMBookMarkViewController.xib in Resources */,
 				89316826296D73CC0073EA59 /* KMSignatureAnnotationViewController.xib in Resources */,
 				BB2EDF50296E63E5003BCF58 /* KMPageEditInsertCustomPageWindowController.xib in Resources */,
 				AD3AAD572B0D87E500DE5FE7 /* KMCompareThumbItem.xib in Resources */,
@@ -17375,6 +17368,7 @@
 				9F0CB4C22977C06300007028 /* KMPropertiesPanelColorSubVC.xib in Resources */,
 				9F080B19298CFDB300FC27DA /* KMTextImageButtonVC.xib in Resources */,
 				BBE788F22CBD2464008086E2 /* ModalVC.xib in Resources */,
+				657865F82CE1E7DD00AFE2DB /* KMBookMarkViewController.xib in Resources */,
 				AD3AAD202B0B5B4400DE5FE7 /* KMCompareCoveringWindowController.xib in Resources */,
 				BBFE6E842930EBD400142C01 /* KMCompressWindowController.xib in Resources */,
 				BB955EC12CD8E4600042FDE1 /* KMNWatermarkTemplateController.xib in Resources */,
@@ -17432,7 +17426,6 @@
 				BBFE14D42BFD7FC300176992 /* KMCouponDueWindowController.xib in Resources */,
 				BB5F8A1B29BB15AD00365ADB /* pic_mail.pdf in Resources */,
 				AD3AAD952B1034C000DE5FE7 /* KMHeaderFooterView.xib in Resources */,
-				8997010328F40710009AF911 /* KMBookMarkViewController.xib in Resources */,
 				9F00CCEF2A309E8E00AC462E /* KMEditImagePropertyViewController.xib in Resources */,
 				BB1B0B0C2B4FC6E900889528 /* KMGuideInfoWindow.xib in Resources */,
 				BB1B0AC42B4FC6E900889528 /* KMFunctionGuideWindowController.xib in Resources */,
@@ -17721,7 +17714,6 @@
 				654A5A8C2C8AE200001FBD4B /* KMAnalytics+KMExtensions.swift in Sources */,
 				AD3AAD382B0B7B1900DE5FE7 /* KMCompareToolbar.swift in Sources */,
 				F337CC1C2CC6456D00D46AF4 /* KMNThumbnailBaseViewController.swift in Sources */,
-				BBA19F4329ADE6A3001A285A /* KMBookMarkRowView.swift in Sources */,
 				ADFA8F092B579945002595A4 /* KMSearchFindView.swift in Sources */,
 				9F1FE51129407B4000E952CA /* KMFileSearchView.swift in Sources */,
 				BB897279294DFD1E0045787C /* KMWatermarkTextView.swift in Sources */,
@@ -17774,7 +17766,6 @@
 				BB986AEB2AD53AE800ADF172 /* KMInfoWindowController.swift in Sources */,
 				9F080B23298FCB0D00FC27DA /* KMDesignToken+Action.swift in Sources */,
 				9F1FE4B429406E4700E952CA /* CTBrowser.m in Sources */,
-				8942F7BB29222C7E00389627 /* KMBookCellView.swift in Sources */,
 				BBF98C342C0EE46200436CC7 /* KMToolbarCustomItemView.swift in Sources */,
 				BB8F4547295A9CDC0037EA22 /* KMHeaderFooterListController.swift in Sources */,
 				9F0CB5012986560D00007028 /* KMDesignToken+BorderTop.swift in Sources */,
@@ -17849,6 +17840,7 @@
 				AD015FB729AB484400A57062 /* KMLightMemberConfig.swift in Sources */,
 				BBD1F77C296F9BE000343885 /* KMPageEditSettingBaseWindowController.swift in Sources */,
 				BB52F58E2CC245AD007418DB /* KMLinkPopupEmailView.swift in Sources */,
+				657865F92CE1E7DD00AFE2DB /* KMBookMarkViewController.swift in Sources */,
 				BB2F184A2A0C911B0003F65E /* KMBaseWindowController.swift in Sources */,
 				BBC70EB02AEA80EC00AC1585 /* KMToolbarCustomWindowController.swift in Sources */,
 				BBB3FF982B567D0300145C4A /* KMApplication.swift in Sources */,
@@ -18109,7 +18101,6 @@
 				BB147014299DC0D100784A6A /* OIDAuthState.m in Sources */,
 				BB3AAB9029878CE000992A5A /* KMWatermarkAdjectivePropertyMainController.swift in Sources */,
 				BB147038299DC0D200784A6A /* OIDAuthorizationResponse.m in Sources */,
-				899700FE28F40710009AF911 /* KMBookMarkViewController.swift in Sources */,
 				BB2EDF6D296ECE17003BCF58 /* KMPageEditInsertDirectionItemView.swift in Sources */,
 				BB570ADF2B513A66005E7E4A /* KMLeftSideViewController+Snapshot.swift in Sources */,
 				BBB789AB2BE8BF2400F7E09C /* AIChatDefaultTIpItem.swift in Sources */,
@@ -18195,6 +18186,7 @@
 				89D9895E28FD21E6003A3E87 /* KMAnnotationCollectionView.swift in Sources */,
 				BB65A07C2AF8E5A4003A27A0 /* KMLineWell.swift in Sources */,
 				BBD1F793296FE92500343885 /* KMPageEditSplitSettingView.swift in Sources */,
+				657865FC2CE1E7DD00AFE2DB /* KMBookMarkRowView.swift in Sources */,
 				ADDF839E2B391A5D00A81A4E /* CDSignatureDrawViewController.swift in Sources */,
 				AD7D5CEC2B96B9D6006562CD /* KMBookmarkOutlineRowView.swift in Sources */,
 				BB897241294C028A0045787C /* KMWatermarkAdjectiveSegementControl.swift in Sources */,
@@ -18324,7 +18316,6 @@
 				AD055E4A2B72346E0035F824 /* KMBookmarkSheetView.swift in Sources */,
 				9F0CB4F9298655E500007028 /* KMDesignToken+Border.swift in Sources */,
 				9F0CB45F2966C9E200007028 /* KMFormPropertPanelViewController.swift in Sources */,
-				ADCFFC0229C004AD007D3657 /* KMBookMarkTableRowView.swift in Sources */,
 				ADF6B86C2A480C5F0090CB78 /* KMComparativeView.swift in Sources */,
 				BB1B0AF52B4FC6E900889528 /* KMConvertGuideView.swift in Sources */,
 				9FAAA339290F72CC0046FFCE /* KMHistoryFileCollectionView.swift in Sources */,
@@ -18465,6 +18456,7 @@
 				BBAFDA792B4CDE0000278BC3 /* KMPDFCropWindowController.swift in Sources */,
 				BB14702C299DC0D100784A6A /* OIDEndSessionRequest.m in Sources */,
 				BB5A9D672CB6521400F64C1F /* KMPDFSecToolbarController.swift in Sources */,
+				657866052CE1E7DD00AFE2DB /* KMBookCellView.swift in Sources */,
 				65AED4B32CAA55A8005C44B3 /* KMMergeViewModel.swift in Sources */,
 				9F0CB4A7296CF19600007028 /* KMPropertiesPanelListMenuSubVC.swift in Sources */,
 				BB4F7E8D2B0C7FE70077EC8C /* KMNoteColorCollectionViewItem.swift in Sources */,
@@ -18499,6 +18491,7 @@
 				AD7D5C852B8ECD83006562CD /* KMPDFSyncRecord.swift in Sources */,
 				9F1F82C3292F113A0092C4B4 /* KMHomeDragView.swift in Sources */,
 				9F080B14298CFDB300FC27DA /* KMTextImageButtonVC.swift in Sources */,
+				657865FF2CE1E7DD00AFE2DB /* KMBookMarkTableRowView.swift in Sources */,
 				BBB14A5F297929BD00936EDB /* KMRedactPageRangeWindowController.swift in Sources */,
 				BBB789842BE8BF2300F7E09C /* AIChatInfoManager.swift in Sources */,
 				ADA08A8A29F21A53009B2A7B /* KMPDFViewAnnotationOnceModeStore.swift in Sources */,
@@ -18578,7 +18571,6 @@
 				ADE86A8A2B02269400414DFA /* KMRemovePasswordWindowController.swift in Sources */,
 				BBFD225D2CBE16AB00DA4ABD /* KMHistoryEmptyView.swift in Sources */,
 				89D2D2C129495D2100BFF5FE /* KMFormModel.swift in Sources */,
-				BBA19F3F29ADE40A001A285A /* KMCellEmptyView.m in Sources */,
 				BB7185412C2B0AAF00C1156B /* KMEditPDFToolbarItemView.swift in Sources */,
 				BBE7891D2CBD2464008086E2 /* SegmentedVC.swift in Sources */,
 				89316822296D73CC0073EA59 /* KMSignatureAnnotationViewController.m in Sources */,
@@ -18797,7 +18789,6 @@
 				9F1FE4A229406E4700E952CA /* CTToolbarController.m in Sources */,
 				BB71854A2C2B0DC500C1156B /* KMEditPDFModel.swift in Sources */,
 				BB147041299DC0D200784A6A /* OIDClientMetadataParameters.m in Sources */,
-				65EEEB0F2CDD202F007EF295 /* KMNBookmarkHanddler.swift in Sources */,
 				ADDEEA6A2AD3CF3A00EF675D /* KMDrawSignatureView.swift in Sources */,
 				BBC8A7712B06408600FA9377 /* KMBotaSearchViewController.swift in Sources */,
 				BB1A34A8295EA30100B80B3E /* NSBitmapImageRep_SKExtensions.m in Sources */,
@@ -18942,6 +18933,7 @@
 				BB2EDF4C296E63E5003BCF58 /* KMPageEditInsertCustomPageWindowController.swift in Sources */,
 				9F0CB521298656AA00007028 /* KMDesignToken+BorderRadiusBottomLeft.swift in Sources */,
 				BB27BF3C2B33E85200A0BAAE /* CPDFView+KMExtension.swift in Sources */,
+				657865F32CE1E7DD00AFE2DB /* KMNBookmarkHanddler.swift in Sources */,
 				BBE0BDF329A22EF300440583 /* KMMainViewController+MenuAction.swift in Sources */,
 				BBF170582AE296B90013CE02 /* KMView.swift in Sources */,
 				BB4EEF382976451E003A3537 /* KMRedactContentBaseView.swift in Sources */,
@@ -19002,6 +18994,7 @@
 				BBD922302B50D60000DB9585 /* KMRateWindowController.swift in Sources */,
 				BB147009299DC0D100784A6A /* OIDRegistrationRequest.m in Sources */,
 				BBBB6CDB2AD15B900035AA66 /* CPDFFreeTextAnnotation+PDFListView.swift in Sources */,
+				657865FD2CE1E7DD00AFE2DB /* KMBookMarkRowView.swift in Sources */,
 				BBEFD01D2AF9E5AA003FABD8 /* KMBatchOperateAddHeaderFooterViewController.swift in Sources */,
 				BB853C642AF87428009C20C1 /* KMBatchOperateRemoveWatermarkViewController.swift in Sources */,
 				BB2C845B2BAE6DC100AF6142 /* KMLeftMethodMode.swift in Sources */,
@@ -19070,7 +19063,6 @@
 				BBE788D02CBD2463008086E2 /* InputDemoVC.swift in Sources */,
 				BB4F7E8E2B0C7FE70077EC8C /* KMNoteColorCollectionViewItem.swift in Sources */,
 				ADBC2CFB299CA6B9006280C8 /* KMPrintDuplexPrintingSetView.swift in Sources */,
-				BBA19F4429ADE6A3001A285A /* KMBookMarkRowView.swift in Sources */,
 				BB32BF242A5EA05900D11348 /* KMAnalytics.swift in Sources */,
 				9FCFEC812AD0E74C00EAD2CB /* KMPopMenuButtonCell.swift in Sources */,
 				BB89723B294B3C840045787C /* KMWatermarkPropertyController.swift in Sources */,
@@ -19182,6 +19174,7 @@
 				AD58F4202B1DC29100299EE0 /* KMPrintViewModel.swift in Sources */,
 				BB83B8ED2BA8415A00EFF584 /* KMPageEditExtractWindowController.swift in Sources */,
 				AD1FE8302BD7C98300AA4A9B /* KMBookletParameterModel.m in Sources */,
+				657865FA2CE1E7DD00AFE2DB /* KMBookMarkViewController.swift in Sources */,
 				BB65A0552AF8B90F003A27A0 /* KMDisplayPreferences.swift in Sources */,
 				BB74DA7C2AC41DE9006EDFE7 /* NSString+KMExtension.swift in Sources */,
 				BBB789912BE8BF2300F7E09C /* AITypeItemChooseView.swift in Sources */,
@@ -19313,6 +19306,7 @@
 				9F1FE4D029406E4700E952CA /* CTTabController.m in Sources */,
 				BBF729B42B19630500576AC5 /* KMAddBatesOperationQueue.swift in Sources */,
 				9F0CB4CA2986533F00007028 /* KMDesignToken+Sizing.swift in Sources */,
+				657866062CE1E7DD00AFE2DB /* KMBookCellView.swift in Sources */,
 				655B91B52CCB47420080AE6E /* KMNPreView.swift in Sources */,
 				9F8539DF29470A0700DF644E /* KMTabStripView.swift in Sources */,
 				AD055ECA2B8848400035F824 /* NSMenu_SKExtensions.m in Sources */,
@@ -19350,6 +19344,7 @@
 				BB61F2132B59120F00777E27 /* KMScroller.swift in Sources */,
 				BB73F2892C63147E00131EE7 /* KMUnbindAlertViewController.swift in Sources */,
 				9FCFEC992AD14EEF00EAD2CB /* KMMailHelper.swift in Sources */,
+				657866002CE1E7DD00AFE2DB /* KMBookMarkTableRowView.swift in Sources */,
 				AD055E542B73220A0035F824 /* KMBookmarkManager.swift in Sources */,
 				89E4E6ED2963D1B7002DBA6F /* KMColorPickerViewController.m in Sources */,
 				ADAFDA172AE8DD6600F084BC /* KMAdvertisementCollectionHeadView.swift in Sources */,
@@ -19507,7 +19502,6 @@
 				BB4583C02CC8C53C005737F3 /* KMPDFToolbarConfig.swift in Sources */,
 				AD5999432AD8DC2000412F8B /* KMDynamicStampViewController.swift in Sources */,
 				BBD1F794296FE92500343885 /* KMPageEditSplitSettingView.swift in Sources */,
-				899700FF28F40710009AF911 /* KMBookMarkViewController.swift in Sources */,
 				BB072D5F2C05AC8F00779B45 /* KMToolbarConfigViewItem.swift in Sources */,
 				F38FB9402CBA535C00F0DBA5 /* KMNHomeQuickToolManager.swift in Sources */,
 				9F3D818F29A22AD90087B5AD /* Date+KMExtensions.swift in Sources */,
@@ -19569,7 +19563,6 @@
 				BB0FE04D2B734DD1001E0F88 /* AIPurchaseWindowController.swift in Sources */,
 				BB8F4561295AA39F0037EA22 /* KMHeaderFooterObject.swift in Sources */,
 				BBFEF7142B3A766C00C28AC0 /* KMSystemMenu.swift in Sources */,
-				65EEEB102CDD202F007EF295 /* KMNBookmarkHanddler.swift in Sources */,
 				F39603E82CC641D2003C6F71 /* KMNThumbnailManager.swift in Sources */,
 				BBB9B326299A5D6D004F3235 /* GTMKeychain_macOS.m in Sources */,
 				BB4583C72CC91543005737F3 /* NSImage+Extension.swift in Sources */,
@@ -19630,7 +19623,6 @@
 				BB19A7582CB7C724008204DC /* KMHistoryFileListItem.swift in Sources */,
 				BB3A669F2B0752A800575343 /* KMTocOutlineView.swift in Sources */,
 				BB6719F62AD2C949003D44D5 /* CPDFRedactAnnotation+PDFListView.swift in Sources */,
-				ADCFFC0329C004AD007D3657 /* KMBookMarkTableRowView.swift in Sources */,
 				AD055E892B882E7F0035F824 /* SKBookmark.m in Sources */,
 				ADDEEA872AD7805200EF675D /* KMGeneralButton.swift in Sources */,
 				BB5BE4EE2B060E2F00D51BF2 /* KMLanguageViewController.swift in Sources */,
@@ -19721,6 +19713,7 @@
 				9FCFEC892AD0EF9900EAD2CB /* KMPopMenuButton.swift in Sources */,
 				653647C62CDCA5DE00CDB13E /* KMBatchOperateRightViewController.swift in Sources */,
 				ADDF836C2B391A5C00A81A4E /* DSignatureSaveTypeViewController.swift in Sources */,
+				657865F42CE1E7DD00AFE2DB /* KMNBookmarkHanddler.swift in Sources */,
 				BB7BC4D92AD3D6B700D6BEE6 /* PDFListView+KMExtensions.swift in Sources */,
 				BB6DD81929348A00001F0544 /* KMSecureEncryptComboBoxCellView.swift in Sources */,
 				BBC2BCC7295DA8F30036B983 /* KMCropPreviewController.swift in Sources */,
@@ -19829,7 +19822,6 @@
 				9F1FE4CD29406E4700E952CA /* CTTabContentsController.m in Sources */,
 				AD7D5CE52B96B394006562CD /* KMBookmarkOutlineSeparatorCellView.swift in Sources */,
 				ADDF83332B391A5C00A81A4E /* CPDFAnnotation+PDFListView.m in Sources */,
-				8942F7BC29222C7E00389627 /* KMBookCellView.swift in Sources */,
 				BB853C8B2AF8BC7D009C20C1 /* KMBatchAddPasswordOperation.swift in Sources */,
 				9FCFECA12AD17B8A00EAD2CB /* SKProgressController.swift in Sources */,
 				AD3AAD3D2B0B7B2900DE5FE7 /* KMCompareTextView.swift in Sources */,
@@ -19905,7 +19897,6 @@
 				BB8810772B4F785200AFA63E /* KMUnlockAlertViewController.m in Sources */,
 				89D2D2C229495D2100BFF5FE /* KMFormModel.swift in Sources */,
 				BB6DD815293486FA001F0544 /* KMSecureEncryptPasswordCellView.swift in Sources */,
-				BBA19F4029ADE40A001A285A /* KMCellEmptyView.m in Sources */,
 				BB19A7502CB7C710008204DC /* KMHistoryFileThumbItem.swift in Sources */,
 				89316823296D73CC0073EA59 /* KMSignatureAnnotationViewController.m in Sources */,
 				ADDF83422B391A5C00A81A4E /* DSignatureConfigWindowController.swift in Sources */,
@@ -20402,7 +20393,6 @@
 				ADAFDA2A2AE8DE1B00F084BC /* KMAdvertisementModelTransition.swift in Sources */,
 				9F3A48C72C8017FA0047F565 /* KMPurchaseEmbeddedWindowController.swift in Sources */,
 				ADC63E412A49816900854E02 /* KMSubscribeSuccessView.swift in Sources */,
-				BBA19F4529ADE6A3001A285A /* KMBookMarkRowView.swift in Sources */,
 				BBE789192CBD2464008086E2 /* ListVC.swift in Sources */,
 				9FDD0FAC29534FCC000C4DAD /* KMAliasLight.swift in Sources */,
 				651559242CCA6E3100C0F0D9 /* KMConvertPPTsWindowController.swift in Sources */,
@@ -20418,6 +20408,7 @@
 				F36AD77929642FE80015AD53 /* CPDFListView+UndoManager.m in Sources */,
 				BB234F092BA3D798008B3754 /* KMAIIconGuideView.swift in Sources */,
 				ADDF837F2B391A5D00A81A4E /* DSignatureDetailsViewController.swift in Sources */,
+				657866072CE1E7DD00AFE2DB /* KMBookCellView.swift in Sources */,
 				BBF98C362C0EE46200436CC7 /* KMToolbarCustomItemView.swift in Sources */,
 				BB853C8C2AF8BC7D009C20C1 /* KMBatchAddPasswordOperation.swift in Sources */,
 				BBB14A5D2978EBBE00936EDB /* KMRedactMutilPageFlagContentView.swift in Sources */,
@@ -20766,6 +20757,7 @@
 				65341C7E2C646C6400FE30F9 /* KMSearchReplaceHanddler.swift in Sources */,
 				BBC4F9EC2AEB58290098A1A8 /* KMAlertWindowController.swift in Sources */,
 				BB24FFE82B2863EF00A59054 /* KMTTSManager.swift in Sources */,
+				657865F52CE1E7DD00AFE2DB /* KMNBookmarkHanddler.swift in Sources */,
 				BB897248294C19980045787C /* KMWatermarkAdjectiveListController.swift in Sources */,
 				BB0947802C1A9E51005C4DEE /* KMPDFThumbBaseModel.swift in Sources */,
 				9FB220F92B186C9800A5B208 /* KMAnnotationGeneralViewController.swift in Sources */,
@@ -20914,7 +20906,6 @@
 				BB90E4F82AF3B71800B04B9F /* KMPDFWatermarkData.swift in Sources */,
 				9FF371CA2C69B857005F9CC5 /* CDistanceMeasureInfoWindowController.swift in Sources */,
 				ADC31FA82A0E0C1A00ED44A2 /* KMEditPropertyAlignmentView.swift in Sources */,
-				8997010028F40710009AF911 /* KMBookMarkViewController.swift in Sources */,
 				9F53D5512AD677A000CCF9D8 /* CPDFListViewConfig.swift in Sources */,
 				9FDD0F822952FC36000C4DAD /* KMDesignToken.swift in Sources */,
 				BB4F7E8F2B0C7FE70077EC8C /* KMNoteColorCollectionViewItem.swift in Sources */,
@@ -21008,7 +20999,6 @@
 				BB00301F298CB799002DD1A0 /* KMPreferenceManager.swift in Sources */,
 				BB89727B294DFD1E0045787C /* KMWatermarkTextView.swift in Sources */,
 				BB52F57F2CC24481007418DB /* KMLinkPopupBaseView.swift in Sources */,
-				BBA19F4129ADE40A001A285A /* KMCellEmptyView.m in Sources */,
 				BB981E572AD4F638001988CA /* KMPageIndicator.swift in Sources */,
 				BB2A98542B270B3300647AF3 /* KMBatchAddBackgroundOperation.swift in Sources */,
 				BB716D722CDDB73B009787ED /* KMHeaderFooterController.swift in Sources */,
@@ -21017,7 +21007,6 @@
 				BBEC00AA295BDECF00A26C98 /* KMHeaderFooterContentInfoView.swift in Sources */,
 				BB570ADD2B512C90005E7E4A /* KMLeftSideViewController+Thumbnail.swift in Sources */,
 				BBB14A552978DD5400936EDB /* KMRedactTools.swift in Sources */,
-				ADCFFC0429C004AD007D3657 /* KMBookMarkTableRowView.swift in Sources */,
 				BBEC00CE295C31F900A26C98 /* KMBatesModel.swift in Sources */,
 				BBF729B92B19632C00576AC5 /* KMRemoveBatesOperationQueue.swift in Sources */,
 				F3DB85F42CCA209600D0AFDE /* KMNBaseWindowController.swift in Sources */,
@@ -21081,6 +21070,7 @@
 				BBF729B52B19630500576AC5 /* KMAddBatesOperationQueue.swift in Sources */,
 				AD3AAD3E2B0B7B2900DE5FE7 /* KMCompareTextView.swift in Sources */,
 				AD7D5CB52B9070AF006562CD /* KMSyncDot.swift in Sources */,
+				657865FE2CE1E7DD00AFE2DB /* KMBookMarkRowView.swift in Sources */,
 				BB570AE12B513A66005E7E4A /* KMLeftSideViewController+Snapshot.swift in Sources */,
 				BB162E9D295073B50088E9D1 /* KMWatermarkManager.swift in Sources */,
 				BB1CA5C8298E20820059E31C /* KMPreferenceAligementView.swift in Sources */,
@@ -21330,6 +21320,7 @@
 				BBED0C2E2BBD569300511FAE /* KMAnnotationModel.swift in Sources */,
 				BB8810872B4F7C2200AFA63E /* KMVerificationAlertViewController.m in Sources */,
 				AD2D74B729F0D39500EDC5E4 /* KMCancellationSuccessView.swift in Sources */,
+				657866012CE1E7DD00AFE2DB /* KMBookMarkTableRowView.swift in Sources */,
 				BBF19E912B0B304C007154C8 /* KMStampCreaterWindowController.swift in Sources */,
 				BB716D5A2CDDB6F9009787ED /* KMHeaderTemplateItem.swift in Sources */,
 				653647CD2CDCA5DE00CDB13E /* KMBatchOperateBaseWindowController.swift in Sources */,
@@ -21348,7 +21339,6 @@
 				BB10F1E62B736F11008EAF7E /* FMTrackEventManager.swift in Sources */,
 				9F0CB51B2986568000007028 /* KMDesignToken+BorderRadiusTopRight.swift in Sources */,
 				BB1B0ACD2B4FC6E900889528 /* KMFunctionGuideWindowController.swift in Sources */,
-				8942F7BD29222C7E00389627 /* KMBookCellView.swift in Sources */,
 				9F1FE4C229406E4700E952CA /* NSWindow+CTThemed.m in Sources */,
 				AD5374A02C65E1E1002DE248 /* KMThumbnailCache.swift in Sources */,
 				BB03085E2CC7A40A00F4AAC7 /* KMPDFSideBarController.swift in Sources */,
@@ -21462,7 +21452,6 @@
 				ADAFDA4A2AEA7F1300F084BC /* KMAdvertisementShowView.swift in Sources */,
 				BB031B682C47BB080099F7AD /* KMUserFbListModel.swift in Sources */,
 				AD8F06192999DB5900D93CBC /* KMPrintDrawPage.swift in Sources */,
-				65EEEB112CDD202F007EF295 /* KMNBookmarkHanddler.swift in Sources */,
 				BB3A42A02B4BF03A006D0642 /* KMSystemPDFMenu.swift in Sources */,
 				AD1FE8342BD7C98300AA4A9B /* NSMutableArray+KMOddEvenPartFetch.m in Sources */,
 				BB52F55E2CC1FBF6007418DB /* KMLinkPageView.swift in Sources */,
@@ -21599,6 +21588,7 @@
 				8997011028F40842009AF911 /* KMOutlineViewController.swift in Sources */,
 				BB0353CA2B2987C40048A16C /* KMSnapshotWindow.swift in Sources */,
 				BB328B6C2B565BEC00B382C6 /* iVersion.m in Sources */,
+				657865FB2CE1E7DD00AFE2DB /* KMBookMarkViewController.swift in Sources */,
 				AD3AAD2E2B0B6FFA00DE5FE7 /* KMCompareCoveringView.swift in Sources */,
 				9FCFECAA2AD243C900EAD2CB /* KMBlankView.swift in Sources */,
 				ADDF83B22B391A5D00A81A4E /* KMDSignatureManager.m in Sources */,