/
СonnectionsTableViewController.swift
109 lines (80 loc) · 3.43 KB
/
СonnectionsTableViewController.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
//
// СonnectionsTableViewController.swift
// EduVPN-macOS
//
import Cocoa
import CoreData
import os.log
class ConnectionsTableViewController: NSViewController {
@IBOutlet var tableView: DeselectingTableView!
@IBOutlet var backButton: NSButton!
var profiles: [Profile] {
guard let sections = fetchedResultsController.sections else {
return []
}
return sections.map { $0.objects }.reduce([], +)
}
weak var delegate: ConnectionsTableViewControllerDelegate?
var instance: Instance?
var viewContext: NSManagedObjectContext!
private lazy var fetchedResultsController: FetchedResultsController<Profile> = {
let fetchRequest = NSFetchRequest<Profile>()
fetchRequest.entity = Profile.entity()
if let instance = instance {
fetchRequest.predicate = NSPredicate(format: "api.instance == %@", instance)
}
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "api.instance.providerType", ascending: true),
NSSortDescriptor(key: "api.instance.baseUri", ascending: true),
NSSortDescriptor(key: "profileId", ascending: true)]
let frc = FetchedResultsController<Profile>(fetchRequest: fetchRequest,
managedObjectContext: viewContext)
frc.setDelegate(self.frcDelegate)
return frc
}()
private lazy var frcDelegate: CoreDataFetchedResultsControllerDelegate<Profile> = { // swiftlint:disable:this weak_delegate
return CoreDataFetchedResultsControllerDelegate<Profile>(tableView: self.tableView)
}()
override func viewDidLoad() {
super.viewDidLoad()
tableView.deselectAll(nil)
tableView.isEnabled = true
refresh()
if profiles.isEmpty {
delegate?.noProfiles(providerTableViewController: self)
}
}
override func viewWillAppear() {
super.viewWillAppear()
}
@objc func refresh() {
do {
try fetchedResultsController.performFetch()
} catch {
os_log("Failed to fetch objects: %{public}@", log: Log.general, type: .error, error.localizedDescription)
}
}
@IBAction func goBack(_ sender: Any) {
delegate?.connectionsTableViewControllerWantsToClose(self)
}
}
extension ConnectionsTableViewController: NSTableViewDataSource {
func numberOfRows(in tableView: NSTableView) -> Int {
return profiles.count
}
}
extension ConnectionsTableViewController: NSTableViewDelegate {
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
let result = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ProfileCell"), owner: self) as? NSTableCellView
let profile = profiles[row]
result?.textField?.stringValue = profile.displayNames?.localizedValue ?? profile.displayString ?? profile.profileId ?? ""
return result
}
func tableViewSelectionDidChange(_ notification: Notification) {
guard tableView.selectedRow >= 0 else {
return
}
let profile = profiles[tableView.selectedRow]
delegate?.connect(profile: profile)
tableView.deselectRow(tableView.selectedRow)
}
}