KMRightSideController.swift 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862
  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. //OCR
  12. @objc func kmRightSideControllerOCRShowTypeChange(_ controller: KMRightSideController, _ type: KMOCRShowType)
  13. @objc func kmRightSideControllerOCRDoneAction(_ controller: KMRightSideController, _ model: KMOCRModel)
  14. @objc func kmRightSideControllerOCRLanguageChangeAction(_ controller: KMRightSideController, _ model: KMOCRModel)
  15. @objc func kmRightSideControllerRotateLeft(_ annotations: [CPDFStampAnnotation], withPDFView pdfView: CPDFListView?)
  16. @objc func kmRightSideControllerRotateRight(_ annotations: [CPDFStampAnnotation], withPDFView pdfView: CPDFListView?)
  17. @objc func kmRightSideControllerShowMeasureSetting(_ controller: KMRightSideController)
  18. @objc func kmRightSideControllerDidRevertCropInfo(_ controller: KMRightSideController)
  19. }
  20. class KMRightSideController: NSViewController {
  21. @IBOutlet var contendView: NSView!
  22. @IBOutlet var contendLeftDivider: ComponentDivider!
  23. @IBOutlet var headerBGView: NSView!
  24. @IBOutlet var titleLabel: NSTextField!
  25. @IBOutlet var headerRightButton: ComponentButton!
  26. @IBOutlet var infoContendView: NSView!
  27. @IBOutlet var infoContendTopConst: NSLayoutConstraint!
  28. @IBOutlet var infoScrollView: KMScrollView!
  29. @IBOutlet var emptyView: ComponentEmpty!
  30. var pdfView: CPDFListView?
  31. var viewManager: KMPDFViewManager?
  32. //Controller
  33. //Markup
  34. var highlight_Controller: KMHighlightController?
  35. var note_Controller: KMNoteController?
  36. var pen_Controller: KMPenController?
  37. var eraser_Controller: KMEraserController?
  38. var rectangle_Controller: KMRectangleController?
  39. var line_Controller: KMLineController?
  40. var freeText_Controller: KMTextBoxController?
  41. var stamplist_Controller: KMStampListController?
  42. var stamp_Controller: KMStampController?
  43. var signature_Controller: KMSignatureController?
  44. var signatureList_Controller: KMSignatureListController?
  45. var measure_Controller: KMMeasureController?
  46. //Edit
  47. var edit_textController: KMEditPDFTextPropertyViewController?
  48. var edit_imageController: KMEditImageController?
  49. var edit_linkController: KMLinkViewController?
  50. var edit_cropController: KMCropPropertyController?
  51. var edit_alignmentController: KMNAlignmentController?
  52. //Form
  53. var form_fieldController: FormsTextFieldController?
  54. var form_checkBoxController: FormsCheckBoxController?
  55. var form_radioController: FormsRadioController?
  56. var form_listController: FormsListController?
  57. var form_buttonController: FormsButtonController?
  58. var form_digitalSignController: FormsDigitalSignController?
  59. //Fill
  60. var fill_tickController: FillTickController?
  61. var fill_dateController: FillDateController?
  62. //
  63. //OCR
  64. var tool_OCRController: KMOCRController?
  65. var contentViewController: NSViewController?
  66. weak open var delegate: KMRightSideControllerDelegate?
  67. //MARK: - func
  68. override func viewDidLoad() {
  69. super.viewDidLoad()
  70. // Do view setup here.
  71. setupUI()
  72. setupContentController()
  73. }
  74. //MARK: - Get
  75. func getValidAnnotations() -> [CPDFAnnotation] {
  76. return []
  77. }
  78. //MARK: - Set
  79. func setupUI() {
  80. contendView.wantsLayer = true
  81. contendView.layer?.backgroundColor = ComponentLibrary.shared.getComponentColorFromKey("colorBg/layout-middle").cgColor
  82. contendLeftDivider.properties = ComponentDividerProperty(type: .vertical)
  83. titleLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/2")
  84. titleLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-m-bold")
  85. emptyView.properties = ComponentEmptyProperty(emptyType: .noWatermark, text: KMLocalizedString("No identical attributes"), subText: "")
  86. }
  87. func updateTitleLabel() {
  88. let subToolMode = viewManager?.subToolMode ?? .None
  89. let annotations: [CPDFAnnotation] = self.pdfView?.activeAnnotations as? [CPDFAnnotation] ?? []
  90. var firstAnnotation: CPDFAnnotation?
  91. if let firstObject = annotations.first {
  92. firstAnnotation = firstObject
  93. }
  94. titleLabel.stringValue = ""
  95. if contentViewController is KMHighlightController {
  96. titleLabel.stringValue = KMLocalizedString("Highlight")
  97. if let annotation = firstAnnotation, annotation is CPDFMarkupAnnotation {
  98. let markupAnnotation = firstAnnotation as! CPDFMarkupAnnotation
  99. if markupAnnotation.markupType() == .underline {
  100. titleLabel.stringValue = KMLocalizedString("Underline")
  101. } else if markupAnnotation.markupType() == .squiggly {
  102. titleLabel.stringValue = KMLocalizedString("Wavyline")
  103. } else if markupAnnotation.markupType() == .strikeOut {
  104. titleLabel.stringValue = KMLocalizedString("Strikethrough")
  105. }
  106. } else {
  107. if viewManager?.subToolMode == .Underline {
  108. titleLabel.stringValue = KMLocalizedString("Underline")
  109. } else if viewManager?.subToolMode == .Waveline {
  110. titleLabel.stringValue = KMLocalizedString("Wavyline")
  111. } else if viewManager?.subToolMode == .Strikethrough {
  112. titleLabel.stringValue = KMLocalizedString("Strikethrough")
  113. }
  114. }
  115. } else if (contentViewController is KMNoteController) {
  116. titleLabel.stringValue = KMLocalizedString("Note")
  117. } else if (contentViewController is KMPenController) {
  118. titleLabel.stringValue = KMLocalizedString("Pen")
  119. } else if (contentViewController is KMEraserController) {
  120. titleLabel.stringValue = KMLocalizedString("Eraser")
  121. } else if (contentViewController is KMLineController) {
  122. if let annotation = firstAnnotation, annotation is CPDFLineAnnotation {
  123. let lineAnnotation = firstAnnotation as! CPDFLineAnnotation
  124. if lineAnnotation.type == "Line" {
  125. titleLabel.stringValue = KMLocalizedString("Line")
  126. } else if lineAnnotation.type == "Arrow" {
  127. titleLabel.stringValue = KMLocalizedString("Arrow")
  128. }
  129. } else if subToolMode == .Arrow {
  130. titleLabel.stringValue = KMLocalizedString("Arrow")
  131. } else if subToolMode == .Line {
  132. titleLabel.stringValue = KMLocalizedString("Line")
  133. }
  134. } else if (contentViewController is KMRectangleController) {
  135. if let annotation = firstAnnotation, annotation is CPDFSquareAnnotation {
  136. titleLabel.stringValue = KMLocalizedString("Rectangle")
  137. } else if let annotation = firstAnnotation, annotation is CPDFCircleAnnotation {
  138. titleLabel.stringValue = KMLocalizedString("Circle")
  139. } else if subToolMode == .Rectangle {
  140. titleLabel.stringValue = KMLocalizedString("Rectangle")
  141. } else if subToolMode == .Circle {
  142. titleLabel.stringValue = KMLocalizedString("Circle")
  143. }
  144. } else if (contentViewController is KMTextBoxController) {
  145. titleLabel.stringValue = KMLocalizedString("Text Box")
  146. } else if (contentViewController is KMEditPDFTextPropertyViewController) {
  147. titleLabel.stringValue = KMLocalizedString("Text")
  148. } else if (contentViewController is KMEditImageController) {
  149. titleLabel.stringValue = KMLocalizedString("Image")
  150. } else if (contentViewController is KMLinkViewController) {
  151. titleLabel.stringValue = KMLocalizedString("Link")
  152. } else if (contentViewController is KMCropPropertyController) {
  153. titleLabel.stringValue = KMLocalizedString("Crop")
  154. } else if (contentViewController is KMStampListController) || (contentViewController is KMStampController) {
  155. titleLabel.stringValue = KMLocalizedString("Stamp")
  156. } else if (contentViewController is KMSignatureListController) || (contentViewController is KMSignatureController) {
  157. titleLabel.stringValue = KMLocalizedString("Sign")
  158. } else if (contentViewController is KMMeasureController) {
  159. titleLabel.stringValue = KMLocalizedString("Measure")
  160. } else if (contentViewController is FormsTextFieldController) {
  161. titleLabel.stringValue = KMLocalizedString("Text Field")
  162. } else if (contentViewController is FormsCheckBoxController) {
  163. titleLabel.stringValue = KMLocalizedString("Check Box")
  164. } else if (contentViewController is FormsRadioController) {
  165. titleLabel.stringValue = KMLocalizedString("Radio Button")
  166. } else if (contentViewController is FormsButtonController) {
  167. titleLabel.stringValue = KMLocalizedString("Button")
  168. } else if (contentViewController is FormsListController) {
  169. if let annotation = firstAnnotation, annotation is CPDFChoiceWidgetAnnotation {
  170. let lineAnnotation = firstAnnotation as! CPDFChoiceWidgetAnnotation
  171. if lineAnnotation.isListChoice == true {
  172. titleLabel.stringValue = KMLocalizedString("List")
  173. } else {
  174. titleLabel.stringValue = KMLocalizedString("Dropdown")
  175. }
  176. } else if subToolMode == .Form_list {
  177. titleLabel.stringValue = KMLocalizedString("List")
  178. } else if subToolMode == .Form_dropdown {
  179. titleLabel.stringValue = KMLocalizedString("Dropdown")
  180. }
  181. } else if (contentViewController is FillTickController) {
  182. titleLabel.stringValue = KMLocalizedString("Fill")
  183. } else if (contentViewController is FillDateController) {
  184. titleLabel.stringValue = KMLocalizedString("Date")
  185. } else if (contentViewController is KMOCRController) {
  186. titleLabel.stringValue = KMLocalizedString("OCR")
  187. } else if (contentViewController is FormsDigitalSignController) {
  188. titleLabel.stringValue = KMLocalizedString("Signature")
  189. }
  190. else {
  191. }
  192. }
  193. //MARK: - Setup
  194. func setupContentController() {
  195. /**
  196. Case1:选中指定模式:显示指定模式的属性设置界面,例如橡皮擦。
  197. Case2:未选中模式:根据选中的注释显示指定属性设置界面
  198. 1、筛选出指定模式下对应的右边界面,进行显示。
  199. 2、再判断是否有选中注释,多选不同类型注释时,判断为未选中注释。
  200. 3、判断选中指定类型的注释,或者选中的模式,都展示对应的界面。
  201. */
  202. /**
  203. 只在指定模式下可以选中特定注释:
  204. 编辑模式下:可以选中编辑块跟Link注释
  205. Form模式下:可以选中Form注释
  206. */
  207. contentViewController?.view.removeFromSuperview()
  208. contentViewController = nil
  209. let toolMode = viewManager?.toolMode ?? .None
  210. let subToolMode = viewManager?.subToolMode ?? .None
  211. let annotations: [CPDFAnnotation] = self.pdfView?.activeAnnotations as? [CPDFAnnotation] ?? []
  212. if toolMode == .Edit {
  213. //MARK: -Edit编辑
  214. if subToolMode == .Edit_Link {
  215. //链接
  216. if edit_linkController == nil {
  217. edit_linkController = KMLinkViewController.init()
  218. }
  219. edit_linkController?.delegate = self
  220. edit_linkController?.pdfView = self.pdfView
  221. contentViewController = edit_linkController
  222. } else if subToolMode == .Edit_Crop {
  223. if edit_cropController == nil {
  224. edit_cropController = KMCropPropertyController.init()
  225. }
  226. contentViewController = edit_cropController
  227. } else {
  228. if pdfView?.km_EditingAreas().isEmpty == true {
  229. //未选中文字跟图片
  230. if subToolMode == .Edit_text {
  231. if edit_textController == nil {
  232. edit_textController = KMEditPDFTextPropertyViewController.init()
  233. }
  234. edit_textController?.pdfView = self.pdfView
  235. contentViewController = edit_textController
  236. } else if subToolMode == .Edit_Image {
  237. if edit_imageController == nil {
  238. edit_imageController = KMEditImageController.init()
  239. }
  240. edit_imageController?.pdfView = self.pdfView
  241. contentViewController = edit_imageController
  242. }
  243. } else if pdfView?.km_editingImageAreas().isEmpty == true && pdfView?.km_editingTextAreas().isEmpty == false {
  244. //编辑文字
  245. if edit_textController == nil {
  246. edit_textController = KMEditPDFTextPropertyViewController.init()
  247. }
  248. edit_textController?.pdfView = self.pdfView
  249. contentViewController = edit_textController
  250. } else if pdfView?.km_editingImageAreas().isEmpty == false && pdfView?.km_editingTextAreas().isEmpty == true {
  251. //编辑图片
  252. if edit_imageController == nil {
  253. edit_imageController = KMEditImageController.init()
  254. }
  255. edit_imageController?.pdfView = self.pdfView
  256. contentViewController = edit_imageController
  257. } else if pdfView?.km_editingImageAreas().isEmpty == false && pdfView?.km_editingTextAreas().isEmpty == false {
  258. //混选
  259. if edit_alignmentController == nil {
  260. edit_alignmentController = KMNAlignmentController.init()
  261. }
  262. edit_alignmentController?.delegate = self
  263. contentViewController = edit_alignmentController
  264. }
  265. }
  266. } else if toolMode == .Form {
  267. let exitMulitAnnotation = pdfView?.isMultiAnnotation(annotations)
  268. if exitMulitAnnotation == true {
  269. self.refreshContendVC()
  270. return
  271. }
  272. var firstAnnotation: CPDFAnnotation?
  273. if annotations.count > 0 {
  274. firstAnnotation = annotations.first
  275. }
  276. var controlType: CPDFWidgetControlType = .unknownControl
  277. var isListChoice: Int = -1
  278. if let annotation = firstAnnotation as? CPDFButtonWidgetAnnotation {
  279. controlType = annotation.controlType()
  280. } else if let annotation = firstAnnotation as? CPDFChoiceWidgetAnnotation {
  281. isListChoice = 0
  282. if annotation.isListChoice {
  283. isListChoice = 1
  284. }
  285. }
  286. if firstAnnotation is CPDFTextWidgetAnnotation {
  287. if form_fieldController == nil {
  288. form_fieldController = FormsTextFieldController.init()
  289. }
  290. form_fieldController?.pdfView = self.pdfView
  291. contentViewController = form_fieldController
  292. } else if controlType == .checkBoxControl {
  293. if form_checkBoxController == nil {
  294. form_checkBoxController = FormsCheckBoxController.init()
  295. }
  296. form_checkBoxController?.pdfView = self.pdfView
  297. contentViewController = form_checkBoxController
  298. } else if controlType == .radioButtonControl {
  299. if form_radioController == nil {
  300. form_radioController = FormsRadioController.init()
  301. }
  302. form_radioController?.pdfView = self.pdfView
  303. contentViewController = form_radioController
  304. } else if isListChoice >= 0 {
  305. if form_listController == nil {
  306. form_listController = FormsListController.init()
  307. }
  308. form_listController?.pdfView = self.pdfView
  309. form_listController?.viewManager = self.viewManager
  310. contentViewController = form_listController
  311. form_listController?.clearData()
  312. } else if controlType == .pushButtonControl {
  313. if form_buttonController == nil {
  314. form_buttonController = FormsButtonController.init()
  315. }
  316. form_buttonController?.pdfView = self.pdfView
  317. contentViewController = form_buttonController
  318. } else if firstAnnotation is CPDFSignatureWidgetAnnotation {
  319. if form_digitalSignController == nil {
  320. form_digitalSignController = FormsDigitalSignController.init()
  321. }
  322. form_digitalSignController?.pdfView = self.pdfView
  323. contentViewController = form_digitalSignController
  324. }
  325. } else {
  326. let exitMulitAnnotation = pdfView?.isMultiAnnotation(annotations)
  327. if exitMulitAnnotation == true {
  328. self.refreshContendVC()
  329. return
  330. }
  331. var firstAnnotation: CPDFAnnotation?
  332. if annotations.count > 0 {
  333. firstAnnotation = annotations.first
  334. }
  335. if viewManager?.viewToolsType == .Content_Selection {
  336. if edit_cropController == nil {
  337. edit_cropController = KMCropPropertyController.init()
  338. }
  339. contentViewController = edit_cropController
  340. } else if firstAnnotation is CPDFMarkupAnnotation || subToolMode == .Highlight || subToolMode == .Underline || subToolMode == .Waveline || subToolMode == .Strikethrough {
  341. if highlight_Controller == nil {
  342. highlight_Controller = KMHighlightController.init()
  343. }
  344. highlight_Controller?.pdfView = self.pdfView
  345. contentViewController = highlight_Controller
  346. } else if firstAnnotation is CPDFFreeTextAnnotation ||
  347. subToolMode == .Text ||
  348. subToolMode == .fill_date {
  349. if firstAnnotation is CSelfSignAnnotationFreeText || subToolMode == .fill_date {
  350. if fill_dateController == nil {
  351. fill_dateController = FillDateController.init()
  352. }
  353. fill_dateController?.pdfView = self.pdfView
  354. contentViewController = fill_dateController
  355. } else {
  356. if freeText_Controller == nil {
  357. freeText_Controller = KMTextBoxController.init()
  358. }
  359. freeText_Controller?.pdfView = self.pdfView
  360. contentViewController = freeText_Controller
  361. }
  362. } else if firstAnnotation is CPDFTextAnnotation || subToolMode == .Note {
  363. if note_Controller == nil {
  364. note_Controller = KMNoteController.init()
  365. }
  366. note_Controller?.pdfView = self.pdfView
  367. contentViewController = note_Controller
  368. } else if firstAnnotation is CPDFInkAnnotation || subToolMode == .Pen {
  369. if pen_Controller == nil {
  370. pen_Controller = KMPenController.init()
  371. }
  372. pen_Controller?.pdfView = self.pdfView
  373. contentViewController = pen_Controller
  374. } else if subToolMode == .Eraser {
  375. if eraser_Controller == nil {
  376. eraser_Controller = KMEraserController.init()
  377. }
  378. contentViewController = eraser_Controller
  379. } else if firstAnnotation is CPDFCircleAnnotation || firstAnnotation is CPDFSquareAnnotation || subToolMode == .Rectangle || subToolMode == .Circle {
  380. if rectangle_Controller == nil {
  381. rectangle_Controller = KMRectangleController.init()
  382. }
  383. rectangle_Controller?.pdfView = self.pdfView
  384. contentViewController = rectangle_Controller
  385. } else if firstAnnotation is CPDFLineAnnotation || firstAnnotation is CPDFPolylineAnnotation || firstAnnotation is CPDFPolygonAnnotation || subToolMode == .Line || subToolMode == .Arrow || subToolMode == .Measure {
  386. var isMeasure = false
  387. if let annotation = firstAnnotation as? CPDFLineAnnotation, annotation.isMeasure == true {
  388. isMeasure = true
  389. } else if let _ = firstAnnotation as? CPDFPolylineAnnotation {
  390. isMeasure = true
  391. } else if let _ = firstAnnotation as? CPDFPolygonAnnotation {
  392. isMeasure = true
  393. } else if subToolMode == .Measure {
  394. isMeasure = true
  395. }
  396. if isMeasure {
  397. if measure_Controller == nil {
  398. measure_Controller = KMMeasureController.init()
  399. }
  400. measure_Controller?.pdfView = self.pdfView
  401. measure_Controller?.viewManager = self.viewManager
  402. contentViewController = measure_Controller
  403. } else {
  404. if line_Controller == nil {
  405. line_Controller = KMLineController.init()
  406. }
  407. line_Controller?.pdfView = self.pdfView
  408. contentViewController = line_Controller
  409. }
  410. } else if firstAnnotation is CPDFStampAnnotation {
  411. if firstAnnotation is CSelfSignAnnotation {
  412. if fill_tickController == nil {
  413. fill_tickController = FillTickController.init()
  414. }
  415. fill_tickController?.viewManager = self.viewManager
  416. fill_tickController?.pdfView = self.pdfView
  417. contentViewController = fill_tickController
  418. } else {
  419. if stamp_Controller == nil {
  420. stamp_Controller = KMStampController.init()
  421. }
  422. stamp_Controller?.pdfView = self.pdfView
  423. stamp_Controller?.delegate = self
  424. contentViewController = stamp_Controller
  425. }
  426. } else if subToolMode == .Stamp {
  427. if stamplist_Controller == nil {
  428. stamplist_Controller = KMStampListController.init()
  429. stamplist_Controller?.delegate = self
  430. }
  431. stamplist_Controller?.pdfView = self.pdfView
  432. contentViewController = stamplist_Controller
  433. } else if firstAnnotation is CPDFSignatureAnnotation {
  434. if signature_Controller == nil {
  435. signature_Controller = KMSignatureController.init()
  436. }
  437. signature_Controller?.pdfView = self.pdfView
  438. contentViewController = signature_Controller
  439. } else if subToolMode == .Sign || subToolMode == .fill_sign {
  440. if signatureList_Controller == nil {
  441. signatureList_Controller = KMSignatureListController.init()
  442. }
  443. signatureList_Controller?.pdfView = self.pdfView
  444. contentViewController = signatureList_Controller
  445. } else if subToolMode == .Fill_tick ||
  446. subToolMode == .fill_fork ||
  447. subToolMode == .fill_rectangle ||
  448. subToolMode == .fill_line ||
  449. subToolMode == .fill_dot {
  450. if fill_tickController == nil {
  451. fill_tickController = FillTickController.init()
  452. }
  453. fill_tickController?.viewManager = self.viewManager
  454. fill_tickController?.pdfView = self.pdfView
  455. contentViewController = fill_tickController
  456. } else if subToolMode == .Measure {
  457. if measure_Controller == nil {
  458. measure_Controller = KMMeasureController.init()
  459. }
  460. measure_Controller?.pdfView = self.pdfView
  461. measure_Controller?.viewManager = self.viewManager
  462. contentViewController = measure_Controller
  463. } else if subToolMode == .Tool_OCR {
  464. if tool_OCRController == nil {
  465. tool_OCRController = KMOCRController.init()
  466. tool_OCRController?.typeChange = { [unowned self] controller, type in
  467. delegate?.kmRightSideControllerOCRShowTypeChange(self, type)
  468. }
  469. tool_OCRController?.doneAction = { [unowned self] controller, model in
  470. delegate?.kmRightSideControllerOCRDoneAction(self, model)
  471. }
  472. tool_OCRController?.languageChangeAction = { [unowned self] controller, model in
  473. delegate?.kmRightSideControllerOCRLanguageChangeAction(self, model)
  474. }
  475. }
  476. tool_OCRController?.pdfView = self.pdfView
  477. contentViewController = tool_OCRController
  478. } else {
  479. }
  480. }
  481. self.refreshContendVC()
  482. }
  483. private func refreshContendVC() {
  484. if let contendVC = contentViewController {
  485. contendVC.view.frame = infoContendView.bounds
  486. contendVC.view.autoresizingMask = [.width, .height]
  487. // infoContendView.addSubview(contendVC.view)
  488. // infoScrollView.contentViewSize = CGSizeMake(264, 600)
  489. infoScrollView.documentView = contendVC.view
  490. // infoScrollView.layout()
  491. delegate?.kmRightSideControllerDidContendVCUpdated?(self)
  492. }
  493. if let _ = contentViewController {
  494. infoContendView.isHidden = false
  495. headerBGView.isHidden = false
  496. emptyView.isHidden = true
  497. } else {
  498. infoContendView.isHidden = true
  499. headerBGView.isHidden = true
  500. emptyView.isHidden = false
  501. }
  502. updateTitleLabel()
  503. }
  504. //MARK: - reloadData
  505. func reloadContendTopConst() {
  506. infoContendTopConst.constant = 40
  507. headerBGView.isHidden = false
  508. if contentViewController is KMHighlightController {
  509. //高亮
  510. if CPDFMarkupAnnotation.isMarkupAnnotationsContainMultiType((contentViewController as! KMHighlightController).getValidAnnotations()) {
  511. infoContendTopConst.constant = 0
  512. headerBGView.isHidden = true
  513. }
  514. } else if contentViewController is KMLineController {
  515. //线段
  516. if CPDFLineAnnotation.isLineAnnotationsContainMultiType((contentViewController as! KMLineController).getValidAnnotations()) {
  517. infoContendTopConst.constant = 0
  518. headerBGView.isHidden = true
  519. }
  520. } else if contentViewController is KMRectangleController {
  521. //图形
  522. let annotations: [CPDFAnnotation] = self.pdfView?.activeAnnotations as? [CPDFAnnotation] ?? []
  523. if CPDFAnnotation.isShapeAnnotationsContainMultiType(annotations) {
  524. infoContendTopConst.constant = 0
  525. headerBGView.isHidden = true
  526. }
  527. } else if contentViewController is KMNAlignmentController {
  528. //对齐
  529. infoContendTopConst.constant = 0
  530. headerBGView.isHidden = true
  531. }
  532. }
  533. private func reloadTopRightButtonInfo() {
  534. headerRightButton.isHidden = true
  535. if contentViewController is KMStampListController {
  536. let stampListVC = contentViewController as! KMStampListController
  537. if stampListVC.stampType == .dynamic {
  538. headerRightButton.isHidden = false
  539. headerRightButton.properties = ComponentButtonProperty(type: .text_gray, size: .xxs, onlyIcon: true, icon: NSImage(named: "stampDynamic_Setting"), keepPressState: false)
  540. } else if stampListVC.stampType == .custom {
  541. headerRightButton.isHidden = false
  542. headerRightButton.properties = ComponentButtonProperty(type: .text_gray, size: .xxs, onlyIcon: true, icon: NSImage(named: "watermark_template_add"), keepPressState: false)
  543. }
  544. } else if contentViewController is KMSignatureListController {
  545. headerRightButton.isHidden = false
  546. headerRightButton.properties = ComponentButtonProperty(type: .text_gray, size: .xxs, onlyIcon: true, icon: NSImage(named: "watermark_template_add"), keepPressState: false)
  547. } else if contentViewController is KMOCRController {
  548. headerRightButton.isHidden = false
  549. headerRightButton.properties = ComponentButtonProperty(type: .text_gray, size: .xxs, onlyIcon: true, icon: NSImage(named: "tools_report"), keepPressState: false)
  550. headerRightButton.toolTip = KMLocalizedString("If you have any feedback or suggestions for improvements to the OCR feature, please contact us.")
  551. } else if contentViewController is KMMeasureController {
  552. headerRightButton.isHidden = false
  553. headerRightButton.properties = ComponentButtonProperty(type: .text_gray, size: .xxs, onlyIcon: true, icon: NSImage(named: "stampDynamic_Setting"), keepPressState: false)
  554. } else if contentViewController is KMCropPropertyController {
  555. headerRightButton.isHidden = false
  556. headerRightButton.properties = ComponentButtonProperty(type: .text_gray, size: .xxs, onlyIcon: true, icon: NSImage(named: "icon_recover"), keepPressState: false)
  557. }
  558. headerRightButton.setTarget(self, action: #selector(headerRightButtonClicked(_:)))
  559. }
  560. func reloadData() {
  561. let toolMode = viewManager?.toolMode ?? .None
  562. let subToolMode = viewManager?.subToolMode ?? .None
  563. if (contentViewController is KMHighlightController) {
  564. (contentViewController as? KMHighlightController)?.viewManager = viewManager
  565. (contentViewController as? KMHighlightController)?.reloadData()
  566. } else if (contentViewController is KMNoteController) {
  567. (contentViewController as? KMNoteController)?.reloadData()
  568. } else if (contentViewController is KMPenController) {
  569. (contentViewController as? KMPenController)?.reloadData()
  570. } else if (contentViewController is KMEraserController) {
  571. (contentViewController as? KMEraserController)?.reloadData()
  572. } else if (contentViewController is KMLineController) {
  573. (contentViewController as? KMLineController)?.viewManager = viewManager
  574. (contentViewController as? KMLineController)?.reloadData()
  575. } else if (contentViewController is KMRectangleController) {
  576. (contentViewController as? KMRectangleController)?.viewManager = viewManager
  577. (contentViewController as? KMRectangleController)?.reloadData()
  578. } else if (contentViewController is KMTextBoxController) {
  579. (contentViewController as? KMTextBoxController)?.reloadData()
  580. } else if (contentViewController is KMStampController) {
  581. (contentViewController as? KMStampController)?.reloadData()
  582. } else if (contentViewController is KMSignatureListController) {
  583. (contentViewController as? KMSignatureListController)?.reloadData()
  584. } else if (contentViewController is FormsTextFieldController) {
  585. (contentViewController as? FormsTextFieldController)?.reloadData()
  586. } else if (contentViewController is FormsCheckBoxController) {
  587. (contentViewController as? FormsCheckBoxController)?.reloadData()
  588. } else if (contentViewController is FormsRadioController) {
  589. (contentViewController as? FormsRadioController)?.reloadData()
  590. } else if (contentViewController is FormsListController) {
  591. (contentViewController as? FormsListController)?.reloadData()
  592. } else if (contentViewController is FormsButtonController) {
  593. (contentViewController as? FormsButtonController)?.reloadData()
  594. } else if (contentViewController is FormsDigitalSignController) {
  595. (contentViewController as? FormsDigitalSignController)?.reloadData()
  596. } else if (contentViewController is FillTickController) {
  597. (contentViewController as? FillTickController)?.reloadData()
  598. } else if (contentViewController is FillDateController) {
  599. (contentViewController as? FillDateController)?.reloadData()
  600. } else if (contentViewController is KMMeasureController) {
  601. (contentViewController as? KMMeasureController)?.reloadData()
  602. } else if (contentViewController is KMSignatureController) {
  603. (contentViewController as? KMSignatureController)?.reloadData()
  604. } else if (contentViewController is KMEditPDFTextPropertyViewController) {
  605. (contentViewController as? KMEditPDFTextPropertyViewController)?.reloadData()
  606. } else if (contentViewController is KMEditImageController) {
  607. (contentViewController as? KMEditImageController)?.reloadData()
  608. } else if (contentViewController is KMLinkViewController) {
  609. (contentViewController as? KMLinkViewController)?.reloadData()
  610. } else if (contentViewController is KMCropPropertyController) {
  611. (contentViewController as? KMCropPropertyController)?.reloadData()
  612. } else if (contentViewController is KMNAlignmentController) {
  613. if let areas = pdfView?.km_EditingAreas(), areas.count > 2 {
  614. (contentViewController as? KMNAlignmentController)?.updateMulti(true)
  615. } else {
  616. (contentViewController as? KMNAlignmentController)?.updateMulti(false)
  617. }
  618. (contentViewController as? KMNAlignmentController)?.updateContendLeftConst(16)
  619. }
  620. if toolMode == .Markup {
  621. if (subToolMode == .Highlight ||
  622. subToolMode == .Underline ||
  623. subToolMode == .Waveline ||
  624. subToolMode == .Strikethrough) && (contentViewController is KMHighlightController) {
  625. (contentViewController as? KMHighlightController)?.reloadData()
  626. }
  627. }
  628. reloadContendTopConst()
  629. reloadTopRightButtonInfo()
  630. }
  631. public func reloadDataWithPDFView(pdfView: CPDFListView) {
  632. self.pdfView = pdfView
  633. setupContentController()
  634. reloadData()
  635. }
  636. public func reloadRightButtonState() {
  637. if let cropPropertyVC = contentViewController as? KMCropPropertyController {
  638. headerRightButton.properties = ComponentButtonProperty(type: .text_gray, size: .xxs, onlyIcon: true, icon: NSImage(named: "icon_recover"), keepPressState: false)
  639. if cropPropertyVC.recoverEnable() {
  640. headerRightButton.properties.isDisabled = false
  641. } else {
  642. headerRightButton.properties.isDisabled = true
  643. }
  644. headerRightButton.reloadData()
  645. }
  646. }
  647. //MARK: - Action
  648. @objc func headerRightButtonClicked(_ button: ComponentButton) {
  649. if contentViewController is KMStampListController {
  650. let stampListVC = contentViewController as! KMStampListController
  651. if stampListVC.stampType == .dynamic {
  652. stampListVC.showDynamicSetting()
  653. } else if stampListVC.stampType == .custom {
  654. stampListVC.createCustomStamp()
  655. }
  656. } else if contentViewController is KMSignatureListController {
  657. let vc = contentViewController as! KMSignatureListController
  658. vc.createCustomStamp()
  659. } else if contentViewController is KMMeasureController {
  660. delegate?.kmRightSideControllerShowMeasureSetting(self)
  661. } else if contentViewController is KMCropPropertyController {
  662. delegate?.kmRightSideControllerDidRevertCropInfo(self)
  663. } else if contentViewController is KMOCRController {
  664. let help = KMUserFeekbackHanddler()
  665. help.showFeekbackWindow(with: KMLocalizedString("Propose a New Feature", comment: ""))
  666. }
  667. }
  668. //MARK: - 重新刷新编辑中内容
  669. public func reloadEditingAreas() {
  670. if contentViewController is KMEditPDFTextPropertyViewController {
  671. (contentViewController as! KMEditPDFTextPropertyViewController).reloadData()
  672. } else if contentViewController is KMEditImageController {
  673. (contentViewController as! KMEditImageController).reloadData()
  674. }
  675. }
  676. //MARK: - 裁剪模式下刷新文档
  677. public func reloadCropDocument(_ pdfview: CPDFListView?) {
  678. if viewManager?.subToolMode == .Edit_Crop && (contentViewController is KMCropPropertyController) {
  679. (contentViewController as! KMCropPropertyController).pdfView = pdfview
  680. (contentViewController as! KMCropPropertyController).reloadData()
  681. }
  682. }
  683. }
  684. //MARK: - KMStampListControllerDelegate
  685. extension KMRightSideController: KMStampListControllerDelegate {
  686. func kmStampListControllerDidStampTypeUpdated(_ controller: KMStampListController) {
  687. reloadTopRightButtonInfo()
  688. }
  689. }
  690. //MARK: - KMStampControllerDelegate
  691. extension KMRightSideController: KMStampControllerDelegate {
  692. func kmStampControllerRotateLeft(_ annotations: [CPDFStampAnnotation], withPDFView pdfView: CPDFListView?) {
  693. delegate?.kmRightSideControllerRotateLeft(annotations, withPDFView: pdfView)
  694. }
  695. func kmStampControllerRotateRight(_ annotations: [CPDFStampAnnotation], withPDFView pdfView: CPDFListView?) {
  696. delegate?.kmRightSideControllerRotateRight(annotations, withPDFView: pdfView)
  697. }
  698. }
  699. //MARK: - KMLinkViewControllerDelegate
  700. extension KMRightSideController: KMLinkViewControllerDelegate {
  701. func kmLinkViewControllerDidUpdateMode(_ controller: KMLinkViewController) {
  702. delegate?.kmRightSideControllerDidContendVCUpdated?(self)
  703. }
  704. }
  705. //MARK: - KMNAlignmentControllerDelegate
  706. extension KMRightSideController: KMNAlignmentControllerDelegate {
  707. func alignmentControllerDidClick(_ controller: KMNAlignmentController, _ alignmentType: KMPDFActiveFormsAlignType) {
  708. pdfView?.changeEditingAreas(alignmentType)
  709. }
  710. }