KMEditPDFTextPropertyViewController.swift 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568
  1. //
  2. // KMEditPDFTextPropertyViewController.swift
  3. // PDF Master
  4. //
  5. // Created by lxy on 2022/12/27.
  6. //
  7. import Cocoa
  8. let CEditPDFTextDefaultFontName = "CEditPDFTextDefaultFontName"
  9. let CEditPDFTextDefaultFontStyle = "CEditPDFTextDefaultFontStyle"
  10. let CEditPDFTextDefaultFontSize = "CEditPDFTextDefaultFontSize"
  11. let CEditPDFTextDefaultFontColor = "CEditPDFTextDefaultFontColor"
  12. let CEditPDFTextDefaultFontAlign = "CEditPDFTextDefaultFontAlign"
  13. enum CPDFActiveAreasAlignType : Int {
  14. case Left
  15. case Vertical
  16. case Right
  17. case Top
  18. case Horizontally
  19. case Bottom
  20. case DisHorizontally
  21. case DisVertical
  22. }
  23. class KMEditPDFTextPropertyViewController: NSViewController {
  24. @IBOutlet weak var headerBox: NSBox!
  25. @IBOutlet weak var propertyTitle: NSTextField!
  26. @IBOutlet weak var preViewBox: NSBox!
  27. @IBOutlet weak var preViewHeight: NSLayoutConstraint!
  28. @IBOutlet weak var preImageView: NSImageView!
  29. @IBOutlet weak var useButton: NSButton!
  30. @IBOutlet weak var styleBox: NSComboBox!
  31. @IBOutlet weak var fontTitleLabel: NSTextField!
  32. @IBOutlet weak var fontSetBox: NSBox!
  33. @IBOutlet weak var fontStyleComboBox: NSComboBox!
  34. @IBOutlet weak var alignRightButton: NSButton!
  35. @IBOutlet weak var alignCenterButton: NSButton!
  36. @IBOutlet weak var alignLeftButton: NSButton!
  37. @IBOutlet weak var currentFontColor: NSImageView!
  38. @IBOutlet weak var fontSizeComboBox: NSComboBox!
  39. @IBOutlet weak var fontStyleTComboBox: NSComboBox!
  40. @IBOutlet weak var fontTopConstraint: NSLayoutConstraint!
  41. @IBOutlet weak var alignTitleLabel: NSTextField!
  42. @IBOutlet weak var areasLeftButton: NSButton!
  43. @IBOutlet weak var areasVerticalCenterButton: NSButton!
  44. @IBOutlet weak var areasHorzontalButton: NSButton!
  45. @IBOutlet weak var areasVerticalButton: NSButton!
  46. @IBOutlet weak var areasBotoomButton: NSButton!
  47. @IBOutlet weak var areasHorizontalCenterButton: NSButton!
  48. @IBOutlet weak var areasTopButton: NSButton!
  49. @IBOutlet weak var areasRightButton: NSButton!
  50. var textsAreas : [CPDFEditTextArea] = []
  51. var listView : CPDFListView!
  52. var fonts = NSMutableArray()
  53. var currentColor : NSColor = NSColor.black
  54. var alignment : NSTextAlignment = .left
  55. override func viewDidLoad() {
  56. super.viewDidLoad()
  57. self.currentFontColor.wantsLayer = true
  58. self.currentFontColor.layer?.cornerRadius = 9
  59. self.currentFontColor.layer?.masksToBounds = true
  60. self.currentFontColor.image = self.swatchWithColor(color: NSColor.black, size: NSSize(width: 18, height: 18))
  61. self.preImageView.wantsLayer = true
  62. self.preImageView.layer?.backgroundColor = NSColor.white.cgColor
  63. self.preViewBox.isHidden = true
  64. self.preViewHeight.constant = 0
  65. self.propertyTitle.stringValue = NSLocalizedString("Text", comment: "")
  66. self.fontTitleLabel.stringValue = NSLocalizedString("Font", comment: "")
  67. self.alignTitleLabel.stringValue = NSLocalizedString("Align", comment: "")
  68. self.fontReload()
  69. self.setDefaultProperty()
  70. self.formAearsAlignIcon()
  71. self.imageWithTextSet()
  72. }
  73. func refreshSelectAreaProperty() {
  74. if self.listView.editingAreas()?.count == 1 {
  75. let areas = self.listView.editingAreas().first
  76. if areas is CPDFEditTextArea {
  77. self.fontSizeComboBox.stringValue = "\(self.listView.editingSelectionFontSize())"
  78. let font = self.listView.editingSelectionFontName()
  79. let result : [String] = font?.components(separatedBy: " - ") ?? []
  80. var fontName = ""
  81. var fontStyle = ""
  82. if result.count == 1 {
  83. fontName = result[0]
  84. }
  85. if result.count == 2 {
  86. fontStyle = result[1]
  87. }
  88. self.fontStyleComboBox.stringValue = fontName
  89. self.fontStyleTComboBox.stringValue = fontStyle
  90. self.currentColor = self.listView.editingSelectionFontColor() ?? NSColor.black
  91. NSColorPanel.shared.color = self.currentColor
  92. self.currentFontColor.image = self.swatchWithColor(color: self.currentColor, size: NSSize(width: 18, height: 18))
  93. self.alignment = self.listView.editingSelectionAlignment()
  94. self.updateAlignIcon()
  95. self.imageWithTextSet()
  96. }
  97. }
  98. }
  99. func reloadData() {
  100. self.formAearsAlignIcon()
  101. textsAreas = []
  102. if self.listView.editingAreas()?.count ?? 0 < 1 {
  103. return
  104. }
  105. let areas = self.listView.editingAreas()
  106. for i in 0 ... areas!.count-1 {
  107. if areas![i] is CPDFEditTextArea {
  108. textsAreas.append(areas![i] as! CPDFEditTextArea)
  109. }
  110. }
  111. if textsAreas.count == 1 {
  112. self.headerBox.isHidden = false
  113. self.fontTitleLabel.isHidden = false
  114. self.fontTopConstraint.constant = 5;
  115. } else if textsAreas.count > 1 {
  116. self.headerBox.isHidden = true
  117. self.fontTitleLabel.isHidden = true
  118. self.fontTopConstraint.constant = -135;
  119. }
  120. self.refreshSelectAreaProperty()
  121. }
  122. func setDefaultProperty() {
  123. let fontName : String = UserDefaults.standard.object(forKey: CEditPDFTextDefaultFontName) as? String ?? "Helvetica"
  124. let fontStyle : String = UserDefaults.standard.object(forKey: CEditPDFTextDefaultFontStyle) as? String ?? "Bold"
  125. let fontSize : String = UserDefaults.standard.object(forKey: CEditPDFTextDefaultFontSize) as? String ?? "12"
  126. let fontColor : NSColor = UserDefaults.standard.pdfListViewColor(forKey: CEditPDFTextDefaultFontColor) ?? NSColor.black
  127. let fontAlign : String = UserDefaults.standard.object(forKey: CEditPDFTextDefaultFontAlign) as? String ?? "2"
  128. self.fontStyleComboBox.stringValue = fontName
  129. self.fontStyleTComboBox.stringValue = fontStyle
  130. self.fontSizeComboBox.stringValue = fontSize
  131. self.alignment = NSTextAlignment.init(rawValue: Int(fontAlign)!)!
  132. self.currentColor = fontColor
  133. NSColorPanel.shared.color = self.currentColor
  134. self.currentFontColor.image = self.swatchWithColor(color: self.currentColor, size: NSSize(width: 18, height: 18))
  135. self.updateAlignIcon()
  136. }
  137. func fontReload() {
  138. self.fonts = NSFont.supportFonts()
  139. var selectedIndex = 0
  140. for dic in fonts {
  141. let fontName = (dic as! NSDictionary).allKeys.first
  142. let font = NSFont(name: fontName as! String, size: 12.0)
  143. let attrited : [NSAttributedString.Key : Any] = [NSAttributedString.Key.font:font!]
  144. let string : NSAttributedString = NSAttributedString(string: fontName as! String, attributes: attrited)
  145. self.fontStyleComboBox.addItem(withObjectValue:string)
  146. }
  147. self.fontStyleComboBox.selectItem(at: selectedIndex)
  148. self.fontStyleComboBox.font = NSFont.systemFont(ofSize: 12)
  149. self.fontStyleTComboBox.font = NSFont.systemFont(ofSize: 12)
  150. self.fontSizeComboBox.removeAllItems()
  151. let fontsize = ["6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "24", "36", "48", "72", "96", "144", "288"]
  152. for str in fontsize {
  153. self.fontSizeComboBox.addItem(withObjectValue: str)
  154. }
  155. selectedIndex = 6
  156. self.fontSizeComboBox.selectItem(at: selectedIndex)
  157. self.setFontStyleWithFontName(fontName: self.fontStyleComboBox.stringValue, currentStyle: "")
  158. }
  159. func setFontStyleWithFontName(fontName:String, currentStyle style:String) -> NSInteger {
  160. let selctIndex = 0
  161. for i in 0 ... self.fonts.count-1 {
  162. let dic : NSDictionary = self.fonts.object(at: i) as! NSDictionary
  163. let familyString = dic.allKeys.first as! String
  164. if fontName == familyString {
  165. let styles : NSArray = dic.object(forKey: fontName) as! NSArray
  166. self.fontStyleTComboBox.removeAllItems()
  167. for j in 0 ... styles.count-1 {
  168. let style = styles.object(at: j) as! String
  169. let attributeFontDescriptor = NSFontDescriptor.init(fontAttributes: [NSFontDescriptor.AttributeName.family : fontName,NSFontDescriptor.AttributeName.face : style])
  170. let font = NSFont.init(descriptor: attributeFontDescriptor, size: 12)
  171. let attrited : [NSAttributedString.Key : Any] = [NSAttributedString.Key.font:font!]
  172. let string : NSAttributedString = NSAttributedString(string: style, attributes: attrited)
  173. self.fontStyleTComboBox.addItem(withObjectValue:string)
  174. }
  175. break
  176. }
  177. }
  178. self.fontStyleTComboBox.selectItem(at: 0)
  179. return selctIndex
  180. }
  181. //MARK: Button Action
  182. @IBAction func fontColorAction(_ sender: Any) {
  183. let color = self.listView.editingSelectionFontColor()
  184. let panel = NSColorPanel.shared
  185. panel.setTarget(self)
  186. panel.setAction(#selector(fontColorChangeAction))
  187. panel.orderFront(nil)
  188. panel.showsAlpha = false
  189. panel.color = color ?? NSColor.black
  190. }
  191. @IBAction func fontNameAction(_ sender: Any) {
  192. self.setFontStyleWithFontName(fontName: self.fontStyleComboBox.stringValue, currentStyle: "")
  193. if self.listView.editingAreas()?.count ?? 0 > 0 {
  194. self.listView.setEditingSelectionFontName("\(self.fontStyleComboBox.stringValue)-\(self.fontStyleTComboBox.stringValue)")
  195. } else {
  196. UserDefaults.standard.set(self.fontStyleComboBox.stringValue, forKey: CEditPDFTextDefaultFontName)
  197. UserDefaults.standard.set(self.fontStyleTComboBox.stringValue, forKey: CEditPDFTextDefaultFontStyle)
  198. }
  199. self.imageWithTextSet()
  200. }
  201. @IBAction func fontNameStyleAction(_ sender: Any) {
  202. if self.listView.editingAreas()?.count ?? 0 > 0 {
  203. self.listView.setEditingSelectionFontName("\(self.fontStyleComboBox.stringValue)-\(self.fontStyleTComboBox.stringValue)")
  204. } else {
  205. UserDefaults.standard.set(self.fontStyleComboBox.stringValue, forKey: CEditPDFTextDefaultFontName)
  206. UserDefaults.standard.set(self.fontStyleTComboBox.stringValue, forKey: CEditPDFTextDefaultFontStyle)
  207. }
  208. self.imageWithTextSet()
  209. }
  210. @IBAction func fontSizeAction(_ sender: Any) {
  211. let size : String = self.fontSizeComboBox.objectValueOfSelectedItem as? String ?? "12"
  212. if self.listView.editingAreas()?.count ?? 0 > 0 {
  213. self.listView.setEditingSelectionFontSize(CGFloat(Int(size)!))
  214. } else {
  215. UserDefaults.standard.set(self.fontSizeComboBox.stringValue, forKey: CEditPDFTextDefaultFontSize)
  216. }
  217. self.imageWithTextSet()
  218. }
  219. @objc func fontColorChangeAction() {
  220. self.currentColor = NSColorPanel.shared.color
  221. self.currentFontColor.image = self.swatchWithColor(color: NSColorPanel.shared.color, size: NSSize(width: 18, height: 18))
  222. if self.listView.editingAreas()?.count ?? 0 > 0 {
  223. self.listView.setEditingSelectionFontColor(NSColorPanel.shared.color)
  224. } else {
  225. UserDefaults.standard.setPDFListViewColor(self.currentColor, forKey: CEditPDFTextDefaultFontColor)
  226. }
  227. self.imageWithTextSet()
  228. }
  229. @IBAction func aglinSegmentedAction(_ sender: NSButton) {
  230. if sender.tag == 0 {
  231. self.alignment = .left
  232. } else if sender.tag == 1 {
  233. self.alignment = .center
  234. } else {
  235. self.alignment = .right
  236. }
  237. self.updateAlignIcon()
  238. if self.listView.editingAreas()?.count ?? 0 > 0 {
  239. self.listView.setCurrentSelectionAlignment(self.alignment)
  240. } else {
  241. UserDefaults.standard.set("\(self.alignment.rawValue)", forKey: CEditPDFTextDefaultFontAlign)
  242. }
  243. self.imageWithTextSet()
  244. }
  245. @IBAction func areasAlignStyleAction(_ sender: NSButton) {
  246. self.formAearsAlignMangent(stype: CPDFActiveAreasAlignType.init(rawValue: sender.tag) ?? .Left)
  247. }
  248. override func mouseDown(with event: NSEvent) {
  249. }
  250. //MARK: ToolAction
  251. private func swatchWithColor(color:NSColor,size:NSSize) -> NSImage {
  252. let image = NSImage(size: size)
  253. image.lockFocus()
  254. color.drawSwatch(in: NSRect(x: 0, y: 0, width: size.width, height: size.height))
  255. image.unlockFocus()
  256. return image
  257. }
  258. private func imageWithTextSet() {
  259. var string = NSLocalizedString("example", comment: "")
  260. let style = NSMutableParagraphStyle()
  261. style.alignment = self.alignment
  262. if self.listView.editingAreas()?.count == 1 {
  263. let areas = self.listView.editingAreas().first
  264. if areas is CPDFEditTextArea {
  265. string = self.listView.editingSelectionString() ?? NSLocalizedString("example", comment: "")
  266. style.alignment = self.listView.editingSelectionAlignment()
  267. }
  268. }
  269. var attributeFontDescriptor = NSFontDescriptor.init(fontAttributes: [NSFontDescriptor.AttributeName.family : self.fontStyleComboBox.stringValue,NSFontDescriptor.AttributeName.face : self.fontStyleTComboBox.stringValue])
  270. var font = NSFont.init(descriptor: attributeFontDescriptor, size: CGFloat(Float(self.fontSizeComboBox.stringValue)!))
  271. var red : CGFloat = 0.0
  272. var green : CGFloat = 0.0
  273. var blue : CGFloat = 0.0
  274. var alpha : CGFloat = 0.0
  275. var color : NSColor = NSColor.white
  276. if self.currentColor != nil {
  277. self.currentColor.usingColorSpaceName(NSColorSpaceName.calibratedRGB)?.getRed(&red, green: &green, blue: &blue, alpha: &alpha)
  278. color = NSColor(red: red, green: green, blue: blue, alpha: alpha)
  279. } else {
  280. color = NSColor(white: 1.0, alpha: 1.0)
  281. }
  282. if font == nil {
  283. self.fontStyleComboBox.stringValue = ""
  284. self.fontStyleTComboBox.stringValue = ""
  285. attributeFontDescriptor = NSFontDescriptor.init(fontAttributes: [NSFontDescriptor.AttributeName.family : self.fontStyleComboBox.menu?.item(at: 0)?.title ?? "Helvetica",NSFontDescriptor.AttributeName.face : self.fontStyleTComboBox.menu?.item(at: 0)?.title ?? "Bold"])
  286. font = NSFont.init(descriptor: attributeFontDescriptor, size: CGFloat(Float(self.fontSizeComboBox.stringValue)!))
  287. }
  288. let attributes = [NSAttributedString.Key.font:font,NSAttributedString.Key.foregroundColor:color,NSAttributedString.Key.paragraphStyle:style]
  289. let size = string.size(withAttributes:attributes as [NSAttributedString.Key : Any])
  290. let image = NSImage(size: NSSize(width: self.preImageView.frame.size.width, height: size.height))
  291. image.lockFocus()
  292. NSGraphicsContext.current?.imageInterpolation = .high
  293. NSString(string: string).draw(in: NSRect(x: 0, y: 0, width: self.preImageView.frame.size.width, height: image.size.height), withAttributes: attributes)
  294. NSGraphicsContext.current?.imageInterpolation = .default
  295. image.unlockFocus()
  296. self.preImageView.image = image
  297. }
  298. func updateAlignIcon() {
  299. if(self.alignment == .left) {
  300. self.alignLeftButton.image = NSImage(named: "KMImageNameEditPDFAlignLeftSelect")
  301. self.alignCenterButton.image = NSImage(named: "KMImageNameEditPDFAlignCenter")
  302. self.alignRightButton.image = NSImage(named: "KMImageNameEditPDFAlignRight")
  303. }else if(self.alignment == .center) {
  304. self.alignCenterButton.image = NSImage(named: "KMImageNameEditPDFAlignCenterSelect")
  305. self.alignRightButton.image = NSImage(named: "KMImageNameEditPDFAlignRight")
  306. self.alignLeftButton.image = NSImage(named: "KMImageNameEditPDFAlignLeft")
  307. } else if(self.alignment == .right) {
  308. self.alignCenterButton.image = NSImage(named: "KMImageNameEditPDFAlignCenter")
  309. self.alignLeftButton.image = NSImage(named: "KMImageNameEditPDFAlignLeft")
  310. self.alignRightButton.image = NSImage(named: "KMImageNameEditPDFAlignRightSelect")
  311. }
  312. }
  313. func formAearsAlignIcon() {
  314. let norIcons : [String] = ["KMImageNameEditPDFImage20","KMImageNameEditPDFImage21","KMImageNameEditPDFImage45","KMImageNameEditPDFImage46",
  315. "KMImageNameEditPDFImage47","KMImageNameEditPDFImage48","KMImageNameEditPDFImage49","KMImageNameEditPDFImage50"]
  316. let selectIcons : [String] = ["KMImageNameEditPDFImage20_1","KMImageNameEditPDFImage21_1","KMImageNameEditPDFImage45_1","KMImageNameEditPDFImage46_1",
  317. "KMImageNameEditPDFImage47_1","KMImageNameEditPDFImage48_1","KMImageNameEditPDFImage49_1","KMImageNameEditPDFImage50_1"]
  318. let areasButtons : [NSButton] = [self.areasVerticalButton,self.areasHorzontalButton,self.areasLeftButton,self.areasVerticalCenterButton,
  319. self.areasRightButton,self.areasTopButton,self.areasHorizontalCenterButton,self.areasBotoomButton]
  320. if self.listView.editingAreas()?.count ?? 0 < 2 {
  321. for i in 0 ... areasButtons.count-1 {
  322. areasButtons[i].image = NSImage(named: norIcons[i])
  323. }
  324. } else if self.listView.editingAreas()?.count ?? 0 == 2 {
  325. for i in 0 ... areasButtons.count-1 {
  326. if i == 0 || i == 1 {
  327. areasButtons[i].image = NSImage(named: norIcons[i])
  328. } else {
  329. areasButtons[i].image = NSImage(named: selectIcons[i])
  330. }
  331. }
  332. } else if self.listView.editingAreas()?.count ?? 0 > 2 {
  333. for i in 0 ... areasButtons.count-1 {
  334. areasButtons[i].image = NSImage(named: selectIcons[i])
  335. }
  336. }
  337. }
  338. func formAearsAlignMangent(stype:CPDFActiveAreasAlignType) {
  339. if self.listView.editingAreas().count < 2 {
  340. return
  341. }
  342. var zeroRect = NSRect.null
  343. var highestRect = NSZeroRect
  344. var widthestRect = NSZeroRect
  345. let fristArea : CPDFEditArea = self.listView.editingAreas().first as! CPDFEditArea
  346. var leftestRect = fristArea.bounds
  347. var rightestRect = fristArea.bounds
  348. var topestRect = fristArea.bounds
  349. var bottomestRect = fristArea.bounds
  350. var leftestArea : CPDFEditArea = fristArea
  351. var rightestArea : CPDFEditArea = fristArea
  352. var topestArea : CPDFEditArea = fristArea
  353. var bottomestArea : CPDFEditArea = fristArea
  354. var totalWidth = 0.0
  355. var totalHeight = 0.0
  356. for i in 0 ... self.listView.editingAreas().count-1 {
  357. let area : CPDFEditArea = self.listView.editingAreas()[i] as! CPDFEditArea
  358. zeroRect = zeroRect.union(area.bounds)
  359. totalWidth = totalWidth + area.bounds.width
  360. totalHeight = totalHeight + area.bounds.height
  361. if area.bounds.height > highestRect.height {
  362. highestRect = area.bounds
  363. }
  364. if area.bounds.width > widthestRect.width {
  365. widthestRect = area.bounds
  366. }
  367. if leftestRect.minX > area.bounds.minX {
  368. leftestRect = area.bounds
  369. leftestArea = area
  370. }
  371. if area.bounds.maxX > rightestRect.maxX {
  372. rightestRect = area.bounds
  373. rightestArea = area
  374. }
  375. if area.bounds.maxY > topestRect.maxY {
  376. topestRect = area.bounds
  377. topestArea = area
  378. }
  379. if bottomestRect.minY > area.bounds.minY {
  380. bottomestRect = area.bounds
  381. bottomestArea = area
  382. }
  383. }
  384. if stype == .Left {
  385. var newBoundsArray : [String] = []
  386. for i in 0 ... self.listView.editingAreas().count-1 {
  387. let areas = self.listView.editingAreas()[i] as! CPDFEditArea
  388. var bounds = areas.bounds
  389. bounds.origin.x = zeroRect.origin.x
  390. newBoundsArray.append(NSStringFromRect(bounds))
  391. }
  392. self.changeAreasAlign(areas: self.listView.editingAreas(), newBounds: newBoundsArray)
  393. } else if stype == .Right {
  394. var newBounds : [String] = []
  395. for i in 0 ... self.listView.editingAreas().count-1 {
  396. let areas = self.listView.editingAreas()[i] as! CPDFEditArea
  397. var bounds = areas.bounds
  398. bounds.origin.x = zeroRect.maxX - bounds.size.width
  399. newBounds.append(NSStringFromRect(bounds))
  400. }
  401. self.changeAreasAlign(areas: self.listView.editingAreas(), newBounds: newBounds)
  402. } else if stype == .Top {
  403. var newBounds : [String] = []
  404. for i in 0 ... self.listView.editingAreas().count-1 {
  405. let areas = self.listView.editingAreas()[i] as! CPDFEditArea
  406. var bounds = areas.bounds
  407. bounds.origin.y = zeroRect.maxY - bounds.size.height
  408. newBounds.append(NSStringFromRect(bounds))
  409. }
  410. self.changeAreasAlign(areas: self.listView.editingAreas(), newBounds: newBounds)
  411. } else if stype == .Bottom {
  412. var newBounds : [String] = []
  413. for i in 0 ... self.listView.editingAreas().count-1 {
  414. let areas = self.listView.editingAreas()[i] as! CPDFEditArea
  415. var bounds = areas.bounds
  416. bounds.origin.y = zeroRect.minY
  417. newBounds.append(NSStringFromRect(bounds))
  418. }
  419. self.changeAreasAlign(areas: self.listView.editingAreas(), newBounds: newBounds)
  420. } else if stype == .Horizontally {
  421. var newBounds : [String] = []
  422. for i in 0 ... self.listView.editingAreas().count-1 {
  423. let areas = self.listView.editingAreas()[i] as! CPDFEditArea
  424. var bounds = areas.bounds
  425. bounds.origin.y = highestRect.midY - bounds.height/2
  426. newBounds.append(NSStringFromRect(bounds))
  427. }
  428. self.changeAreasAlign(areas: self.listView.editingAreas(), newBounds: newBounds)
  429. } else if stype == .Vertical {
  430. var newBounds : [String] = []
  431. for i in 0 ... self.listView.editingAreas().count-1 {
  432. let areas = self.listView.editingAreas()[i] as! CPDFEditArea
  433. var bounds = areas.bounds
  434. bounds.origin.x = widthestRect.midX - bounds.width/2
  435. newBounds.append(NSStringFromRect(bounds))
  436. }
  437. self.changeAreasAlign(areas: self.listView.editingAreas(), newBounds: newBounds)
  438. } else if stype == .DisHorizontally {
  439. let middleGap = zeroRect.width - leftestRect.width - rightestRect.width
  440. let otherAreasTotalWidth = totalWidth - leftestRect.width - rightestRect.width
  441. let gap = (middleGap - otherAreasTotalWidth)/CGFloat(self.listView.editingAreas().count - 1)
  442. var areasCopyArray : [CPDFEditArea] = self.listView.editingAreas() as! [CPDFEditArea]
  443. areasCopyArray.sorted(by: { obj1, obj2 in
  444. let area1 = obj1
  445. let area2 = obj2
  446. if area1.bounds.origin.x < area2.bounds.origin.x {
  447. return true
  448. } else {
  449. return false
  450. }
  451. })
  452. if let index = areasCopyArray.firstIndex(of: leftestArea) {
  453. areasCopyArray.remove(at: index)
  454. }
  455. if let index = areasCopyArray.firstIndex(of: rightestArea) {
  456. areasCopyArray.remove(at: index)
  457. }
  458. var newBounds : [String] = []
  459. var leftStartX = leftestRect.maxX + gap
  460. for i in 0 ... areasCopyArray.count-1 {
  461. let areas = areasCopyArray[i]
  462. var bounds = areas.bounds
  463. bounds.origin.x = leftStartX
  464. newBounds.append(NSStringFromRect(bounds))
  465. leftStartX = leftStartX + bounds.width + gap
  466. }
  467. self.changeAreasAlign(areas: areasCopyArray, newBounds: newBounds)
  468. } else if stype == .DisVertical {
  469. let middleGap = zeroRect.height - topestRect.height - bottomestRect.height
  470. let otherAreasTotalHeight = totalHeight - topestRect.height - bottomestRect.height
  471. let gap = (middleGap - otherAreasTotalHeight)/CGFloat(self.listView.editingAreas().count - 1)
  472. var areasCopyArray : [CPDFEditArea] = self.listView.editingAreas() as! [CPDFEditArea]
  473. areasCopyArray.sorted(by: { obj1, obj2 in
  474. let area1 = obj1
  475. let area2 = obj2
  476. if area1.bounds.origin.x < area2.bounds.origin.x {
  477. return true
  478. } else {
  479. return false
  480. }
  481. })
  482. if let index = areasCopyArray.firstIndex(of: topestArea) {
  483. areasCopyArray.remove(at: index)
  484. }
  485. if let index = areasCopyArray.firstIndex(of: bottomestArea) {
  486. areasCopyArray.remove(at: index)
  487. }
  488. var newBounds : [String] = []
  489. var bottomStartY = bottomestRect.maxY + gap
  490. for i in 0 ... areasCopyArray.count-1 {
  491. let areas = areasCopyArray[i]
  492. var bounds = areas.bounds
  493. bounds.origin.y = bottomStartY
  494. newBounds.append(NSStringFromRect(bounds))
  495. bottomStartY = bottomStartY + bounds.height + gap
  496. }
  497. self.changeAreasAlign(areas: areasCopyArray, newBounds: newBounds)
  498. }
  499. }
  500. private func changeAreasAlign(areas:[Any],newBounds:[String]) {
  501. var oldBounds : [String] = []
  502. for i in 0 ... areas.count-1 {
  503. let area : CPDFEditArea = areas[i] as! CPDFEditArea
  504. oldBounds.append(NSStringFromRect(area.bounds))
  505. self.listView.setBoundsEditArea(area, withBounds: NSRectFromString(newBounds[i]))
  506. }
  507. self.listView.setNeedsDisplayForVisiblePages()
  508. }
  509. }