KMNSplitPDFWindowController.swift 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614
  1. //
  2. // KMNSplitPDFWindowController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by 丁林圭 on 2024/10/24.
  6. //
  7. import Cocoa
  8. import KMComponentLibrary
  9. class KMNSplitPDFWindowController: KMNBaseWindowController {
  10. @IBOutlet var progress: NSProgressIndicator!
  11. @IBOutlet var titleLabel: NSTextField!
  12. @IBOutlet var methodLabel: NSTextField!
  13. @IBOutlet var averagePerRadio: ComponentRadio!
  14. @IBOutlet var averagePernInputNumber: ComponentInputNumber!
  15. @IBOutlet var averagePernLabel: NSTextField!
  16. @IBOutlet var averageSplitRadio: ComponentRadio!
  17. @IBOutlet var averageSplitInputNumber: ComponentInputNumber!
  18. @IBOutlet var averageSplitLabel: NSTextField!
  19. @IBOutlet var splitRangeRadio: ComponentRadio!
  20. @IBOutlet var splitRangeSelect: ComponentSelect!
  21. @IBOutlet var fileTitleLabel: NSTextField!
  22. @IBOutlet var fileNameBox: NSBox!
  23. @IBOutlet var fileNameLabel: NSTextField!
  24. @IBOutlet var precedeCheckBox: ComponentCheckBox!
  25. @IBOutlet var tagCheckBox: ComponentCheckBox!
  26. @IBOutlet var tagInput: ComponentInput!
  27. @IBOutlet var separatorCheckBox: ComponentCheckBox!
  28. @IBOutlet var separatorInput: ComponentInput!
  29. @IBOutlet var cancelButton: ComponentButton!
  30. @IBOutlet var splitButton: ComponentButton!
  31. @IBOutlet var cancelWidthButton:NSLayoutConstraint!
  32. @IBOutlet var splitWidthButton:NSLayoutConstraint!
  33. @IBOutlet var averagePerRadioWidthButton:NSLayoutConstraint!
  34. @IBOutlet var averageSplitRadioWidthButton:NSLayoutConstraint!
  35. @IBOutlet var splitRangeRadioWidthButton:NSLayoutConstraint!
  36. @IBOutlet var tagCheckWidthButton:NSLayoutConstraint!
  37. @IBOutlet var separatorCheckWidthButton:NSLayoutConstraint!
  38. private var orgDocument:CPDFDocument?
  39. private var selectionIndexPaths: Set<IndexPath> = []
  40. private func viewFileAtFinder(_ filePath: String) {
  41. let workspace = NSWorkspace.shared
  42. let url = URL(fileURLWithPath: filePath)
  43. workspace.activateFileViewerSelecting([url])
  44. }
  45. private func setUpProperty() {
  46. titleLabel.stringValue = KMLocalizedString("Split")
  47. titleLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-m-medium")
  48. titleLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/1")
  49. methodLabel.stringValue = KMLocalizedString("Split Method")
  50. methodLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-m-medium")
  51. methodLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/2")
  52. fileTitleLabel.stringValue = KMLocalizedString("File Name")
  53. fileTitleLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-m-medium")
  54. fileTitleLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/2")
  55. averagePerRadio.properties = ComponentCheckBoxProperty(size: .s,
  56. state: .normal,
  57. isDisabled: false,
  58. showhelp: false,
  59. text: KMLocalizedString("Split by every"),
  60. checkboxType: .normal)
  61. averagePernLabel.stringValue = KMLocalizedString("page(s)")
  62. averagePernLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("comp-field/colorText-filled-dis")
  63. averagePernLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-s-regular")
  64. averageSplitRadio.properties = ComponentCheckBoxProperty(size: .s,
  65. state: .normal,
  66. isDisabled: false,
  67. showhelp: false,
  68. text: KMLocalizedString("Split averagely to"),
  69. checkboxType: .normal)
  70. averageSplitLabel.stringValue = KMLocalizedString("PDF files")
  71. averageSplitLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("comp-field/colorText-filled-dis")
  72. averageSplitLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-s-regular")
  73. fileNameLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/2")
  74. fileNameLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-s-regular")
  75. splitRangeRadio.properties = ComponentCheckBoxProperty(size: .s,
  76. state: .normal,
  77. isDisabled: false,
  78. showhelp: false,
  79. text: KMLocalizedString("Split by page range"),
  80. checkboxType: .selected)
  81. precedeCheckBox.properties = ComponentCheckBoxProperty(size: .s,
  82. state: .normal,
  83. isDisabled: false,
  84. showhelp: false,
  85. text: KMLocalizedString("Keep the current file name in front of labels"),
  86. checkboxType: .selected)
  87. tagCheckBox.properties = ComponentCheckBoxProperty(size: .s,
  88. state: .normal,
  89. isDisabled: false,
  90. showhelp: false,
  91. text: KMLocalizedString("Label"),
  92. checkboxType: .selected)
  93. separatorCheckBox.properties = ComponentCheckBoxProperty(size: .s,
  94. state: .normal,
  95. isDisabled: false,
  96. showhelp: false,
  97. text: KMLocalizedString("Separator"),
  98. checkboxType: .selected)
  99. averagePernInputNumber.properties = ComponentInputNumberProperty(alignment: .left,
  100. size: .s,
  101. state: .normal,
  102. isError: false,
  103. showErrorInfo: false,
  104. isDisabled: true,
  105. showPrefix: false,
  106. showSuffix: false,
  107. minSize: 1,
  108. maxSize: Int(orgDocument?.pageCount ?? 1),
  109. text:"1")
  110. averagePernInputNumber.delegate = self
  111. averageSplitInputNumber.properties = ComponentInputNumberProperty(alignment: .left,
  112. size: .s,
  113. state: .normal,
  114. isError: false,
  115. showErrorInfo: false,
  116. isDisabled: true,
  117. showPrefix: false,
  118. showSuffix: false,
  119. minSize: 1,
  120. maxSize: Int(orgDocument?.pageCount ?? 1),
  121. text: "1")
  122. averageSplitInputNumber.delegate = self
  123. let inputTagProperty: ComponentInputProperty = ComponentInputProperty(size: .s,
  124. state:.pressed ,
  125. isError: false,
  126. showPrefix: false,
  127. showSuffix: false,
  128. showClear: false,
  129. isDisabled: false,
  130. placeholder: "",
  131. text: "Part")
  132. tagInput.properties = inputTagProperty
  133. tagInput.delegate = self
  134. let inputSeparatorProperty: ComponentInputProperty = ComponentInputProperty(size: .s,
  135. state:.pressed ,
  136. isError: false,
  137. showPrefix: false,
  138. showSuffix: false,
  139. showClear: false,
  140. isDisabled: false,
  141. placeholder: "",
  142. text: "-")
  143. separatorInput.properties = inputSeparatorProperty
  144. separatorInput.delegate = self
  145. splitRangeSelect.properties = ComponentSelectProperties(size: .s,
  146. state: .normal,
  147. isDisabled: false,
  148. isError: false,
  149. leftIcon: false,
  150. placeholder: nil,
  151. errorText: nil,
  152. creatable: false,
  153. text: KMLocalizedString("Odd Pages Only", comment: ""))
  154. splitButton.properties = ComponentButtonProperty(type: .primary,
  155. size: .s,
  156. state: .normal,
  157. isDisable: false,
  158. buttonText: KMLocalizedString("Split"))
  159. splitButton.setTarget(self, action: #selector(splitButtonClicked(_ :)))
  160. splitWidthButton.constant = splitButton.properties.propertyInfo.viewWidth
  161. cancelButton.properties = ComponentButtonProperty(type: .default_tertiary,
  162. size: .s,
  163. state: .normal,
  164. buttonText: KMLocalizedString("Cancel"))
  165. cancelButton.setTarget(self, action: #selector(cancelButtonClicked(_ :)))
  166. cancelWidthButton.constant = cancelButton.properties.propertyInfo.viewWidth
  167. fileNameBox.fillColor = ComponentLibrary.shared.getComponentColorFromKey("comp-field/colorText-filled-dis")
  168. averagePerRadio.setTarget(self, action: #selector(splitMethodClicked(_:)))
  169. averageSplitRadio.setTarget(self, action: #selector(splitMethodClicked(_:)))
  170. splitRangeRadio.setTarget(self, action: #selector(splitMethodClicked(_:)))
  171. precedeCheckBox.setTarget(self, action: #selector(changeNameClick(_:)))
  172. tagCheckBox.setTarget(self, action: #selector(changeNameClick(_:)))
  173. separatorCheckBox.setTarget(self, action: #selector(changeNameClick(_:)))
  174. setUpPageSelctProperty()
  175. splitRangeSelect.delegate = self
  176. averagePerRadioWidthButton.constant = averagePerRadio.properties.propertyInfo.viewWidth
  177. averageSplitRadioWidthButton.constant = averageSplitRadio.properties.propertyInfo.viewWidth
  178. splitRangeRadioWidthButton.constant = splitRangeRadio.properties.propertyInfo.viewWidth
  179. tagCheckWidthButton.constant = tagCheckBox.properties.propertyInfo.viewWidth
  180. separatorCheckWidthButton.constant = separatorCheckBox.properties.propertyInfo.viewWidth
  181. cancelWidthButton.constant = cancelButton.properties.propertyInfo.viewWidth
  182. splitWidthButton.constant = splitButton.properties.propertyInfo.viewWidth
  183. }
  184. private func setUpPageSelctProperty() {
  185. var menuItemString:[String] = [KMLocalizedString("Odd Pages Only"),
  186. KMLocalizedString("Even Pages Only"),
  187. KMLocalizedString("e.g. 1,3-5,10")]
  188. if orgDocument?.pageCount ?? 0 <= 1 {
  189. menuItemString.removeObject(KMLocalizedString("Even Pages Only"))
  190. }
  191. var menuItemArr: [ComponentMenuitemProperty] = []
  192. for language in menuItemString {
  193. let itemProperty: ComponentMenuitemProperty = ComponentMenuitemProperty(multipleSelect: false,
  194. itemSelected: false,
  195. isDisabled: false,
  196. keyEquivalent: nil,
  197. text: language)
  198. menuItemArr.append(itemProperty)
  199. }
  200. splitRangeSelect.updateMenuItemsArr(menuItemArr)
  201. }
  202. override func windowDidLoad() {
  203. super.windowDidLoad()
  204. setUpProperty()
  205. var isEditIndex:Int = 2
  206. if(orgDocument?.pageCount ?? 0 <= 1) {
  207. isEditIndex = 1
  208. }
  209. splitRangeSelect.selectItemAtIndex(isEditIndex)
  210. splitRangeSelect.properties.creatable = true
  211. splitRangeSelect.properties.text =
  212. KMNTools.parseIndexPathsSet(indexSets: selectionIndexPaths)
  213. splitRangeSelect.reloadData()
  214. updateFileName()
  215. progress.isHidden = true
  216. }
  217. func updateFileName() {
  218. let pdfName = orgDocument?.documentURL.deletingPathExtension().path.lastPathComponent ?? ""
  219. var splitPartString = ""
  220. var separatorString = ""
  221. if (tagCheckBox.properties.checkboxType == .selected) {
  222. splitPartString = tagInput.properties.text
  223. }
  224. if (separatorCheckBox.properties.checkboxType == .selected) {
  225. separatorString = separatorInput.properties.text
  226. }
  227. var partName = ""
  228. if (precedeCheckBox.properties.checkboxType == .selected) {
  229. if (separatorString.isEmpty == false) {
  230. if (partName.isEmpty == false) {
  231. partName.append(separatorString)
  232. } else {
  233. partName = separatorString
  234. }
  235. }
  236. if (splitPartString.isEmpty == false) {
  237. if (partName.isEmpty == false) {
  238. partName.append(splitPartString)
  239. } else {
  240. partName = splitPartString
  241. }
  242. }
  243. fileNameLabel.stringValue = String(format: "%@%@.pdf", pdfName, partName)
  244. } else {
  245. if (splitPartString.isEmpty == false) {
  246. if (partName.isEmpty == false) {
  247. partName.append(splitPartString)
  248. } else {
  249. partName = splitPartString
  250. }
  251. }
  252. if (separatorString.isEmpty == false) {
  253. if (partName.isEmpty == false) {
  254. partName.append(separatorString)
  255. } else {
  256. partName = separatorString
  257. }
  258. }
  259. fileNameLabel.stringValue = String(format: "%@%@.pdf", partName, pdfName)
  260. }
  261. }
  262. convenience init(_ document: CPDFDocument?, selectionIndexPaths: Set<IndexPath>) {
  263. self.init(windowNibName: "KMNSplitPDFWindowController")
  264. orgDocument = document
  265. self.selectionIndexPaths = selectionIndexPaths // 修正此行
  266. }
  267. convenience init(_ filePath: String,password:String?) {
  268. self.init(windowNibName: "KMNSplitPDFWindowController")
  269. let document = CPDFDocument.init(url: URL(fileURLWithPath: filePath))
  270. if password != nil {
  271. document?.unlock(withPassword: password as String?)
  272. }
  273. orgDocument = document
  274. selectionIndexPaths = [IndexPath(item: 0, section: 0)] // 修正此行
  275. }
  276. //MARK: - Action
  277. @objc func cancelButtonClicked(_ sender: NSView) {
  278. own_closeEndSheet()
  279. }
  280. @objc func splitButtonClicked(_ sender: NSView) {
  281. let pageRangeSelectIndex = splitRangeSelect.indexOfSelect()
  282. let fileAttribute = KMNFileAttribute()
  283. if(splitRangeRadio.properties.checkboxType == .selected) {
  284. fileAttribute.password = orgDocument?.password ?? ""
  285. fileAttribute.pdfDocument = orgDocument
  286. fileAttribute.filePath = orgDocument?.documentURL.path ?? ""
  287. if(pageRangeSelectIndex == 0) {
  288. fileAttribute.bAllPage = false
  289. fileAttribute.pagesType = .OnlyOdd
  290. } else {
  291. fileAttribute.bAllPage = false
  292. if(orgDocument?.pageCount ?? 0 <= 1) {
  293. fileAttribute.pagesType = .PagesString
  294. fileAttribute.pagesString = splitRangeSelect.properties.text ?? ""
  295. } else {
  296. if(pageRangeSelectIndex == 2) {
  297. fileAttribute.pagesType = .OnlyEven
  298. } else {
  299. fileAttribute.pagesType = .PagesString
  300. fileAttribute.pagesString = splitRangeSelect.properties.text ?? ""
  301. }
  302. }
  303. }
  304. if (fileAttribute.fetchSelectPages().isEmpty) {
  305. let alert = NSAlert()
  306. alert.alertStyle = .critical
  307. alert.messageText = String(format: "%@ %@", fileAttribute.filePath.lastPathComponent, KMLocalizedString("Invalid page range or the page number is out of range. Please try again."))
  308. alert.runModal()
  309. return
  310. }
  311. }
  312. let panel = NSOpenPanel()
  313. panel.canChooseFiles = false
  314. panel.canChooseDirectories = true
  315. panel.canCreateDirectories = true
  316. panel.beginSheetModal(for: self.window!) { result in
  317. if (result == .OK) {
  318. let outputURL = panel.urls.first
  319. var tFolderPath = outputURL!.path
  320. var index = 0
  321. let folderName = self.fileNameLabel.stringValue.deletingPathExtension.lastPathComponent
  322. var folderPath = "\(tFolderPath)" + "/" + "\(folderName)"
  323. //创建目录
  324. while FileManager.default.fileExists(atPath: folderPath) {
  325. index += 1
  326. folderPath = "\(tFolderPath)" + "/" + "\(folderName)_\(index)"
  327. }
  328. tFolderPath = folderPath
  329. try?FileManager.default.createDirectory(atPath: tFolderPath, withIntermediateDirectories: true)
  330. self.progress.isHidden = false
  331. self.cancelButton.properties.isDisabled = true
  332. self.splitButton.properties.isDisabled = true
  333. self.cancelButton.reloadData()
  334. self.splitButton.reloadData()
  335. self.progress.startAnimation(nil)
  336. if(self.averagePerRadio.properties.checkboxType == .selected) {
  337. let index = Int(self.averagePernInputNumber.properties.text ?? "1")
  338. DispatchQueue.global().async {
  339. let successArray = self.orgDocument?.splitByPagesWith(index ?? 1, folerPath: tFolderPath, fileName: folderName) ?? []
  340. DispatchQueue.main.async {
  341. self.progress.isHidden = true
  342. self.cancelButton.properties.isDisabled = false
  343. self.splitButton.properties.isDisabled = false
  344. self.cancelButton.reloadData()
  345. self.splitButton.reloadData()
  346. if (successArray.isEmpty == false) {
  347. let response = KMAlertTool.runModelForMainThread_r(message: KMLocalizedString("Splitting completed. Tap 'OK' to open the output folder."), buttons: [KMLocalizedString("OK")])
  348. if (response == .alertFirstButtonReturn ) {
  349. self.own_closeEndSheet()
  350. DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
  351. let filePath = successArray.first ?? ""
  352. self.viewFileAtFinder(filePath)
  353. }
  354. }
  355. } else {
  356. let response = KMAlertTool.runModelForMainThread_r(message: KMLocalizedString("Failed to split!"))
  357. if (response == .alertFirstButtonReturn) {
  358. self.own_closeEndSheet()
  359. }
  360. }
  361. }
  362. }
  363. } else if(self.averageSplitRadio.properties.checkboxType == .selected) {
  364. let dex = Int(self.averageSplitInputNumber.properties.text ?? "1")
  365. DispatchQueue.global().async {
  366. let successArray = self.orgDocument?.splitByFileWith(dex ?? 1, folerPath: tFolderPath, fileName: folderName) ?? []
  367. DispatchQueue.main.async {
  368. self.progress.isHidden = true
  369. self.cancelButton.properties.isDisabled = false
  370. self.splitButton.properties.isDisabled = false
  371. self.cancelButton.reloadData()
  372. self.splitButton.reloadData()
  373. if (successArray.isEmpty == false) {
  374. let response = KMAlertTool.runModelForMainThread_r(message: KMLocalizedString("Splitting completed. Tap 'OK' to open the output folder."), buttons: [KMLocalizedString("OK")])
  375. if (response == .alertFirstButtonReturn) {
  376. self.own_closeEndSheet()
  377. DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
  378. let filePath = successArray.first ?? ""
  379. self.viewFileAtFinder(filePath)
  380. }
  381. }
  382. }else{
  383. let response = KMAlertTool.runModelForMainThread_r(message: KMLocalizedString("Failed to split!"))
  384. if (response == .alertFirstButtonReturn) {
  385. self.own_closeEndSheet()
  386. }
  387. }
  388. }
  389. }
  390. } else {
  391. var isSuccessfully:Bool = false
  392. DispatchQueue.global().async { [self] in
  393. var pdfDocument1 = CPDFDocument()
  394. var pdfDocument2 = CPDFDocument()
  395. let pageCnt = self.orgDocument?.pageCount ?? 0
  396. let pages = fileAttribute.fetchSelectPages()
  397. for i in 0 ..< pageCnt {
  398. var isSelected = false
  399. for number in pages {
  400. if number == i+1 {
  401. isSelected = true
  402. if let page = self.orgDocument?.page(at: i) as? CPDFPage {
  403. pdfDocument1?.insertPageObject(page, at: pdfDocument1!.pageCount)
  404. }
  405. }
  406. }
  407. if (!isSelected) {
  408. if let page = self.orgDocument?.page(at: i) as? CPDFPage {
  409. pdfDocument2?.insertPageObject(page, at: pdfDocument2!.pageCount)
  410. }
  411. }
  412. }
  413. if (pdfDocument1!.pageCount > 0) {
  414. let tpath = "\(tFolderPath)/\(folderName) 1.pdf"
  415. isSuccessfully = pdfDocument1?.write(toFile:tpath) ?? false
  416. }
  417. if (pdfDocument2!.pageCount > 0) {
  418. let tPath = "\(tFolderPath)/\(folderName) 2.pdf"
  419. pdfDocument2?.write(toFile: tPath)
  420. }
  421. DispatchQueue.main.async {
  422. self.progress.isHidden = true
  423. self.cancelButton.properties.isDisabled = false
  424. self.splitButton.properties.isDisabled = false
  425. self.cancelButton.reloadData()
  426. self.splitButton.reloadData()
  427. if (isSuccessfully) {
  428. let response = KMAlertTool.runModelForMainThread_r(message: KMLocalizedString("Splitting completed. Tap 'OK' to open the output folder."), buttons: [KMLocalizedString("OK")])
  429. if (response == .alertFirstButtonReturn) {
  430. self.own_closeEndSheet()
  431. DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
  432. let filePath = "\(tFolderPath)/\(folderName) 1.pdf"
  433. self.viewFileAtFinder(filePath)
  434. }
  435. }
  436. } else {
  437. let response = KMAlertTool.runModelForMainThread_r(message: KMLocalizedString("Failed to split!"))
  438. if (response == .alertFirstButtonReturn) {
  439. self.own_closeEndSheet()
  440. }
  441. }
  442. }
  443. }
  444. }
  445. }
  446. }
  447. }
  448. @objc func changeNameClick(_ sender: NSView){
  449. updateFileName()
  450. }
  451. @objc func splitMethodClicked(_ sender: NSView){
  452. var oldSelectRadioBtn:ComponentRadio? = nil
  453. if sender == averagePerRadio {
  454. if(averageSplitRadio.properties.checkboxType == .selected) {
  455. oldSelectRadioBtn = averageSplitRadio
  456. averageSplitInputNumber.properties.isDisabled = true
  457. averageSplitLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("comp-field/colorText-filled-dis")
  458. averageSplitInputNumber.reloadData()
  459. } else if (splitRangeRadio.properties.checkboxType == .selected){
  460. oldSelectRadioBtn = splitRangeRadio
  461. splitRangeSelect.properties.isDisabled = true
  462. splitRangeSelect.reloadData()
  463. }
  464. averagePernInputNumber.properties.isDisabled = false
  465. averagePernLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/1")
  466. averagePernInputNumber.reloadData()
  467. } else if sender == averageSplitRadio {
  468. if(averagePerRadio.properties.checkboxType == .selected) {
  469. oldSelectRadioBtn = averagePerRadio
  470. averagePernInputNumber.properties.isDisabled = true
  471. averagePernLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("comp-field/colorText-filled-dis")
  472. averagePernInputNumber.reloadData()
  473. } else if (splitRangeRadio.properties.checkboxType == .selected){
  474. oldSelectRadioBtn = splitRangeRadio
  475. splitRangeSelect.properties.isDisabled = true
  476. splitRangeSelect.reloadData()
  477. }
  478. averageSplitInputNumber.properties.isDisabled = false
  479. averageSplitLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/1")
  480. averageSplitInputNumber.reloadData()
  481. } else if sender == splitRangeRadio {
  482. if(averagePerRadio.properties.checkboxType == .selected) {
  483. oldSelectRadioBtn = averagePerRadio
  484. averagePernInputNumber.properties.isDisabled = true
  485. averagePernLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("comp-field/colorText-filled-dis")
  486. averagePernInputNumber.reloadData()
  487. } else if (averageSplitRadio.properties.checkboxType == .selected){
  488. oldSelectRadioBtn = averageSplitRadio
  489. averageSplitInputNumber.properties.isDisabled = true
  490. averageSplitLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("comp-field/colorText-filled-dis")
  491. averageSplitInputNumber.reloadData()
  492. }
  493. splitRangeSelect.properties.isDisabled = false
  494. splitRangeSelect.reloadData()
  495. }
  496. if(oldSelectRadioBtn != nil) {
  497. oldSelectRadioBtn?.properties.checkboxType = .normal
  498. oldSelectRadioBtn?.reloadData()
  499. }
  500. }
  501. }
  502. //MARK: - ComponentInputNumberDelegate
  503. extension KMNSplitPDFWindowController: ComponentInputNumberDelegate {
  504. func componentInputNumberDidValueChanged(inputNumber: ComponentInputNumber?) {
  505. }
  506. }
  507. //MARK: - ComponentSelectDelegate
  508. extension KMNSplitPDFWindowController: ComponentSelectDelegate {
  509. func componentSelectDidSelect(view: ComponentSelect?, menuItemProperty: ComponentMenuitemProperty?) {
  510. if(view == splitRangeSelect) {
  511. let pageRangeSelectIndex = splitRangeSelect.indexOfSelect()
  512. var isEditIndex:Int = 2
  513. if(orgDocument?.pageCount ?? 0 <= 1) {
  514. isEditIndex = 1
  515. }
  516. if (pageRangeSelectIndex == isEditIndex) {
  517. splitRangeSelect.properties.text = ""
  518. splitRangeSelect.properties.placeholder = KMLocalizedString("e.g. 1,3-5,10")
  519. splitRangeSelect.properties.creatable = true
  520. } else {
  521. splitRangeSelect.properties.placeholder = ""
  522. splitRangeSelect.properties.creatable = false
  523. }
  524. splitRangeSelect.reloadData()
  525. }
  526. }
  527. }
  528. extension KMNSplitPDFWindowController: ComponentInputDelegate {
  529. func componentInputDidEndEditing(inputView: ComponentInput) {
  530. }
  531. func componentInputDidChanged(inputView: ComponentInput) {
  532. updateFileName()
  533. }
  534. }