--- /dev/null
+//
+// FolioReaderChapterList.swift
+// FolioReaderKit
+//
+// Created by Heberti Almeida on 15/04/15.
+// Copyright (c) 2015 Folio Reader. All rights reserved.
+//
+
+import UIKit
+
+/// Table Of Contents delegate
+@objc protocol FolioReaderChapterListDelegate: class {
+ /**
+ Notifies when the user selected some item on menu.
+ */
+ func chapterList(_ chapterList: FolioReaderChapterList, didSelectRowAtIndexPath indexPath: IndexPath, withTocReference reference: FRTocReference)
+
+ /**
+ Notifies when chapter list did totally dismissed.
+ */
+ func chapterList(didDismissedChapterList chapterList: FolioReaderChapterList)
+}
+
+class FolioReaderChapterList: UITableViewController {
+
+ weak var delegate: FolioReaderChapterListDelegate?
+ fileprivate var tocItems = [FRTocReference]()
+ fileprivate var book: FRBook
+ fileprivate var readerConfig: FolioReaderConfig
+ fileprivate var folioReader: FolioReader
+
+ init(folioReader: FolioReader, readerConfig: FolioReaderConfig, book: FRBook, delegate: FolioReaderChapterListDelegate?) {
+ self.readerConfig = readerConfig
+ self.folioReader = folioReader
+ self.delegate = delegate
+ self.book = book
+
+ super.init(style: UITableViewStyle.plain)
+ }
+
+ required init?(coder aDecoder: NSCoder) {
+ fatalError("init with coder not supported")
+ }
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ // Register cell classes
+ self.tableView.register(FolioReaderChapterListCell.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)
+
+ self.tableView.rowHeight = UITableViewAutomaticDimension
+ self.tableView.estimatedRowHeight = 50
+
+ // Create TOC list
+ self.tocItems = self.book.flatTableOfContents
+ }
+
+ // MARK: - Table view data source
+
+ override func numberOfSections(in tableView: UITableView) -> Int {
+ return 1
+ }
+
+ override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
+ return tocItems.count
+ }
+
+ override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
+ let cell = tableView.dequeueReusableCell(withIdentifier: kReuseCellIdentifier, for: indexPath) as! FolioReaderChapterListCell
+
+ cell.setup(withConfiguration: self.readerConfig)
+ let tocReference = tocItems[(indexPath as NSIndexPath).row]
+ let isSection = tocReference.children.count > 0
+
+ cell.indexLabel?.text = tocReference.title.trimmingCharacters(in: .whitespacesAndNewlines)
+
+ // Add audio duration for Media Ovelay
+ if let resource = tocReference.resource {
+ if let mediaOverlay = resource.mediaOverlay {
+ let duration = self.book.duration(for: "#"+mediaOverlay)
+
+ if let durationFormatted = (duration != nil ? duration : "")?.clockTimeToMinutesString() {
+ let text = cell.indexLabel?.text ?? ""
+ cell.indexLabel?.text = text + (duration != nil ? (" - " + durationFormatted) : "")
+ }
+ }
+ }
+
+ // Mark current reading chapter
+ if
+ let currentPageNumber = self.folioReader.readerCenter?.currentPageNumber,
+ let reference = self.book.spine.spineReferences[safe: currentPageNumber - 1],
+ (tocReference.resource != nil) {
+ let resource = reference.resource
+ cell.indexLabel?.textColor = (tocReference.resource == resource ? self.readerConfig.tintColor : self.readerConfig.menuTextColor)
+ }
+
+ cell.layoutMargins = UIEdgeInsets.zero
+ cell.preservesSuperviewLayoutMargins = false
+ cell.contentView.backgroundColor = isSection ? UIColor(white: 0.7, alpha: 0.1) : UIColor.clear
+ cell.backgroundColor = UIColor.clear
+ return cell
+ }
+
+ // MARK: - Table view delegate
+
+ override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
+ let tocReference = tocItems[(indexPath as NSIndexPath).row]
+ delegate?.chapterList(self, didSelectRowAtIndexPath: indexPath, withTocReference: tocReference)
+
+ tableView.deselectRow(at: indexPath, animated: true)
+ dismiss {
+ self.delegate?.chapterList(didDismissedChapterList: self)
+ }
+ }
+}