فهرست منبع

【综合】工具栏整理代码

tangchao 9 ماه پیش
والد
کامیت
6bc3844af5

+ 1 - 1
PDF Office/PDF Master/Class/PDFTools/PageEdit/View/KMPDFEditToolbar.swift

@@ -432,7 +432,7 @@ extension KMPDFEditToolbar: KMToolbarViewDelegate {
     
     
     func toolbar(_ toolbar: KMToolbarView, itemFor identifier: String) -> KMToolbarItemView {
-        let item: KMToolbarItemView? = KMToolbarItemView(itemIdentifier: identifier)
+        let item: KMToolbarItemView? = KMToolbarCustomItemView(itemIdentifier: identifier)
         if (identifier == KMToolbarPageEditPageRangeItemIdentifier) {
             item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageRange)
             item?.target = self

+ 4 - 230
PDF Office/PDF Master/Class/PDFWindowController/Toolbar/KMToolbarItemView.swift

@@ -75,7 +75,7 @@ extension KMToolbarItemView {
                         self.nameBtn.setTitleColor(color: Self.fetchTextNormalColor())
                     }
                 }
-                self._updateSelectBackground()
+                self.updateSelectBackground()
             }
         }
     }
@@ -85,9 +85,6 @@ extension KMToolbarItemView {
             self.nameBtn.isEnabled = !self.unEnabled
             self.imageViewBtn.isEnabled = !self.unEnabled
             self.needExpandButton.isEnabled = !self.unEnabled
-            if let data = self.customizeView {
-                self.subviewsdEnable(view: data, isEnable: !self.unEnabled)
-            }
         }
     }
     var isShowCustomToolTip = false {
@@ -226,7 +223,7 @@ extension KMToolbarItemView {
         view.title = ""
         return view
     }()
-    private var needExpandButton: NSButton = {
+    var needExpandButton: NSButton = {
         let view = NSButton()
         view.bezelStyle = .regularSquare
         view.isBordered = false
@@ -234,24 +231,7 @@ extension KMToolbarItemView {
         view.image = NSImage(named: "KMImageNameUXIconBtnTriDownNor")
         return view
     }()
-    private var _popOver: NSPopover?
-    var popOver: NSPopover? {
-        get {
-            return self._popOver
-        }
-        set {
-            if self._popOver == nil || self._popOver!.isEqual(to: newValue) == false {
-                self._popOver = newValue
-                if (newValue != nil) {
-                    self.layer?.backgroundColor = Self.selectedBackgroundColor.cgColor
-                } else {
-                    self._updateSelectBackground()
-                }
-            }
-        }
-    }
     
-    private var _menuViewController: KMCustomButtonPopMenuViewController?
     private var _kNormalImage: NSImage?
     private var _originalHelpTip: String?
     
@@ -313,32 +293,7 @@ extension KMToolbarItemView {
         promptV.layer?.backgroundColor = NSColor(red: 1, green: 56/255.0, blue: 25/255.0, alpha: 1).cgColor
         
         self.isShowPrompt = false
-        NotificationCenter.default.addObserver(self, selector: #selector(_windowClosedPop), name: KMToolbarItemView.popOverClosedNotificationName, object: nil)
-    }
-    
-    convenience init(itemIdentifier: String, postition imagePositionImagePosition: NSControl.ImagePosition, withPopMenu popMenuViewController: KMCustomButtonPopMenuViewController?) {
-        self.init()
-        
-        self.boxImagePosition = imagePositionImagePosition
-        self._menuViewController = popMenuViewController
-        self._itemIdentifier = itemIdentifier
-        self.wantsLayer = true
-        self.layer?.cornerRadius = 4
-        self.layer?.masksToBounds = true
-        self.nameBtn.font = Self.textFont
-        
-        let promptV = NSView()
-        self.promptView_ = promptV
-        self.addSubview(promptV)
-        promptV.wantsLayer = true
-        promptV.layer?.cornerRadius = 3
-        promptV.layer?.backgroundColor = NSColor(red: 1, green: 56/255.0, blue: 25/255.0, alpha: 1).cgColor
-        self.isShowPrompt = false
-        
-        self._layoutView()
-        if (popMenuViewController != nil) {
-            NotificationCenter.default.addObserver(self, selector: #selector(_windowClosedPop), name: KMToolbarItemView.popOverClosedNotificationName, object: nil)
-        }
+//        NotificationCenter.default.addObserver(self, selector: #selector(_windowClosedPop), name: KMToolbarItemView.popOverClosedNotificationName, object: nil)
     }
     
     override func draw(_ dirtyRect: NSRect) {
@@ -417,17 +372,6 @@ extension KMToolbarItemView {
                 }
             }
         }
-        if self.isPopToolTip {
-            self._showPopTip(self)
-        }else {
-            if (self.needExpandAction) {
-                // KMImageNameUXIconBtnTriDownSel
-                self.needExpandButton.image = NSImage(named: "KMImageNameUXIconBtnTriDownNor")
-                self._showPop(self)
-            }else if (self.isShowCustomToolTip) {
-                self.perform(#selector(_showHUDHint), with: nil, afterDelay: 0.1)
-            }
-        }
     }
     
     override func mouseExited(with event: NSEvent) {
@@ -469,15 +413,6 @@ extension KMToolbarItemView {
         if(self.nameBtn.superview != nil && !self.isSelected) {
             self.nameBtn.setTitleColor(color: Self.fetchTextNormalColor())
         }
-        if self.isPopToolTip {
-            NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(_showHUDHint), object: nil)
-            self._closePop()
-        }else{
-            if (self.isShowCustomToolTip && !self.needExpandAction) {
-                NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(_showHUDHint), object: nil)
-                self._closePop()
-            }
-        }
     }
     
     public func calculateWidth() -> CGFloat {
@@ -485,7 +420,7 @@ extension KMToolbarItemView {
         return iWidth
     }
     
-    private func _updateSelectBackground() {
+    func updateSelectBackground() {
         if self.selectBackgroundType == .none {
             if self.isSelected {
                 self.layer?.backgroundColor = Self.selectedBackgroundColor.cgColor
@@ -506,69 +441,6 @@ extension KMToolbarItemView {
 // MARK: - Private Methods
 
 extension KMToolbarItemView {
-    private func _showPop(_ sender: NSView) {
-        if (self._popOver != nil) {
-            return
-        }
-        let menuViewController = KMCustomButtonPopMenuViewController()
-        menuViewController.delegate = self
-        menuViewController.dataSources = self
-        self.popOver = NSPopover()
-        self.popOver?.delegate = self
-        self.popOver?.contentViewController = menuViewController
-        self.popOver?.animates = false
-        self.popOver?.behavior = .semitransient
-        self.popOver?.contentSize = menuViewController.view.frame.size
-        
-        var sourcesRect = sender.bounds
-        sourcesRect = sender.convert(sourcesRect, to: nil)
-        sourcesRect.origin.y -= 20
-        sourcesRect.size.height += 20
-        self.window?.popover = self.popOver
-        self.window?.sourcesRect = sourcesRect
-        
-        self.popOver?.show(relativeTo: CGRectInset(self.bounds, 0, 5), of: self, preferredEdge: .minY)
-    }
-    
-    func _showPopTip(_ sender: NSView) {
-        if (self._popOver != nil) {
-            return
-        }
-        let popViewController = KMToolbarItemPopViewController()
-        self.popOver = NSPopover()
-        self.popOver?.contentViewController = popViewController
-        self.popOver?.animates = false
-        self.popOver?.behavior = .semitransient
-        self.popOver?.contentSize = popViewController.view.frame.size
-        
-        popViewController.updateWithHelpTip(helpTip: self.toolTip ?? "")
-        self.popOver?.show(relativeTo: CGRectInset(self.bounds, 0, 5), of: self, preferredEdge: .minY)
-    }
-    
-    private func _closePop() {
-        self.popOver?.close()
-        self.popOver = nil
-    }
-    
-    @objc private func _showHUDHint() {
-        //    KMToolbarItemPopViewController *popViewController = [[[KMToolbarItemPopViewController alloc] init] autorelease];
-        //    self.popOver = [[[NSPopover alloc] init] autorelease];
-        //    self.popOver.contentViewController = popViewController;
-        //    self.popOver.animates = NO;
-        //    self.popOver.behavior = NSPopoverBehaviorSemitransient;
-        //    self.popOver.backgroundColor = [KMAppearance KMBluegrey01Color];
-        //
-        //    self.popOver.contentSize = popViewController.view.frame.size;
-        //    [popViewController updateWithHelpTip:self.originalHelpTip];
-        //    [self.popOver showRelativeToRect:self.bounds ofView:self preferredEdge:NSRectEdgeMinY];
-    }
-    
-    @objc private func _windowClosedPop(sender: Notification) {
-        if let data = self._popOver?.isEqual(to: sender.object), data {
-            self.popOver = nil
-        }
-    }
-    
     private func _layoutView() {
         if self.nameBtn.superview != nil {
             self.nameBtn.removeFromSuperview()
@@ -744,101 +616,3 @@ extension KMToolbarItemView {
         }
     }
 }
-
-extension KMToolbarItemView: NSPopoverDelegate {
-    func popoverDidClose(_ notification: Notification) {
-        if let data = self.popOver?.isEqual(to: notification.object), data {
-            self._closePop()
-        }
-    }
-}
-
-extension KMToolbarItemView: KMCustomButtonPopMenuViewControllerDelegate, KMCustomButtonPopMenuViewControllerDataSources {
-    func customViewButtonPopDidSelectIndex(_ index: Int) {
-        self._closePop()
-        
-//        if (self.itemIdentifier == KMToolbarPageEditPageRangeItemIdentifier) {
-            if let items = self.menuFormRepresentation?.submenu?.items {
-                let item = items[index]
-                _ = item.target?.perform(item.action, with: item)
-            }
-//        }
-    }
-    
-    func numberOfLine() -> Int {
-//        if (self.itemIdentifier == KMToolbarPageEditPageRangeItemIdentifier) {
-            if let items = self.menuFormRepresentation?.submenu?.items {
-                return items.count
-            }
-//        }
-        return 0
-    }
-    
-    func stringForLine(at index: Int) -> String? {
-//        if (self.itemIdentifier == KMToolbarPageEditPageRangeItemIdentifier) {
-            if let items = self.menuFormRepresentation?.submenu?.items {
-                return items[index].title
-            }
-//        }
-        return nil
-    }
-    
-    func needInsertSeperateLine(at index: Int) -> Bool {
-        if let items = self.menuFormRepresentation?.submenu?.items {
-            return items[index].isSeparatorItem
-        }
-        return false
-    }
-    
-    func needHightLightLine(at index: Int) -> Bool {
-        return false
-    }
-    
-    func imageForLine(at index: Int) -> NSImage? {
-        if let items = self.menuFormRepresentation?.submenu?.items {
-            return items[index].image
-        }
-        return nil
-    }
-    
-    func itemEnable(at index: Int) -> Bool {
-        if self.itemIdentifier == KMToolbarToolFormAlignIdentifier {
-            if index <= 6 {
-                if let cnt = self.pdfView?.activeAnnotations.count, cnt >= 2 {
-                    return true
-                }
-            } else {
-                if let cnt = self.pdfView?.activeAnnotations.count, cnt >= 3 {
-                    return true
-                }
-            }
-            return false
-        }
-        return true
-    }
-}
-
-extension KMToolbarItemView {
-    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
-            }
-        }
-    }
-}

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

@@ -219,9 +219,9 @@ private let KMToolbarItemSpace = 8.0
             let itemIdentifier = itemIdentifiers[i]
             var item: KMToolbarItemView?
             if itemIdentifier == KMToolbarDividerItemIdentifier {
-                item = KMToolbarItemView(itemIdentifier: itemIdentifier, postition: .imageOnly, withPopMenu: nil)
+                item = KMToolbarCustomItemView(itemIdentifier: itemIdentifier, postition: .imageOnly, withPopMenu: nil)
             } else if itemIdentifier == KMNewToolbarSpaceItemIdentifier {
-                item = KMToolbarItemView(itemIdentifier: itemIdentifier, postition: .imageOnly, withPopMenu: nil)
+                item = KMToolbarCustomItemView(itemIdentifier: itemIdentifier, postition: .imageOnly, withPopMenu: nil)
                 item?.layer?.backgroundColor = .clear
                 item?.imageViewBox.borderColor = .clear
                 item?.layer?.cornerRadius = 0.0
@@ -311,9 +311,9 @@ private let KMToolbarItemSpace = 8.0
             let itemIdentifier = itemIdentifiers[i]
             var item: KMToolbarItemView?
             if itemIdentifier == KMToolbarDividerItemIdentifier {
-                item = KMToolbarItemView(itemIdentifier: itemIdentifier, postition: .imageOnly, withPopMenu: nil)
+                item = KMToolbarCustomItemView(itemIdentifier: itemIdentifier, postition: .imageOnly, withPopMenu: nil)
             } else if itemIdentifier == KMNewToolbarSpaceItemIdentifier {
-                item = KMToolbarItemView(itemIdentifier: itemIdentifier, postition: .imageOnly, withPopMenu: nil)
+                item = KMToolbarCustomItemView(itemIdentifier: itemIdentifier, postition: .imageOnly, withPopMenu: nil)
                 item?.layer?.backgroundColor = .clear
                 item?.imageViewBox.borderColor = .clear
                 item?.layer?.cornerRadius = 0.0
@@ -408,9 +408,9 @@ private let KMToolbarItemSpace = 8.0
                 let itemIdentifier = itemIdentifiers[i]
                 var item: KMToolbarItemView?
                 if itemIdentifier == KMToolbarDividerItemIdentifier {
-                    item = KMToolbarItemView(itemIdentifier: itemIdentifier, postition: .imageOnly, withPopMenu: nil)
+                    item = KMToolbarCustomItemView(itemIdentifier: itemIdentifier, postition: .imageOnly, withPopMenu: nil)
                 } else if itemIdentifier == KMNewToolbarSpaceItemIdentifier {
-                    item = KMToolbarItemView(itemIdentifier: itemIdentifier, postition: .imageOnly, withPopMenu: nil)
+                    item = KMToolbarCustomItemView(itemIdentifier: itemIdentifier, postition: .imageOnly, withPopMenu: nil)
                     item?.layer?.backgroundColor = .clear
                     item?.imageViewBox.borderColor = .clear
                     item?.layer?.cornerRadius = 0.0
@@ -494,9 +494,9 @@ private let KMToolbarItemSpace = 8.0
                 
                 var item: KMToolbarItemView?
                 if itemIdentifier == KMToolbarDividerItemIdentifier {
-                    item = KMToolbarItemView(itemIdentifier: itemIdentifier, postition: .imageOnly, withPopMenu: nil)
+                    item = KMToolbarCustomItemView(itemIdentifier: itemIdentifier, postition: .imageOnly, withPopMenu: nil)
                 } else if itemIdentifier == KMNewToolbarSpaceItemIdentifier {
-                    item = KMToolbarItemView(itemIdentifier: itemIdentifier, postition: .imageOnly, withPopMenu: nil)
+                    item = KMToolbarCustomItemView(itemIdentifier: itemIdentifier, postition: .imageOnly, withPopMenu: nil)
                     item?.layer?.backgroundColor = .clear
                     item?.imageViewBox.borderColor = .clear
                     item?.layer?.cornerRadius = 0.0;

+ 31 - 1
PDF Office/PDF Master/Class/PDFWindowController/Toolbar/KMToolbarViewController.swift

@@ -813,9 +813,12 @@ extension KMToolbarViewController : KMToolbarViewDelegate,NSToolbarItemValidatio
             }
         }
         if item == nil || create {
-            item = KMToolbarItemView.init(itemIdentifier: identifier)
             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) {
@@ -2311,6 +2314,33 @@ extension KMToolbarViewController {
             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
+            }
         }
     }
 }

+ 250 - 0
PDF Office/PDF Master/Class/PDFWindowController/Toolbar/View/KMToolbarCustomItemView.swift

@@ -0,0 +1,250 @@
+//
+//  KMToolbarCustomItemView.swift
+//  PDF Reader Pro
+//
+//  Created by tangchao on 2024/6/4.
+//
+
+import Cocoa
+
+class KMToolbarCustomItemView: KMToolbarItemView {
+    private var _menuViewController: KMCustomButtonPopMenuViewController?
+    
+    private var _popOver: NSPopover?
+    var popOver: NSPopover? {
+        get {
+            return self._popOver
+        }
+        set {
+            if self._popOver == nil || self._popOver!.isEqual(to: newValue) == false {
+                self._popOver = newValue
+                if (newValue != nil) {
+                    self.layer?.backgroundColor = Self.selectedBackgroundColor.cgColor
+                } else {
+                    self.updateSelectBackground()
+                }
+            }
+        }
+    }
+    
+    convenience init(itemIdentifier: String, postition imagePosition: NSControl.ImagePosition, withPopMenu popMenuViewController: KMCustomButtonPopMenuViewController?) {
+        self.init(itemIdentifier: itemIdentifier)
+        
+        self.boxImagePosition = imagePosition
+//        self._menuViewController = popMenuViewController
+//        self._itemIdentifier = itemIdentifier
+//        self.wantsLayer = true
+//        self.layer?.cornerRadius = 4
+//        self.layer?.masksToBounds = true
+//        self.nameBtn.font = Self.textFont
+        
+//        let promptV = NSView()
+//        self.promptView_ = promptV
+//        self.addSubview(promptV)
+//        promptV.wantsLayer = true
+//        promptV.layer?.cornerRadius = 3
+//        promptV.layer?.backgroundColor = NSColor(red: 1, green: 56/255.0, blue: 25/255.0, alpha: 1).cgColor
+//        self.isShowPrompt = false
+        
+//        self._layoutView()
+        if (popMenuViewController != nil) {
+//            NotificationCenter.default.addObserver(self, selector: #selector(_windowClosedPop), name: KMToolbarItemView.popOverClosedNotificationName, object: nil)
+        }
+    }
+    
+    override func draw(_ dirtyRect: NSRect) {
+        super.draw(dirtyRect)
+
+        // Drawing code here.
+    }
+    
+    override func mouseEntered(with event: NSEvent) {
+        super.mouseEntered(with: event)
+        
+        guard let _window = self.window else {
+            return
+        }
+        
+        if (!_window.isKeyWindow) {
+            return
+        }
+        if (self.itemIdentifier == KMToolbarDividerItemIdentifier || self.customizeView != nil || self.image == nil) {
+            return
+        }
+        if self.unEnabled {
+            return
+        }
+        if self.isPopToolTip {
+            self._showPopTip(self)
+        }else {
+            if (self.needExpandAction) {
+                self.needExpandButton.image = NSImage(named: "KMImageNameUXIconBtnTriDownNor")
+                self._showPop(self)
+            }else if (self.isShowCustomToolTip) {
+                self.perform(#selector(_showHUDHint), with: nil, afterDelay: 0.1)
+            }
+        }
+    }
+    
+    override func mouseExited(with event: NSEvent) {
+        super.mouseExited(with: event)
+
+        if(self.needExpandAction && !self.isSelected) {
+            self.needExpandButton.image = NSImage(named: "KMImageNameUXIconBtnTriDownNor")
+        }
+        
+        guard let _window = self.window else {
+            return
+        }
+        if (!_window.isKeyWindow) {
+            return
+        }
+        
+        if(self.nameBtn.superview != nil && !self.isSelected) {
+            self.nameBtn.setTitleColor(color: Self.fetchTextNormalColor())
+        }
+        if self.isPopToolTip {
+            NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(_showHUDHint), object: nil)
+            self._closePop()
+        }else{
+            if (self.isShowCustomToolTip && !self.needExpandAction) {
+                NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(_showHUDHint), object: nil)
+                self._closePop()
+            }
+        }
+    }
+    
+    // MARK: - Popover
+    
+    private func _showPop(_ sender: NSView) {
+        if (self._popOver != nil) {
+            return
+        }
+        let menuViewController = KMCustomButtonPopMenuViewController()
+        menuViewController.delegate = self
+        menuViewController.dataSources = self
+        self.popOver = NSPopover()
+        self.popOver?.delegate = self
+        self.popOver?.contentViewController = menuViewController
+        self.popOver?.animates = false
+        self.popOver?.behavior = .semitransient
+        self.popOver?.contentSize = menuViewController.view.frame.size
+        
+        var sourcesRect = sender.bounds
+        sourcesRect = sender.convert(sourcesRect, to: nil)
+        sourcesRect.origin.y -= 20
+        sourcesRect.size.height += 20
+        self.window?.popover = self.popOver
+        self.window?.sourcesRect = sourcesRect
+        
+        self.popOver?.show(relativeTo: CGRectInset(self.bounds, 0, 5), of: self, preferredEdge: .minY)
+    }
+    
+    func _showPopTip(_ sender: NSView) {
+        if (self._popOver != nil) {
+            return
+        }
+        let popViewController = KMToolbarItemPopViewController()
+        self.popOver = NSPopover()
+        self.popOver?.contentViewController = popViewController
+        self.popOver?.animates = false
+        self.popOver?.behavior = .semitransient
+        self.popOver?.contentSize = popViewController.view.frame.size
+        
+        popViewController.updateWithHelpTip(helpTip: self.toolTip ?? "")
+        self.popOver?.show(relativeTo: CGRectInset(self.bounds, 0, 5), of: self, preferredEdge: .minY)
+    }
+    
+    private func _closePop() {
+        self.popOver?.close()
+        self.popOver = nil
+    }
+    
+    @objc private func _showHUDHint() {
+        //    KMToolbarItemPopViewController *popViewController = [[[KMToolbarItemPopViewController alloc] init] autorelease];
+        //    self.popOver = [[[NSPopover alloc] init] autorelease];
+        //    self.popOver.contentViewController = popViewController;
+        //    self.popOver.animates = NO;
+        //    self.popOver.behavior = NSPopoverBehaviorSemitransient;
+        //    self.popOver.backgroundColor = [KMAppearance KMBluegrey01Color];
+        //
+        //    self.popOver.contentSize = popViewController.view.frame.size;
+        //    [popViewController updateWithHelpTip:self.originalHelpTip];
+        //    [self.popOver showRelativeToRect:self.bounds ofView:self preferredEdge:NSRectEdgeMinY];
+    }
+    
+    @objc private func _windowClosedPop(sender: Notification) {
+        if let data = self._popOver?.isEqual(to: sender.object), data {
+            self.popOver = nil
+        }
+    }
+    
+}
+
+extension KMToolbarCustomItemView: NSPopoverDelegate {
+    func popoverDidClose(_ notification: Notification) {
+        if let data = self.popOver?.isEqual(to: notification.object), data {
+            self._closePop()
+        }
+    }
+}
+
+extension KMToolbarCustomItemView: KMCustomButtonPopMenuViewControllerDelegate, KMCustomButtonPopMenuViewControllerDataSources {
+    func customViewButtonPopDidSelectIndex(_ index: Int) {
+        self._closePop()
+        
+        if let items = self.menuFormRepresentation?.submenu?.items {
+            let item = items[index]
+            _ = item.target?.perform(item.action, with: item)
+        }
+    }
+    
+    func numberOfLine() -> Int {
+        if let items = self.menuFormRepresentation?.submenu?.items {
+            return items.count
+        }
+        return 0
+    }
+    
+    func stringForLine(at index: Int) -> String? {
+        if let items = self.menuFormRepresentation?.submenu?.items {
+            return items[index].title
+        }
+        return nil
+    }
+    
+    func needInsertSeperateLine(at index: Int) -> Bool {
+        if let items = self.menuFormRepresentation?.submenu?.items {
+            return items[index].isSeparatorItem
+        }
+        return false
+    }
+    
+    func needHightLightLine(at index: Int) -> Bool {
+        return false
+    }
+    
+    func imageForLine(at index: Int) -> NSImage? {
+        if let items = self.menuFormRepresentation?.submenu?.items {
+            return items[index].image
+        }
+        return nil
+    }
+    
+    func itemEnable(at index: Int) -> Bool {
+        if self.itemIdentifier == KMToolbarToolFormAlignIdentifier {
+            if index <= 6 {
+                if let cnt = self.pdfView?.activeAnnotations.count, cnt >= 2 {
+                    return true
+                }
+            } else {
+                if let cnt = self.pdfView?.activeAnnotations.count, cnt >= 3 {
+                    return true
+                }
+            }
+            return false
+        }
+        return true
+    }
+}
+

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

@@ -5006,6 +5006,9 @@
 		BBF8A4032AE8E10100788BAC /* KMBatchConvertParameter.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBF8A4022AE8E10100788BAC /* KMBatchConvertParameter.swift */; };
 		BBF8A4042AE8E10100788BAC /* KMBatchConvertParameter.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBF8A4022AE8E10100788BAC /* KMBatchConvertParameter.swift */; };
 		BBF8A4052AE8E10100788BAC /* KMBatchConvertParameter.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBF8A4022AE8E10100788BAC /* KMBatchConvertParameter.swift */; };
+		BBF98C342C0EE46200436CC7 /* KMToolbarCustomItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBF98C332C0EE46100436CC7 /* KMToolbarCustomItemView.swift */; };
+		BBF98C352C0EE46200436CC7 /* KMToolbarCustomItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBF98C332C0EE46100436CC7 /* KMToolbarCustomItemView.swift */; };
+		BBF98C362C0EE46200436CC7 /* KMToolbarCustomItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBF98C332C0EE46100436CC7 /* KMToolbarCustomItemView.swift */; };
 		BBFA1CC92B60967A0053AD4A /* KMScreenShotHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBFA1CC82B60967A0053AD4A /* KMScreenShotHandler.swift */; };
 		BBFA1CCA2B60967A0053AD4A /* KMScreenShotHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBFA1CC82B60967A0053AD4A /* KMScreenShotHandler.swift */; };
 		BBFA1CCB2B60967A0053AD4A /* KMScreenShotHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBFA1CC82B60967A0053AD4A /* KMScreenShotHandler.swift */; };
