Browse Source

【菜单栏】Annotate,点击了高亮后,再展开Annotate列表,选项都变灰了(已修复)

tangchao 1 year ago
parent
commit
57593a3794

+ 8 - 0
PDF Office/PDF Master.xcodeproj/project.pbxproj

@@ -2621,6 +2621,9 @@
 		BBB14A6329792D6900936EDB /* KMRedactPageRangeContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB14A6229792D6900936EDB /* KMRedactPageRangeContentView.swift */; };
 		BBB14A6429792D6900936EDB /* KMRedactPageRangeContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB14A6229792D6900936EDB /* KMRedactPageRangeContentView.swift */; };
 		BBB14A6529792D6900936EDB /* KMRedactPageRangeContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB14A6229792D6900936EDB /* KMRedactPageRangeContentView.swift */; };
+		BBB1A39E29F6128200E54E47 /* KMSystemMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB1A39D29F6128200E54E47 /* KMSystemMenu.swift */; };
+		BBB1A39F29F6128200E54E47 /* KMSystemMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB1A39D29F6128200E54E47 /* KMSystemMenu.swift */; };
+		BBB1A3A029F6128200E54E47 /* KMSystemMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB1A39D29F6128200E54E47 /* KMSystemMenu.swift */; };
 		BBB5C80729F4CEE40054F261 /* KMLinkAnnotationPropertyEmptyController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB5C80629F4CEE40054F261 /* KMLinkAnnotationPropertyEmptyController.swift */; };
 		BBB5C80829F4CEE40054F261 /* KMLinkAnnotationPropertyEmptyController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB5C80629F4CEE40054F261 /* KMLinkAnnotationPropertyEmptyController.swift */; };
 		BBB5C80929F4CEE40054F261 /* KMLinkAnnotationPropertyEmptyController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB5C80629F4CEE40054F261 /* KMLinkAnnotationPropertyEmptyController.swift */; };
@@ -4305,6 +4308,7 @@
 		BBB14A5A2978EBBE00936EDB /* KMRedactMutilPageFlagContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMRedactMutilPageFlagContentView.swift; sourceTree = "<group>"; };
 		BBB14A5E297929BD00936EDB /* KMRedactPageRangeWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMRedactPageRangeWindowController.swift; sourceTree = "<group>"; };
 		BBB14A6229792D6900936EDB /* KMRedactPageRangeContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMRedactPageRangeContentView.swift; sourceTree = "<group>"; };
+		BBB1A39D29F6128200E54E47 /* KMSystemMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMSystemMenu.swift; sourceTree = "<group>"; };
 		BBB5C80629F4CEE40054F261 /* KMLinkAnnotationPropertyEmptyController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMLinkAnnotationPropertyEmptyController.swift; sourceTree = "<group>"; };
 		BBB9B2EA299A5D6C004F3235 /* DropboxModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DropboxModel.h; sourceTree = "<group>"; };
 		BBB9B2EB299A5D6C004F3235 /* KMCloudDownloadOperationQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMCloudDownloadOperationQueue.h; sourceTree = "<group>"; };
@@ -8273,6 +8277,7 @@
 				BB2C6A7128F2652500478A33 /* Class */,
 				BBFBE6C128DD7B98008B2335 /* Assets.xcassets */,
 				BBFBE6C328DD7B98008B2335 /* Main.storyboard */,
+				BBB1A39D29F6128200E54E47 /* KMSystemMenu.swift */,
 				BBFBE6C628DD7B98008B2335 /* PDF_Master.entitlements */,
 				BB2C6A7C28F26CEF00478A33 /* PDF_Master-Bridging-Header.h */,
 				BB2C6A7D28F26CEF00478A33 /* PDF_Master Pro-Bridging-Header.h */,
@@ -9911,6 +9916,7 @@
 				ADBC375029CAE27900D93208 /* KMComparativeOutlineRowView.swift in Sources */,
 				ADB1FE8E29752F7000ED072D /* KMBatchBackgroundView.swift in Sources */,
 				9FDD0F77294FEF64000C4DAD /* KMConvertPDFManager.swift in Sources */,
+				BBB1A39E29F6128200E54E47 /* KMSystemMenu.swift in Sources */,
 				9F8539D62943180000DF644E /* KMTabAppearance.swift in Sources */,
 				9F81ADC229B87C7F002251F4 /* KMConvertPDFManagerOC.m in Sources */,
 				BB5DF1E92959C5CB0025CDA1 /* KMHeaderFooterPreviewController.swift in Sources */,
@@ -10667,6 +10673,7 @@
 				ADBC375129CAE27900D93208 /* KMComparativeOutlineRowView.swift in Sources */,
 				ADB1FE8F29752F7000ED072D /* KMBatchBackgroundView.swift in Sources */,
 				AD44D653292C9E7900A94554 /* KMImageToPDFChooseView.swift in Sources */,
+				BBB1A39F29F6128200E54E47 /* KMSystemMenu.swift in Sources */,
 				89D2D2E3294C452B00BFF5FE /* KMPDFThumbnailView.swift in Sources */,
 				9F81ADC329B87C7F002251F4 /* KMConvertPDFManagerOC.m in Sources */,
 				BB5DF1EA2959C5CB0025CDA1 /* KMHeaderFooterPreviewController.swift in Sources */,
@@ -11244,6 +11251,7 @@
 				BBEC00B1295C2AF300A26C98 /* KMBatesPreviewController.swift in Sources */,
 				BB897260294C5DDA0045787C /* KMWatermarkPropertyInfoController.swift in Sources */,
 				F3732316292DF9410013862C /* CPDFTextAnnotation+PDFListView.m in Sources */,
