KMNAnnotationPopToolbarWindow.swift 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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. if(annotationPopMode.popType == .formRadioAnnotation || annotationPopMode.popType == .formAnnotation) {
  38. DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
  39. self.makeFirstResponder(contentViewC.fildNameInput)
  40. contentViewC.fildNameInput.beginEditing()
  41. }
  42. }
  43. }
  44. //MARK: - Public
  45. public func updateFrame(listView:CPDFListView) {
  46. let activeAnnotations = annotationPopMode.annotations
  47. let page = activeAnnotations.first?.page
  48. let windowFram = listView.window?.frame ?? CGRectZero
  49. if(page != nil) {
  50. let pageRect = listView.selectionMultipleBounds(with: activeAnnotations)
  51. let positioningRect = listView.convert(pageRect, from: page!)
  52. if (CGRectIntersectsRect(positioningRect, listView.frame)) {
  53. let view: NSView? = nil
  54. let position = listView.convert(positioningRect, to: view)
  55. var positionNew = position.origin
  56. positionNew.x += windowFram.origin.x + position.width/2
  57. positionNew.y += windowFram.origin.y + position.height
  58. var positionRect = self.frame
  59. positionRect.origin.x = positionNew.x - positionRect.width/2
  60. positionRect.origin.y = positionNew.y + popOffSet
  61. var listViewWindRect = listView.convert(listView.frame, to: view)
  62. listViewWindRect.origin.x += windowFram.origin.x
  63. listViewWindRect.origin.y += windowFram.origin.y
  64. if CGRectGetMaxY(positionRect) > CGRectGetMaxY(listViewWindRect) {
  65. positionRect.origin.y = positionNew.y - popOffSet - position.height - positionRect.size.height
  66. }
  67. if CGRectGetMinX(positionRect) < CGRectGetMinX(listViewWindRect) {
  68. positionRect.origin.x = CGRectGetMinX(listViewWindRect)
  69. }
  70. if CGRectGetMaxX(positionRect) > CGRectGetMaxX(listViewWindRect) {
  71. positionRect.origin.x = CGRectGetMaxX(listViewWindRect) - positionRect.width
  72. }
  73. self.setFrame(positionRect, display: true)
  74. let popA = KMNPopAnnotationViewController.shared
  75. popA.updateUILanguage()
  76. } else {
  77. }
  78. }
  79. }
  80. public func closeWindow(listView:CPDFListView?) {
  81. if self.isVisible == true {
  82. listView?.window?.removeChildWindow(self)
  83. self.orderBack(nil)
  84. }
  85. let popA = KMNPopAnnotationViewController.shared
  86. popA.closePopView()
  87. }
  88. override var canBecomeKey: Bool {
  89. if(annotationPopMode.popType == .formRadioAnnotation || annotationPopMode.popType == .formAnnotation ||
  90. annotationPopMode.popType == .linkAnnotation) {
  91. return true
  92. } else {
  93. return false
  94. }
  95. }
  96. override var canBecomeMain: Bool {
  97. if(annotationPopMode.popType == .formRadioAnnotation || annotationPopMode.popType == .formAnnotation ||
  98. annotationPopMode.popType == .linkAnnotation) {
  99. return true
  100. } else {
  101. return false
  102. }
  103. }
  104. }