KMRightSideController.swift 40 KB

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