KMPDFThumbnailItem.swift 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. //
  2. // KMPDFThumbnailItem.swift
  3. // PDF Office
  4. //
  5. // Created by lxy on 2022/12/16.
  6. //
  7. import Cocoa
  8. let pageBoxBorder = 5
  9. let textBoxSpace = 2
  10. let textLabelHeight = 15
  11. class KMPDFThumbnailItem: NSCollectionViewItem {
  12. lazy var pageBox : NSView = {
  13. let pageBox = NSView()
  14. pageBox.wantsLayer = true
  15. pageBox.layer?.borderWidth = 1
  16. pageBox.layer?.borderColor = NSColor(hex: "#CED0D4").cgColor
  17. pageBox.layer?.cornerRadius = 2.0
  18. pageBox.layer?.masksToBounds = true
  19. return pageBox
  20. }()
  21. lazy var textBox : NSView = {
  22. let textBox = NSView()
  23. return textBox
  24. }()
  25. lazy var pageTextLabel : NSTextField = {
  26. let pageTextLabel = NSTextField()
  27. pageTextLabel.isEditable = false
  28. pageTextLabel.isBordered = false
  29. pageTextLabel.isSelectable = false
  30. pageTextLabel.drawsBackground = false
  31. pageTextLabel.font = NSFont.systemFont(ofSize: 14)
  32. pageTextLabel.textColor = NSColor(hex: "#252629")
  33. return pageTextLabel
  34. }()
  35. lazy var pageSizeTextLabel : NSTextField = {
  36. let pageSizeTextLabel = NSTextField()
  37. pageSizeTextLabel.isEditable = false
  38. pageSizeTextLabel.isBordered = false
  39. pageSizeTextLabel.drawsBackground = false
  40. pageSizeTextLabel.font = NSFont.systemFont(ofSize: 14)
  41. pageSizeTextLabel.textColor = NSColor(hex: "#252629")
  42. return pageSizeTextLabel
  43. }()
  44. lazy var pageView = KMPDFThumbnialPageView()
  45. var page : CPDFPage = CPDFPage()
  46. var thumbnailView : KMPDFThumbnailView = KMPDFThumbnailView()
  47. override init(nibName nibNameOrNil: NSNib.Name?, bundle nibBundleOrNil: Bundle?) {
  48. super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
  49. }
  50. required init?(coder: NSCoder) {
  51. fatalError("init(coder:) has not been implemented")
  52. }
  53. override func viewDidLoad() {
  54. super.viewDidLoad()
  55. self.view.addSubview(self.pageBox)
  56. self.view.wantsLayer = true
  57. self.view.layer?.cornerRadius = 8.0
  58. self.view.layer?.masksToBounds = true
  59. self.view.layer?.borderWidth = 1.0
  60. self.isSelected = false
  61. self.pageBox.addSubview(pageView)
  62. self.view.addSubview(self.textBox)
  63. self.textBox.addSubview(self.pageTextLabel)
  64. self.textBox.addSubview(self.pageSizeTextLabel)
  65. self.commonInitializer()
  66. }
  67. func commonInitializer() {
  68. let trackingArea: NSTrackingArea = NSTrackingArea(
  69. rect: self.view.bounds,
  70. options: [.mouseEnteredAndExited, .activeInActiveApp, .mouseMoved],
  71. owner: self,
  72. userInfo: nil
  73. )
  74. self.view.addTrackingArea(trackingArea)
  75. }
  76. //MARK: Accessors
  77. override var isSelected: Bool {
  78. get {
  79. return super.isSelected
  80. }
  81. set {
  82. super.isSelected = newValue
  83. if (newValue) {
  84. self.view.layer?.backgroundColor = NSColor(hex: "#CED0D4", alpha: 0.6).cgColor
  85. self.view.layer?.borderColor = NSColor(hex: "#CED0D4").cgColor
  86. } else {
  87. self.view.layer?.backgroundColor = NSColor.clear.cgColor
  88. self.view.layer?.borderColor = NSColor.clear.cgColor
  89. }
  90. }
  91. }
  92. func setPage(page:CPDFPage!) {
  93. self.page = page
  94. self.pageView.page = page
  95. let index = page.document.index(for: page) + 1
  96. self.pageTextLabel.stringValue = "\(index)"
  97. let bounds = self.page.bounds
  98. if page.rotation == 90 || page.rotation == 270 {
  99. self.pageSizeTextLabel.stringValue = "\(Int(bounds.size.height))*\(Int(bounds.size.width)) mm"
  100. } else {
  101. self.pageSizeTextLabel.stringValue = "\(Int(bounds.size.width))*\(Int(bounds.size.height)) mm"
  102. }
  103. self.updateFrame()
  104. }
  105. class func sizeToFit(size:NSSize,page:CPDFPage,isShow:Bool) -> CGFloat {
  106. var height = 0
  107. var bounds = page.bounds
  108. let transform = page.transform()
  109. bounds = bounds.applying(transform)
  110. var newSize = CGSize(width: size.width, height: size.height)
  111. if bounds.size.width > bounds.size.height {
  112. newSize.height = size.width * bounds.size.height / bounds.size.width
  113. } else {
  114. newSize.width = size.height * bounds.size.width / bounds.size.height
  115. }
  116. height = height + Int(size.height) + pageBoxBorder
  117. if isShow {
  118. height = height + 30 + textBoxSpace
  119. } else {
  120. height = height + 15 + textBoxSpace
  121. }
  122. return CGFloat(height)
  123. }
  124. func updateFrame () {
  125. let viewWidth: CGFloat = NSWidth(self.view.bounds)
  126. let viewHeight: CGFloat = NSHeight(self.view.bounds)
  127. let border: CGFloat = CGFloat(pageBoxBorder)
  128. var bounds = self.page.bounds
  129. let transform = self.page.transform()
  130. bounds = bounds.applying(transform)
  131. var size = self.thumbnailView.thumbnailSzie
  132. if bounds.size.width > bounds.size.height {
  133. if (bounds.size.width > 0) {
  134. size.height = size.width * bounds.size.height / bounds.size.width
  135. }
  136. } else {
  137. if (bounds.size.height > 0) {
  138. size.width = size.height * bounds.size.width / bounds.size.height
  139. }
  140. }
  141. size.width = size.width + CGFloat(border)
  142. size.height = size.height + CGFloat(border)
  143. let height = textLabelHeight
  144. let labelSize = NSMakeSize(size.width, CGFloat(MAXFLOAT))
  145. if self.thumbnailView.isShowPageSize == false {
  146. let pageTextLabelSize = self.pageTextLabel.sizeThatFits(labelSize)
  147. self.pageSizeTextLabel.sizeToFit()
  148. let pageSizeTextLabelSize = self.pageSizeTextLabel.frame.size
  149. let width = max(pageTextLabelSize.width, pageSizeTextLabelSize.width) + 5
  150. self.pageSizeTextLabel.isHidden = false
  151. self.pageSizeTextLabel.frame = NSMakeRect((width - pageSizeTextLabelSize.width) / 2.0, 6, pageSizeTextLabelSize.width, CGFloat(height));
  152. self.pageTextLabel.frame = NSMakeRect((width - pageTextLabelSize.width) / 2.0, self.pageSizeTextLabel.frame.maxY+5, pageTextLabelSize.width, CGFloat(height));
  153. let textBoxHeight: CGFloat = 44
  154. self.textBox.frame = NSMakeRect((self.view.frame.size.width - width) / 2.0, CGFloat(textBoxSpace), width, textBoxHeight)
  155. } else {
  156. let pageTextLabelSize = self.pageTextLabel.sizeThatFits(labelSize)
  157. let width = pageTextLabelSize.width + 5
  158. self.pageSizeTextLabel.isHidden = true
  159. self.pageTextLabel.frame = NSMakeRect((width - pageTextLabelSize.width) / 2.0, 6, pageTextLabelSize.width, CGFloat(height));
  160. let textBoxHeight: CGFloat = 22
  161. self.textBox.frame = NSMakeRect((self.view.frame.size.width - width) / 2.0, CGFloat(textBoxSpace), width, textBoxHeight)
  162. }
  163. let margin: CGFloat = 16
  164. let pageBoxY: CGFloat = self.textBox.frame.maxY+5
  165. let pageBoxW: CGFloat = viewWidth-margin*2
  166. let pageBoxH: CGFloat = viewHeight-pageBoxY-margin
  167. self.pageBox.frame = NSMakeRect(margin, pageBoxY, pageBoxW, pageBoxH)
  168. let pageX: CGFloat = (NSWidth(self.pageBox.frame)-size.width)*0.5
  169. let pageY: CGFloat = (NSHeight(self.pageBox.frame)-size.height)*0.5
  170. self.pageView.frame = NSMakeRect(pageX, pageY, size.width, size.height)
  171. }
  172. override func mouseExited(with event: NSEvent) {
  173. super.mouseExited(with: event)
  174. if self.isSelected {
  175. } else {
  176. self.view.layer?.backgroundColor = NSColor.clear.cgColor
  177. self.view.layer?.borderColor = NSColor.clear.cgColor
  178. }
  179. }
  180. override func mouseEntered(with event: NSEvent) {
  181. super.mouseEntered(with: event)
  182. if self.isSelected {
  183. } else {
  184. self.view.layer?.backgroundColor = NSColor(hex: "#CED0D4", alpha: 0.6).cgColor
  185. self.view.layer?.borderColor = NSColor.clear.cgColor
  186. }
  187. }
  188. override func mouseMoved(with event: NSEvent) {
  189. super.mouseMoved(with: event)
  190. }
  191. }