// // FolioReaderHighlightList.swift // FolioReaderKit // // Created by Heberti Almeida on 01/09/15. // Copyright (c) 2015 Folio Reader. All rights reserved. // import UIKit class FolioReaderHighlightList: UITableViewController { fileprivate var highlights = [Highlight]() fileprivate var readerConfig: FolioReaderConfig fileprivate var folioReader: FolioReader init(folioReader: FolioReader, readerConfig: FolioReaderConfig) { self.readerConfig = readerConfig self.folioReader = folioReader super.init(style: UITableViewStyle.plain) } required init?(coder aDecoder: NSCoder) { fatalError("init with coder not supported") } override func viewDidLoad() { super.viewDidLoad() self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: kReuseCellIdentifier) self.tableView.separatorInset = UIEdgeInsets.zero self.tableView.backgroundColor = self.folioReader.isNight(self.readerConfig.nightModeMenuBackground, self.readerConfig.menuBackgroundColor) self.tableView.separatorColor = self.folioReader.isNight(self.readerConfig.nightModeSeparatorColor, self.readerConfig.menuSeparatorColor) guard let bookId = (self.folioReader.readerContainer?.book.name as NSString?)?.deletingPathExtension else { self.highlights = [] return } self.highlights = Highlight.allByBookId(withConfiguration: self.readerConfig, bookId: bookId) } // MARK: - Table view data source override func numberOfSections(in tableView: UITableView) -> Int { return 1 } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return highlights.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: kReuseCellIdentifier, for: indexPath) cell.backgroundColor = UIColor.clear let highlight = highlights[(indexPath as NSIndexPath).row] // Format date let dateFormatter = DateFormatter() dateFormatter.dateFormat = self.readerConfig.localizedHighlightsDateFormat let dateString = dateFormatter.string(from: highlight.date) // Date var dateLabel: UILabel! if cell.contentView.viewWithTag(456) == nil { dateLabel = UILabel(frame: CGRect(x: 0, y: 0, width: view.frame.width-40, height: 16)) dateLabel.tag = 456 dateLabel.autoresizingMask = UIViewAutoresizing.flexibleWidth dateLabel.font = UIFont(name: "Avenir-Medium", size: 12) cell.contentView.addSubview(dateLabel) } else { dateLabel = cell.contentView.viewWithTag(456) as! UILabel } dateLabel.text = dateString.uppercased() dateLabel.textColor = self.folioReader.isNight(UIColor(white: 5, alpha: 0.3), UIColor.lightGray) dateLabel.frame = CGRect(x: 20, y: 20, width: view.frame.width-40, height: dateLabel.frame.height) // Text let cleanString = highlight.content.stripHtml().truncate(250, trailing: "...").stripLineBreaks() let text = NSMutableAttributedString(string: cleanString) let range = NSRange(location: 0, length: text.length) let paragraph = NSMutableParagraphStyle() paragraph.lineSpacing = 3 let textColor = self.folioReader.isNight(self.readerConfig.menuTextColor, UIColor.black) text.addAttribute(NSAttributedStringKey.paragraphStyle, value: paragraph, range: range) text.addAttribute(NSAttributedStringKey.font, value: UIFont(name: "Avenir-Light", size: 16)!, range: range) text.addAttribute(NSAttributedStringKey.foregroundColor, value: textColor, range: range) if (highlight.type == HighlightStyle.underline.rawValue) { text.addAttribute(NSAttributedStringKey.backgroundColor, value: UIColor.clear, range: range) text.addAttribute(NSAttributedStringKey.underlineColor, value: HighlightStyle.colorForStyle(highlight.type, nightMode: self.folioReader.nightMode), range: range) text.addAttribute(NSAttributedStringKey.underlineStyle, value: NSNumber(value: NSUnderlineStyle.styleSingle.rawValue as Int), range: range) } else { text.addAttribute(NSAttributedStringKey.backgroundColor, value: HighlightStyle.colorForStyle(highlight.type, nightMode: self.folioReader.nightMode), range: range) } // Text var highlightLabel: UILabel! if cell.contentView.viewWithTag(123) == nil { highlightLabel = UILabel(frame: CGRect(x: 0, y: 0, width: view.frame.width-40, height: 0)) highlightLabel.tag = 123 highlightLabel.autoresizingMask = UIViewAutoresizing.flexibleWidth highlightLabel.numberOfLines = 0 highlightLabel.textColor = UIColor.black cell.contentView.addSubview(highlightLabel) } else { highlightLabel = cell.contentView.viewWithTag(123) as! UILabel } highlightLabel.attributedText = text highlightLabel.sizeToFit() highlightLabel.frame = CGRect(x: 20, y: 46, width: view.frame.width-40, height: highlightLabel.frame.height) cell.layoutMargins = UIEdgeInsets.zero cell.preservesSuperviewLayoutMargins = false return cell } override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { let highlight = highlights[(indexPath as NSIndexPath).row] let cleanString = highlight.content.stripHtml().truncate(250, trailing: "...").stripLineBreaks() let text = NSMutableAttributedString(string: cleanString) let range = NSRange(location: 0, length: text.length) let paragraph = NSMutableParagraphStyle() paragraph.lineSpacing = 3 text.addAttribute(NSAttributedStringKey.paragraphStyle, value: paragraph, range: range) text.addAttribute(NSAttributedStringKey.font, value: UIFont(name: "Avenir-Light", size: 16)!, range: range) let s = text.boundingRect(with: CGSize(width: view.frame.width-40, height: CGFloat.greatestFiniteMagnitude), options: [NSStringDrawingOptions.usesLineFragmentOrigin, NSStringDrawingOptions.usesFontLeading], context: nil) return s.size.height + 66 } // MARK: - Table view delegate override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { guard let highlight = highlights[safe: (indexPath as NSIndexPath).row] else { return } self.folioReader.readerCenter?.changePageWith(page: highlight.page, andFragment: highlight.highlightId) self.dismiss() } override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { let highlight = highlights[(indexPath as NSIndexPath).row] if (highlight.page == self.folioReader.readerCenter?.currentPageNumber), let page = self.folioReader.readerCenter?.currentPage { Highlight.removeFromHTMLById(withinPage: page, highlightId: highlight.highlightId) // Remove from HTML } highlight.remove(withConfiguration: self.readerConfig) // Remove from Database highlights.remove(at: (indexPath as NSIndexPath).row) tableView.deleteRows(at: [indexPath], with: .fade) } } // MARK: - Handle rotation transition override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { tableView.reloadData() } }