//
//  KMToolbarViewController.swift
//  PDF Reader Pro
//
//  Created by lxy on 2022/12/2.
//

import Cocoa

@objc enum KMToolbarViewType : Int {
    case None
    case Main
    case Annatiton
    case Page
    case Conversion
    case ScanOCR
    case editPDF
    case Form
    case FillSign
    case Tool
    case redact
    case Move
    case Magnify
    case Select
    case SelectZoom
    case LeftPanel
    case RightPanel
    case viewSetting
    case AITools
    
    func isToolMode() -> Bool {
        return (self == .Move || self == .Magnify || self == .Select || self == .SelectZoom)
    }
    
    func itemIdentifier() -> String {
        if (self == .Annatiton) {
            return KMDocumentAnnotationToolbarItemIdentifier
        } else if (self == .Page) {
            return KMDocumentPageToolbarItemIdentifier
        } else if (self == .Conversion) {
            return KMDocumentConversonToolbarItemIdentifier
        } else if (self == .ScanOCR) {
            return KMDocumentScanOCRToolbarItemIdentifier
        } else if (self == .editPDF) {
            return KMDocumentEditToolbarItemIdentifier
        } else if (self == .Form) {
            return KMDocumentFormToolbarItemIdentifier
        } else if (self == .FillSign) {
            return KMDocumentFillSginToolbarItemIdentifier
        } else if (self == .Tool) {
            return KMDocumentToolToolbarItemIdentifier
        } else if (self == .Move) {
            return KMToolbarMoveToolModeItemIdentifier
        } else if (self == .Magnify) {
            return KMToolbarMagnifyToolModeItemIdentifier
        } else if (self == .Select) {
            return KMToolbarSelectToolModeItemIdentifier
        } else if (self == .SelectZoom) {
            return KMToolbarZoomToSelectionItemIdentifier
        } else if (self == .LeftPanel) {
            return KMLeftControlToolbarItemIdentifier
        } else if (self == .RightPanel) {
            return KMRightControlToolbarItemIdentifier
        } else if (self == .AITools) {
            return KMDocumentAIToolsToolbarItemIdentifier
        }
        return ""
    }
}

@objc enum KMToolbarType: Int {
    /// conversion
    case word = 3000
    case excel = 3001
    case ppt = 3002
    case rtf = 3003
    case csv = 3004
    case html = 3005
    case conversion_text = 3006
    case conversion_image = 3007
    
    /// tool
    case compress = 8000
    case merge = 8001
    case fileCompare = 8002
    case secure = 8003
    case redact = 8004
    case watermark = 8005
    case background = 8006
    case headerAndFooter = 8007
    case bates = 8008
    case crop = 8009
    case comparison = 8010
    case aiTools = 8011
}

@objc protocol KMToolbarViewControllerDelegate {
    @objc optional func changeAnnotationModeAction(item:KMToolbarClickButton)
    @objc optional func showPDFLayoutModeAction(show:Bool)
    @objc optional func changePDFViewZoomInAction()
    @objc optional func changePDFViewZoomOutAction()
    @objc optional func changePDFViewGotoNextPageAction()
    @objc optional func changePDFViewGoToPreviousPageAction()
    @objc optional func changePDFViewGotoBackAction()
    @objc optional func changePDFViewGoToForwardAction()
    @objc optional func aiTranslationPDFFileAction()
    @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, zoomSting : String)
    @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, zoomModel selectedTag:Int)
    @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, shareAction toolbarItem: KMToolbarItemView)
    @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, shareDocument item:NSMenuItem)
    @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, shareFlatten item:NSMenuItem)
    @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, shareOriginalPDF item:NSMenuItem)
    @objc optional func toolbarViewController(_ viewController: KMToolbarViewController, clickMode toolMode: KMToolbarViewType, toolbar toolbarItem: KMToolbarItemView, _ pages: [Int])
    @objc optional func toolbarViewController(_ viewController: KMToolbarViewController, clickChaildToolType: KMToolbarType, toolbar toolbarItem: KMToolbarItemView)
    @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, scanOCRModel selectedTag:Int)
    
    @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, itemDidClick toolbarItem: KMToolbarItemView)
    @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, searchAction searchString: String, forward: Bool)
    @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, findSearchAction searchString: String, forward: Bool)
    @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, menuItemDidClick toolbarItem: KMToolbarItemView, index: Int, info: Any?)
    @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, viewItemDidClick toolbarItem: KMToolbarItemView, index: Int, info: Any?)
}

class KMToolbarViewController: NSViewController, NSTextFieldDelegate {

    var toolbar : KMToolbarView?
    var toolbarType : KMToolbarViewType = KMToolbarViewType.None
    var toolbarItems : [String : Any] = [:]
    @IBOutlet weak  var mainWindowController : MainWindowController!
    open weak var delegate: KMToolbarViewControllerDelegate?
    @IBOutlet var zoomButton: NSPopUpButton!
    @IBOutlet var zoomView: NSView!
    @IBOutlet weak var zoomTextField: NSTextField!
    
    var searchField: NSSearchField = NSSearchField()
    weak var pdfView: CPDFListView?
    var shareButton = KMToolbarClickButton()
    private var bottomLine = NSView()
    
    // 是否显示所有注释
    var isShowAllAnnotations = true
    var ignoreCurrentAnnotationTypeChange = false
    private var _currentItemView: KMToolbarItemView?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.zoomTextField.delegate = self

        for item in self.zoomButton.itemArray {
            let string = item.title 
            item.title = NSLocalizedString(string, comment: "")
        }
        
        NotificationCenter.default.addObserver(self, selector: #selector(listViewAnnotationTypeChangeNotification), name: Notification.Name("CPDFListViewAnnotationTypeChangeNotification"), object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(listViewAnnotationTypeChangeNotification), name: Notification.Name("CPDFListViewToolModeChangeNotification"), object: nil)
    }
    
    override func loadView() {
        super.loadView()
        
        self.toolbar = KMToolbarView.init(identifier: "KMToolbar_New")
        self.toolbar?.frame = self.view.bounds
        self.toolbar?.autoresizingMask = [.width,.height]
        self.toolbar?.delegate = self
        self.view.addSubview(self.toolbar!)
        
        self.view.addSubview(self.bottomLine)
        self.bottomLine.frame = NSMakeRect(0, 0, NSWidth(self.view.bounds), 1)
        self.bottomLine.autoresizingMask = [.width]
        self.bottomLine.wantsLayer = true
        self.bottomLine.layer?.backgroundColor = NSColor.km_init(hex: "#0000001A").cgColor
    }
    
    func updateType(newType:KMToolbarViewType) {
        if newType != toolbarType {
            toolbarType = newType
            if self.toolbar != nil && self.toolbar?.superview != nil {
                self.toolbar?.removeFromSuperview()
            }
            self.toolbar = KMToolbarView.init(identifier: "KMToolbar_New")
            self.toolbar?.frame = self.view.bounds
            self.toolbar?.autoresizingMask = [.width,.height]
            self.toolbar?.delegate = self
            self.view.addSubview(self.toolbar!)
        }
    }
    
    func reloadateToolbar() -> Void {
        self.toolbar?.reloadData()
    }
    
    func resetToolbar() -> Void {
        for item in self.toolbar?.items ?? [] {
            item.isSelected = false
        }
    }
    
    // MARK: Action
    
    @IBAction func changeAnnotationMode(item: KMToolbarClickButton) {
        self.delegate?.changeAnnotationModeAction?(item: item)
        if item.isKind(of: KMToolbarClickButton.self) {
            self._itemSetPromptFlag(item: item.clickObject as? KMToolbarItemView)
        } else {
            
        }
    }
    
    @IBAction func leftControllButtonAction(item: KMToolbarClickButton) {
        let tag = KMToolbarViewType(rawValue: item.tag) ?? .None
        if tag == .editPDF {
            if IAPProductsManager.default().isAvailableAllFunction() == false {
                KMPreference.shared.openDocumentType = .newWindow
                KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
                return
            }
            let allowsPrinting = self.pdfView?.document?.allowsPrinting ?? false
            let allowsCopying = self.pdfView?.document?.allowsCopying ?? false
            if !allowsPrinting || !allowsCopying {
                let alert = NSAlert()
                alert.alertStyle = .critical
                alert.messageText = NSLocalizedString("This is a secured document. Editing is not permitted.", comment: "")
                alert.runModal()
                return
            }
            Task { @MainActor in
                self.delegate?.toolbarViewController?(self, clickMode: tag, toolbar: item.clickObject as! KMToolbarItemView, [])
            }
        } else {
            self.delegate?.toolbarViewController?(self, clickMode: tag, toolbar: item.clickObject as! KMToolbarItemView, [])
        }
        self._itemSetPromptFlag(item: item.clickObject as? KMToolbarItemView)
    }
    
    @objc private func _itemAction(_ item: KMToolbarClickButton) {
        if item.clickObject?.itemIdentifier == KMAnnotationImageToolbarItemIdentifier || item.clickObject?.itemIdentifier == KMAnnotationTableToolbarItemIdentifier {
            self.pdfView?.toolMode = .textToolMode
            self.pdfView?.annotationType = .unkown
        }
        if let data = item.clickObject as? KMToolbarItemView {
            if data.itemIdentifier == KMToolbarComparisonItemIdentifier {
                self._currentItemView = data
                if let subMenu = data.menuFormRepresentation?.submenu {
                    subMenu.popUp(positioning: nil, at: item.frame.origin, in: item.superview)
                }
                return
            }
        }
        if let itemView = item.clickObject as? KMToolbarItemView {
            if itemView.itemIdentifier == KMDocumentRedactToolbarItemIdentifier {
                self.delegate?.toolbarViewController?(self, clickMode: .redact, toolbar: itemView, [])
            } else {
                self.delegate?.toolbarViewController?(self, itemDidClick: itemView)
            }
            self._itemSetPromptFlag(item: itemView)
        }
    }
    
    @objc private func OCRbtnAction1(_ item: KMToolbarClickButton) {
        FMTrackEventManager.defaultManager.trackEvent(event: "Tbr", withProperties: ["Tbr_Btn": "Btn_Tbr_OCR"])
        self._itemAction(item)
    }
    @objc private func OCRbtnAction2(_ item: KMToolbarClickButton) {
        FMTrackEventManager.defaultManager.trackEvent(event: "SubTbr_Converter", withProperties: ["SubTbr_Btn": "Btn_SubTbr_Converter_OCR"])
        self._itemAction(item)
    }
    
    @objc private func _menuItemAction(_ item: NSMenuItem) {
        guard let itemId = item.representedObject as? String else {
            NSSound.beep()
            return
        }
        if itemId == KMDocumentConversonToolbarItemIdentifier {
            let item_ = self.toolbarItemFindItemIdentifiers(value: itemId)
            self.leftControllButtonAction(item: item_.clickButton)
            self._itemSetPromptFlag(item: item_)
        } else if itemId == KMDocumentRedactToolbarItemIdentifier {
            let item_ = self.toolbarItemFindItemIdentifiers(value: itemId)
            self._itemAction(item_.clickButton)
            self._itemSetPromptFlag(item: item_)
        } else if itemId == KMDocumentAnnotationToolbarItemIdentifier {
            let item_ = self.toolbarItemFindItemIdentifiers(value: itemId)
            self.leftControllButtonAction(item: item_.clickButton)
            self._itemSetPromptFlag(item: item_)
        } else if itemId == KMDocumentPageToolbarItemIdentifier {
            let item_ = self.toolbarItemFindItemIdentifiers(value: itemId)
            self.leftControllButtonAction(item: item_.clickButton)
            self._itemSetPromptFlag(item: item_)
        } else if itemId == KMDocumentToolToolbarItemIdentifier {
            let item_ = self.toolbarItemFindItemIdentifiers(value: itemId)
            self.leftControllButtonAction(item: item_.clickButton)
            self._itemSetPromptFlag(item: item_)
        } else if itemId == KMDocumentPresentationToolbarItemIdentifier {
            let item_ = self.toolbarItemFindItemIdentifiers(value: itemId)
            self._itemAction(item_.clickButton)
            self._itemSetPromptFlag(item: item_)
        } else {
            let item_ = self.toolbarItemFindItemIdentifiers(value: itemId)
            self.delegate?.toolbarViewController?(self, menuItemDidClick: item_, index: 0, info: nil)
            self._itemSetPromptFlag(item: item_)
        }
    }
    
    @objc private func _comparisonAction(sender: NSMenuItem) {
        if let data = self._currentItemView {
            self.delegate?.toolbarViewController?(self, menuItemDidClick: data, index: sender.tag, info: nil)
        } else {
            self.delegate?.toolbarViewController?(self, menuItemDidClick: self.toolbarItemFindItemIdentifiers(value: KMToolbarComparisonItemIdentifier), index: sender.tag, info: nil)
        }
        self._itemSetPromptFlag(itemIdentifier: KMToolbarComparisonItemIdentifier)
    }
    
    @IBAction func showPDFLayoutMode(sender: KMToolbarClickButton) {
        if let item = sender.clickObject as? KMToolbarItemView {
            item.isSelected = !item.isSelected
            self.delegate?.showPDFLayoutModeAction?(show: true)
            self._itemSetPromptFlag(item: item)
        }
    }
    
    @objc func cropMenuAction(item: KMToolbarItemView) {
        self.delegate?.toolbarViewController?(self, clickChaildToolType: .crop, toolbar: item)
    }
    
    @objc private func _cropAction(_ sender: NSMenuItem) {
        if let data = self._currentItemView {
            self.delegate?.toolbarViewController?(self, menuItemDidClick: data, index: sender.tag, info: nil)
        } else {
            self.delegate?.toolbarViewController?(self, menuItemDidClick: self.toolbarItemFindItemIdentifiers(value: KMToolbarCropIdentifier), index: sender.tag, info: nil)
        }
        self._itemSetPromptFlag(itemIdentifier: KMToolbarCropIdentifier)
    }
    
    @objc func batesMenuAction(sender: KMToolbarClickButton) {
        self._currentItemView = sender.clickObject as? KMToolbarItemView
        if let subMenu = (sender.clickObject as? KMToolbarItemView)?.menuFormRepresentation?.submenu {
            subMenu.popUp(positioning: nil, at: sender.frame.origin, in: sender.superview)
        }
    }
    @objc private func _batesAction(sender: NSMenuItem) {
        if let data = self._currentItemView {
            self.delegate?.toolbarViewController?(self, menuItemDidClick: data, index: sender.tag, info: nil)
        } else {
            self.delegate?.toolbarViewController?(self, menuItemDidClick: self.toolbarItemFindItemIdentifiers(value: KMToolbarToolBatesItemIdentifier), index: sender.tag, info: nil)
        }
        self._itemSetPromptFlag(itemIdentifier: KMToolbarToolBatesItemIdentifier)
    }
    
    @objc private func _AIAction(sender: NSMenuItem) {
        if let data = self._currentItemView {
            self.delegate?.toolbarViewController?(self, menuItemDidClick: data, index: sender.tag, info: nil)
        } else {
            self.delegate?.toolbarViewController?(self, menuItemDidClick: self.toolbarItemFindItemIdentifiers(value: KMToolbarAIItemIdentifier), index: sender.tag, info: nil)
        }
        self._itemSetPromptFlag(itemIdentifier: KMToolbarToolBatesItemIdentifier)
    }
    