+				BBB1A3A029F6128200E54E47 /* KMSystemMenu.swift in Sources */,
 				F37322EC292DF9410013862C /* CPDFStampAnnotation+PDFListView.m in Sources */,
 				BB8F4562295AA39F0037EA22 /* KMHeaderFooterModel.swift in Sources */,
 				BBAFC85429851A9800D0648E /* KMBatchTableRowView.m in Sources */,

+ 826 - 0
PDF Office/PDF Master/Class/ChromiumTabs/KMBrowserWindowController.swift

@@ -356,9 +356,69 @@ extension KMBrowserWindowController: NSSearchFieldDelegate {
 // MARK: -
 // MARK: Menu Actions
 
+extension KMBrowserWindowController {
+    func canResponseDocumentAction() -> Bool {
+        if (self.browser == nil) {
+            return false
+        }
+        guard let _ = self.browser.activeTabContents() as? KMMainDocument else {
+            return false
+        }
+        return true
+    }
+}
+
 // MARK: -
 // MARK: File Menu
 
+extension KMBrowserWindowController: NSMenuDelegate, NSMenuItemValidation {
+    func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
+        if (self.browser == nil) {
+            return false
+        }
+        guard let action = menuItem.action else {
+            return false
+        }
+        guard let document = self.browser.activeTabContents() as? KMMainDocument else {
+            return false
+        }
+
+        if (KMSystemMenu.isFileSelector(sel: action)) {
+            if (document.isHome) {
+                if (menuItem.action == KMSystemMenu.File.closeTagPageSelector ||
+                    menuItem.action == KMSystemMenu.File.propertySelector ||
+                    menuItem.action == KMSystemMenu.File.showInFinderSelector ||
+                    menuItem.action == KMSystemMenu.File.printSelector) {
+                    return false
+                }
+                return document.homeViewController.validateMenuItem(menuItem)
+            } else {
+                return document.mainViewController.validateMenuItem(menuItem)
+            }
+        }
+        if (KMSystemMenu.isEditSelector(sel: action)) {
+            return document.isHome ? false : document.mainViewController.validateMenuItem(menuItem)
+        }
+        if (KMSystemMenu.isViewSelector(sel: action)) {
+            return document.isHome ? false : document.mainViewController.validateMenuItem(menuItem)
+        }
+        if (KMSystemMenu.isAnnotationSelector(sel: action)) {
+            return document.isHome ? false : document.mainViewController.validateMenuItem(menuItem)
+        }
+        if (KMSystemMenu.isGotoSelector(sel: action)) {
+            return document.isHome ? false : document.mainViewController.validateMenuItem(menuItem)
+        }
+        if (KMSystemMenu.isToolSelector(sel: action)) {
+            return document.isHome ? false : document.mainViewController.validateMenuItem(menuItem)
+        }
+        if (KMSystemMenu.isWindowSelector(sel: action)) {
+            return document.isHome ? document.homeViewController.validateMenuItem(menuItem) : document.mainViewController.validateMenuItem(menuItem)
+        }
+        
+        return true
+    }
+}
+
 extension KMBrowserWindowController {
     @IBAction func menuItemAction_openFile(_ sender: Any) {
         super.openDocument(sender)
@@ -383,3 +443,769 @@ extension KMBrowserWindowController {
         self.openDocumentWindow()
     }
 }
+
+// MARK: - KMSystemFileMenuProtocol
+
+extension KMBrowserWindowController: KMSystemFileMenuProtocol {
+    func menuItemClick_mergePDF(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument {
+            if (document.isHome) {
+                document.homeViewController.menuItemClick_mergePDF(sender)
+            } else {
+                document.mainViewController.menuItemClick_mergePDF(sender)
+            }
+        }
+    }
+    
+    func menuItemClick_Compress(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument {
+            if (document.isHome) {
+                document.homeViewController.menuItemClick_Compress(sender)
+            } else {
+                document.mainViewController.menuItemClick_Compress(sender)
+            }
+        }
+    }
+    
+    func menuItemAction_ConvertToWord(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument {
+            if (document.isHome) {
+                document.homeViewController.menuItemAction_ConvertToWord(sender)
+            } else {
+                document.mainViewController.menuItemAction_ConvertToWord(sender)
+            }
+        }
+    }
+    
+    func menuItemAction_ConvertToExcel(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument {
+            if (document.isHome) {
+                document.homeViewController.menuItemAction_ConvertToExcel(sender)
+            } else {
+                document.mainViewController.menuItemAction_ConvertToExcel(sender)
+            }
+        }
+    }
+    
+    func menuItemAction_ConvertToPPT(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument {
+            if (document.isHome) {
+                document.homeViewController.menuItemAction_ConvertToPPT(sender)
+            } else {
+                document.mainViewController.menuItemAction_ConvertToPPT(sender)
+            }
+        }
+    }
+    
+    func menuItemAction_ConvertToRTF(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument {
+            if (document.isHome) {
+                document.homeViewController.menuItemAction_ConvertToRTF(sender)
+            } else {
+                document.mainViewController.menuItemAction_ConvertToRTF(sender)
+            }
+        }
+    }
+    
+    func menuItemAction_ConvertToHTML(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument {
+            if (document.isHome) {
+                document.homeViewController.menuItemAction_ConvertToHTML(sender)
+            } else {
+                document.mainViewController.menuItemAction_ConvertToHTML(sender)
+            }
+        }
+    }
+    
+    func menuItemAction_ConvertToText(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument {
+            if (document.isHome) {
+                document.homeViewController.menuItemAction_ConvertToText(sender)
+            } else {
+                document.mainViewController.menuItemAction_ConvertToText(sender)
+            }
+        }
+    }
+    
+    func menuItemAction_ConvertToCSV(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument {
+            if (document.isHome) {
+                document.homeViewController.menuItemAction_ConvertToCSV(sender)
+            } else {
+                document.mainViewController.menuItemAction_ConvertToCSV(sender)
+            }
+        }
+    }
+    
+    func menuItemAction_ConvertToImage(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument {
+            if (document.isHome) {
+                document.homeViewController.menuItemAction_ConvertToImage(sender)
+            } else {
+                document.mainViewController.menuItemAction_ConvertToImage(sender)
+            }
+        }
+    }
+    
+    func menuItemClick_SettingPassword(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument {
+            if (document.isHome) {
+                document.homeViewController.menuItemClick_SettingPassword(sender)
+            } else {
+                document.mainViewController.menuItemClick_SettingPassword(sender)
+            }
+        }
+    }
+    
+    func menuItemClick_RemovePassword(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemClick_RemovePassword(sender)
+        }
+    }
+    
+    func menuItemAction_closeWindow(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument {
+            if (document.isHome) {
+                document.homeViewController.menuItemAction_closeWindow(sender)
+            } else {
+                document.mainViewController.menuItemAction_closeWindow(sender)
+            }
+        }
+    }
+    
+    func menuItemAction_closeAllWindows(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument {
+            if (document.isHome) {
+                document.homeViewController.menuItemAction_closeAllWindows(sender)
+            } else {
+                document.mainViewController.menuItemAction_closeAllWindows(sender)
+            }
+        }
+    }
+    
+    func menuItemAction_closeTagPage(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_closeTagPage(sender)
+        }
+    }
+    
+    func menuItemAction_showInFinder(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_showInFinder(sender)
+        }
+    }
+    
+    func menuItemAction_property(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_property(sender)
+        }
+    }
+    
+    func menuItemAction_print(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_print(sender)
+        }
+    }
+}
+
+// MARK: - KMSystemViewMenuProtocol
+
+extension KMBrowserWindowController: KMSystemViewMenuProtocol {
+    func menuItemAction_adjustWidth(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_adjustWidth(sender)
+        }
+    }
+    
+    func menuItemAction_adjustPage(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_adjustPage(sender)
+        }
+    }
+    
+    func menuItemAction_size(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_size(sender)
+        }
+    }
+    
+    func menuItemAction_zoomOut(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_zoomOut(sender)
+        }
+    }
+    
+    func menuItemAction_zoomIn(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_zoomIn(sender)
+        }
+    }
+    
+    func menuItemAction_singlePage(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_singlePage(sender)
+        }
+    }
+    
+    func menuItemAction_singlePageContinue(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_singlePageContinue(sender)
+        }
+    }
+    
+    func menuItemAction_doublePage(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_doublePage(sender)
+        }
+    }
+    
+    func menuItemAction_doublePageContinue(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_doublePageContinue(sender)
+        }
+    }
+    
+    func menuItemAction_bookMode(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_bookMode(sender)
+        }
+    }
+    
+    func menuItemAction_readMode(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_readMode(sender)
+        }
+    }
+    
+    func menuItemAction_showSplitPage(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_showSplitPage(sender)
+        }
+    }
+    
+    func menuItemAction_rotateLeft(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_rotateLeft(sender)
+        }
+    }
+    
+    func menuItemAction_rotateRight(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_rotateRight(sender)
+        }
+    }
+    
+    func menuItemAction_rotateAllPageLeft(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_rotateAllPageLeft(sender)
+        }
+    }
+    
+    func menuItemAction_rotateAllPageRight(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_rotateAllPageRight(sender)
+        }
+    }
+    
+    func menuItemAction_view_readMode(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_view_readMode(sender)
+        }
+    }
+    
+    func menuItemAction_hiddenLeftSide(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_hiddenLeftSide(sender)
+        }
+    }
+    
+    func menuItemAction_hiddenRightSide(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_hiddenRightSide(sender)
+        }
+    }
+    
+    func menuItemAction_thumai(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_thumai(sender)
+        }
+    }
+    
+    func menuItemAction_outline(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_outline(sender)
+        }
+    }
+    
+    func menuItemAction_bookmark(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_bookmark(sender)
+        }
+    }
+    
+    func menuItemAction_annotation(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_annotation(sender)
+        }
+    }
+    
+    func menuItemAction_search(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_search(sender)
+        }
+    }
+    
+    func menuItemAction_hiddenPageIndicator(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_hiddenPageIndicator(sender)
+        }
+    }
+}
+
+// MARK: - KMSystemEditMenuProtocol
+
+extension KMBrowserWindowController: KMSystemEditMenuProtocol {
+    func menuItemAction_find(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_find(sender)
+        }
+    }
+}
+
+// MARK: - Annotation Menu
+
+extension KMBrowserWindowController {
+    @IBAction func menuItemAction_highlight(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_highlight(sender)
+        }
+    }
+
+    @IBAction func menuItemAction_underline(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_underline(sender)
+        }
+    }
+    
+    @IBAction func menuItemAction_deleteLine(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_deleteLine(sender)
+        }
+    }
+    
+    @IBAction func menuItemAction_freehand(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_freehand(sender)
+        }
+    }
+
+    @IBAction func menuItemAction_text(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_text(sender)
+        }
+    }
+    
+    @IBAction func menuItemAction_note(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_note(sender)
+        }
+    }
+    
+    @IBAction func menuItemAction_squre(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_squre(sender)
+        }
+    }
+
+    @IBAction func menuItemAction_circle(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_circle(sender)
+        }
+    }
+    
+    @IBAction func menuItemAction_arrow(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_arrow(sender)
+        }
+    }
+    
+    @IBAction func menuItemAction_line(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_line(sender)
+        }
+    }
+
+    // link
+    
+    @IBAction func menuItemAction_link(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_link(sender)
+        }
+    }
+    
+    @IBAction func menuItemAction_linkPage(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_linkPage(sender)
+        }
+    }
+    
+    // stamp
+    
+    @IBAction func menuItemAction_stamp(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_stamp(sender)
+        }
+    }
+    
+    @IBAction func menuItemAction_signure(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_signure(sender)
+        }
+    }
+    
+    @IBAction func menuItemAction_hiddenAllAnnotation(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_hiddenAllAnnotation(sender)
+        }
+    }
+    
+    @IBAction func menuItemAction_clearAllAnnotation(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_clearAllAnnotation(sender)
+        }
+    }
+}
+
+// MARK: - KMSystemGotoMenuProtocol
+
+extension KMBrowserWindowController: KMSystemGotoMenuProtocol {
+    func menuItemAction_nextPage(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_nextPage(sender)
+        }
+    }
+    
+    func menuItemAction_forwardPage(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_forwardPage(sender)
+        }
+    }
+    
+    func menuItemAction_firstPage(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_firstPage(sender)
+        }
+    }
+    
+    func menuItemAction_lastPage(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_lastPage(sender)
+        }
+    }
+    
+    func menuItemAction_forward(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_forward(sender)
+        }
+    }
+    
+    func menuItemAction_goback(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_goback(sender)
+        }
+    }
+    
+    func menuItemAction_gotoPage(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_gotoPage(sender)
+        }
+    }
+}
+
+// MARK: - KMSystemToolMenuProtocol
+
+extension KMBrowserWindowController: KMSystemToolMenuProtocol {
+    func menuItemAction_scrolTool(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_scrolTool(sender)
+        }
+    }
+    
+    func menuItemAction_zoomOutTool(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_zoomOutTool(sender)
+        }
+    }
+    
+    func menuItemAction_selectTool(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument, document.isHome == false {
+            document.mainViewController.menuItemAction_selectTool(sender)
+        }
+    }
+}
+
+// MARK: - KMSystemWindowMenuRrotocol
+
+extension KMBrowserWindowController: KMSystemWindowMenuRrotocol {
+    func menuItemAction_showForwardTagPage(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument {
+            if (document.isHome) {
+                document.homeViewController.menuItemAction_showForwardTagPage(sender)
+            } else {
+                document.mainViewController.menuItemAction_showForwardTagPage(sender)
+            }
+        }
+    }
+    
+    func menuItemAction_showNextTagPage(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument {
+            if (document.isHome) {
+                document.homeViewController.menuItemAction_showNextTagPage(sender)
+            } else {
+                document.mainViewController.menuItemAction_showNextTagPage(sender)
+            }
+        }
+    }
+    
+    func menuItemAction_newTagPageToNewWindow(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument {
+            if (document.isHome) {
+                document.homeViewController.menuItemAction_newTagPageToNewWindow(sender)
+            } else {
+                document.mainViewController.menuItemAction_newTagPageToNewWindow(sender)
+            }
+        }
+    }
+    
+    func menuItemAction_mergeAllWindow(_ sender: Any) {
+        if (self.canResponseDocumentAction() == false) {
+            return
+        }
+        if let document = self.browser.activeTabContents() as? KMMainDocument {
+            if (document.isHome) {
+                document.homeViewController.menuItemAction_mergeAllWindow(sender)
+            } else {
+                document.mainViewController.menuItemAction_mergeAllWindow(sender)
+            }
+        }
+    }
+}

