AppDelegate+MenuAction.swift 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170
  1. //
  2. // AppDelegate+MenuAction.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by Niehaoyu on 2025/1/2.
  6. //
  7. import Foundation
  8. //MARK: - NSMenuDelegate
  9. extension AppDelegate: NSMenuDelegate, NSMenuItemValidation {
  10. func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
  11. let action = menuItem.action
  12. if self.isPDFReaderProMenuActions(sel: action) {
  13. return self.validatePDFReaderProMenuItem(menuItem)
  14. } else if self.isFileMenuActions(sel: action) {
  15. return self.validateFileMenuItem(menuItem)
  16. } else if self.isEditMenuActions(sel: action) {
  17. return self.validateEditMenuItem(menuItem)
  18. } else if self.isViewMenuActions(sel: action) {
  19. return self.validateViewMenuItem(menuItem)
  20. } else if self.isGoMenuActions(sel: action) {
  21. return self.validateGoMenuItem(menuItem)
  22. } else if self.isWindowMenuActions(sel: action) {
  23. return self.validateWindowMenuItem(menuItem)
  24. } else if self.isHelpMenuActions(sel: action) {
  25. return self.validateHelpMenuItem(menuItem)
  26. }
  27. return false
  28. }
  29. func menu(_ menu: NSMenu, update item: NSMenuItem, at index: Int, shouldCancel: Bool) -> Bool {
  30. return true
  31. }
  32. // MARK: - update Menu
  33. func initMainMenu() {
  34. // 处理菜单栏多语
  35. let mainMenu = NSApp.mainMenu
  36. if (mainMenu == nil) {
  37. return
  38. }
  39. for menu in mainMenu!.items {
  40. let subMenu = menu.submenu
  41. for item in subMenu!.items {
  42. item.title = KMLocalizedString(item.title, comment: "")
  43. let itemSubMenu = item.submenu
  44. if (itemSubMenu == nil) {
  45. continue
  46. }
  47. for item in itemSubMenu!.items {
  48. item.title = KMLocalizedString(item.title, comment: "")
  49. let itemSubMenu = item.submenu
  50. if (itemSubMenu == nil) {
  51. continue
  52. }
  53. for item in itemSubMenu!.items {
  54. item.title = KMLocalizedString(item.title, comment: "")
  55. }
  56. }
  57. }
  58. }
  59. //appMenu
  60. let appMenu = mainMenu?.item(at: 0)?.submenu
  61. if let item = appMenu?.item(at: 0) {
  62. item.title = KMLocalizedString("About") + " " + KMNAppName
  63. }
  64. //Share Item
  65. let fileMenu = mainMenu?.item(at: 1)?.submenu
  66. for item in fileMenu?.items ?? [] {
  67. if item.action == NSSelectorFromString("menuItemAction_showInFinder:") {
  68. let shareItem: NSMenuItem? = NSMenuItem(title: KMLocalizedString("Share"), action: nil, target: nil)
  69. fileMenu?.insertItem(shareItem!, at: item.index)
  70. shareItem?.submenu = NSSharingServicePicker.menu(forSharingItems: [""], subjectContext: "", withTarget: self, selector: #selector(sharePageItemAction), serviceDelegate: nil)
  71. }
  72. }
  73. self.updateAppMenu()
  74. }
  75. @objc func sharePageItemAction(sender: NSMenuItem) {
  76. if ((NSApp.mainWindow?.windowController is KMBrowserWindowController) == false) {
  77. return
  78. }
  79. let windowControler = NSApp.mainWindow?.windowController as! KMBrowserWindowController
  80. let model = windowControler.browser?.tabStripModel
  81. if let cnt = model?.count(), cnt <= 0 {
  82. return
  83. }
  84. if let data = model?.activeTabContents()?.isHome, data {
  85. return
  86. }
  87. let document: KMMainDocument = model?.activeTabContents() as! KMMainDocument
  88. if let data = document.mainViewController?.saveWatermarkFlag, !data {
  89. let represent : NSSharingService = sender.representedObject as! NSSharingService
  90. represent.perform(withItems: [document.fileURL as Any])
  91. return
  92. }
  93. let represent : NSSharingService = sender.representedObject as! NSSharingService
  94. represent.perform(withItems: [document.fileURL as Any])
  95. }
  96. @objc func accountRefreshAction() {
  97. }
  98. }
  99. // MARK: - PDF Reader Pro Menu
  100. extension AppDelegate {
  101. func isPDFReaderProMenuActions(sel: Selector?) -> Bool {
  102. guard let selector = sel else {
  103. return false
  104. }
  105. let selectors = [NSSelectorFromString("menuItemAction_openPreferenceWindow:"),
  106. NSSelectorFromString("menuItemAction_loginMenuItemAction:"),
  107. NSSelectorFromString("menuItemAction_logoutMenuItemAction:"),
  108. NSSelectorFromString("menuItemAction_buyNowItemAction:"),
  109. NSSelectorFromString("menuItemAction_restoreMenuItemAction:"),
  110. NSSelectorFromString("menuItemAction_EducationDiscountAction:"),
  111. NSSelectorFromString("menuItemAction_volumeDiscount:")]
  112. if selectors.contains(selector) {
  113. return true
  114. }
  115. return false
  116. }
  117. func validatePDFReaderProMenuItem(_ menuItem: NSMenuItem) -> Bool {
  118. updateAppMenu()
  119. return true
  120. }
  121. //MARK: -IBAction
  122. @IBAction func menuItemAction_openPreferenceWindow(_ sender: Any) {
  123. SettingsWindowController.shared.showWindow(self)
  124. }
  125. @IBAction func menuItemAction_loginMenuItemAction(_ sender: Any) {
  126. if KMMemberInfo.shared.isLogin {
  127. KMUserInfoVCModel().skipAccountCenter()
  128. } else {
  129. KMLoginWindowsController.shared.showWindow(nil)
  130. }
  131. }
  132. @IBAction func menuItemAction_logoutMenuItemAction(_ sender: Any) {
  133. KMUserInfoVCModel().signOutAction()
  134. }
  135. @IBAction func menuItemAction_buyNowItemAction(_ sender: Any) {
  136. }
  137. @IBAction func menuItemAction_restoreMenuItemAction(_ sender: Any) {
  138. }
  139. @IBAction func menuItemAction_EducationDiscountAction(_ sender: NSMenuItem) {
  140. KMTools.openEducateWebSite()
  141. }
  142. @IBAction func menuItemAction_volumeDiscount(_ sender: NSMenuItem) {
  143. KMTools.openVPPWebSite()
  144. }
  145. func updateAppMenu() {
  146. guard let mainMenu = NSApp.mainMenu else {
  147. return
  148. }
  149. let appMenu = mainMenu.item(at: 0)?.submenu
  150. for item in appMenu?.items ?? [] {
  151. if item.action == NSSelectorFromString("menuItemAction_loginMenuItemAction:") {
  152. if KMMemberInfo.shared.isLogin {
  153. item.title = KMMemberInfo.shared.userEmail
  154. } else {
  155. item.title = KMLocalizedString("Login")
  156. }
  157. } else if item.action == NSSelectorFromString("menuItemAction_logoutMenuItemAction:") {
  158. item.isHidden = KMMemberInfo.shared.isLogin ? false : true
  159. }
  160. #if VERSION_BETA
  161. if item.action == NSSelectorFromString("menuItemAction_buyNowItemAction:") {
  162. item.isHidden = true
  163. } else if item.action == NSSelectorFromString("menuItemAction_restoreMenuItemAction:") {
  164. item.isHidden = true
  165. } else if item.action == NSSelectorFromString("menuItemAction_EducationDiscountAction:") {
  166. item.isHidden = true
  167. } else if item.action == NSSelectorFromString("menuItemAction_volumeDiscount:") {
  168. item.isHidden = true
  169. }
  170. #endif
  171. }
  172. }
  173. }
  174. //MARK: - File Menu
  175. extension AppDelegate {
  176. func isFileMenuActions(sel: Selector?) -> Bool {
  177. guard let selector = sel else {
  178. return false
  179. }
  180. let selectors = [NSSelectorFromString("menuItemAction_NewFromFile:"),
  181. NSSelectorFromString("menuItemAction_Open:"),
  182. NSSelectorFromString("menuItemAction_NewFromWeb:"),
  183. NSSelectorFromString("menuItemAction_NewFromClipboard:"),
  184. NSSelectorFromString("menuItemAction_NewFromScanner:"),
  185. NSSelectorFromString("menuItemAction_NewFromBlankPage:"),
  186. NSSelectorFromString("menuItemAction_NewFromWindow:"),
  187. NSSelectorFromString("menuItemAction_MergePDFFiles:"),
  188. NSSelectorFromString("menuItemAction_closeDocument:"),
  189. NSSelectorFromString("menuItemAction_closeWindow:"),
  190. NSSelectorFromString("menuItemAction_closeAllWindows:"),
  191. NSSelectorFromString("menuItemClick_saveAsFlattenedPDF:"),
  192. NSSelectorFromString("menuItemClick_Compress:"),
  193. NSSelectorFromString("menuItemAction_ConvertTo:"),
  194. NSSelectorFromString("menuItemAction_addPassword:"),
  195. NSSelectorFromString("menuItemAction_removePassword:"),
  196. NSSelectorFromString("menuItemAction_unlockFunction:"),
  197. NSSelectorFromString("menuItemAction_searchPDF:"),
  198. NSSelectorFromString("menuItemAction_performFindPanelAction:"),
  199. NSSelectorFromString("menuItemAction_showInFinder:"),
  200. NSSelectorFromString("menuItemAction_property:"),
  201. NSSelectorFromString("menuItemAction_print:"),
  202. NSSelectorFromString("menuItemAction_customPrint:"),
  203. NSSelectorFromString("sharePageItemActionWithSender:")]
  204. if selectors.contains(selector) {
  205. return true
  206. }
  207. return false
  208. }
  209. func validateFileMenuItem(_ menuItem: NSMenuItem) -> Bool {
  210. let action = menuItem.action
  211. if action == NSSelectorFromString("menuItemAction_NewFromFile:") {
  212. return true
  213. } else if action == NSSelectorFromString("menuItemAction_NewFromWeb:") {
  214. return true
  215. } else if action == NSSelectorFromString("menuItemAction_NewFromClipboard:") {
  216. return true
  217. } else if action == NSSelectorFromString("menuItemAction_NewFromScanner:") {
  218. return true
  219. } else if action == NSSelectorFromString("menuItemAction_NewFromBlankPage:") {
  220. return true
  221. } else if action == NSSelectorFromString("menuItemAction_NewFromWindow:") {
  222. return true
  223. } else if action == NSSelectorFromString("menuItemAction_MergePDFFiles:") {
  224. return true
  225. } else if action == NSSelectorFromString("menuItemAction_closeDocument:") {
  226. return true
  227. } else if action == NSSelectorFromString("menuItemAction_closeWindow:") {
  228. return true
  229. } else if action == NSSelectorFromString("menuItemAction_closeAllWindows:") {
  230. return true
  231. } else if action == NSSelectorFromString("menuItemAction_Open:") {
  232. return true
  233. }
  234. if let mainVC = self.mainViewController() {
  235. if action == NSSelectorFromString("menuItemClick_saveAsFlattenedPDF:") {
  236. } else if action == NSSelectorFromString("menuItemClick_Compress:") {
  237. } else if action == NSSelectorFromString("menuItemAction_ConvertTo:") {
  238. } else if action == NSSelectorFromString("menuItemAction_addPassword:") {
  239. } else if action == NSSelectorFromString("menuItemAction_removePassword:") {
  240. if mainVC.listView.document.isLocked == true {
  241. return true
  242. } else {
  243. if let pw = mainVC.listView.document.password {
  244. return true
  245. }
  246. return false
  247. }
  248. } else if action == NSSelectorFromString("menuItemAction_unlockFunction:") {
  249. return mainVC.listView.document.isEncrypted
  250. } else if action == NSSelectorFromString("menuItemAction_searchPDF:") {
  251. } else if action == NSSelectorFromString("menuItemAction_performFindPanelAction:") {
  252. } else if action == NSSelectorFromString("menuItemAction_showInFinder:") {
  253. } else if action == NSSelectorFromString("menuItemAction_property:") {
  254. } else if action == NSSelectorFromString("menuItemAction_print:") {
  255. return mainVC.validPrint()
  256. } else if action == NSSelectorFromString("menuItemAction_customPrint:") {
  257. } else if action == NSSelectorFromString("sharePageItemActionWithSender:") {
  258. return true
  259. }
  260. return true
  261. }
  262. return false
  263. }
  264. //MARK: -IBAction
  265. @IBAction func menuItemAction_Open(_ sender: NSMenuItem) -> Void {
  266. if let _windowC = NSApp.mainWindow?.windowController as? KMBrowserWindowController {
  267. _windowC.newFromPDFFile()
  268. }
  269. }
  270. @IBAction func menuItemAction_NewFromFile(_ sender: NSMenuItem) -> Void {
  271. if let _windowC = NSApp.mainWindow?.windowController as? KMBrowserWindowController {
  272. _windowC.newFromFile()
  273. }
  274. }
  275. @IBAction func menuItemAction_NewFromWeb(_ sender: NSMenuItem) -> Void {
  276. if let _windowC = NSApp.mainWindow?.windowController as? KMBrowserWindowController {
  277. _windowC.newFromWebPage()
  278. }
  279. }
  280. @IBAction func menuItemAction_NewFromClipboard(_ sender: NSMenuItem) -> Void {
  281. if let _windowC = NSApp.mainWindow?.windowController as? KMBrowserWindowController {
  282. _windowC.newFromClipboard()
  283. }
  284. }
  285. @IBAction func menuItemAction_NewFromScanner(_ sender: NSMenuItem) -> Void {
  286. if let _windowC = NSApp.mainWindow?.windowController as? KMBrowserWindowController {
  287. _windowC.importFromScanner()
  288. }
  289. }
  290. @IBAction func menuItemAction_NewFromBlankPage(_ sender: NSMenuItem) -> Void {
  291. if let _windowC = NSApp.mainWindow?.windowController as? KMBrowserWindowController {
  292. _windowC.newBlankPage()
  293. }
  294. }
  295. @IBAction func menuItemAction_NewFromWindow(_ sender: NSMenuItem) -> Void {
  296. if sender.tag == 0 {
  297. if let _windowC = NSApp.mainWindow?.windowController as? KMBrowserWindowController {
  298. _windowC.screenShot_SelectArea(nil)
  299. }
  300. } else if sender.tag == 1 {
  301. if let _windowC = NSApp.mainWindow?.windowController as? KMBrowserWindowController {
  302. _windowC.screenShot_Window(nil)
  303. }
  304. } else if sender.tag == 2 {
  305. if let _windowC = NSApp.mainWindow?.windowController as? KMBrowserWindowController {
  306. _windowC.screenShot_FullScreen(nil)
  307. }
  308. }
  309. }
  310. @IBAction func menuItemAction_MergePDFFiles(_ sender: NSMenuItem) -> Void {
  311. if let homeVC = self.homeViewController() {
  312. homeVC.fastTool_MergePDF()
  313. } else if let mainVC = self.mainViewController() {
  314. mainVC.showMergeWindow()
  315. }
  316. }
  317. @IBAction func menuItemAction_closeDocument(_ sender: Any) {
  318. if ((NSApp.mainWindow?.windowController is KMBrowserWindowController) == false) {
  319. guard let windowControler = NSApp.mainWindow?.windowController else {
  320. return
  321. }
  322. windowControler.window?.performClose(nil)
  323. return
  324. }
  325. let windowControler = NSApp.mainWindow?.windowController as? KMBrowserWindowController
  326. if let data = windowControler?.browser, data.tabCount() >= 2 { // 有两个以上的标签
  327. if data.activeTabIndex() == 0 { // 主页不允许关闭,暂时处理为无反应
  328. return
  329. }
  330. }
  331. if let browser = windowControler?.browser {
  332. if browser.tabCount() == 1 {
  333. windowControler?.window?.close()
  334. } else {
  335. if let _ = windowControler?.window?.attachedSheet {
  336. NSSound.beep()
  337. return
  338. }
  339. browser.closeTab()
  340. }
  341. } else {
  342. windowControler?.window?.close()
  343. }
  344. }
  345. @IBAction func menuItemAction_closeWindow(_ sender: Any) {
  346. NSApp.mainWindow?.close()
  347. }
  348. @IBAction func menuItemAction_closeAllWindows(_ sender: Any) {
  349. for window in NSApp.windows {
  350. window.close()
  351. }
  352. }
  353. @IBAction func menuItemClick_saveAsFlattenedPDF(_ sender: Any) {
  354. if let mainVC = self.mainViewController() {
  355. mainVC.saveAsFlattenedPDFAction()
  356. }
  357. }
  358. @IBAction func menuItemClick_Compress(_ sender: Any) {
  359. if let mainVC = self.mainViewController() {
  360. let model = KMBatchProcessingTableViewModel.initWithFilePath(url: mainVC.listView.document.documentURL)
  361. model.password = mainVC.listView.document.password ?? ""
  362. mainVC.showCompressController(model: model)
  363. }
  364. }
  365. @IBAction func menuItemAction_ConvertTo(_ sender: NSMenuItem) {
  366. if let mainVC = self.mainViewController() {
  367. var convertType: KMPDFConvertType = .word
  368. if sender.tag == 0 {
  369. } else if sender.tag == 1 {
  370. convertType = .excel
  371. } else if sender.tag == 2 {
  372. convertType = .ppt
  373. } else if sender.tag == 30 {
  374. convertType = .jpeg
  375. } else if sender.tag == 31 {
  376. convertType = .jpg
  377. } else if sender.tag == 32 {
  378. convertType = .png
  379. } else if sender.tag == 33 {
  380. convertType = .gif
  381. } else if sender.tag == 34 {
  382. convertType = .tiff
  383. } else if sender.tag == 35 {
  384. convertType = .tga
  385. } else if sender.tag == 36 {
  386. convertType = .bmp
  387. } else if sender.tag == 37 {
  388. convertType = .jp2
  389. } else if sender.tag == 4 {
  390. convertType = .rtf
  391. } else if sender.tag == 5 {
  392. convertType = .csv
  393. } else if sender.tag == 6 {
  394. convertType = .html
  395. } else if sender.tag == 7 {
  396. convertType = .text
  397. } else if sender.tag == 8 {
  398. convertType = .json
  399. }
  400. mainVC.showConvertWindow(convertType)
  401. }
  402. }
  403. @IBAction func menuItemAction_addPassword(_ sender: Any) {
  404. if let mainVC = self.mainViewController() {
  405. mainVC.showSecureWindow()
  406. }
  407. }
  408. @IBAction func menuItemAction_removePassword(_ sender: Any) {
  409. if let mainVC = self.mainViewController() {
  410. mainVC.showRemoveSecureWindow()
  411. }
  412. }
  413. @IBAction func menuItemAction_unlockFunction(_ sender: Any) {
  414. if let mainVC = self.mainViewController() {
  415. mainVC.unlockPDFDocument()
  416. }
  417. }
  418. @IBAction func menuItemAction_searchPDF(_ sender: Any?) {
  419. if let mainVC = self.mainViewController() {
  420. mainVC.searchPDF()
  421. }
  422. }
  423. @IBAction func menuItemAction_performFindPanelAction(_ sender: NSMenuItem) {
  424. if let mainVC = self.mainViewController() {
  425. if sender.tag == 0 {
  426. mainVC.find_ReplacePDF()
  427. } else if sender.tag == 1 {
  428. mainVC.fineNext()
  429. } else if sender.tag == 2 {
  430. mainVC.findPrevious()
  431. } else if sender.tag == 3 {
  432. mainVC.useSelectionForFind()
  433. }
  434. }
  435. }
  436. @IBAction func menuItemAction_showInFinder(_ sender: Any) {
  437. if let mainVC = self.mainViewController() {
  438. mainVC.showInFinder()
  439. }
  440. }
  441. @IBAction func menuItemAction_property(_ sender: Any) {
  442. if let mainVC = self.mainViewController() {
  443. KMInfoWindowController.shared.showWindow(sender)
  444. }
  445. }
  446. @IBAction func menuItemAction_print(_ sender: Any) {
  447. if let mainVC = self.mainViewController() {
  448. mainVC.showPrintWindow()
  449. }
  450. }
  451. @IBAction func menuItemAction_customPrint(_ sender: NSMenuItem) {
  452. if let mainVC = self.mainViewController() {
  453. if sender.tag == 0 {
  454. mainVC.showPosterPrintWindow()
  455. } else if sender.tag == 1 {
  456. mainVC.showMultiplePrintWindow()
  457. } else if sender.tag == 2 {
  458. mainVC.showBookletPrintWindow()
  459. }
  460. }
  461. }
  462. }
  463. // MARK: - Edit Menu
  464. extension AppDelegate {
  465. func isEditMenuActions(sel: Selector?) -> Bool {
  466. guard let selector = sel else {
  467. return false
  468. }
  469. let selectors = [ NSSelectorFromString("menuItemAction_PasteAndMatch:"),
  470. NSSelectorFromString("menuItemAction_ShowFont:"),
  471. NSSelectorFromString("menuItemAction_FontAction:"),
  472. NSSelectorFromString("menuItemAction_CustomFont:"),
  473. NSSelectorFromString("menuItemAction_FontAlign:")]
  474. if selectors.contains(selector) {
  475. return true
  476. }
  477. return false
  478. }
  479. func validateEditMenuItem(_ menuItem: NSMenuItem) -> Bool {
  480. let action = menuItem.action
  481. if let mainVC = self.mainViewController() {
  482. if action == NSSelectorFromString("menuItemAction_PasteAndMatch:") {
  483. } else if action == NSSelectorFromString("menuItemAction_ShowFont:") {
  484. if mainVC.viewManager.toolMode == .Edit {
  485. if mainVC.viewManager.subToolMode == .None || mainVC.viewManager.subToolMode == .Edit_text {
  486. if mainVC.listView.km_editingTextAreas().count > 0 {
  487. return true
  488. }
  489. }
  490. }
  491. return false
  492. } else if action == NSSelectorFromString("menuItemAction_FontAction:") {
  493. if mainVC.viewManager.toolMode == .Edit {
  494. if mainVC.viewManager.subToolMode == .None || mainVC.viewManager.subToolMode == .Edit_text {
  495. if mainVC.listView.km_editingTextAreas().count > 0 {
  496. return true
  497. }
  498. }
  499. }
  500. return false
  501. } else if action == NSSelectorFromString("menuItemAction_CustomFont:") {
  502. if mainVC.viewManager.toolMode == .Edit {
  503. if mainVC.viewManager.subToolMode == .None || mainVC.viewManager.subToolMode == .Edit_text {
  504. if mainVC.listView.km_editingTextAreas().count > 0 {
  505. return true
  506. }
  507. }
  508. }
  509. return false
  510. } else if action == NSSelectorFromString("menuItemAction_FontAlign:") {
  511. if mainVC.viewManager.toolMode == .Edit {
  512. if mainVC.viewManager.subToolMode == .None || mainVC.viewManager.subToolMode == .Edit_text {
  513. if mainVC.listView.km_editingTextAreas().count > 0 {
  514. return true
  515. }
  516. }
  517. }
  518. return false
  519. }
  520. return true
  521. }
  522. return false
  523. }
  524. //MARK: -IBAction
  525. @IBAction func menuItemAction_PasteAndMatch(_ menuItem: NSMenuItem) {
  526. }
  527. @IBAction func menuItemAction_ShowFont(_ menuItem: NSMenuItem) {
  528. if let mainVC = self.mainViewController() {
  529. mainVC.menuItemAction_FontPanel()
  530. }
  531. }
  532. @IBAction func menuItemAction_FontAction(_ menuItem: NSMenuItem) {
  533. if let mainVC = self.mainViewController() {
  534. mainVC.menuItemAction_FontAction(menuItem.tag)
  535. }
  536. }
  537. @IBAction func menuItemAction_CustomFont(_ menuItem: NSMenuItem) {
  538. if let mainVC = self.mainViewController() {
  539. mainVC.menuItemAction_CustomFont(menuItem.tag)
  540. }
  541. }
  542. @IBAction func menuItemAction_FontAlign(_ menuItem: NSMenuItem) {
  543. if let mainVC = self.mainViewController() {
  544. mainVC.menuItemAction_FontAlign(menuItem.tag)
  545. }
  546. }
  547. }
  548. // MARK: - View Menu
  549. extension AppDelegate {
  550. func isViewMenuActions(sel: Selector?) -> Bool {
  551. guard let selector = sel else {
  552. return false
  553. }
  554. let selectors = [NSSelectorFromString("menuItemAction_ChangeDisplayMode:"),
  555. NSSelectorFromString("menuItemAction_ReadMode:"),
  556. NSSelectorFromString("menuItemAction_FullScreen:"),
  557. NSSelectorFromString("menuItemAction_Presentation:"),
  558. NSSelectorFromString("menuItemAction_SplitView:"),
  559. NSSelectorFromString("menuItemAction_BOTAMode:"),
  560. NSSelectorFromString("menuItemAction_Outline:"),
  561. NSSelectorFromString("menuItemAction_Notes:"),
  562. NSSelectorFromString("menuItemAction_Annotate:"),
  563. NSSelectorFromString("menuItemAction_Themes:"),
  564. NSSelectorFromString("menuItemAction_Zoom:"),
  565. NSSelectorFromString("menuItemAction_Rotate:"),
  566. NSSelectorFromString("menuItemAction_HighlightFormsField:"),
  567. NSSelectorFromString("menuItemAction_HighlightLinks:"),
  568. NSSelectorFromString("menuItemAction_ResetForm:"),
  569. NSSelectorFromString("menuItemAction_AutoScroll:")]
  570. if selectors.contains(selector) {
  571. return true
  572. }
  573. return false
  574. }
  575. func validateViewMenuItem(_ menuItem: NSMenuItem) -> Bool {
  576. let action = menuItem.action
  577. if let mainVC = self.mainViewController() {
  578. if action == NSSelectorFromString("menuItemAction_ChangeDisplayMode:") {
  579. menuItem.state = .off
  580. if menuItem.tag == 1 && mainVC.getPDFViewPageLayoutType() == .singlePage {
  581. menuItem.state = .on
  582. } else if menuItem.tag == 2 && mainVC.getPDFViewPageLayoutType() == .singlePageContinue {
  583. menuItem.state = .on
  584. } else if menuItem.tag == 3 && mainVC.getPDFViewPageLayoutType() == .twoPage {
  585. menuItem.state = .on
  586. } else if menuItem.tag == 4 && mainVC.getPDFViewPageLayoutType() == .twoPageContinue {
  587. menuItem.state = .on
  588. } else if menuItem.tag == 5 && mainVC.getPDFViewPageLayoutType() == .bookMode {
  589. menuItem.state = .on
  590. }
  591. } else if action == NSSelectorFromString("menuItemAction_ReadMode:") {
  592. menuItem.state = .off
  593. if mainVC.viewManager.isPDFReadMode == true {
  594. menuItem.state = .on
  595. }
  596. } else if action == NSSelectorFromString("menuItemAction_FullScreen:") {
  597. menuItem.state = .off
  598. if mainVC.view.window?.isFullScreen() == true {
  599. menuItem.state = .on
  600. }
  601. } else if action == NSSelectorFromString("menuItemAction_Presentation:") {
  602. } else if action == NSSelectorFromString("menuItemAction_SplitView:") {
  603. menuItem.state = .off
  604. if menuItem.tag == 0 && mainVC.listView.viewSplitMode == .vertical {
  605. menuItem.state = .on
  606. } else if menuItem.tag == 1 && mainVC.listView.viewSplitMode == .horizontal {
  607. menuItem.state = .on
  608. } else if menuItem.tag == 2 && mainVC.listView.viewSplitMode == .disable {
  609. menuItem.state = .on
  610. }
  611. } else if action == NSSelectorFromString("menuItemAction_BOTAMode:") {
  612. menuItem.state = .off
  613. if menuItem.tag == 0 && mainVC.viewManager.pdfSideBarType == .thumbnail {
  614. menuItem.state = .on
  615. } else if menuItem.tag == 1 && mainVC.viewManager.pdfSideBarType == .outline {
  616. menuItem.state = .on
  617. } else if menuItem.tag == 2 && mainVC.viewManager.pdfSideBarType == .bookmark {
  618. menuItem.state = .on
  619. } else if menuItem.tag == 3 && mainVC.viewManager.pdfSideBarType == .annotation {
  620. menuItem.state = .on
  621. }
  622. } else if action == NSSelectorFromString("menuItemAction_Themes:") {
  623. menuItem.state = .off
  624. if menuItem.tag == 0 && mainVC.listView.displayMode == .normal {
  625. menuItem.state = .on
  626. } else if menuItem.tag == 1 && mainVC.listView.displayMode == .soft {
  627. menuItem.state = .on
  628. } else if menuItem.tag == 2 && mainVC.listView.displayMode == .green {
  629. menuItem.state = .on
  630. } else if menuItem.tag == 3 && mainVC.listView.displayMode == .night {
  631. menuItem.state = .on
  632. }
  633. } else if action == NSSelectorFromString("menuItemAction_Zoom:") {
  634. } else if action == NSSelectorFromString("menuItemAction_Rotate:") {
  635. } else if action == NSSelectorFromString("menuItemAction_HighlightFormsField:") {
  636. let enabled = CPDFKitConfig.sharedInstance().enableFormFieldHighlight()
  637. menuItem.state = enabled ? .on : .off
  638. } else if action == NSSelectorFromString("menuItemAction_HighlightLinks:") {
  639. let enabled = CPDFKitConfig.sharedInstance().enableLinkFieldHighlight()
  640. menuItem.state = enabled ? .on : .off
  641. } else if action == NSSelectorFromString("menuItemAction_ResetForm:") {
  642. } else if action == NSSelectorFromString("menuItemAction_AutoScroll:") {
  643. menuItem.state = mainVC.isAutoFlowOn() ? .on : .off
  644. }
  645. return true
  646. }
  647. return false
  648. }
  649. //MARK: -IBAction
  650. @IBAction func menuItemAction_ChangeDisplayMode(_ sender: NSMenuItem) {
  651. if let mainVC = self.mainViewController() {
  652. if sender.tag == 1 {
  653. mainVC.updatePDFViewDisplayMode(viewMode: .singlePage)
  654. } else if sender.tag == 2 {
  655. mainVC.updatePDFViewDisplayMode(viewMode: .singlePageContinuous)
  656. } else if sender.tag == 3 {
  657. mainVC.updatePDFViewDisplayMode(viewMode: .twoUp)
  658. } else if sender.tag == 4 {
  659. mainVC.updatePDFViewDisplayMode(viewMode: .twoUpContinuous)
  660. } else if sender.tag == 5 {
  661. mainVC.updatePDFViewDisplayMode(isbookMode: true)
  662. }
  663. }
  664. }
  665. @IBAction func menuItemAction_ReadMode(_ sender: NSMenuItem) {
  666. if let mainVC = self.mainViewController() {
  667. mainVC.viewManager.isPDFReadMode = !mainVC.viewManager.isPDFReadMode
  668. if mainVC.viewManager.isPDFReadMode {
  669. mainVC.openPDFReadMode()
  670. } else {
  671. mainVC.exitPDFReadMode()
  672. }
  673. }
  674. }
  675. @IBAction func menuItemAction_FullScreen(_ sender: NSMenuItem) {
  676. if let mainVC = self.mainViewController() {
  677. mainVC.view.window?.toggleFullScreen(nil)
  678. }
  679. }
  680. @IBAction func menuItemAction_Presentation(_ sender: NSMenuItem) {
  681. if let mainVC = self.mainViewController() {
  682. mainVC.togglePresentation(nil)
  683. }
  684. }
  685. @IBAction func menuItemAction_SplitView(_ sender: NSMenuItem) {
  686. if let mainVC = self.mainViewController() {
  687. if sender.tag == 0 {
  688. mainVC.listView.viewSplitMode = .vertical
  689. } else if sender.tag == 1 {
  690. mainVC.listView.viewSplitMode = .horizontal
  691. } else if sender.tag == 2 {
  692. mainVC.listView.viewSplitMode = .disable
  693. }
  694. mainVC.reloadPDFSplitInfo()
  695. }
  696. }
  697. @IBAction func menuItemAction_BOTAMode(_ sender: NSMenuItem) {
  698. if let mainVC = self.mainViewController() {
  699. if sender.tag == 0 {
  700. if mainVC.viewManager.pdfSideBarType == .thumbnail {
  701. mainVC.viewManager.pdfSideBarType = .none
  702. } else {
  703. mainVC.viewManager.pdfSideBarType = .thumbnail
  704. }
  705. } else if sender.tag == 1 {
  706. if mainVC.viewManager.pdfSideBarType == .outline {
  707. mainVC.viewManager.pdfSideBarType = .none
  708. } else {
  709. mainVC.viewManager.pdfSideBarType = .outline
  710. }
  711. } else if sender.tag == 2 {
  712. if mainVC.viewManager.pdfSideBarType == .bookmark {
  713. mainVC.viewManager.pdfSideBarType = .none
  714. } else {
  715. mainVC.viewManager.pdfSideBarType = .bookmark
  716. }
  717. } else if sender.tag == 3 {
  718. if mainVC.viewManager.pdfSideBarType == .annotation {
  719. mainVC.viewManager.pdfSideBarType = .none
  720. } else {
  721. mainVC.viewManager.pdfSideBarType = .annotation
  722. }
  723. }
  724. if mainVC.viewManager.pdfSideBarType == .none {
  725. mainVC.toggleCloseLeftSide()
  726. } else {
  727. mainVC.toggleOpenLeftSide(pdfSideBarType: mainVC.viewManager.pdfSideBarType)
  728. }
  729. mainVC.reloadSideBar()
  730. }
  731. }
  732. @IBAction func menuItemAction_Themes(_ sender: NSMenuItem) {
  733. if let mainVC = self.mainViewController() {
  734. var model: KMPDFViewMode = .normal
  735. var color = NSColor.clear
  736. if sender.tag == 0 {
  737. model = .normal
  738. } else if sender.tag == 1 {
  739. model = .soft
  740. } else if sender.tag == 2 {
  741. model = .green
  742. } else if sender.tag == 3 {
  743. model = .night
  744. } else {
  745. model = .other
  746. }
  747. mainVC.listView.setPageBackgroundColorWith(color, viewMode: model)
  748. mainVC.updatePDFDisplaySettingView()
  749. }
  750. }
  751. @IBAction func menuItemAction_Zoom(_ sender: NSMenuItem) {
  752. if let mainVC = self.mainViewController() {
  753. var type: KMPDFZoomType = .width
  754. if sender.tag == 0 {
  755. type = .width
  756. } else if sender.tag == 1 {
  757. type = .fit
  758. } else if sender.tag == 2 {
  759. type = .actualSize
  760. } else if sender.tag == 3 {
  761. type = .zoom_In
  762. } else if sender.tag == 4 {
  763. type = .zoom_Out
  764. }
  765. mainVC.selectZoom(type)
  766. }
  767. }
  768. @IBAction func menuItemAction_Rotate(_ sender: NSMenuItem) {
  769. if let mainVC = self.mainViewController() {
  770. if sender.tag == 0 {
  771. mainVC.rotateLeft(page: mainVC.listView.currentPage(), listView: mainVC.listView)
  772. } else if sender.tag == 1 {
  773. mainVC.rotateRight(page: mainVC.listView.currentPage(), listView: mainVC.listView)
  774. }
  775. }
  776. }
  777. @IBAction func menuItemAction_HighlightFormsField(_ sender: NSMenuItem) {
  778. if let mainVC = self.mainViewController() {
  779. let enabled = CPDFKitConfig.sharedInstance().enableFormFieldHighlight()
  780. CPDFKitConfig.sharedInstance().setEnableFormFieldHighlight(!enabled)
  781. mainVC.listView.setNeedsDisplayForVisiblePages()
  782. mainVC.alertTipViewController.reloadFormAlertUI()
  783. }
  784. }
  785. @IBAction func menuItemAction_HighlightLinks(_ sender: NSMenuItem) {
  786. if let mainVC = self.mainViewController() {
  787. let enabled = CPDFKitConfig.sharedInstance().enableLinkFieldHighlight()
  788. CPDFAnnotation.updateLinkFieldHighlight(mainVC.listView, linkFieldHighlight: !enabled)
  789. }
  790. }
  791. @IBAction func menuItemAction_ResetForm(_ sender: NSMenuItem) {
  792. if let mainVC = self.mainViewController() {
  793. mainVC.listView.resetFormAnnotation()
  794. }
  795. }
  796. @IBAction func menuItemAction_AutoScroll(_ sender: NSMenuItem) {
  797. if let mainVC = self.mainViewController() {
  798. mainVC.toggleAutoFlow(nil)
  799. }
  800. }
  801. }
  802. // MARK: - Go Menu
  803. extension AppDelegate {
  804. func isGoMenuActions(sel: Selector?) -> Bool {
  805. guard let selector = sel else {
  806. return false
  807. }
  808. let selectors = [NSSelectorFromString("menuItemAction_Next:"),
  809. NSSelectorFromString("menuItemAction_Previous:"),
  810. NSSelectorFromString("menuItemAction_First:"),
  811. NSSelectorFromString("menuItemAction_Last:"),
  812. NSSelectorFromString("menuItemAction_GotoPage:"),
  813. NSSelectorFromString("menuItemAction_Back:"),
  814. NSSelectorFromString("menuItemAction_Forward:")]
  815. if selectors.contains(selector) {
  816. return true
  817. }
  818. return false
  819. }
  820. func validateGoMenuItem(_ menuItem: NSMenuItem) -> Bool {
  821. let action = menuItem.action
  822. if let mainVC = self.mainViewController() {
  823. if action == NSSelectorFromString("menuItemAction_Next:") {
  824. if mainVC.listView.isEditing() && mainVC.listView.isEditable() {
  825. return false
  826. }
  827. return (mainVC.pdfViewCanHorizontalScroll() == false && mainVC.listView.canGoToNextPage())
  828. } else if action == NSSelectorFromString("menuItemAction_Previous:") {
  829. if mainVC.listView.isEditing() && mainVC.listView.isEditable() {
  830. return false
  831. }
  832. return (mainVC.pdfViewCanHorizontalScroll() == false && mainVC.listView.canGoToPreviousPage())
  833. } else if action == NSSelectorFromString("menuItemAction_First:") {
  834. return mainVC.listView.canGoToFirstPage()
  835. } else if action == NSSelectorFromString("menuItemAction_Last:") {
  836. return mainVC.listView.canGoToLastPage()
  837. } else if action == NSSelectorFromString("menuItemAction_GotoPage:") {
  838. return true
  839. } else if action == NSSelectorFromString("menuItemAction_Back:") {
  840. return mainVC.listView.km_canGoBack()
  841. } else if action == NSSelectorFromString("menuItemAction_Forward:") {
  842. return mainVC.listView.km_canGoForward()
  843. }
  844. }
  845. return false
  846. }
  847. //MARK: -IBAction
  848. @IBAction func menuItemAction_Next(_ sender: NSMenuItem) {
  849. if let mainVC = self.mainViewController() {
  850. if (mainVC.listView.canGoToNextPage()) {
  851. mainVC.listView.goToNextPage(nil)
  852. }
  853. }
  854. }
  855. @IBAction func menuItemAction_Previous(_ sender: NSMenuItem) {
  856. if let mainVC = self.mainViewController() {
  857. if (mainVC.listView.canGoToPreviousPage()) {
  858. mainVC.listView.goToPreviousPage(nil)
  859. }
  860. }
  861. }
  862. @IBAction func menuItemAction_First(_ sender: NSMenuItem) {
  863. if let mainVC = self.mainViewController() {
  864. mainVC.listView.goToFirstPage(nil)
  865. }
  866. }
  867. @IBAction func menuItemAction_Last(_ sender: NSMenuItem) {
  868. if let mainVC = self.mainViewController() {
  869. mainVC.listView.goToLastPage(nil)
  870. }
  871. }
  872. @IBAction func menuItemAction_GotoPage(_ sender: NSMenuItem) {
  873. if let mainVC = self.mainViewController() {
  874. mainVC.gotoPage(nil)
  875. }
  876. }
  877. @IBAction func menuItemAction_Back(_ sender: NSMenuItem) {
  878. if let mainVC = self.mainViewController() {
  879. if (mainVC.listView.km_canGoBack()) {
  880. mainVC.listView.km_goBack(nil)
  881. }
  882. }
  883. }
  884. @IBAction func menuItemAction_Forward(_ sender: NSMenuItem) {
  885. if let mainVC = self.mainViewController() {
  886. if (mainVC.listView.km_canGoForward()) {
  887. mainVC.listView.km_goForward(nil)
  888. }
  889. }
  890. }
  891. }
  892. // MARK: - Window Menu
  893. extension AppDelegate {
  894. func isWindowMenuActions(sel: Selector?) -> Bool {
  895. guard let selector = sel else {
  896. return false
  897. }
  898. var selectors = [NSSelectorFromString("menuItemAction_showForwardTagPage:"),
  899. NSSelectorFromString("menuItemAction_showNextTagPage:"),
  900. NSSelectorFromString("menuItemAction_mergeAllWindow:")]
  901. if selectors.contains(selector) {
  902. return true
  903. }
  904. return false
  905. }
  906. func validateWindowMenuItem(_ menuItem: NSMenuItem) -> Bool {
  907. let action = menuItem.action
  908. if let browser = self.currentKMBrowser() {
  909. if action == NSSelectorFromString("menuItemAction_showForwardTagPage:") {
  910. menuItem.keyEquivalent = "\t"
  911. menuItem.keyEquivalentModifierMask = [.shift, .control]
  912. return browser.canSelectPreviousTab()
  913. } else if action == NSSelectorFromString("menuItemAction_showNextTagPage:") {
  914. return browser.canSelectNextTab()
  915. }
  916. }
  917. if let browserWC = self.currentBrowserWindowController() {
  918. if action == NSSelectorFromString("menuItemAction_mergeAllWindow:") {
  919. return browserWC.canMergeAllWindow()
  920. }
  921. }
  922. return true
  923. }
  924. //MARK: -IBAction
  925. @IBAction func menuItemAction_showForwardTagPage(_ sender: NSMenuItem) -> Void {
  926. if let browser = self.currentKMBrowser() {
  927. browser.selectPreviousTab()
  928. }
  929. }
  930. @IBAction func menuItemAction_showNextTagPage(_ sender: NSMenuItem) -> Void {
  931. if let browser = self.currentKMBrowser() {
  932. browser.selectNextTab()
  933. }
  934. }
  935. @IBAction func menuItemAction_mergeAllWindow(_ sender: NSMenuItem) -> Void {
  936. if let browserWC = self.currentBrowserWindowController() {
  937. browserWC.mergeAllWindow(sender)
  938. }
  939. }
  940. }
  941. // MARK: - help Menu
  942. extension AppDelegate {
  943. func isHelpMenuActions(sel: Selector?) -> Bool {
  944. guard let selector = sel else {
  945. return false
  946. }
  947. var selectors = [NSSelectorFromString("menuItemAction_APPWebSite:"),
  948. NSSelectorFromString("menuItemAction_quickStudy:"),
  949. NSSelectorFromString("menuItemAction_OnlineHelp:"),
  950. NSSelectorFromString("menuItemAction_Feedback:"),
  951. NSSelectorFromString("menuItemAction_FiveStar:"),
  952. NSSelectorFromString("menuItemAction_SubscribeUs:"),
  953. NSSelectorFromString("menuItemAction_CheckForUpdate:"),
  954. NSSelectorFromString("menuItemAction_VPP:"),
  955. NSSelectorFromString("menuItemAction_FreeTemplate:"),
  956. NSSelectorFromString("menuItemAction_MoreProducts:"),
  957. NSSelectorFromString("menuItemAction_PowerBy:"),
  958. NSSelectorFromString("menuItemAction_privacyPolicy:"),
  959. NSSelectorFromString("menuItemAction_TermsofService:")]
  960. if selectors.contains(selector) {
  961. return true
  962. }
  963. return false
  964. }
  965. func validateHelpMenuItem(_ menuItem: NSMenuItem) -> Bool {
  966. return true
  967. }
  968. //MARK: -IBAction
  969. @IBAction func menuItemAction_APPWebSite(_ sender: NSMenuItem) -> Void {
  970. KMTools.openURL(urlString: APPMain_Link)
  971. }
  972. @IBAction func menuItemAction_quickStudy(_ sender: NSMenuItem) -> Void {
  973. KMTools.openQuickStartStudy()
  974. }
  975. @IBAction func menuItemAction_OnlineHelp(_ sender: NSMenuItem) -> Void {
  976. KMTools.openFAQWebsite()
  977. }
  978. @IBAction func menuItemAction_Feedback(_ sender: NSMenuItem) -> Void {
  979. let help = KMUserFeekbackHanddler()
  980. help.showFeekbackWindow(with: KMLocalizedString("Feedback", comment: ""))
  981. }
  982. @IBAction func menuItemAction_FiveStar(_ sender: NSMenuItem) -> Void {
  983. KMTools.rateUs()
  984. }
  985. @IBAction func menuItemAction_SubscribeUs(_ sender: NSMenuItem) -> Void {
  986. KMEmailSubWindowController().showWindow(nil)
  987. }
  988. @IBAction func menuItemAction_CheckForUpdate(_ sender: NSMenuItem) -> Void {
  989. #if VERSION_DMG
  990. SUUpdater.shared().checkForUpdates(sender)
  991. #endif
  992. }
  993. @IBAction func menuItemAction_VPP(_ sender: NSMenuItem) -> Void {
  994. KMTools.openVPPWebSite()
  995. }
  996. @IBAction func menuItemAction_FreeTemplate(_ sender: NSMenuItem) -> Void {
  997. KMTools.openFreePDFTemplatesWebsite()
  998. }
  999. @IBAction func menuItemAction_MoreProducts(_ sender: NSMenuItem) -> Void {
  1000. KMTools.openMoreProductWebsite()
  1001. }
  1002. @IBAction func menuItemAction_PowerBy(_ sender: NSMenuItem) -> Void {
  1003. KMTools.openComPDFKitPowerWebsite()
  1004. }
  1005. @IBAction func menuItemAction_privacyPolicy(_ sender: NSMenuItem) -> Void {
  1006. KMTools.openPrivacyPolicyWebSite()
  1007. }
  1008. @IBAction func menuItemAction_TermsofService(_ sender: NSMenuItem) -> Void {
  1009. KMTools.openTermOfServiceWebSite()
  1010. }
  1011. }