    @objc func headerfooterMenuAction(sender: KMToolbarClickButton) {
        self._currentItemView = sender.clickObject as? KMToolbarItemView
        if let subMenu = (sender.clickObject as? KMToolbarItemView)?.menuFormRepresentation?.submenu {
            subMenu.popUp(positioning: nil, at: sender.frame.origin, in: sender.superview)
        }
    }
    @objc private func _headerfooterAction(sender: NSMenuItem) {
        if let data = self._currentItemView {
            self.delegate?.toolbarViewController?(self, menuItemDidClick: data, index: sender.tag, info: nil)
        } else {
            self.delegate?.toolbarViewController?(self, menuItemDidClick: self.toolbarItemFindItemIdentifiers(value: KMToolbarToolHeaderFooterItemIdentifier), index: sender.tag, info: nil)
        }
        self._itemSetPromptFlag(itemIdentifier: KMToolbarToolHeaderFooterItemIdentifier)
    }
    
    @objc func backgroundMenuAction(sender: KMToolbarClickButton) {
        self._currentItemView = sender.clickObject as? KMToolbarItemView
        if let subMenu = (sender.clickObject as? KMToolbarItemView)?.menuFormRepresentation?.submenu {
            subMenu.popUp(positioning: nil, at: sender.frame.origin, in: sender.superview)
        }
    }
    @objc private func _backgroundAction(sender: NSMenuItem) {
        if let data = self._currentItemView {
            self.delegate?.toolbarViewController?(self, menuItemDidClick: data, index: sender.tag, info: nil)
        } else {
            self.delegate?.toolbarViewController?(self, menuItemDidClick: self.toolbarItemFindItemIdentifiers(value: KMToolbarToolBackgroundItemIdentifier), index: sender.tag, info: nil)
        }
        self._itemSetPromptFlag(itemIdentifier: KMToolbarToolBackgroundItemIdentifier)
    }
    
    @objc func watermarkMenuAction(sender: KMToolbarClickButton) {
        self._currentItemView = sender.clickObject as? KMToolbarItemView
        if let subMenu = (sender.clickObject as? KMToolbarItemView)?.menuFormRepresentation?.submenu {
            subMenu.popUp(positioning: nil, at: sender.frame.origin, in: sender.superview)
        }
    }
    @objc private func _watermarkAction(sender: NSMenuItem) {
        if let data = self._currentItemView {
            self.delegate?.toolbarViewController?(self, menuItemDidClick: data, index: sender.tag, info: nil)
        } else {
            self.delegate?.toolbarViewController?(self, menuItemDidClick: self.toolbarItemFindItemIdentifiers(value: KMToolbarToolWatermarkItemIdentifier), index: sender.tag, info: nil)
        }
        self._itemSetPromptFlag(itemIdentifier: KMToolbarToolWatermarkItemIdentifier)
    }
    
    @objc func redactMenuAction(sender: KMToolbarClickButton) {
        self.delegate?.toolbarViewController?(self, clickChaildToolType: .redact, toolbar: sender.clickObject as! KMToolbarItemView)
        self._itemSetPromptFlag(item: sender.clickObject as? KMToolbarItemView)
    }
    
    @objc func compressMenuAction(sender: KMToolbarClickButton) {
        self.delegate?.toolbarViewController?(self, clickChaildToolType: .compress, toolbar: sender.clickObject as! KMToolbarItemView)
        self._itemSetPromptFlag(item: sender.clickObject as? KMToolbarItemView)
    }
    
    @objc func secureMenuAction(sender: KMToolbarClickButton) {
        self.delegate?.toolbarViewController?(self, clickChaildToolType: .secure, toolbar: sender.clickObject as! KMToolbarItemView)
        self._itemSetPromptFlag(item: sender.clickObject as? KMToolbarItemView)
    }
    @objc private func _secureAction(sender: NSMenuItem) {
        if let data = self._currentItemView {
            self.delegate?.toolbarViewController?(self, menuItemDidClick: data, index: sender.tag, info: nil)
        } else {
            self.delegate?.toolbarViewController?(self, menuItemDidClick: self.toolbarItemFindItemIdentifiers(value: KMToolbarToolSecureItemIdentifier), index: sender.tag, info: nil)
        }
        self._itemSetPromptFlag(itemIdentifier: KMToolbarToolSecureItemIdentifier)
    }
    
    @objc func conversionMenuItemAction(sender: KMToolbarClickButton) {
        if let item: KMToolbarItemView = sender.clickObject as? KMToolbarItemView {
            var type: KMToolbarType = .word
            if (item.btnTag == KMToolbarType.excel.rawValue) {
                type = .excel
            } else if (item.btnTag == KMToolbarType.ppt.rawValue) {
                type = .ppt
            } else if (item.btnTag == KMToolbarType.rtf.rawValue) {
                type = .rtf
            } else if (item.btnTag == KMToolbarType.csv.rawValue) {
                type = .csv
            } else if (item.btnTag == KMToolbarType.html.rawValue) {
                type = .html
            } else if (item.btnTag == KMToolbarType.conversion_text.rawValue) {
                type = .conversion_text
            } else if (item.btnTag == KMToolbarType.conversion_image.rawValue) {
                type = .conversion_image
            }
            self.delegate?.toolbarViewController?(self, clickChaildToolType: type, toolbar: item)
            self._itemSetPromptFlag(item: item)
        }
    }
    
    @objc private func _pdfToImageAction(sender: NSMenuItem) {
        if let data = self._currentItemView {
            self.delegate?.toolbarViewController?(self, menuItemDidClick: data, index: sender.tag, info: nil)
        } else {
            self.delegate?.toolbarViewController?(self, menuItemDidClick: self.toolbarItemFindItemIdentifiers(value: KMToolbarConversionImageItemIdentifier), index: sender.tag, info: nil)
        }
        self._itemSetPromptFlag(itemIdentifier: KMToolbarConversionImageItemIdentifier)
    }
    
    @objc private func _exportImageAction(sender: NSMenuItem) {
        if let data = self._currentItemView {
            self.delegate?.toolbarViewController?(self, menuItemDidClick: data, index: sender.tag, info: nil)
        } else {
            self.delegate?.toolbarViewController?(self, menuItemDidClick: self.toolbarItemFindItemIdentifiers(value: KMToolbarConversionExportImageItemIdentifier), index: sender.tag, info: nil)
        }
        self._itemSetPromptFlag(itemIdentifier: KMToolbarConversionExportImageItemIdentifier)
    }
    
    @objc private func _newPDFAction(sender: NSMenuItem) {
        if let data = self._currentItemView {
            self.delegate?.toolbarViewController?(self, menuItemDidClick: data, index: sender.tag, info: nil)
        } else {
            self.delegate?.toolbarViewController?(self, menuItemDidClick: self.toolbarItemFindItemIdentifiers(value: KMToolbarConversionCreatePDFItemIdentifier), index: sender.tag, info: nil)
        }
        self._itemSetPromptFlag(itemIdentifier: KMToolbarConversionCreatePDFItemIdentifier)
    }
    
    @IBAction func zoomModelSelectButtonAction(_ sender: NSPopUpButton) {
        self.delegate?.toolbarViewController?(self, zoomModel: sender.selectedTag())
        for item in sender.itemArray {
            item.state = .off
        }
        sender.selectedItem?.state = .on
    }
    
    @IBAction func zoomPDFViewButtonAction(sender:KMToolbarClickButton) {
        if sender.tag == 0 {
            self.delegate?.changePDFViewZoomOutAction?()
        } else if sender.tag == 1 {
            self.delegate?.changePDFViewZoomInAction?()
        } else if sender.tag == 2 {
            self.delegate?.changePDFViewGotoBackAction?()
        } else if sender.tag == 3 {
            self.delegate?.changePDFViewGoToForwardAction?()
        }
    }
    
    @IBAction func aiTranslationButtonAction(sender:KMToolbarClickButton) {
        self.delegate?.aiTranslationPDFFileAction?()
    }
    
