import definition = require("ui/tab-view"); import view = require("ui/core/view"); import dependencyObservable = require("ui/core/dependency-observable"); import proxy = require("ui/core/proxy"); import types = require("utils/types"); import trace = require("trace"); export var traceCategory = "TabView"; var TAB_VIEW = "TabView"; var ITEMS = "items"; var SELECTED_INDEX = "selectedIndex"; export module knownCollections { export var items = "items"; } var itemsProperty = new dependencyObservable.Property( ITEMS, TAB_VIEW, new proxy.PropertyMetadata( undefined, dependencyObservable.PropertyMetadataSettings.AffectsLayout)); var selectedIndexProperty = new dependencyObservable.Property( SELECTED_INDEX, TAB_VIEW, new proxy.PropertyMetadata( undefined, dependencyObservable.PropertyMetadataSettings.AffectsLayout)); (selectedIndexProperty.metadata).onSetNativeValue = function (data: dependencyObservable.PropertyChangeData) { var tabView = data.object; tabView._onSelectedIndexPropertyChangedSetNativeValue(data); }; (itemsProperty.metadata).onSetNativeValue = function (data: dependencyObservable.PropertyChangeData) { var tabView = data.object; tabView._onItemsPropertyChangedSetNativeValue(data); } export class TabView extends view.View implements definition.TabView, view.AddArrayFromBuilder { public static itemsProperty = itemsProperty; public static selectedIndexProperty = selectedIndexProperty; public static selectedIndexChangedEvent = "selectedIndexChanged"; public _addArrayFromBuilder(name: string, value: Array) { if (name === ITEMS) { this.items = value; } } get items(): Array { return this._getValue(TabView.itemsProperty); } set items(value: Array) { this._setValue(TabView.itemsProperty, value); } public _onItemsPropertyChangedSetNativeValue(data: dependencyObservable.PropertyChangeData) { trace.write("TabView.__onItemsPropertyChangedSetNativeValue(" + data.oldValue + " -> " + data.newValue + ");", traceCategory); if (data.oldValue) { this._removeTabs(data.oldValue); } if (data.newValue) { this._addTabs(data.newValue); } this._updateSelectedIndexOnItemsPropertyChanged(data.newValue); } public _updateSelectedIndexOnItemsPropertyChanged(newItems) { trace.write("TabView._updateSelectedIndexOnItemsPropertyChanged(" + newItems + ");", traceCategory); var newItemsCount = 0; if (newItems) { newItemsCount = newItems.length; } if (newItemsCount === 0) { this.selectedIndex = undefined; } else if (types.isUndefined(this.selectedIndex) || this.selectedIndex >= newItemsCount) { this.selectedIndex = 0; } } public _removeTabs(oldItems: Array) { // } public _addTabs(newItems: Array) { // Validate that all items are ok before the native _addTabs code runs. var i: number; var length = newItems.length; var newItem: definition.TabViewItem; for (i = 0; i < length; i++) { newItem = newItems[i]; if (!newItem) { throw new Error("TabViewItem at index " + i + " is undefined."); } if (!newItem.view) { throw new Error("TabViewItem at index " + i + " does not have a view."); } } } get selectedIndex(): number { return this._getValue(TabView.selectedIndexProperty); } set selectedIndex(value: number) { this._setValue(TabView.selectedIndexProperty, value); } public _onSelectedIndexPropertyChangedSetNativeValue(data: dependencyObservable.PropertyChangeData) { var index = this.selectedIndex; if (types.isUndefined(index)) { return; } if (types.isDefined(this.items)) { if (index < 0 || index >= this.items.length) { this.selectedIndex = undefined; throw new Error("SelectedIndex should be between [0, items.length)"); } } } get _selectedView(): view.View { var _items = this.items; var _selectedIndex = this.selectedIndex; if (!_items) { return undefined; } if (_items.length === 0) { return undefined; } if (_selectedIndex === undefined) { return undefined; } return _items[_selectedIndex].view; } get _childrenCount(): number { if (this.items) { return this.items.length; } return 0; } public _eachChildView(callback: (child: view.View) => boolean) { var _items = this.items; if (!_items) { return; } var i; var length = _items.length; var item: definition.TabViewItem; var retVal: boolean; for (i = 0; i < length; i++) { item = _items[i]; if (item.view) { retVal = callback(item.view); if (retVal === false) { break; } } } } }