Browse Source

【2025】【BOTA】书签列表 UI处理

tangchao 4 months ago
parent
commit
a9454c6b93

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

@@ -9,8 +9,12 @@ import Cocoa
 import PDFKit
 
 typealias KMBookMarkViewControllerBookMarkDidChange = (_ controller: KMBookMarkViewController, _ bookMarks: [KMBookMarkItem]) -> Void
-class KMBookMarkViewController: NSViewController, NSTextFieldDelegate {
 
+@objc protocol KMBookMarkViewControllerDelegate: NSObjectProtocol {
+    @objc optional func bkControllerAddAction(controller: KMBookMarkViewController)
+}
+
+class KMBookMarkViewController: KMNBaseViewController {
     @IBOutlet weak var addBookButton: NSButton!
     @IBOutlet weak var titleTextField: NSTextField!
     @IBOutlet weak var sortButton: NSButton!
@@ -26,19 +30,23 @@ class KMBookMarkViewController: NSViewController, NSTextFieldDelegate {
     var renameTextField: NSTextField!
     var renamePDFBook: KMBookMarkItem!
     var renameCellView: KMBookCellView!
-    var listView: CPDFListView!
-    let pdfView = PDFView.init()
+//    var listView: CPDFListView!
+    weak var document: CPDFDocument?
     
     var isLocalEvent: Bool = false //区分外部点击还是内部点击
     
     var selectItems: [KMBookMarkItem] = []
     
     var bookMarkDidChange: KMBookMarkViewControllerBookMarkDidChange?
+    
+    weak var delegate: KMBookMarkViewControllerDelegate?
+    
+    var handdler: KMNBookmarkHanddler?
     // 升序
     private var sortType_: KMSortMode = .ascending
     
-    deinit {
-        NotificationCenter.default.removeObserver(self)
+    convenience init() {
+        self.init(nibName: "KMBookMarkViewController", bundle: nil)
     }
     
     override func viewWillAppear() {
@@ -52,10 +60,8 @@ class KMBookMarkViewController: NSViewController, NSTextFieldDelegate {
         
         self.topSeplineView.wantsLayer = true
         self.topSeplineView.layer?.backgroundColor = NSColor.black.withAlphaComponent(0.1).cgColor
-        
-        if #available(macOS 11, *) {
-            self.bookTableView.style = NSTableView.Style.plain
-        }
+            
+        self.bookTableView.style = NSTableView.Style.plain
         self.bookTableView.allowsMultipleSelection = true
         self.bookTableView.doubleAction = #selector(renameBookAction)
 //        self.bookTableView.selectionHighlightStyle = NSTableView.SelectionHighlightStyle.none;
@@ -65,8 +71,6 @@ class KMBookMarkViewController: NSViewController, NSTextFieldDelegate {
         
         self.refreshUI()
         self.reloadData()
-        
-        self.initNotification()
     }
     
     func refreshUI() {
@@ -90,7 +94,7 @@ class KMBookMarkViewController: NSViewController, NSTextFieldDelegate {
     }
     
     func reloadData() {
-        let array = self.listView.document.bookmarks() ?? [CPDFBookmark]()
+        let array = document?.bookmarks() ?? [CPDFBookmark]()
         var bookMarks: [KMBookMarkItem] = []
         for bookMark in array {
             let item = KMBookMarkItem()
@@ -124,15 +128,13 @@ class KMBookMarkViewController: NSViewController, NSTextFieldDelegate {
         }
     }
     
-    func initNotification() {
+    override func addNotifations() {
+        super.addNotifations()
+
         NotificationCenter.default.addObserver(self, selector: #selector(KMPDFViewCurrentPageDidChangedNotification), name: NSNotification.Name.init(rawValue: "KMPDFViewCurrentPageDidChanged"), object: nil)
         NotificationCenter.default.addObserver(self, selector: #selector(documentPageCountChangedNotification), name: NSNotification.Name.init(rawValue: "CPDFDocumentPageCountChangedNotification"), object: nil)
     }
     
-    func removeNotification() {
-        NotificationCenter.default.removeObserver(self)
-    }
-    
     private func addMenuTitle(view: NSView, event: NSEvent) {
         let menus : NSMenu = NSMenu(title: "")
         menus.delegate = self
@@ -171,33 +173,17 @@ class KMBookMarkViewController: NSViewController, NSTextFieldDelegate {
     }
     
     @IBAction func addBookmarkAction(_ sender: Any) {
-//        if self.listView.document.bookmark(forPageIndex: UInt(self.listView.currentPageIndex)) == nil {
-//            let label = "\(NSLocalizedString("Page", comment:"")) \(self.listView.currentPageIndex + 1)"
-//            let bookMark = KMBookMarkItem()
-//            bookMark.label = label
-//            bookMark.index = UInt(self.listView.currentPageIndex)
-//            self.addBookMark(bookMarks: [bookMark])
-//        } else {
-//            let bookMark = self.listView.document.bookmark(forPageIndex: UInt(self.listView.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
-//            }
-//        }
+        delegate?.bkControllerAddAction?(controller: self)
+        handdler?.addCurrentBookmark()
         
-        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)
+//        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)
     }
     
     @objc func changeLocationAction() {
@@ -213,7 +199,7 @@ class KMBookMarkViewController: NSViewController, NSTextFieldDelegate {
                 let bookMark = KMBookMarkItem()
                 bookMark.bookMark = item.bookMark
                 bookMark.label = item.label
-                bookMark.index = UInt(self.listView.currentPageIndex)
+//                bookMark.index = UInt(self.listView.currentPageIndex)
                 self.changeLocation(oldBookMark: item,
                                     newBookMark: bookMark)
             }
@@ -259,15 +245,15 @@ class KMBookMarkViewController: NSViewController, NSTextFieldDelegate {
     @objc func KMPDFViewCurrentPageDidChangedNotification(notification: NSNotification) {
         if notification.object is CPDFDocument {
             let pdfdocument : CPDFDocument = notification.object as! CPDFDocument
-            if pdfdocument.isEqual(self.listView.document) {
+            if pdfdocument.isEqual(document) {
                 if !isLocalEvent {
                     var containSelIndex:Bool = false
                     for (index, value) in self.dataSource.enumerated() {
-                        if value.bookMark == self.listView.document.bookmark(forPageIndex: UInt(self.listView.currentPageIndex)) {
+//                        if value.bookMark == document?.bookmark(forPageIndex: UInt(self.listView.currentPageIndex)) {
                             containSelIndex = true
                             self.didSelectItem(row: index, event: NSEvent())
                             break
-                        }
+//                        }
                     }
                     if !containSelIndex {
                         self.cancelSelect()
@@ -283,7 +269,7 @@ class KMBookMarkViewController: NSViewController, NSTextFieldDelegate {
         if notification.object is CPDFDocument {
             DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.3) { [weak self] in
                 let pdfdocument : CPDFDocument = notification.object as! CPDFDocument
-                if pdfdocument.isEqual(self?.listView?.document) {
+                if pdfdocument.isEqual(self?.document) {
                     self?.reloadData()
                 }
             }
@@ -303,8 +289,11 @@ class KMBookMarkViewController: NSViewController, NSTextFieldDelegate {
             self.bookTableView.backgroundColor = NSColor.km_init(hex: "#F7F8FA")
         }
     }
-    
-    //MARK: - NSTextFieldDelegate
+}
+
+// MARK: - NSTextFieldDelegate
+
+extension KMBookMarkViewController: NSTextFieldDelegate {
     func controlTextDidEndEditing(_ obj: Notification) {
         if (self.renameTextField.isEqual(obj.object)) {
             let textField : NSTextField = obj.object as! NSTextField
@@ -314,6 +303,8 @@ class KMBookMarkViewController: NSViewController, NSTextFieldDelegate {
     }
 }
 
+// MARK: - NSTableViewDelegate,NSTableViewDataSource
+
 extension KMBookMarkViewController : NSTableViewDelegate,NSTableViewDataSource {
     func numberOfRows(in tableView: NSTableView) -> Int {
         let count = self.dataSource?.count ?? 0
@@ -337,7 +328,7 @@ extension KMBookMarkViewController : NSTableViewDelegate,NSTableViewDataSource {
             } else {
                 cell.dateLabel.stringValue = ""
             }
-            if let page = self.listView.document.page(at: UInt(item.bookMark.pageIndex)) {
+            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
@@ -471,7 +462,7 @@ extension KMBookMarkViewController : NSTableViewDelegate,NSTableViewDataSource {
             self.bookTableView.selectedRowIndexes.first! < self.dataSource.count {
             let index = self.bookTableView.selectedRowIndexes.first
             let selectBookMark = self.dataSource[index!]
-            self.listView.go(toPageIndex: selectBookMark.bookMark.pageIndex, animated: true)
+//            self.listView.go(toPageIndex: selectBookMark.bookMark.pageIndex, animated: true)
         }
     }
     
@@ -494,11 +485,11 @@ extension KMBookMarkViewController : NSTableViewDelegate,NSTableViewDataSource {
     }
     
     func canAddBorkMark() -> Bool {
-        if self.listView.document.bookmarks() != nil && self.listView.document.bookmarks()?.count != 0 {
-            for bookMark in self.listView.document.bookmarks() {
-                if bookMark.pageIndex == self.listView.currentPageIndex {
-                    return false
-                }
+        if document?.bookmarks() != nil && document?.bookmarks()?.count != 0 {
+            for bookMark in document?.bookmarks() ?? [] {
+//                if bookMark.pageIndex == self.listView.currentPageIndex {
+//                    return false
+//                }
             }
         }
         return true
@@ -526,18 +517,19 @@ extension KMBookMarkViewController : NSTableViewDelegate,NSTableViewDataSource {
     }
 }
 
-//MARK: undoRedo
+//MARK: - undoRedo
+
 extension KMBookMarkViewController {
     func changeLocation(oldBookMark: KMBookMarkItem, newBookMark: KMBookMarkItem) {
-        self.listView.document.removeBookmark(forPageIndex: oldBookMark.index)
-        self.listView.document.addBookmark(newBookMark.label, forPageIndex: newBookMark.index)
+        document?.removeBookmark(forPageIndex: oldBookMark.index)
+        document?.addBookmark(newBookMark.label, forPageIndex: newBookMark.index)
         
-        self.reloadData()
-        self.listView.setNeedsDisplayForVisiblePages()
+        reloadData()
+//        self.listView.setNeedsDisplayForVisiblePages()
         
-        self.listView.undoManager?.registerUndo(withTarget: self) { [unowned self] targetType in
-            self.changeLocation(oldBookMark: newBookMark, newBookMark: oldBookMark)
-        }
+//        self.listView.undoManager?.registerUndo(withTarget: self) { [unowned self] targetType in
+//            self.changeLocation(oldBookMark: newBookMark, newBookMark: oldBookMark)
+//        }
     }
     
     func renamePDFBook(bookmark : KMBookMarkItem! , label:String) {
@@ -553,27 +545,27 @@ extension KMBookMarkViewController {
         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)
-        }
+//        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]) {
         for bookMark in bookMarks {
-            if self.listView.document.removeBookmark(forPageIndex: bookMark.index) {
+            if ((document?.removeBookmark(forPageIndex: bookMark.index)) != nil) {
                 KMPrint("删除标签成功")
             }
         }
-        self.listView.setNeedsDisplayForVisiblePages()
+//        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)
-        }
+//        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 }
         
@@ -582,16 +574,16 @@ extension KMBookMarkViewController {
     
     func addBookMark(bookMarks: [KMBookMarkItem]) {
         for bookMark in bookMarks {
-            self.listView.document.addBookmark(bookMark.label, forPageIndex: UInt(bookMark.index))
+            document?.addBookmark(bookMark.label, forPageIndex: UInt(bookMark.index))
         }
-        self.listView.setNeedsDisplayForVisiblePages()
+//        self.listView.setNeedsDisplayForVisiblePages()
         self.reloadData()
         
         if bookMarks.count == 1 {
-            DispatchQueue.main.async {
-                if self.listView.document.bookmark(forPageIndex: UInt(bookMarks.first!.index)) != nil {
+            DispatchQueue.main.async { [self] in
+                if document?.bookmark(forPageIndex: UInt(bookMarks.first!.index)) != nil {
                     let item = KMBookMarkItem()
-                    item.bookMark = self.listView.document.bookmark(forPageIndex: UInt(bookMarks.first!.index))
+                    item.bookMark = (document?.bookmark(forPageIndex: UInt(bookMarks.first!.index)))!
                     item.label = item.bookMark.label
                     item.index = UInt(item.bookMark.pageIndex)
                     self.addBookMarkAndEdit(newBookMark: item)
@@ -601,10 +593,10 @@ 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)
-        }
+//        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 }
         
@@ -612,26 +604,28 @@ extension KMBookMarkViewController {
     }
     
     @IBAction func undo(_ sender: Any) {
-        if (self.listView.undoManager?.canUndo ?? false) {
-            self.listView.undoManager?.undo()
-        }
+//        if (self.listView.undoManager?.canUndo ?? false) {
+//            self.listView.undoManager?.undo()
+//        }
     }
     
     @IBAction func redo(_ sender: Any) {
-        if (self.listView.undoManager?.canRedo ?? false) {
-            self.listView.undoManager?.redo()
-        }
+//        if (self.listView.undoManager?.canRedo ?? false) {
+//            self.listView.undoManager?.redo()
+//        }
     }
 }
 
+// MARK: - NSMenuDelegate, NSMenuItemValidation
+
 extension KMBookMarkViewController: NSMenuDelegate, NSMenuItemValidation {
     func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
         let action = menuItem.action
         if (action == #selector(undo)) {
-            return self.listView.undoManager?.canUndo ?? false
+//            return self.listView.undoManager?.canUndo ?? false
         }
         if (action == #selector(redo)) {
-            return self.listView.undoManager?.canRedo ?? false
+//            return self.listView.undoManager?.canRedo ?? false
         }
         
         if action == #selector(renameBookAction) ||

+ 41 - 0
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/BookMarks/Tools/KMNBookmarkHanddler.swift

@@ -0,0 +1,41 @@
+//
+//  KMNBookmarkHanddler.swift
+//  PDF Reader Pro
+//
+//  Created by User-Tangchao on 2024/11/8.
+//
+
+import Cocoa
+
+class KMNBookmarkHanddler: NSObject {
+    weak var pdfView: CPDFView?
+    
+    convenience init(pdfView: CPDFView) {
+        self.init()
+        
+        self.pdfView = pdfView
+    }
+    
+    func addCurrentBookmark() {
+        let currentPageIndex = self.pdfView?.currentPageIndex ?? 0
+        
+        if self.pdfView?.document?.bookmark(forPageIndex: UInt(currentPageIndex)) == nil {
+            let label = "\(NSLocalizedString("Page", comment:"")) \(currentPageIndex + 1)"
+            let bookMark = KMBookMarkItem()
+            bookMark.label = label
+            bookMark.index = UInt(currentPageIndex)
+//            self.addBookMark(bookMarks: [bookMark])
+        } else {
+//            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
+//            }
+        }
+    }
+}

+ 2 - 2
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/KMLeftSideViewController.swift

@@ -624,11 +624,11 @@ class KMLeftSideViewController: KMSideViewController {
         if self.bookmarkViewC == nil {
             let viewC = KMBookMarkViewController(nibName: "KMBookMarkViewController", bundle: nil)
             self.bookmarkViewC = viewC
-            self.bookmarkViewC?.listView = self.listView
+//            self.bookmarkViewC?.listView = self.listView
         }
         if let view = self.bookmarkViewC?.view {
             self.bookmarkViewC?.view.isHidden = false
-            self.bookmarkViewC?.listView = self.listView
+//            self.bookmarkViewC?.listView = self.listView
             self.replaceSideView(view, animate: false)
             
             self.bookmarkViewC?.reloadData()

+ 21 - 52
PDF Office/PDF Master/KMClass/ImageToPDF/Controller/KMBatchOperateImageToPDFViewController.swift

@@ -8,7 +8,7 @@
 import Cocoa
 import KMComponentLibrary
 
-class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController, KMImageToPDFMethodDelegate, NSPopoverDelegate{
+class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController {
     @IBOutlet weak var headerBox: NSBox!
     @IBOutlet weak var titleLabel: NSTextField!
     @IBOutlet weak var headerBottomLine: ComponentDivider!
@@ -58,34 +58,19 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
     
     private var createNewPDFRadio_: ComponentRadio = {
         let view = ComponentRadio()
-        view.properties = ComponentCheckBoxProperty(size: .s,
-                                                               state: .normal,
-                                                               isDisabled: false,
-                                                               showhelp: false,
-                                                               text: NSLocalizedString("New PDF Document", comment: ""),
-                                                               checkboxType: .normal)
+        view.properties = ComponentCheckBoxProperty(size: .s, state: .normal,  isDisabled: false, showhelp: false, text: NSLocalizedString("New PDF Document", comment: ""), checkboxType: .normal)
         return view
     }()
     
     private lazy var mergeAllCheckBox_: ComponentCheckBox = {
         let view = ComponentCheckBox()
-        view.properties = ComponentCheckBoxProperty(size: .s,
-                                                                state: .normal,
-                                                                isDisabled: false,
-                                                                showhelp: false,
-                                                                text: NSLocalizedString("Merge All", comment: ""),
-                                                                checkboxType: .normal)
+        view.properties = ComponentCheckBoxProperty(size: .s, state: .normal,   isDisabled: false, showhelp: false, text: NSLocalizedString("Merge All", comment: ""),checkboxType: .normal)
         return view
     }()
     
     private var appendRadio_: ComponentRadio = {
         let view = ComponentRadio()
-        view.properties = ComponentCheckBoxProperty(size: .s,
-                                                               state: .normal,
-                                                               isDisabled: false,
-                                                               showhelp: false,
-                                                               text: NSLocalizedString("Append To Existing File", comment: ""),
-                                                               checkboxType: .normal)
+        view.properties = ComponentCheckBoxProperty(size: .s, state: .normal, isDisabled: false, showhelp: false, text: NSLocalizedString("Append To Existing File", comment: ""), checkboxType: .normal)
         return view
     }()
     
@@ -97,50 +82,27 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
     
     private lazy var ocrCheckBox_: ComponentCheckBox = {
         let view = ComponentCheckBox()
-        view.properties = ComponentCheckBoxProperty(size: .s,
-                                                                state: .normal,
-                                                                isDisabled: false,
-                                                                showhelp: false,
-                                                                text: NSLocalizedString("Recognize text if needed", comment: ""),
-                                                                checkboxType: .normal)
+        view.properties = ComponentCheckBoxProperty(size: .s, state: .normal, isDisabled: false, showhelp: false, text: NSLocalizedString("Recognize text if needed", comment: ""), checkboxType: .normal)
         return view
     }()
     
     private lazy var languageView_: ComponentSelect = {
         let view = ComponentSelect()
         
-        view.properties = ComponentSelectProperties(size: .s,
-                                                                state: .normal,
-                                                                isDisabled: false,
-                                                                isError: false,
-                                                                leftIcon: false,
-                                                                placeholder: nil,
-                                                                errorText: nil,
-                                                                creatable: false,
-                                                                text: KMLocalizedString("", comment: ""))
+        view.properties = ComponentSelectProperties(size: .s, state: .normal, isDisabled: false, isError: false, leftIcon: false, placeholder: nil, errorText: nil, creatable: false, text: KMLocalizedString("", comment: ""))
 //        view.delegate = self
         return view
     }()
     
     private var ocrPlanRadio_: ComponentRadio = {
         let view = ComponentRadio()
-        view.properties = ComponentCheckBoxProperty(size: .s,
-                                                               state: .normal,
-                                                               isDisabled: false,
-                                                               showhelp: true,
-                                                               text: KMLocalizedString("OCR Plan 1-Online", comment: ""),
-                                                               checkboxType: .normal)
+        view.properties = ComponentCheckBoxProperty(size: .s, state: .normal, isDisabled: false, showhelp: true, text: KMLocalizedString("OCR Plan 1-Online", comment: ""), checkboxType: .normal)
         return view
     }()
     
     private var ocrPlanRadio2_: ComponentRadio = {
         let view = ComponentRadio()
-        view.properties = ComponentCheckBoxProperty(size: .s,
-                                                               state: .normal,
-                                                               isDisabled: false,
-                                                               showhelp: true,
-                                                               text: KMLocalizedString("OCR Plan 2-Online", comment: ""),
-                                                               checkboxType: .normal)
+        view.properties = ComponentCheckBoxProperty(size: .s, state: .normal, isDisabled: false, showhelp: true, text: KMLocalizedString("OCR Plan 2-Online", comment: ""), checkboxType: .normal)
         return view
     }()
     
@@ -152,12 +114,7 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
     
     private lazy var extractTextCheckBox_: ComponentCheckBox = {
         let view = ComponentCheckBox()
-        view.properties = ComponentCheckBoxProperty(size: .s,
-                                                                state: .normal,
-                                                                isDisabled: false,
-                                                                showhelp: false,
-                                                                text: KMLocalizedString("Extract Text (.txt)", comment: ""),
-                                                                checkboxType: .normal)
+        view.properties = ComponentCheckBoxProperty(size: .s, state: .normal, isDisabled: false, showhelp: false, text: KMLocalizedString("Extract Text (.txt)", comment: ""), checkboxType: .normal)
         return view
     }()
     
@@ -838,3 +795,15 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
         
     }
 }
+
+// MAKR: - NSPopoverDelegate
+
+extension KMBatchOperateImageToPDFViewController: NSPopoverDelegate {
+    
+}
+
+// MARK: - KMImageToPDFMethodDelegate
+
+extension KMBatchOperateImageToPDFViewController: KMImageToPDFMethodDelegate {
+    
+}

+ 2 - 1
PDF Office/PDF Master/KMClass/KMPDFViewController/KMMainViewController.swift

@@ -338,7 +338,8 @@ import KMComponentLibrary
         } else if pdfSideBarType == .outline {
             KMPrint(" outline")
         } else if pdfSideBarType == .bookmark {
-            KMPrint(" bookmark")
+            botaViewController?.bookmarkViewC.handdler = KMNBookmarkHanddler(pdfView: self.listView)
+            botaViewController?.leftsideType = pdfSideBarType
         } else if pdfSideBarType == .annotation {
             KMPrint(" annotation")
         }

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

@@ -26,10 +26,24 @@ class KMNLeftSideViewController: KMNBaseViewController {
     
     @IBOutlet var bottomBox: NSBox!
     
+    @IBOutlet weak var headerBoxHeightConst: NSLayoutConstraint!
+    
     private var currentDocument:CPDFDocument?
     
     public var thumnailViewController:KMNThumnailViewController?
     
+    private lazy var bookmarkViewC_: KMBookMarkViewController = {
+        let controller = KMBookMarkViewController()
+        controller.delegate = self
+        return controller
+    }()
+    
+    var bookmarkViewC: KMBookMarkViewController {
+        get {
+            return bookmarkViewC_
+        }
+    }
+    
     lazy var thumbnailHeaderViewController: KMNThumnailHeaderViewController = {
         let controller = KMNThumnailHeaderViewController(nibName: "KMNThumnailHeaderViewController", bundle: nil)
         controller.view.frame = headerBox.bounds
@@ -42,10 +56,15 @@ class KMNLeftSideViewController: KMNBaseViewController {
             switch leftsideType {
             case .search: break
             case .thumbnail:
+                headerBoxHeightConst.constant = 40
                 headerBox.contentView = thumbnailHeaderViewController.view
                 bottomBox.contentView = thumnailViewController?.view
-            case .bookmark:  break
-                
+            case .bookmark:
+                headerBoxHeightConst.constant = 0
+
+                bottomBox.contentView = bookmarkViewC_.view
+                bookmarkViewC_.document = currentDocument
+                bookmarkViewC_.reloadData()
             case .outline: break
                 
             case .annotation: break
@@ -114,3 +133,9 @@ extension KMNLeftSideViewController: KMNThumnailViewControllerDelegate {
         leftSideViewDelegate?.enterPageEditLeftSideViewController?(leftSideViewController: self)
     }
 }
+
+extension KMNLeftSideViewController: KMBookMarkViewControllerDelegate {
+    func bkControllerAddAction(controller: KMBookMarkViewController) {
+
+    }
+}

+ 1 - 0
PDF Office/PDF Master/KMClass/Left/KMNLeftSideViewController.xib

@@ -11,6 +11,7 @@
                 <outlet property="backContentBox" destination="pFl-GZ-yuD" id="Adt-dh-8x2"/>
                 <outlet property="bottomBox" destination="mTI-Gn-UZ3" id="I5w-TH-3UZ"/>
                 <outlet property="headerBox" destination="bvR-aB-khj" id="q9C-8d-dvX"/>
+                <outlet property="headerBoxHeightConst" destination="GiU-ai-IGa" id="LOM-nJ-YLi"/>
                 <outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
             </connections>
         </customObject>

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

@@ -245,6 +245,9 @@
 		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 */; };
@@ -6066,6 +6069,7 @@
 		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>"; };
@@ -8722,6 +8726,14 @@
 			path = Controller;
 			sourceTree = "<group>";
 		};
+		65EEEB0C2CDD1E93007EF295 /* Tools */ = {
+			isa = PBXGroup;
+			children = (
+				65EEEB0E2CDD202F007EF295 /* KMNBookmarkHanddler.swift */,
+			);
+			path = Tools;
+			sourceTree = "<group>";
+		};
 		65EF3A7B2C81C1F500CCFC8F /* Tools */ = {
 			isa = PBXGroup;
 			children = (
@@ -8975,6 +8987,7 @@
 		899700F228F40308009AF911 /* BookMarks */ = {
 			isa = PBXGroup;
 			children = (
+				65EEEB0C2CDD1E93007EF295 /* Tools */,
 				899700FC28F40710009AF911 /* KMBookMarkViewController.swift */,
 				899700FD28F40710009AF911 /* KMBookMarkViewController.xib */,
 				8942F7B52922148E00389627 /* View */,
@@ -18841,6 +18854,7 @@
 				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 */,
@@ -19612,6 +19626,7 @@
 				BB0FE04D2B734DD1001E0F88 /* AIPurchaseWindowController.swift in Sources */,
 				BB8F4561295AA39F0037EA22 /* KMHeaderFooterModel.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 */,
@@ -21509,6 +21524,7 @@
 				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 */,