    @IBAction func shareButtonAction(sender:KMToolbarClickButton) {
        self.shareButton = sender
        let menu = NSMenu()
        menu.addItem(withTitle: NSLocalizedString("Document", comment: ""), action: #selector(shareViaWithDocument), target: self)
        menu.addItem(withTitle: NSLocalizedString("Flattened Copy", comment: ""), action: #selector(shareViaWithFlatten), target: self)
        menu.addItem(withTitle: NSLocalizedString("Original PDF", comment: ""), action: #selector(shareViaWithOriginalPDF), target: self)
        menu.popUp(positioning: nil, at: NSPoint(x: sender.frame.origin.x, y: sender.frame.origin.y-10), in: sender.superview)
        
        self.delegate?.toolbarViewController?(self, shareAction: sender.clickObject as! KMToolbarItemView)
    }
    
    @IBAction func shareViaWithDocument(sender:NSMenuItem) {
        self.delegate?.toolbarViewController?(self, shareDocument: sender)
    }
    
    @IBAction func shareViaWithFlatten(sender:NSMenuItem) {
        self.delegate?.toolbarViewController?(self, shareFlatten: sender)
    }
    
    @IBAction func shareViaWithOriginalPDF(sender:NSMenuItem) {
        self.delegate?.toolbarViewController?(self, shareOriginalPDF: sender)
    }
    
    @objc func mergeMenuItemAction(sender: KMToolbarClickButton) {
        self.delegate?.toolbarViewController?(self, clickChaildToolType: .merge, toolbar: sender.clickObject as! KMToolbarItemView)
    }
    
    @IBAction func scanOCRModelSelect(sender:KMToolbarClickButton) {
        self.delegate?.toolbarViewController?(self, scanOCRModel: sender.tag)
    }
    
    // Form 对齐
    @IBAction func formsAlignmentAction(sender:KMToolbarClickButton) {
        if sender.tag == 0 {
            self.pdfView?.formsAnnotationAlign(.left)
        } else if sender.tag == 1 {
            self.pdfView?.formsAnnotationAlign(.vertical)
        } else if sender.tag == 2 {
            self.pdfView?.formsAnnotationAlign(.right)
        } else if sender.tag == 3 {
            self.pdfView?.formsAnnotationAlign(.top)
        } else if sender.tag == 4 {
            self.pdfView?.formsAnnotationAlign(.horizontally)
        } else if sender.tag == 5 {
            self.pdfView?.formsAnnotationAlign(.bottom)
        } else if sender.tag == 6 {
            self.pdfView?.formsAnnotationAlign(.disHorizontally)
        } else if sender.tag == 7 {
            self.pdfView?.formsAnnotationAlign(.disVertical)
        }
    }
    
    @objc private func _alignmentAction(sender: NSMenuItem) {
        if let data = self._currentItemView {
            self.delegate?.toolbarViewController?(self, menuItemDidClick: data, index: sender.tag, info: nil)
        } else {
            self.delegate?.toolbarViewController?(self, menuItemDidClick: self.toolbarItemFindItemIdentifiers(value: KMToolbarToolFormAlignIdentifier), index: sender.tag, info: nil)
        }
    }
    
    // Form 更多操作
    @IBAction func formsMoreOperationAction(sender:KMToolbarClickButton) {
        
    }
    
    func toolbarItemFindItemIdentifiers(value : String) -> KMToolbarItemView{
        for item in self.toolbarItems {
            if item.key == value {
                return item.value as! KMToolbarItemView
            }
        }
        return KMToolbarItemView()
    }
    
    func controlTextDidEndEditing(_ obj: Notification) {
        let textField = obj.object as? NSTextField
        if textField == self.zoomTextField {
            self.delegate?.toolbarViewController?(self, zoomSting: self.zoomTextField.stringValue)
        }
    }
    
    func controlTextDidChange(_ obj: Notification) {
        
    }
    
    func control(_ control: NSControl, textView: NSTextView, doCommandBy commandSelector: Selector) -> Bool {
        switch commandSelector {
        case #selector(NSResponder.insertNewline(_:)):
            if let inputView = control as? NSTextField {
//                //当当前TextField按下enter
                if inputView == zoomTextField {
                    KMPrint("按下 enter")
                    self.delegate?.toolbarViewController?(self, zoomSting: self.zoomTextField.stringValue)
                } else if let _ = control as? NSSearchField {
                    self.searchPDFKey(control.stringValue)
                }
            }
            return true
        default:
            return false
        }
    }
    
    // MARK: - Private Methods
    
    private func _itemSetPromptFlag(item: KMToolbarItemView?) {
        if let item_ = item {
            if let identifier = item_.promptIdentifier {
                item?.isShowPrompt = false
                KMDataManager.ud_set(true, forKey: identifier)
            }
        }
    }
    
    private func _itemSetPromptFlag(itemIdentifier: String?) {
        let item = self.toolbarItemFindItemIdentifiers(value: itemIdentifier ?? "")
        self._itemSetPromptFlag(item: item)
    }
    
    override func interfaceThemeDidChanged(_ appearance: NSAppearance.Name) {
        super.interfaceThemeDidChanged(appearance)
        
        self.toolbar?.appearance = .init(named: appearance)
        self.bottomLine.wantsLayer = true
        if KMAppearance.isDarkMode() {
            self.bottomLine.layer?.backgroundColor = NSColor.km_init(hex: "#393B3E", alpha: 1).cgColor
        } else {
            self.bottomLine.layer?.backgroundColor = NSColor.km_init(hex: "#0000001A").cgColor
        }
    }
}

// MARK: - Public Methods

extension KMToolbarViewController {
    func itemAction(_ item: KMToolbarItemView) {
        self._itemAction(item.clickButton)
    }
}

extension KMToolbarViewController : KMToolbarViewDelegate,NSToolbarItemValidation {
    func toolbarLeftDefaultItemIdentifiers(_ toolbar: KMToolbarView) -> [String] {
        if toolbarType == .Main {
            if let model = KMDataManager.toolbar_getData() {
                return model.leftCellIdentifiers ?? []
            }
            return [KMLeftControlToolbarItemIdentifier,
                    KMNewToolbarSpaceItemIdentifier, KMDocumentZoomViewToolbarItemIdentifier,
                    KMDocumentPreviousPageToolbarItemIdentifier, KMDocumentHomeToolbarItemIdentifier]
        }
        return []
    }
    
    func toolbarRightDefaultItemIdentifiers(_ toolbar: KMToolbarView) -> [String] {
        if toolbarType == .Main {
            if let model = KMDataManager.toolbar_getData() {
                return model.rightCellIdentifiers ?? []
            }
            return [KMDocumentViewDisplayToolbarItemIdentifier, KMDocumentShareToolbarItemIdentifier,
                    KMDocumentSearchToolbarItemIdentifier, KMRightControlToolbarItemIdentifier]
        } else if [.Annatiton,.Magnify,.Move,.Select,.SelectZoom].contains(toolbarType) {
            return [KMToolbarAnnotationSettingItemIdentifier]
        }
        return []
    }
    
    func toolbarAllowedItemIdentifiers(_ toolbar: KMToolbarView) -> [String] {
        switch toolbarType {
        case .None:
            return []
        case .Main:
            var defaultCellIdentifiers = mainToolIdentifiers
            if defaultCellIdentifiers.contains(KMDocumentHomeToolbarItemIdentifier) {
                defaultCellIdentifiers.removeObject(KMDocumentHomeToolbarItemIdentifier)
            }
            return defaultCellIdentifiers
        case .Annatiton,.Magnify,.Move,.Select,.SelectZoom:
//            return annotationToolIdentifiers
            return [KMNewToolbarSpaceItemIdentifier,
                    KMToolbarPageEditInsetItemIdentifier, KMToolbarToolMergeItemIdentifier, KMToolbarPageEditSplitItemIdentifier,
                    KMToolbarToolCompressItemIdentifier, KMToolbarToolSecureItemIdentifier, KMToolbarToolWatermarkItemIdentifier,
                    KMToolbarToolBackgroundItemIdentifier, KMToolbarToolHeaderFooterItemIdentifier, KMToolbarToolBatesItemIdentifier,
                    KMToolbarAIItemIdentifier,
                    KMToolbarCropIdentifier,
                    KMToolbarConversionWordItemIdentifier, KMToolbarConversionExcelItemIdentifier, KMToolbarConversionPPTItemIdentifier,
                    KMToolbarConversionRTFItemIdentifier, KMToolbarConversionCSVItemIdentifier, KMToolbarConversionHTMLItemIdentifier,
                    KMToolbarConversionTextItemIdentifier, KMToolbarConversionImageItemIdentifier,
                    
                    KMToolbarMoveToolModeItemIdentifier,
                    KMToolbarMagnifyToolModeItemIdentifier,
                    KMToolbarSelectToolModeItemIdentifier,
                    KMToolbarZoomToSelectionItemIdentifier,
                    KMNewToolbarSpaceItemIdentifier,
                    KMToolbarDividerItemIdentifier,
                    KMNewToolbarSpaceItemIdentifier,
                    KMToolbarHighlightAnnotationItemIdentifier,
                    KMToolbarUnderlineAnnotationItemIdentifier,
                    KMToolbarStrikeOutAnnotationItemIdentifier,
                    KMToolbarInkAnnotationItemIdentifier,
                    KMToolbarFreeTextAnnotationItemIdentifier,
                    KMToolbarAnchoredAnnotationItemIdentifier,
                    KMToolbarSquareAnnotationItemIdentifier, KMToolbarCircleAnnotationItemIdentifier, KMToolbarArrowAnnotationItemIdentifier, KMToolbarLineAnnotationItemIdentifier,
                    KMToolbarLinkAnnotationItemIdentifier,
                    KMAnnotationStampToolbarItemIdentifier,
                    KMToolbarSignSignatureAnnotationItemIdentifier,
//                    KMToolbarDividerItemIdentifier,
//                    KMToolbarShowToolbarItemIdentifier,
                    
                    KMToolbarToolRadioButtonItemIdentifier]
        case .editPDF:
            return editPDFItemIdentifiers
        case .Page:
            return pageEditToolIdentifiers
        case .Tool:
            return toolToolIdentifiers
        case .Form:
            return formToolIdentifiers
        case .FillSign:
            return fillSignToolIdentifiers
        case .Conversion:
            return conversionToolIdentifiers
        case .viewSetting:
            return [KMToolbarViewSettingIdentifier, KMToolbarCropIdentifier,
                    KMToolbarSnapshotIdentifier, KMToolbarTTSIdentifier]
        default:
            break
        }
        return []
    }
    
    func toolbarDefaultItemIdentifiers(_ toolbar: KMToolbarView) -> [String] {
        switch toolbarType {
        case .None:
            return []
        case .Main:
            if let model = KMDataManager.toolbar_getData() {
                return model.centerCellIdentifiers ?? []
            }
            return [KMDocumentAnnotationToolbarItemIdentifier,
                    KMDocumentPageToolbarItemIdentifier,
                    KMDocumentToolToolbarItemIdentifier,
                    KMDocumentConversonToolbarItemIdentifier,
                    KMDocumentFormToolbarItemIdentifier,
                    KMDocumentFillSginToolbarItemIdentifier,
                    KMDocumentEditToolbarItemIdentifier,
                    KMDocumentDigitalSignToolbarItemIdentifier,
                    KMDocumentRedactToolbarItemIdentifier,
                    KMDocumentScanOCRToolbarItemIdentifier,
                    KMDocumentAIToolsToolbarItemIdentifier]
        case .Annatiton,.Magnify,.Move,.Select,.SelectZoom:
            let itemIdentifiers: [String]? = self.toolbar?.toolbarIdentifier != nil ? (UserDefaults.standard.object(forKey: self.toolbar?.toolbarIdentifier ?? "") as? [String]) : []
            if itemIdentifiers == nil || itemIdentifiers!.count <= 0 {
                return [KMToolbarMoveToolModeItemIdentifier,
                        KMToolbarMagnifyToolModeItemIdentifier,
                        KMToolbarSelectToolModeItemIdentifier,
                        KMToolbarZoomToSelectionItemIdentifier,
                        KMNewToolbarSpaceItemIdentifier,
                        KMNewToolbarSpaceItemIdentifier,
                        KMToolbarHighlightAnnotationItemIdentifier,
                        KMToolbarUnderlineAnnotationItemIdentifier,
                        KMToolbarStrikeOutAnnotationItemIdentifier,
                        KMToolbarInkAnnotationItemIdentifier,
                        KMToolbarFreeTextAnnotationItemIdentifier,
                        KMToolbarAnchoredAnnotationItemIdentifier,
                        KMToolbarSquareAnnotationItemIdentifier, KMToolbarCircleAnnotationItemIdentifier, KMToolbarArrowAnnotationItemIdentifier, KMToolbarLineAnnotationItemIdentifier,
                        KMToolbarLinkAnnotationItemIdentifier,
                        KMNewToolbarSpaceItemIdentifier, KMNewToolbarSpaceItemIdentifier,
                        KMAnnotationStampToolbarItemIdentifier, KMAnnotationImageToolbarItemIdentifier,
                        KMToolbarSignSignatureAnnotationItemIdentifier, KMAnnotationTableToolbarItemIdentifier]
            }
            return itemIdentifiers!
        case .editPDF:
            return [KMToolbarAddTextEditPDFItemIdentifier,
                    KMToolbarAddImageEditPDFItemIdentifier]
        case .Page:
            return []
        case .Tool:
            return [KMToolbarToolCompressItemIdentifier, KMToolbarToolMergeItemIdentifier,
                    KMToolbarToolSecureItemIdentifier, KMToolbarComparisonItemIdentifier,
                    KMToolbarToolWatermarkItemIdentifier, KMToolbarToolBackgroundItemIdentifier,
                    KMToolbarToolHeaderFooterItemIdentifier, KMToolbarToolBatesItemIdentifier]
        case .Form:
            return [KMToolbarToolTextFieldItemIdentifier,
                    KMToolbarToolCheckBoxItemIdentifier,
                    KMToolbarToolRadioButtonItemIdentifier,
                    KMToolbarToolListBoxItemIdentifier,
                    KMToolbarToolPullDownmenuItemIdentifier,
                    KMToolbarToolButtonIdentifier,
                    KMToolbarToolSignBoxIdentifier,
                    KMToolbarDividerItemIdentifier,
                    KMToolbarToolFormAlignIdentifier]
        case .FillSign:
            return [
//                KMToolbarToolTextIdentifier,
                    KMToolbarToolHookItemIdentifier,
                    KMToolbarToolForkItemIdentifier,
                    KMToolbarToolRectangleIdentifier,
                    KMToolbarToolLineItemIdentifier,
                    KMToolbarToolDotItemIdentifier,
                    KMToolbarToolDateIdentifier,
                    KMToolbarToolProfileIdentifier,
                    KMToolbarFillSignSignatureIdentifier]
        case .Conversion:
            return [KMToolbarConversionCreatePDFItemIdentifier,
                    KMToolbarConversionWordItemIdentifier,
                    KMToolbarConversionExcelItemIdentifier,
                    KMToolbarConversionPPTItemIdentifier,
                    KMToolbarConversionRTFItemIdentifier,
                    KMToolbarConversionCSVItemIdentifier,
                    KMToolbarConversionHTMLItemIdentifier,
                    KMToolbarConversionTextItemIdentifier,
                    KMToolbarConversionImageItemIdentifier,
                    KMToolbarDividerItemIdentifier, KMToolbarConversionOCRIdentifier, KMToolbarConversionExportImageItemIdentifier]
        case .ScanOCR:
            return [KMToolbarToolEnhancedScanIdentifier,
                KMToolbarToolOCRTextIdentifier]
        case .viewSetting:
            return [KMToolbarViewSettingIdentifier, KMToolbarCropIdentifier,
                    KMToolbarSnapshotIdentifier, KMToolbarTTSIdentifier]
        default:
            break
        }

        return []
    }
    
    func toolbar(_ toolbar: KMToolbarView, itemFor identifier: String) -> KMToolbarItemView {
        var item: KMToolbarItemView? = self.toolbarItems[identifier] as? KMToolbarItemView
        var create = false
        if let data = item {
            let pId = parentIdentifier(data.itemIdentifier ?? "")
            if [.Annatiton,.Magnify,.Move,.Select,.SelectZoom].contains(toolbarType) && (pId != KMDocumentAnnotationToolbarItemIdentifier || data.itemIdentifier! == KMToolbarAnnotationSettingItemIdentifier) {
                create = true
            } else {
                if let toolbarId = self.toolbar?.toolbarIdentifier {
                    let itemIdentifiers = (UserDefaults.standard.object(forKey: toolbarId) as? [String]) ?? []
                    if itemIdentifiers.contains(identifier) && annotationToolIdentifiers.contains(identifier) == false {
                        create = true
                    }
                }
            }
        }
        if create == false {
            if KMDataManager.default.toolbarConfigDataUpdated {
                create = true
            }
        }
        if item == nil || create {
            if isMainToolItem(identifier) {
                item = KMToolbarMainItemView(itemIdentifier: identifier)
            } else if annotationToolIdentifiers.contains(identifier) {
                item = KMToolbarCustomItemView.init(itemIdentifier: identifier)
            } else {
                item = KMToolbarCustomItemView.init(itemIdentifier: identifier)
            }
            self.toolbarItems[identifier] = item
            if isMainToolItem(identifier) {
                self._setupMainItem(item)
            } else {
                if (annotationToolIdentifiers.contains(identifier)) {
                    self._setupAnnotationItem(item)
                } else if editPDFItemIdentifiers.contains(identifier) {
                    self._setupEditItem(item)
                } else if conversionToolIdentifiers.contains(identifier) {
                    self._setupConvertItem(item)
                } else if fillSignToolIdentifiers.contains(identifier) {
                    self._setupFillSignItem(item)
                } else if formToolIdentifiers.contains(identifier) {
                    self._setupFormItem(item)
                } else if toolToolIdentifiers.contains(identifier) {
                    self._setupToolItem(item)
                } else if KMViewDisplayIdentifiers.contains(identifier) {
                    self._setupViewDisplayItem(item)
                } else if pageEditToolIdentifiers.contains(identifier) {
                    if (identifier == KMToolbarPageEditPageRangeItemIdentifier) {
                        item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageRange)
                        item?.target = self
                        item?.btnTag = KMPageEditType.pageRange.rawValue
            //            item?.toolTip = NSLocalizedString("pageRange", comment: "")
                        item?.titleName = NSLocalizedString("Page Range", comment: "")
                        item?.boxImagePosition = .imageExpandLeft
            //            item?.btnAction = #selector(pageRangeMenuAction)
                        item?.needExpandAction = true
                    } else if (identifier == KMToolbarPageEditRotateItemIdentifier) {
                        item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageRotate)
                        item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageRotate)
                        item?.target = self
                        item?.btnTag = KMPageEditType.rightRotate.rawValue
                        item?.toolTip = NSLocalizedString("Rotate", comment: "")
                        item?.titleName = NSLocalizedString("Rotate", comment: "")
                        item?.boxImagePosition = .imageLeft
                    } else if (identifier == KMToolbarPageEditLeftRotateItemIdentifier) {
                        item?.image = NSImage(named: "KMImageNameMainToolPageLeftRotate")
                        item?.alternateImage = NSImage(named: "KMImageNameMainToolPageLeftRotate")
                        item?.target = self
                        item?.btnTag = KMPageEditType.leftRotate.rawValue
                        item?.toolTip = NSLocalizedString("Rotate Left", comment: "")
                        item?.titleName = NSLocalizedString("", comment: "")
                        item?.boxImagePosition = .imageLeft
                    } else if (identifier == KMToolbarPageEditRightRotateItemIdentifier) {
                        item?.image = NSImage(named: "KMImageNameMainToolPageRightRotate")
                        item?.alternateImage = NSImage(named: "KMImageNameMainToolPageRightRotate")
                        item?.target = self
                        item?.btnTag = KMPageEditType.rightRotate.rawValue
                        item?.toolTip = NSLocalizedString("Rotate Right", comment: "")
                        item?.titleName = NSLocalizedString("", comment: "")
                        item?.boxImagePosition = .imageLeft
                    } else if (identifier == KMToolbarPageEditInsetItemIdentifier) {
                        item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageInsert)
                        item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageInsert)
                        item?.target = self
                        item?.btnTag = KMPageEditType.insert.rawValue
                        item?.isShowCustomToolTip = true
                        item?.toolTip = NSLocalizedString("Inserting pages into an existing PDF", comment: "")
                        item?.isPopToolTip = true
                        item?.titleName = NSLocalizedString("Insert", comment: "")
                        item?.boxImagePosition = .imageOnly
                        item?.btnAction = #selector(_itemAction)
                    } else if (identifier == KMToolbarPageEditExtractItemIdentifier) {
                        item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageExtract)
                        item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageExtract)
                        item?.target = self
                        item?.btnTag = KMPageEditType.extract.rawValue
            //            item?.toolTip = NSLocalizedString("Exctract selected pages", comment: "")
                        item?.titleName = NSLocalizedString("Extract", comment: "")
                        item?.boxImagePosition = .imageExpandLeft
            //            item?.btnAction = #selector(extractMenuAction)
                        item?.needExpandAction = true
                    } else if (identifier == KMToolbarPageEditReplaceItemIdentifier) {
                        item?.image = NSImage(named: KMImageNameToolbarReplace)
                        item?.alternateImage = NSImage(named: KMImageNameToolbarReplace)
                        item?.target = self
                        item?.btnTag = KMPageEditType.replace.rawValue
                        item?.toolTip = NSLocalizedString("Replace", comment: "")
                        item?.titleName = NSLocalizedString("Replace", comment: "")
                        item?.boxImagePosition = .imageLeft
                    } else if (identifier == KMToolbarPageEditSplitItemIdentifier) {
                        item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageSplit)
                        item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageSplit)
                        item?.target = self
                        item?.btnTag = KMPageEditType.split.rawValue
                        item?.isShowCustomToolTip = true
                        item?.toolTip = NSLocalizedString("Split and save selected PDF pages as a new separate document", comment: "")
                        item?.isPopToolTip = true
                        item?.titleName = NSLocalizedString("Split", comment: "")
                        item?.boxImagePosition = .imageOnly
                        item?.btnAction = #selector(_itemAction)
                    } else if (identifier == KMToolbarPageEditReverseItemIdentifier) {
                        item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageReverse)
                        item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageReverse)
                        item?.target = self
                        item?.btnTag = KMPageEditType.reverse.rawValue
                        item?.toolTip = NSLocalizedString("Reverse", comment: "")
                        item?.titleName = NSLocalizedString("Reverse", comment: "")
                        item?.boxImagePosition = .imageLeft
                    } else if (identifier == KMToolbarPageEditCopyItemIdentifier) {
                        item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageCopy)
                        item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageCopy)
                        item?.target = self
                        item?.btnTag = KMPageEditType.delete.rawValue
                        item?.toolTip = NSLocalizedString("Copy", comment: "")
                        item?.titleName = NSLocalizedString("Copy", comment: "")
                        item?.boxImagePosition = .imageLeft
                    } else if (identifier == KMToolbarPageEditPasteItemIdentifier) {
                        item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPagePaste)
                        item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPagePaste)
                        item?.target = self
                        item?.btnTag = KMPageEditType.delete.rawValue
                        item?.toolTip = NSLocalizedString("Paste", comment: "")
                        item?.titleName = NSLocalizedString("Paste", comment: "")
                        item?.boxImagePosition = .imageLeft
                    } else if (identifier == KMToolbarPageEditDeleteItemIdentifier) {
                        item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageDelete)
                        item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageDelete)
                        item?.target = self
                        item?.btnTag = KMPageEditType.delete.rawValue
                        item?.toolTip = NSLocalizedString("Delete", comment: "")
                        item?.titleName = NSLocalizedString("Delete", comment: "")
                        item?.boxImagePosition = .imageLeft
                    }
                    
                    return item!
                }
            }

        }
        return item!
    }
    
    func validateToolbarItem(_ item: NSToolbarItem) -> Bool {
        return true
    }
    
    @objc func listViewAnnotationTypeChangeNotification(sender: Notification?) {
//        if let notiName = sender?.name, notiName == NSNotification.Name.CPDFListViewAnnotationTypeChange, self.ignoreCurrentAnnotationTypeChange {
            
//        }
        if (self.ignoreCurrentAnnotationTypeChange) {
            // 忽略后重置 这个属性是基于单次添加,所以使用后会重置
//            self.ignoreCurrentAnnotationTypeChange = false
            return
        }
        
        let annotationType : CAnnotationType = pdfView?.annotationType ?? .unkown
        if annotationType == .square || annotationType == .circle || annotationType == .arrow || annotationType == .line{
            UserDefaults.standard.set(annotationType.rawValue, forKey: KMToolBarToolPDFShapeStyle)
            UserDefaults.standard.synchronize()
        }
        let toolMode = pdfView?.toolMode ?? .none
        for item in self.toolbar?.items ?? [] {
            if self.toolbarType == .Annatiton || self.toolbarType == .Move || self.toolbarType == .Magnify ||
                self.toolbarType == .Select || self.toolbarType == .SelectZoom {
                item.isSelected = false
                if item.itemIdentifier == KMDocumentAnnotationToolbarItemIdentifier {
                    item.isSelected = true
                } else if item.itemIdentifier == KMToolbarHighlightAnnotationItemIdentifier {
                    if annotationType == .highlight {
                        item.isSelected = true
                    }
                } else if item.itemIdentifier == KMToolbarUnderlineAnnotationItemIdentifier {
                    if annotationType == .underline {
                        item.isSelected = true
                    }
                } else if item.itemIdentifier == KMToolbarStrikeOutAnnotationItemIdentifier {
                    if annotationType == .strikeOut {
                        item.isSelected = true
                    }
                } else if item.itemIdentifier == KMToolbarInkAnnotationItemIdentifier {
                    if annotationType == .ink || annotationType == .eraser {
                        item.isSelected = true
                    }
                } else if item.itemIdentifier == KMToolbarFreeTextAnnotationItemIdentifier {
                    if annotationType == .freeText {
                        item.isSelected = true
                    }
                } else if item.itemIdentifier == KMToolbarAnchoredAnnotationItemIdentifier {
                    if annotationType == .anchored {
                        item.isSelected = true
                    }
                } else if item.itemIdentifier == KMToolbarSquareAnnotationItemIdentifier {
                    if annotationType == .square {
                        item.isSelected = true
                    }
                } else if item.itemIdentifier == KMToolbarCircleAnnotationItemIdentifier {
                    if annotationType == .circle {
                        item.isSelected = true
                    }
                } else if item.itemIdentifier == KMToolbarArrowAnnotationItemIdentifier {
                    if annotationType == .arrow {
                        item.isSelected = true
                    }
                } else if item.itemIdentifier == KMToolbarLineAnnotationItemIdentifier {
                    if annotationType == .line {
                        item.isSelected = true
                    }
                } else if item.itemIdentifier == KMToolbarLinkAnnotationItemIdentifier {
                    if annotationType == .link {
                        item.isSelected = true
                    }
                } else if item.itemIdentifier == KMAnnotationStampToolbarItemIdentifier {
                    if annotationType == .stamp {
                        item.isSelected = true
                    }
                } else if item.itemIdentifier == KMToolbarSignSignatureAnnotationItemIdentifier {
                    if annotationType == .signSignature {
                        item.isSelected = true
                    }
                } else if toolMode == .moveToolMode {
                    if item.itemIdentifier == KMToolbarMoveToolModeItemIdentifier {
                        item.isSelected = true
                    }
                } else if toolMode == .magnifyToolMode {
                    if item.itemIdentifier == KMToolbarMagnifyToolModeItemIdentifier {
                        item.isSelected = true
                    }
                } else if toolMode == .selectToolMode {
                    if item.itemIdentifier == KMToolbarSelectToolModeItemIdentifier {
                        item.isSelected = true
                    }
                } else if toolMode == .selectZoomToolMode {
                    if item.itemIdentifier == KMToolbarZoomToSelectionItemIdentifier {
                        item.isSelected = true
                    }
                }
                
                if (item.itemIdentifier == KMToolbarShowToolbarItemIdentifier) {
                    item.isSelected = !self.isShowAllAnnotations
                }
            } else if self.toolbarType == .FillSign {
                item.isSelected = false
                if toolMode == .selfSignMode {
                    if item.itemIdentifier == KMToolbarToolHookItemIdentifier {
                       if annotationType == .signTure {
                            item.isSelected = true
                        }
                    } else if item.itemIdentifier == KMToolbarToolForkItemIdentifier {
                        if annotationType == .signFalse {
                            item.isSelected = true
                        }
                    } else if item.itemIdentifier == KMToolbarToolLineItemIdentifier {
                        if annotationType == .signLine {
                            item.isSelected = true
                        }
                    } else if item.itemIdentifier == KMToolbarToolDotItemIdentifier {
                        if annotationType == .signDot {
                            item.isSelected = true
                        }
                    } else if item.itemIdentifier == KMToolbarToolRectangleIdentifier {
                        if annotationType == .signCircle {
                            item.isSelected = true
                        }
                    } else if item.itemIdentifier == KMToolbarToolDateIdentifier {
                        if annotationType == .signDate {
                            item.isSelected = true
                        }
                    } else if item.itemIdentifier == KMToolbarToolTextIdentifier {
                        if annotationType == .signText {
                            item.isSelected = true
                        }
                    } else if (item.itemIdentifier == KMToolbarFillSignSignatureIdentifier) {
                        if (annotationType == .signSignature) {
                            item.isSelected = true
                        }
                    }
                }
            } else if self.toolbarType == .Form {
                item.isSelected = false
                if toolMode == .formToolMode {
                    if item.itemIdentifier == KMToolbarToolTextFieldItemIdentifier {
                       if annotationType == .textField {
                            item.isSelected = true
                        }
                    } else if item.itemIdentifier == KMToolbarToolCheckBoxItemIdentifier {
                        if annotationType == .checkBox {
                            item.isSelected = true
                        }
                    } else if item.itemIdentifier == KMToolbarToolRadioButtonItemIdentifier {
                        if annotationType == .radioButton {
                            item.isSelected = true
                        }
                    } else if item.itemIdentifier == KMToolbarToolListBoxItemIdentifier {
                        if annotationType == .listMenu {
                            item.isSelected = true
                        }
                    } else if item.itemIdentifier == KMToolbarToolPullDownmenuItemIdentifier {
                        if annotationType == .comboBox {
                            item.isSelected = true
                        }
                    } else if item.itemIdentifier == KMToolbarToolButtonIdentifier {
                        if annotationType == .actionButton {
                            item.isSelected = true
                        }
                    } else if item.itemIdentifier == KMToolbarToolSignBoxIdentifier {
                        if annotationType == .signature {
                            item.isSelected = true
                        }
                    }
                }
            }
        }
    }
}

