KMConvertBaseWindowController.swift 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680
  1. //
  2. // KMConvertBaseWindowController.swift
  3. // PDF Office
  4. //
  5. // Created by tangchao on 2022/12/5.
  6. //
  7. import Cocoa
  8. import PDFKit
  9. extension NSPanel {
  10. public func open(_ window: NSWindow, panel:((NSOpenPanel)->Void)?, completion:@escaping ((NSApplication.ModalResponse, [URL]?)->Void)) {
  11. let openPanel = NSOpenPanel()
  12. if (panel != nil) {
  13. panel!(openPanel)
  14. } else {
  15. openPanel.prompt = ""
  16. openPanel.canChooseFiles = true //是否可以选择文件
  17. }
  18. openPanel.beginSheetModal(for: window, completionHandler: { result in
  19. if result != .OK {
  20. completion(result, nil)
  21. } else {
  22. completion(result, openPanel.urls)
  23. }
  24. })
  25. }
  26. public class func savePanel(_ window: NSWindow, panel:((NSSavePanel)->Void)?, completion:@escaping ((NSApplication.ModalResponse, URL?)->Void)) {
  27. let savePanel = NSSavePanel()
  28. if (panel != nil) {
  29. panel!(savePanel)
  30. } else {
  31. savePanel.prompt = ""
  32. }
  33. savePanel.beginSheetModal(for: window, completionHandler: { result in
  34. if result != .OK {
  35. completion(result, nil)
  36. } else {
  37. completion(result, savePanel.url)
  38. }
  39. })
  40. }
  41. public class func savePanel(_ window: NSWindow, _ openAccessoryView: Bool, panel:((NSSavePanel)->Void)?, completion:@escaping ((NSApplication.ModalResponse, URL?, Bool)->Void)) {
  42. let savePanel = NSSavePanel()
  43. if (panel != nil) {
  44. panel!(savePanel)
  45. } else {
  46. savePanel.prompt = ""
  47. }
  48. if (openAccessoryView) {
  49. savePanel.accessoryView = NSButton(checkboxWithTitle: NSLocalizedString("Open the document after saving", comment: ""), target: nil, action: nil);
  50. }
  51. savePanel.beginSheetModal(for: window, completionHandler: { result in
  52. if result != .OK {
  53. completion(result, nil, false)
  54. } else {
  55. if (!openAccessoryView) {
  56. completion(result, savePanel.url, false)
  57. return
  58. }
  59. if ((savePanel.accessoryView as! NSButton).state == .on) {
  60. completion(result, savePanel.url, true)
  61. } else {
  62. completion(result, savePanel.url, false)
  63. }
  64. }
  65. })
  66. }
  67. }
  68. let kKMConvertLanugageSelectedIndex: String = "KMConvertLanugageSelectedIndex"
  69. typealias KMConvertSettingViewPageRangeDidInputFinishCallback = (_ pageRangeString: String) -> ()
  70. typealias KMConvertSettingViewLanugageDidSelectedCallback = (_ index: Int) -> ()
  71. class KMConvertSettingView: NSView {
  72. private var myCurrentLanguage: String!
  73. var currentLanguage: String {
  74. get {
  75. return myCurrentLanguage
  76. }
  77. set {
  78. myCurrentLanguage = newValue
  79. let index = UserDefaults.standard.string(forKey: kKMConvertLanugageSelectedIndex)
  80. if (index != nil && !index!.isEmpty) {
  81. ocrLanuguageIndex = Int(index!)!
  82. return
  83. }
  84. if (newValue.hasPrefix("zh-Hans")) {
  85. ocrLanuguageIndex = 0
  86. } else if (newValue.hasPrefix("en")) {
  87. ocrLanuguageIndex = 2
  88. } else if (newValue.hasPrefix("zh-Hant")) {
  89. ocrLanuguageIndex = 1
  90. } else if (newValue.hasPrefix("fr")) {
  91. ocrLanuguageIndex = 3
  92. } else if (newValue.hasPrefix("de")) {
  93. ocrLanuguageIndex = 4
  94. } else if (newValue.hasPrefix("ht")) { /// 海地克里奥尔语 Haitian
  95. ocrLanuguageIndex = 5
  96. } else if (newValue.hasPrefix("ja")) {
  97. ocrLanuguageIndex = 6
  98. } else if (newValue.hasPrefix("ko")) {
  99. ocrLanuguageIndex = 7
  100. } else if (newValue.hasPrefix("la")) { /// 拉丁语 Latin
  101. ocrLanuguageIndex = 8
  102. } else {
  103. ocrLanuguageIndex = 2
  104. }
  105. }
  106. }
  107. var ocrLanuguageIndex: Int = 3
  108. var pageRangeSelectedIndex: Int = 0
  109. var pageRangeDidInputFinishCallback: KMConvertSettingViewPageRangeDidInputFinishCallback!
  110. var lanugageDidSelected: KMConvertSettingViewLanugageDidSelectedCallback!
  111. var ocrItemView: KMConvertOCRSettingItemView!
  112. var pageRangeItemView: KMConvertPageRangeSettingItemView!
  113. func getPageRangeString() -> String {
  114. return ""
  115. }
  116. }
  117. typealias KMConvertBaseWindowControllerItemClick = (Int) -> ()
  118. class KMConvertBaseWindowController: NSWindowController {
  119. @IBOutlet weak var titleLabel: NSTextField!
  120. @IBOutlet weak var leftBox: NSBox!
  121. @IBOutlet weak var prePDFView: KMCustomPDFView!
  122. @IBOutlet weak var numberBox: NSView!
  123. @IBOutlet weak var numberTextField: NSTextField!
  124. @IBOutlet weak var perLabel: NSTextField!
  125. @IBOutlet weak var totalNumberLabel: NSTextField!
  126. @IBOutlet weak var backBox: NSBox!
  127. @IBOutlet weak var nextBox: NSBox!
  128. @IBOutlet weak var rightScrollView: NSScrollView!
  129. @IBOutlet weak var batchButton: NSButton!
  130. @IBOutlet weak var canelBox: NSBox!
  131. @IBOutlet weak var convertBox: NSBox!
  132. var canelButtonVC: KMDesignButton!
  133. var convertButtonVC: KMDesignButton!
  134. var backButtonVC: KMDesignButton!
  135. var nextButtonVC: KMDesignButton!
  136. var itemClick: KMConvertBaseWindowControllerItemClick!
  137. var documentModel: KMDocumentModel!
  138. var currentPageIndex: Int = 1
  139. var pageRangeString: String = ""
  140. var settingView: KMConvertSettingView!
  141. private var maskView: NSButton!
  142. private var indicator: NSProgressIndicator!
  143. var subType: Int = 0
  144. var fileExtension: String {
  145. get {
  146. return ""
  147. }
  148. }
  149. var progressController: SKProgressController?
  150. var convert: KMPDFConvert?
  151. override func awakeFromNib() {
  152. super.awakeFromNib()
  153. DispatchQueue.main.async {
  154. self.window?.makeFirstResponder(nil)
  155. }
  156. }
  157. override func windowDidLoad() {
  158. super.windowDidLoad()
  159. self.window?.appearance = NSAppearance(named: .aqua)
  160. canelButtonVC = KMDesignButton.init(withType: .Text)
  161. convertButtonVC = KMDesignButton.init(withType: .Text)
  162. backButtonVC = KMDesignButton.init(withType: .Image)
  163. nextButtonVC = KMDesignButton.init(withType: .Image)
  164. if documentModel != nil {
  165. self.prePDFView.document = CPDFDocument(url: documentModel.documentURL)
  166. if (documentModel.owerPassword.isEmpty == false) {
  167. self.prePDFView.document.unlock(withPassword: documentModel.owerPassword)
  168. } else if (documentModel.password.isEmpty == false) {
  169. self.prePDFView.document.unlock(withPassword: documentModel.password)
  170. }
  171. let number: Int = Int(prePDFView.document!.pageCount)
  172. let string = "\(number)"
  173. totalNumberLabel.stringValue = string
  174. }
  175. if (self.prePDFView.documentView() != nil) {
  176. self.prePDFView.documentView().enclosingScrollView?.hasVerticalScroller = false
  177. self.prePDFView.documentView().enclosingScrollView?.hasHorizontalScroller = false
  178. }
  179. self.prePDFView.setDisplay(.singlePage)
  180. self.prePDFView.layoutDocumentView()
  181. self.prePDFView.autoScales = true
  182. self.prePDFView.delegate = self
  183. backBox.fillColor = .clear
  184. backBox.contentView = backButtonVC.view
  185. backButtonVC.target = self
  186. backButtonVC.action = #selector(backButtonAction)
  187. backButtonVC.image = NSImage(named: "KMImageNameLeftButtonImage")!
  188. backButtonVC.image_disabled = NSImage(named: "KMImageNameLeftButtonImageDis")!
  189. backButtonVC.pagination()
  190. numberBox.wantsLayer = true
  191. self.numberBox.layer?.backgroundColor = NSColor.white.cgColor
  192. numberBox.layer?.borderWidth = 1
  193. numberBox.layer?.cornerRadius = 4
  194. numberTextField.focusRingType = .none
  195. numberTextField.delegate = self
  196. self.numberTextField.isBordered = false
  197. nextBox.fillColor = .clear
  198. nextBox.contentView = nextButtonVC.view
  199. nextButtonVC.target = self
  200. nextButtonVC.action = #selector(nextButtonAction)
  201. nextButtonVC.image = NSImage(named: "KMImageNameRightButtonImage")!
  202. nextButtonVC.image_disabled = NSImage(named: "KMImageNameRightButtonImageDis")!
  203. nextButtonVC.pagination()
  204. batchButton.title = NSLocalizedString("Batch", comment: "")
  205. batchButton.isBordered = false
  206. batchButton.wantsLayer = true
  207. batchButton.layer?.borderWidth = 1
  208. batchButton.layer?.cornerRadius = 4
  209. batchButton.target = self
  210. batchButton.action = #selector(batchButtonAction)
  211. batchButton.isHidden = true
  212. canelBox.fillColor = .clear
  213. canelBox.contentView = canelButtonVC.view
  214. canelButtonVC.target = self
  215. canelButtonVC.action = #selector(cancelButtonAction)
  216. canelButtonVC.stringValue = NSLocalizedString("Cancel", comment: "")
  217. canelButtonVC.button(type: .Sec, size: .m)
  218. convertBox.fillColor = .clear
  219. convertBox.contentView = convertButtonVC.view
  220. convertButtonVC.target = self
  221. convertButtonVC.action = #selector(convertButtonAction)
  222. convertButtonVC.stringValue = NSLocalizedString("Convert", comment: "")
  223. convertButtonVC.button(type: .Cta, size: .m)
  224. self.rightScrollView.hasVerticalScroller = false
  225. self.rightScrollView.hasHorizontalScroller = false
  226. self.initUIProperty()
  227. }
  228. private func initUIProperty() {
  229. self.titleLabel.textColor = NSColor.titleColor()
  230. self.titleLabel.font = .SFProTextRegular(16)
  231. self.leftBox.fillColor = NSColor(hex: "#F7F8FA")
  232. self.prePDFView.backgroundColor = NSColor(hex: "#E6E7EB")
  233. self.numberBox.layer?.borderColor = NSColor(hex: "#DFE1E5").cgColor
  234. self.perLabel.textColor = NSColor.titleColor()
  235. self.perLabel.font = .SFProTextRegular(12)
  236. self.totalNumberLabel.textColor = NSColor.titleColor()
  237. self.totalNumberLabel.font = .SFProTextRegular(12)
  238. self.batchButton.setTitleColor(NSColor.buttonTitleColor())
  239. self.batchButton.layer?.borderColor = NSColor.buttonBorderColor().cgColor
  240. self.batchButton.font = .SFProTextRegular(14)
  241. }
  242. @objc func backButtonAction() {
  243. if prePDFView.canGoToPreviousPage() {
  244. currentPageIndex -= 1
  245. prePDFView.goToPreviousPage(nil)
  246. let currentIndex: Int = Int((prePDFView.document?.index(for: prePDFView.currentPage()!))!)
  247. numberTextField.stringValue = "\(currentIndex+1)"
  248. }
  249. }
  250. @objc func nextButtonAction() {
  251. if prePDFView.canGoToNextPage() {
  252. currentPageIndex += 1
  253. prePDFView.goToNextPage(nil)
  254. let currentIndex: Int = Int((prePDFView.document?.index(for: prePDFView.currentPage()!))!)
  255. numberTextField.stringValue = "\(currentIndex+1)"
  256. }
  257. }
  258. @objc func batchButtonAction() {
  259. guard let callback = itemClick else {
  260. return
  261. }
  262. callback(1)
  263. }
  264. @objc func cancelButtonAction() {
  265. guard let callback = itemClick else {
  266. return
  267. }
  268. callback(2)
  269. }
  270. @objc func convertButtonAction() {
  271. self.window?.makeFirstResponder(nil)
  272. var pages: [Int] = []
  273. if self.settingView.pageRangeSelectedIndex == 0 {
  274. for i in 0 ... self.prePDFView.document!.pageCount-1 {
  275. pages.append(Int(i)+1)
  276. }
  277. } else if self.settingView.pageRangeSelectedIndex == 1 { /// 当前页面
  278. if self.currentPageIndex <= self.prePDFView.document!.pageCount {
  279. pages.append(self.currentPageIndex)
  280. }
  281. } else if self.settingView.pageRangeSelectedIndex == 2 { /// 奇数
  282. for i in 0 ... self.prePDFView.document!.pageCount-1 {
  283. if i % 2 == 0 {
  284. pages.append(Int(i)+1)
  285. }
  286. }
  287. } else if self.settingView.pageRangeSelectedIndex == 3 { /// 偶数
  288. for i in 0 ... self.prePDFView.document!.pageCount-1 {
  289. if i % 2 == 1 {
  290. pages.append(Int(i)+1)
  291. }
  292. }
  293. } else if self.settingView.pageRangeSelectedIndex == 4 { /// 自定义
  294. let array = self.findSelectPage(pageRangeString: self.settingView.getPageRangeString())
  295. if array.count == 0 {
  296. let alert = NSAlert()
  297. alert.alertStyle = .warning
  298. alert.messageText = NSLocalizedString("Invalid page range or the page number is out of range. Please try again.", comment: "")
  299. alert.runModal()
  300. return
  301. } else {
  302. for i in 0 ..< array.count {
  303. if i <= self.documentModel.document.pageCount {
  304. pages.append(array[i])
  305. }
  306. }
  307. }
  308. }
  309. NSPanel.savePanel(self.window!) { panel in
  310. let name = self.prePDFView.document.documentURL.deletingPathExtension().lastPathComponent
  311. panel.nameFieldStringValue = name
  312. panel.allowedFileTypes = [self.fileExtension]
  313. } completion: { response, url in
  314. if (response == .cancel) {
  315. return
  316. }
  317. let outputFolderPath = url!.deletingLastPathComponent().path
  318. let filePath = self.getConvertFileSavePath()
  319. if (FileManager.default.fileExists(atPath: filePath)) {
  320. try?FileManager.default.removeItem(atPath: filePath)
  321. }
  322. if ((self.prePDFView.document?.writeDecrypt(to: URL(fileURLWithPath: filePath)))!) {
  323. }
  324. let convert = KMPDFConvert()
  325. self.convert = convert
  326. convert.outputFolderPath = outputFolderPath
  327. convert.filePath = filePath
  328. convert.pages = pages
  329. var fileName = url!.deletingPathExtension().lastPathComponent
  330. if (fileName.isEmpty) {
  331. fileName = NSLocalizedString("Untitled", comment: "")
  332. }
  333. convert.outputFileName = fileName
  334. self.convertModelAppendParams(convert: convert)
  335. DispatchQueue.main.async {
  336. self.showProgressWindow()
  337. self.progressController?.maxValue = Double(convert.pages.count)
  338. }
  339. DispatchQueue.global().async {
  340. KMPDFConvertManager.defaultManager.convert(convert: convert, progress: { index in
  341. DispatchQueue.main.async {
  342. self.progressController?.increment(by: 1.0)
  343. }
  344. }) { [unowned self] finished, error in
  345. self.hiddenProgressWindow()
  346. // 清除临时文件
  347. if (FileManager.default.fileExists(atPath: filePath)) {
  348. try?FileManager.default.removeItem(atPath: filePath)
  349. }
  350. if finished {
  351. cancelButtonAction()
  352. if FileManager.default.fileExists(atPath: convert.outputFilePath) {
  353. NSWorkspace.shared.activateFileViewerSelecting([URL(fileURLWithPath: convert.outputFilePath)])
  354. }
  355. } else {
  356. var errorString = ""
  357. let myError: NSError? = error as? NSError
  358. if myError?.code == 1 {
  359. errorString = NSLocalizedString("Password required or incorrect password. Please re-enter your password and try again", comment: "")
  360. } else if myError?.code == 2 {
  361. errorString = NSLocalizedString("The license doesn't allow the permission", comment: "")
  362. } else if myError?.code == 3 {
  363. errorString = NSLocalizedString("Malloc failure", comment: "")
  364. } else if myError?.code == 4 {
  365. errorString = NSLocalizedString("Unknown error in processing conversion. Please try again later", comment: "")
  366. } else if myError?.code == 5 {
  367. errorString = NSLocalizedString("Unknown error in processing PDF. Please try again later", comment: "")
  368. } else if myError?.code == 6 {
  369. errorString = NSLocalizedString("File not found or could not be opened. Check if your file exists or choose another file to convert", comment: "")
  370. } else if myError?.code == 7 {
  371. errorString = NSLocalizedString("File not in PDF format or corruptead. Change a PDF file and try again", comment: "")
  372. } else if myError?.code == 8 {
  373. errorString = NSLocalizedString("Unsupported security scheme", comment: "")
  374. } else if myError?.code == 9 {
  375. errorString = NSLocalizedString("Page not found or content error", comment: "")
  376. } else {
  377. errorString = NSLocalizedString("Table not found", comment: "")
  378. }
  379. let alert = NSAlert()
  380. alert.alertStyle = .critical
  381. alert.messageText = NSLocalizedString("Conversion Failed", comment: "")
  382. alert.informativeText = errorString
  383. alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
  384. alert.runModal()
  385. }
  386. }
  387. }
  388. }
  389. }
  390. func convertModelAppendParams(convert: KMPDFConvert) -> () {
  391. }
  392. func getConvertFileSavePath() -> String {
  393. var path = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.applicationSupportDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last
  394. path?.append("/")
  395. path?.append(Bundle.main.bundleIdentifier!)
  396. path?.append("/")
  397. path?.append("convert.pdf")
  398. return path!
  399. }
  400. func isValidPagesString(pagesString: String)-> Bool {
  401. var valid = false
  402. for ch in pagesString {
  403. if ch != "0" && ch != "1" && ch != "2" && ch != "3" && ch != "4" && ch != "5" && ch != "6" && ch != "7" && ch != "8" && ch != "9" && ch != "," && ch != "-" {
  404. valid = false
  405. break
  406. } else {
  407. valid = true
  408. }
  409. }
  410. return valid
  411. }
  412. func findSelectPage(pageRangeString: String) -> ([Int]) {
  413. if !isValidPagesString(pagesString: pageRangeString) {
  414. return []
  415. }
  416. var result: [Int] = []
  417. let array = pageRangeString.components(separatedBy: ",")
  418. for string in array {
  419. if string.isEmpty {
  420. return []
  421. } else {
  422. let pages = string .components(separatedBy: "-")
  423. if pages.count > 2 {
  424. return []
  425. } else if pages.count == 1 {
  426. let page = pages[0]
  427. if page.isEmpty || Int(page)! > documentModel.document.pageCount || Int(page)! == 0 {
  428. return []
  429. } else {
  430. var hasSame: Bool = false
  431. for i in result {
  432. if i == Int(page)! {
  433. hasSame = true
  434. return []
  435. }
  436. }
  437. if !hasSame {
  438. result.append(Int(page)!)
  439. }
  440. }
  441. } else if pages.count == 2 {
  442. let page1 = pages[0]
  443. let page2 = pages[1]
  444. if page1.isEmpty || page2.isEmpty || Int(page1)! >= Int(page2)! || Int(page2)! > documentModel.document.pageCount || Int(page1)! == 0 {
  445. return []
  446. } else {
  447. var hasSame: Bool = false
  448. for i in Int(page1)! ... Int(page2)! {
  449. for j in result {
  450. if j == i {
  451. hasSame = true
  452. return []
  453. }
  454. }
  455. }
  456. if !hasSame {
  457. for i in Int(page1)! ... Int(page2)! {
  458. result.append(i)
  459. }
  460. }
  461. }
  462. }
  463. }
  464. }
  465. return result
  466. }
  467. /// 开始加载loading
  468. func beginLoading() {
  469. DispatchQueue.main.async { [self] in
  470. self.maskView = NSButton()
  471. self.maskView.isBordered = false
  472. self.maskView.title = ""
  473. self.maskView.wantsLayer = true
  474. self.maskView.layer?.backgroundColor = NSColor(white: 1, alpha: 0.3 ).cgColor
  475. self.maskView.target = self
  476. self.maskView.action = #selector(maskViewClick)
  477. self.maskView.frame = (self.window?.contentView!.bounds)!
  478. self.maskView.autoresizingMask = NSView.AutoresizingMask(rawValue: 18)
  479. self.window?.contentView?.addSubview(self.maskView)
  480. self.indicator = NSProgressIndicator()
  481. self.indicator.style = .spinning
  482. self.indicator.controlSize = .regular
  483. self.indicator.isIndeterminate = true
  484. self.window?.contentView?.addSubview(self.indicator)
  485. let indicatorSize: CGFloat = 32
  486. self.indicator.frame = NSMakeRect(0.5*(NSWidth((self.window?.contentView!.frame)!)-indicatorSize), 0.5*(NSHeight((self.window?.contentView!.frame)!)-indicatorSize), indicatorSize, indicatorSize)
  487. self.maskView.autoresizingMask = NSView.AutoresizingMask(rawValue: 45)
  488. self.indicator.startAnimation(nil)
  489. }
  490. }
  491. /// 结束加载loading
  492. func endLoading() {
  493. DispatchQueue.main.async {
  494. self.indicator.stopAnimation(nil)
  495. self.indicator.removeFromSuperview()
  496. self.indicator = nil
  497. self.maskView.removeFromSuperview()
  498. self.maskView = nil
  499. }
  500. }
  501. @objc func maskViewClick() {
  502. }
  503. // MARK: Progress
  504. func showProgressWindow() {
  505. let progress = SKProgressController()
  506. progress.message = NSLocalizedString("Converting...", comment: "")
  507. progress.window?.backgroundColor = NSColor(hex: "#36383B")
  508. progress.window?.contentView?.wantsLayer = true
  509. progress.window?.contentView?.layer?.backgroundColor = NSColor(hex: "#36383B").cgColor
  510. progress.progressField.textColor = NSColor.white
  511. progress.closeBlock = { [weak self] in
  512. if (self!.convert != nil) {
  513. KMPDFConvertManager.defaultManager.cancel(convert: self!.convert!)
  514. }
  515. }
  516. self.progressController = progress
  517. self.window?.beginSheet(progress.window!)
  518. }
  519. func hiddenProgressWindow() {
  520. if (self.progressController != nil) {
  521. self.window?.endSheet((self.progressController?.window)!)
  522. self.progressController = nil
  523. }
  524. }
  525. func getCurrentLanguage() -> String {
  526. // return Bundle.main.preferredLocalizations.first!
  527. let array: [String] = UserDefaults.standard.object(forKey: "AppleLanguages") as! [String]
  528. return array.first!
  529. }
  530. /// 存储用户的选择的语言
  531. func saveLanugageSelectedIndex(index: Int) {
  532. UserDefaults.standard.setValue("\(index)", forKey: kKMConvertLanugageSelectedIndex)
  533. UserDefaults.standard.synchronize()
  534. }
  535. }
  536. extension KMConvertBaseWindowController: NSTextFieldDelegate {
  537. func controlTextDidChange(_ obj: Notification) {
  538. if numberTextField.isEqual(to: obj.object) {
  539. let textField: NSTextField = obj.object as! NSTextField
  540. var value: String = ""
  541. for ch in textField.stringValue {
  542. if ch != "0" && ch != "1" && ch != "2" && ch != "3" && ch != "4" && ch != "5" && ch != "6" && ch != "7" && ch != "8" && ch != "9" {
  543. } else {
  544. if value.isEmpty && ch == "0" {
  545. } else {
  546. value.append(ch)
  547. }
  548. }
  549. }
  550. if value.isEmpty {
  551. value.append("1")
  552. } else {
  553. if Int(value)! <= 0 {
  554. value = "1"
  555. } else if Int(value)! > self.prePDFView.document!.pageCount {
  556. let number: Int = Int(self.prePDFView.document!.pageCount)
  557. value = "\(number)"
  558. }
  559. }
  560. numberTextField.stringValue = value
  561. }
  562. }
  563. func controlTextDidEndEditing(_ obj: Notification) {
  564. if numberTextField.isEqual(to: obj.object) {
  565. if (numberTextField.stringValue.isEmpty) {
  566. numberTextField.stringValue = "1"
  567. self.prePDFView.go(toPageIndex: 0, animated: false)
  568. self.currentPageIndex = 1
  569. return
  570. }
  571. let number: Int = Int(numberTextField.stringValue)!
  572. if number > 0 && number <= prePDFView.document!.pageCount {
  573. guard let page = prePDFView.document?.page(at: UInt(number-1)) else {
  574. return
  575. }
  576. prePDFView.go(to: page)
  577. currentPageIndex = number
  578. }
  579. }
  580. }
  581. }
  582. extension KMConvertBaseWindowController: CPDFViewDelegate {
  583. func pdfViewCurrentPageDidChanged(_ pdfView: CPDFView!) {
  584. let currentIndex = pdfView.currentPageIndex
  585. currentPageIndex = currentIndex + 1
  586. numberTextField.stringValue = "\(currentIndex+1)"
  587. }
  588. }