KMNPopContentEditViewController.swift 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880
  1. //
  2. // KMNPopContentEditWindowController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by 丁林圭 on 2024/12/2.
  6. //
  7. import Cocoa
  8. import KMComponentLibrary
  9. class KMNPopContentEditViewController: KMNBaseViewController {
  10. let buttonWidth = 32.0
  11. let buttonOffset = 4.0
  12. public var editType:EditContentPopType = .editNone {
  13. didSet {
  14. rightOffsetConstraint.constant = 49.0
  15. paneBox.isHidden = false
  16. objectAlign = .alightNone
  17. switch editType {
  18. case .signTextEdit :
  19. textPopView.layoutSubtreeIfNeeded()
  20. operationWidthConstraint.constant = textPopView.bounds.width
  21. self.view.display() //需刷新约束才会有值,不然会变化
  22. operationBox.contentView = textPopView
  23. congfigFontPopUI()
  24. fontAlightButton.properties.icon = NSImage(named: "KMNImageNameListViewPopAlightLeft")
  25. fontAlightButton.reloadData()
  26. break
  27. case .signImageEdit:
  28. imagePopView.layoutSubtreeIfNeeded()
  29. congfigSignImageUI()
  30. operationWidthConstraint.constant = buttonWidth * 7 + buttonOffset * 6
  31. self.view.display() //需刷新约束才会有值,不然会变化
  32. operationBox.contentView = imagePopView
  33. break
  34. case .multpleTextEdit:
  35. textPopView.layoutSubtreeIfNeeded()
  36. operationWidthConstraint.constant = textPopView.bounds.width
  37. self.view.display() //需刷新约束才会有值,不然会变化
  38. operationBox.contentView = textPopView
  39. congfigFontPopUI()
  40. fontAlightButton.properties.icon = NSImage(named: "KMNImageNameListViewPopAlightLeft")
  41. fontAlightButton.reloadData()
  42. break
  43. case .multpleImageEdit:
  44. imagePopView.layoutSubtreeIfNeeded()
  45. congfigMultpleImageUI()
  46. operationWidthConstraint.constant = buttonWidth * 6 + buttonOffset * 5
  47. self.view.display() //需刷新约束才会有值,不然会变化
  48. operationBox.contentView = imagePopView
  49. break
  50. case .multpleImageAndText:
  51. alightView.layoutSubtreeIfNeeded()
  52. operationWidthConstraint.constant = alightView.bounds.width
  53. self.view.display() //需刷新约束才会有值,不然会变化
  54. operationBox.contentView = alightView
  55. break
  56. case .cropImage:
  57. cropPopView.layoutSubtreeIfNeeded()
  58. rightOffsetConstraint.constant = 0
  59. paneBox.isHidden = true
  60. operationWidthConstraint.constant = cropPopView.bounds.width
  61. self.view.display() //需刷新约束才会有值,不然会变化
  62. operationBox.contentView = cropPopView
  63. break
  64. case .editNone:
  65. break
  66. }
  67. }
  68. }
  69. public var isOpenPane = false {
  70. didSet {
  71. if isOpenPane == true {
  72. paneSelectorItem.properties.state = .pressed
  73. } else {
  74. paneSelectorItem.properties.state = .normal
  75. }
  76. paneSelectorItem.reloadData()
  77. }
  78. }
  79. public var editContentPopMode:KMNEditContentPopMode = KMNEditContentPopMode(currentEditAreas: []) {
  80. didSet {
  81. let editPopType = editContentPopMode.popType
  82. editType = editPopType
  83. if(editType == .signTextEdit || editType == .multpleTextEdit) {
  84. let textEditAreas = listView?.km_editingTextAreas()
  85. let oldColor:NSColor? = fontColor
  86. let firstTextEditArea = textEditAreas?.first
  87. let firstColor = listView?.editingSelectionFontColor(with: firstTextEditArea)
  88. var newColor:NSColor? = firstColor
  89. for textEditArea in textEditAreas ?? [] {
  90. if firstTextEditArea != textEditArea {
  91. let color = listView?.editingSelectionFontColor(with: firstTextEditArea)
  92. if CPDFListView.isTheSameColor(color, anotherColor: firstColor) == false{
  93. newColor = nil
  94. break
  95. }
  96. }
  97. }
  98. if !CPDFListView.isTheSameColor(newColor, anotherColor: oldColor) {
  99. fontColor = newColor
  100. }
  101. let oldBold:Bool = isBold
  102. let newBolds:[Bool] = listView?.km_editTextAreasFontBolds(textEditAreas ?? []) ?? []
  103. var newBold = true
  104. for i in 0 ..< newBolds.count {
  105. let boldV = newBolds[i]
  106. if boldV == false {
  107. newBold = false
  108. break
  109. }
  110. }
  111. if oldBold != newBold {
  112. isBold = newBold
  113. }
  114. let oldItalic:Bool = isItalic
  115. let newItalics:[Bool] = listView?.km_editTextAreasFontItalics(textEditAreas ?? []) ?? []
  116. var newItalic = true
  117. for i in 0 ..< newItalics.count {
  118. let boldV = newItalics[i]
  119. if boldV == false {
  120. newItalic = false
  121. break
  122. }
  123. }
  124. if oldItalic != newItalic {
  125. isItalic = newItalic
  126. }
  127. let oldStrikeoutLine:Bool = isStrikeoutLine
  128. let newStrikeoutLines:[Bool] = listView?.km_editTextAreasFontStrikeout(textEditAreas ?? []) ?? []
  129. var newStrikeoutLine = true
  130. for i in 0 ..< newStrikeoutLines.count {
  131. let boldV = newStrikeoutLines[i]
  132. if boldV == false {
  133. newStrikeoutLine = false
  134. break
  135. }
  136. }
  137. if oldStrikeoutLine != newStrikeoutLine {
  138. isStrikeoutLine = newStrikeoutLine
  139. }
  140. let oldUnderLine:Bool = isUnderLine
  141. let newUnderLines:[Bool] = listView?.km_editTextAreasFontUnder(textEditAreas ?? []) ?? []
  142. var newUnderLine = true
  143. for i in 0 ..< newStrikeoutLines.count {
  144. let boldV = newUnderLines[i]
  145. if boldV == false {
  146. newUnderLine = false
  147. break
  148. }
  149. }
  150. if oldUnderLine != newUnderLine {
  151. isUnderLine = newUnderLine
  152. }
  153. if(editType == .multpleTextEdit) {
  154. fontAlightButton.properties = ComponentButtonProperty(type: .text_gray,
  155. size: .s,
  156. state: .normal,
  157. onlyIcon: true,
  158. icon:NSImage(named: "KMNImageNameObjectPopAlightLeft"))
  159. fontAlightButton.reloadData()
  160. fontAlightButton.setTarget(self, action: #selector(alightButtonClicked(_ :)))
  161. } else {
  162. let alights = listView?.km_editTextAreasTextAlignments(textEditAreas ?? []) ?? []
  163. var newAlignment = alights.first ?? .left
  164. let oldAlignment :NSTextAlignment = fontAlight
  165. for i in 0 ..< alights.count {
  166. let alignmentV = alights[i]
  167. if oldAlignment != alignmentV {
  168. newAlignment = .left
  169. break
  170. }
  171. }
  172. if oldAlignment != newAlignment {
  173. fontAlight = newAlignment
  174. }
  175. fontAlightButton.properties = ComponentButtonProperty(type: .text_gray,
  176. size: .s,
  177. state: .normal,
  178. onlyIcon: true,
  179. icon:NSImage(named: "KMNImageNameListViewPopAlightLeft"),
  180. keepPressState: false)
  181. fontAlightButton.reloadData()
  182. fontAlightButton.setTarget(self, action: #selector(fontAlightButtonClicked(_ :)))
  183. }
  184. let fonts = listView?.km_editTextAreasComPDFFonts(textEditAreas ?? []) ?? []
  185. var newFont:CPDFFont? = fonts.first
  186. for i in 0 ..< fonts.count {
  187. let fontV = fonts[i]
  188. if i != 0 && (fontV.familyName != compdfFont?.familyName || fontV.styleName != compdfFont?.styleName) {
  189. newFont = nil
  190. break
  191. }
  192. }
  193. compdfFont = newFont
  194. var isDisAble = false //内容编辑字体大小不一致时,因底层不支持同时加,所以暂时只能禁用
  195. let fontSizes = listView?.km_editTextAreasFontSizes(textEditAreas ?? []) ?? []
  196. for i in 0 ..< fontSizes.count {
  197. let fontSize = fontSizes[i]
  198. if(fontSize == -1) {
  199. isDisAble = true
  200. break
  201. }
  202. }
  203. fontSizeZoomInButton.properties.isDisabled = isDisAble
  204. fontSizeZoomOutButton.properties.isDisabled = isDisAble
  205. fontSizeZoomInButton.reloadData()
  206. fontSizeZoomOutButton.reloadData()
  207. }
  208. }
  209. }
  210. private var fontColor:NSColor? {
  211. didSet {
  212. fontColorItem.properties?.color = fontColor
  213. fontColorItem.reloadData()
  214. }
  215. }
  216. private var compdfFont:CPDFFont?{
  217. didSet {
  218. if(compdfFont != nil) {
  219. let styleName = compdfFont!.styleName
  220. if(styleName?.isEmpty == true) {
  221. fontNameSelect.properties.text = compdfFont!.familyName
  222. } else {
  223. fontNameSelect.properties.text = compdfFont!.familyName + "-" + (compdfFont!.styleName ?? "")
  224. }
  225. } else {
  226. fontNameSelect.properties.text = "-"
  227. }
  228. fontNameSelect.reloadData()
  229. }
  230. }
  231. private var fontAlight:NSTextAlignment = .left
  232. private var objectAlign:ObjectAlignType = .alightNone {
  233. didSet {
  234. switch objectAlign {
  235. case .alightLeft :
  236. listView?.changeEditingAreas(.left)
  237. break
  238. case .alightRight:
  239. listView?.changeEditingAreas(.right)
  240. break
  241. case .alightTop:
  242. listView?.changeEditingAreas(.top)
  243. break
  244. case .alightVer:
  245. listView?.changeEditingAreas(.horizontally)
  246. break
  247. case .alightHor:
  248. listView?.changeEditingAreas(.vertical)
  249. break
  250. case .alightBottom:
  251. listView?.changeEditingAreas(.bottom)
  252. break
  253. case .averageVer:
  254. listView?.changeEditingAreas(.disVertical)
  255. break
  256. case .averageHor:
  257. listView?.changeEditingAreas(.disHorizontally)
  258. break
  259. case .alightNone:
  260. break
  261. }
  262. }
  263. }
  264. private var isBold:Bool = false {
  265. didSet {
  266. fontBoldSelectorItem.properties.state = isBold ? .pressed : .normal
  267. fontBoldSelectorItem.reloadData()
  268. }
  269. }
  270. private var isItalic:Bool = false {
  271. didSet {
  272. fontItalicSelectorItem.properties.state = isItalic ? .pressed : .normal
  273. fontItalicSelectorItem.reloadData()
  274. }
  275. }
  276. private var isStrikeoutLine:Bool = false {
  277. didSet {
  278. }
  279. }
  280. private var isUnderLine:Bool = false {
  281. didSet {
  282. }
  283. }
  284. static let shared: KMNPopContentEditViewController = {
  285. let windowC = KMNPopContentEditViewController(nibName: "KMNPopContentEditViewController", bundle: nil)
  286. return windowC
  287. }()
  288. var paneCallback: PaneCallback?
  289. var updatePDFViewCallback: UpdatePDFViewCallback?
  290. @IBOutlet weak var contentBox: NSBox!
  291. @IBOutlet weak var operationBox: NSBox!
  292. @IBOutlet weak var paneBox: NSBox!
  293. @IBOutlet weak var lineBox: NSBox!
  294. @IBOutlet var paneSelectorItem: ComponentCSelectorItem!
  295. @IBOutlet weak var operationWidthConstraint: NSLayoutConstraint!
  296. @IBOutlet weak var rightOffsetConstraint: NSLayoutConstraint!
  297. @IBOutlet var textPopView: NSView!
  298. @IBOutlet var fontColorItem: ComponentCColorItem!
  299. @IBOutlet var fontNameSelect: ComponentSelect!
  300. @IBOutlet var fontBoldSelectorItem: ComponentCSelector!
  301. @IBOutlet var fontItalicSelectorItem: ComponentCSelector!
  302. @IBOutlet var fontSizeZoomOutButton: ComponentButton!
  303. @IBOutlet var fontSizeZoomInButton: ComponentButton!
  304. @IBOutlet var fontAlightButton: ComponentButton!
  305. @IBOutlet var imagePopView: NSView!
  306. @IBOutlet var rotaLeftButton: ComponentButton!
  307. @IBOutlet var rotaRightButton: ComponentButton!
  308. @IBOutlet var horizontalMirrorButton: ComponentButton!
  309. @IBOutlet var verticalMirrorButton: ComponentButton!
  310. @IBOutlet var cropButton: ComponentButton!
  311. @IBOutlet var replaceButton: ComponentButton!
  312. @IBOutlet var extractButton: ComponentButton!
  313. @IBOutlet weak var rightConstraint: NSLayoutConstraint!
  314. @IBOutlet var alightView: NSView!
  315. @IBOutlet var alightButton: ComponentButton!
  316. @IBOutlet var cropPopView: NSView!
  317. @IBOutlet var cropSureButton: ComponentButton!
  318. @IBOutlet var cropRestButton: ComponentButton!
  319. private var extractGroupView: ComponentGroup?
  320. weak var listView: CPDFListView?
  321. private var fontPopover:NSPopover?
  322. private var ObjectPopover:NSPopover?
  323. override func viewDidLoad() {
  324. super.viewDidLoad()
  325. }
  326. override func initContentView() {
  327. super.initContentView()
  328. paneSelectorItem.properties = ComponentCSelectorProperty(iconImage:NSImage(named: "KMNImageNameListViewPopPane"))
  329. paneSelectorItem.setTarget(self, action: #selector(paneButtonClicked(_ :)))
  330. fontBoldSelectorItem.properties = ComponentCSelectorProperty(
  331. iconImage:NSImage(named: "KMNImageNameContentBold"))
  332. fontBoldSelectorItem.setTarget(self, action: #selector(fontBoldButtonClicked(_ :)))
  333. fontItalicSelectorItem.properties = ComponentCSelectorProperty(
  334. iconImage:NSImage(named: "KMNImageNameContentItalic"))
  335. fontItalicSelectorItem.setTarget(self, action: #selector(fontItalicButtonClicked(_ :)))
  336. fontSizeZoomOutButton.properties = ComponentButtonProperty(type: .text_gray,
  337. size: .s,
  338. state: .normal,
  339. onlyIcon: true,
  340. icon:NSImage(named: "KMNImageNameListViewPopFontSizeZoomOut"),
  341. keepPressState: false)
  342. fontSizeZoomOutButton.setTarget(self, action: #selector(fontSizeZoomOutButtonClicked(_ :)))
  343. fontSizeZoomInButton.properties = ComponentButtonProperty(type: .text_gray,
  344. size: .s,
  345. state: .normal,
  346. onlyIcon: true,
  347. icon:NSImage(named: "KMNImageNameListViewPopFontSizeZoomIn"),
  348. keepPressState: false)
  349. fontSizeZoomInButton.setTarget(self, action: #selector(fontSizeZoomInButtonClicked(_ :)))
  350. fontColorItem.properties = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: false, color: .clear)
  351. fontColorItem.delegate = self
  352. fontAlightButton.properties = ComponentButtonProperty(type: .text_gray,
  353. size: .s,
  354. state: .normal,
  355. onlyIcon: true,
  356. icon:NSImage(named: "KMNImageNameListViewPopAlightLeft"),
  357. keepPressState: false)
  358. fontAlightButton.setTarget(self, action: #selector(fontAlightButtonClicked(_ :)))
  359. rotaLeftButton.properties = ComponentButtonProperty(type: .text_gray,
  360. size: .s,
  361. state: .normal,
  362. onlyIcon: true,
  363. icon:NSImage(named: "KMNImageNameContentRotateLeft"),
  364. keepPressState: false)
  365. rotaLeftButton.setTarget(self, action: #selector(rotateLeftButtonClicked(_ :)))
  366. rotaRightButton.properties = ComponentButtonProperty(type: .text_gray,
  367. size: .s,
  368. state: .normal,
  369. onlyIcon: true,
  370. icon:NSImage(named: "KMNImageNameContentRotateRight"),
  371. keepPressState: false)
  372. rotaRightButton.setTarget(self, action: #selector(rotateRightButtonClicked(_ :)))
  373. horizontalMirrorButton.properties = ComponentButtonProperty(type: .text_gray,
  374. size: .s,
  375. state: .normal,
  376. onlyIcon: true,
  377. icon:NSImage(named: "KMNImageNameContentHorMirr"),
  378. keepPressState: false)
  379. horizontalMirrorButton.setTarget(self, action: #selector(horizontalMirrorButtonClicked(_ :)))
  380. verticalMirrorButton.properties = ComponentButtonProperty(type: .text_gray,
  381. size: .s,
  382. state: .normal,
  383. onlyIcon: true,
  384. icon:NSImage(named: "KMNImageNameContentVerMirr"),
  385. keepPressState: false)
  386. verticalMirrorButton.setTarget(self, action: #selector(verticalMirrorButtonClicked(_ :)))
  387. alightButton.properties = ComponentButtonProperty(type: .text_gray,
  388. size: .s,
  389. state: .normal,
  390. onlyIcon: true,
  391. icon:NSImage(named: "KMNImageNameObjectPopAlightLeft"))
  392. alightButton.setTarget(self, action: #selector(alightButtonClicked(_ :)))
  393. cropRestButton.properties = ComponentButtonProperty(type: .text_gray,
  394. size: .s,
  395. state: .normal,
  396. onlyIcon: true,
  397. icon:NSImage(named: "KMNImageNameContentCropRest"),keepPressState: false)
  398. cropRestButton.setTarget(self, action: #selector(cropRestClicked(_ :)))
  399. cropSureButton.properties = ComponentButtonProperty(type: .text_gray,
  400. size: .s,
  401. state: .normal,
  402. onlyIcon: true,
  403. icon:NSImage(named: "KMNImageNameContentCropSure"),keepPressState: false)
  404. cropSureButton.setTarget(self, action: #selector(cropSureClicked(_ :)))
  405. }
  406. override func updateUIThemeColor() {
  407. super.updateUIThemeColor()
  408. lineBox.fillColor = ComponentLibrary.shared.getComponentColorFromKey("colorBorder/divider")
  409. contentBox.fillColor = ComponentLibrary.shared.getComponentColorFromKey("colorBg/popup")
  410. contentBox.borderColor = ComponentLibrary.shared.getComponentColorFromKey("colorBorder/3-default")
  411. }
  412. override func updateUILanguage() {
  413. super.updateUILanguage()
  414. }
  415. //MARK: - Public
  416. public func closePopView() {
  417. if ObjectPopover?.isShown == true {
  418. ObjectPopover?.close()
  419. }
  420. if fontPopover?.isShown == true {
  421. fontPopover?.close()
  422. }
  423. }
  424. //MARK: - private
  425. private func congfigFontPopUI() {
  426. fontNameSelect.properties = ComponentSelectProperties(size: .s,
  427. state: .normal,
  428. isDisabled: false,
  429. isError: false,
  430. leftIcon: false,
  431. placeholder: nil,
  432. errorText: nil,
  433. creatable: false,
  434. text: NSLocalizedString("", comment: ""))
  435. fontNameSelect.delegate = self
  436. var menuItemArr: [ComponentMenuitemProperty] = []
  437. for familyName in CPDFFont.familyNames {
  438. let fontNames = CPDFFont.fontNames(forFamilyName: familyName)
  439. let itemProperty: ComponentMenuitemProperty = ComponentMenuitemProperty(multipleSelect: false,
  440. itemSelected: false,
  441. isDisabled: false,
  442. keyEquivalent: nil,
  443. text: familyName,
  444. identifier: "1")
  445. var subMenuItemArr: [ComponentMenuitemProperty] = []
  446. for fontName in fontNames {
  447. let subItemProperty: ComponentMenuitemProperty = ComponentMenuitemProperty(multipleSelect: false,
  448. itemSelected: false,
  449. isDisabled: false,
  450. keyEquivalent: nil,
  451. text: fontName,identifier: "2")
  452. subMenuItemArr.append(subItemProperty)
  453. }
  454. itemProperty.subPropertys = subMenuItemArr
  455. menuItemArr.append(itemProperty)
  456. }
  457. fontNameSelect.updateMenuItemsArr(menuItemArr)
  458. }
  459. private func congfigSignImageUI() {
  460. rightConstraint.constant = 36
  461. imagePopView.display()
  462. cropButton.properties = ComponentButtonProperty(type: .text_gray,
  463. size: .s,
  464. state: .normal,
  465. onlyIcon: true,
  466. icon:NSImage(named: "KMNImageNameContentCrop"),
  467. keepPressState: false)
  468. cropButton.reloadData()
  469. cropButton.setTarget(self, action: #selector(cropImageButtonClicked(_ :)))
  470. replaceButton.properties = ComponentButtonProperty(type: .text_gray,
  471. size: .s,
  472. state: .normal,
  473. onlyIcon: true,
  474. icon:NSImage(named: "KMNImageNameContentReplace"),
  475. keepPressState: false)
  476. replaceButton.reloadData()
  477. replaceButton.setTarget(self, action: #selector(replaceImageButtonClicked(_ :)))
  478. extractButton.properties = ComponentButtonProperty(type: .text_gray,
  479. size: .s,
  480. state: .normal,
  481. onlyIcon: true,
  482. icon:NSImage(named: "KMNImageNameContentExtract"),
  483. keepPressState: false)
  484. extractButton.reloadData()
  485. extractButton.setTarget(self, action: #selector(extractImageButtonClicked(_ :)))
  486. extractButton.isHidden = false
  487. }
  488. private func congfigMultpleImageUI() {
  489. rightConstraint.constant = 0
  490. imagePopView.display()
  491. cropButton.properties = ComponentButtonProperty(type: .text_gray,
  492. size: .s,
  493. state: .normal,
  494. onlyIcon: true,
  495. icon:NSImage(named: "KMNImageNameContentExtract"),
  496. keepPressState: false)
  497. cropButton.reloadData()
  498. cropButton.setTarget(self, action: #selector(extractImageButtonClicked(_ :)))
  499. replaceButton.properties = ComponentButtonProperty(type: .text_gray,
  500. size: .s,
  501. state: .normal,
  502. onlyIcon: true,
  503. icon:NSImage(named: "KMNImageNameObjectPopAlightLeft"),
  504. keepPressState: false)
  505. replaceButton.setTarget(self, action: #selector(alightButtonClicked(_ :)))
  506. replaceButton.reloadData()
  507. extractButton.isHidden = true
  508. }
  509. func removeGroupView() {
  510. if extractGroupView != nil {
  511. extractGroupView?.removeFromSuperview()
  512. }
  513. extractButton.properties.state = .normal
  514. extractButton.reloadData()
  515. }
  516. //MARK: - Action
  517. @objc func paneButtonClicked(_ sender: NSView) {
  518. isOpenPane = !isOpenPane
  519. paneCallback?(isOpenPane)
  520. }
  521. @objc func fontBoldButtonClicked(_ sender: NSView) {
  522. listView?.setEditingTextarea_Bold()
  523. updatePDFViewCallback?()
  524. let textEditAreas = listView?.km_editingTextAreas()
  525. let newBolds:[Bool] = listView?.km_editTextAreasFontBolds(textEditAreas ?? []) ?? []
  526. if newBolds.first == false {
  527. fontBoldSelectorItem.properties.state = .normal
  528. fontBoldSelectorItem.reloadData()
  529. }
  530. }
  531. @objc func fontItalicButtonClicked(_ sender: NSView) {
  532. listView?.setEditingTextarea_Italic()
  533. updatePDFViewCallback?()
  534. let textEditAreas = listView?.km_editingTextAreas()
  535. let newItalics:[Bool] = listView?.km_editTextAreasFontItalics(textEditAreas ?? []) ?? []
  536. if newItalics.first == false {
  537. fontItalicSelectorItem.properties.state = .normal
  538. fontItalicSelectorItem.reloadData()
  539. }
  540. }
  541. @objc func fontUnderLineButtonClicked(_ sender: NSView) {
  542. listView?.setEditingTextarea_Under()
  543. updatePDFViewCallback?()
  544. let textEditAreas = listView?.km_editingTextAreas()
  545. let newUnders:[Bool] = listView?.km_editTextAreasFontUnder(textEditAreas ?? []) ?? []
  546. }
  547. @objc func fontStrikeoutLineButtonClicked(_ sender: NSView) {
  548. listView?.setEditingTextarea_Strikeout()
  549. updatePDFViewCallback?()
  550. let textEditAreas = listView?.km_editingTextAreas()
  551. let newStrikeouts:[Bool] = listView?.km_editTextAreasFontStrikeout(textEditAreas ?? []) ?? []
  552. }
  553. @objc func fontSizeZoomOutButtonClicked(_ sender: NSView) {
  554. listView?.zoomOutEditTextFontSize()
  555. updatePDFViewCallback?()
  556. }
  557. @objc func fontSizeZoomInButtonClicked(_ sender: NSView) {
  558. listView?.zoomInEditTextFontSize()
  559. updatePDFViewCallback?()
  560. }
  561. @objc func alightButtonClicked(_ sender: NSView) {
  562. if ObjectPopover?.isShown == true {
  563. ObjectPopover?.close()
  564. } else {
  565. let vc = KMNPopDetailsViewController(nibName: "KMNPopDetailsViewController", bundle: nil)
  566. let createFilePopover: NSPopover = NSPopover.init()
  567. createFilePopover.contentViewController = vc
  568. createFilePopover.delegate = self
  569. createFilePopover.animates = false
  570. createFilePopover.behavior = .semitransient
  571. createFilePopover.setValue(true, forKey: "shouldHideAnchor")
  572. createFilePopover.show(relativeTo: CGRect(x: sender.bounds.origin.x, y: 20, width: sender.bounds.size.width, height: sender.bounds.size.height), of: sender, preferredEdge: .maxY)
  573. if (editContentPopMode.editAreas.count == 2) {
  574. vc.detailPopType = .doubleObjectAlight
  575. } else if (editContentPopMode.editAreas.count > 2) {
  576. vc.detailPopType = .multpleObjectAlight
  577. }
  578. vc.objectChangeAlighCallback = { [weak self] alight in
  579. self?.objectAlign = alight
  580. self?.updatePDFViewCallback?()
  581. }
  582. ObjectPopover = createFilePopover
  583. vc.objectAlignType = objectAlign
  584. }
  585. }
  586. @objc func fontAlightButtonClicked(_ sender: NSView) {
  587. if fontPopover?.isShown == true {
  588. fontPopover?.close()
  589. } else {
  590. let vc = KMNPopDetailsViewController(nibName: "KMNPopDetailsViewController", bundle: nil)
  591. let createFilePopover: NSPopover = NSPopover.init()
  592. createFilePopover.contentViewController = vc
  593. createFilePopover.delegate = self
  594. createFilePopover.animates = false
  595. createFilePopover.behavior = .semitransient
  596. createFilePopover.setValue(true, forKey: "shouldHideAnchor")
  597. createFilePopover.show(relativeTo: CGRect(x: sender.bounds.origin.x, y: 20, width: sender.bounds.size.width, height: sender.bounds.size.height), of: sender, preferredEdge: .maxY)
  598. vc.detailPopType = .contentEditAlight
  599. vc.fontChangeAlighCallback = { [weak self] alight in
  600. self?.listView?.setEditingTextarea_Alignment(align: alight)
  601. self?.fontAlight = alight
  602. self?.updatePDFViewCallback?()
  603. }
  604. fontPopover = createFilePopover
  605. vc.fontAlight = fontAlight
  606. }
  607. }
  608. @objc func rotateLeftButtonClicked(_ sender: NSView) {
  609. listView?.leftRotateAction()
  610. updatePDFViewCallback?()
  611. }
  612. @objc func rotateRightButtonClicked(_ sender: NSView) {
  613. listView?.rightRotateAction()
  614. updatePDFViewCallback?()
  615. }
  616. @objc func horizontalMirrorButtonClicked(_ sender: NSView) {
  617. listView?.reverseYAction()
  618. updatePDFViewCallback?()
  619. }
  620. @objc func verticalMirrorButtonClicked(_ sender: NSView) {
  621. listView?.reverseXAction()
  622. updatePDFViewCallback?()
  623. }
  624. @objc func cropImageButtonClicked(_ sender: NSView) {
  625. listView?.cropAction()
  626. updatePDFViewCallback?()
  627. }
  628. @objc func replaceImageButtonClicked(_ sender: NSView) {
  629. listView?.replaceImageEdit()
  630. updatePDFViewCallback?()
  631. }
  632. @objc func extractImageButtonClicked(_ sender: NSView) {
  633. if extractGroupView?.superview != nil {
  634. removeGroupView()
  635. } else {
  636. var viewHeight: CGFloat = 8
  637. var menuItemArr: [ComponentMenuitemProperty] = []
  638. for i in ["jpg", "png", "pdf"] {
  639. let properties_Menuitem: ComponentMenuitemProperty = ComponentMenuitemProperty(multipleSelect: false,
  640. itemSelected: false,
  641. isDisabled: false,
  642. keyEquivalent: nil,
  643. text: KMLocalizedString(i))
  644. menuItemArr.append(properties_Menuitem)
  645. viewHeight += 36
  646. }
  647. if extractGroupView == nil {
  648. extractGroupView = ComponentGroup.createFromNib(in: ComponentLibrary.shared.componentBundle())
  649. }
  650. extractGroupView?.groupDelegate = self
  651. extractGroupView?.frame = CGRectMake(310, 0, 72, viewHeight)
  652. extractGroupView?.updateGroupInfo(menuItemArr)
  653. var point = CGPoint(x: sender.frame.origin.x + sender.frame.size.width/2, y: CGRectGetMaxY(sender.frame))
  654. point = self.view.convert(point, to: nil)
  655. extractGroupView?.showWithPoint(point, relativeTo:sender)
  656. extractButton.properties.state = .pressed
  657. extractButton.reloadData()
  658. }
  659. }
  660. @objc func cropRestClicked(_ sender: NSView) {
  661. listView?.cropRestAction()
  662. }
  663. @objc func cropSureClicked(_ sender: NSView) {
  664. listView?.cropComfirmAction()
  665. }
  666. @objc func fontColorChange(_ sender: Any) {
  667. if let color = (sender as? NSColorPanel)?.color {
  668. listView?.changeEditingTextarea_Color(color: color)
  669. updatePDFViewCallback?()
  670. }
  671. }
  672. }
  673. //MARK: - ComponentCColorDelegate
  674. extension KMNPopContentEditViewController: ComponentCColorDelegate {
  675. func componentCColorDidChooseColor(_ view: NSView, _ color: NSColor?) {
  676. if (view == fontColorItem) {
  677. fontColorItem.properties?.state = .normal
  678. fontColorItem.reloadData()
  679. let colorPanel = NSColorPanel.shared
  680. colorPanel.setTarget(self)
  681. colorPanel.showsAlpha = false
  682. colorPanel.setAction(#selector(self.fontColorChange(_:)))
  683. colorPanel.orderFront(nil)
  684. }
  685. }
  686. }
  687. //MARK: - ComponentSelectDelegate
  688. extension KMNPopContentEditViewController: ComponentSelectDelegate {
  689. func componentSelectDidSelect(view: ComponentSelect?, menuItemProperty: ComponentMenuitemProperty?) {
  690. if(view == fontNameSelect) {
  691. if menuItemProperty?.identifier == "1" {
  692. let familyName = fontNameSelect.properties.text ?? "Helvetica"
  693. let styles = CPDFFont.fontNames(forFamilyName: familyName)
  694. compdfFont = CPDFFont(familyName: familyName, fontStyle: styles.first ?? "")
  695. listView?.setEditingTextarea_font(font: compdfFont ?? CPDFFont(familyName: "Helvetica", fontStyle: ""))
  696. } else if menuItemProperty?.identifier == "2" { //字体样式
  697. compdfFont = CPDFFont(familyName: compdfFont?.familyName ?? "Helvetica", fontStyle: menuItemProperty?.text ?? "")
  698. listView?.setEditingTextarea_font(font: compdfFont ?? CPDFFont(familyName: "Helvetica", fontStyle: ""))
  699. }
  700. }
  701. }
  702. }
  703. //MARK: - ComponentSelectDelegate
  704. extension KMNPopContentEditViewController: NSPopoverDelegate {
  705. func popoverWillClose(_ notification: Notification) {
  706. if fontPopover == (notification.object as? NSPopover) {
  707. if(fontAlightButton.properties.state == .pressed) {
  708. fontAlightButton.properties.state = .normal
  709. fontAlightButton.reloadData()
  710. }
  711. } else if ObjectPopover == (notification.object as? NSPopover) {
  712. if(alightButton.properties.state == .pressed) {
  713. alightButton.properties.state = .normal
  714. alightButton.reloadData()
  715. }
  716. }
  717. }
  718. }
  719. extension KMNPopContentEditViewController: ComponentGroupDelegate {
  720. func componentGroupDidDismiss(group: ComponentGroup?) {
  721. removeGroupView()
  722. extractButton.properties.state = .normal
  723. extractButton.reloadData()
  724. }
  725. func componentGroupDidSelect(group: ComponentGroup?, menuItemProperty: ComponentMenuitemProperty?) {
  726. if group == extractGroupView {
  727. if let selItem = menuItemProperty {
  728. let index = group?.menuItemArr.firstIndex(of: selItem)
  729. if index == 0 {
  730. listView?.exportEditingImageAreasAction(format: "jpg")
  731. } else if index == 1 {
  732. listView?.exportEditingImageAreasAction(format: "png")
  733. } else if index == 2 {
  734. listView?.exportEditingImageAreasAction(format: "pdf")
  735. }
  736. }
  737. }
  738. }
  739. }