extension KMToolbarViewController: NSSearchFieldDelegate {

}

extension KMToolbarViewController {
    private func _setupMainItem(_ item: KMToolbarItemView?) {
        let identifier = item?.itemIdentifier
        if identifier == KMLeftControlToolbarItemIdentifier {
            item?.image = NSImage(named: "KMImageNameUXIconBtnTriLeftNor")
            item?.titleName = NSLocalizedString("Panel", comment: "")
            item?.target = self
            item?.toolTip = NSLocalizedString("View Settings", comment: "")
            item?.boxImagePosition = .imageAbove
            item?.selectBackgroundType = .imageBox
            item?.btnAction = #selector(_itemAction)
        } else if identifier == KMDocumentZoomViewToolbarItemIdentifier{
            item?.titleName = NSLocalizedString("Zoom", comment: "")
            item?.target = self
            
            let view = KMToolbarZoomItemView(zoomView: self.zoomView)
            view.callback = { [weak self] idx, _ in
                if idx == 2 {
                    self?.delegate?.changePDFViewZoomInAction?()
                } else if idx == 1 {
                    self?.delegate?.changePDFViewZoomOutAction?()
                }
            }
            item?.customizeView = view
        } else if identifier == KMDocumentPreviousPageToolbarItemIdentifier {
            item?.titleName = NSLocalizedString("Zoom", comment: "")
            item?.target = self
            
            let view = KMToolbarPreviousNextItemView()
            view.callback = { [weak self] idx, _ in
                if idx == 1 {
                    self?.delegate?.changePDFViewGoToPreviousPageAction?()
                } else if idx == 2 {
                    self?.delegate?.changePDFViewGotoNextPageAction?()
                }
            }
            item?.customizeView = view
        } else if identifier == KMDocumentHomeToolbarItemIdentifier {
            item?.image = NSImage(named: "KMImageNameToolbarHomeNor")
            item?.titleName = NSLocalizedString("Home", comment: "")
            item?.target = self
            item?.toolTip = NSLocalizedString("A Welcome Gift from Us", comment: "")
            item?.boxImagePosition = .imageAbove
            item?.selectBackgroundType = .imageBox
            item?.btnAction = #selector(_itemAction)
        } else if identifier == KMDocumentAnnotationToolbarItemIdentifier {
            item?.titleName = NSLocalizedString("Tools", comment: "")
            item?.image = NSImage(named: "KMImageNameUXIconToolbarMytoolsNor")
            item?.target = self
            item?.toolTip = String(format: "%@: %@, %@, %@, %@",  KMLocalizedString("Tool Mode", nil),KMLocalizedString("Annotate", nil),KMLocalizedString("Scroll", nil),KMLocalizedString("Magnify", nil),KMLocalizedString("Select", nil))
            item?.btnTag = KMToolbarViewType.Annatiton.rawValue
            item?.btnAction = #selector(leftControllButtonAction)
            item?.boxImagePosition = .imageAbove
            item?.selectBackgroundType = .imageBox
            
            let menuItem = NSMenuItem(title: item?.titleName ?? "", action: #selector(_menuItemAction), keyEquivalent: "")
            menuItem.target = self
            menuItem.representedObject = identifier
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMDocumentPageToolbarItemIdentifier {
            item?.titleName = NSLocalizedString("Page Edit", comment: "")
            item?.target = self
            item?.image = NSImage(named: "KMImageNameUXIconToolbarPageeditNor")
            item?.toolTip = NSLocalizedString("PDF page editor: insert, delete, extract, rotate, reposition, and replace pages in a PDF", comment: "")
            item?.btnTag = KMToolbarViewType.Page.rawValue
            item?.btnAction = #selector(leftControllButtonAction)
            item?.boxImagePosition = .imageAbove
            item?.selectBackgroundType = .imageBox
            
            let menuItem = NSMenuItem(title: item?.titleName ?? "", action: #selector(_menuItemAction), keyEquivalent: "")
            menuItem.target = self
            menuItem.representedObject = identifier
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMDocumentConversonToolbarItemIdentifier {
            item?.titleName = NSLocalizedString("Converter", comment: "")
            item?.target = self
            item?.image = NSImage(named: "KMImageNameUXIconToolbarConvertNor")
            item?.toolTip = NSLocalizedString("Convert PDFs to Microsoft Word, PowerPoint, Excel, RTF, Text, Image, CSV, and more Offline", comment: "")
            item?.btnTag = KMToolbarViewType.Conversion.rawValue
            item?.btnAction = #selector(leftControllButtonAction)
            item?.boxImagePosition = .imageAbove
            item?.selectBackgroundType = .imageBox
            item?.promptIdentifier = identifier
            
            let menuItem = NSMenuItem(title: NSLocalizedString("Converter", comment: ""), action: #selector(_menuItemAction), keyEquivalent: "")
            menuItem.target = self
            menuItem.representedObject = identifier
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMDocumentScanOCRToolbarItemIdentifier {
            item?.titleName = NSLocalizedString("OCR", comment: "")
            item?.target = self
            item?.image = NSImage(named: "KMImageNameToolbarOCRNor")
            item?.boxImagePosition = .imageAbove
            item?.toolTip = NSLocalizedString("Recognize text from Image-based or Scanned PDF with OCR", comment: "")
            item?.selectBackgroundType = .imageBox
            item?.btnAction = #selector(OCRbtnAction1)
            item?.promptIdentifier = identifier
            
            let menuItem = NSMenuItem.init(title: NSLocalizedString("OCR", comment: ""), action: #selector(_menuItemAction), target: self)
            menuItem.representedObject = identifier
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMToolbarToolEnhancedScanIdentifier {
            item?.image = NSImage(named: "KMImageNameMainToolEnhancedScan")
            item?.target = self
            item?.btnTag = 0
            item?.toolTip = NSLocalizedString("Enhanced Scan", comment: "")
            item?.titleName = NSLocalizedString("Enhanced Scan", comment: "")
            item?.boxImagePosition = .imageLeft
            item?.selectBackgroundType = .imageBox
            item?.btnAction = #selector(scanOCRModelSelect)
        } else if identifier == KMToolbarToolOCRTextIdentifier {
            item?.image = NSImage(named: "KMImageNameMainToolOCRText")
            item?.target = self
            item?.toolTip = NSLocalizedString("OCR Text Recognition", comment: "")
            item?.titleName = NSLocalizedString("OCR Text Recognition", comment: "")
            item?.boxImagePosition = .imageLeft
            item?.selectBackgroundType = .imageBox
            item?.btnAction = #selector(scanOCRModelSelect)
            item?.promptIdentifier = identifier
            
            let menuItem = NSMenuItem.init(title: NSLocalizedString("OCR Text Recognition", comment: ""), action: #selector(scanOCRModelSelect), target: self)
            menuItem.representedObject = identifier
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMDocumentEditToolbarItemIdentifier {
            item?.titleName = NSLocalizedString("Edit PDF", comment: "")
            item?.target = self
            item?.image = NSImage(named: "KMImageNameUXIconToolbarEditNor")
            item?.boxImagePosition = .imageAbove
            item?.btnTag = KMToolbarViewType.editPDF.rawValue
            item?.toolTip = NSLocalizedString("Edit text and image in PDF ", comment: "")
            item?.selectBackgroundType = .imageBox
            item?.btnAction = #selector(leftControllButtonAction)
            item?.promptIdentifier = identifier
            
            let menuItem = NSMenuItem.init(title: NSLocalizedString("Edit PDF", comment: ""), action: #selector(_menuItemAction), target: self)
            menuItem.tag = item!.btnTag
            menuItem.representedObject = identifier
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMDocumentFormToolbarItemIdentifier {
            item?.titleName = NSLocalizedString("Forms", comment: "")
            item?.target = self
            item?.image = NSImage(named: "KMImageNameUXIconToolbarFormNor")
            item?.boxImagePosition = .imageAbove
            item?.btnTag = KMToolbarViewType.Form.rawValue
            item?.toolTip = NSLocalizedString("Edit PDF Form", comment: "")
            item?.selectBackgroundType = .imageBox
            item?.btnAction = #selector(leftControllButtonAction)
            item?.promptIdentifier = identifier
            
            let menuItem = NSMenuItem.init(title: NSLocalizedString("Forms", comment: ""), action: #selector(_menuItemAction), target: self)
            menuItem.tag = item!.btnTag
            menuItem.representedObject = identifier
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMDocumentFillSginToolbarItemIdentifier {
            item?.titleName = NSLocalizedString("Fill & Sign", comment: "")
            item?.target = self
            item?.image = NSImage(named: "KMImageNameUXIconToolbarFillsignNor")
            item?.boxImagePosition = .imageAbove
            item?.btnTag = KMToolbarViewType.FillSign.rawValue
            item?.toolTip = NSLocalizedString("Fill and sign forms", comment: "")
            item?.selectBackgroundType = .imageBox
            item?.btnAction = #selector(leftControllButtonAction)
            item?.promptIdentifier = identifier
            
            let menuItem = NSMenuItem.init(title: NSLocalizedString("Fill & Sign", comment: ""), action: #selector(_menuItemAction), target: self)
            menuItem.tag = item!.btnTag
            menuItem.representedObject = identifier
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMDocumentToolToolbarItemIdentifier {
            item?.titleName = NSLocalizedString("Editor", comment: "")
            item?.target = self
            item?.image = NSImage(named: "KMImageNameUXIconToolbarEdittoolNor")
            item?.boxImagePosition = .imageAbove
            item?.btnTag = KMToolbarViewType.Tool.rawValue
            item?.toolTip = NSLocalizedString("Edit, delete, cut, copy, paste, and insert text in PDFs", comment: "")
            item?.selectBackgroundType = .imageBox
            item?.btnAction = #selector(leftControllButtonAction)
            item?.promptIdentifier = identifier
            
            let menuItem = NSMenuItem(title: item?.titleName ?? "", action: #selector(_menuItemAction), keyEquivalent: "")
            menuItem.target = self
            menuItem.representedObject = identifier
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMDocumentRedactToolbarItemIdentifier {
            item?.titleName = NSLocalizedString("Redact Text", comment: "")
            item?.target = self
            item?.image = NSImage(named: "KMImageNameUXIconToolbarRedactNor")
            item?.boxImagePosition = .imageAbove
            item?.toolTip = NSLocalizedString("Mark for redaction", comment: "")
            item?.selectBackgroundType = .imageBox
            item?.btnAction = #selector(_itemAction)
            item?.promptIdentifier = identifier
            
            let menuItem = NSMenuItem(title: item?.titleName ?? "", action: #selector(_menuItemAction), keyEquivalent: "")
            menuItem.target = self
            menuItem.representedObject = identifier
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMDocumentAITranslationToolbarItemIdentifier {
            item?.image = NSImage(named: "ic_function_other_AITranslation")
            item?.titleName = "AI Translation"
            item?.target = self
            item?.toolTip = NSLocalizedString("AI Translation", comment: "")
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(aiTranslationButtonAction)
            item?.promptIdentifier = identifier
        } else if identifier == KMDocumentPrintToolbarItemIdentifier {
            item?.image = NSImage(named: "KMImageNameToolbarPrintNor")
            item?.titleName = "Print"
            item?.target = self
            item?.toolTip = NSLocalizedString("Print", comment: "")
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(_itemAction)
        } else if identifier == KMDocumentViewDisplayToolbarItemIdentifier {
            item?.image = NSImage(named: "KMImageNameUXIconToolbarPageviewNor")
            item?.titleName = NSLocalizedString("Page Display", comment: "")
            item?.target = self
            item?.toolTip = NSLocalizedString("Page Display", comment: "")
            item?.boxImagePosition = .imageAbove
            item?.selectBackgroundType = .imageBox
            item?.btnAction = #selector(_itemAction)
            item?.promptIdentifier = identifier
            
            let menuItem = NSMenuItem.init(title: NSLocalizedString("Page Display", comment: ""), action: #selector(_menuItemAction), target: self)
            menuItem.representedObject = identifier
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMDocumentAIToolsToolbarItemIdentifier {
            item?.image = NSImage(named: "KMImageNameUXIconAINor")
            item?.titleName = NSLocalizedString("AI Tools", comment: "")
            item?.target = self
            item?.toolTip = NSLocalizedString("AI Tools", comment: "")
            item?.boxImagePosition = .imageAbove
            item?.selectBackgroundType = .imageBox
            item?.btnAction = #selector(_itemAction)
            item?.promptIdentifier = identifier
            
            let menuItem = NSMenuItem.init(title: NSLocalizedString("AI Tools", comment: ""), action: #selector(_menuItemAction), target: self)
            menuItem.representedObject = identifier
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMDocumentShareToolbarItemIdentifier {
            item?.image = NSImage(named: "KMImageNameUXIconToolbarShareNor")
            item?.titleName = NSLocalizedString("Share", comment: "")
            item?.target = self
//            item?.toolTip = NSLocalizedString("Share the file with others", comment: "")
            item?.boxImagePosition = .imageAbove
            item?.selectBackgroundType = .imageBox
            item?.btnAction = #selector(shareButtonAction)
            
            let menuItem = NSMenuItem.init(title: item?.titleName ?? "", action: nil, target: self)
            let menu = NSMenu()
            _ = menu.addItem(withTitle: NSLocalizedString("Document", comment: ""), action: #selector(shareViaWithDocument), target: self)
            _ = menu.addItem(withTitle: NSLocalizedString("Flattened Copy", comment: ""), action: #selector(shareViaWithFlatten), target: self)
            _ = menu.addItem(withTitle: NSLocalizedString("Original PDF", comment: ""), action: #selector(shareViaWithOriginalPDF), target: self)
            menuItem.submenu = menu
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMDocumentSearchToolbarItemIdentifier {
            item?.titleName = NSLocalizedString("Search", comment: "")
            item?.target = self
            let view = NSView()
            view.frame = NSMakeRect(0, 0, 150, 40)
            let boxView = NSView()
            boxView.frame = NSMakeRect(0, 16, 150, 22)
            view.addSubview(boxView)
            let searchView = NSSearchField()
            searchView.frame = NSMakeRect(0, 0, 150, 22)
            searchView.placeholderString = NSLocalizedString("Search", comment: "")
            searchView.sendsWholeSearchString = true
            searchView.sendsSearchStringImmediately = true
            searchView.drawsBackground = false
            searchView.delegate = self
            self.searchField = searchView
            
            self.refreshSearchBarMenu()
            
            boxView.addSubview(searchView)
            let titleLabel = NSTextField(labelWithString: NSLocalizedString("Search", comment: ""))
            view.addSubview(titleLabel)
            titleLabel.frame = NSMakeRect(0, 0, 130, 14)
            titleLabel.alignment = .center
            titleLabel.textColor = KMAppearance.subtitleColor()
            titleLabel.font = KMToolbarMainItemView.textFont
            
            item?.customizeView = view
            
            let menuItem = NSMenuItem.init(title: NSLocalizedString("Search", comment: ""), action: #selector(_menuItemAction), target: self)
            menuItem.representedObject = identifier
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMRightControlToolbarItemIdentifier {
            item?.image = NSImage(named: "KMImageNameUXIconBtnTriRightNor")
            item?.titleName = NSLocalizedString("Properties", comment: "")
            item?.target = self
            item?.toolTip = NSLocalizedString("Show/Hide Annotation Properties Panel", comment: "")
            item?.boxImagePosition = .imageAbove
            item?.selectBackgroundType = .imageBox
            item?.btnAction = #selector(_itemAction)
            let menuItem = NSMenuItem.init(title: NSLocalizedString("Properties", comment: ""), action: #selector(_menuItemAction), target: self)
            menuItem.representedObject = identifier
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMToolbarToolRedactItemIdentifier {
            item?.image = NSImage(named: "KMImageNameMainToolsRedact")
            item?.target = self
            item?.btnTag = KMToolbarType.redact.rawValue
            item?.toolTip = NSLocalizedString("Redact", comment: "")
            item?.titleName = NSLocalizedString("Redact", comment: "")
            item?.selectBackgroundType = .imageBox
            item?.btnAction = #selector(redactMenuAction)
            item?.promptIdentifier = identifier
            
            let menuItem = NSMenuItem.init(title: NSLocalizedString("Redact", comment: ""), action: #selector(redactMenuAction), target: self)
            menuItem.tag = item!.btnTag
            menuItem.representedObject = identifier
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMDocumentDigitalSignToolbarItemIdentifier {
            item?.image = NSImage(named: "DigitalSign_icon")
            item?.target = self
            item?.toolTip = NSLocalizedString("Digital signature ensures the authenticity and integrity of digital files. Click and drag the cursor to create a signature field on the page.", comment: "")
            item?.titleName = NSLocalizedString("Digital Sign", comment: "")
            item?.selectBackgroundType = .imageBox
            item?.boxImagePosition = .imageAbove
            item?.btnAction = #selector(_itemAction)
            item?.promptIdentifier = identifier
            
            let menuItem = NSMenuItem.init(title: NSLocalizedString("Digital Sign", comment: ""), action: #selector(_menuItemAction), target: self)
            menuItem.tag = item!.btnTag
            menuItem.representedObject = identifier
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMDocumentPreviousBackToolbarItemIdentifier {
            let view = KMToolbarPreviousBackItemView()
            item?.customizeView = view
            view.callback = { [weak self] idx, _ in
                if idx == 1 {
                    self?.delegate?.changePDFViewGoToForwardAction?()
                } else if idx == 2 {
                    self?.delegate?.changePDFViewGotoBackAction?()
                }
            }
        } else if identifier == KMDocumentFirstLastToolbarItemIdentifier {
            let view = KMToolbarFirstLastItemView()
            item?.customizeView = view
            view.callback = { [weak self] idx, _ in
                if let item = self?.toolbarItemFindItemIdentifiers(value: identifier!) {
                    self?.delegate?.toolbarViewController?(self!, viewItemDidClick: item, index: idx, info: nil)
                }
            }
        } else if identifier == KMDocumentPageIndicatorToolbarItemIdentifier {
//            let view = KMToolbarPageIndicatorItemView(zoomView: nil)
//            item?.customizeView = view
        } else if identifier == KMDocumentPresentationToolbarItemIdentifier {
            item?.image = NSImage(named: "KMImageNameToolbarSlideshowNor")
            item?.titleName = NSLocalizedString("Presentation", comment: "")
            item?.selectBackgroundType = .imageBox
            item?.boxImagePosition = .imageAbove
            
            item?.target = self
            item?.btnTag = KMToolbarType.conversion_image.rawValue
//            item?.toolTip = NSLocalizedString("Convert PDF to JPEG, PNG, TIFF, BMP, GIF or TGA files", comment: "")
            item?.btnAction = #selector(_itemAction)
            item?.promptIdentifier = identifier
            
            let menuItem = NSMenuItem(title: item?.titleName ?? "", action: #selector(_menuItemAction), keyEquivalent: "")
            menuItem.target = self
            menuItem.representedObject = identifier
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMToolbarFixedSpaceItemIdentifier {
            let view = NSView()
            view.frame = NSMakeRect(0, 0, 36, 36)
            item?.customizeView = view
        }
    }
    
    private func _setupAnnotationItem(_ item: KMToolbarItemView?) {
        let identifier = item?.itemIdentifier
        if identifier == KMToolbarMoveToolModeItemIdentifier {
            item?.titleName = NSLocalizedString("Scroll Tool", comment: "")
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsPantool)
            item?.target = self
            item?.btnTag = KMToolbarViewType.Move.rawValue
            item?.isShowCustomToolTip = true
            item?.toolTip = NSLocalizedString("Scroll Tool", comment: "")
            item?.isPopToolTip = true
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(leftControllButtonAction)
        } else if identifier == KMToolbarMagnifyToolModeItemIdentifier {
            item?.titleName = NSLocalizedString("Magnify Tool", comment: "")
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsMagnifier)
            item?.target = self
            item?.btnTag = KMToolbarViewType.Magnify.rawValue
            item?.isShowCustomToolTip = true
            item?.toolTip = NSLocalizedString("Magnify Tool", comment: "")
            item?.isPopToolTip = true
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(leftControllButtonAction)
        } else if identifier == KMToolbarSelectToolModeItemIdentifier {
            item?.titleName = NSLocalizedString("Content Selection Tool", comment: "")
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsContentsel)
            item?.target = self
            item?.btnTag = KMToolbarViewType.Select.rawValue
            item?.isShowCustomToolTip = true
            item?.toolTip = NSLocalizedString("Content Selection Tool", comment: "")
            item?.isPopToolTip = true
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(leftControllButtonAction)
        } else if identifier == KMToolbarZoomToSelectionItemIdentifier {
            item?.titleName = NSLocalizedString("Zoom to selected area", comment: "")
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsAreazoom)
            item?.target = self
            item?.btnTag = KMToolbarViewType.SelectZoom.rawValue
            item?.isShowCustomToolTip = true
            item?.toolTip = NSLocalizedString("Zoom to selected area", comment: "")
            item?.isPopToolTip = true
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(leftControllButtonAction)
        } else if identifier == KMToolbarHighlightAnnotationItemIdentifier {
            item?.titleName = NSLocalizedString("Highlight", comment: "")
//            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsUnderline)
            let imageV = KMNoteTypeImageView()
            let color = UserDefaults.standard.PDFListViewColor(forKey: CHighlightNoteColorKey) ?? .red
            item?.image = imageV.noteTypeImage(withType: SKNHighlightString, color: color)
            item?.target = self
            item?.btnTag = CAnnotationType.highlight.rawValue
            item?.isShowCustomToolTip = true
            item?.toolTip = String(format: "%@ (⌃⌘H)", NSLocalizedString("Highlight", comment: ""))
            item?.isPopToolTip = true
            item?.boxImagePosition = .imageOnly
            
            item?.btnAction = #selector(changeAnnotationMode)
        } else if identifier == KMToolbarUnderlineAnnotationItemIdentifier {
            item?.titleName = NSLocalizedString("Underline", comment: "")
//            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsUnderline)
            let imageV = KMNoteTypeImageView()
            let color = UserDefaults.standard.PDFListViewColor(forKey: CUnderlineNoteColorKey) ?? .red
            item?.image = imageV.noteTypeImage(withType: SKNUnderlineString, color: color)
            item?.target = self
            item?.btnTag = CAnnotationType.underline.rawValue
            item?.isShowCustomToolTip = true
            item?.toolTip = String(format: "%@ (⇧⌘M)", NSLocalizedString("Underline", comment: ""))
            item?.isPopToolTip = true
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(changeAnnotationMode)
        } else if identifier == KMToolbarStrikeOutAnnotationItemIdentifier {
            item?.titleName = NSLocalizedString("Strikethrough", comment: "")
//            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsStrikeout)
            let imageV = KMNoteTypeImageView()
            let color = UserDefaults.standard.PDFListViewColor(forKey: CStrikeOutNoteColorKey) ?? .red
            item?.image = imageV.noteTypeImage(withType: SKNStrikeOutString, color: color)
            item?.target = self
            item?.btnTag = CAnnotationType.strikeOut.rawValue
            item?.isShowCustomToolTip = true
            item?.toolTip = String(format: "%@ (⌃⌘M)", NSLocalizedString("Strikethrough", comment: ""))
            item?.isPopToolTip = true
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(changeAnnotationMode)
        } else if identifier == KMToolbarInkAnnotationItemIdentifier {
            item?.titleName = NSLocalizedString("Freehand", comment: "")
//            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsPen)
            let imageV = KMNoteTypeImageView()
            let color = UserDefaults.standard.PDFListViewColor(forKey: CInkNoteColorKey) ?? .red
            item?.image = imageV.noteTypeImage(withType: SKNInkString, color: color)
            item?.target = self
            item?.btnTag = CAnnotationType.ink.rawValue
            item?.isShowCustomToolTip = true
            item?.toolTip = NSLocalizedString("Add freehand drawings by hand writing just like you do with a pen.", comment: "")
            item?.isPopToolTip = true
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(changeAnnotationMode)
        } else if identifier == KMToolbarFreeTextAnnotationItemIdentifier {
            item?.titleName = NSLocalizedString("Text Note", comment: "")
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsText)
            item?.target = self
            item?.btnTag = CAnnotationType.freeText.rawValue
            item?.isShowCustomToolTip = true
            item?.toolTip = String(format: "%@ (⌘N)", NSLocalizedString("Text Note", comment: ""))
            item?.isPopToolTip = true
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(changeAnnotationMode)
        } else if identifier == KMToolbarAnchoredAnnotationItemIdentifier {
            item?.titleName = NSLocalizedString("Anchored Note", comment: "")
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsNote)
            item?.target = self
            item?.btnTag = CAnnotationType.anchored.rawValue
            item?.isShowCustomToolTip = true
            item?.toolTip = String(format: "%@ (⌥⌘N)", NSLocalizedString("Anchored Note", comment: ""))
            item?.isPopToolTip = true
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(changeAnnotationMode)
        } else if identifier == KMToolbarSquareAnnotationItemIdentifier {
            item?.titleName = NSLocalizedString("Rectangle", comment: "")
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsRec)
            item?.target = self
            item?.btnTag = CAnnotationType.square.rawValue
            item?.isShowCustomToolTip = true
            item?.toolTip = NSLocalizedString("Draw rectangle; draw square by holding Shift key", comment: "")
            item?.isPopToolTip = true
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(changeAnnotationMode)
        }else if identifier == KMToolbarCircleAnnotationItemIdentifier {
            item?.titleName = NSLocalizedString("Circle", comment: "")
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsOval)
            item?.target = self
            item?.btnTag = CAnnotationType.circle.rawValue
            item?.isShowCustomToolTip = true
            item?.toolTip = NSLocalizedString("Draw oval; draw circle by holding Shift key", comment: "")
            item?.isPopToolTip = true
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(changeAnnotationMode)
        }  else if identifier == KMToolbarArrowAnnotationItemIdentifier {
            item?.titleName = NSLocalizedString("Arrow", comment: "")
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsArrow)
            item?.target = self
            item?.btnTag = CAnnotationType.arrow.rawValue
            item?.isShowCustomToolTip = true
            item?.toolTip = NSLocalizedString("Draw arrow; draw straight arrow by holding Shift key", comment: "")
            item?.isPopToolTip = true
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(changeAnnotationMode)
        }  else if identifier == KMToolbarLineAnnotationItemIdentifier {
            item?.titleName = NSLocalizedString("Line", comment: "")
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsLine)
            item?.target = self
            item?.btnTag = CAnnotationType.line.rawValue
            item?.isShowCustomToolTip = true
            item?.toolTip = NSLocalizedString("Draw line; draw straight line by holding Shift key", comment: "")
            item?.isPopToolTip = true
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(changeAnnotationMode)
        }  else if identifier ==  KMToolbarLinkAnnotationItemIdentifier {
            item?.titleName = NSLocalizedString("Link", comment: "")
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsLink)
            item?.target = self
            item?.btnTag = CAnnotationType.link.rawValue
            item?.isShowCustomToolTip = true
            item?.toolTip = NSLocalizedString("Select an area or text on a page for a link to be inserted.", comment: "")
            item?.isPopToolTip = true
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(changeAnnotationMode)
        } else if identifier == KMToolbarSignSignatureAnnotationItemIdentifier {
            item?.titleName = NSLocalizedString("Signature", comment: "")
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsSign)
            item?.target = self
            item?.btnTag = CAnnotationType.signSignature.rawValue
            item?.isShowCustomToolTip = true
            item?.toolTip = NSLocalizedString("Add beautiful handwriting or use your trackpad to create your own signature.", comment: "")
            item?.isPopToolTip = true
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(changeAnnotationMode)
        } else if identifier == KMAnnotationStampToolbarItemIdentifier {
            item?.titleName = NSLocalizedString("Stamp", comment: "")
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsStamp)
            item?.target = self
            item?.btnTag = CAnnotationType.stamp.rawValue
            item?.isShowCustomToolTip = true
            item?.toolTip = NSLocalizedString("Add New Stamp", comment: "")
            item?.isPopToolTip = true
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(changeAnnotationMode)
        } else if identifier == KMToolbarShowToolbarItemIdentifier {
            item?.image = NSImage(named: "KMImageNameMainToolShow")
            item?.selectedImage = NSImage(named: "KMImageNameMainToolHide")
            item?.alternateImage = NSImage(named: "KMImageNameMainToolShow")
            item?.selectedBackgroundColor = NSColor.clear
            item?.target = self
            item?.isShowCustomToolTip = true
            item?.toolTip = NSLocalizedString("Hide", comment: "")
            item?.isPopToolTip = true
            item?.titleName = NSLocalizedString("Hide", comment: "")
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(showPDFLayoutMode)
        } else if identifier == KMToolbarAnnotationSettingItemIdentifier {
            item?.image = NSImage(named: "KMImageNameUXIconBtnSetNor")
            item?.target = self
            item?.isShowCustomToolTip = true
            item?.toolTip = String(format: "%@\n%@", NSLocalizedString("Customize Toolbar", comment: ""),NSLocalizedString("Drag-and-drop tools to change their order", comment: ""))
            item?.isPopToolTip = true
            item?.titleName = NSLocalizedString("Setting", comment: "")
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(_itemAction)
            item?.selectBackgroundType = .imageBox
        } else if identifier == KMAnnotationImageToolbarItemIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsImage)
            item?.target = self
            item?.titleName = NSLocalizedString("Image", comment: "")
            item?.isShowCustomToolTip = true
            item?.toolTip = NSLocalizedString("Choose an image to insert in a page.", comment: "")
            item?.isPopToolTip = true
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(_itemAction)
        } else if identifier == KMAnnotationTableToolbarItemIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsTable)
            item?.target = self
            item?.btnTag = CAnnotationType.table.rawValue
            item?.titleName = NSLocalizedString("Table", comment: "")
            item?.isShowCustomToolTip = true
            item?.toolTip = NSLocalizedString("Table", comment: "")
            item?.isPopToolTip = true
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(_itemAction)
        }
    }
    
    private func _setupEditItem(_ item: KMToolbarItemView?) {
        let identifier = item?.itemIdentifier
        if identifier == KMToolbarAddTextEditPDFItemIdentifier {
            item?.image = NSImage(named: "KMImageNameButtonEidtPDFText")
            item?.target = self
            item?.btnTag = CAnnotationType.addText.rawValue
            item?.toolTip = NSLocalizedString("Add Text", comment: "")
            item?.titleName = NSLocalizedString("Add Text", comment: "")
            item?.boxImagePosition = .imageLeft
            item?.btnAction = #selector(changeAnnotationMode)
        }  else if identifier == KMToolbarAddImageEditPDFItemIdentifier {
            item?.image = NSImage(named: "KMImageNameButtonEidtPDFImage")
            item?.target = self
            item?.btnTag = CAnnotationType.addImage.rawValue
            item?.toolTip = NSLocalizedString("Add Image", comment: "")
            item?.titleName = NSLocalizedString("Add Image", comment: "")
            item?.boxImagePosition = .imageLeft
            item?.btnAction = #selector(changeAnnotationMode)
        }
    }
    
    private func _setupConvertItem(_ item: KMToolbarItemView?) {
        let identifier = item?.itemIdentifier
        if identifier == KMToolbarConversionWordItemIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertWord)
            item?.target = self
            item?.btnTag = KMToolbarType.word.rawValue
            item?.toolTip = NSLocalizedString("Convert all the great work stored in your PDF to a Word document that’s easy to update. Keep the fonts and layouts intact — including bullets and tables.", comment: "")
            item?.titleName = NSLocalizedString("To Word", comment: "")
            item?.boxImagePosition = .imageLeft
            item?.btnAction = #selector(conversionMenuItemAction)
            item?.promptIdentifier = identifier
        } else if identifier == KMToolbarConversionExcelItemIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertExcel)
            item?.target = self
            item?.btnTag = KMToolbarType.excel.rawValue
            item?.toolTip = NSLocalizedString("Skip the data entry steps and tedious reformatting tasks, too. When you convert to Excel, your data is preserved along with your columns, layouts, and formatting.", comment: "")
            item?.titleName = NSLocalizedString("To Excel", comment: "")
            item?.boxImagePosition = .imageLeft
            item?.btnAction = #selector(conversionMenuItemAction)
            item?.promptIdentifier = identifier
        } else if identifier == KMToolbarConversionPPTItemIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertPPT)
            item?.target = self
            item?.btnTag = KMToolbarType.ppt.rawValue
            item?.toolTip = NSLocalizedString("When you use PDF Reader Pro to convert PDFs to PowerPoint, you know your formats will be saved, too. So you don’t have to bother redoing bullets, tables, objects, or master layouts.", comment: "")
            item?.titleName = NSLocalizedString("To PPT", comment: "")
            item?.boxImagePosition = .imageLeft
            item?.btnAction = #selector(conversionMenuItemAction)
            item?.promptIdentifier = identifier
        } else if identifier == KMToolbarConversionRTFItemIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertRTF)
            item?.target = self
            item?.btnTag = KMToolbarType.rtf.rawValue
            item?.toolTip = NSLocalizedString("Turn PDF documents into Rich Text Format (RTF) files that can be opened in virtually any word processor.", comment: "")
            item?.titleName = NSLocalizedString("To RTF", comment: "")
            item?.boxImagePosition = .imageLeft
            item?.btnAction = #selector(conversionMenuItemAction)
            item?.promptIdentifier = identifier
        } else if identifier == KMToolbarConversionCSVItemIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertCSV)
            item?.target = self
            item?.btnTag = KMToolbarType.csv.rawValue
            item?.toolTip = NSLocalizedString("PDF To CSV", comment: "")
            item?.titleName = NSLocalizedString("To CSV", comment: "")
            item?.boxImagePosition = .imageLeft
            item?.btnAction = #selector(conversionMenuItemAction)
            item?.promptIdentifier = identifier
        } else if identifier == KMToolbarConversionHTMLItemIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertHtml)
            item?.target = self
            item?.btnTag = KMToolbarType.html.rawValue
            item?.toolTip = NSLocalizedString("PDF To HTML", comment: "")
            item?.titleName = NSLocalizedString("To HTML", comment: "")
            item?.boxImagePosition = .imageLeft
            item?.btnAction = #selector(conversionMenuItemAction)
        } else if identifier == KMToolbarConversionTextItemIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertText)
            item?.target = self
            item?.btnTag = KMToolbarType.conversion_text.rawValue
            item?.toolTip = NSLocalizedString("PDF To Text", comment: "")
            item?.titleName = NSLocalizedString("To Text", comment: "")
            item?.boxImagePosition = .imageLeft
            item?.btnAction = #selector(conversionMenuItemAction)
        } else if identifier == KMToolbarConversionImageItemIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertPDFToIMG)
            item?.target = self
            item?.btnTag = KMToolbarType.conversion_image.rawValue
//            item?.toolTip = NSLocalizedString("Convert PDF to JPEG, PNG, TIFF, BMP, GIF or TGA files", comment: "")
            item?.titleName = NSLocalizedString("To Image", comment: "")
            item?.boxImagePosition = .imageExpandLeft
            item?.needExpandAction = true
            item?.btnAction = #selector(convertToImage)
            item?.promptIdentifier = identifier
            
            let menuItem = NSMenuItem.init(title: item?.titleName ?? "", action: nil, target: self)
            let subMenu = NSMenu()
            subMenu.addItem(title: NSLocalizedString("PDF To JPEG", comment: ""), action: #selector(_pdfToImageAction), target: self, tag: KMPDFConvertType.jpeg.rawValue)
            subMenu.addItem(title: NSLocalizedString("PDF To JPG", comment: ""), action: #selector(_pdfToImageAction), target: self, tag: KMPDFConvertType.jpg.rawValue)
            subMenu.addItem(title: NSLocalizedString("PDF To PNG", comment: ""), action: #selector(_pdfToImageAction), target: self, tag: KMPDFConvertType.png.rawValue)
            subMenu.addItem(title: NSLocalizedString("PDF To GIF", comment: ""), action: #selector(_pdfToImageAction), target: self, tag: KMPDFConvertType.gif.rawValue)
            subMenu.addItem(title: NSLocalizedString("PDF To TIFF", comment: ""), action: #selector(_pdfToImageAction), target: self, tag: KMPDFConvertType.tiff.rawValue)
            subMenu.addItem(title: NSLocalizedString("PDF To TGA", comment: ""), action: #selector(_pdfToImageAction), target: self, tag: KMPDFConvertType.tga.rawValue)
            subMenu.addItem(title: NSLocalizedString("PDF To BMP", comment: ""), action: #selector(_pdfToImageAction), target: self, tag: KMPDFConvertType.bmp.rawValue)
            
            menuItem.submenu = subMenu
            item?.menuFormRepresentation = menuItem
        } else if item?.itemIdentifier == KMToolbarConversionExportImageItemIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertExportImage)
            item?.target = self
//            item?.toolTip = NSLocalizedString("The range you can extract images includes current page, odd page, even page, custom page, and all pages.", comment: "")
            item?.titleName = NSLocalizedString("Extract Images", comment: "")
            item?.boxImagePosition = .imageExpandLeft
            item?.needExpandAction = true
            item?.promptIdentifier = identifier
            
            let menuItem = NSMenuItem.init(title: item?.titleName ?? "", action: nil, target: self)
            let subMenu = NSMenu()
            subMenu.addItem(title: NSLocalizedString("Extract All Images", comment: ""), action: #selector(_exportImageAction), target: self, tag: 1)
            subMenu.addItem(title: NSLocalizedString("Extract Images", comment: ""), action: #selector(_exportImageAction), target: self, tag: 2)
            
            menuItem.submenu = subMenu
            item?.menuFormRepresentation = menuItem
        } else if item?.itemIdentifier == KMToolbarConversionOCRIdentifier {
            item?.titleName = NSLocalizedString("OCR", comment: "")
            item?.target = self
            item?.image = NSImage(named: "KMImageNameToolbarOCRNor")
            item?.boxImagePosition = .imageLeft
            item?.toolTip = NSLocalizedString("Recognize text from Image-based or Scanned PDF with OCR", comment: "")
            item?.btnAction = #selector(OCRbtnAction2)
            
            let menuItem = NSMenuItem.init(title: NSLocalizedString("OCR", comment: ""), action: #selector(_menuItemAction), target: self)
            menuItem.representedObject = KMToolbarConversionOCRIdentifier
            item?.menuFormRepresentation = menuItem
        } else if item?.itemIdentifier == KMToolbarConversionCreatePDFItemIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertCreatPDF)
            item?.target = self
//            item?.toolTip = NSLocalizedString("Convert JPEG, JPG, PNG, TIFF, BMP or PSD files to PDFs", comment: "")
            item?.titleName = NSLocalizedString("New PDF Document", comment: "")
            item?.boxImagePosition = .imageExpandLeft
            item?.needExpandAction = true
            
            let menuItem = NSMenuItem.init(title: "New PDF Document", action: nil, target: self)
            let subMenu = NSMenu()
            subMenu.addItem(title: NSLocalizedString("New Blank Page", comment: ""), action: #selector(_newPDFAction), target: self, tag: 1)
            subMenu.addItem(title: NSLocalizedString("New From Images", comment: ""), action: #selector(_newPDFAction), target: self, tag: 2)
            subMenu.addItem(NSMenuItem.separator())
            subMenu.addItem(title: NSLocalizedString("New From Web Page", comment: ""), action: #selector(_newPDFAction), target: self, tag: 3)
            subMenu.addItem(title: NSLocalizedString("Import From Camera", comment: ""), action: #selector(_newPDFAction), target: self, tag: 4)
            subMenu.addItem(NSMenuItem.separator())
            subMenu.addItem(title: NSLocalizedString("Import From Scanner", comment: ""), action: #selector(_newPDFAction), target: self, tag: 5)
            
            menuItem.submenu = subMenu
            item?.menuFormRepresentation = menuItem
        }
                    
    }
    
    @objc func convertToImage(_ sender: KMToolbarItem) {
//        if let subMenu = sender.menuFormRepresentation?.submenu {
//            subMenu.popUp(positioning: nil, at: sender.frame.origin, in: sender.superview)
//        }
    }
    
    private func _setupFillSignItem(_ item: KMToolbarItemView?) {
        let identifier = item?.itemIdentifier
        if identifier == KMToolbarToolHookItemIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFillsignTick)
            item?.target = self
            item?.btnTag = CAnnotationType.signTure.rawValue
            item?.toolTip = NSLocalizedString("Signature", comment: "")
            item?.titleName = NSLocalizedString("Signature", comment: "")
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(changeAnnotationMode)
        } else if identifier == KMToolbarToolForkItemIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFillsignFork)
            item?.target = self
            item?.btnTag = CAnnotationType.signFalse.rawValue
            item?.toolTip = NSLocalizedString("Add X", comment: "")
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(changeAnnotationMode)
        } else if identifier == KMToolbarToolLineItemIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFillsignLine)
            item?.target = self
            item?.btnTag = CAnnotationType.signLine.rawValue
            item?.toolTip = NSLocalizedString("Add line", comment: "")
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(changeAnnotationMode)
        } else if identifier == KMToolbarToolDotItemIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFillsignPoint)
            item?.target = self
            item?.btnTag = CAnnotationType.signDot.rawValue
            item?.toolTip = NSLocalizedString("Add dot", comment: "")
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(changeAnnotationMode)
        } else if identifier == KMToolbarToolRectangleIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFillsignRoundedrec)
            item?.target = self
            item?.btnTag = CAnnotationType.signCircle.rawValue
            item?.toolTip = NSLocalizedString("Add circle", comment: "")
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(changeAnnotationMode)
        } else if identifier == KMToolbarToolTextIdentifier {
            item?.image = NSImage(named: KMImageNameToolbarFreeText)
            item?.target = self
            item?.btnTag = CAnnotationType.signText.rawValue
            item?.toolTip = NSLocalizedString("Add text", comment: "")
            item?.titleName = NSLocalizedString("Text", comment: "")
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(changeAnnotationMode)
        } else if identifier == KMToolbarToolDateIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFillsignDate)
            item?.target = self
            item?.btnTag = CAnnotationType.signDate.rawValue
            item?.toolTip = NSLocalizedString("Date", comment: "")
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(changeAnnotationMode)
        } else if (identifier == KMToolbarToolProfileIdentifier) {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFillsignMyprofile)
            item?.target = self
            item?.toolTip = NSLocalizedString("My Profile", comment: "")
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(_itemAction)
        }else if (identifier == KMToolbarFillSignSignatureIdentifier) {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFillsignMysignature)
            item?.target = self
            item?.btnTag = CAnnotationType.signSignature.rawValue
            item?.toolTip = NSLocalizedString("Sign document by typing or drawing a signature", comment: "")
            item?.boxImagePosition = .imageOnly
            item?.btnAction = #selector(changeAnnotationMode)
        }
    }
    
    private func _setupFormItem(_ item: KMToolbarItemView?) {
        let identifier = item?.itemIdentifier
        if identifier == KMToolbarToolTextFieldItemIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFormTextfield)
            item?.target = self
            item?.btnTag = CAnnotationType.textField.rawValue
            item?.toolTip = NSLocalizedString("Text Field", comment: "")
            item?.titleName = NSLocalizedString("Text Field", comment: "")
            item?.boxImagePosition = .imageLeft
            item?.btnAction = #selector(changeAnnotationMode)
            
            let menuItem = NSMenuItem.init(title: "TextField", action: #selector(changeAnnotationMode), target: self)
            menuItem.tag = item!.btnTag
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMToolbarToolCheckBoxItemIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFormCheckbox)
            item?.target = self
            item?.btnTag = CAnnotationType.checkBox.rawValue
            item?.toolTip = NSLocalizedString("Check Box", comment: "")
            item?.titleName = NSLocalizedString("Check Box", comment: "")
            item?.boxImagePosition = .imageLeft
            item?.btnAction = #selector(changeAnnotationMode)
        } else if identifier == KMToolbarToolRadioButtonItemIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFormRadiobutton)
            item?.target = self
            item?.btnTag = CAnnotationType.radioButton.rawValue
            item?.toolTip = NSLocalizedString("Radio Button", comment: "")
            item?.titleName = NSLocalizedString("Radio Button", comment: "")
            item?.boxImagePosition = .imageLeft
            item?.btnAction = #selector(changeAnnotationMode)
            
