SplitWindowController.swift 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629
  1. //
  2. // SplitWindowController.swift
  3. // PDF Master
  4. //
  5. // Created by tangchao on 2023/11/14.
  6. //
  7. import Cocoa
  8. class SplitWindowController: NSWindowController {
  9. /*
  10. @protocol SplitDelegate <NSObject>
  11. @optional
  12. - (void)didFinshedSplitWithURL:(NSURL*)url;
  13. @end
  14. @property (nonatomic,assign) id<SplitDelegate> splitDelegate;
  15. */
  16. var fileAttribute: KMFileAttribute?
  17. //转圈提示
  18. @IBOutlet var progress: NSProgressIndicator!
  19. //分割后文档存储所在文件夹名称TextField容器View
  20. @IBOutlet var nameView: NSView!
  21. //分割后文档存储所在文件夹名称 TextField
  22. @IBOutlet var partFileNameLabel: NSTextField!
  23. @IBOutlet var originalFileButton: NSButton!
  24. //分割提示 Label
  25. @IBOutlet var splitLabel: NSTextField!
  26. @IBOutlet var splitMethodBox: NSBox!
  27. @IBOutlet var fileNameBox: NSBox!
  28. @IBOutlet var exampleLabel: NSTextField!
  29. //平均页数分割单位Pages Label
  30. @IBOutlet var pagesLabel: NSTextField!
  31. //平均分割为多少个PDF文件单位 Label
  32. @IBOutlet var filesLabel: NSTextField!
  33. //导出目录提示 Label
  34. @IBOutlet var labelingLabel: NSTextField!
  35. //按页分割页数输入 TextField
  36. @IBOutlet var byPageText: NSTextField!
  37. //按文档数量均分文档个数输入 TextField
  38. @IBOutlet var byFileText: NSTextField!
  39. //文档名称分割符输入 TextField
  40. @IBOutlet var separatorText: NSTextField!
  41. //新增文档命名拼接字段输入 TextField
  42. @IBOutlet var renameText: NSTextField!
  43. //按页分割 Button
  44. @IBOutlet var byPageButton: NSButton!
  45. //按分割文档个数分割 Button
  46. @IBOutlet var byFileButton: NSButton!
  47. //手动输入页分割 Button
  48. @IBOutlet var pageFromButton: NSButton!
  49. //取消 Button
  50. @IBOutlet var cancelButton: NSButton!
  51. //分割 Button
  52. @IBOutlet var splitButton: NSButton!
  53. //按文档个数分割,文档个数步进器
  54. @IBOutlet var byFileStepper: NSStepper!
  55. //按页均分分割,单个文档页数步进器
  56. @IBOutlet var byPageStepper: NSStepper!
  57. //新增文件夹名称拼接输入选择 Button
  58. @IBOutlet var renameButton: NSButton!
  59. //新增文件夹名字拼接 Button
  60. @IBOutlet var separatorButton: NSButton!
  61. //页面选择 ComboBox
  62. @IBOutlet var pageRangeComboBox: NSComboBox!
  63. @IBOutlet var splitMethodLabel: NSTextField!
  64. @IBOutlet var fileNameLabel: NSTextField!
  65. private var _fileURL: URL?
  66. private var _PDFDocument: CPDFDocument?
  67. private var _isSuccessfully = false
  68. /*
  69. //密码
  70. @property (nonatomic,retain) NSString *password;
  71. */
  72. //分割样式
  73. private var _splitType: Int = 0
  74. convenience init(document: CPDFDocument) {
  75. self.init(windowNibName: "SplitWindowController")
  76. self.fileAttribute = KMFileAttribute()
  77. self._fileURL = document.documentURL
  78. self._PDFDocument = document
  79. self.fileAttribute?.pdfDocument = document
  80. // if ([IAPProductsManager defaultManager].isAvailableAllFunction) {
  81. // self.splitType = 3;
  82. // }
  83. }
  84. convenience init(fileURL documentPath: URL) {
  85. self.init(windowNibName: "SplitWindowController")
  86. self.fileAttribute = KMFileAttribute()
  87. self._fileURL = documentPath
  88. self._PDFDocument = CPDFDocument(url: documentPath)
  89. }
  90. override func windowDidLoad() {
  91. super.windowDidLoad()
  92. self._localizedLanguage()
  93. self._setInputRange()
  94. self._configuViews()
  95. }
  96. @IBAction func byPageStepperAction(_ sender: AnyObject) {
  97. self.byPageText.stringValue = String(format: "%ld", self.byPageStepper.integerValue)
  98. }
  99. @IBAction func byFileStepperAction(_ sender: AnyObject) {
  100. self.byFileText.stringValue = String(format: "%ld", self.byFileStepper.integerValue)
  101. }
  102. @IBAction func buttonItemClicked_Cancel(_ sender: AnyObject) {
  103. self.window?.sheetParent?.endSheet(self.window!)
  104. }
  105. @IBAction func buttonItemClicked_ByPage(_ sender: AnyObject) {
  106. self.byFileButton.state = .off
  107. self.pageFromButton.state = .off
  108. self.byPageText.isEditable = true
  109. self.pageRangeComboBox.isEditable = false
  110. self.pageRangeComboBox.isEditable = false
  111. self.window?.makeFirstResponder(self)
  112. self.pageRangeComboBox.isEnabled = false
  113. self.byFileText.isEditable = false
  114. self.byFileStepper.isEnabled = false
  115. self.byPageStepper.isEnabled = false
  116. self.fileAttribute?.bAllPage = true
  117. }
  118. @IBAction func buttonItemClicked_ByFile(_ sender: AnyObject) {
  119. self.byPageButton.state = .off
  120. self.pageFromButton.state = .off
  121. self.byPageText.isEditable = false
  122. self.pageRangeComboBox.isEditable = false
  123. self.pageRangeComboBox.isSelectable = false
  124. self.window?.makeFirstResponder(self)
  125. self.pageRangeComboBox.isEnabled = false
  126. self.byFileText.isEditable = true
  127. self.byFileStepper.isEnabled = true
  128. self.byPageStepper.isEnabled = false
  129. self.fileAttribute?.bAllPage = true
  130. }
  131. @IBAction func buttonItemClicked_ByRange(_ sender: AnyObject) {
  132. // if (![IAPProductsManager defaultManager].isAvailableAllFunction) {
  133. // _pageFromButton.state = 0;
  134. // KMToolCompareWindowController * vc = [KMToolCompareWindowController toolCompareWithType:KMCompareWithToolType_PageEdit setSelectIndex:1];
  135. // [vc showWindow:nil];
  136. // return;
  137. // }
  138. self.byFileButton.state = .off
  139. self.byPageButton.state = .off
  140. self.byPageText.isEditable = false
  141. self.pageRangeComboBox.isEnabled = true
  142. if (self.pageRangeComboBox.indexOfSelectedItem == 2) {
  143. self.pageRangeComboBox.isSelectable = true
  144. self.pageRangeComboBox.isEditable = true
  145. self.pageRangeComboBox.stringValue = ""
  146. self.window?.makeFirstResponder(self.pageRangeComboBox)
  147. }
  148. self.byFileText.isEditable = false
  149. self.byFileStepper.isEnabled = false
  150. self.byPageStepper.isEnabled = false
  151. self.fileAttribute?.bAllPage = false
  152. }
  153. @IBAction func buttonItemClicked_Split(_ sender: AnyObject) {
  154. var fileAttribute: KMFileAttribute?
  155. if (self.pageFromButton.state == .on) {
  156. //选择page
  157. fileAttribute = self.fileAttribute
  158. fileAttribute?.filePath = self._fileURL?.path ?? ""
  159. fileAttribute?.bAllPage = false
  160. if self.pageRangeComboBox.stringValue == KMLocalizedString("Odd Pages Only", nil) {
  161. var tPagesString = ""
  162. for i in 0 ..< self._PDFDocument!.pageCount {
  163. if (i%2 == 0) {
  164. if (tPagesString.isEmpty) {
  165. tPagesString.append("\(i+1)")
  166. }else{
  167. tPagesString.append(",\(i+1)")
  168. }
  169. }
  170. }
  171. fileAttribute?.pagesString = tPagesString
  172. } else if self.pageRangeComboBox.stringValue == KMLocalizedString("Even Pages Only", nil) {
  173. var tPagesString = ""
  174. for i in 0 ..< self._PDFDocument!.pageCount {
  175. if (i%2 == 1) {
  176. if (tPagesString.isEmpty) {
  177. tPagesString.append("\(i+1)")
  178. }else{
  179. tPagesString.append(",\(i+1)")
  180. }
  181. }
  182. }
  183. fileAttribute?.pagesString = tPagesString
  184. } else {
  185. fileAttribute?.pagesString = self.pageRangeComboBox.stringValue
  186. }
  187. if let data = fileAttribute?.fetchSelectPages().isEmpty, data {
  188. let alert = NSAlert()
  189. alert.alertStyle = .critical
  190. alert.messageText = KMLocalizedString("Invalid page range or the page number is out of range. Please try again.", nil)
  191. alert.runModal()
  192. return
  193. }
  194. }
  195. let panel = NSOpenPanel()
  196. panel.canChooseFiles = false
  197. panel.canChooseDirectories = true
  198. panel.canCreateDirectories = true
  199. panel.beginSheetModal(for: self.window!) { result in
  200. if (result == .OK) {
  201. let outputURL = panel.urls.first
  202. var tFolderPath = outputURL!.path
  203. var index = 0
  204. let folderName = self.partFileNameLabel.stringValue.deletingPathExtension.lastPathComponent
  205. // String(format: "%@/", <#T##CVarArg...#>)
  206. var folderPath = "\(tFolderPath)" + "/" + "\(folderName)"
  207. //创建目录
  208. while FileManager.default.fileExists(atPath: folderPath) {
  209. index += 1
  210. folderPath = "\(tFolderPath)" + "/" + "\(folderName)_\(index)"
  211. }
  212. tFolderPath = folderPath
  213. try?FileManager.default.createDirectory(atPath: tFolderPath, withIntermediateDirectories: true)
  214. // if let data = {
  215. // let alert = NSAlert()
  216. // alert.alertStyle = .critical
  217. // alert.messageText = KMLocalizedString("Failed to split!", nil)
  218. // alert.runModal()
  219. // return
  220. // }
  221. self.progress.isHidden = false
  222. self.cancelButton.isEnabled = false
  223. self.splitButton.isEnabled = false
  224. self.progress.startAnimation(nil)
  225. if (self.byPageButton.state == .on) {
  226. let index = self.byPageStepper.integerValue;
  227. DispatchQueue.global().async {
  228. let successArray = self._PDFDocument?.splitByPagesWith(index, folerPath: tFolderPath, fileName: folderName)
  229. DispatchQueue.main.async {
  230. self.progress.isHidden = true
  231. self.cancelButton.isEnabled = true
  232. self.splitButton.isEnabled = true
  233. if (successArray?.isEmpty == false) {
  234. let alert = NSAlert()
  235. alert.messageText = KMLocalizedString("Splitting completed. Tap 'OK' to open the output folder.", nil)
  236. alert.addButton(withTitle: KMLocalizedString("OK",nil))
  237. let response = alert.runModal()
  238. if (response == .alertFirstButtonReturn ) {
  239. self.window?.sheetParent?.endSheet(self.window!)
  240. DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
  241. let filePath = successArray?.first
  242. self._viewFileAtFinder(filePath!)
  243. }
  244. }
  245. } else {
  246. let alert = NSAlert()
  247. alert.alertStyle = .critical
  248. alert.messageText = KMLocalizedString("Failed to split!", nil)
  249. let response = alert.runModal()
  250. if (response == .alertFirstButtonReturn ) {
  251. self.window?.sheetParent?.endSheet(self.window!)
  252. }
  253. }
  254. }
  255. }
  256. } else if (self.byFileButton.state == .on) {
  257. let dex = self.byFileStepper.integerValue
  258. DispatchQueue.global().async {
  259. let successArray = self._PDFDocument?.splitByPagesWith(dex, folerPath: tFolderPath, fileName: folderName)
  260. DispatchQueue.main.async {
  261. self.progress.isHidden = true
  262. self.cancelButton.isEnabled = true
  263. self.splitButton.isEnabled = true
  264. if (successArray?.isEmpty == false) {
  265. let alert = NSAlert()
  266. alert.messageText = KMLocalizedString("Splitting completed. Tap 'OK' to open the output folder.", nil)
  267. alert.addButton(withTitle: KMLocalizedString("OK",nil))
  268. let response = alert.runModal()
  269. if (response == .alertFirstButtonReturn) {
  270. self.window?.sheetParent?.endSheet(self.window!)
  271. DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
  272. let filePath = successArray?.first
  273. self._viewFileAtFinder(filePath!)
  274. }
  275. }
  276. }else{
  277. let alert = NSAlert()
  278. alert.alertStyle = .critical
  279. alert.messageText = KMLocalizedString("Failed to split!", nil)
  280. let response = alert.runModal()
  281. if (response == .alertFirstButtonReturn) {
  282. self.window?.sheetParent?.endSheet(self.window!)
  283. }
  284. }
  285. }
  286. }
  287. } else {
  288. DispatchQueue.global().async { [self] in
  289. var pdfDocument1 = CPDFDocument()
  290. var pdfDocument2 = CPDFDocument()
  291. for i in 0 ..< self._PDFDocument!.pageCount {
  292. var isSelected = false
  293. for number in fileAttribute!.fetchSelectPages() {
  294. if number.intValue == i+1 {
  295. isSelected = true
  296. let page = self._PDFDocument?.page(at: i).copy()
  297. pdfDocument1?.insertPageObject(page as! CPDFPage, at: pdfDocument1!.pageCount)
  298. }
  299. }
  300. if (!isSelected) {
  301. let page = self._PDFDocument?.page(at: i).copy()
  302. pdfDocument2?.insertPageObject(page as! CPDFPage, at: pdfDocument2!.pageCount)
  303. }
  304. }
  305. if (pdfDocument1!.pageCount > 0) {
  306. let tpath = "\(tFolderPath)\\\(folderName) 1.pdf"
  307. _isSuccessfully = pdfDocument1?.write(toFile:tpath) ?? false
  308. }
  309. if (pdfDocument2!.pageCount > 0) {
  310. let tPath = "\(tFolderPath)\\\(folderName) 2.pdf"
  311. pdfDocument2?.write(toFile: tPath)
  312. }
  313. DispatchQueue.main.async {
  314. self.progress.isHidden = true
  315. self.cancelButton.isEnabled = true
  316. self.splitButton.isEnabled = true
  317. if (_isSuccessfully) {
  318. // if ([_splitDelegate respondsToSelector:@selector(didFinshedSplitWithURL:)]) {
  319. // [_splitDelegate didFinshedSplitWithURL:_fileURL];
  320. // }
  321. let alert = NSAlert()
  322. alert.messageText = KMLocalizedString("Splitting completed. Tap 'OK' to open the output folder.", nil)
  323. alert.addButton(withTitle: KMLocalizedString("OK",nil))
  324. let response = alert.runModal()
  325. if (response == .alertFirstButtonReturn) {
  326. self.window?.sheetParent?.endSheet(self.window!)
  327. DispatchQueue.main.asyncAfter(deadline: .now()+0.5) {
  328. let filePath = "\(tFolderPath)\\\(folderName) 1.pdf"
  329. self._viewFileAtFinder(filePath)
  330. }
  331. }
  332. }else{
  333. let alert = NSAlert()
  334. alert.alertStyle = .critical
  335. alert.messageText = KMLocalizedString("Failed to split!", nil)
  336. let response = alert.runModal()
  337. if (response == .alertFirstButtonReturn) {
  338. self.window?.sheetParent?.endSheet(self.window!)
  339. }
  340. }
  341. }
  342. }
  343. }
  344. }
  345. }
  346. }
  347. @IBAction func buttonItemClicked_OriginalName(_ sender: AnyObject) {
  348. self._updateSplitFileName()
  349. }
  350. @IBAction func buttonItemClicked_Rename(_ sender: AnyObject) {
  351. self._updateSplitFileName()
  352. }
  353. @IBAction func comboBoxClicked_PageRange(_ sender: NSComboBox) {
  354. if (sender.indexOfSelectedItem == 0) {
  355. //奇数页
  356. sender.isEditable = false
  357. sender.isSelectable = false
  358. self.window?.makeFirstResponder(self)
  359. } else if (sender.indexOfSelectedItem == 1){
  360. //偶数页
  361. sender.isEditable = false
  362. sender.isSelectable = false
  363. self.window?.makeFirstResponder(self)
  364. } else {
  365. //手动输入页数
  366. sender.isEditable = true
  367. sender.isSelectable = true
  368. self.pageRangeComboBox.stringValue = self.pageRangeComboBox.stringValue
  369. (sender.cell as? NSComboBoxCell)?.placeholderString = KMLocalizedString("e.g. 1,3-5,10", nil)
  370. self.window?.makeFirstResponder(sender)
  371. }
  372. }
  373. }
  374. // MARK: - Private Methods
  375. extension SplitWindowController {
  376. private func _localizedLanguage() {
  377. self.splitMethodLabel.stringValue = KMLocalizedString("Split Methods", nil)
  378. // self.splitLabel.stringValue = KMLocalizedString("Split Methods", nil)
  379. self.pagesLabel.stringValue = KMLocalizedString("page(s)", nil)
  380. self.filesLabel.stringValue = KMLocalizedString("PDF file(s)", nil)
  381. // self.labelingLabel.stringValue = KMLocalizedString("File Naming", nil)
  382. self.fileNameLabel.stringValue = KMLocalizedString("File Naming", nil)
  383. self.exampleLabel.stringValue = KMLocalizedString("example", nil)
  384. self.byPageButton.title = KMLocalizedString("Split by every", nil)
  385. self.byFileButton.title = KMLocalizedString("Split averagely to", nil)
  386. self.pageFromButton.title = KMLocalizedString("Split by page range", nil)
  387. self.cancelButton.title = KMLocalizedString("Cancel", nil)
  388. self.splitButton.title = KMLocalizedString("Split", nil)
  389. self.originalFileButton.title = KMLocalizedString("Keep the current file name in front of labels", nil)
  390. self.renameButton.title = KMLocalizedString("Label", nil)
  391. self.separatorButton.title = KMLocalizedString("Separator", nil)
  392. self.byPageButton.toolTip = KMLocalizedString("Split by every", nil)
  393. self.byFileButton.toolTip = KMLocalizedString("Split averagely to", nil)
  394. self.pageFromButton.toolTip = KMLocalizedString("Split by page range", nil)
  395. self.originalFileButton.toolTip = KMLocalizedString("Keep the current file name in front of labels", nil)
  396. }
  397. private func _setInputRange() {
  398. if let data = self._PDFDocument?.isLocked, data {
  399. // dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  400. // PasswordWindowController *com = [[PasswordWindowController alloc] initWithWindowNibName:@"PasswordWindowController"];
  401. // com.fileURL = _fileURL;
  402. // [com beginSheetModalForWindow:self.window completionHandler:^(NSString *password) {
  403. // if (password) {
  404. // self.password = password;
  405. // [_PDFDocument unlockWithPassword:password];
  406. // NSInteger pageNumber = [_PDFDocument pageCount];
  407. // NSString *pdfName = [[[[_PDFDocument documentURL] path] lastPathComponent] stringByDeletingPathExtension];
  408. // _byFileStepper.maxValue = pageNumber;
  409. // _byPageStepper.maxValue = pageNumber;
  410. //
  411. // _partFileNameLabel.stringValue = [[NSString stringWithFormat:@"%@%@%@",pdfName,_separatorText.stringValue,_renameText.stringValue] stringByAppendingPathExtension:@"pdf"];
  412. // } else {
  413. // [NSApp endSheet:[self window]];
  414. // [[self window] orderOut:self];
  415. // [self release];
  416. // }
  417. // }];
  418. // [com release];
  419. // });
  420. } else {
  421. let pageNumber = self._PDFDocument?.pageCount ?? 0
  422. let pdfName = self._PDFDocument?.documentURL.deletingPathExtension().path.lastPathComponent ?? ""
  423. self.byFileStepper.maxValue = Double(pageNumber)
  424. self.byPageStepper.maxValue = Double(pageNumber)
  425. if let data = self._PDFDocument?.documentURL.path.isEmpty, data == false {
  426. self.partFileNameLabel.stringValue = String(format: "%@%@%@", pdfName, self.separatorText.stringValue, "\(self.renameText.stringValue).pdf")
  427. } else {
  428. self.partFileNameLabel.stringValue = String(format: "%@%@%@", "Untitled", self.separatorText.stringValue, "\(self.renameText.stringValue).pdf")
  429. }
  430. }
  431. }
  432. private func _configuViews() {
  433. self.nameView.wantsLayer = true
  434. // _nameView.layer.backgroundColor = [KMAppearance KMColor_Layout_L1].CGColor;
  435. //初始化ComboBox
  436. self.pageRangeComboBox.removeAllItems()
  437. let pageRangeArray = [KMLocalizedString("Odd Pages Only", nil),
  438. KMLocalizedString("Even Pages Only", nil),
  439. KMLocalizedString("e.g. 1,3-5,10", nil)]
  440. (self.pageRangeComboBox.cell as? NSComboBoxCell)?.placeholderString = KMLocalizedString("e.g. 1,3-5,10", nil)
  441. self.pageRangeComboBox.addItems(withObjectValues: pageRangeArray)
  442. self.pageRangeComboBox.selectItem(at: 0)
  443. self.pageRangeComboBox.isSelectable = false
  444. self.pageRangeComboBox.isEditable = false
  445. self.byFileText.isEditable = false
  446. self.byFileStepper.isEnabled = false
  447. self.byPageText.isEditable = false
  448. self.byPageStepper.isEnabled = false
  449. if (self._splitType == 3) {
  450. self.pageRangeComboBox.selectItem(at: 2)
  451. if (self.fileAttribute!.pagesString.isEmpty == false) {
  452. self.pageRangeComboBox.stringValue = self.fileAttribute?.pagesString ?? ""
  453. self.byPageButton.state = .off
  454. self.pageFromButton.state = .on
  455. self.pageRangeComboBox.isEnabled = true
  456. } else {
  457. self.pageRangeComboBox.stringValue = ""
  458. self.byPageButton.state = .on
  459. self.byPageText.isEditable = true
  460. self.pageFromButton.state = .off
  461. self.pageRangeComboBox.isEnabled = false
  462. }
  463. self.pageRangeComboBox.isEditable = true
  464. self.pageRangeComboBox.isSelectable = true
  465. } else {
  466. self.pageRangeComboBox.stringValue = ""
  467. self.pageRangeComboBox.isEnabled = false
  468. self.byPageText.isEditable = true
  469. }
  470. self.byPageStepper.minValue = 1.0
  471. self.byFileStepper.minValue = 1.0
  472. self.byPageStepper.integerValue = 1
  473. self.byFileStepper.integerValue = 1
  474. self.renameText.stringValue = "part"
  475. self.separatorText.stringValue = "-"
  476. self.byPageText.stringValue = "1"
  477. self.byFileText.stringValue = "1"
  478. self.byPageText.formatter = TextFieldFormatter()
  479. self.byFileText.formatter = TextFieldFormatter()
  480. self.byPageText.delegate = self
  481. self.byFileText.delegate = self
  482. self.renameText.delegate = self
  483. self.separatorText.delegate = self
  484. self.progress.isHidden = true
  485. }
  486. private func _viewFileAtFinder(_ filePath: String) {
  487. let workspace = NSWorkspace.shared
  488. let url = URL(fileURLWithPath: filePath)
  489. workspace.activateFileViewerSelecting([url])
  490. }
  491. private func _updateSplitFileName() {
  492. let pdfName = self._PDFDocument?.documentURL.deletingPathExtension().path.lastPathComponent ?? ""
  493. var splitPartString = ""
  494. var separatorString = ""
  495. if (self.renameButton.state == .on) {
  496. splitPartString = self.renameText.stringValue
  497. }
  498. if (self.separatorButton.state == .on) {
  499. separatorString = self.separatorText.stringValue
  500. }
  501. var partName = ""
  502. if (self.originalFileButton.state == .on) {
  503. if (separatorString.isEmpty == false) {
  504. if (partName.isEmpty == false) {
  505. partName.append(separatorString)
  506. } else {
  507. partName = separatorString
  508. }
  509. }
  510. if (splitPartString.isEmpty == false) {
  511. if (partName.isEmpty == false) {
  512. partName.append(splitPartString)
  513. } else {
  514. partName = splitPartString
  515. }
  516. }
  517. self.partFileNameLabel.stringValue = String(format: "%@%@.pdf", pdfName, partName)
  518. } else {
  519. if (splitPartString.isEmpty == false) {
  520. if (partName.isEmpty == false) {
  521. partName.append(splitPartString)
  522. } else {
  523. partName = splitPartString
  524. }
  525. }
  526. if (separatorString.isEmpty == false) {
  527. if (partName.isEmpty == false) {
  528. partName.append(separatorString)
  529. } else {
  530. partName = separatorString
  531. }
  532. }
  533. self.partFileNameLabel.stringValue = String(format: "%@%@.pdf", partName, pdfName)
  534. }
  535. }
  536. }
  537. extension SplitWindowController: NSTextFieldDelegate {
  538. func controlTextDidChange(_ obj: Notification) {
  539. let textField = obj.object as? NSTextField
  540. if (self.byPageText.isEqual(to: textField)) {
  541. if let data = Int(textField!.stringValue), data <= 0 {
  542. self.byPageText.stringValue = "1"
  543. self.byPageStepper.integerValue = 1
  544. } else if (textField!.stringValue.stringToCGFloat() > self.byPageStepper.maxValue){
  545. self.byPageText.stringValue = "\(self.byPageStepper.maxValue)"
  546. self.byPageStepper.integerValue = Int(self.byPageStepper.maxValue)
  547. } else {
  548. self.byPageStepper.integerValue = Int(self.byPageText.stringValue) ?? 0
  549. }
  550. } else if (self.byFileText.isEqual(to: textField)){
  551. if let data = Int(textField!.stringValue), data <= 0 {
  552. self.byFileText.stringValue = "1"
  553. self.byFileStepper.integerValue = 1
  554. }else if (textField!.stringValue.stringToCGFloat() > self.byFileStepper.maxValue){
  555. self.byFileText.stringValue = "\(self.byFileStepper.maxValue)"
  556. self.byFileStepper.integerValue = Int(self.byFileStepper.maxValue)
  557. }else{
  558. self.byFileStepper.integerValue = Int(self.byFileText.stringValue) ?? 0
  559. }
  560. } else if (self.renameText.isEqual(to: textField) || self.separatorText.isEqual(to: textField )) {
  561. self._updateSplitFileName()
  562. }
  563. }
  564. }