FileManagerViewController.swift 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. //
  2. // FileManagerViewController.swift
  3. // JChat
  4. //
  5. // Created by 邓永豪 on 2017/8/28.
  6. // Copyright © 2017年 HXHG. All rights reserved.
  7. //
  8. import UIKit
  9. protocol FileManagerDelegate {
  10. func didSelectFile(_ fileMessage: JMessage)
  11. func isEditModel() -> Bool
  12. }
  13. class FileManagerViewController: UIViewController {
  14. var conversation: JMSGConversation!
  15. override func viewDidLoad() {
  16. super.viewDidLoad()
  17. _init()
  18. }
  19. deinit {
  20. NotificationCenter.default.removeObserver(self)
  21. }
  22. fileprivate let imageFileViewController = ImageFileViewController()
  23. fileprivate let docFileViewController = FileViewController()
  24. fileprivate let videoFileViewController = FileViewController()
  25. fileprivate let musicFileViewController = FileViewController()
  26. fileprivate let otherFileViewController = FileViewController()
  27. private var allMessage: [JMSGMessage] = []
  28. private var imageMessages: [JMSGMessage] = []
  29. private var docMessages: [JMSGMessage] = []
  30. private var videoMessages: [JMSGMessage] = []
  31. private var musicMessages: [JMSGMessage] = []
  32. private var otherFileMessages: [JMSGMessage] = []
  33. private var selectMessage: [JMSGMessage] = []
  34. private var topOffset: CGFloat {
  35. if isIPhoneX {
  36. return 88
  37. }
  38. return 64
  39. }
  40. private lazy var tabedSlideView: DLTabedSlideView = {
  41. var tabedSlideView = DLTabedSlideView(frame: CGRect(x: 0, y: self.topOffset, width: self.view.width, height: self.view.height - self.topOffset))
  42. tabedSlideView.delegate = self
  43. tabedSlideView.baseViewController = self
  44. tabedSlideView.tabItemNormalColor = .black
  45. tabedSlideView.tabItemSelectedColor = O2ThemeManager.color(for: "Base.base_color")!
  46. tabedSlideView.tabbarTrackColor = O2ThemeManager.color(for: "Base.base_color")!
  47. tabedSlideView.tabbarBackgroundImage = UIImage.createImage(color: .white, size: CGSize(width: self.view.width, height: 39))
  48. tabedSlideView.tabbarBottomSpacing = 3.0
  49. return tabedSlideView
  50. }()
  51. private lazy var navRightButton: UIBarButtonItem = UIBarButtonItem(title: "选择", style: .plain, target: self, action: #selector(_clickNavRightButton))
  52. fileprivate var isEditMode = false
  53. private lazy var barView: UIView = {
  54. var barView = UIView(frame: CGRect(x: 0, y: self.view.height - 45, width: self.view.width, height: 45))
  55. let line = UILabel(frame: CGRect(x: 0, y: 0, width: barView.width, height: 0.5))
  56. line.layer.backgroundColor = UIColor(netHex: 0xE8E8E8).cgColor
  57. barView.addSubview(line)
  58. barView.backgroundColor = .white
  59. barView.isHidden = true
  60. return barView
  61. }()
  62. private lazy var delButton: UIButton = {
  63. var delButton = UIButton()
  64. delButton.setTitle("删除", for: .normal)
  65. delButton.titleLabel?.font = UIFont.systemFont(ofSize: 16)
  66. delButton.layer.cornerRadius = 3
  67. delButton.layer.masksToBounds = true
  68. delButton.addTarget(self, action: #selector(_delFile), for: .touchUpInside)
  69. delButton.backgroundColor = UIColor(netHex: 0xEB424D)
  70. return delButton
  71. }()
  72. private lazy var selectCountLabel: UILabel = {
  73. var label = UILabel(frame: CGRect(x: 17.5, y: 11.5, width: 120, height: 22))
  74. label.textAlignment = .left
  75. label.textColor = UIColor(netHex: 0x999999)
  76. label.font = UIFont.systemFont(ofSize: 16)
  77. label.isHidden = true
  78. return label
  79. }()
  80. private func _init() {
  81. self.title = "聊天文件"
  82. view.backgroundColor = UIColor(netHex: 0xe8edf3)
  83. view.addSubview(tabedSlideView)
  84. let imageItem = DLTabedbarItem(title: "照片", image: nil, selectedImage: nil)
  85. let fileItem = DLTabedbarItem(title: "文档", image: nil, selectedImage: nil)
  86. let videoItem = DLTabedbarItem(title: "视频", image: nil, selectedImage: nil)
  87. let musicItem = DLTabedbarItem(title: "音乐", image: nil, selectedImage: nil)
  88. let otherItem = DLTabedbarItem(title: "其它", image: nil, selectedImage: nil)
  89. tabedSlideView.tabbarItems = [imageItem!, fileItem!, videoItem!, musicItem!, otherItem!]
  90. tabedSlideView.buildTabbar()
  91. tabedSlideView.selectedIndex = 0
  92. view.addSubview(barView)
  93. barView.addSubview(delButton)
  94. barView.addSubview(selectCountLabel)
  95. delButton.frame = CGRect(x: barView.width - 72 - 16.6, y: 8.5, width: 72, height: 29)
  96. _setupNavigation()
  97. conversation.allMessages({ (result, error) in
  98. if let message = result as? [JMSGMessage] {
  99. self.allMessage = message
  100. self.classifyMessage(message)
  101. }
  102. })
  103. NotificationCenter.default.addObserver(self, selector: #selector(_didSelectFileMessage), name: NSNotification.Name(rawValue: "kDidSelectFileMessage"), object: nil)
  104. }
  105. func _didSelectFileMessage() {
  106. selectMessage.removeAll()
  107. selectMessage.append(contentsOf: imageFileViewController.selectMessages)
  108. selectMessage.append(contentsOf: docFileViewController.selectMessages)
  109. selectMessage.append(contentsOf: videoFileViewController.selectMessages)
  110. selectMessage.append(contentsOf: musicFileViewController.selectMessages)
  111. selectMessage.append(contentsOf: otherFileViewController.selectMessages)
  112. if selectMessage.count > 0 {
  113. selectCountLabel.isHidden = false
  114. selectCountLabel.text = "已选(\(selectMessage.count))"
  115. } else {
  116. selectCountLabel.isHidden = true
  117. }
  118. }
  119. func classifyMessage(_ messages: [JMSGMessage]) {
  120. docMessages.removeAll()
  121. videoMessages.removeAll()
  122. musicMessages.removeAll()
  123. imageMessages.removeAll()
  124. otherFileMessages.removeAll()
  125. for message in messages {
  126. if message.contentType == .image {
  127. imageMessages.append(message)
  128. continue
  129. }
  130. if !message.ex.isFile {
  131. continue
  132. }
  133. if let fileType = message.ex.fileType {
  134. switch fileType.fileFormat() {
  135. case .document:
  136. docMessages.append(message)
  137. case .video:
  138. videoMessages.append(message)
  139. case .voice:
  140. musicMessages.append(message)
  141. case .photo:
  142. imageMessages.append(message)
  143. default:
  144. otherFileMessages.append(message)
  145. }
  146. }
  147. }
  148. reloadAllFileViewController()
  149. }
  150. func reloadAllFileViewController() {
  151. imageFileViewController.messages = imageMessages
  152. docFileViewController.messages = docMessages
  153. videoFileViewController.messages = videoMessages
  154. musicFileViewController.messages = musicMessages
  155. otherFileViewController.messages = otherFileMessages
  156. imageFileViewController.reloadDate()
  157. docFileViewController.reloadDate()
  158. videoFileViewController.reloadDate()
  159. musicFileViewController.reloadDate()
  160. otherFileViewController.reloadDate()
  161. }
  162. private func _setupNavigation() {
  163. self.navigationItem.rightBarButtonItem = navRightButton
  164. }
  165. @objc func _clickNavRightButton() {
  166. if isEditMode {
  167. navRightButton.title = "选择"
  168. tabedSlideView.frame = CGRect(x: tabedSlideView.x, y: tabedSlideView.y, width: tabedSlideView.width, height: tabedSlideView.height + 45)
  169. barView.isHidden = true
  170. } else {
  171. navRightButton.title = "取消"
  172. tabedSlideView.frame = CGRect(x: tabedSlideView.x, y: tabedSlideView.y, width: tabedSlideView.width, height: tabedSlideView.height - 45)
  173. barView.isHidden = false
  174. }
  175. isEditMode = !isEditMode
  176. imageFileViewController.isEditModel = isEditMode
  177. otherFileViewController.isEditModel = isEditMode
  178. videoFileViewController.isEditModel = isEditMode
  179. musicFileViewController.isEditModel = isEditMode
  180. docFileViewController.isEditModel = isEditMode
  181. selectMessage = []
  182. }
  183. func _delFile() {
  184. if selectMessage.count <= 0 {
  185. return
  186. }
  187. isEditMode = true
  188. for message in selectMessage {
  189. allMessage = allMessage.filter({ (m) -> Bool in
  190. message.msgId != m.msgId
  191. })
  192. conversation.deleteMessage(withMessageId: message.msgId)
  193. }
  194. classifyMessage(allMessage)
  195. _clickNavRightButton()
  196. NotificationCenter.default.post(name: NSNotification.Name(rawValue: kReloadAllMessage), object: nil)
  197. }
  198. }
  199. extension FileManagerViewController: DLTabedSlideViewDelegate {
  200. func numberOfTabs(in sender: DLTabedSlideView!) -> Int {
  201. return 5
  202. }
  203. func dlTabedSlideView(_ sender: DLTabedSlideView!, controllerAt index: Int) -> UIViewController! {
  204. switch index {
  205. case 0:
  206. return imageFileViewController
  207. case 1:
  208. docFileViewController.fileType = .doc
  209. return docFileViewController
  210. case 2:
  211. videoFileViewController.fileType = .video
  212. return videoFileViewController
  213. case 3:
  214. musicFileViewController.fileType = .music
  215. return musicFileViewController
  216. default:
  217. otherFileViewController.fileType = .other
  218. return otherFileViewController
  219. }
  220. }
  221. }