            let menuItem = NSMenuItem.init(title: "RadioButton", action: #selector(changeAnnotationMode), target: self)
            menuItem.tag = item!.btnTag
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMToolbarToolListBoxItemIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFormListbox)
            item?.target = self
            item?.btnTag = CAnnotationType.listMenu.rawValue
            item?.toolTip = NSLocalizedString("List Box", comment: "")
            item?.titleName = NSLocalizedString("List Box", comment: "")
            item?.boxImagePosition = .imageLeft
            item?.btnAction = #selector(changeAnnotationMode)
            
            let menuItem = NSMenuItem.init(title: "List Box", action: #selector(changeAnnotationMode), target: self)
            menuItem.tag = item!.btnTag
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMToolbarToolPullDownmenuItemIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFormPulldownmenu)
            item?.target = self
            item?.btnTag = CAnnotationType.comboBox.rawValue
            item?.toolTip = NSLocalizedString("Combo Box", comment: "")
            item?.titleName = NSLocalizedString("Combo Box", comment: "")
            item?.boxImagePosition = .imageLeft
            item?.btnAction = #selector(changeAnnotationMode)
            
            let menuItem = NSMenuItem.init(title: "PullDownmenu", action: #selector(changeAnnotationMode), target: self)
            menuItem.tag = item!.btnTag
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMToolbarToolButtonIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFormButton)
            item?.target = self
            item?.btnTag = CAnnotationType.actionButton.rawValue
            item?.toolTip = NSLocalizedString("Button", comment: "")
            item?.titleName = NSLocalizedString("Button", comment: "")
            item?.boxImagePosition = .imageLeft
            item?.btnAction = #selector(changeAnnotationMode)
            
