2020-01-11 19:42:28 +00:00
|
|
|
//
|
|
|
|
// DatabaseWindowController.swift
|
|
|
|
// MongoView
|
|
|
|
//
|
|
|
|
// Created by Shadowfacts on 1/9/20.
|
|
|
|
// Copyright © 2020 Shadowfacts. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
import Cocoa
|
2020-07-06 14:45:53 +00:00
|
|
|
import Combine
|
2020-01-11 19:42:28 +00:00
|
|
|
|
|
|
|
class DatabaseWindowController: NSWindowController {
|
|
|
|
|
2020-04-01 23:37:00 +00:00
|
|
|
@IBOutlet weak var toolbar: NSToolbar!
|
|
|
|
|
|
|
|
weak var statusView: WindowStatusView?
|
|
|
|
|
2020-01-11 19:42:28 +00:00
|
|
|
private var titleObservation: NSKeyValueObservation?
|
|
|
|
|
|
|
|
var mongoController: MongoController!
|
|
|
|
var initialCollection: DatabaseCollection?
|
|
|
|
|
|
|
|
private var databaseViewController: DatabaseViewController!
|
|
|
|
|
2020-07-07 17:23:27 +00:00
|
|
|
private var statusChangeHandler: Cancellable?
|
|
|
|
private var connectionStatusChangeHandler: Cancellable?
|
2020-07-06 14:45:53 +00:00
|
|
|
|
2020-01-11 19:42:28 +00:00
|
|
|
convenience init() {
|
|
|
|
self.init(windowNibName: "DatabaseWindowController")
|
|
|
|
}
|
|
|
|
|
|
|
|
override func windowDidLoad() {
|
|
|
|
super.windowDidLoad()
|
|
|
|
|
2020-07-06 14:36:44 +00:00
|
|
|
let setupMongo = mongoController == nil
|
|
|
|
if setupMongo {
|
2020-01-11 19:42:28 +00:00
|
|
|
mongoController = MongoController(connectionString: "mongodb://localhost:27017")
|
|
|
|
}
|
2020-07-07 17:23:27 +00:00
|
|
|
|
|
|
|
statusChangeHandler = mongoController.$statusManager
|
2020-07-06 14:45:53 +00:00
|
|
|
.receive(on: DispatchQueue.main)
|
2020-07-07 17:23:27 +00:00
|
|
|
.sink { self.updateStatusText(manager: $0) }
|
|
|
|
|
|
|
|
connectionStatusChangeHandler = mongoController.$status
|
|
|
|
.receive(on: DispatchQueue.main)
|
|
|
|
.filter { $0 == .connected }
|
|
|
|
.sink { (_) in self.initializeUI() }
|
|
|
|
|
2020-07-06 14:36:44 +00:00
|
|
|
if setupMongo {
|
|
|
|
mongoController.setup()
|
2020-01-11 19:42:28 +00:00
|
|
|
}
|
2020-07-06 14:36:44 +00:00
|
|
|
|
2020-01-11 19:42:28 +00:00
|
|
|
titleObservation = observe(\.contentViewController?.title) { [unowned self] (_, _) in
|
|
|
|
self.updateWindowTitle()
|
|
|
|
}
|
|
|
|
updateWindowTitle()
|
|
|
|
|
|
|
|
window!.tabbingMode = .preferred
|
|
|
|
window!.tabbingIdentifier = mongoController.connectionString
|
2020-04-01 23:37:00 +00:00
|
|
|
window!.titleVisibility = .hidden
|
2020-01-11 19:42:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
override func newWindowForTab(_ sender: Any?) {
|
|
|
|
(NSApplication.shared.delegate as! AppDelegate).newWindow(mongoController: mongoController)
|
|
|
|
}
|
|
|
|
|
|
|
|
private func updateWindowTitle() {
|
2020-07-06 14:36:44 +00:00
|
|
|
window?.title = databaseViewController?.title ?? "MongoView"
|
2020-01-11 19:42:28 +00:00
|
|
|
}
|
2020-04-01 23:37:00 +00:00
|
|
|
|
2020-07-07 17:23:27 +00:00
|
|
|
private func updateStatusText(manager: StatusManager) {
|
|
|
|
guard let statusView = self.statusView,
|
|
|
|
let mostRelevant = manager.mostRelevant else { return }
|
|
|
|
|
|
|
|
let dayComparisonResult = Calendar.current.compare(mostRelevant.timestamp, to: Date(), toGranularity: .day)
|
|
|
|
|
|
|
|
let formatter = DateFormatter()
|
|
|
|
if dayComparisonResult == .orderedSame {
|
|
|
|
formatter.dateStyle = .none
|
|
|
|
} else {
|
|
|
|
formatter.dateStyle = .short
|
2020-04-01 23:37:00 +00:00
|
|
|
}
|
2020-07-07 17:23:27 +00:00
|
|
|
formatter.timeStyle = .medium
|
|
|
|
let timestamp = formatter.string(from: mostRelevant.timestamp)
|
|
|
|
|
|
|
|
let string = "\(mostRelevant.message) | \(timestamp)"
|
|
|
|
statusView.setText(string)
|
2020-04-01 23:37:00 +00:00
|
|
|
}
|
2020-01-11 19:42:28 +00:00
|
|
|
|
2020-07-06 14:36:44 +00:00
|
|
|
private func initializeUI() {
|
|
|
|
databaseViewController = DatabaseViewController(mongoController: mongoController)
|
|
|
|
contentViewController = databaseViewController
|
|
|
|
|
|
|
|
if let initialCollection = initialCollection {
|
|
|
|
databaseViewController.showCollection(initialCollection)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-01-11 19:42:28 +00:00
|
|
|
}
|
2020-04-01 23:37:00 +00:00
|
|
|
|
|
|
|
extension NSToolbarItem.Identifier {
|
|
|
|
static let mongoStatus = NSToolbarItem.Identifier("MongoView.mongoStatus")
|
|
|
|
static let refresh = NSToolbarItem.Identifier("MongoView.refresh")
|
|
|
|
}
|
|
|
|
|
|
|
|
extension DatabaseWindowController: NSToolbarDelegate {
|
|
|
|
func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
|
|
|
|
return [
|
|
|
|
.space,
|
|
|
|
.flexibleSpace,
|
|
|
|
.mongoStatus,
|
|
|
|
.refresh,
|
|
|
|
]
|
|
|
|
}
|
|
|
|
|
|
|
|
func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
|
|
|
|
return [
|
|
|
|
.refresh,
|
|
|
|
.flexibleSpace,
|
|
|
|
.mongoStatus,
|
|
|
|
.flexibleSpace,
|
|
|
|
]
|
|
|
|
}
|
|
|
|
|
|
|
|
func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? {
|
|
|
|
if itemIdentifier == .mongoStatus {
|
|
|
|
return createMongoStatusToolbarItem()
|
|
|
|
} else if itemIdentifier == .refresh {
|
|
|
|
return createRefreshToolbarItem()
|
|
|
|
}
|
|
|
|
|
|
|
|
return NSToolbarItem(itemIdentifier: itemIdentifier)
|
|
|
|
}
|
|
|
|
|
|
|
|
func createMongoStatusToolbarItem() -> NSToolbarItem {
|
|
|
|
let item = NSToolbarItem(itemIdentifier: .mongoStatus)
|
|
|
|
item.label = "Status"
|
|
|
|
item.paletteLabel = "Status"
|
|
|
|
let statusView = WindowStatusView.create()
|
|
|
|
self.statusView = statusView
|
|
|
|
item.view = statusView
|
|
|
|
return item
|
|
|
|
}
|
|
|
|
|
|
|
|
func createRefreshToolbarItem() -> NSToolbarItem {
|
|
|
|
let item = NSToolbarItem(itemIdentifier: .refresh)
|
|
|
|
item.label = "Refresh"
|
|
|
|
item.paletteLabel = "Refresh"
|
|
|
|
item.target = self
|
|
|
|
let button = NSButton(image: NSImage(named: NSImage.refreshTemplateName)!, target: nil, action: #selector(DatabaseViewController.refresh(_:)))
|
|
|
|
button.bezelStyle = .texturedRounded
|
|
|
|
item.view = button
|
|
|
|
return item
|
|
|
|
}
|
|
|
|
}
|