|
@@ -0,0 +1,169 @@
|
|
|
+//
|
|
|
+// NCViewerPDFSearch.swift
|
|
|
+// Nextcloud
|
|
|
+//
|
|
|
+// Created by Marino Faggiana on 23/03/2020.
|
|
|
+// Copyright © 2020 Marino Faggiana. All rights reserved.
|
|
|
+//
|
|
|
+// Author Marino Faggiana <marino.faggiana@nextcloud.com>
|
|
|
+//
|
|
|
+// This program is free software: you can redistribute it and/or modify
|
|
|
+// it under the terms of the GNU General Public License as published by
|
|
|
+// the Free Software Foundation, either version 3 of the License, or
|
|
|
+// (at your option) any later version.
|
|
|
+//
|
|
|
+// This program is distributed in the hope that it will be useful,
|
|
|
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
+// GNU General Public License for more details.
|
|
|
+//
|
|
|
+// You should have received a copy of the GNU General Public License
|
|
|
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
+//
|
|
|
+
|
|
|
+import Foundation
|
|
|
+import PDFKit
|
|
|
+
|
|
|
+@available(iOS 11, *)
|
|
|
+
|
|
|
+@objc protocol NCViewerPDFSearchDelegate : class {
|
|
|
+ func searchPdfSelection(_ pdfSelection: PDFSelection)
|
|
|
+}
|
|
|
+
|
|
|
+@available(iOS 11, *)
|
|
|
+
|
|
|
+class NCViewerPDFSearch: UITableViewController, UISearchBarDelegate, PDFDocumentDelegate {
|
|
|
+
|
|
|
+ var searchBar = UISearchBar()
|
|
|
+ var pdfDocument: PDFDocument?
|
|
|
+ var searchResultArray = [PDFSelection]()
|
|
|
+
|
|
|
+ weak var delegate: NCViewerPDFSearchDelegate?
|
|
|
+
|
|
|
+ //MARK: - LifeCycle
|
|
|
+
|
|
|
+ override func viewDidLoad() {
|
|
|
+ super.viewDidLoad()
|
|
|
+
|
|
|
+ searchBar.delegate = self
|
|
|
+ searchBar.sizeToFit()
|
|
|
+ searchBar.searchBarStyle = .minimal
|
|
|
+
|
|
|
+ navigationItem.titleView = searchBar
|
|
|
+
|
|
|
+ tableView.dataSource = self
|
|
|
+ tableView.delegate = self
|
|
|
+ tableView.register(UINib.init(nibName: "NCViewerPDFSearchCell", bundle: nil), forCellReuseIdentifier: "Cell")
|
|
|
+ }
|
|
|
+
|
|
|
+ override func viewWillAppear(_ animated: Bool) {
|
|
|
+ super.viewWillAppear(animated)
|
|
|
+ searchBar.becomeFirstResponder()
|
|
|
+ }
|
|
|
+
|
|
|
+ //MARK: - UITableView DataSource / Delegate
|
|
|
+
|
|
|
+ override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
|
|
|
+ return 82
|
|
|
+ }
|
|
|
+
|
|
|
+ override func numberOfSections(in tableView: UITableView) -> Int {
|
|
|
+ return 1
|
|
|
+ }
|
|
|
+
|
|
|
+ override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
|
|
+ return self.searchResultArray.count
|
|
|
+ }
|
|
|
+
|
|
|
+ override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
|
|
+
|
|
|
+ let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! NCViewerPDFSearchCell
|
|
|
+ let pdfSelection = searchResultArray[indexPath.row] as PDFSelection
|
|
|
+ if let pdfOutline = pdfDocument?.outlineItem(for: pdfSelection) {
|
|
|
+ cell.outlineLabel.text = pdfOutline.label
|
|
|
+ }
|
|
|
+ let pdfPage = pdfSelection.pages.first
|
|
|
+ cell.pageNumberLabel.text = "Page: " + (pdfPage?.label ?? "")
|
|
|
+
|
|
|
+ let extendSelection = pdfSelection.copy() as! PDFSelection
|
|
|
+ extendSelection.extend(atStart: 10)
|
|
|
+ extendSelection.extend(atEnd: 90)
|
|
|
+ extendSelection.extendForLineBoundaries()
|
|
|
+
|
|
|
+ let nsRange = NSString(string: extendSelection.string!).range(of: pdfSelection.string!, options: String.CompareOptions.caseInsensitive)
|
|
|
+ if nsRange.location != NSNotFound {
|
|
|
+
|
|
|
+ let attributedSubString = NSAttributedString.init(string: NSString(string: extendSelection.string!).substring(with: nsRange), attributes: [NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: 17)])
|
|
|
+ let attributedString = NSMutableAttributedString.init(string: extendSelection.string!)
|
|
|
+ attributedString.replaceCharacters(in: nsRange, with: attributedSubString)
|
|
|
+ cell.searchResultTextLabel.attributedText = attributedString
|
|
|
+ }
|
|
|
+
|
|
|
+ return cell
|
|
|
+ }
|
|
|
+
|
|
|
+ override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
|
|
+
|
|
|
+ let pdfSelection = searchResultArray[indexPath.row]
|
|
|
+ delegate?.searchPdfSelection(pdfSelection)
|
|
|
+ dismiss(animated: true)
|
|
|
+ }
|
|
|
+
|
|
|
+ //MARK: - PDFSelection Delegate
|
|
|
+
|
|
|
+ func didMatchString(_ instance: PDFSelection) {
|
|
|
+ searchResultArray.append(instance)
|
|
|
+ tableView.reloadData()
|
|
|
+ }
|
|
|
+
|
|
|
+ //MARK: - UIScrollView Delegate
|
|
|
+
|
|
|
+ override func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
|
|
|
+ searchBar.resignFirstResponder()
|
|
|
+ }
|
|
|
+
|
|
|
+ //MARK: - UISearchBarDelegate
|
|
|
+
|
|
|
+ func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
|
|
|
+ searchBar.resignFirstResponder()
|
|
|
+ }
|
|
|
+
|
|
|
+ func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
|
|
|
+ pdfDocument?.cancelFindString()
|
|
|
+ navigationItem.setRightBarButton(nil, animated: false)
|
|
|
+ dismiss(animated: true)
|
|
|
+ }
|
|
|
+
|
|
|
+ func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
|
|
|
+ if searchText.count < 2 { return }
|
|
|
+
|
|
|
+ searchResultArray.removeAll()
|
|
|
+ tableView.reloadData()
|
|
|
+ pdfDocument?.cancelFindString()
|
|
|
+ pdfDocument?.delegate = self
|
|
|
+ pdfDocument?.beginFindString(searchText, withOptions: .caseInsensitive)
|
|
|
+ }
|
|
|
+
|
|
|
+ func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
|
|
|
+
|
|
|
+ let cancelBarButtonItem = UIBarButtonItem.init(title: "Cancel", style: .plain, target: self, action: #selector(cancelBarButtonItemClicked))
|
|
|
+ navigationItem.setRightBarButton(cancelBarButtonItem, animated: true)
|
|
|
+ return true
|
|
|
+ }
|
|
|
+
|
|
|
+ @objc func cancelBarButtonItemClicked() {
|
|
|
+ searchBarCancelButtonClicked(searchBar)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class NCViewerPDFSearchCell: UITableViewCell {
|
|
|
+
|
|
|
+ @IBOutlet weak var outlineLabel: UILabel!
|
|
|
+ @IBOutlet weak var pageNumberLabel: UILabel!
|
|
|
+ @IBOutlet weak var searchResultTextLabel: UILabel!
|
|
|
+
|
|
|
+ override func awakeFromNib() {
|
|
|
+ super.awakeFromNib()
|
|
|
+ }
|
|
|
+}
|
|
|
+
|