KMRightSideController.swift 19 KB

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