KMPDFViewController.swift 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567
  1. //
  2. // KMPDFViewController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by Niehaoyu on 2024/10/18.
  6. //
  7. import Cocoa
  8. class KMPDFViewController: NSViewController {
  9. @IBOutlet var contendBox: NSBox!
  10. @IBOutlet var toolbarBox: NSBox! //工具栏Box
  11. @IBOutlet var bottomContendBox: NSBox! //
  12. @IBOutlet var sidebarBox: NSBox! //左侧边栏Box
  13. @IBOutlet var infoContendSplitView: KMPDFSplitView!
  14. @IBOutlet var infoSplitLeftView: NSView!
  15. @IBOutlet var infoSplitRightView: NSView!
  16. @IBOutlet var infoSplitCenterView: NSView!
  17. @IBOutlet var pdfSplitView: NSSplitView!
  18. @IBOutlet var pdfSplitTopView: NSView!
  19. @IBOutlet var pdfSplitBottomView: NSView!
  20. @IBOutlet var toolbarBoxHeightConst: NSLayoutConstraint!
  21. @IBOutlet var infoSplitViewLeftConst: NSLayoutConstraint!
  22. var viewManager: KMPDFViewManager = KMPDFViewManager.init()
  23. var toolbarManager: KMPDFToolbarManager = KMPDFToolbarManager.init()
  24. var pdfView: CPDFListView!
  25. var document: CPDFDocument?
  26. var myDocument: NSDocument?
  27. var insertDocuments: Set<CPDFDocument> = [] //插入新文档时,SDK会出现崩溃,临时记录
  28. //工具栏
  29. private var pdfToolbarController: KMPDFToolbarController?
  30. //BOTA SideBar
  31. private var sideBarController: KMPDFSideBarController?
  32. //页面编辑
  33. private var pageEditViewController: KMNPageEditViewController?
  34. //DisplaySetting
  35. private var displaySettingController: KMNDisplayViewController?
  36. private var splitPDFController: KMSplitPDFViewController?
  37. override func viewDidLoad() {
  38. super.viewDidLoad()
  39. // Do view setup here.
  40. toolbarManager.pdfViewManager = viewManager
  41. }
  42. override func viewDidAppear() {
  43. super.viewDidAppear()
  44. setupUI()
  45. }
  46. func setupUI() {
  47. initPDFView()
  48. initToolbar()
  49. initSideBar()
  50. setUpSplitView()
  51. }
  52. //MARK: - PDFView
  53. func initPDFView() {
  54. if pdfView == nil {
  55. pdfView = CPDFListView.init(frame: CGRectMake(0, 0, 100, 100))
  56. pdfView?.autoresizingMask = [.width, .height]
  57. }
  58. pdfView.document = self.document
  59. pdfView.delegate = self
  60. pdfView.pdfListViewDelegate = self
  61. reloadPDFSplitInfo()
  62. }
  63. //MARK: - SplitView
  64. func setUpSplitView() {
  65. infoContendSplitView.wantsLayer = true
  66. infoContendSplitView.layer?.backgroundColor = NSColor.clear.cgColor
  67. infoContendSplitView.delegate = self
  68. infoContendSplitView.layer?.masksToBounds = true
  69. infoContendSplitView.setPosition(-10, ofDividerAt: 0)
  70. infoContendSplitView.setPosition(CGRectGetWidth(infoContendSplitView.frame), ofDividerAt: 1)
  71. }
  72. func setupSplitPDFController() {
  73. if splitPDFController == nil {
  74. splitPDFController = KMSplitPDFViewController.init()
  75. }
  76. splitPDFController?.view.frame = pdfSplitBottomView.bounds
  77. splitPDFController?.view.autoresizingMask = [.height, .width]
  78. splitPDFController?.viewManager = self.viewManager
  79. splitPDFController?.delegate = self
  80. pdfSplitBottomView.addSubview(splitPDFController!.view)
  81. }
  82. //MARK: - 工具栏
  83. func initToolbar() {
  84. toolbarBox.borderWidth = 0
  85. if pdfToolbarController == nil {
  86. pdfToolbarController = KMPDFToolbarController.init()
  87. }
  88. pdfToolbarController?.view.frame = toolbarBox.bounds
  89. pdfToolbarController?.view.autoresizingMask = [.width, .height]
  90. pdfToolbarController?.delegate = self
  91. toolbarBox.contentView = pdfToolbarController?.view
  92. pdfToolbarController?.viewManager = viewManager
  93. pdfToolbarController?.toolbarManager = toolbarManager
  94. pdfToolbarController?.pdfView = pdfView
  95. pdfToolbarController?.setUpData()
  96. refreshToolbarView()
  97. }
  98. func refreshToolbarView() {
  99. let _manager = viewManager
  100. if _manager.toolMode == .Markup ||
  101. _manager.toolMode == .Edit ||
  102. _manager.toolMode == .Form ||
  103. _manager.toolMode == .Fill ||
  104. _manager.toolMode == .Convert ||
  105. _manager.toolMode == .Protect ||
  106. _manager.toolMode == .Tools {
  107. toolbarBoxHeightConst.constant = 80
  108. } else {
  109. if _manager.isPageEditMode {
  110. toolbarBoxHeightConst.constant = 80
  111. } else {
  112. toolbarBoxHeightConst.constant = 40
  113. }
  114. }
  115. }
  116. //MARK: - 侧边栏
  117. func initSideBar() {
  118. sidebarBox.borderWidth = 0
  119. if sideBarController == nil {
  120. sideBarController = KMPDFSideBarController.init()
  121. }
  122. sideBarController?.view.frame = sidebarBox.bounds
  123. sideBarController?.view.autoresizingMask = [.width, .height]
  124. sidebarBox.contentView = sideBarController?.view
  125. sideBarController?.pdfView = pdfView
  126. sideBarController?.delegate = self
  127. sideBarController?.pdfViewManager = viewManager
  128. sideBarController?.reloadData()
  129. }
  130. //MARK: - PDFDisplayView
  131. func updatePDFDisplaySettingView() {
  132. if viewManager.showDisplayView {
  133. infoSplitViewLeftConst.constant = 264
  134. } else {
  135. infoSplitViewLeftConst.constant = 44
  136. }
  137. if viewManager.showDisplayView {
  138. if displaySettingController == nil {
  139. displaySettingController = KMNDisplayViewController.init()
  140. }
  141. displaySettingController?.view.frame = CGRectMake(0, 0, 264, CGRectGetHeight(bottomContendBox.frame))
  142. displaySettingController?.view.autoresizingMask = [.height, .maxXMargin]
  143. bottomContendBox.addSubview(displaySettingController!.view)
  144. displaySettingController?.pdfView = self.pdfView
  145. displaySettingController?.viewManager = self.viewManager
  146. displaySettingController?.delegate = self
  147. displaySettingController?.reloadData()
  148. } else {
  149. displaySettingController?.view.removeFromSuperview()
  150. displaySettingController = nil
  151. }
  152. }
  153. //MARK: - 页面编辑
  154. func enterPageEditMode() {
  155. pageEditViewController = KMNPageEditViewController(self.document)
  156. if(pageEditViewController != nil) {
  157. bottomContendBox.addSubview(pageEditViewController!.view)
  158. pageEditViewController?.view.frame = bottomContendBox.bounds
  159. pageEditViewController?.thumbnailBaseViewDelegate = self
  160. pageEditViewController?.view.autoresizingMask = [.width,.height]
  161. }
  162. }
  163. func exitPageEditMode() {
  164. if pageEditViewController != nil {
  165. pageEditViewController?.view.removeFromSuperview()
  166. pageEditViewController = nil
  167. }
  168. }
  169. //MARK: - 阅读模式
  170. func openPDFReadMode() {
  171. if viewManager.showDisplayView {
  172. viewManager.showDisplayView = false
  173. pdfToolbarController?.reloadLeftIconView()
  174. updatePDFDisplaySettingView()
  175. }
  176. infoSplitViewLeftConst.constant = 0
  177. toolbarBoxHeightConst.constant = 0
  178. }
  179. func exitPDFReadMode() {
  180. viewManager.isPDFReadMode = false
  181. infoSplitViewLeftConst.constant = 44
  182. refreshToolbarView()
  183. }
  184. //MARK: - PPT
  185. //MARK: - PDF分割
  186. func reloadPDFSplitInfo() {
  187. if pdfView?.viewSplitMode == .disable {
  188. pdfSplitView.isHidden = true
  189. pdfView.frame = infoSplitCenterView.bounds
  190. infoSplitCenterView.addSubview(pdfView)
  191. if splitPDFController != nil {
  192. splitPDFController = nil
  193. }
  194. } else {
  195. pdfSplitView.isHidden = false
  196. pdfView.frame = pdfSplitTopView.bounds
  197. pdfSplitTopView.addSubview(pdfView)
  198. setupSplitPDFController()
  199. if pdfView.viewSplitMode == .horizontal {
  200. pdfSplitView.isVertical = true
  201. } else if pdfView.viewSplitMode == .vertical {
  202. pdfSplitView.isVertical = false
  203. }
  204. }
  205. }
  206. }
  207. //MARK: - NSSplitViewDelegate
  208. extension KMPDFViewController: NSSplitViewDelegate {
  209. func splitView(_ splitView: NSSplitView, shouldHideDividerAt dividerIndex: Int) -> Bool {
  210. return true
  211. }
  212. func splitView(_ splitView: NSSplitView, canCollapseSubview subview: NSView) -> Bool {
  213. return true
  214. }
  215. func splitView(_ splitView: NSSplitView, constrainSplitPosition proposedPosition: CGFloat, ofSubviewAt dividerIndex: Int) -> CGFloat {
  216. if dividerIndex == 0 {
  217. if proposedPosition > CGRectGetWidth(infoContendSplitView.frame)/2 - 10 {
  218. print(CGRectGetWidth(infoContendSplitView.frame)/2 - 10, NSDate())
  219. return CGRectGetWidth(infoContendSplitView.frame)/2 - 10
  220. }
  221. } else if dividerIndex == 1 {
  222. print(CGRectGetWidth(infoContendSplitView.frame)/2 - 10, NSDate())
  223. }
  224. return proposedPosition
  225. }
  226. func splitViewDidResizeSubviews(_ notification: Notification) {
  227. NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(splitViewResizeFinish), object: nil)
  228. self.perform(#selector(splitViewResizeFinish), with: nil, afterDelay: 0.15)
  229. }
  230. @objc func splitViewResizeFinish() {
  231. if infoContendSplitView.isSubviewCollapsed(infoSplitLeftView) {
  232. if viewManager.pdfSideBarType != .none {
  233. viewManager.pdfSideBarType = .none
  234. sideBarController?.reloadBOTAData()
  235. }
  236. }
  237. }
  238. }
  239. //MARK: - KMPDFSideBarControllerDelegate 左侧Sidebar代理
  240. extension KMPDFViewController: KMPDFSideBarControllerDelegate {
  241. func kmPDFSideBarControllerDidSidebarTypeUpdated(_ view: KMPDFSideBarController) {
  242. if viewManager.pdfSideBarType == .none {
  243. infoContendSplitView.setPosition(-20, ofDividerAt: 0)
  244. } else if viewManager.pdfSideBarType == .search {
  245. infoContendSplitView.setPosition(264, ofDividerAt: 0)
  246. } else if viewManager.pdfSideBarType == .thumbnail {
  247. infoContendSplitView.setPosition(264, ofDividerAt: 0)
  248. } else if viewManager.pdfSideBarType == .outline {
  249. infoContendSplitView.setPosition(264, ofDividerAt: 0)
  250. } else if viewManager.pdfSideBarType == .bookmark {
  251. infoContendSplitView.setPosition(264, ofDividerAt: 0)
  252. } else if viewManager.pdfSideBarType == .annotation {
  253. infoContendSplitView.setPosition(264, ofDividerAt: 0)
  254. }
  255. }
  256. func kmPDFSideBarControllerDidGotoPage(_ view: KMPDFSideBarController, _ pageIndex: Int) {
  257. pdfView.go(toPageIndex: pageIndex, animated: true)
  258. }
  259. }
  260. //MARK: - KMPDFToolbarControllerDelegate 工具栏代理
  261. extension KMPDFViewController: KMPDFToolbarControllerDelegate {
  262. func kmPDFToolbarControllerDidToolbarItemClicked(_ controller: KMPDFToolbarController, _ itemIdentifier: String) {
  263. print("toolbar点击", itemIdentifier)
  264. if itemIdentifier == KMPDFToolbar_ViewDisplay_Identifier {
  265. updatePDFDisplaySettingView()
  266. } else if itemIdentifier == KMPDFToolbar_PageEdit_Identifier {
  267. if viewManager.isPageEditMode == true {
  268. enterPageEditMode()
  269. } else {
  270. exitPageEditMode()
  271. }
  272. } else if itemIdentifier == KMPDFToolbar_convert_word_Identifier {
  273. let winC = KMConvertWordWindowController()
  274. let model = KMDocumentModel(url: self.pdfView.document.documentURL)
  275. winC.documentModel = model
  276. self.km_safe_beginSheet(windowC: winC)
  277. } else if itemIdentifier == KMPDFToolbar_PageEdit_InsertFile_Identifier {
  278. pageEditViewController?.insertFromPDFAction()
  279. } else if itemIdentifier == KMPDFToolbar_PageEdit_InsertBlank_Identifier {
  280. pageEditViewController?.insertFromBlankAction()
  281. } else if itemIdentifier == KMPDFToolbar_PageEdit_InsertClip_Identifier {
  282. pageEditViewController?.insertFromClipboardAction()
  283. } else if itemIdentifier == KMPDFToolbar_PageEdit_InsertScanner_Identifier {
  284. pageEditViewController?.insertFromScannerAction()
  285. } else if itemIdentifier == KMPDFToolbar_PageEdit_Extract_Identifier {
  286. pageEditViewController?.extractPDFAction()
  287. } else if itemIdentifier == KMPDFToolbar_PageEdit_Replace_Identifier {
  288. pageEditViewController?.replacePDFAction()
  289. } else if itemIdentifier == KMPDFToolbar_PageEdit_Split_Identifier {
  290. pageEditViewController?.splitPDFAction()
  291. } else if itemIdentifier == KMPDFToolbar_PageEdit_Reverse_Identifier {
  292. pageEditViewController?.reversePDFAction()
  293. } else if itemIdentifier == KMPDFToolbar_PageEdit_LeftRotate_Identifier {
  294. pageEditViewController?.rotatePageLeftAction()
  295. } else if itemIdentifier == KMPDFToolbar_PageEdit_RightRotate_Identifier{
  296. pageEditViewController?.rotatePageRightAction()
  297. } else if itemIdentifier == KMPDFToolbar_PageEdit_Delete_Identifier {
  298. pageEditViewController?.deletePageAction()
  299. } else if itemIdentifier == KMPDFToolbar_PageEdit_Reduce_Identifier {
  300. pageEditViewController?.zoomOutPageAction()
  301. } else if itemIdentifier == KMPDFToolbar_PageEdit_Increase_Identifier {
  302. pageEditViewController?.zoomInPageAction()
  303. }
  304. refreshToolbarView()
  305. }
  306. }
  307. //MARK: - KMNDisplayViewControllerDelegate代理
  308. extension KMPDFViewController: KMNDisplayViewControllerDelegate {
  309. //Display Mode
  310. func displayViewControllerDidDisplayModeChanged(_ controller: KMNDisplayViewController) {
  311. pdfView.layoutDocumentView()
  312. }
  313. //阅读模式
  314. func displayViewControllerDidReadModeUpdated(_ controller: KMNDisplayViewController) {
  315. if viewManager.isPDFReadMode {
  316. openPDFReadMode()
  317. } else {
  318. exitPDFReadMode()
  319. }
  320. }
  321. //PPT
  322. func displayViewControllerDidGotoSlideShow(_ controller: KMNDisplayViewController) {
  323. }
  324. //SplitView
  325. func displayViewControllerDidSplitModeChanged(_ controller: KMNDisplayViewController) {
  326. reloadPDFSplitInfo()
  327. }
  328. func displayViewControllerDidSplitFileChanged(_ controller: KMNDisplayViewController) {
  329. splitPDFController?.reloadData()
  330. }
  331. }
  332. //MARK: - KMSplitPDFViewControllerDelegate SplitPDFView
  333. extension KMPDFViewController: KMSplitPDFViewControllerDelegate {
  334. func splitPDFViewControllerDidUpdateFilePath(_ controller: KMSplitPDFViewController) {
  335. displaySettingController?.reloadData()
  336. }
  337. }
  338. //MARK: - CPDFViewDelegate PDFView代理
  339. extension KMPDFViewController: CPDFViewDelegate {
  340. func pdfViewDocumentDidLoaded(_ pdfView: CPDFView!) {
  341. sideBarController?.reloadPageTurnerData()
  342. }
  343. func pdfViewCurrentPageDidChanged(_ pdfView: CPDFView!) {
  344. sideBarController?.reloadPageTurnerData()
  345. }
  346. func pdfViewScaleDidChanged(_ pdfView: CPDFView!) {
  347. pdfToolbarController?.reloadSelectZoomView()
  348. }
  349. }
  350. extension KMPDFViewController: CPDFListViewDelegate {
  351. func pdfListViewKeyDownIsContinue(_ pdfListView: CPDFListView!, theEvent: NSEvent!) -> Bool {
  352. let command = theEvent.modifierFlags.contains(.command)
  353. let control = theEvent.modifierFlags.contains(.control)
  354. KMPrint(theEvent.keyCode)
  355. if pdfView.isEditing() {
  356. if control && theEvent.keyCode == 11 { // ctr + b
  357. return false
  358. } else if control && theEvent.keyCode == 34 { // ctr +i
  359. return false
  360. } else if theEvent.keyCode == 36 { // enter
  361. if pdfView.isCropMode {
  362. return false
  363. }
  364. }
  365. }
  366. if (theEvent.keyCode == 11 && command) { // command + B [添加书签]
  367. return false
  368. } else if (command && control && theEvent.keyCode == 14) { // command + control + E [注释 橡皮擦]
  369. return false
  370. } else if (theEvent.keyCode == 123) { // 向左
  371. if(self.pdfView.isEditing() && !self.pdfView.isSelecteditAreaNotEdit()) {
  372. return false
  373. } else {
  374. }
  375. } else if (theEvent.keyCode == 126) { // 向上
  376. if(self.pdfView.isEditing() && !self.pdfView.isSelecteditAreaNotEdit()) {
  377. return false
  378. } else {
  379. if (self.pdfView.isContinousScroll()) {
  380. return true
  381. }
  382. }
  383. } else if (theEvent.keyCode == 124) { // 向右
  384. if(self.pdfView.isEditing() && !self.pdfView.isSelecteditAreaNotEdit()) {
  385. return false
  386. } else {
  387. }
  388. } else if (theEvent.keyCode == 125) { // 向下
  389. if(self.pdfView.isEditing() && !self.pdfView.isSelecteditAreaNotEdit()) {
  390. return false
  391. } else {
  392. if (self.pdfView.isContinousScroll()) {
  393. return true
  394. }
  395. }
  396. } else if (theEvent.keyCode == 36) {
  397. if pdfView.annotationType == .addImage || pdfView.annotationType == .addText {
  398. if self.pdfView.isEditImage {
  399. }
  400. }
  401. }
  402. if theEvent.keyCode == 53 {
  403. //ESC
  404. if view.window?.styleMask.contains(.fullScreen) == true {
  405. view.window?.toggleFullScreen(nil)
  406. }
  407. //阅读模式
  408. if viewManager.isPDFReadMode {
  409. exitPDFReadMode()
  410. viewManager.isPDFReadMode = false
  411. return true
  412. }
  413. }
  414. return true
  415. }
  416. }
  417. //MARK: - KMNThumbnailBaseViewDelegate
  418. extension KMPDFViewController: KMNThumbnailBaseViewDelegate {
  419. func clickThumbnailViewControlle(pageEditVC:KMNThumbnailBaseViewController?,currentIndex:Int) {
  420. exitPageEditMode()
  421. viewManager.isPageEditMode = false
  422. pdfToolbarController?.reloadPageEditView()
  423. }
  424. func insertPDFThumbnailViewControlle(pageEditVC: KMNThumbnailBaseViewController?, pdfDocment: CPDFDocument?) {
  425. if(pdfDocment != nil) {
  426. insertDocuments.insert(pdfDocment!)
  427. }
  428. }
  429. }