UNPKG

tns-core-modules

Version:

Telerik NativeScript Core Modules

192 lines (191 loc) • 8.12 kB
var proxy = require("ui/core/proxy"); var dependencyObservable = require("ui/core/dependency-observable"); var viewModule = require("ui/core/view"); var layoutBaseModule = require("ui/layouts/layout-base"); var utils = require("utils/utils"); var trace = require("trace"); var platform = require("platform"); var stackLayout = require("ui/layouts/stack-layout"); var types = require("utils/types"); var builder = require("ui/builder"); var observableArray = require("data/observable-array"); var weakEvents = require("ui/core/weak-event-listener"); var label; function ensureLabel() { if (!label) { label = require("ui/label"); } } var ITEMS = "items"; var ITEMTEMPLATE = "itemTemplate"; var LAYOUT = "layout"; var REPEATER = "Repeater"; var knownTemplates; (function (knownTemplates) { knownTemplates.itemTemplate = "itemTemplate"; })(knownTemplates = exports.knownTemplates || (exports.knownTemplates = {})); function onItemsPropertyChanged(data) { var repeater = data.object; repeater._onItemsPropertyChanged(data); } function onItemTemplatePropertyChanged(data) { var repeater = data.object; repeater._onItemTemplatePropertyChanged(data); } function onItemsLayoutPropertyPropertyChanged(data) { var repeater = data.object; repeater._onItemsLayoutPropertyPropertyChanged(data); } var Repeater = (function (_super) { __extends(Repeater, _super); function Repeater() { _super.call(this); this._isDirty = false; if (platform.device.os === platform.platformNames.ios) { this._ios = UIView.new(); } this.itemsLayout = new stackLayout.StackLayout(); } Object.defineProperty(Repeater.prototype, "items", { get: function () { return this._getValue(Repeater.itemsProperty); }, set: function (value) { this._setValue(Repeater.itemsProperty, value); }, enumerable: true, configurable: true }); Object.defineProperty(Repeater.prototype, "itemTemplate", { get: function () { return this._getValue(Repeater.itemTemplateProperty); }, set: function (value) { this._setValue(Repeater.itemTemplateProperty, value); }, enumerable: true, configurable: true }); Object.defineProperty(Repeater.prototype, "itemsLayout", { get: function () { return this._getValue(Repeater.itemsLayoutProperty); }, set: function (value) { this._setValue(Repeater.itemsLayoutProperty, value); }, enumerable: true, configurable: true }); Repeater.prototype.onLoaded = function () { trace.write("Repeater.onLoaded()", "Repeater"); if (this._isDirty) { this.refresh(); } _super.prototype.onLoaded.call(this); }; Repeater.prototype._requestRefresh = function () { trace.write("Repeater._requestRefresh()", "Repeater"); this._isDirty = true; if (this.isLoaded) { this.refresh(); } }; Repeater.prototype.refresh = function () { trace.write("Repeater.refresh()", "Repeater"); if (this.itemsLayout) { this.itemsLayout.removeChildren(); } if (types.isNullOrUndefined(this.items) || !types.isNumber(this.items.length)) { return; } var length = this.items.length; for (var i = 0; i < length; i++) { var viewToAdd = !types.isNullOrUndefined(this.itemTemplate) ? builder.parse(this.itemTemplate, this) : this._getDefaultItemContent(i); var dataItem = this._getDataItem(i); viewToAdd.bindingContext = dataItem; this.itemsLayout.addChild(viewToAdd); } this._isDirty = false; }; Repeater.prototype._onItemsPropertyChanged = function (data) { trace.write("Repeater._onItemsPropertyChanged(" + data.oldValue + " => " + data.newValue + ")", "Repeater"); if (data.oldValue instanceof observableArray.ObservableArray) { weakEvents.removeWeakEventListener(data.oldValue, observableArray.ObservableArray.changeEvent, this._onItemsChanged, this); } if (data.newValue instanceof observableArray.ObservableArray) { weakEvents.addWeakEventListener(data.newValue, observableArray.ObservableArray.changeEvent, this._onItemsChanged, this); } this._requestRefresh(); }; Repeater.prototype._onItemTemplatePropertyChanged = function (data) { trace.write("Repeater._onItemTemplatePropertyChanged(" + data.oldValue + " => " + data.newValue + ")", "Repeater"); this._requestRefresh(); }; Repeater.prototype._onItemsLayoutPropertyPropertyChanged = function (data) { trace.write("Repeater._onItemsLayoutPropertyPropertyChanged(" + data.oldValue + " => " + data.newValue + ")", "Repeater"); if (data.oldValue instanceof layoutBaseModule.LayoutBase) { this._removeView(data.oldValue); } if (data.newValue instanceof layoutBaseModule.LayoutBase) { this._addView(data.newValue); } this._requestRefresh(); }; Repeater.prototype._onItemsChanged = function (data) { trace.write("Repeater._onItemsChanged(" + data + ")", "Repeater"); this._requestRefresh(); }; Repeater.prototype._getDefaultItemContent = function (index) { ensureLabel(); var lbl = new label.Label(); lbl.bind({ targetProperty: "text", sourceProperty: "$value" }); return lbl; }; Repeater.prototype._getDataItem = function (index) { return this.items.getItem ? this.items.getItem(index) : this.items[index]; }; Object.defineProperty(Repeater.prototype, "ios", { get: function () { return this._ios; }, enumerable: true, configurable: true }); Object.defineProperty(Repeater.prototype, "_childrenCount", { get: function () { var count = 0; if (this.itemsLayout) { count++; } return count; }, enumerable: true, configurable: true }); Repeater.prototype._eachChildView = function (callback) { if (this.itemsLayout) { callback(this.itemsLayout); } }; Repeater.prototype.onLayout = function (left, top, right, bottom) { viewModule.View.layoutChild(this, this.itemsLayout, 0, 0, right - left, bottom - top); }; Repeater.prototype.onMeasure = function (widthMeasureSpec, heightMeasureSpec) { var result = viewModule.View.measureChild(this, this.itemsLayout, widthMeasureSpec, heightMeasureSpec); var width = utils.layout.getMeasureSpecSize(widthMeasureSpec); var widthMode = utils.layout.getMeasureSpecMode(widthMeasureSpec); var height = utils.layout.getMeasureSpecSize(heightMeasureSpec); var heightMode = utils.layout.getMeasureSpecMode(heightMeasureSpec); var widthAndState = viewModule.View.resolveSizeAndState(result.measuredWidth, width, widthMode, 0); var heightAndState = viewModule.View.resolveSizeAndState(result.measuredHeight, height, heightMode, 0); this.setMeasuredDimension(widthAndState, heightAndState); }; Repeater.itemsProperty = new dependencyObservable.Property(ITEMS, REPEATER, new proxy.PropertyMetadata(undefined, dependencyObservable.PropertyMetadataSettings.AffectsLayout, onItemsPropertyChanged)); Repeater.itemTemplateProperty = new dependencyObservable.Property(ITEMTEMPLATE, REPEATER, new proxy.PropertyMetadata(undefined, dependencyObservable.PropertyMetadataSettings.AffectsLayout, onItemTemplatePropertyChanged)); Repeater.itemsLayoutProperty = new dependencyObservable.Property(LAYOUT, REPEATER, new proxy.PropertyMetadata(undefined, dependencyObservable.PropertyMetadataSettings.AffectsLayout, onItemsLayoutPropertyPropertyChanged)); return Repeater; }(viewModule.CustomLayoutView)); exports.Repeater = Repeater;