KMRightSideController.swift 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. //
  2. // KMRightSideController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by Niehaoyu on 2024/11/12.
  6. //
  7. import Cocoa
  8. import KMComponentLibrary
  9. @objc protocol KMRightSideControllerDelegate: AnyObject {
  10. @objc optional func kmRightSideControllerDidContendVCUpdated(_ controller: KMRightSideController)
  11. }
  12. class KMRightSideController: NSViewController {
  13. @IBOutlet var contendView: NSView!
  14. @IBOutlet var contendLeftDivider: ComponentDivider!
  15. @IBOutlet var headerBGView: NSView!
  16. @IBOutlet var titleLabel: NSTextField!
  17. @IBOutlet var headerRightButton: ComponentButton!
  18. @IBOutlet var infoContendView: NSView!
  19. @IBOutlet var emptyView: ComponentEmpty!
  20. var pdfView: CPDFListView?
  21. var viewManager: KMPDFViewManager?
  22. //Controller
  23. //Markup
  24. var highlight_Controller: KMHighlightController?
  25. var note_Controller: KMNoteController?
  26. var pen_Controller: KMPenController?
  27. var eraser_Controller: KMEraserController?
  28. //Edit
  29. var edit_textController: KMEditPDFTextPropertyViewController?
  30. var edit_imageController: KMEditImageController?
  31. var edit_linkController: KMLinkViewController?
  32. var edit_cropController: KMCropPropertyController?
  33. //Form
  34. //Fill
  35. //
  36. var contentViewController: NSViewController?
  37. weak open var delegate: KMRightSideControllerDelegate?
  38. //MARK: - func
  39. override func viewDidLoad() {
  40. super.viewDidLoad()
  41. // Do view setup here.
  42. setupUI()
  43. setupContentController()
  44. }
  45. //MARK: - Get
  46. func checkMultiAnnotation() -> Bool {
  47. var exitMulitAnnotation: Bool = false //判断是否存在不同类型注释
  48. let annotations: [CPDFAnnotation] = self.pdfView?.activeAnnotations as? [CPDFAnnotation] ?? []
  49. if annotations.count == 0 {
  50. exitMulitAnnotation = true //空状态先暂时判断为多种注释。
  51. } else {
  52. for annotationA in annotations {
  53. var markupType: CPDFMarkupType = .highlight
  54. if annotationA is CPDFMarkupAnnotation {
  55. markupType = (annotationA as! CPDFMarkupAnnotation).markupType()
  56. }
  57. for annotationB in annotations {
  58. if annotationA != annotationB {
  59. if annotationA.className != annotationB.className {
  60. exitMulitAnnotation = true
  61. break
  62. } else {
  63. if annotationB is CPDFMarkupAnnotation {
  64. let markupAnnotation = (annotationB as! CPDFMarkupAnnotation)
  65. if markupAnnotation.markupType() != markupType {
  66. exitMulitAnnotation = true
  67. break
  68. }
  69. }
  70. }
  71. }
  72. if exitMulitAnnotation == true {
  73. break
  74. }
  75. }
  76. }
  77. }
  78. return exitMulitAnnotation
  79. }
  80. //MARK: - Set
  81. func setupUI() {
  82. contendView.wantsLayer = true
  83. contendView.layer?.backgroundColor = ComponentLibrary.shared.getComponentColorFromKey("colorBg/layout-middle").cgColor
  84. contendLeftDivider.properties = ComponentDividerProperty(type: .vertical)
  85. titleLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/2")
  86. titleLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-m-bold")
  87. emptyView.properties = ComponentEmptyProperty(emptyType: .noWatermark, text: KMLocalizedString("No identical attributes"), subText: "")
  88. }
  89. func setEmptyView(isHidden hidden: Bool) {
  90. if hidden {
  91. infoContendView.isHidden = false
  92. headerBGView.isHidden = false
  93. emptyView.isHidden = true
  94. } else {
  95. headerBGView.isHidden = true
  96. infoContendView.isHidden = true
  97. emptyView.isHidden = false
  98. }
  99. }
  100. func updateTitleLabel() {
  101. let subToolMode = viewManager?.subToolMode ?? .None
  102. if viewManager?.toolMode == .Markup {
  103. if subToolMode != .None {
  104. if subToolMode == .Highlight {
  105. titleLabel.stringValue = KMLocalizedString("Highlight")
  106. } else if subToolMode == .Underline {
  107. } else if subToolMode == .Waveline {
  108. } else if subToolMode == .Strikethrough {
  109. } else if subToolMode == .Text {
  110. } else if subToolMode == .Note {
  111. } else if subToolMode == .Pen {
  112. } else if subToolMode == .Eraser {
  113. titleLabel.stringValue = KMLocalizedString("Eraser")
  114. } else if subToolMode == .Rectangle {
  115. } else if subToolMode == .Circle {
  116. } else if subToolMode == .Arrow {
  117. } else if subToolMode == .Line {
  118. } else if subToolMode == .Stamp {
  119. } else if subToolMode == .Sign {
  120. }
  121. }
  122. } else if viewManager?.toolMode == .Edit {
  123. if subToolMode == .Edit_text {
  124. titleLabel.stringValue = KMLocalizedString("Text")
  125. } else if subToolMode == .Edit_Image {
  126. titleLabel.stringValue = KMLocalizedString("Image")
  127. } else if subToolMode == .Edit_Link {
  128. titleLabel.stringValue = KMLocalizedString("Link")
  129. } else if subToolMode == .Edit_Crop {
  130. titleLabel.stringValue = KMLocalizedString("Crop")
  131. } else {
  132. if pdfView?.km_EditingAreas().isEmpty == true {
  133. } else if pdfView?.km_editingImageAreas().isEmpty == true && pdfView?.km_editingTextAreas().isEmpty == false {
  134. //编辑文字
  135. titleLabel.stringValue = KMLocalizedString("Text")
  136. } else if pdfView?.km_editingImageAreas().isEmpty == false && pdfView?.km_editingTextAreas().isEmpty == true {
  137. //编辑图片
  138. titleLabel.stringValue = KMLocalizedString("Image")
  139. } else {
  140. //多选
  141. }
  142. }
  143. }
  144. }
  145. func setupContentController() {
  146. updateTitleLabel()
  147. contentViewController?.view.removeFromSuperview()
  148. contentViewController = nil
  149. setEmptyView(isHidden: true)
  150. let toolMode = viewManager?.toolMode ?? .None
  151. let subToolMode = viewManager?.subToolMode ?? .None
  152. let annotations: [CPDFAnnotation] = self.pdfView?.activeAnnotations as? [CPDFAnnotation] ?? []
  153. if toolMode == .Edit {
  154. //MARK: -Edit编辑
  155. setEmptyView(isHidden: true)
  156. if subToolMode != .None {
  157. if subToolMode == .Edit_text {
  158. if pdfView?.km_editingImageAreas().isEmpty == true && pdfView?.km_editingTextAreas().isEmpty == false {
  159. //编辑文字
  160. if edit_textController == nil {
  161. edit_textController = KMEditPDFTextPropertyViewController.init()
  162. }
  163. edit_textController?.pdfView = self.pdfView
  164. contentViewController = edit_textController
  165. }
  166. } else if subToolMode == .Edit_Image {
  167. } else if subToolMode == .Edit_Link {
  168. //链接
  169. if edit_linkController == nil {
  170. edit_linkController = KMLinkViewController.init()
  171. }
  172. edit_linkController?.pdfView = self.pdfView
  173. contentViewController = edit_linkController
  174. } else if subToolMode == .Edit_Crop {
  175. if edit_cropController == nil {
  176. edit_cropController = KMCropPropertyController.init()
  177. }
  178. contentViewController = edit_cropController
  179. }
  180. } else {
  181. if pdfView?.km_EditingAreas().isEmpty == true {
  182. //未选中文字跟图片
  183. setEmptyView(isHidden: false)
  184. } else if pdfView?.km_editingImageAreas().isEmpty == true && pdfView?.km_editingTextAreas().isEmpty == false {
  185. //编辑文字
  186. if edit_textController == nil {
  187. edit_textController = KMEditPDFTextPropertyViewController.init()
  188. }
  189. edit_textController?.pdfView = self.pdfView
  190. contentViewController = edit_textController
  191. } else if pdfView?.km_editingImageAreas().isEmpty == false && pdfView?.km_editingTextAreas().isEmpty == true {
  192. //编辑图片
  193. if edit_imageController == nil {
  194. edit_imageController = KMEditImageController.init()
  195. }
  196. contentViewController = edit_imageController
  197. } else if pdfView?.km_editingImageAreas().isEmpty == false && pdfView?.km_editingTextAreas().isEmpty == false {
  198. //混选
  199. setEmptyView(isHidden: false)
  200. }
  201. }
  202. } else {
  203. let exitMulitAnnotation = self.checkMultiAnnotation()
  204. if exitMulitAnnotation == true {
  205. setEmptyView(isHidden: false)
  206. return
  207. }
  208. if annotations.count == 0 {
  209. return
  210. }
  211. let firstAnnotation = annotations.first
  212. if firstAnnotation is CPDFMarkupAnnotation {
  213. if highlight_Controller == nil {
  214. highlight_Controller = KMHighlightController.init()
  215. }
  216. highlight_Controller?.pdfView = self.pdfView
  217. contentViewController = highlight_Controller
  218. } else if firstAnnotation is CPDFTextAnnotation {
  219. if note_Controller == nil {
  220. note_Controller = KMNoteController.init()
  221. }
  222. note_Controller?.pdfView = self.pdfView
  223. contentViewController = note_Controller
  224. } else if firstAnnotation is CPDFInkAnnotation {
  225. if pen_Controller == nil {
  226. pen_Controller = KMPenController.init()
  227. }
  228. pen_Controller?.pdfView = self.pdfView
  229. contentViewController = pen_Controller
  230. }
  231. }
  232. if let contendVC = contentViewController {
  233. contendVC.view.frame = infoContendView.bounds
  234. contendVC.view.autoresizingMask = [.width, .height]
  235. infoContendView.addSubview(contendVC.view)
  236. delegate?.kmRightSideControllerDidContendVCUpdated?(self)
  237. }
  238. }
  239. func reloadData() {
  240. let toolMode = viewManager?.toolMode ?? .None
  241. let subToolMode = viewManager?.subToolMode ?? .None
  242. let annotations: [CPDFAnnotation] = self.pdfView?.activeAnnotations as? [CPDFAnnotation] ?? []
  243. if (contentViewController is KMHighlightController) {
  244. (contentViewController as? KMHighlightController)?.reloadData()
  245. } else if (contentViewController is KMNoteController) {
  246. (contentViewController as? KMNoteController)?.reloadData()
  247. } else if (contentViewController is KMPenController) {
  248. (contentViewController as? KMPenController)?.reloadData()
  249. }
  250. if toolMode == .Markup {
  251. if (subToolMode == .Highlight ||
  252. subToolMode == .Underline ||
  253. subToolMode == .Waveline ||
  254. subToolMode == .Strikethrough) && (contentViewController is KMHighlightController) {
  255. (contentViewController as? KMHighlightController)?.reloadData()
  256. }
  257. } else if toolMode == .Edit {
  258. //图片&文字
  259. if pdfView?.km_EditingAreas().isEmpty == true {
  260. } else if pdfView?.km_editingImageAreas().isEmpty == true && pdfView?.km_editingTextAreas().isEmpty == false {
  261. //编辑文字
  262. edit_textController?.pdfView = self.pdfView
  263. edit_textController?.reloadData()
  264. } else if pdfView?.km_editingImageAreas().isEmpty == false && pdfView?.km_editingTextAreas().isEmpty == true {
  265. //编辑图片
  266. edit_imageController?.pdfView = self.pdfView
  267. edit_imageController?.reloadData()
  268. } else {
  269. //多选
  270. }
  271. //Link
  272. if viewManager?.subToolMode == .Edit_Link && (contentViewController is KMLinkViewController) {
  273. if (contentViewController as! KMLinkViewController).pdfView != self.pdfView {
  274. (contentViewController as! KMLinkViewController).pdfView = self.pdfView
  275. }
  276. var linkAnnotations: [CPDFLinkAnnotation] = []
  277. for annotation in annotations {
  278. if annotation is CPDFLinkAnnotation {
  279. linkAnnotations.append((annotation as! CPDFLinkAnnotation))
  280. }
  281. }
  282. (contentViewController as! KMLinkViewController).annotations = linkAnnotations
  283. (contentViewController as! KMLinkViewController).reloadData()
  284. } else if viewManager?.subToolMode == .Edit_Crop && (contentViewController is KMCropPropertyController) {
  285. (contentViewController as! KMCropPropertyController).reloadData()
  286. }
  287. }
  288. }
  289. public func reloadDataWithPDFView(pdfView: CPDFListView) {
  290. self.pdfView = pdfView
  291. setupContentController()
  292. reloadData()
  293. }
  294. //MARK: - 重新刷新编辑中内容
  295. public func reloadEditingAreas() {
  296. if contentViewController is KMEditPDFTextPropertyViewController {
  297. (contentViewController as! KMEditPDFTextPropertyViewController).reloadData()
  298. } else if contentViewController is KMEditImageController {
  299. (contentViewController as! KMEditImageController).reloadData()
  300. }
  301. }
  302. //MARK: - 裁剪模式下刷新文档
  303. public func reloadCropDocument(_ pdfview: CPDFListView?) {
  304. if viewManager?.subToolMode == .Edit_Crop && (contentViewController is KMCropPropertyController) {
  305. (contentViewController as! KMCropPropertyController).pdfView = pdfview
  306. (contentViewController as! KMCropPropertyController).reloadData()
  307. }
  308. }
  309. }