UNPKG

tns-core-modules

Version:

Telerik NativeScript Core Modules

308 lines (307 loc) • 12.2 kB
var common = require("./list-view-common"); var utils = require("utils/utils"); var view = require("ui/core/view"); var stack_layout_1 = require("ui/layouts/stack-layout"); var proxy_view_container_1 = require("ui/proxy-view-container"); var color; function ensureColor() { if (!color) { color = require("color"); } } var CELLIDENTIFIER = "cell"; var ITEMLOADING = common.ListView.itemLoadingEvent; var LOADMOREITEMS = common.ListView.loadMoreItemsEvent; var ITEMTAP = common.ListView.itemTapEvent; var DEFAULT_HEIGHT = 44; global.moduleMerge(common, exports); var infinity = utils.layout.makeMeasureSpec(0, utils.layout.UNSPECIFIED); var ListViewCell = (function (_super) { __extends(ListViewCell, _super); function ListViewCell() { _super.apply(this, arguments); } ListViewCell.prototype.willMoveToSuperview = function (newSuperview) { var parent = (this.view ? this.view.parent : null); if (parent && !newSuperview) { parent._removeContainer(this); } }; Object.defineProperty(ListViewCell.prototype, "view", { get: function () { return this.owner ? this.owner.get() : null; }, enumerable: true, configurable: true }); return ListViewCell; }(UITableViewCell)); function notifyForItemAtIndex(listView, cell, view, eventName, indexPath) { var args = { eventName: eventName, object: listView, index: indexPath.row, view: view, ios: cell, android: undefined }; listView.notify(args); return args; } var DataSource = (function (_super) { __extends(DataSource, _super); function DataSource() { _super.apply(this, arguments); } DataSource.initWithOwner = function (owner) { var dataSource = DataSource.new(); dataSource._owner = owner; return dataSource; }; DataSource.prototype.tableViewNumberOfRowsInSection = function (tableView, section) { var owner = this._owner.get(); return (owner && owner.items) ? owner.items.length : 0; }; DataSource.prototype.tableViewCellForRowAtIndexPath = function (tableView, indexPath) { var cell = (tableView.dequeueReusableCellWithIdentifier(CELLIDENTIFIER) || ListViewCell.new()); var owner = this._owner.get(); if (owner) { owner._prepareCell(cell, indexPath); var cellView = cell.view; if (cellView) { var width = utils.layout.getMeasureSpecSize(owner.widthMeasureSpec); var rowHeight = owner._nativeView.rowHeight; var cellHeight = rowHeight > 0 ? rowHeight : owner.getHeight(indexPath.row); view.View.layoutChild(owner, cellView, 0, 0, width, cellHeight); } } return cell; }; DataSource.ObjCProtocols = [UITableViewDataSource]; return DataSource; }(NSObject)); var UITableViewDelegateImpl = (function (_super) { __extends(UITableViewDelegateImpl, _super); function UITableViewDelegateImpl() { _super.apply(this, arguments); } UITableViewDelegateImpl.initWithOwner = function (owner) { var delegate = UITableViewDelegateImpl.new(); delegate._owner = owner; return delegate; }; UITableViewDelegateImpl.prototype.tableViewWillDisplayCellForRowAtIndexPath = function (tableView, cell, indexPath) { var owner = this._owner.get(); if (owner && (indexPath.row === owner.items.length - 1)) { owner.notify({ eventName: LOADMOREITEMS, object: owner }); } }; UITableViewDelegateImpl.prototype.tableViewWillSelectRowAtIndexPath = function (tableView, indexPath) { var cell = tableView.cellForRowAtIndexPath(indexPath); var owner = this._owner.get(); if (owner) { notifyForItemAtIndex(owner, cell, cell.view, ITEMTAP, indexPath); } return indexPath; }; UITableViewDelegateImpl.prototype.tableViewDidSelectRowAtIndexPath = function (tableView, indexPath) { tableView.deselectRowAtIndexPathAnimated(indexPath, true); return indexPath; }; UITableViewDelegateImpl.prototype.tableViewHeightForRowAtIndexPath = function (tableView, indexPath) { var owner = this._owner.get(); if (!owner) { return 44; } var height = undefined; if (utils.ios.MajorVersion >= 8) { height = owner.getHeight(indexPath.row); } if (utils.ios.MajorVersion < 8 || height === undefined) { var cell = this._measureCell; if (!cell) { this._measureCell = tableView.dequeueReusableCellWithIdentifier(CELLIDENTIFIER) || ListViewCell.new(); cell = this._measureCell; } height = owner._prepareCell(cell, indexPath); } return height; }; UITableViewDelegateImpl.ObjCProtocols = [UITableViewDelegate]; return UITableViewDelegateImpl; }(NSObject)); var UITableViewRowHeightDelegateImpl = (function (_super) { __extends(UITableViewRowHeightDelegateImpl, _super); function UITableViewRowHeightDelegateImpl() { _super.apply(this, arguments); } UITableViewRowHeightDelegateImpl.initWithOwner = function (owner) { var delegate = UITableViewRowHeightDelegateImpl.new(); delegate._owner = owner; return delegate; }; UITableViewRowHeightDelegateImpl.prototype.tableViewWillDisplayCellForRowAtIndexPath = function (tableView, cell, indexPath) { var owner = this._owner.get(); if (owner && (indexPath.row === owner.items.length - 1)) { owner.notify({ eventName: LOADMOREITEMS, object: owner }); } }; UITableViewRowHeightDelegateImpl.prototype.tableViewWillSelectRowAtIndexPath = function (tableView, indexPath) { var cell = tableView.cellForRowAtIndexPath(indexPath); var owner = this._owner.get(); if (owner) { notifyForItemAtIndex(owner, cell, cell.view, ITEMTAP, indexPath); } return indexPath; }; UITableViewRowHeightDelegateImpl.prototype.tableViewHeightForRowAtIndexPath = function (tableView, indexPath) { var owner = this._owner.get(); if (!owner) { return DEFAULT_HEIGHT; } return owner.rowHeight; }; UITableViewRowHeightDelegateImpl.ObjCProtocols = [UITableViewDelegate]; return UITableViewRowHeightDelegateImpl; }(NSObject)); function onSeparatorColorPropertyChanged(data) { var bar = data.object; if (!bar.ios) { return; } ensureColor(); if (data.newValue instanceof color.Color) { bar.ios.separatorColor = data.newValue.ios; } } common.ListView.separatorColorProperty.metadata.onSetNativeValue = onSeparatorColorPropertyChanged; var ListView = (function (_super) { __extends(ListView, _super); function ListView() { _super.call(this); this._preparingCell = false; this._isDataDirty = false; this.widthMeasureSpec = 0; this._ios = new UITableView(); this._ios.registerClassForCellReuseIdentifier(ListViewCell.class(), CELLIDENTIFIER); this._ios.autoresizingMask = UIViewAutoresizing.UIViewAutoresizingNone; this._ios.estimatedRowHeight = DEFAULT_HEIGHT; this._ios.rowHeight = UITableViewAutomaticDimension; this._ios.dataSource = this._dataSource = DataSource.initWithOwner(new WeakRef(this)); this._delegate = UITableViewDelegateImpl.initWithOwner(new WeakRef(this)); this._heights = new Array(); this._map = new Map(); } ListView.prototype.onLoaded = function () { _super.prototype.onLoaded.call(this); if (this._isDataDirty) { this.refresh(); } this._ios.delegate = this._delegate; }; ListView.prototype.onUnloaded = function () { this._ios.delegate = null; _super.prototype.onUnloaded.call(this); }; Object.defineProperty(ListView.prototype, "ios", { get: function () { return this._ios; }, enumerable: true, configurable: true }); ListView.prototype.scrollToIndex = function (index) { if (this._ios) { this._ios.scrollToRowAtIndexPathAtScrollPositionAnimated(NSIndexPath.indexPathForItemInSection(index, 0), UITableViewScrollPosition.UITableViewScrollPositionTop, false); } }; ListView.prototype.refresh = function () { if (this.isLoaded) { this._ios.reloadData(); this.requestLayout(); this._isDataDirty = false; } else { this._isDataDirty = true; } }; ListView.prototype.getHeight = function (index) { return this._heights[index]; }; ListView.prototype.setHeight = function (index, value) { this._heights[index] = value; }; ListView.prototype._onRowHeightPropertyChanged = function (data) { if (data.newValue < 0) { this._nativeView.rowHeight = UITableViewAutomaticDimension; this._nativeView.estimatedRowHeight = DEFAULT_HEIGHT; this._delegate = UITableViewDelegateImpl.initWithOwner(new WeakRef(this)); } else { this._nativeView.rowHeight = data.newValue; this._nativeView.estimatedRowHeight = data.newValue; this._delegate = UITableViewRowHeightDelegateImpl.initWithOwner(new WeakRef(this)); } if (this.isLoaded) { this._nativeView.delegate = this._delegate; } _super.prototype._onRowHeightPropertyChanged.call(this, data); }; ListView.prototype.requestLayout = function () { if (!this._preparingCell) { _super.prototype.requestLayout.call(this); } }; ListView.prototype.measure = function (widthMeasureSpec, heightMeasureSpec) { this.widthMeasureSpec = widthMeasureSpec; var changed = this._setCurrentMeasureSpecs(widthMeasureSpec, heightMeasureSpec); _super.prototype.measure.call(this, widthMeasureSpec, heightMeasureSpec); if (changed) { this._ios.reloadData(); } }; ListView.prototype._layoutCell = function (cellView, indexPath) { if (cellView) { var measuredSize = view.View.measureChild(this, cellView, this.widthMeasureSpec, infinity); var height = measuredSize.measuredHeight; this.setHeight(indexPath.row, height); return height; } return 0; }; ListView.prototype._prepareCell = function (cell, indexPath) { var cellHeight; try { this._preparingCell = true; var view_1 = cell.view; if (!view_1) { view_1 = this._getItemTemplateContent(indexPath.row); } var args = notifyForItemAtIndex(this, cell, view_1, ITEMLOADING, indexPath); view_1 = args.view || this._getDefaultItemContent(indexPath.row); if (view_1 instanceof proxy_view_container_1.ProxyViewContainer) { var sp = new stack_layout_1.StackLayout(); sp.addChild(view_1); view_1 = sp; } if (!cell.view) { cell.owner = new WeakRef(view_1); } else if (cell.view !== view_1) { this._removeContainer(cell); cell.view._nativeView.removeFromSuperview(); cell.owner = new WeakRef(view_1); } this._prepareItem(view_1, indexPath.row); this._map.set(cell, view_1); if (view_1 && !view_1.parent && view_1._nativeView) { cell.contentView.addSubview(view_1._nativeView); this._addView(view_1); } cellHeight = this._layoutCell(view_1, indexPath); } finally { this._preparingCell = false; } return cellHeight; }; ListView.prototype._removeContainer = function (cell) { this._removeView(cell.view); this._map.delete(cell); }; return ListView; }(common.ListView)); exports.ListView = ListView;