            let menuItem = NSMenuItem.init(title: "Button", action: #selector(changeAnnotationMode), target: self)
            menuItem.tag = item!.btnTag
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMToolbarToolSignBoxIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFormSign)
            item?.target = self
            item?.btnTag = CAnnotationType.signature.rawValue
            item?.toolTip = NSLocalizedString("Signature", comment: "")
            item?.titleName = NSLocalizedString("Signature", comment: "")
            item?.boxImagePosition = .imageLeft
            item?.btnAction = #selector(changeAnnotationMode)
            
            let menuItem = NSMenuItem.init(title: "SignBox", action: #selector(changeAnnotationMode), target: self)
            menuItem.tag = item!.btnTag
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMToolbarToolFormAlignIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconPropertybarAlignLeftToor)
            item?.target = self
//            item?.toolTip = NSLocalizedString("Alignment", comment: "")
            item?.titleName = NSLocalizedString("", comment: "")
            item?.boxImagePosition = .imageExpandLeft
            item?.needExpandAction = true
            item?.btnAction = #selector(formsAlignmentAction)
            item?.pdfView =  self.pdfView
            
            let menuItem = NSMenuItem.init(title: "Alignment", action: nil, target: self)
            let subMenu = NSMenu()
            subMenu.addItem(title: NSLocalizedString("Align Left", comment: ""), imageNamed: "KMImageNameUXIconPropertybarAlignLeftNor", action: #selector(formsAlignmentAction), target: self, tag: 0)
            subMenu.addItem(title: NSLocalizedString("Align Vertically", comment: ""), imageNamed: "KMImageNameUXIconPropertybarAlignVercenterNor", action: #selector(formsAlignmentAction), target: self, tag: 1)
            subMenu.addItem(title: NSLocalizedString("Align Right", comment: ""), imageNamed: "KMImageNameUXIconPropertybarAlignRightNor", action: #selector(formsAlignmentAction), target: self, tag: 2)
            subMenu.addItem(NSMenuItem.separator())
            subMenu.addItem(title: NSLocalizedString("Align Top", comment: ""), imageNamed: "KMImageNameUXIconPropertybarAlignUpNor", action: #selector(formsAlignmentAction), target: self, tag: 3)
            subMenu.addItem(title: NSLocalizedString("Align Horizontally", comment: ""), imageNamed: "KMImageNameUXIconPropertybarAlignHorcenterNor", action: #selector(formsAlignmentAction), target: self, tag: 4)
            subMenu.addItem(title: NSLocalizedString("Align Bottom", comment: ""), imageNamed: "KMImageNameUXIconPropertybarAlignDownNor", action: #selector(formsAlignmentAction), target: self, tag: 5)
            subMenu.addItem(NSMenuItem.separator())
            subMenu.addItem(title: NSLocalizedString("Distribute Horizontally", comment: ""), imageNamed: "KMImageNameUXIconPropertybarAlignHorsplitNor", action: #selector(formsAlignmentAction), target: self, tag: 6)
            subMenu.addItem(title: NSLocalizedString("Distribute Vertically", comment: ""), imageNamed: "KMImageNameUXIconPropertybarAlignVersplitNor", action: #selector(formsAlignmentAction), target: self, tag: 7)
            
            menuItem.submenu = subMenu
            menuItem.tag = item!.btnTag
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMToolbarToolFormMoreIdentifier {
            item?.image = NSImage(named: "KMImageNameMainToolFormMore")
            item?.target = self
            item?.toolTip = NSLocalizedString("More", comment: "")
            item?.titleName = NSLocalizedString("More", comment: "")
            item?.boxImagePosition = .imageExpandLeft
            item?.btnAction = #selector(formsMoreOperationAction)
            
            let menuItem = NSMenuItem.init(title: "More", action: #selector(formsMoreOperationAction), target: self)
            menuItem.tag = item!.btnTag
            item?.menuFormRepresentation = menuItem
        }
    }
    
    private func _setupViewDisplayItem(_ item: KMToolbarItemView?) {
        let identifier = item?.itemIdentifier
        if identifier == KMToolbarViewSettingIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarDisplayView)
            item?.target = self
            item?.toolTip = NSLocalizedString("View Settings", comment: "")
            item?.titleName = NSLocalizedString("View Settings", comment: "")
            item?.boxImagePosition = .imageLeft
            item?.btnAction = #selector(_itemAction)
        } else if identifier == KMToolbarCropIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarDisplayTailor)
            item?.target = self
//            item?.toolTip = NSLocalizedString("Note: Cropping a PDF hides some of the PDF’s content without removing it.", comment: "")
            item?.titleName = NSLocalizedString("Crop", comment: "")
            item?.boxImagePosition = .imageExpandLeft
            item?.needExpandAction = true
//            item?.btnAction = #selector(cropMenuAction)
            
            let menuItem = NSMenuItem.init(title: "Crop", action: #selector(cropMenuAction), target: self)
            let subMenu = NSMenu()
//            subMenu.addItem(title: NSLocalizedString("Crop All Pages", comment: ""), action: #selector(_cropAction), target: self, tag: 1)
            subMenu.addItem(title: NSLocalizedString("Crop Current Page", comment: ""), action: #selector(_cropAction), target: self, tag: 2)
            subMenu.addItem(title: NSLocalizedString("Auto Crop – Separate", comment: ""), action: #selector(_cropAction), target: self, tag: 3)
            subMenu.addItem(title: NSLocalizedString("Auto Crop – Combined", comment: ""), action: #selector(_cropAction), target: self, tag: 4)
            subMenu.addItem(title: NSLocalizedString("Select Area", comment: ""), action: #selector(_cropAction), target: self, tag: 5)
//            subMenu.addItem(title: NSLocalizedString("Crop Options...", comment: ""), action: #selector(_cropAction), target: self, tag: 6)
            
            menuItem.submenu = subMenu
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMToolbarSnapshotIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarDisplaySnapshot)
            item?.target = self
            item?.toolTip = NSLocalizedString("Take Snapshot", comment: "")
            item?.titleName = NSLocalizedString("Snapshot", comment: "")
            item?.boxImagePosition = .imageLeft
            item?.btnAction = #selector(_itemAction)
        } else if identifier == KMToolbarTTSIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconSubtoolbarDisplayTTS)
            item?.target = self
            item?.toolTip = NSLocalizedString("TTS (Text-to-speech)", comment: "")
            item?.titleName = NSLocalizedString("TTS", comment: "")
            item?.boxImagePosition = .imageLeft
            item?.btnAction = #selector(_itemAction)
        }
    }
    
    private func _setupToolItem(_ item: KMToolbarItemView?) {
        let identifier = item?.itemIdentifier
        if identifier == KMToolbarToolCropItemIdentifier {
            item?.image = NSImage(named: "KMImageNameMainToolsCrop")
            item?.alternateImage = NSImage(named: "KMImageNameMainToolsCrop")
            item?.target = self
            item?.btnTag = KMToolbarType.crop.rawValue
            item?.toolTip = NSLocalizedString("Crop pages", comment: "")
            item?.titleName = NSLocalizedString("Crop", comment: "")
            item?.boxImagePosition = .imageExpandLeft
            item?.btnAction = #selector(cropMenuAction)
            
            let menuItem = NSMenuItem.init(title: "Crop", action: #selector(cropMenuAction), target: self)
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMToolbarComparisonItemIdentifier {
            item?.image = NSImage(named: KMImageNameUXIconBatchComparison)
            item?.target = self
            item?.btnTag = KMToolbarType.comparison.rawValue
//            item?.toolTip = NSLocalizedString("Compare", comment: "")
            item?.titleName = NSLocalizedString("Compare", comment: "")
            item?.boxImagePosition = .imageExpandLeft
            item?.needExpandAction = true
//            item?.btnAction = #selector(_itemAction)
            
            let menuItem = NSMenuItem.init(title: "Bates Number", action: #selector(_menuItemAction), target: self)
            let subMenu = NSMenu()
            subMenu.addItem(title: NSLocalizedString("Side-by-Side View", comment: ""), action: #selector(_comparisonAction), target: self, tag: 1)
            subMenu.addItem(title: NSLocalizedString("Compare by File Overlay", comment: ""), action: #selector(_comparisonAction), target: self, tag: 2)
            menuItem.submenu = subMenu
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMToolbarToolBatesItemIdentifier {
            item?.image = NSImage(named: "KMImageNameUXIconBatchBatesNor")
            item?.target = self
            item?.btnTag = KMToolbarType.bates.rawValue
//            item?.toolTip = NSLocalizedString("Add PDF Bates numbering to your legal, medical, or business documents", comment: "")
            item?.titleName = NSLocalizedString("Bates Numbers", comment: "")
            item?.boxImagePosition = .imageExpandLeft
            item?.needExpandAction = true
//            item?.btnAction = #selector(batesMenuAction)
            
            let menuItem = NSMenuItem.init(title: "Bates Numbers", action: #selector(batesMenuAction), target: self)
            let subMenu = NSMenu()
            subMenu.addItem(title: NSLocalizedString("Add Bates Numbers", comment: ""), action: #selector(_batesAction), target: self, tag: 1)
            subMenu.addItem(title: NSLocalizedString("Remove Bates Numbers", comment: ""), action: #selector(_batesAction), target: self, tag: 2)
            subMenu.addItem(title: NSLocalizedString("Batch Add Batch Numbers", comment: ""), action: #selector(_batesAction), target: self, tag: 3)
            subMenu.addItem(title: NSLocalizedString("Batch Remove Bates Numbers", comment: ""), action: #selector(_batesAction), target: self, tag: 4)
            subMenu.addItem(title: NSLocalizedString("Manage Templates", comment: ""), action: #selector(_batesAction), target: self, tag: 5)
            menuItem.submenu = subMenu
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMToolbarAIItemIdentifier {
            item?.image = NSImage(named: "KMImageNameUXIconAINor")
            item?.target = self
            item?.btnTag = KMToolbarType.aiTools.rawValue
            item?.titleName = NSLocalizedString("AI Tools", comment: "")
            item?.boxImagePosition = .imageExpandLeft
            item?.needExpandAction = true
            
            let menuItem = NSMenuItem.init(title: "AI Tools", action: #selector(batesMenuAction), target: self)
            let subMenu = NSMenu()
            subMenu.addItem(title: NSLocalizedString("AI Summarize", comment: ""), action: #selector(_AIAction), target: self, tag: 1)
            subMenu.addItem(title: NSLocalizedString("AI Rewrite", comment: ""), action: #selector(_AIAction), target: self, tag: 2)
            subMenu.addItem(title: NSLocalizedString("AI Proofread", comment: ""), action: #selector(_AIAction), target: self, tag: 3)
            subMenu.addItem(title: NSLocalizedString("AI Translate", comment: ""), action: #selector(_AIAction), target: self, tag: 4)

            menuItem.submenu = subMenu
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMToolbarToolHeaderFooterItemIdentifier {
            item?.image = NSImage(named: "KMImageNameUXIconBatchHeaderandfooterNor")
            item?.target = self
            item?.btnTag = KMToolbarType.headerAndFooter.rawValue
//            item?.toolTip = NSLocalizedString("Insert header, footer, and page numbers to PDF", comment: "")
            item?.titleName = NSLocalizedString("Header & Footer", comment: "")
            item?.boxImagePosition = .imageExpandLeft
            item?.needExpandAction = true
//            item?.btnAction = #selector(headerfooterMenuAction)
            
            let menuItem = NSMenuItem.init(title: "Header & Footer", action: #selector(headerfooterMenuAction), target: self)
            let subMenu = NSMenu()
            subMenu.addItem(title: NSLocalizedString("Add Header & Footer", comment: ""), action: #selector(_headerfooterAction), target: self, tag: 1)
            subMenu.addItem(title: NSLocalizedString("Remove Header & Footer", comment: ""), action: #selector(_headerfooterAction), target: self, tag: 2)
            subMenu.addItem(title: NSLocalizedString("Batch Add Header & Footer", comment: ""), action: #selector(_headerfooterAction), target: self, tag: 3)
            subMenu.addItem(title: NSLocalizedString("Batch Remove Header & Footer", comment: ""), action: #selector(_headerfooterAction), target: self, tag: 4)
            subMenu.addItem(title: NSLocalizedString("Manage Templates", comment: ""), action: #selector(_headerfooterAction), target: self, tag: 5)
            menuItem.submenu = subMenu
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMToolbarToolBackgroundItemIdentifier {
            item?.image = NSImage(named: "KMImageNameUXIconBatchBackgroundNor")
            item?.target = self
            item?.btnTag = KMToolbarType.background.rawValue
//            item?.toolTip = NSLocalizedString("Insert PDF page background by color or image", comment: "")
            item?.titleName = NSLocalizedString("Background", comment: "")
            item?.boxImagePosition = .imageExpandLeft
            item?.needExpandAction = true
//            item?.btnAction = #selector(backgroundMenuAction)
            
            let menuItem = NSMenuItem.init(title: "Background", action: #selector(backgroundMenuAction), target: self)
            let subMenu = NSMenu()
            subMenu.addItem(title: NSLocalizedString("Add Background", comment: ""), action: #selector(_backgroundAction), target: self, tag: 1)
            subMenu.addItem(title: NSLocalizedString("Remove Background", comment: ""), action: #selector(_backgroundAction), target: self, tag: 2)
            subMenu.addItem(title: NSLocalizedString("Batch Add Background", comment: ""), action: #selector(_backgroundAction), target: self, tag: 3)
            subMenu.addItem(title: NSLocalizedString("Batch Remove Background", comment: ""), action: #selector(_backgroundAction), target: self, tag: 4)
            subMenu.addItem(title: NSLocalizedString("Manage Templates", comment: ""), action: #selector(_backgroundAction), target: self, tag: 5)
            menuItem.submenu = subMenu
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMToolbarToolWatermarkItemIdentifier {
            item?.image = NSImage(named: "KMImageNameUXIconBatchWatermarkNor")
            item?.target = self
            item?.btnTag = KMToolbarType.watermark.rawValue
//            item?.toolTip = NSLocalizedString("Watermark", comment: "")
            item?.titleName = NSLocalizedString("Watermark", comment: "")
            item?.boxImagePosition = .imageExpandLeft
            item?.needExpandAction = true
//            item?.btnAction = #selector(watermarkMenuAction)
            
            let menuItem = NSMenuItem.init(title: "Watermark", action: #selector(watermarkMenuAction), target: self)
            let subMenu = NSMenu()
            subMenu.addItem(title: NSLocalizedString("Add Watermark", comment: ""), action: #selector(_watermarkAction), target: self, tag: 1)
            subMenu.addItem(title: NSLocalizedString("Remove Watermark", comment: ""), action: #selector(_watermarkAction), target: self, tag: 2)
            subMenu.addItem(title: NSLocalizedString("Batch Add Watermarks", comment: ""), action: #selector(_watermarkAction), target: self, tag: 3)
            subMenu.addItem(title: NSLocalizedString("Batch Remove Watermarks", comment: ""), action: #selector(_watermarkAction), target: self, tag: 4)
            subMenu.addItem(title: NSLocalizedString("Manage Templates", comment: ""), action: #selector(_watermarkAction), target: self, tag: 5)
            menuItem.submenu = subMenu
            item?.menuFormRepresentation = menuItem
        } else if identifier == KMToolbarToolCompressItemIdentifier {
            item?.image = NSImage(named: "KMImageNameUXIconBatchOptimizeNor")
            item?.target = self
            item?.btnTag = KMToolbarType.compress.rawValue
            item?.boxImagePosition = .imageLeft
            item?.toolTip = NSLocalizedString("Reduce file size", comment: "")
            item?.titleName = NSLocalizedString("Compress", comment: "")
            item?.btnAction = #selector(compressMenuAction)
        } else if identifier == KMToolbarToolSecureItemIdentifier {
            item?.image = NSImage(named: "KMImageNameUXIconBatchSafeNor")
            item?.target = self
//            item?.toolTip = NSLocalizedString("Batch encrypting PDF documents", comment: "")
            item?.titleName = NSLocalizedString("Security", comment: "")
            item?.boxImagePosition = .imageExpandLeft
            item?.needExpandAction = true
//            item?.btnAction = #selector(secureMenuAction)
            
            let menuItem = NSMenuItem.init(title: NSLocalizedString("Security", comment: ""), action: #selector(secureMenuAction), target: self)
            let subMenu = NSMenu()
            subMenu.addItem(title: NSLocalizedString("Set Passwords", comment: ""), action: #selector(_secureAction), target: self, tag: 1)
            subMenu.addItem(title: NSLocalizedString("Remove Security", comment: ""), action: #selector(_secureAction), target: self, tag: 2)
            menuItem.submenu = subMenu
            item?.menuFormRepresentation = menuItem
        }else if identifier == KMToolbarToolMergeItemIdentifier {
            item?.image = NSImage(named: "KMImageNameUXIconBatchMergeNor")
            item?.target = self
            item?.btnTag = KMToolbarType.merge.rawValue
            item?.toolTip = NSLocalizedString("Combine multiple documents into a new PDF, or borrow individual pages", comment: "")
            item?.titleName = NSLocalizedString("Merge", comment: "")
            item?.boxImagePosition = .imageLeft
            item?.btnAction = #selector(mergeMenuItemAction)
        }
    }
}

extension KMToolbarViewController: NSMenuItemValidation {
    func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
        if menuItem.action == #selector(toggleCaseInsensitiveSearch) {
            menuItem.state = KMDataManager.ud_integer(forKey: SKCaseInsensitiveSearchKey) == 1 ? .on : .off
        } else if menuItem.action == #selector(formsAlignmentAction) {
            let cnt = self.pdfView?.activeAnnotations.count ?? 0
            if menuItem.tag < 6 {
                if cnt >= 2 {
                    return true
                }
            } else {
                if cnt >= 3 {
                    return true
                }
            }
            return false
        }
        return true
    }
}

extension KMToolbarViewController {
    func isEnable(isEnable: Bool = true) {
        for item in toolbarItems {
            let itemView: KMToolbarMainItemView = item.value as? KMToolbarMainItemView ?? KMToolbarMainItemView()
            itemView.unEnabled = !isEnable
            itemView.isSelected = false
            
            if let cv = itemView.customizeView {
                self.subviewsdEnable(view: cv, isEnable: isEnable)
            }
        }
    }
    
    func subviewsdEnable(view: NSView, isEnable: Bool) {
        if let data = view as? NSButton {
            data.isEnabled = isEnable
        }
        
        if let data = (view as? NSTextField) {
            data.isEnabled = isEnable
        }
        
        for subview in view.subviews {
            if subview.subviews.count != 0 {
                self.subviewsdEnable(view: subview, isEnable: isEnable)
            }
            if let data = subview as? NSButton {
                data.isEnabled = isEnable
            }
            
            if let data = (subview as? NSTextField) {
                data.isEnabled = isEnable
            }
        }
    }
}

extension KMToolbarViewController {
    func refreshSearchBarMenu() {
        let words = UserDefaults.standard.array(forKey: "kmDocumentSearchWordArrays") as? [String] ?? []
        let searchMenu = NSMenu()
        
        for word in words {
            var truncatedWord = word
            if word.count > 15 {
                truncatedWord = String(word.prefix(15)) + "..."
            }
            let item = searchMenu.addItem(withTitle: truncatedWord, action: #selector(searchPDFKeyWord(_:)), keyEquivalent: "")
            item.representedObject = word
        }
        
        let attributes: [NSAttributedString.Key: Any] = [.font: NSFont(name: "Helvetica", size: 12.0)!]

        if !words.isEmpty {
            let attributedString = NSAttributedString(string: NSLocalizedString("Search History", comment: ""), attributes: attributes)
            let item = NSMenuItem()
            item.attributedTitle = attributedString
            searchMenu.insertItem(item, at: 0)
            searchMenu.addItem(NSMenuItem.separator())
            
            let attributedString1 = NSAttributedString(string: NSLocalizedString("Clear Search History", comment: ""), attributes: attributes)
            let item1 = NSMenuItem()
            item1.attributedTitle = attributedString1
            item1.action = #selector(clearSearchWordHistory(_:))
            item1.target = self
            searchMenu.addItem(item1)
            
            searchMenu.insertItem(NSMenuItem.separator(), at: 0)
        }
        
        let attributedString2 = NSAttributedString(string: NSLocalizedString("Ignore Case", comment: ""), attributes: attributes)
        let ignoreItem = NSMenuItem()
        ignoreItem.attributedTitle = attributedString2
        ignoreItem.action = #selector(toggleCaseInsensitiveSearch)
        ignoreItem.target = self
        searchMenu.insertItem(ignoreItem, at: 0)

        (self.searchField.cell as? NSSearchFieldCell)?.searchMenuTemplate = searchMenu
    
    }
    
    @objc func toggleCaseInsensitiveSearch(_ sender: NSMenuItem) {
        var value = KMDataManager.ud_integer(forKey: SKCaseInsensitiveSearchKey)
        KMDataManager.ud_set(value == 0 ? 1 : 0, forKey: SKCaseInsensitiveSearchKey)
        
//        let caseInsensitive = UserDefaults.standard.bool(forKey: "SKCaseInsensitiveFindKey")
//        UserDefaults.standard.set(!caseInsensitive, forKey: "SKCaseInsensitiveFindKey")
        
        self.searchPDFKey(self.searchField.stringValue)
    }
    
    @objc func searchPDFKeyWord(_ item: NSMenuItem) {
        guard let word = item.representedObject as? String else {
            return
        }
        
        self.searchPDFKey(word)
    }
    
    func searchPDFKey(_ string: String) {
        self.searchField.stringValue = string
        self.delegate?.toolbarViewController?(self, searchAction: string, forward: true)
        
        let word = string
        var words = UserDefaults.standard.array(forKey: "kmDocumentSearchWordArrays") as? [String] ?? []
        var mutableWords = words
        
        if let index = mutableWords.firstIndex(of: word) {
            mutableWords.remove(at: index)
        }
        
        mutableWords.insert(word, at: 0)
        
        if mutableWords.count > 10 {
            mutableWords.removeLast()
        }
        
        UserDefaults.standard.set(mutableWords, forKey: "kmDocumentSearchWordArrays")
        UserDefaults.standard.synchronize()
        
        refreshSearchBarMenu()
    }

    @objc func clearSearchWordHistory(_ sender: Any) {
        UserDefaults.standard.removeObject(forKey: "kmDocumentSearchWordArrays")
        UserDefaults.standard.synchronize()
        
        refreshSearchBarMenu()
    }
}