| // 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. | |
| var toolTip: String? = nil | |
| 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! | |
| 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) | |
| } | |
| } |