// // DatabaseWindowController.swift // MongoView // // Created by Shadowfacts on 1/9/20. // Copyright © 2020 Shadowfacts. All rights reserved. // import Cocoa class DatabaseWindowController: NSWindowController { @IBOutlet weak var toolbar: NSToolbar! weak var statusView: WindowStatusView? private var titleObservation: NSKeyValueObservation? var mongoController: MongoController! var initialCollection: DatabaseCollection? private var databaseViewController: DatabaseViewController! convenience init() { self.init(windowNibName: "DatabaseWindowController") } override func windowDidLoad() { super.windowDidLoad() if mongoController == nil { mongoController = MongoController(connectionString: "mongodb://localhost:27017") mongoController.setup() } mongoController.statusDidChange.append({ [weak self] (status) in guard let self = self else { return } self.updateStatusText(status) }) self.updateStatusText(mongoController.status) databaseViewController = DatabaseViewController(mongoController: mongoController) contentViewController = databaseViewController if let initialCollection = initialCollection { databaseViewController.showCollection(initialCollection) } titleObservation = observe(\.contentViewController?.title) { [unowned self] (_, _) in self.updateWindowTitle() } updateWindowTitle() window!.tabbingMode = .preferred window!.tabbingIdentifier = mongoController.connectionString window!.titleVisibility = .hidden } override func newWindowForTab(_ sender: Any?) { (NSApplication.shared.delegate as! AppDelegate).newWindow(mongoController: mongoController) } private func updateWindowTitle() { window?.title = databaseViewController.title ?? "MongoView" } private func updateStatusText(_ status: MongoController.Status) { guard let statusView = self.statusView else { return } switch status { case .connecting: statusView.setText("Connecting...") case .failed: statusView.setText("Failed to connect") case .success: statusView.setText("Connected to \(self.mongoController.connectionString)") } } } 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 } }