added iOS source code
[wl-app.git] / iOS / Pods / FolioReaderKit / Source / FolioReaderHighlightList.swift
1 //
2 //  FolioReaderHighlightList.swift
3 //  FolioReaderKit
4 //
5 //  Created by Heberti Almeida on 01/09/15.
6 //  Copyright (c) 2015 Folio Reader. All rights reserved.
7 //
8
9 import UIKit
10
11 class FolioReaderHighlightList: UITableViewController {
12
13     fileprivate var highlights = [Highlight]()
14     fileprivate var readerConfig: FolioReaderConfig
15     fileprivate var folioReader: FolioReader
16
17     init(folioReader: FolioReader, readerConfig: FolioReaderConfig) {
18         self.readerConfig = readerConfig
19         self.folioReader = folioReader
20
21         super.init(style: UITableViewStyle.plain)
22     }
23
24     required init?(coder aDecoder: NSCoder) {
25         fatalError("init with coder not supported")
26     }
27
28     override func viewDidLoad() {
29         super.viewDidLoad()
30
31         self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: kReuseCellIdentifier)
32         self.tableView.separatorInset = UIEdgeInsets.zero
33         self.tableView.backgroundColor = self.folioReader.isNight(self.readerConfig.nightModeMenuBackground, self.readerConfig.menuBackgroundColor)
34         self.tableView.separatorColor = self.folioReader.isNight(self.readerConfig.nightModeSeparatorColor, self.readerConfig.menuSeparatorColor)
35
36         guard let bookId = (self.folioReader.readerContainer?.book.name as NSString?)?.deletingPathExtension else {
37             self.highlights = []
38             return
39         }
40
41         self.highlights = Highlight.allByBookId(withConfiguration: self.readerConfig, bookId: bookId)
42     }
43
44     // MARK: - Table view data source
45
46     override func numberOfSections(in tableView: UITableView) -> Int {
47         return 1
48     }
49
50     override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
51         return highlights.count
52     }
53
54     override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
55         let cell = tableView.dequeueReusableCell(withIdentifier: kReuseCellIdentifier, for: indexPath)
56         cell.backgroundColor = UIColor.clear
57
58         let highlight = highlights[(indexPath as NSIndexPath).row]
59
60         // Format date
61         let dateFormatter = DateFormatter()
62         dateFormatter.dateFormat = self.readerConfig.localizedHighlightsDateFormat
63         let dateString = dateFormatter.string(from: highlight.date)
64
65         // Date
66         var dateLabel: UILabel!
67         if cell.contentView.viewWithTag(456) == nil {
68             dateLabel = UILabel(frame: CGRect(x: 0, y: 0, width: view.frame.width-40, height: 16))
69             dateLabel.tag = 456
70             dateLabel.autoresizingMask = UIViewAutoresizing.flexibleWidth
71             dateLabel.font = UIFont(name: "Avenir-Medium", size: 12)
72             cell.contentView.addSubview(dateLabel)
73         } else {
74             dateLabel = cell.contentView.viewWithTag(456) as! UILabel
75         }
76
77         dateLabel.text = dateString.uppercased()
78         dateLabel.textColor = self.folioReader.isNight(UIColor(white: 5, alpha: 0.3), UIColor.lightGray)
79         dateLabel.frame = CGRect(x: 20, y: 20, width: view.frame.width-40, height: dateLabel.frame.height)
80
81         // Text
82         let cleanString = highlight.content.stripHtml().truncate(250, trailing: "...").stripLineBreaks()
83         let text = NSMutableAttributedString(string: cleanString)
84         let range = NSRange(location: 0, length: text.length)
85         let paragraph = NSMutableParagraphStyle()
86         paragraph.lineSpacing = 3
87         let textColor = self.folioReader.isNight(self.readerConfig.menuTextColor, UIColor.black)
88
89         text.addAttribute(NSAttributedStringKey.paragraphStyle, value: paragraph, range: range)
90         text.addAttribute(NSAttributedStringKey.font, value: UIFont(name: "Avenir-Light", size: 16)!, range: range)
91         text.addAttribute(NSAttributedStringKey.foregroundColor, value: textColor, range: range)
92
93         if (highlight.type == HighlightStyle.underline.rawValue) {
94             text.addAttribute(NSAttributedStringKey.backgroundColor, value: UIColor.clear, range: range)
95             text.addAttribute(NSAttributedStringKey.underlineColor, value: HighlightStyle.colorForStyle(highlight.type, nightMode: self.folioReader.nightMode), range: range)
96             text.addAttribute(NSAttributedStringKey.underlineStyle, value: NSNumber(value: NSUnderlineStyle.styleSingle.rawValue as Int), range: range)
97         } else {
98             text.addAttribute(NSAttributedStringKey.backgroundColor, value: HighlightStyle.colorForStyle(highlight.type, nightMode: self.folioReader.nightMode), range: range)
99         }
100
101         // Text
102         var highlightLabel: UILabel!
103         if cell.contentView.viewWithTag(123) == nil {
104             highlightLabel = UILabel(frame: CGRect(x: 0, y: 0, width: view.frame.width-40, height: 0))
105             highlightLabel.tag = 123
106             highlightLabel.autoresizingMask = UIViewAutoresizing.flexibleWidth
107             highlightLabel.numberOfLines = 0
108             highlightLabel.textColor = UIColor.black
109             cell.contentView.addSubview(highlightLabel)
110         } else {
111             highlightLabel = cell.contentView.viewWithTag(123) as! UILabel
112         }
113
114         highlightLabel.attributedText = text
115         highlightLabel.sizeToFit()
116         highlightLabel.frame = CGRect(x: 20, y: 46, width: view.frame.width-40, height: highlightLabel.frame.height)
117
118         cell.layoutMargins = UIEdgeInsets.zero
119         cell.preservesSuperviewLayoutMargins = false
120         return cell
121     }
122
123     override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
124         let highlight = highlights[(indexPath as NSIndexPath).row]
125
126         let cleanString = highlight.content.stripHtml().truncate(250, trailing: "...").stripLineBreaks()
127         let text = NSMutableAttributedString(string: cleanString)
128         let range = NSRange(location: 0, length: text.length)
129         let paragraph = NSMutableParagraphStyle()
130         paragraph.lineSpacing = 3
131         text.addAttribute(NSAttributedStringKey.paragraphStyle, value: paragraph, range: range)
132         text.addAttribute(NSAttributedStringKey.font, value: UIFont(name: "Avenir-Light", size: 16)!, range: range)
133
134         let s = text.boundingRect(with: CGSize(width: view.frame.width-40, height: CGFloat.greatestFiniteMagnitude),
135                                   options: [NSStringDrawingOptions.usesLineFragmentOrigin, NSStringDrawingOptions.usesFontLeading],
136                                   context: nil)
137
138         return s.size.height + 66
139     }
140
141     // MARK: - Table view delegate
142
143     override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
144         guard let highlight = highlights[safe: (indexPath as NSIndexPath).row] else {
145             return
146         }
147
148         self.folioReader.readerCenter?.changePageWith(page: highlight.page, andFragment: highlight.highlightId)
149         self.dismiss()
150     }
151
152     override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
153         if editingStyle == .delete {
154             let highlight = highlights[(indexPath as NSIndexPath).row]
155
156             if (highlight.page == self.folioReader.readerCenter?.currentPageNumber),
157                 let page = self.folioReader.readerCenter?.currentPage {
158                 Highlight.removeFromHTMLById(withinPage: page, highlightId: highlight.highlightId) // Remove from HTML
159             }
160
161             highlight.remove(withConfiguration: self.readerConfig) // Remove from Database
162             highlights.remove(at: (indexPath as NSIndexPath).row)
163             tableView.deleteRows(at: [indexPath], with: .fade)
164         }
165     }
166     
167     // MARK: - Handle rotation transition
168     
169     override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
170         tableView.reloadData()
171     }
172 }