@@ -7305,6 +7308,7 @@
 		BBF8A3FC2AE8B03B00788BAC /* KMBatchOperateFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBatchOperateFile.swift; sourceTree = "<group>"; };
 		BBF8A4002AE8B4E200788BAC /* KMBatchBaseParameter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBatchBaseParameter.swift; sourceTree = "<group>"; };
 		BBF8A4022AE8E10100788BAC /* KMBatchConvertParameter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBatchConvertParameter.swift; sourceTree = "<group>"; };
+		BBF98C332C0EE46100436CC7 /* KMToolbarCustomItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMToolbarCustomItemView.swift; sourceTree = "<group>"; };
 		BBFA1CC82B60967A0053AD4A /* KMScreenShotHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMScreenShotHandler.swift; sourceTree = "<group>"; };
 		BBFA1CCC2B609E890053AD4A /* KMScreenShotMaskWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMScreenShotMaskWindowController.swift; sourceTree = "<group>"; };
 		BBFA1CD02B609EC50053AD4A /* KMScreenShotMaskWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMScreenShotMaskWindowController.xib; sourceTree = "<group>"; };
@@ -12727,6 +12731,7 @@
 		BBA00AC22B157BE90043D903 /* View */ = {
 			isa = PBXGroup;
 			children = (
+				BBF98C332C0EE46100436CC7 /* KMToolbarCustomItemView.swift */,
 				BBA00AC32B157C880043D903 /* KMToolbarZoomItemView.swift */,
 				BBD3C8B52B2C438F00EB0867 /* KMToolbarPreviousNextItemView.swift */,
 				BBDE52BA2BF3676C000545B2 /* KMPresentTableViewCell.swift */,
@@ -15755,6 +15760,7 @@
 				9F080B23298FCB0D00FC27DA /* KMDesignToken+Action.swift in Sources */,
 				9F1FE4B429406E4700E952CA /* CTBrowser.m in Sources */,
 				8942F7BB29222C7E00389627 /* KMBookCellView.swift in Sources */,
+				BBF98C342C0EE46200436CC7 /* KMToolbarCustomItemView.swift in Sources */,
 				BB8F4547295A9CDC0037EA22 /* KMHeaderFooterListController.swift in Sources */,
 				9F0CB5012986560D00007028 /* KMDesignToken+BorderTop.swift in Sources */,
 				ADDEEA922AD796FF00EF675D /* KMSelfSignAnnotationFreeText.swift in Sources */,
@@ -17764,6 +17770,7 @@
 				BBB7B48E2A0384E100B58A5A /* NSCollectionViewItem+KMExtension.swift in Sources */,
 				9FCFEC852AD0EF6700EAD2CB /* KMCustomButtonPopMenuViewController.swift in Sources */,
 				BBA8B7A42935CD740097D183 /* KMRemovePasswordAlertWindowController.swift in Sources */,
+				BBF98C352C0EE46200436CC7 /* KMToolbarCustomItemView.swift in Sources */,
 				AD7D5C932B8F20FE006562CD /* synctex_parser_utils.m in Sources */,
 				BB4EEF4D2976544F003A3537 /* KMRedactAligementView.swift in Sources */,
 				BBF811F22B0763930074874F /* PDFConvertObject.swift in Sources */,
@@ -18159,6 +18166,7 @@
 				F36AD77929642FE80015AD53 /* CPDFListView+UndoManager.m in Sources */,
 				BB234F092BA3D798008B3754 /* KMAIIconGuideView.swift in Sources */,
 				ADDF837F2B391A5D00A81A4E /* DSignatureDetailsViewController.swift in Sources */,
+				BBF98C362C0EE46200436CC7 /* KMToolbarCustomItemView.swift in Sources */,
 				BB853C8C2AF8BC7D009C20C1 /* KMBatchAddPasswordOperation.swift in Sources */,
 				BBB14A5D2978EBBE00936EDB /* KMRedactMutilPageFlagContentView.swift in Sources */,
 				BBF19E9B2B0B3218007154C8 /* KMAnnotationStamp.swift in Sources */,