+ 1 - 1
PDF Office/PDF Master/Class/Common/Tools/KMTools.swift

@@ -224,7 +224,7 @@ extension KMTools {
     // 打开 [更多产品] 网站
     @objc class func openMoreProductWebsite() {
         // MARK: -
-        // MARK TODO: url需要替换
+        // FIXME: url需要替换
         KMTools.openURL(URL(string: "https://www.pdfreaderpro.com/product?utm_source=MacApp&utm_campaign=ProductLink&utm_medium=PdfProduct")!)
     }
     

+ 3 - 3
PDF Office/PDF Master/Class/Home/ViewController/KMHomeViewController+Action.swift

@@ -1460,7 +1460,7 @@ extension KMHomeViewController {
 // MARK: help Menu
 
 extension KMHomeViewController {
-    @IBAction func menuItemAction_search(_ sender: Any) {
-        
-    }
+//    @IBAction func menuItemAction_search(_ sender: Any) {
+//        
+//    }
 }

+ 423 - 0
PDF Office/PDF Master/KMSystemMenu.swift

@@ -0,0 +1,423 @@
+//
+//  KMSystemMenu.swift
+//  PDF Master
+//
+//  Created by tangchao on 2023/4/24.
+//
+
+import Cocoa
+
+protocol KMSystemFileMenuProtocol {
+    func menuItemClick_mergePDF(_ sender: Any)
+    func menuItemClick_Compress(_ sender: Any)
+    
+    func menuItemClick_Convert(_ sender: Any)
+    func menuItemAction_ConvertToWord(_ sender: Any)
+    func menuItemAction_ConvertToExcel(_ sender: Any)
+    func menuItemAction_ConvertToPPT(_ sender: Any)
+    func menuItemAction_ConvertToRTF(_ sender: Any)
+    func menuItemAction_ConvertToHTML(_ sender: Any)
+    func menuItemAction_ConvertToText(_ sender: Any)
+    func menuItemAction_ConvertToCSV(_ sender: Any)
+    func menuItemAction_ConvertToImage(_ sender: Any)
+    
+    func menuItemClick_SettingPassword(_ sender: Any)
+    func menuItemClick_RemovePassword(_ sender: Any)
+    
+    func menuItemAction_closeWindow(_ sender: Any)
+    func menuItemAction_closeAllWindows(_ sender: Any)
+    func menuItemAction_closeTagPage(_ sender: Any)
+    
+    func menuItemAction_showInFinder(_ sender: Any)
+    func menuItemAction_property(_ sender: Any)
+    
+    func menuItemAction_print(_ sender: Any)
+}
+
+extension KMSystemFileMenuProtocol {
+    func menuItemClick_Convert(_ sender: Any) {}
+}
+
+protocol KMSystemEditMenuProtocol {
+    func menuItemAction_find(_ sender: Any)
+}
+
+protocol KMSystemAnnotationMenuProtocol: NSObjectProtocol {
+    func menuItemAction_highlight(_ sender: Any)
+    func menuItemAction_underline(_ sender: Any)
+    func menuItemAction_deleteLine(_ sender: Any)
+    func menuItemAction_freehand(_ sender: Any)
+    func menuItemAction_text(_ sender: Any)
+    func menuItemAction_note(_ sender: Any)
+    func menuItemAction_squre(_ sender: Any)
+    func menuItemAction_circle(_ sender: Any)
+    func menuItemAction_arrow(_ sender: Any)
+    func menuItemAction_line(_ sender: Any)
+
+    // link
+    func menuItemAction_link(_ sender: Any)
+    func menuItemAction_linkPage(_ sender: Any)
+    func menuItemAction_linkHttps(_ sender: Any)
+    func menuItemAction_linkEmail(_ sender: Any)
+    
+    // stamp
+    func menuItemAction_stamp(_ sender: Any)
+    func menuItemAction_stampStandard(_ sender: Any)
+    func menuItemAction_stampDynamic(_ sender: Any)
+    func menuItemAction_stampCustom(_ sender: Any)
+    
+    func menuItemAction_signure(_ sender: Any)
+    
+    func menuItemAction_hiddenAllAnnotation(_ sender: Any)
+    func menuItemAction_clearAllAnnotation(_ sender: Any)
+}
+
+extension KMSystemAnnotationMenuProtocol {
+    func menuItemAction_linkHttps(_ sender: Any) {}
+    func menuItemAction_linkEmail(_ sender: Any) {}
+    
+    func menuItemAction_stampStandard(_ sender: Any) {}
+    func menuItemAction_stampDynamic(_ sender: Any) {}
+    func menuItemAction_stampCustom(_ sender: Any) {}
+}
+
+protocol KMSystemGotoMenuProtocol {
+    func menuItemAction_nextPage(_ sender: Any)
+    func menuItemAction_forwardPage(_ sender: Any)
+    func menuItemAction_firstPage(_ sender: Any)
+    func menuItemAction_lastPage(_ sender: Any)
+    func menuItemAction_forward(_ sender: Any)
+    func menuItemAction_goback(_ sender: Any)
+    func menuItemAction_gotoPage(_ sender: Any)
+}
+
+protocol KMSystemToolMenuProtocol {
+    func menuItemAction_textTool(_ sender: Any)
+    func menuItemAction_scrolTool(_ sender: Any)
+    func menuItemAction_zoomOutTool(_ sender: Any)
+    func menuItemAction_selectTool(_ sender: Any)
+    func menuItemAction_redact(_ sender: Any)
+    func menuItemAction_warkmark(_ sender: Any)
+    func menuItemAction_background(_ sender: Any)
+    func menuItemAction_headerfooter(_ sender: Any)
+    func menuItemAction_bates(_ sender: Any)
+    func menuItemAction_batch(_ sender: Any)
+}
+extension KMSystemToolMenuProtocol {
+    func menuItemAction_textTool(_ sender: Any) {}
+    
+    func menuItemAction_redact(_ sender: Any) {}
+    func menuItemAction_warkmark(_ sender: Any) {}
+    func menuItemAction_background(_ sender: Any) {}
+    func menuItemAction_headerfooter(_ sender: Any) {}
+    func menuItemAction_bates(_ sender: Any) {}
+    func menuItemAction_batch(_ sender: Any) {}
+}
+
+protocol KMSystemWindowMenuRrotocol {
+    func menuItemAction_showForwardTagPage(_ sender: Any)
+    func menuItemAction_showNextTagPage(_ sender: Any)
+    func menuItemAction_newTagPageToNewWindow(_ sender: Any)
+    func menuItemAction_mergeAllWindow(_ sender: Any)
+    func menuItemAction_currentWindowName(_ sender: Any)
+}
+extension KMSystemWindowMenuRrotocol {
+    func menuItemAction_currentWindowName(_ sender: Any) {}
+}
+
+protocol KMSystemViewMenuProtocol {
+    // scale
+    func menuItemAction_adjustWidth(_ sender: Any)
+    func menuItemAction_adjustPage(_ sender: Any)
+    func menuItemAction_size(_ sender: Any)
+    func menuItemAction_zoomOut(_ sender: Any)
+    func menuItemAction_zoomIn(_ sender: Any)
+    
+    // page show
+    func menuItemAction_singlePage(_ sender: Any)
+    func menuItemAction_singlePageContinue(_ sender: Any)
+    func menuItemAction_doublePage(_ sender: Any)
+    func menuItemAction_doublePageContinue(_ sender: Any)
+    func menuItemAction_bookMode(_ sender: Any)
+    func menuItemAction_readMode(_ sender: Any)
+    func menuItemAction_showSplitPage(_ sender: Any)
+
+    func menuItemAction_autoScrol(_ sender: Any)
+    func menuItemAction_autoScrolSetting(_ sender: Any)
+    
+    // rotate
+    func menuItemAction_rotateLeft(_ sender: Any)
+    func menuItemAction_rotateRight(_ sender: Any)
+    func menuItemAction_rotateAllPageLeft(_ sender: Any)
+    func menuItemAction_rotateAllPageRight(_ sender: Any)
+    
+    // split screen
+    func menuItemAction_splitScreenVerti(_ sender: Any)
+    func menuItemAction_splitScreenHorti(_ sender: Any)
+    func menuItemAction_splitScreenNo(_ sender: Any)
+    
+    func menuItemAction_view_readMode(_ sender: Any)
+
+    func menuItemAction_enterFullScreen(_ sender: Any)
+
+    func menuItemAction_hiddenLeftSide(_ sender: Any)
+    func menuItemAction_hiddenRightSide(_ sender: Any)
+    func menuItemAction_thumai(_ sender: Any)
+    func menuItemAction_outline(_ sender: Any)
+    func menuItemAction_bookmark(_ sender: Any)
+    func menuItemAction_annotation(_ sender: Any)
+    func menuItemAction_search(_ sender: Any)
+
+    func menuItemAction_topic(_ sender: Any)
+    func menuItemAction_hiddenPageIndicator(_ sender: Any)
+}
+extension KMSystemViewMenuProtocol {
+    func menuItemAction_autoScrol(_ sender: Any) {}
+    func menuItemAction_autoScrolSetting(_ sender: Any) {}
+    
+    func menuItemAction_splitScreenVerti(_ sender: Any) {}
+    func menuItemAction_splitScreenHorti(_ sender: Any) {}
+    func menuItemAction_splitScreenNo(_ sender: Any) {}
+    
+    func menuItemAction_enterFullScreen(_ sender: Any) {}
+    func menuItemAction_topic(_ sender: Any) {}
+}
+
+extension KMSystemMenu.File {
+    public static let mergePDFSelector              = NSSelectorFromString("menuItemClick_mergePDF:")
+    public static let compressSelector              = NSSelectorFromString("menuItemClick_Compress:")
+    
+    public static let convertSelector               = NSSelectorFromString("menuItemClick_Convert:")
+    public static let convertToWordSelector         = NSSelectorFromString("menuItemAction_ConvertToWord:")
+    public static let convertToExcelSelector        = NSSelectorFromString("menuItemAction_ConvertToExcel:")
+    public static let convertToPPTSelector          = NSSelectorFromString("menuItemAction_ConvertToPPT:")
+    public static let convertToRTFSelector          = NSSelectorFromString("menuItemAction_ConvertToRTF:")
+    public static let convertToHTMLSelector         = NSSelectorFromString("menuItemAction_ConvertToHTML:")
+    public static let convertToTextSelector         = NSSelectorFromString("menuItemAction_ConvertToText:")
+    public static let convertToCSVSelector          = NSSelectorFromString("menuItemAction_ConvertToCSV:")
+    public static let convertToImageSelector        = NSSelectorFromString("menuItemAction_ConvertToImage:")
+    
+    public static let settingPasswordSelector       = NSSelectorFromString("menuItemClick_SettingPassword:")
+    public static let removePasswordSelector        = NSSelectorFromString("menuItemClick_RemovePassword:")
+    
+    public static let closeWindowSelector           = NSSelectorFromString("menuItemAction_closeWindow:")
+    public static let closeAllWindowsSelector       = NSSelectorFromString("menuItemAction_closeAllWindows:")
+    public static let closeTagPageSelector          = NSSelectorFromString("menuItemAction_closeTagPage:")
+    
+    public static let showInFinderSelector          = NSSelectorFromString("menuItemAction_showInFinder:")
+    public static let propertySelector              = NSSelectorFromString("menuItemAction_property:")
+    
+    public static let printSelector                 = NSSelectorFromString("menuItemAction_print:")
+    
+    public static func actions() -> [Selector] {
+        return [self.mergePDFSelector, self.compressSelector,
+                // convert
+                self.convertSelector, self.convertToWordSelector, self.convertToExcelSelector, self.convertToPPTSelector,
+                self.convertToRTFSelector, self.convertToHTMLSelector, self.convertToTextSelector, self.convertToCSVSelector,
+                self.convertToImageSelector,
+                // secure
+                self.settingPasswordSelector, self.removePasswordSelector,
+                // other
+                self.closeWindowSelector, self.closeAllWindowsSelector, self.closeTagPageSelector,
+                self.showInFinderSelector, self.propertySelector,
+                self.printSelector]
+    }
+}
+
+extension KMSystemMenu.Edit {
+    public static let findSelector              = NSSelectorFromString("menuItemAction_find:")
+    public static func actions() -> [Selector] {
+        return [self.findSelector]
+    }
+}
+
+extension KMSystemMenu.View {
+    // scale
+    public static let adjustWidthSelector           = NSSelectorFromString("menuItemAction_adjustWidth:")
+    public static let adjustPageSelector            = NSSelectorFromString("menuItemAction_adjustPage:")
+    public static let sizeSelector                  = NSSelectorFromString("menuItemAction_size:")
+    public static let zoomOutSelector               = NSSelectorFromString("menuItemAction_zoomOut:")
+    public static let zoomInSelector                = NSSelectorFromString("menuItemAction_zoomIn:")
+    // page show
+    public static let singlePageSelector            = NSSelectorFromString("menuItemAction_singlePage:")
+    public static let singlePageContinueSelector    = NSSelectorFromString("menuItemAction_singlePageContinue:")
+    public static let doublePageSelector            = NSSelectorFromString("menuItemAction_doublePage:")
+    public static let doublePageContinueSelector    = NSSelectorFromString("menuItemAction_doublePageContinue:")
+    public static let bookModeSelector              = NSSelectorFromString("menuItemAction_bookMode:")
+    public static let readModeSelector              = NSSelectorFromString("menuItemAction_readMode:")
+    public static let showSplitPageSelector         = NSSelectorFromString("menuItemAction_showSplitPage:")
+    public static let autoScrolSelector             = NSSelectorFromString("menuItemAction_autoScrol:")
+    public static let autoScrolSettingSelector      = NSSelectorFromString("menuItemAction_autoScrolSetting:")
+    // rotate
+    public static let rotateLeftSelector            = NSSelectorFromString("menuItemAction_rotateLeft:")
+    public static let rotateRightSelector           = NSSelectorFromString("menuItemAction_rotateRight:")
+    public static let rotateAllPageLeftSelector     = NSSelectorFromString("menuItemAction_rotateAllPageLeft:")
+    public static let rotateAllPageRightSelector    = NSSelectorFromString("menuItemAction_rotateAllPageRight:")
+    // split screen
+    public static let splitScreenVertiSelector      = NSSelectorFromString("menuItemAction_splitScreenVerti:")
+    public static let splitScreenHortiSelector      = NSSelectorFromString("menuItemAction_splitScreenHorti:")
+    public static let splitScreenNoSelector         = NSSelectorFromString("menuItemAction_splitScreenNo:")
+
+    public static let viewReadModeSelector          = NSSelectorFromString("menuItemAction_view_readMode:")
+    public static let enterFullScreenSelector       = NSSelectorFromString("menuItemAction_enterFullScreen:")
+    
+    public static let hiddenLeftSideSelector        = NSSelectorFromString("menuItemAction_hiddenLeftSide:")
+    public static let hiddenRightSideSelector       = NSSelectorFromString("menuItemAction_hiddenRightSide:")
+    public static let thumaiSelector                = NSSelectorFromString("menuItemAction_thumai:")
+    public static let outlineSelector               = NSSelectorFromString("menuItemAction_outline:")
+    public static let bookmarkSelector              = NSSelectorFromString("menuItemAction_bookmark:")
+    public static let annotationSelector            = NSSelectorFromString("menuItemAction_annotation:")
+    public static let searchSelector                = NSSelectorFromString("menuItemAction_search:")
+    
+    public static let topicSelector                 = NSSelectorFromString("menuItemAction_topic:")
+    public static let hiddenPageIndicatorSelector   = NSSelectorFromString("menuItemAction_hiddenPageIndicator:")
+    
+    public static func actions() -> [Selector] {
+        return [self.adjustWidthSelector, self.adjustPageSelector, self.sizeSelector, self.zoomOutSelector, self.zoomInSelector,
+                // page show
+                self.singlePageSelector, self.singlePageContinueSelector, self.doublePageSelector, self.doublePageContinueSelector,
+                self.bookModeSelector, self.readModeSelector, self.showSplitPageSelector, self.autoScrolSelector,
+                self.autoScrolSettingSelector,
+                // rotate
+                self.rotateLeftSelector, self.rotateRightSelector, self.rotateAllPageLeftSelector, self.rotateAllPageRightSelector,
+                // split screen
+                self.splitScreenVertiSelector, self.splitScreenHortiSelector, self.splitScreenNoSelector,
+                self.viewReadModeSelector, self.enterFullScreenSelector,
+                self.hiddenLeftSideSelector, self.hiddenRightSideSelector,
+                self.thumaiSelector, self.outlineSelector, self.bookmarkSelector, self.annotationSelector,
+                self.searchSelector, self.topicSelector, self.hiddenPageIndicatorSelector]
+    }
+}
+
+extension KMSystemMenu.Annotation {
+    public static let highlightSelector     = NSSelectorFromString("menuItemAction_highlight:")
+    public static let underlineSelector     = NSSelectorFromString("menuItemAction_underline:")
+    public static let strikeOutSelector     = NSSelectorFromString("menuItemAction_deleteLine:")
+    public static let freehandSelector      = NSSelectorFromString("menuItemAction_freehand:")
+    public static let textSelector          = NSSelectorFromString("menuItemAction_text:")
+    public static let noteSelector          = NSSelectorFromString("menuItemAction_note:")
+    public static let squreSelector         = NSSelectorFromString("menuItemAction_squre:")
+    public static let circleSelector        = NSSelectorFromString("menuItemAction_circle:")
+    public static let arrowSelector         = NSSelectorFromString("menuItemAction_arrow:")
+    public static let lineSelector          = NSSelectorFromString("menuItemAction_line:")
+    
+    public static let linkSelector          = NSSelectorFromString("menuItemAction_link:")
+    public static let linkPageSelector      = NSSelectorFromString("menuItemAction_linkPage:")
+    public static let linkHttpsSelector     = NSSelectorFromString("menuItemAction_linkHttps:")
+    public static let linkEmailSelector     = NSSelectorFromString("menuItemAction_linkEmail:")
+    
+    public static let stampSelector         = NSSelectorFromString("menuItemAction_stamp:")
+    public static let stampStandardSelector = NSSelectorFromString("menuItemAction_stampStandard:")
+    public static let stampDynamicSelector  = NSSelectorFromString("menuItemAction_stampDynamic:")
+    public static let stampCustomSelector   = NSSelectorFromString("menuItemAction_stampCustom:")
+    
+    public static let signureSelector       = NSSelectorFromString("menuItemAction_signure:")
+    public static let hiddenAllSelector     = NSSelectorFromString("menuItemAction_hiddenAllAnnotation:")
+    public static let clearAllSelector      = NSSelectorFromString("menuItemAction_clearAllAnnotation:")
+    
+    public static func actions() -> [Selector] {
+        return [self.highlightSelector, self.underlineSelector, self.strikeOutSelector, self.freehandSelector,
+                self.textSelector, self.noteSelector, self.squreSelector, self.circleSelector,
+                self.arrowSelector, self.lineSelector,
+                // link
+                self.linkSelector, self.linkPageSelector, self.linkHttpsSelector, self.linkEmailSelector,
+                // stamp
+                self.stampSelector, self.stampStandardSelector, self.stampDynamicSelector, self.stampCustomSelector,
+                // other
+                self.signureSelector, self.hiddenAllSelector, self.clearAllSelector]
+    }
+}
+
+extension KMSystemMenu.Goto {
+    public static let nextPageSelector     = NSSelectorFromString("menuItemAction_nextPage:")
+    public static let forwardPageSelector  = NSSelectorFromString("menuItemAction_forwardPage:")
+    public static let firstPageSelector    = NSSelectorFromString("menuItemAction_firstPage:")
+    public static let lastPageSelector     = NSSelectorFromString("menuItemAction_lastPage:")
+    public static let forwardSelector      = NSSelectorFromString("menuItemAction_forward:")
+    public static let gobackSelector       = NSSelectorFromString("menuItemAction_goback:")
+    public static let gotoPageSelector     = NSSelectorFromString("menuItemAction_gotoPage:")
+    
+    public static func actions() -> [Selector] {
+        return [self.nextPageSelector, self.forwardPageSelector, self.firstPageSelector, self.lastPageSelector,
+                self.forwardSelector, self.gobackSelector, self.gotoPageSelector]
+    }
+}
+
+extension KMSystemMenu.Tool {
+    public static let textToolSelector    = NSSelectorFromString("menuItemAction_textTool:")
+    public static let scrolToolSelector   = NSSelectorFromString("menuItemAction_scrolTool:")
+    public static let zoomToolSelector    = NSSelectorFromString("menuItemAction_zoomOutTool:")
+    public static let selectToolSelector  = NSSelectorFromString("menuItemAction_selectTool:")
+    public static let redactSelector      = NSSelectorFromString("menuItemAction_redact:")
+    public static let warkmarkSelector    = NSSelectorFromString("menuItemAction_warkmark:")
+    public static let backgroundSelector  = NSSelectorFromString("menuItemAction_background:")
+    public static let headerfooterSelector = NSSelectorFromString("menuItemAction_headerfooter:")
+    public static let batesSelector       = NSSelectorFromString("menuItemAction_bates:")
+    public static let batchSelector       = NSSelectorFromString("menuItemAction_batch:")
+    
+    public static func actions() -> [Selector] {
+        return [self.textToolSelector, self.scrolToolSelector, self.zoomToolSelector, self.selectToolSelector,
+                self.redactSelector, self.warkmarkSelector, self.backgroundSelector, self.headerfooterSelector,
+                self.batesSelector, self.batchSelector]
+    }
+}
+
+extension KMSystemMenu.Window {
+    public static let showForwardTagPageSelector    = NSSelectorFromString("menuItemAction_showForwardTagPage:")
+    public static let showNextTagPageSelector       = NSSelectorFromString("menuItemAction_showNextTagPage:")
+    public static let newTagPageToNewWindowSelector = NSSelectorFromString("menuItemAction_newTagPageToNewWindow:")
+    public static let mergeAllWindowSelector        = NSSelectorFromString("menuItemAction_mergeAllWindow:")
+    public static let currentWindowNameSelector     = NSSelectorFromString("menuItemAction_currentWindowName:")
+    
+    public static func actions() -> [Selector] {
+        return [self.showForwardTagPageSelector, self.showNextTagPageSelector,
+                self.newTagPageToNewWindowSelector, self.mergeAllWindowSelector,
+                self.currentWindowNameSelector]
+    }
+}
+
+class KMSystemMenu: NSObject {
+    public struct File {
+        
+    }
+    public struct Edit {
+        
+    }
+    public struct View {
+        
+    }
+    public struct Annotation {
+
+    }
+    public struct Goto {
+        
+    }
+    public struct Tool {
+        
+    }
+    public struct Window {
+        
+    }
+    
+    public static func isFileSelector(sel: Selector) -> Bool {
+        return KMSystemMenu.File.actions().contains(sel)
+    }
+    public static func isEditSelector(sel: Selector) -> Bool {
+        return KMSystemMenu.Edit.actions().contains(sel)
+    }
+    public static func isViewSelector(sel: Selector) -> Bool {
+        return KMSystemMenu.View.actions().contains(sel)
+    }
+    public static func isAnnotationSelector(sel: Selector) -> Bool {
+        return KMSystemMenu.Annotation.actions().contains(sel)
+    }
+    public static func isGotoSelector(sel: Selector) -> Bool {
+        return KMSystemMenu.Goto.actions().contains(sel)
+    }
+    public static func isToolSelector(sel: Selector) -> Bool {
+        return KMSystemMenu.Tool.actions().contains(sel)
+    }
+    public static func isWindowSelector(sel: Selector) -> Bool {
+        return KMSystemMenu.Window.actions().contains(sel)
+    }
+}