KMRightSideController.swift 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574
  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. infoContendView.isHidden = false
  69. headerBGView.isHidden = false
  70. emptyView.isHidden = true
  71. }
  72. func updateTitleLabel() {
  73. let subToolMode = viewManager?.subToolMode ?? .None
  74. let annotations: [CPDFAnnotation] = self.pdfView?.activeAnnotations as? [CPDFAnnotation] ?? []
  75. var firstAnnotation: CPDFAnnotation?
  76. if let firstObject = annotations.first {
  77. firstAnnotation = firstObject
  78. }
  79. titleLabel.stringValue = ""
  80. if contentViewController is KMHighlightController {
  81. titleLabel.stringValue = KMLocalizedString("Highlight")
  82. if let annotation = firstAnnotation, annotation is CPDFMarkupAnnotation {
  83. let markupAnnotation = firstAnnotation as! CPDFMarkupAnnotation
  84. if markupAnnotation.markupType() == .underline {
  85. titleLabel.stringValue = KMLocalizedString("Underline")
  86. } else if markupAnnotation.markupType() == .squiggly {
  87. titleLabel.stringValue = KMLocalizedString("Wavyline")
  88. } else if markupAnnotation.markupType() == .strikeOut {
  89. titleLabel.stringValue = KMLocalizedString("Strikethrough")
  90. }
  91. } else {
  92. if viewManager?.subToolMode == .Underline {
  93. titleLabel.stringValue = KMLocalizedString("Underline")
  94. } else if viewManager?.subToolMode == .Waveline {
  95. titleLabel.stringValue = KMLocalizedString("Wavyline")
  96. } else if viewManager?.subToolMode == .Strikethrough {
  97. titleLabel.stringValue = KMLocalizedString("Strikethrough")
  98. }
  99. }
  100. } else if (contentViewController is KMNoteController) {
  101. titleLabel.stringValue = KMLocalizedString("Note")
  102. } else if (contentViewController is KMPenController) {
  103. titleLabel.stringValue = KMLocalizedString("Pen")
  104. } else if (contentViewController is KMEraserController) {
  105. titleLabel.stringValue = KMLocalizedString("Eraser")
  106. } else if (contentViewController is KMLineController) {
  107. if let annotation = firstAnnotation, annotation is CPDFLineAnnotation {
  108. let lineAnnotation = firstAnnotation as! CPDFLineAnnotation
  109. if lineAnnotation.type == "Line" {
  110. titleLabel.stringValue = KMLocalizedString("Line")
  111. } else if lineAnnotation.type == "Arrow" {
  112. titleLabel.stringValue = KMLocalizedString("Arrow")
  113. }
  114. } else if subToolMode == .Arrow {
  115. titleLabel.stringValue = KMLocalizedString("Arrow")
  116. } else if subToolMode == .Line {
  117. titleLabel.stringValue = KMLocalizedString("Line")
  118. }
  119. } else if (contentViewController is KMRectangleController) {
  120. if let annotation = firstAnnotation, annotation is CPDFSquareAnnotation {
  121. titleLabel.stringValue = KMLocalizedString("Rectangle")
  122. } else if let annotation = firstAnnotation, annotation is CPDFCircleAnnotation {
  123. titleLabel.stringValue = KMLocalizedString("Circle")
  124. } else if subToolMode == .Rectangle {
  125. titleLabel.stringValue = KMLocalizedString("Rectangle")
  126. } else if subToolMode == .Circle {
  127. titleLabel.stringValue = KMLocalizedString("Circle")
  128. }
  129. } else if (contentViewController is KMTextBoxController) {
  130. titleLabel.stringValue = KMLocalizedString("Text Box")
  131. } else if (contentViewController is KMEditPDFTextPropertyViewController) {
  132. titleLabel.stringValue = KMLocalizedString("Text")
  133. } else if (contentViewController is KMEditImageController) {
  134. titleLabel.stringValue = KMLocalizedString("Image")
  135. } else if (contentViewController is KMLinkViewController) {
  136. titleLabel.stringValue = KMLocalizedString("Link")
  137. } else if (contentViewController is KMCropPropertyController) {
  138. titleLabel.stringValue = KMLocalizedString("Crop")
  139. } else if (contentViewController is KMStampListController) || (contentViewController is KMStampController) {
  140. titleLabel.stringValue = KMLocalizedString("Stamp")
  141. } else if (contentViewController is KMSignatureListController) || (contentViewController is KMSignatureController) {
  142. titleLabel.stringValue = KMLocalizedString("Sign")
  143. } else if (contentViewController is KMMeasureController) {
  144. titleLabel.stringValue = KMLocalizedString("Measure")
  145. }
  146. }
  147. //MARK: - Setup
  148. func setupContentController() {
  149. /**
  150. Case1:选中指定模式:显示指定模式的属性设置界面,例如橡皮擦。
  151. Case2:未选中模式:根据选中的注释显示指定属性设置界面
  152. 1、筛选出指定模式下对应的右边界面,进行显示。
  153. 2、再判断是否有选中注释,多选不同类型注释时,判断为未选中注释。
  154. 3、判断选中指定类型的注释,或者选中的模式,都展示对应的界面。
  155. */
  156. /**
  157. 只在指定模式下可以选中特定注释:
  158. 编辑模式下:可以选中编辑块跟Link注释
  159. Form模式下:可以选中Form注释
  160. */
  161. contentViewController?.view.removeFromSuperview()
  162. contentViewController = nil
  163. setEmptyView(isHidden: true)
  164. let toolMode = viewManager?.toolMode ?? .None
  165. let subToolMode = viewManager?.subToolMode ?? .None
  166. let annotations: [CPDFAnnotation] = self.pdfView?.activeAnnotations as? [CPDFAnnotation] ?? []
  167. if toolMode == .Edit {
  168. //MARK: -Edit编辑
  169. setEmptyView(isHidden: true)
  170. if subToolMode != .None {
  171. if subToolMode == .Edit_text {
  172. if pdfView?.km_editingImageAreas().isEmpty == true && pdfView?.km_editingTextAreas().isEmpty == false {
  173. //编辑文字
  174. if edit_textController == nil {
  175. edit_textController = KMEditPDFTextPropertyViewController.init()
  176. }
  177. edit_textController?.pdfView = self.pdfView
  178. contentViewController = edit_textController
  179. }
  180. } else if subToolMode == .Edit_Image {
  181. } else if subToolMode == .Edit_Link {
  182. //链接
  183. if edit_linkController == nil {
  184. edit_linkController = KMLinkViewController.init()
  185. }
  186. edit_linkController?.pdfView = self.pdfView
  187. contentViewController = edit_linkController
  188. } else if subToolMode == .Edit_Crop {
  189. if edit_cropController == nil {
  190. edit_cropController = KMCropPropertyController.init()
  191. }
  192. contentViewController = edit_cropController
  193. }
  194. } else {
  195. if pdfView?.km_EditingAreas().isEmpty == true {
  196. //未选中文字跟图片
  197. setEmptyView(isHidden: false)
  198. } else if pdfView?.km_editingImageAreas().isEmpty == true && pdfView?.km_editingTextAreas().isEmpty == false {
  199. //编辑文字
  200. if edit_textController == nil {
  201. edit_textController = KMEditPDFTextPropertyViewController.init()
  202. }
  203. edit_textController?.pdfView = self.pdfView
  204. contentViewController = edit_textController
  205. } else if pdfView?.km_editingImageAreas().isEmpty == false && pdfView?.km_editingTextAreas().isEmpty == true {
  206. //编辑图片
  207. if edit_imageController == nil {
  208. edit_imageController = KMEditImageController.init()
  209. }
  210. contentViewController = edit_imageController
  211. } else if pdfView?.km_editingImageAreas().isEmpty == false && pdfView?.km_editingTextAreas().isEmpty == false {
  212. //混选
  213. setEmptyView(isHidden: false)
  214. }
  215. }
  216. } else if toolMode == .Form {
  217. } else {
  218. let exitMulitAnnotation = pdfView?.isMultiAnnotation(annotations)
  219. if exitMulitAnnotation == true {
  220. setEmptyView(isHidden: false)
  221. return
  222. }
  223. var firstAnnotation: CPDFAnnotation?
  224. if annotations.count > 0 {
  225. firstAnnotation = annotations.first
  226. }
  227. if viewManager?.viewToolsType == .Content_Selection {
  228. if edit_cropController == nil {
  229. edit_cropController = KMCropPropertyController.init()
  230. }
  231. contentViewController = edit_cropController
  232. } else if firstAnnotation is CPDFMarkupAnnotation || subToolMode == .Highlight || subToolMode == .Underline || subToolMode == .Waveline || subToolMode == .Strikethrough {
  233. if highlight_Controller == nil {
  234. highlight_Controller = KMHighlightController.init()
  235. }
  236. highlight_Controller?.pdfView = self.pdfView
  237. contentViewController = highlight_Controller
  238. } else if firstAnnotation is CPDFFreeTextAnnotation || subToolMode == .Text {
  239. if freeText_Controller == nil {
  240. freeText_Controller = KMTextBoxController.init()
  241. }
  242. freeText_Controller?.pdfView = self.pdfView
  243. contentViewController = freeText_Controller
  244. } else if firstAnnotation is CPDFTextAnnotation || subToolMode == .Note {
  245. if note_Controller == nil {
  246. note_Controller = KMNoteController.init()
  247. }
  248. note_Controller?.pdfView = self.pdfView
  249. contentViewController = note_Controller
  250. } else if firstAnnotation is CPDFInkAnnotation || subToolMode == .Pen {
  251. if pen_Controller == nil {
  252. pen_Controller = KMPenController.init()
  253. }
  254. pen_Controller?.pdfView = self.pdfView
  255. contentViewController = pen_Controller
  256. } else if subToolMode == .Eraser {
  257. if eraser_Controller == nil {
  258. eraser_Controller = KMEraserController.init()
  259. }
  260. contentViewController = eraser_Controller
  261. } else if firstAnnotation is CPDFCircleAnnotation || firstAnnotation is CPDFSquareAnnotation || subToolMode == .Rectangle || subToolMode == .Circle {
  262. if rectangle_Controller == nil {
  263. rectangle_Controller = KMRectangleController.init()
  264. }
  265. rectangle_Controller?.pdfView = self.pdfView
  266. contentViewController = rectangle_Controller
  267. } else if firstAnnotation is CPDFLineAnnotation || subToolMode == .Line || subToolMode == .Arrow {
  268. if line_Controller == nil {
  269. line_Controller = KMLineController.init()
  270. }
  271. line_Controller?.pdfView = self.pdfView
  272. contentViewController = line_Controller
  273. } else if firstAnnotation is CPDFStampAnnotation {
  274. if stamp_Controller == nil {
  275. stamp_Controller = KMStampController.init()
  276. }
  277. stamp_Controller?.pdfView = self.pdfView
  278. contentViewController = stamp_Controller
  279. } else if subToolMode == .Stamp {
  280. if stamplist_Controller == nil {
  281. stamplist_Controller = KMStampListController.init()
  282. stamplist_Controller?.delegate = self
  283. }
  284. stamplist_Controller?.pdfView = self.pdfView
  285. contentViewController = stamplist_Controller
  286. } else if firstAnnotation is CPDFSignatureAnnotation {
  287. if signature_Controller == nil {
  288. signature_Controller = KMSignatureController.init()
  289. }
  290. signature_Controller?.pdfView = self.pdfView
  291. contentViewController = signature_Controller
  292. } else if subToolMode == .Sign {
  293. if signatureList_Controller == nil {
  294. signatureList_Controller = KMSignatureListController.init()
  295. }
  296. signatureList_Controller?.pdfView = self.pdfView
  297. contentViewController = signatureList_Controller
  298. } else if subToolMode == .Measure {
  299. if measure_Controller == nil {
  300. measure_Controller = KMMeasureController.init()
  301. }
  302. measure_Controller?.pdfView = self.pdfView
  303. contentViewController = measure_Controller
  304. }
  305. else {
  306. }
  307. }
  308. if let contendVC = contentViewController {
  309. contendVC.view.frame = infoContendView.bounds
  310. contendVC.view.autoresizingMask = [.width, .height]
  311. infoContendView.addSubview(contendVC.view)
  312. delegate?.kmRightSideControllerDidContendVCUpdated?(self)
  313. }
  314. updateTitleLabel()
  315. }
  316. //MARK: - reloadData
  317. func reloadContendTopConst() {
  318. infoContendTopConst.constant = 40
  319. headerBGView.isHidden = false
  320. if contentViewController is KMHighlightController {
  321. if CPDFMarkupAnnotation.isMarkupAnnotationsContainMultiType((contentViewController as! KMHighlightController).getValidAnnotations()) {
  322. infoContendTopConst.constant = 0
  323. headerBGView.isHidden = true
  324. }
  325. } else if contentViewController is KMLineController {
  326. if CPDFLineAnnotation.isLineAnnotationsContainMultiType((contentViewController as! KMLineController).getValidAnnotations()) {
  327. infoContendTopConst.constant = 0
  328. headerBGView.isHidden = true
  329. }
  330. }
  331. }
  332. func reloadTopRightButtonInfo() {
  333. headerRightButton.isHidden = true
  334. if contentViewController is KMStampListController {
  335. let stampListVC = contentViewController as! KMStampListController
  336. if stampListVC.stampType == .dynamic {
  337. headerRightButton.isHidden = false
  338. headerRightButton.properties = ComponentButtonProperty(type: .text_gray, size: .xxs, onlyIcon: true, icon: NSImage(named: "stampDynamic_Setting"), keepPressState: false)
  339. } else if stampListVC.stampType == .custom {
  340. headerRightButton.isHidden = false
  341. headerRightButton.properties = ComponentButtonProperty(type: .text_gray, size: .xxs, onlyIcon: true, icon: NSImage(named: "watermark_template_add"), keepPressState: false)
  342. }
  343. } else if contentViewController is KMSignatureListController {
  344. headerRightButton.isHidden = false
  345. headerRightButton.properties = ComponentButtonProperty(type: .text_gray, size: .xxs, onlyIcon: true, icon: NSImage(named: "watermark_template_add"), keepPressState: false)
  346. }
  347. headerRightButton.setTarget(self, action: #selector(headerRightButtonClicked(_:)))
  348. }
  349. func reloadData() {
  350. let toolMode = viewManager?.toolMode ?? .None
  351. let subToolMode = viewManager?.subToolMode ?? .None
  352. let annotations: [CPDFAnnotation] = self.pdfView?.activeAnnotations as? [CPDFAnnotation] ?? []
  353. if (contentViewController is KMHighlightController) {
  354. (contentViewController as? KMHighlightController)?.viewManager = viewManager
  355. (contentViewController as? KMHighlightController)?.reloadData()
  356. } else if (contentViewController is KMNoteController) {
  357. (contentViewController as? KMNoteController)?.reloadData()
  358. } else if (contentViewController is KMPenController) {
  359. (contentViewController as? KMPenController)?.reloadData()
  360. } else if (contentViewController is KMEraserController) {
  361. (contentViewController as? KMEraserController)?.reloadData()
  362. } else if (contentViewController is KMLineController) {
  363. (contentViewController as? KMLineController)?.viewManager = viewManager
  364. (contentViewController as? KMLineController)?.reloadData()
  365. } else if (contentViewController is KMRectangleController) {
  366. (contentViewController as? KMRectangleController)?.viewManager = viewManager
  367. (contentViewController as? KMRectangleController)?.reloadData()
  368. } else if (contentViewController is KMTextBoxController) {
  369. (contentViewController as? KMTextBoxController)?.reloadData()
  370. } else if (contentViewController is KMStampController) {
  371. (contentViewController as? KMStampController)?.reloadData()
  372. } else if (contentViewController is KMSignatureListController) {
  373. (contentViewController as? KMSignatureListController)?.reloadData()
  374. }
  375. if toolMode == .Markup {
  376. if (subToolMode == .Highlight ||
  377. subToolMode == .Underline ||
  378. subToolMode == .Waveline ||
  379. subToolMode == .Strikethrough) && (contentViewController is KMHighlightController) {
  380. (contentViewController as? KMHighlightController)?.reloadData()
  381. }
  382. } else if toolMode == .Edit {
  383. //图片&文字
  384. if pdfView?.km_EditingAreas().isEmpty == true {
  385. } else if pdfView?.km_editingImageAreas().isEmpty == true && pdfView?.km_editingTextAreas().isEmpty == false {
  386. //编辑文字
  387. edit_textController?.pdfView = self.pdfView
  388. edit_textController?.reloadData()
  389. } else if pdfView?.km_editingImageAreas().isEmpty == false && pdfView?.km_editingTextAreas().isEmpty == true {
  390. //编辑图片
  391. edit_imageController?.pdfView = self.pdfView
  392. edit_imageController?.reloadData()
  393. } else {
  394. //多选
  395. }
  396. //Link
  397. if viewManager?.subToolMode == .Edit_Link && (contentViewController is KMLinkViewController) {
  398. if (contentViewController as! KMLinkViewController).pdfView != self.pdfView {
  399. (contentViewController as! KMLinkViewController).pdfView = self.pdfView
  400. }
  401. var linkAnnotations: [CPDFLinkAnnotation] = []
  402. for annotation in annotations {
  403. if annotation is CPDFLinkAnnotation {
  404. linkAnnotations.append((annotation as! CPDFLinkAnnotation))
  405. }
  406. }
  407. (contentViewController as! KMLinkViewController).annotations = linkAnnotations
  408. (contentViewController as! KMLinkViewController).reloadData()
  409. } else if viewManager?.subToolMode == .Edit_Crop && (contentViewController is KMCropPropertyController) {
  410. (contentViewController as! KMCropPropertyController).reloadData()
  411. }
  412. }
  413. reloadContendTopConst()
  414. reloadTopRightButtonInfo()
  415. }
  416. public func reloadDataWithPDFView(pdfView: CPDFListView) {
  417. self.pdfView = pdfView
  418. setupContentController()
  419. reloadData()
  420. }
  421. //MARK: - Action
  422. @objc func headerRightButtonClicked(_ button: ComponentButton) {
  423. if contentViewController is KMStampListController {
  424. let stampListVC = contentViewController as! KMStampListController
  425. if stampListVC.stampType == .dynamic {
  426. stampListVC.showDynamicSetting()
  427. } else if stampListVC.stampType == .custom {
  428. stampListVC.createCustomStamp()
  429. }
  430. } else if contentViewController is KMSignatureListController {
  431. let vc = contentViewController as! KMSignatureListController
  432. vc.createCustomStamp()
  433. }
  434. }
  435. //MARK: - 重新刷新编辑中内容
  436. public func reloadEditingAreas() {
  437. if contentViewController is KMEditPDFTextPropertyViewController {
  438. (contentViewController as! KMEditPDFTextPropertyViewController).reloadData()
  439. } else if contentViewController is KMEditImageController {
  440. (contentViewController as! KMEditImageController).reloadData()
  441. }
  442. }
  443. //MARK: - 裁剪模式下刷新文档
  444. public func reloadCropDocument(_ pdfview: CPDFListView?) {
  445. if viewManager?.subToolMode == .Edit_Crop && (contentViewController is KMCropPropertyController) {
  446. (contentViewController as! KMCropPropertyController).pdfView = pdfview
  447. (contentViewController as! KMCropPropertyController).reloadData()
  448. }
  449. }
  450. }
  451. extension KMRightSideController: KMStampListControllerDelegate {
  452. func kmStampListControllerDidStampTypeUpdated(_ controller: KMStampListController) {
  453. reloadTopRightButtonInfo()
  454. }
  455. }