diff --git a/SwiftNeoVim/NeoVimViewDelegate.swift b/SwiftNeoVim/NeoVimViewDelegate.swift index d77508d6..9dc6ca0d 100644 --- a/SwiftNeoVim/NeoVimViewDelegate.swift +++ b/SwiftNeoVim/NeoVimViewDelegate.swift @@ -7,5 +7,5 @@ import Cocoa public protocol NeoVimViewDelegate { - func setTitle(title: String) + func setNeoVimTitle(title: String) } diff --git a/SwiftNeoVim/NeoVimViewUiBridge.swift b/SwiftNeoVim/NeoVimViewUiBridge.swift index 9b056f08..c8238899 100644 --- a/SwiftNeoVim/NeoVimViewUiBridge.swift +++ b/SwiftNeoVim/NeoVimViewUiBridge.swift @@ -167,7 +167,9 @@ extension NeoVimView: NeoVimUiBridgeProtocol { } public func setTitle(title: String) { - self.delegate?.setTitle(title) + DispatchUtils.gui { + self.delegate?.setNeoVimTitle(title) + } } public func setIcon(icon: String) { diff --git a/nvox.xcodeproj/project.pbxproj b/nvox.xcodeproj/project.pbxproj index 00c72cf7..01f5eb22 100644 --- a/nvox.xcodeproj/project.pbxproj +++ b/nvox.xcodeproj/project.pbxproj @@ -35,6 +35,8 @@ 4B9A15251D2993DA009F9F67 /* Quick.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4B56F29C1D29926600C1F92E /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 4B9A15261D2993DF009F9F67 /* SwiftNeoVim.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4B2A2BF71D0351810074CE9A /* SwiftNeoVim.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 4BCADE081D11ED12004DAD0F /* CocoaExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BCADE071D11ED12004DAD0F /* CocoaExtensions.swift */; }; + 4BD3BF931D32A95800082605 /* MainWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BD3BF921D32A95800082605 /* MainWindowController.swift */; }; + 4BD3BF971D32B0DB00082605 /* MainWindowManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BD3BF961D32B0DB00082605 /* MainWindowManager.swift */; }; 4BDCFACB1D31449700F62670 /* NeoVimServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4BDCFACA1D31449700F62670 /* NeoVimServer.m */; }; 4BDCFACD1D3145AC00F62670 /* libnvim.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4BDCFACC1D3145AC00F62670 /* libnvim.a */; }; 4BDCFAD51D3145E500F62670 /* libjemalloc_pic.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4BDCFACE1D3145E500F62670 /* libjemalloc_pic.a */; }; @@ -179,6 +181,8 @@ 4B854A1C1D31447C00E08DE1 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 4BCADE071D11ED12004DAD0F /* CocoaExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CocoaExtensions.swift; sourceTree = ""; }; 4BCF638F1D323CFD00F15CE4 /* nvim */ = {isa = PBXFileReference; lastKnownFileType = folder; name = nvim; path = neovim/src/nvim; sourceTree = SOURCE_ROOT; }; + 4BD3BF921D32A95800082605 /* MainWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainWindowController.swift; sourceTree = ""; }; + 4BD3BF961D32B0DB00082605 /* MainWindowManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainWindowManager.swift; sourceTree = ""; }; 4BDCFAC91D31449700F62670 /* NeoVimServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NeoVimServer.h; sourceTree = ""; }; 4BDCFACA1D31449700F62670 /* NeoVimServer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NeoVimServer.m; sourceTree = ""; }; 4BDCFACC1D3145AC00F62670 /* libnvim.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libnvim.a; path = neovim/build/lib/libnvim.a; sourceTree = SOURCE_ROOT; }; @@ -377,10 +381,12 @@ isa = PBXGroup; children = ( 4BEBA5081CFF374B00673FDF /* AppDelegate.swift */, - 4B2A2C0D1D0353750074CE9A /* Bridge.h */, + 4BD3BF961D32B0DB00082605 /* MainWindowManager.swift */, + 4BD3BF921D32A95800082605 /* MainWindowController.swift */, 4BEBA50A1CFF374B00673FDF /* Assets.xcassets */, 4BEBA50C1CFF374B00673FDF /* MainMenu.xib */, 4BEBA50F1CFF374B00673FDF /* Info.plist */, + 4B2A2C0D1D0353750074CE9A /* Bridge.h */, ); path = nvox; sourceTree = ""; @@ -667,6 +673,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 4BD3BF971D32B0DB00082605 /* MainWindowManager.swift in Sources */, + 4BD3BF931D32A95800082605 /* MainWindowController.swift in Sources */, 4BEBA5091CFF374B00673FDF /* AppDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/nvox/AppDelegate.swift b/nvox/AppDelegate.swift index 9148afd5..d22f3965 100644 --- a/nvox/AppDelegate.swift +++ b/nvox/AppDelegate.swift @@ -7,32 +7,23 @@ import Cocoa import PureLayout @NSApplicationMain -class AppDelegate: NSObject, NSApplicationDelegate, NeoVimViewDelegate { +class AppDelegate: NSObject, NSApplicationDelegate { @IBOutlet weak var window: NSWindow! - let view = NeoVimView(forAutoLayout: ()) - + private let mainWindowManager = MainWindowManager() + @IBAction func debugSomething(sender: AnyObject!) { - let font = NSFont(name: "Courier", size: 14)! - self.view.setFont(font) + NSLog("debug sth...") } - - func applicationDidFinishLaunching(aNotification: NSNotification) { + + @IBAction func newDocument(sender: AnyObject!) { + self.mainWindowManager.newMainWindow() + } + +// func applicationDidFinishLaunching(aNotification: NSNotification) { // let testView = InputTestView(frame: CGRect(x: 0, y: 0, width: 300, height: 300)) // self.window.contentView?.addSubview(testView) // self.window.makeFirstResponder(testView) - - self.window.contentView?.addSubview(self.view) - self.view.autoPinEdgesToSuperviewEdges() - self.window.makeFirstResponder(self.view) - } - - func applicationWillTerminate(notification: NSNotification) { - self.view.cleanUp() - } - - func setTitle(title: String) { - self.window.title = title - } +// } } diff --git a/nvox/MainWindowController.swift b/nvox/MainWindowController.swift new file mode 100644 index 00000000..e94f975b --- /dev/null +++ b/nvox/MainWindowController.swift @@ -0,0 +1,52 @@ +/** + * Tae Won Ha - http://taewon.de - @hataewon + * See LICENSE + */ + +import Cocoa +import PureLayout + +class MainWindowController: NSWindowController, NSWindowDelegate { + + var uuid: String { + return self.neoVimView.uuid + } + + weak var mainWindowManager: MainWindowManager? + + private let neoVimView = NeoVimView(forAutoLayout: ()) + + init(contentRect: CGRect, manager: MainWindowManager) { + self.mainWindowManager = manager + + let style = NSTitledWindowMask | NSUnifiedTitleAndToolbarWindowMask | NSTexturedBackgroundWindowMask | + NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask + let window = NSWindow(contentRect: contentRect, styleMask: style, backing: .Buffered, defer: true) + + super.init(window: window) + + window.delegate = self + window.hasShadow = true + window.title = "nvox" + window.opaque = false + window.animationBehavior = .DocumentWindow + + self.addViews() + + self.window?.makeFirstResponder(self.neoVimView) + } + + func windowWillClose(notification: NSNotification) { + self.neoVimView.cleanUp() + self.mainWindowManager?.closeMainWindow(self) + } + + private func addViews() { + self.window?.contentView?.addSubview(self.neoVimView) + self.neoVimView.autoPinEdgesToSuperviewEdges() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/nvox/MainWindowManager.swift b/nvox/MainWindowManager.swift new file mode 100644 index 00000000..2e947428 --- /dev/null +++ b/nvox/MainWindowManager.swift @@ -0,0 +1,23 @@ +/** + * Tae Won Ha - http://taewon.de - @hataewon + * See LICENSE + */ + +import Cocoa + +class MainWindowManager { + + private var mainWindowControllers: [String: MainWindowController] = [:] + + func newMainWindow() { + let mainWindowController = MainWindowController(contentRect: CGRect(x: 100, y: 100, width: 320, height: 240), + manager: self) + mainWindowController.showWindow(self) + + self.mainWindowControllers[mainWindowController.uuid] = mainWindowController + } + + func closeMainWindow(mainWindowController: MainWindowController) { + self.mainWindowControllers.removeValueForKey(mainWindowController.uuid) + } +}