KMRightSideController.swift 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  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. var rectangle_Controller: KMRectangleController?
  29. var line_Controller: KMLineController?
  30. var freeText_Controller: KMTextBoxController?
  31. //Edit
  32. var edit_textController: KMEditPDFTextPropertyViewController?
  33. var edit_imageController: KMEditImageController?
  34. var edit_linkController: KMLinkViewController?
  35. var edit_cropController: KMCropPropertyController?
  36. //Form
  37. //Fill
  38. //
  39. var contentViewController: NSViewController?
  40. weak open var delegate: KMRightSideControllerDelegate?
  41. //MARK: - func
  42. override func viewDidLoad() {
  43. super.viewDidLoad()
  44. // Do view setup here.
  45. setupUI()
  46. setupContentController()
  47. }
  48. //MARK: - Get
  49. func checkMultiAnnotation() -> Bool {
  50. var exitMulitAnnotation: Bool = false //判断是否存在不同类型注释
  51. let annotations: [CPDFAnnotation] = self.pdfView?.activeAnnotations as? [CPDFAnnotation] ?? []
  52. if annotations.count == 0 {
  53. exitMulitAnnotation = true //空状态先暂时判断为多种注释。
  54. } else {
  55. for annotationA in annotations {
  56. var markupType: CPDFMarkupType = .highlight
  57. if annotationA is CPDFMarkupAnnotation {
  58. markupType = (annotationA as! CPDFMarkupAnnotation).markupType()
  59. }
  60. for annotationB in annotations {
  61. if annotationA != annotationB {
  62. if annotationA.className != annotationB.className {
  63. exitMulitAnnotation = true
  64. break
  65. } else {
  66. if annotationB is CPDFMarkupAnnotation {
  67. let markupAnnotation = (annotationB as! CPDFMarkupAnnotation)
  68. if markupAnnotation.markupType() != markupType {
  69. exitMulitAnnotation = true
  70. break
  71. }
  72. }
  73. }
  74. }
  75. if exitMulitAnnotation == true {
  76. break
  77. }
  78. }
  79. }
  80. }
  81. return exitMulitAnnotation
  82. }
  83. func getValidAnnotations() -> [CPDFAnnotation] {
  84. return []
  85. }
  86. //MARK: - Set
  87. func setupUI() {
  88. contendView.wantsLayer = true
  89. contendView.layer?.backgroundColor = ComponentLibrary.shared.getComponentColorFromKey("colorBg/layout-middle").cgColor
  90. contendLeftDivider.properties = ComponentDividerProperty(type: .vertical)
  91. titleLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/2")
  92. titleLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-m-bold")
  93. emptyView.properties = ComponentEmptyProperty(emptyType: .noWatermark, text: KMLocalizedString("No identical attributes"), subText: "")
  94. }
  95. func setEmptyView(isHidden hidden: Bool) {
  96. // if hidden {
  97. infoContendView.isHidden = false
  98. headerBGView.isHidden = false
  99. emptyView.isHidden = true
  100. // } else {
  101. // headerBGView.isHidden = true
  102. // infoContendView.isHidden = true
  103. //
  104. // emptyView.isHidden = false
  105. // }
  106. }
  107. func updateTitleLabel() {
  108. let subToolMode = viewManager?.subToolMode ?? .None
  109. let annotations: [CPDFAnnotation] = self.pdfView?.activeAnnotations as? [CPDFAnnotation] ?? []
  110. var firstAnnotation: CPDFAnnotation?
  111. if annotations.count == 1 {
  112. }
  113. titleLabel.stringValue = ""
  114. if viewManager?.toolMode == .Markup {
  115. if subToolMode != .None {
  116. if subToolMode == .Highlight {
  117. titleLabel.stringValue = KMLocalizedString("Highlight")
  118. } else if subToolMode == .Underline {
  119. titleLabel.stringValue = KMLocalizedString("Underline")
  120. } else if subToolMode == .Waveline {
  121. titleLabel.stringValue = KMLocalizedString("Wavyline")
  122. } else if subToolMode == .Strikethrough {
  123. titleLabel.stringValue = KMLocalizedString("Strikethrough")
  124. } else if subToolMode == .Text {
  125. titleLabel.stringValue = KMLocalizedString("Text Box")
  126. } else if subToolMode == .Note {
  127. titleLabel.stringValue = KMLocalizedString("Note")
  128. } else if subToolMode == .Pen {
  129. titleLabel.stringValue = KMLocalizedString("Pen")
  130. } else if subToolMode == .Eraser {
  131. titleLabel.stringValue = KMLocalizedString("Eraser")
  132. } else if subToolMode == .Rectangle {
  133. titleLabel.stringValue = KMLocalizedString("Rectangle")
  134. } else if subToolMode == .Circle {
  135. titleLabel.stringValue = KMLocalizedString("Circle")
  136. } else if subToolMode == .Arrow {
  137. titleLabel.stringValue = KMLocalizedString("Arrow")
  138. } else if subToolMode == .Line {
  139. titleLabel.stringValue = KMLocalizedString("Line")
  140. } else if subToolMode == .Stamp {
  141. titleLabel.stringValue = KMLocalizedString("Stamp")
  142. } else if subToolMode == .Sign {
  143. titleLabel.stringValue = KMLocalizedString("Sign")
  144. }
  145. }
  146. } else if viewManager?.toolMode == .Edit {
  147. if subToolMode == .Edit_text {
  148. titleLabel.stringValue = KMLocalizedString("Text")
  149. } else if subToolMode == .Edit_Image {
  150. titleLabel.stringValue = KMLocalizedString("Image")
  151. } else if subToolMode == .Edit_Link {
  152. titleLabel.stringValue = KMLocalizedString("Link")
  153. } else if subToolMode == .Edit_Crop {
  154. titleLabel.stringValue = KMLocalizedString("Crop")
  155. } else {
  156. if pdfView?.km_EditingAreas().isEmpty == true {
  157. } else if pdfView?.km_editingImageAreas().isEmpty == true && pdfView?.km_editingTextAreas().isEmpty == false {
  158. //编辑文字
  159. titleLabel.stringValue = KMLocalizedString("Text")
  160. } else if pdfView?.km_editingImageAreas().isEmpty == false && pdfView?.km_editingTextAreas().isEmpty == true {
  161. //编辑图片
  162. titleLabel.stringValue = KMLocalizedString("Image")
  163. } else {
  164. //多选
  165. }
  166. }
  167. }
  168. }
  169. func setupContentController() {
  170. /**
  171. Case1:选中指定模式:显示指定模式的属性设置界面
  172. Case2:未选中模式:根据选中的注释显示指定属性设置界面
  173. 1、筛选出指定模式下对应的右边界面,进行显示。
  174. 2、再判断是否有选中注释,多选不同类型注释时,判断为未选中注释。
  175. 3、判断选中指定类型的注释,或者选中的模式,都展示对应的界面。
  176. */
  177. updateTitleLabel()
  178. contentViewController?.view.removeFromSuperview()
  179. contentViewController = nil
  180. setEmptyView(isHidden: true)
  181. let toolMode = viewManager?.toolMode ?? .None
  182. let subToolMode = viewManager?.subToolMode ?? .None
  183. let annotations: [CPDFAnnotation] = self.pdfView?.activeAnnotations as? [CPDFAnnotation] ?? []
  184. if toolMode == .Edit {
  185. //MARK: -Edit编辑
  186. setEmptyView(isHidden: true)
  187. if subToolMode != .None {
  188. if subToolMode == .Edit_text {
  189. if pdfView?.km_editingImageAreas().isEmpty == true && pdfView?.km_editingTextAreas().isEmpty == false {
  190. //编辑文字
  191. if edit_textController == nil {
  192. edit_textController = KMEditPDFTextPropertyViewController.init()
  193. }
  194. edit_textController?.pdfView = self.pdfView
  195. contentViewController = edit_textController
  196. }
  197. } else if subToolMode == .Edit_Image {
  198. } else if subToolMode == .Edit_Link {
  199. //链接
  200. if edit_linkController == nil {
  201. edit_linkController = KMLinkViewController.init()
  202. }
  203. edit_linkController?.pdfView = self.pdfView
  204. contentViewController = edit_linkController
  205. } else if subToolMode == .Edit_Crop {
  206. if edit_cropController == nil {
  207. edit_cropController = KMCropPropertyController.init()
  208. }
  209. contentViewController = edit_cropController
  210. }
  211. } else {
  212. if pdfView?.km_EditingAreas().isEmpty == true {
  213. //未选中文字跟图片
  214. setEmptyView(isHidden: false)
  215. } else if pdfView?.km_editingImageAreas().isEmpty == true && pdfView?.km_editingTextAreas().isEmpty == false {
  216. //编辑文字
  217. if edit_textController == nil {
  218. edit_textController = KMEditPDFTextPropertyViewController.init()
  219. }
  220. edit_textController?.pdfView = self.pdfView
  221. contentViewController = edit_textController
  222. } else if pdfView?.km_editingImageAreas().isEmpty == false && pdfView?.km_editingTextAreas().isEmpty == true {
  223. //编辑图片
  224. if edit_imageController == nil {
  225. edit_imageController = KMEditImageController.init()
  226. }
  227. contentViewController = edit_imageController
  228. } else if pdfView?.km_editingImageAreas().isEmpty == false && pdfView?.km_editingTextAreas().isEmpty == false {
  229. //混选
  230. setEmptyView(isHidden: false)
  231. }
  232. }
  233. } else {
  234. let exitMulitAnnotation = self.checkMultiAnnotation()
  235. if exitMulitAnnotation == true {
  236. setEmptyView(isHidden: false)
  237. return
  238. }
  239. if annotations.count == 0 {
  240. return
  241. }
  242. let firstAnnotation = annotations.first
  243. if firstAnnotation is CPDFMarkupAnnotation {
  244. if highlight_Controller == nil {
  245. highlight_Controller = KMHighlightController.init()
  246. }
  247. highlight_Controller?.pdfView = self.pdfView
  248. contentViewController = highlight_Controller
  249. } else if firstAnnotation is CPDFTextAnnotation {
  250. if note_Controller == nil {
  251. note_Controller = KMNoteController.init()
  252. }
  253. note_Controller?.pdfView = self.pdfView
  254. contentViewController = note_Controller
  255. } else if firstAnnotation is CPDFInkAnnotation {
  256. if pen_Controller == nil {
  257. pen_Controller = KMPenController.init()
  258. }
  259. pen_Controller?.pdfView = self.pdfView
  260. contentViewController = pen_Controller
  261. } else if firstAnnotation is CPDFCircleAnnotation ||
  262. firstAnnotation is CPDFSquareAnnotation {
  263. if rectangle_Controller == nil {
  264. rectangle_Controller = KMRectangleController.init()
  265. }
  266. rectangle_Controller?.pdfView = self.pdfView
  267. contentViewController = rectangle_Controller
  268. } else if firstAnnotation is CPDFLineAnnotation {
  269. if line_Controller == nil {
  270. line_Controller = KMLineController.init()
  271. }
  272. line_Controller?.pdfView = self.pdfView
  273. contentViewController = line_Controller
  274. } else if firstAnnotation is CPDFFreeTextAnnotation {
  275. if freeText_Controller == nil {
  276. freeText_Controller = KMTextBoxController.init()
  277. }
  278. freeText_Controller?.pdfView = self.pdfView
  279. contentViewController = freeText_Controller
  280. }
  281. }
  282. if let contendVC = contentViewController {
  283. contendVC.view.frame = infoContendView.bounds
  284. contendVC.view.autoresizingMask = [.width, .height]
  285. infoContendView.addSubview(contendVC.view)
  286. delegate?.kmRightSideControllerDidContendVCUpdated?(self)
  287. }
  288. }
  289. func reloadData() {
  290. let toolMode = viewManager?.toolMode ?? .None
  291. let subToolMode = viewManager?.subToolMode ?? .None
  292. let annotations: [CPDFAnnotation] = self.pdfView?.activeAnnotations as? [CPDFAnnotation] ?? []
  293. if (contentViewController is KMHighlightController) {
  294. (contentViewController as? KMHighlightController)?.reloadData()
  295. } else if (contentViewController is KMNoteController) {
  296. (contentViewController as? KMNoteController)?.reloadData()
  297. } else if (contentViewController is KMPenController) {
  298. (contentViewController as? KMPenController)?.reloadData()
  299. } else if (contentViewController is KMLineController) {
  300. (contentViewController as? KMLineController)?.reloadData()
  301. } else if (contentViewController is KMRectangleController) {
  302. (contentViewController as? KMRectangleController)?.reloadData()
  303. } else if (contentViewController is KMTextBoxController) {
  304. (contentViewController as? KMTextBoxController)?.reloadData()
  305. }
  306. if toolMode == .Markup {
  307. if (subToolMode == .Highlight ||
  308. subToolMode == .Underline ||
  309. subToolMode == .Waveline ||
  310. subToolMode == .Strikethrough) && (contentViewController is KMHighlightController) {
  311. (contentViewController as? KMHighlightController)?.reloadData()
  312. }
  313. } else if toolMode == .Edit {
  314. //图片&文字
  315. if pdfView?.km_EditingAreas().isEmpty == true {
  316. } else if pdfView?.km_editingImageAreas().isEmpty == true && pdfView?.km_editingTextAreas().isEmpty == false {
  317. //编辑文字
  318. edit_textController?.pdfView = self.pdfView
  319. edit_textController?.reloadData()
  320. } else if pdfView?.km_editingImageAreas().isEmpty == false && pdfView?.km_editingTextAreas().isEmpty == true {
  321. //编辑图片
  322. edit_imageController?.pdfView = self.pdfView
  323. edit_imageController?.reloadData()
  324. } else {
  325. //多选
  326. }
  327. //Link
  328. if viewManager?.subToolMode == .Edit_Link && (contentViewController is KMLinkViewController) {
  329. if (contentViewController as! KMLinkViewController).pdfView != self.pdfView {
  330. (contentViewController as! KMLinkViewController).pdfView = self.pdfView
  331. }
  332. var linkAnnotations: [CPDFLinkAnnotation] = []
  333. for annotation in annotations {
  334. if annotation is CPDFLinkAnnotation {
  335. linkAnnotations.append((annotation as! CPDFLinkAnnotation))
  336. }
  337. }
  338. (contentViewController as! KMLinkViewController).annotations = linkAnnotations
  339. (contentViewController as! KMLinkViewController).reloadData()
  340. } else if viewManager?.subToolMode == .Edit_Crop && (contentViewController is KMCropPropertyController) {
  341. (contentViewController as! KMCropPropertyController).reloadData()
  342. }
  343. }
  344. }
  345. public func reloadDataWithPDFView(pdfView: CPDFListView) {
  346. self.pdfView = pdfView
  347. setupContentController()
  348. reloadData()
  349. }
  350. //MARK: - 重新刷新编辑中内容
  351. public func reloadEditingAreas() {
  352. if contentViewController is KMEditPDFTextPropertyViewController {
  353. (contentViewController as! KMEditPDFTextPropertyViewController).reloadData()
  354. } else if contentViewController is KMEditImageController {
  355. (contentViewController as! KMEditImageController).reloadData()
  356. }
  357. }
  358. //MARK: - 裁剪模式下刷新文档
  359. public func reloadCropDocument(_ pdfview: CPDFListView?) {
  360. if viewManager?.subToolMode == .Edit_Crop && (contentViewController is KMCropPropertyController) {
  361. (contentViewController as! KMCropPropertyController).pdfView = pdfview
  362. (contentViewController as! KMCropPropertyController).reloadData()
  363. }
  364. }
  365. }