KMNAnnotationPopToolbarWindow.swift 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. //
  2. // KMNPopToolbarWindow.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by 丁林圭 on 2025/2/6.
  6. //
  7. import Cocoa
  8. class KMNAnnotationPopToolbarWindow: NSWindow {
  9. static let shared = KMNAnnotationPopToolbarWindow()
  10. public var annotationPopMode:KMNAnnotationPopMode = KMNAnnotationPopMode(pdfAnnotations: [])
  11. convenience init() {
  12. let rect = NSRect(x: 0, y: 0, width: 400, height: 44)
  13. let styleMask: NSWindow.StyleMask = [.fullSizeContentView]
  14. self.init(contentRect: rect, styleMask: styleMask, backing: .buffered, defer: false)
  15. }
  16. override init(contentRect: NSRect, styleMask style: NSWindow.StyleMask, backing backingStoreType: NSWindow.BackingStoreType, defer flag: Bool) {
  17. super.init(contentRect: contentRect, styleMask: style, backing: backingStoreType, defer: flag)
  18. let contentViewC = KMNPopAnnotationViewController.shared
  19. self.contentViewController = contentViewC
  20. self.titlebarAppearsTransparent = true
  21. self.titleVisibility = .hidden
  22. self.isMovable = false
  23. self.contentView?.wantsLayer = true
  24. self.contentView?.layer?.cornerRadius = 4
  25. self.contentView?.layer?.masksToBounds = true
  26. self.backgroundColor = .clear
  27. }
  28. func show(relativeTo positioningRect: NSRect, of positioningView: CPDFListView, preferredEdge: NSRectEdge) {
  29. self.orderFront(nil)
  30. let contentViewC = KMNPopAnnotationViewController.shared
  31. contentViewC.closeWindowCallback = {[weak self] in
  32. self?.closeWindow(listView: positioningView)
  33. }
  34. contentViewC.frameCallback = {[weak self] in
  35. self?.updateFrame(listView: positioningView)
  36. }
  37. }
  38. //MARK: - Public
  39. public func updateFrame(listView:CPDFListView) {
  40. let activeAnnotations = annotationPopMode.annotations
  41. let page = activeAnnotations.first?.page
  42. let windowFram = listView.window?.frame ?? CGRectZero
  43. if(page != nil) {
  44. let pageRect = listView.selectionMultipleBounds(with: activeAnnotations)
  45. let positioningRect = listView.convert(pageRect, from: page!)
  46. if (CGRectIntersectsRect(positioningRect, listView.frame)) {
  47. let view: NSView? = nil
  48. let position = listView.convert(positioningRect, to: view)
  49. var positionNew = position.origin
  50. positionNew.x += windowFram.origin.x + position.width/2
  51. positionNew.y += windowFram.origin.y + position.height
  52. var positionRect = self.frame
  53. positionRect.origin.x = positionNew.x - positionRect.width/2
  54. positionRect.origin.y = positionNew.y + popOffSet
  55. var listViewWindRect = listView.convert(listView.frame, to: view)
  56. listViewWindRect.origin.x += windowFram.origin.x
  57. listViewWindRect.origin.y += windowFram.origin.y
  58. if CGRectGetMaxY(positionRect) > CGRectGetMaxY(listViewWindRect) {
  59. positionRect.origin.y = positionNew.y - popOffSet - position.height - positionRect.size.height
  60. }
  61. if CGRectGetMinX(positionRect) < CGRectGetMinX(listViewWindRect) {
  62. positionRect.origin.x = CGRectGetMinX(listViewWindRect)
  63. }
  64. if CGRectGetMaxX(positionRect) > CGRectGetMaxX(listViewWindRect) {
  65. positionRect.origin.x = CGRectGetMaxX(listViewWindRect) - positionRect.width
  66. }
  67. self.setFrame(positionRect, display: true)
  68. let popA = KMNPopAnnotationViewController.shared
  69. popA.updateUILanguage()
  70. } else {
  71. }
  72. }
  73. }
  74. public func closeWindow(listView:CPDFListView?) {
  75. if self.isVisible == true {
  76. listView?.window?.removeChildWindow(self)
  77. self.orderOut(nil)
  78. }
  79. let popA = KMNPopAnnotationViewController.shared
  80. popA.closePopView()
  81. }
  82. override var canBecomeKey: Bool {
  83. if(annotationPopMode.popType == .formRadioAnnotation || annotationPopMode.popType == .formAnnotation ||
  84. annotationPopMode.popType == .linkAnnotation) {
  85. return true
  86. } else {
  87. return false
  88. }
  89. }
  90. override var canBecomeMain: Bool {
  91. if(annotationPopMode.popType == .formRadioAnnotation || annotationPopMode.popType == .formAnnotation ||
  92. annotationPopMode.popType == .linkAnnotation) {
  93. return true
  94. } else {
  95. return false
  96. }
  97. }
  98. }