KMMainViewController+UI.swift 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884
  1. //
  2. // KMMainViewController+UI.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by wanjun on 2022/12/15.
  6. //
  7. import Foundation
  8. extension KMMainViewController {
  9. func showChildToolbar(showToolbar:Bool) {
  10. if showToolbar == true && self.isReadMode == false {
  11. self.view.addSubview(self.childToolbarController.view)
  12. } else {
  13. self.childToolbarController.view.removeFromSuperview()
  14. }
  15. self.updateTopView()
  16. }
  17. private func updateTopView () {
  18. let frame = self.view.frame
  19. if self.childToolbarController.view.superview != nil {
  20. let toolbarFrame = self.childToolbarController.view.frame;
  21. self.childToolbarController.view.frame = CGRect(x: 0, y: (frame.size.height ?? 0)-toolbarFrame.size.height, width: frame.size.width ?? 0, height: toolbarFrame.size.height)
  22. self.childToolbarController.view.autoresizingMask = [.width,.minYMargin]
  23. self.toplayoutConstraint.constant = toolbarFrame.size.height
  24. } else {
  25. self.toplayoutConstraint.constant = 0
  26. }
  27. }
  28. //通知
  29. func preferenceDidChangeNotification(notification:Notification) {
  30. let info : [AnyHashable : Any] = notification.userInfo ?? [:]
  31. if info.keys.contains(KMPreference.viewZoomScaleTypeKey) {
  32. self.selectZoom(KMPreferenceManager.shared.viewZoomScaleType)
  33. }
  34. if notification.name.rawValue == "pdfViewDocumentDidLoaded" || info.keys.contains(KMPreference.viewPageDisplayTypeKey) {
  35. self.selectDisplay(display: KMPreferenceManager.shared.viewPageDisplayType)
  36. }
  37. if info.keys.contains(KMPreference.displayBackgroundNormalColorKey) || notification.name.rawValue == "pdfViewDocumentDidLoaded" {
  38. self.listView.backgroundColor = KMPreferenceManager.shared.displayBackgroundNormalColor
  39. self.listView.layoutDocumentView()
  40. }
  41. self.updatePageIndicatoreType()
  42. if (info.keys.contains(KMPreference.generalAuthorNameKey)) { // 作者名称
  43. CPDFKitConfig.sharedInstance().setAnnotationAuthor((info[KMPreference.generalAuthorNameKey] as! String))
  44. }
  45. if (info.keys.contains(KMPreference.highlightLinksKey)) {
  46. let hlLink = info[KMPreference.highlightLinksKey] as? Bool
  47. CPDFKitConfig.sharedInstance().setEnableLinkFieldHighlight(hlLink == nil ? false : hlLink!)
  48. self.listView.setNeedsDisplayForVisiblePages()
  49. }
  50. if (info.keys.contains(KMPreference.autoSaveKey) || info.keys.contains(KMPreference.autoSavePerNumberMinuteKey)) {
  51. self.autoSaveTimeStartOrStopIfNeed()
  52. }
  53. if info.keys.contains(KMPreference.thumbPageSizeKey) {
  54. self.leftSideViewController.refreshUIOfThumbnailIfNeed(preference: true)
  55. }
  56. if info.keys.contains(KMPreference.thumbSnapshotSizeKey) {
  57. self.leftSideViewController.refreshUIOfSnapshotIfNeed(preference: true)
  58. }
  59. if info.keys.contains(KMPreference.outlineFontSizeKey) {
  60. self.leftSideViewController.updateTableFont()
  61. }
  62. if info.keys.contains(KMPreference.greekThresholdKey) {
  63. let value = KMPreference.shared.greekThreshold.cgFloat
  64. self.listView.setGreekingThreshold(value)
  65. self.secondaryPdfView?.setGreekingThreshold(value)
  66. }
  67. if info.keys.contains(KMPreference.antiAliasTextKey) {
  68. self.listView.setShouldAntiAlias(KMPreference.shared.antiAliasText)
  69. self.listView.applyDefaultInterpolationQuality()
  70. self.secondaryPdfView?.setShouldAntiAlias(KMPreference.shared.antiAliasText)
  71. self.secondaryPdfView?.applyDefaultInterpolationQuality()
  72. }
  73. if info.keys.contains(KMPreference.markupColorHighlightKey) {
  74. if let item = self.toolbarController.findItem(KMToolbarHighlightAnnotationItemIdentifier) {
  75. if item.isSelected {
  76. let color = KMPreference.shared.markupHighlightColor
  77. let imageV = KMNoteTypeImageView()
  78. item.image = imageV.noteTypeImage(withType: SKNHighlightString, color: color)
  79. }
  80. }
  81. }
  82. if info.keys.contains(KMPreference.markupColorUnderlineKey) {
  83. if let item = self.toolbarController.findItem(KMToolbarUnderlineAnnotationItemIdentifier) {
  84. if item.isSelected {
  85. let color = KMPreference.shared.markupUnderlineColor
  86. let imageV = KMNoteTypeImageView()
  87. item.image = imageV.noteTypeImage(withType: SKNUnderlineString, color: color)
  88. }
  89. }
  90. }
  91. if info.keys.contains(KMPreference.markupColorStrikthroughKey) {
  92. if let item = self.toolbarController.findItem(KMToolbarStrikeOutAnnotationItemIdentifier) {
  93. if item.isSelected {
  94. let color = KMPreference.shared.markupStrikthroughColor
  95. let imageV = KMNoteTypeImageView()
  96. item.image = imageV.noteTypeImage(withType: SKNStrikeOutString, color: color)
  97. }
  98. }
  99. }
  100. if info.keys.contains(KMPreference.markupColorPenKey) {
  101. if let item = self.toolbarController.findItem(KMToolbarInkAnnotationItemIdentifier) {
  102. if item.isSelected {
  103. let color = KMPreference.shared.markupPenColor
  104. let imageV = KMNoteTypeImageView()
  105. item.image = imageV.noteTypeImage(withType: SKNInkString, color: color)
  106. }
  107. }
  108. }
  109. }
  110. //刷新页面显示器
  111. func updatePageIndicatoreType () {
  112. if self.isReadMode {
  113. self.pageNumberDisplayView.dismiss()
  114. } else {
  115. if self.listView.document != nil {
  116. self.pageNumberDisplayView.totalPagesCount = Int(self.listView.document.pageCount)
  117. }
  118. self.pageNumberDisplayView.currentPageIndex = self.listView.currentPageIndex
  119. self.pageNumberDisplayView.displayType = KMPreferenceManager.shared.pageIndicatorType
  120. self.readContentView.addSubview(self.tipCurrentPageBox, positioned: .above, relativeTo: self.readContentView)
  121. }
  122. }
  123. // MARK: - KMInterfaceThemeChangedProtocol
  124. override func interfaceThemeDidChanged(_ appearance: NSAppearance.Name) {
  125. super.interfaceThemeDidChanged(appearance)
  126. self.toolbarController.interfaceThemeDidChanged(appearance)
  127. self.leftSideViewController.interfaceThemeDidChanged(appearance)
  128. self.rightSideViewController.interfaceThemeDidChanged(appearance)
  129. self.pdfEditController?.interfaceThemeDidChanged(appearance)
  130. self.mianSplitView.superview?.wantsLayer = true
  131. // let sView = self.listView.documentView()
  132. if KMAppearance.isDarkMode() {
  133. self.mianSplitView.superview?.layer?.backgroundColor = NSColor(red: 0.149, green: 0.157, blue: 0.169, alpha: 1).cgColor
  134. // sView?.backgroundColor = NSColor(red: 0.149, green: 0.157, blue: 0.169, alpha: 1)
  135. } else {
  136. self.mianSplitView.superview?.layer?.backgroundColor = NSColor(red: 0.988, green: 0.992, blue: 1, alpha: 1).cgColor
  137. // sView?.backgroundColor = NSColor(red: 0.988, green: 0.992, blue: 1, alpha: 1)
  138. }
  139. }
  140. }
  141. extension KMMainViewController: KMToolbarControllerDelegate {
  142. func toolbarController(_ viewController: KMToolbarController, heightOffsetChange heightOffset: Float, animated: Bool) {
  143. let heightConst = (animated ? self.heightOffset.animator() : self.heightOffset)
  144. if self.isReadMode {
  145. if self.toolbarController.toolbarType == .Annatiton {
  146. heightConst?.constant = CGFloat(heightOffset)
  147. } else {
  148. heightConst?.constant = CGFloat(0)
  149. }
  150. } else {
  151. heightConst?.constant = CGFloat(heightOffset)
  152. }
  153. self.refreshListViewToolMode()
  154. self.trackEvent(toolMode: self.listView.toolMode)
  155. if self.listView.annotationType == .editTextImage ||
  156. self.listView.annotationType == .addText ||
  157. self.listView.annotationType == .addImage {
  158. self.closeRightPane()
  159. }
  160. self.listView.annotationType = .unkown
  161. // self.rightSideViewController.view.isHidden = true
  162. // self.rightSideViewController.isHidden = true
  163. // if self.toolbarController.toolbarType != .LeftPanel {
  164. // self.closeRightPane()
  165. // }
  166. }
  167. func changeAnnotationModeAction(item: KMToolbarClickButton) {
  168. if self.listView.toolMode == .formToolMode {
  169. if !IAPProductsManager.default().isAvailableAllFunction(){
  170. KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
  171. return
  172. }
  173. }
  174. if (self.rightMouseEventing) {
  175. self.rightMouseEventing = false
  176. }
  177. if (self.toolbarController.ignoreCurrentAnnotationTypeChange) {
  178. self.toolbarController.ignoreCurrentAnnotationTypeChange = false
  179. }
  180. var currentType = self.listView.annotationType
  181. if (currentType == .eraser) {
  182. currentType = .ink
  183. }
  184. let isSelected = (currentType == CAnnotationType(rawValue: item.tag) ?? CAnnotationType.unkown) && ((self.listView.toolMode == .noteToolMode) || (self.listView.toolMode == .selfSignMode) || (self.listView.toolMode == .formToolMode))
  185. var editSelectd = false
  186. if self.listView.annotationType == CAnnotationType(rawValue: item.tag) ?? CAnnotationType.unkown && self.listView.toolMode == .editPDFToolMode {
  187. editSelectd = true
  188. }
  189. //多边形工具栏点击特殊处理
  190. // if (self.listView.annotationType == .square ||
  191. // self.listView.annotationType == .circle ||
  192. // self.listView.annotationType == .arrow ||
  193. // self.listView.annotationType == .line) {
  194. // if CAnnotationType(rawValue: item.tag) ?? CAnnotationType.unkown == .square ||
  195. // CAnnotationType(rawValue: item.tag) ?? CAnnotationType.unkown == .circle ||
  196. // CAnnotationType(rawValue: item.tag) ?? CAnnotationType.unkown == .arrow ||
  197. // CAnnotationType(rawValue: item.tag) ?? CAnnotationType.unkown == .line {
  198. // isSelected = true
  199. // }
  200. // } else if (item.tag > 3 && item.tag < 8) {
  201. // let shape = UserDefaults.standard.object(forKey: KMToolBarToolPDFShapeStyle)
  202. // item.tag = shape as? Int ?? item.tag
  203. // }
  204. if isSelected {
  205. self.listView.toolMode = .textToolMode
  206. self.listView.annotationType = .unkown
  207. self.closeRightPane()
  208. } else {
  209. if let type = CAnnotationType(rawValue: item.tag) {
  210. self.trackEvent(annotationType: type)
  211. }
  212. if self.listView.currentSelection != nil {
  213. let annotation = self.listView.addAnnotation(with: CAnnotationType(rawValue: item.tag) ?? CAnnotationType.unkown, selection: self.listView.currentSelection, page: self.listView.currentSelection.page, bounds: self.listView.currentSelection.bounds)
  214. if((annotation != nil) &&
  215. !self.listView.activeAnnotations.contains(annotation ?? self.listView.activeAnnotation)) {
  216. var newAnnonations : [CPDFAnnotation] = []
  217. newAnnonations.append(annotation!)
  218. self.listView.updateActiveAnnotations(newAnnonations)
  219. self.listView.setNeedsDisplayAnnotationViewFor(annotation?.page)
  220. }
  221. }
  222. self.refreshListViewToolMode()
  223. let type = CAnnotationType(rawValue: item.tag) ?? CAnnotationType.unkown
  224. var annotations: [CPDFAnnotation] = []
  225. if (type == .link) {
  226. for annotation in self.listView.activeAnnotations {
  227. if ((annotation is CPDFLinkAnnotation) == false) {
  228. continue
  229. }
  230. annotations.append(annotation as! CPDFAnnotation)
  231. }
  232. }
  233. self.listView.annotationType = type
  234. if (type == .link && annotations.count > 0) {
  235. self.listView.updateActiveAnnotations(annotations)
  236. }
  237. }
  238. if self.listView.toolMode != .editPDFToolMode && self.listView.annotationType != .unkown {
  239. // self.rightSideViewController.view.isHidden = false
  240. self.rightSideViewController.isHidden = false
  241. self.rightSideViewController.subViewType = .AnnotationProperts
  242. if !self.isReadMode {
  243. self.openRightPane()
  244. }
  245. } else if self.listView.toolMode == .editPDFToolMode {
  246. if editSelectd {
  247. // self.rightSideViewController.view.isHidden = true
  248. self.rightSideViewController.isHidden = true
  249. self.listView.setShouAddEdit([])
  250. self.listView.change([.text, .image])
  251. self.listView.annotationType = .editTextImage
  252. self.closeRightPane()
  253. } else if self.listView.annotationType == .addText {
  254. // self.rightSideViewController.view.isHidden = false
  255. self.rightSideViewController.isHidden = false
  256. if !self.isReadMode {
  257. self.openRightPane()
  258. }
  259. self.rightSideViewController.subViewType = .EditPDFAddText
  260. FMTrackEventManager.defaultManager.trackEvent(event: "SubTbr_EditPDF", withProperties: ["SubTbr_Btn" : "Btn_SubTbr_EditPDF_AddText"])
  261. self.listView.setShouAddEdit(.text)
  262. self.listView.change(.text)
  263. } else if self.listView.annotationType == .addImage {
  264. self.rightSideViewController.isHidden = false
  265. if !self.isReadMode {
  266. self.openRightPane()
  267. }
  268. FMTrackEventManager.defaultManager.trackEvent(event: "SubTbr_EditPDF", withProperties: ["SubTbr_Btn" : "Btn_SubTbr_EditPDF_AddImage"])
  269. // self.closeRightPane()
  270. self.rightSideViewController.subViewType = .EditPDFAddImage
  271. self.listView.setShouAddEdit(.image)
  272. self.listView.change(.image)
  273. self.rightSideViewController.eidtPDFImageProperty.reloadData()
  274. }
  275. } else {
  276. // self.rightSideViewController.view.isHidden = true
  277. self.rightSideViewController.isHidden = true
  278. self.closeRightPane()
  279. }
  280. }
  281. func refreshListViewToolMode () {
  282. if self.toolbarController.toolbarType == .Annatiton {
  283. self.listView.toolMode = .noteToolMode
  284. } else if self.toolbarController.toolbarType == .Move {
  285. self.listView.toolMode = .moveToolMode
  286. } else if self.toolbarController.toolbarType == .Magnify {
  287. self.listView.toolMode = .magnifyToolMode
  288. } else if self.toolbarController.toolbarType == .Select {
  289. self.listView.toolMode = .selectToolMode
  290. } else if self.toolbarController.toolbarType == .SelectZoom {
  291. self.listView.toolMode = .selectZoomToolMode
  292. } else if self.toolbarController.toolbarType == .Page {
  293. } else if self.toolbarController.toolbarType == .Form {
  294. self.listView.toolMode = .formToolMode
  295. self.rightSideViewController.subViewType = .AnnotationProperts
  296. } else if self.toolbarController.toolbarType == .FillSign {
  297. self.listView.toolMode = .selfSignMode
  298. self.rightSideViewController.subViewType = .AnnotationProperts
  299. } else if self.toolbarController.toolbarType == .editPDF {
  300. self.listView.toolMode = .editPDFToolMode
  301. // self.listView.editingConfig().isShowEditingAreaHover = true
  302. // self.listView.editingConfig().editingBorderWidth = 1
  303. // self.listView.editingConfig().editingCenterRadius = 5
  304. // self.listView.editingConfig().editAreaMargin = 2
  305. // self.listView.editingConfig().editingHoverBorderColor = NSColor.init(red: 0, green: 136.0/255.0, blue: 1.0, alpha: 0.5)
  306. // self.listView.editingConfig().editingBorderColor = NSColor.init(red: 0, green: 0, blue: 0, alpha: 0.4)
  307. // self.listView.editingConfig().addEditAreaColor = NSColor.init(red: 23.0/255.0, green: 112.0/255.0, blue: 244.0/255.0, alpha: 0.5)
  308. // self.listView.editingConfig().editAreaMoveFillColor = NSColor.init(red: 23.0/255.0, green: 112.0/255.0, blue: 244.0/255.0, alpha: 0.1)
  309. self.listView.setShouAddEdit([])
  310. }else if self.toolbarController.toolbarType == .LeftPanel {
  311. self.toggleLeftPane()
  312. self.leftSideViewController.showPanelView(show: true)
  313. }else {
  314. // if self.leftSideViewController.isShowPanel {
  315. // self.leftSideViewController.showPanelView(show: false)
  316. // }
  317. self.listView.toolMode = .textToolMode
  318. }
  319. }
  320. func showPDFLayoutModeAction(show: Bool) {
  321. self.listView.annotationType = .unkown
  322. self.showOrHideNotes()
  323. }
  324. }
  325. extension KMMainViewController : NSSplitViewDelegate {
  326. func splitView(_ splitView: NSSplitView, canCollapseSubview subview: NSView) -> Bool {
  327. // KMPrint("kk- canCollapseSubview")
  328. if splitView == self.mianSplitView {
  329. // return (subview == self.listView) == false
  330. } else if splitView == self.newPDFSplitView {
  331. return subview.isEqual(to: self.secondaryPdfContentView)
  332. }
  333. return false
  334. }
  335. func splitView(_ splitView: NSSplitView, shouldCollapseSubview subview: NSView, forDoubleClickOnDividerAt dividerIndex: Int) -> Bool {
  336. // KMPrint("kk- shouldCollapseSubview")
  337. if splitView == self.newPDFSplitView {
  338. if subview.isEqual(to: self.secondaryPdfContentView) {
  339. var position = self.newPDFSplitView.maxPossiblePositionOfDivider(at: dividerIndex)
  340. if self.newPDFSplitView.isSubviewCollapsed(subview) {
  341. if self.lastSplitPDFHeight <= 0.0 {
  342. let DEFAULT_SPLIT_PANE_HEIGHT: Float = 200.0
  343. self.lastSplitPDFHeight = DEFAULT_SPLIT_PANE_HEIGHT
  344. }
  345. if self.lastSplitPDFHeight.cgFloat > NSHeight(self.pdfContentView.frame) {
  346. self.lastSplitPDFHeight = floorf(0.5 * Float(NSHeight(self.pdfContentView.frame)))
  347. }
  348. position += self.lastSplitPDFHeight.cgFloat
  349. } else {
  350. self.lastSplitPDFHeight = Float(NSHeight(subview.frame))
  351. }
  352. self.pdfSplitView.setPosition(position, ofDividerAt: dividerIndex, animate: true)
  353. }
  354. return false
  355. }
  356. return false
  357. }
  358. func splitView(_ splitView: NSSplitView, shouldHideDividerAt dividerIndex: Int) -> Bool {
  359. // KMPrint("kk- shouldHideDividerAt")
  360. if splitView == self.mianSplitView {
  361. return splitView == self.mianSplitView
  362. } else if splitView == self.newPDFSplitView {
  363. KMPrint("")
  364. return false
  365. }
  366. return false
  367. }
  368. func splitView(_ splitView: NSSplitView, constrainMaxCoordinate proposedMaximumPosition: CGFloat, ofSubviewAt dividerIndex: Int) -> CGFloat {
  369. // KMPrint("kk- constrainMaxCoordinate")
  370. if splitView == mianSplitView {
  371. let splitViewWidth = splitView.frame.width
  372. let dividerIndexX0 = panelWidth + functionWidth
  373. if dividerIndex == 0 {
  374. if leftPanelOpen {
  375. return CGFloat(dividerIndexX0 * 1.5)
  376. } else {
  377. return functionWidth
  378. }
  379. } else if dividerIndex == 1 {
  380. return splitViewWidth
  381. }
  382. } else if splitView == self.newPDFSplitView {
  383. if dividerIndex == 0 {
  384. let MIN_SIDE_PANE_WIDTH = 270
  385. return proposedMaximumPosition + MIN_SIDE_PANE_WIDTH.cgFloat
  386. }
  387. }
  388. return proposedMaximumPosition
  389. }
  390. func splitView(_ splitView: NSSplitView, constrainMinCoordinate proposedMinimumPosition: CGFloat, ofSubviewAt dividerIndex: Int) -> CGFloat {
  391. // KMPrint("kk- constrainMinCoordinate")
  392. if splitView == mianSplitView {
  393. let splitViewWidth = splitView.frame.width
  394. let dividerIndexX1 = splitViewWidth - defaultRightWidth
  395. if dividerIndex == 0 {
  396. return functionWidth
  397. } else if dividerIndex == 1 {
  398. return dividerIndexX1
  399. }
  400. } else if splitView == self.newPDFSplitView {
  401. KMPrint("")
  402. }
  403. return proposedMinimumPosition
  404. }
  405. func splitView(_ splitView: NSSplitView, resizeSubviewsWithOldSize oldSize: NSSize) {
  406. // KMPrint("kk- resizeSubviewsWithOldSize")
  407. if splitView.isEqual(to: mianSplitView) {
  408. let leftView = splitView.subviews[0]
  409. let centerView = splitView.subviews[1]
  410. let rightView = splitView.subviews[2]
  411. // let centerView = self.pdfSplitView ?? splitView.subviews[1]
  412. // let rightView = self.rightView ?? splitView.subviews[2]
  413. // 左边是否收起
  414. let leftCollapsed = splitView.isSubviewCollapsed(leftView)
  415. // 右边是否收起
  416. let rightCollapsed = splitView.isSubviewCollapsed(rightView)
  417. var leftSize = leftView.frame.size
  418. var mainSize = centerView.frame.size
  419. var rightSize = rightView.frame.size
  420. var contentWidth = splitView.frame.width
  421. if leftCollapsed {
  422. leftSize.width = 0.0
  423. } else {
  424. contentWidth = contentWidth - splitView.dividerThickness
  425. }
  426. if rightCollapsed {
  427. rightSize.width = 0.0
  428. } else {
  429. contentWidth = contentWidth - splitView.dividerThickness
  430. }
  431. if contentWidth < leftSize.width + rightSize.width {
  432. var oldContentWidth = oldSize.width
  433. if leftCollapsed == false {
  434. oldContentWidth = oldContentWidth - splitView.dividerThickness
  435. }
  436. if rightCollapsed == false {
  437. oldContentWidth = oldContentWidth - splitView.dividerThickness
  438. }
  439. let resizeFactor = contentWidth / oldContentWidth
  440. leftSize.width = floor(resizeFactor*leftSize.width)
  441. rightSize.width = floor(resizeFactor*rightSize.width)
  442. }
  443. mainSize.width = contentWidth - leftSize.width - rightSize.width
  444. leftSize.height = splitView.frame.height
  445. rightSize.height = splitView.frame.height
  446. mainSize.height = splitView.frame.height
  447. if leftCollapsed == false {
  448. leftView.setFrameSize(leftSize)
  449. }
  450. if rightCollapsed == false {
  451. rightView.setFrameSize(rightSize)
  452. }
  453. centerView.setFrameSize(mainSize)
  454. } else if splitView == self.newPDFSplitView {
  455. // let firstV = splitView.subviews.first
  456. // let lastV = splitView.subviews.last
  457. // if firstV == lastV{
  458. // splitView.adjustSubviews()
  459. // return
  460. // }
  461. // if self.newPDFSplitView.isVertical { // 横向
  462. // // 左边是否收起
  463. // let leftCollapsed = splitView.isSubviewCollapsed(firstV!)
  464. // // 右边是否收起
  465. // let rightCollapsed = splitView.isSubviewCollapsed(lastV!)
  466. //
  467. // var contentSize = splitView.frame.size
  468. // firstV?.setFrameSize(NSMakeSize(contentSize.width * 0.5, contentSize.height))
  469. // lastV?.setFrameSize(NSMakeSize(contentSize.width * 0.5, contentSize.height))
  470. // } else { // 纵向
  471. // // 左边是否收起
  472. // let leftCollapsed = splitView.isSubviewCollapsed(firstV!)
  473. // // 右边是否收起
  474. // let rightCollapsed = splitView.isSubviewCollapsed(lastV!)
  475. //
  476. // var contentSize = splitView.frame.size
  477. // firstV?.setFrameSize(NSMakeSize(contentSize.width, contentSize.height * 0.5))
  478. // lastV?.setFrameSize(NSMakeSize(contentSize.width, contentSize.height * 0.5))
  479. // }
  480. }
  481. splitView.adjustSubviews()
  482. }
  483. func splitViewWillResizeSubviews(_ notification: Notification) {
  484. // KMPrint("kk- splitViewWillResizeSubviews")
  485. let defaultView = KMSplitView()
  486. let sender : NSSplitView = notification.object as? NSSplitView ?? defaultView
  487. if (sender == self.mianSplitView || sender == defaultView) && self.view.window?.frameAutosaveName != nil{
  488. // let leftWidth = self.mianSplitView.isSubviewCollapsed(self.leftView) ? 0.0 : leftSideViewController.view.frame.width
  489. // if leftPanelOpen {
  490. // if leftWidth < 100 && lastLeftPanWidth > functionWidth{
  491. // self.closeLeftPane()
  492. // }
  493. // }
  494. } else {
  495. if sender == self.pdfSplitView {
  496. KMPrint("")
  497. }
  498. }
  499. }
  500. func splitViewDidResizeSubviews(_ notification: Notification) {
  501. // KMPrint("kk- splitViewDidResizeSubviews")
  502. self.locationPageView.frame = CGRect(x: 0, y: self.listView.frame.maxY-32, width: self.listView.frame.width, height: 32)
  503. let defaultView = KMSplitView()
  504. let sender : NSSplitView = notification.object as? NSSplitView ?? defaultView
  505. if (sender == self.mianSplitView || sender == defaultView) && self.view.window?.frameAutosaveName != nil{
  506. let leftWidth = self.mianSplitView.isSubviewCollapsed(self.leftView) ? 0.0 : leftSideViewController.view.frame.width
  507. let rightWidth = self.mianSplitView.isSubviewCollapsed(self.rightView) ? 0.0 : rightSideViewController.view.frame.width
  508. UserDefaults.standard.set(leftWidth, forKey: CPDFOfficeLeftSidePaneWidthKey)
  509. UserDefaults.standard.set(rightWidth, forKey: CPDFOfficeRightSidePaneWidthKey)
  510. } else {
  511. if sender == self.pdfSplitView {
  512. KMPrint("")
  513. }
  514. }
  515. }
  516. func splitView(_ splitView: NSSplitView, constrainSplitPosition proposedPosition: CGFloat, ofSubviewAt dividerIndex: Int) -> CGFloat {
  517. // KMPrint("kk- constrainSplitPosition")
  518. if splitView == self.mianSplitView {
  519. if dividerIndex == 0 {
  520. if leftPanelOpen {
  521. //当左边栏开启式,拖拽时不改变宽度,当宽度达到原宽度的一半时关闭窗口
  522. //如果 isShowPanel 为 true 那么将不会收缩
  523. if (proposedPosition < functionWidth + panelWidth * 0.5) && !self.leftSideViewController.isShowPanel {
  524. self.closeLeftPane()
  525. self.leftSideViewController.refreshMethodType(methodType: .None)
  526. return functionWidth
  527. } else if proposedPosition > panelWidth + functionWidth {
  528. return proposedPosition
  529. } else {
  530. return panelWidth + functionWidth
  531. }
  532. } else {
  533. return functionWidth
  534. }
  535. }
  536. } else if splitView == self.newPDFSplitView {
  537. KMPrint("")
  538. }
  539. return proposedPosition
  540. }
  541. }
  542. extension KMMainViewController: KMLeftSideViewControllerDelegate {
  543. func controlStateChange(_ obj: KMLeftSideViewController, show: Bool) {
  544. if show {
  545. self.openLeftPane()
  546. } else {
  547. self.closeLeftPane()
  548. }
  549. }
  550. func enterEditMode(_ obj: KMLeftSideViewController, _ pages: [Int]) {
  551. let item : KMToolbarItemView = (self.toolbarController.mainToolBarView?.toolbarItemFindItemIdentifiers(value: KMDocumentPageToolbarItemIdentifier))!
  552. self.toolbarController.mainToolBarView?.delegate?.toolbarViewController?(self.toolbarController.mainToolBarView!, clickMode: .Page, toolbar: item, pages)
  553. }
  554. func searchAction(searchString: String,isCase:Bool) {
  555. self.search(searchString: searchString,isCase: isCase)
  556. }
  557. func controller(_ controller: KMLeftSideViewController, dispayDidChange dispay: KMPDFDisplayType) {
  558. self.selectDisplay(display: dispay, viewSettingIsReload: false)
  559. }
  560. func controller(controller: KMLeftSideViewController, itemClick item: Any?, itemKey: KMItemKey, params: Any?) {
  561. if (itemKey == .print) { // 打印
  562. if params is NSImage {
  563. KMPrintWindowController.cpdf_printImage(image: params as! NSImage)
  564. return
  565. }
  566. var pageRange: KMPrintPageRange = KMPrintPageRange(type: .allPage, selectPages: [], reversePrintOrder: false)
  567. if (params != nil) {
  568. pageRange.type = .custom
  569. pageRange.selectPages = params as! [Int]
  570. }
  571. self.showPrintWindow(pageRange: pageRange)
  572. } else if (itemKey == .cut || itemKey == .paste || itemKey == .delete || itemKey == .leftRotate || itemKey == .rightRotate) {
  573. self.recordIsPDFDocumentEdited(type: itemKey.toSubscribeWaterMarkType())
  574. } else if itemKey == .pageEdit {
  575. self.toolbarController.clickItem(KMDocumentPageToolbarItemIdentifier)
  576. } else if itemKey == .demote { // 大纲降级
  577. guard let currentOutline: CPDFOutline = controller.tocOutlineView.km.clickedItem() else {
  578. return
  579. }
  580. self.listView?.demote(outline: currentOutline)
  581. } else if itemKey == .promote { // 大纲升级
  582. guard let currentOutline: CPDFOutline = controller.tocOutlineView.km.clickedItem() else {
  583. return
  584. }
  585. self.listView?.promote(outline: currentOutline)
  586. }
  587. }
  588. func controller(controller: KMLeftSideViewController, bookMarkDidChange bookMarks: [KMBookMarkItem]) {
  589. self.needSave = true
  590. self.recordIsPDFDocumentEdited()
  591. }
  592. func controller(controller: KMLeftSideViewController, rotateType: KMRotateType) {
  593. if rotateType == .clockwise {
  594. self.menuItemAction_rotateRight((Any).self)
  595. } else if rotateType == .anticlockwise {
  596. self.menuItemAction_rotateLeft((Any).self)
  597. }
  598. }
  599. func controller(controller: KMLeftSideViewController, listViewSelectionDidChange object: Any?, info: [String : Any]?) {
  600. if controller.thumbnailTableView.isEqual(to: object) {
  601. let row = controller.thumbnailTableView.selectedRow
  602. let curIndex = self.listView.currentPageIndex
  603. if (row != -1 && row != curIndex) {
  604. self.listView?.go(toPageIndex: row, animated: true)
  605. }
  606. }
  607. }
  608. }
  609. //MARK: ReadModel
  610. extension KMMainViewController {
  611. @objc func openReadModel() {
  612. //保存进入阅读模式之前的状态
  613. readLeftMethodType = self.leftSideViewController.type.methodType
  614. readLeftPanelOpen = leftPanelOpen
  615. readLastLeftPanWidth = lastLeftPanWidth
  616. readLeftViewShowPanel = self.leftSideViewController.isShowPanel
  617. readRightPanelOpen = rightPanelIsOpen
  618. readToolbarType = self.toolbarController.toolbarType
  619. readToolMode = self.listView.toolMode
  620. readAnnotationType = self.listView.annotationType
  621. readSubViewType = self.rightSideViewController.subViewType ?? .None
  622. if self.toolbarController.lastItemBox.isSelected {
  623. readToolbarItemIdentifier = self.toolbarController.lastItemBox.itemIdentifier ?? ""
  624. } else {
  625. readToolbarItemIdentifier = ""
  626. }
  627. //设置阅读模式
  628. self.isReadMode = true
  629. self.readModelView.isHidden = false
  630. //
  631. //顶部菜单栏状态清空
  632. self.toolbarController.toolbarType = .None
  633. // self.toolbarController.view.isHidden = true
  634. self.toolbarController.cancelSelected(KMLeftControlToolbarItemIdentifier)
  635. self.toolbarController.cancelSelected(KMRightControlToolbarItemIdentifier)
  636. self.toolbarController.lastItemBox.isSelected = false
  637. //左侧菜单栏情况
  638. self.leftPanelOpen = false
  639. self.lastLeftPanWidth = 0
  640. self.leftSideViewController.refreshMethodType(methodType: .None)
  641. //阅读界面初始化
  642. self.readModelView.isHidden = false
  643. self.readModelView.currentPageIndex = self.listView.currentPageIndex
  644. self.readModelView.totalPagesCount = Int(self.listView.document.pageCount)
  645. self.readModelView.beginTimer()
  646. // self.listView.autoScales = true
  647. // self.readModelView.scaleType = .autoSize
  648. self.readModelView.zoomButton.stringValue = (NSString(format: "%.0f", self.listView.scaleFactor * 100) as String) + "%"
  649. //关闭左侧右侧菜单栏
  650. self.closeLeftPane()
  651. self.closeRightPane()
  652. self.leftSideViewController.showPanelView(show: false)
  653. self.leftView.isHidden = true
  654. //弹出提示框
  655. if readAlertView != nil {
  656. readAlertView?.removeFromSuperview()
  657. }
  658. readAlertView = CustomAlertView.alertView(message: NSLocalizedString("Read Mode On", comment: ""), fromView: self.view, withStyle: .blue, backgroundColor: NSColor.km_init(hex: "#36383B"))
  659. self.updateAITipViewShowState()
  660. // self.aiTipView.isHidden = true
  661. }
  662. @objc func closeReadModel() {
  663. if self.isReadMode {
  664. self.isShowBOTA = false
  665. self.readModelView.isHidden = true
  666. self.isReadMode = false
  667. self.readModelView.isHidden = true
  668. self.leftSideViewController.refreshMethodType(methodType: readLeftMethodType)
  669. self.leftPanelOpen = readLeftPanelOpen
  670. self.rightPanelIsOpen = readRightPanelOpen
  671. self.lastLeftPanWidth = readLastLeftPanWidth
  672. if self.leftPanelOpen {
  673. self.openLeftPane()
  674. }
  675. self.closeRightPane()
  676. self.toolbarController.toolbarType = .None
  677. self.toolbarController.cancelSelected(KMDocumentViewDisplayToolbarItemIdentifier)
  678. // if self.rightPanelIsOpen {
  679. // self.rightPanelIsOpen = false
  680. //// self.toolbarController.selectItem(KMRightControlToolbarItemIdentifier)
  681. // self.openRightPane()
  682. // }
  683. //
  684. // if readToolbarItemIdentifier.count == 0 {
  685. // self.toolbarController.toolbarType = .None
  686. // } else {
  687. // self.toolbarController.selectItem(readToolbarItemIdentifier)
  688. // }
  689. // self.toolbarController.selectItem(KMDocumentViewDisplayToolbarItemIdentifier)
  690. self.leftSideViewController.showPanelView(show: readLeftViewShowPanel)
  691. if readLeftViewShowPanel {
  692. self.toolbarController.selectItem(KMLeftControlToolbarItemIdentifier)
  693. }
  694. self.toolbarController.view.isHidden = false
  695. self.listView.toolMode = readToolMode
  696. self.listView.annotationType = readAnnotationType
  697. // self.toolbarController.toolbarType = .viewSetting
  698. } else {
  699. self.toolbarController.toolbarType = .None
  700. }
  701. if readAlertView != nil {
  702. readAlertView?.removeFromSuperview()
  703. }
  704. readAlertView = CustomAlertView.alertView(message: NSLocalizedString("Read Mode Off", comment: ""), fromView: self.view, withStyle: .blue, backgroundColor: NSColor.km_init(hex: "#36383B"))
  705. self.updateAITipViewShowState()
  706. }
  707. @objc func addOutLineItemAction() {
  708. let labelString = "\(KMLocalizedString("Page", nil)) \((self.listView?.currentPageIndex ?? 0) + 1)"
  709. let label = self.listView?.currentSelection?.string() ?? labelString
  710. let dest = self.listView?.currentDestination
  711. if let row = self.leftSideViewController.selectedRowIndexes().last {
  712. if let ol = self.leftSideViewController.tocOutlineView.item(atRow: row) as? CPDFOutline {
  713. _ = self.listView.addOutline(for: ol.parent, label: label, dest: dest, at: ol.index+1)
  714. } else {
  715. let idx = self.listView?.document?.outlineRoot()?.numberOfChildren ?? 0
  716. _ = self.listView.addOutlineForRoot(label: label, dest:dest, at: idx)
  717. }
  718. } else {
  719. let idx = self.listView?.document?.outlineRoot()?.numberOfChildren ?? 0
  720. _ = self.listView.addOutlineForRoot(label: label, dest:dest, at: idx)
  721. }
  722. }
  723. @objc func showTTSView() {
  724. self.showTTSWindow()
  725. }
  726. @objc func showShareAction() {
  727. }
  728. @objc func lookUpAction() {
  729. }
  730. @objc func searchBaiduAction() {
  731. }
  732. @objc func showInfoInFinder() {
  733. }
  734. @objc func NextPageAction() {
  735. }
  736. @objc func PreviousPageAction() {
  737. }
  738. @objc func TranslateItemAction() {
  739. }
  740. @objc func AutoScrollItemAction() {
  741. //增加判断,如果是正在滚动,就停止,否则就开始滚动
  742. self.listView.autoFlow()
  743. }
  744. @objc func shareFromService(sender: NSMenuItem) {
  745. if ((NSApp.mainWindow?.windowController is KMBrowserWindowController) == false) {
  746. return
  747. }
  748. var string = ""
  749. if let freeTextAnnotation = listView.activeAnnotation as? CPDFFreeTextAnnotation {
  750. string = freeTextAnnotation.contents ?? ""
  751. } else if let markupAnnotation = listView.activeAnnotation as? CPDFMarkupAnnotation {
  752. if let page = markupAnnotation.page {
  753. if let selection = page.selection(for: markupAnnotation.bounds) {
  754. string = selection.string()
  755. }
  756. }
  757. } else {
  758. string = listView.currentSelection.string()
  759. }
  760. let windowControler = NSApp.mainWindow?.windowController as! KMBrowserWindowController
  761. let model: CTTabStripModel = windowControler.browser.tabStripModel
  762. if (model.count() <= 0) {
  763. return
  764. }
  765. if (model.activeTabContents().isHome) {
  766. return
  767. }
  768. let document: KMMainDocument = model.activeTabContents() as! KMMainDocument
  769. if string.count > 0 {
  770. let represent : NSSharingService = sender.representedObject as! NSSharingService
  771. represent.perform(withItems: [string])
  772. return
  773. }
  774. let represent = sender.representedObject as? NSSharingService
  775. represent?.perform(withItems: [string])
  776. }
  777. @objc func cutAction(sender: NSMenuItem) {
  778. }
  779. @objc func deleteAction(sender: NSMenuItem) {
  780. }
  781. @objc func ColorsItemAction(sender: NSMenuItem) {
  782. }
  783. @objc func LinesItemAction(sender: NSMenuItem) {
  784. }
  785. @objc func EditNoteItemAction(sender: NSMenuItem) {
  786. }
  787. @objc func AITranslateItemAction(sender: NSMenuItem) {
  788. self.loadAIConfigWindowWithType(.translate)
  789. }
  790. @objc func AIProofreadItemAction(sender: NSMenuItem) {
  791. self.loadAIConfigWindowWithType(.proofreading)
  792. }
  793. @objc func AIRewriteItemAction(sender: NSMenuItem) {
  794. self.loadAIConfigWindowWithType(.reWriting)
  795. }
  796. // @objc func highlightLinks() {
  797. // let highlightLinks = KMPreferenceManager.shared.highlightLinks
  798. // KMPreferenceManager.shared.highlightLinks = !highlightLinks
  799. // }
  800. }