blob: 4685d40f63dd75a4e544241557e21d6769647fa5 [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
import TulsiGenerator
/// Models a UIRuleEntry as a node suitable for display in the options target selector.
class OptionsTargetNode: UISelectableOutlineViewNode {
/// Tooltip to be displayed for this node.
@objc var toolTip: String? = nil
@objc var boldFont: Bool {
return !children.isEmpty
}
}
protocol OptionsTargetSelectorControllerDelegate: class {
/// Invoked when the target selection has been changed.
func didSelectOptionsTargetNode(_ node: OptionsTargetNode)
}
// Delegate for the target selector outline view.
class OptionsTargetSelectorController: NSObject, NSOutlineViewDelegate {
static let projectSectionTitle =
NSLocalizedString("OptionsTarget_ProjectSectionTitle",
comment: "Short header shown before the project in the options editor's target selector.")
static let targetSectionTitle =
NSLocalizedString("OptionsTarget_TargetSectionTitle",
comment: "Short header shown before the build targets in the options editor's target selector.")
weak var view: NSOutlineView!
@objc dynamic var nodes = [OptionsTargetNode]()
weak var delegate: OptionsTargetSelectorControllerDelegate?
weak var model: OptionsEditorModelProtocol! = nil {
didSet {
if model == nil || model.projectName == nil { return }
let projectSection = OptionsTargetNode(name: OptionsTargetSelectorController.projectSectionTitle)
projectSection.addChild(OptionsTargetNode(name: model.projectName!))
var newNodes = [projectSection]
if model.shouldShowPerTargetOptions, let targetEntries = model.optionsTargetUIRuleEntries {
let targetSection = OptionsTargetNode(name: OptionsTargetSelectorController.targetSectionTitle)
for entry in targetEntries {
let node = OptionsTargetNode(name: entry.targetName!)
node.toolTip = entry.fullLabel
node.entry = entry
targetSection.addChild(node)
}
newNodes.append(targetSection)
}
nodes = newNodes
// Expand all children in the target selector and select the project.
view.expandItem(nil, expandChildren: true)
view.selectRowIndexes(IndexSet(integer: 1), byExtendingSelection: false)
}
}
init(view: NSOutlineView, delegate: OptionsTargetSelectorControllerDelegate) {
self.view = view
self.delegate = delegate
super.init()
self.view.delegate = self
}
func outlineView(_ outlineView: NSOutlineView, shouldSelectItem item: Any) -> Bool {
// The top level items are not selectable.
return outlineView.level(forItem: item) > 0
}
func outlineView(_ outlineView: NSOutlineView, shouldCollapseItem item: Any) -> Bool {
return false
}
func outlineView(_ outlineView: NSOutlineView, shouldShowOutlineCellForItem item: Any) -> Bool {
return false
}
func outlineViewSelectionDidChange(_ notification: Notification) {
if delegate == nil { return }
let selectedTreeNode = view.item(atRow: view.selectedRow) as! NSTreeNode
let selectedTarget = selectedTreeNode.representedObject as! OptionsTargetNode
delegate!.didSelectOptionsTargetNode(selectedTarget)
}
}