KMRightSideController.swift 22 KB

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