blob: 44cf0f48e7138852a083cc358d9978687b3f73ee [file] [log] [blame]
// Copyright 2016 The Tulsi Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import Cocoa
/// View controller encapsulating the Tulsi generator config wizard.
final class ConfigEditorWizardViewController: NSViewController, NSPageControllerDelegate {
// The storyboard identifiers for the wizard subpage view controllers.
static let wizardPageIdentifiers = [
"BUILDTargetSelect",
"Options",
"SourceTargetSelect",
]
static let LastPageIndex = wizardPageIdentifiers.count - 1
var pageViewController: NSPageController! = nil
@IBOutlet weak var previousButton: NSButton!
@IBOutlet weak var nextButton: NSButton!
override var representedObject: Any? {
didSet {
// Update the current wizard page, if any.
pageViewController?.selectedViewController?.representedObject = representedObject
}
}
override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
if segue.identifier!.rawValue == "Embed Wizard PageController" {
pageViewController = (segue.destinationController as! NSPageController)
pageViewController.arrangedObjects = ConfigEditorWizardViewController.wizardPageIdentifiers
pageViewController.delegate = self
}
super.prepare(for: segue, sender: sender)
}
func setNextButtonEnabled(_ enabled: Bool) {
nextButton.isEnabled = enabled
}
func updateNextButton() {
if pageViewController.selectedIndex == 0 {
let document = representedObject as! TulsiGeneratorConfigDocument
nextButton.isEnabled = document.selectedRuleInfoCount > 0
}
}
@IBAction func cancel(_ sender: AnyObject?) {
let document = representedObject as! TulsiGeneratorConfigDocument
do {
try document.revert()
} catch {
// Nothing useful can be done here with failures to revert so the exception is ignored.
}
document.close()
}
@IBAction func next(_ sender: NSButton? = nil) {
if let deactivatingSubview = pageViewController.selectedViewController as? WizardSubviewProtocol, deactivatingSubview.shouldWizardSubviewDeactivateMovingForward?() == false {
return
}
var selectedIndex = pageViewController.selectedIndex
if selectedIndex >= ConfigEditorWizardViewController.LastPageIndex {
let document = representedObject as! TulsiGeneratorConfigDocument
document.save() { (canceled, error) in
if !canceled && error == nil {
document.close()
}
}
return
}
pageViewController!.navigateForward(sender)
selectedIndex += 1
previousButton.isHidden = false
if selectedIndex == ConfigEditorWizardViewController.LastPageIndex {
nextButton.title = NSLocalizedString("Wizard_SaveConfig",
comment: "Label for action button to be used to go to the final page in the project wizard.")
}
}
@IBAction func previous(_ sender: NSButton? = nil) {
if let deactivatingSubview = pageViewController.selectedViewController as? WizardSubviewProtocol, deactivatingSubview.shouldWizardSubviewDeactivateMovingBackward?() == false {
return
}
var selectedIndex = pageViewController!.selectedIndex
if selectedIndex > 0 {
previousButton.isHidden = selectedIndex <= 1
pageViewController!.navigateBack(sender)
selectedIndex -= 1
nextButton.isEnabled = true
if selectedIndex < ConfigEditorWizardViewController.LastPageIndex {
nextButton.title = NSLocalizedString("Wizard_Next",
comment: "Label for action button to be used to go to the next page in the project wizard.")
}
}
}
// MARK: - NSPageControllerDelegate
func pageController(_ pageController: NSPageController, identifierFor object: Any) -> NSPageController.ObjectIdentifier {
return NSPageController.ObjectIdentifier(rawValue: object as! String)
}
func pageController(_ pageController: NSPageController, viewControllerForIdentifier identifier: NSPageController.ObjectIdentifier) -> NSViewController {
let vc = storyboard!.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: identifier.rawValue)) as! NSViewController
// NSPageController doesn't appear to support Autolayout properly, so fall back to
// autoresizingMask.
vc.view.autoresizingMask = [NSView.AutoresizingMask.width, NSView.AutoresizingMask.height]
return vc
}
func pageController(_ pageController: NSPageController,
prepare viewController: NSViewController,
with object: Any?) {
_pageController(pageController, prepareViewController: viewController, withObject: object! as AnyObject)
}
private func _pageController(_ pageController: NSPageController,
prepareViewController viewController: NSViewController,
withObject object: AnyObject) {
// By default, the viewController will have its representedObject set to the currently selected
// member of the pageController's arrangedObjects. Wizard pages need to represent the underlying
// TulsiDocument, so it's set here.
viewController.representedObject = representedObject
// This index is guaranteed to exist due to fixed number of pages we have.
let newPageIndex = ConfigEditorWizardViewController.wizardPageIdentifiers.index(of: object as! String)!
let subview = viewController as? WizardSubviewProtocol
subview?.presentingWizardViewController = self
if pageController.selectedIndex < newPageIndex {
subview?.wizardSubviewWillActivateMovingForward?()
} else if pageController.selectedIndex > newPageIndex {
subview?.wizardSubviewWillActivateMovingBackward?()
}
}
func pageControllerDidEndLiveTransition(_ pageController: NSPageController) {
if let subview = pageController.selectedViewController as? WizardSubviewProtocol {
subview.wizardSubviewDidDeactivate?()
}
pageController.completeTransition()
}
}