tns-core-modules
Version:
Telerik NativeScript Core Modules
367 lines (366 loc) • 15.6 kB
JavaScript
var common = require("./tab-view-common");
var trace = require("trace");
var types = require("utils/types");
var utils = require("utils/utils");
var color = require("color");
var style = require("ui/styling/style");
var imageSource;
function ensureImageSource() {
if (!imageSource) {
imageSource = require("image-source");
}
}
var VIEWS_STATES = "_viewStates";
var ACCENT_COLOR = "colorAccent";
var PRIMARY_COLOR = "colorPrimary";
var DEFAULT_ELEVATION = 4;
global.moduleMerge(common, exports);
var TabViewItem = (function (_super) {
__extends(TabViewItem, _super);
function TabViewItem() {
_super.apply(this, arguments);
}
TabViewItem.prototype._update = function () {
if (this._parent) {
this._parent._updateTabForItem(this);
}
};
return TabViewItem;
}(common.TabViewItem));
exports.TabViewItem = TabViewItem;
var PagerAdapterClass;
function ensurePagerAdapterClass() {
if (PagerAdapterClass) {
return;
}
var PagerAdapterClassInner = (function (_super) {
__extends(PagerAdapterClassInner, _super);
function PagerAdapterClassInner(owner, items) {
_super.call(this);
this.owner = owner;
this.items = items;
return global.__native(this);
}
PagerAdapterClassInner.prototype.getCount = function () {
return this.items ? this.items.length : 0;
};
PagerAdapterClassInner.prototype.getPageTitle = function (index) {
if (index < 0 || index >= this.items.length) {
return "";
}
return this.items[index].title;
};
PagerAdapterClassInner.prototype.instantiateItem = function (container, index) {
trace.write("TabView.PagerAdapter.instantiateItem; container: " + container + "; index: " + index, common.traceCategory);
var item = this.items[index];
if (item.view.parent !== this.owner) {
this.owner._addView(item.view);
}
if (this[VIEWS_STATES]) {
trace.write("TabView.PagerAdapter.instantiateItem; restoreHierarchyState: " + item.view, common.traceCategory);
item.view._nativeView.restoreHierarchyState(this[VIEWS_STATES]);
}
container.addView(item.view._nativeView);
return item.view._nativeView;
};
PagerAdapterClassInner.prototype.destroyItem = function (container, index, _object) {
trace.write("TabView.PagerAdapter.destroyItem; container: " + container + "; index: " + index + "; _object: " + _object, common.traceCategory);
var item = this.items[index];
var nativeView = item.view._nativeView;
if (nativeView.toString() !== _object.toString()) {
throw new Error("Expected " + nativeView.toString() + " to equal " + _object.toString());
}
if (!this[VIEWS_STATES]) {
this[VIEWS_STATES] = new android.util.SparseArray();
}
nativeView.saveHierarchyState(this[VIEWS_STATES]);
container.removeView(nativeView);
if (item.view.parent === this.owner) {
this.owner._removeView(item.view);
}
};
PagerAdapterClassInner.prototype.isViewFromObject = function (view, _object) {
return view === _object;
};
PagerAdapterClassInner.prototype.saveState = function () {
trace.write("TabView.PagerAdapter.saveState", common.traceCategory);
var owner = this.owner;
if (!owner || owner._childrenCount === 0) {
return null;
}
if (!this[VIEWS_STATES]) {
this[VIEWS_STATES] = new android.util.SparseArray();
}
var viewStates = this[VIEWS_STATES];
var childCallback = function (view) {
var nativeView = view._nativeView;
if (nativeView && nativeView.isSaveFromParentEnabled && nativeView.isSaveFromParentEnabled()) {
nativeView.saveHierarchyState(viewStates);
}
return true;
};
owner._eachChildView(childCallback);
var bundle = new android.os.Bundle();
bundle.putSparseParcelableArray(VIEWS_STATES, viewStates);
return bundle;
};
PagerAdapterClassInner.prototype.restoreState = function (state, loader) {
trace.write("TabView.PagerAdapter.restoreState", common.traceCategory);
var bundle = state;
bundle.setClassLoader(loader);
this[VIEWS_STATES] = bundle.getSparseParcelableArray(VIEWS_STATES);
};
return PagerAdapterClassInner;
}(android.support.v4.view.PagerAdapter));
;
PagerAdapterClass = PagerAdapterClassInner;
}
var PageChangedListenerClass;
function ensurePageChangedListenerClass() {
if (PageChangedListenerClass) {
return;
}
var PageChangedListener = (function (_super) {
__extends(PageChangedListener, _super);
function PageChangedListener(owner) {
_super.call(this);
this._owner = owner;
return global.__native(this);
}
PageChangedListener.prototype.onPageSelected = function (position) {
this._owner.selectedIndex = position;
};
return PageChangedListener;
}(android.support.v4.view.ViewPager.SimpleOnPageChangeListener));
PageChangedListenerClass = PageChangedListener;
}
function selectedColorPropertyChanged(data) {
var tabLayout = data.object._getAndroidTabView();
if (tabLayout && data.newValue instanceof color.Color) {
tabLayout.setSelectedIndicatorColors([data.newValue.android]);
}
}
common.TabView.selectedColorProperty.metadata.onSetNativeValue = selectedColorPropertyChanged;
function tabsBackgroundColorPropertyChanged(data) {
var tabLayout = data.object._getAndroidTabView();
if (tabLayout && data.newValue instanceof color.Color) {
tabLayout.setBackgroundColor(data.newValue.android);
}
}
common.TabView.tabsBackgroundColorProperty.metadata.onSetNativeValue = tabsBackgroundColorPropertyChanged;
var TabView = (function (_super) {
__extends(TabView, _super);
function TabView() {
_super.apply(this, arguments);
this._androidViewId = -1;
}
Object.defineProperty(TabView.prototype, "android", {
get: function () {
return this._grid;
},
enumerable: true,
configurable: true
});
TabView.prototype._createUI = function () {
trace.write("TabView._createUI(" + this + ");", common.traceCategory);
this._grid = new org.nativescript.widgets.GridLayout(this._context);
this._grid.addRow(new org.nativescript.widgets.ItemSpec(1, org.nativescript.widgets.GridUnitType.auto));
this._grid.addRow(new org.nativescript.widgets.ItemSpec(1, org.nativescript.widgets.GridUnitType.star));
this._tabLayout = new org.nativescript.widgets.TabLayout(this._context);
this._grid.addView(this._tabLayout);
this.setElevation();
var accentColor = utils.ad.resources.getPalleteColor(ACCENT_COLOR, this._context);
if (accentColor) {
this._tabLayout.setSelectedIndicatorColors([accentColor]);
}
var primaryColor = utils.ad.resources.getPalleteColor(PRIMARY_COLOR, this._context);
if (primaryColor) {
this._tabLayout.setBackgroundColor(primaryColor);
}
this._viewPager = new android.support.v4.view.ViewPager(this._context);
var lp = new org.nativescript.widgets.CommonLayoutParams();
lp.row = 1;
this._viewPager.setLayoutParams(lp);
this._grid.addView(this._viewPager);
if (this._androidViewId < 0) {
this._androidViewId = android.view.View.generateViewId();
}
this._grid.setId(this._androidViewId);
ensurePageChangedListenerClass();
this._pageChagedListener = new PageChangedListenerClass(this);
this._viewPager.addOnPageChangeListener(this._pageChagedListener);
};
TabView.prototype.setElevation = function () {
var compat = android.support.v4.view.ViewCompat;
if (compat.setElevation) {
var val = DEFAULT_ELEVATION * utils.layout.getDisplayDensity();
compat.setElevation(this._grid, val);
compat.setElevation(this._tabLayout, val);
}
};
TabView.prototype._onItemsPropertyChangedSetNativeValue = function (data) {
var _this = this;
trace.write("TabView._onItemsPropertyChangedSetNativeValue(" + data.oldValue + " ---> " + data.newValue + ");", common.traceCategory);
if (data.oldValue) {
var oldItems = data.oldValue;
oldItems.forEach(function (oldItem) {
oldItem._parent = null;
});
this._viewPager.setAdapter(null);
this._pagerAdapter = null;
this._tabLayout.setItems(null, null);
}
if (data.newValue) {
var items = data.newValue;
var tabItems = new Array();
items.forEach(function (item, idx, arr) {
if (types.isNullOrUndefined(item.view)) {
throw new Error("View of TabViewItem at index " + idx + " is " + item.view);
}
item._parent = _this;
if (item.view.parent !== _this) {
_this._addView(item.view, idx);
}
tabItems.push(_this.createTabItem(item));
});
ensurePagerAdapterClass();
this._pagerAdapter = new PagerAdapterClass(this, data.newValue);
this._viewPager.setAdapter(this._pagerAdapter);
this._tabLayout.setItems(tabItems, this._viewPager);
}
this._updateSelectedIndexOnItemsPropertyChanged(data.newValue);
};
TabView.prototype._updateTabForItem = function (item) {
if (this.items && this.items.length > 0) {
var index = this.items.indexOf(item);
if (index >= 0) {
this._tabLayout.updateItemAt(index, this.createTabItem(item));
}
}
};
TabView.prototype._onSelectedIndexPropertyChangedSetNativeValue = function (data) {
trace.write("TabView._onSelectedIndexPropertyChangedSetNativeValue(" + data.oldValue + " ---> " + data.newValue + ");", common.traceCategory);
_super.prototype._onSelectedIndexPropertyChangedSetNativeValue.call(this, data);
var index = data.newValue;
if (!types.isNullOrUndefined(index)) {
var viewPagerSelectedIndex = this._viewPager.getCurrentItem();
if (viewPagerSelectedIndex !== index) {
trace.write("TabView this._viewPager.setCurrentItem(" + index + ", true);", common.traceCategory);
this._viewPager.setCurrentItem(index, true);
}
}
var args = { eventName: TabView.selectedIndexChangedEvent, object: this, oldIndex: data.oldValue, newIndex: data.newValue };
this.notify(args);
};
TabView.prototype.createTabItem = function (item) {
var result = new org.nativescript.widgets.TabItemSpec();
result.title = item.title;
if (item.iconSource) {
if (item.iconSource.indexOf(utils.RESOURCE_PREFIX) === 0) {
result.iconId = utils.ad.resources.getDrawableId(item.iconSource.substr(utils.RESOURCE_PREFIX.length));
}
else {
ensureImageSource();
var is = imageSource.fromFileOrResource(item.iconSource);
if (is) {
result.iconDrawable = new android.graphics.drawable.BitmapDrawable(is.android);
}
}
}
return result;
};
TabView.prototype._getAndroidTabView = function () {
return this._tabLayout;
};
return TabView;
}(common.TabView));
exports.TabView = TabView;
var TabViewStyler = (function () {
function TabViewStyler() {
}
TabViewStyler.setColorProperty = function (v, newValue) {
var tab = v;
if (tab.items && tab.items.length > 0) {
var tabLayout = tab._getAndroidTabView();
for (var i = 0; i < tab.items.length; i++) {
tabLayout.getTextViewForItemAt(i).setTextColor(newValue);
}
}
};
TabViewStyler.resetColorProperty = function (v, nativeValue) {
if (types.isNullOrUndefined(nativeValue)) {
return;
}
var tab = v;
if (tab.items && tab.items.length > 0) {
var tabLayout = tab._getAndroidTabView();
for (var i = 0; i < tab.items.length; i++) {
tabLayout.getTextViewForItemAt(i).setTextColor(nativeValue);
}
}
};
TabViewStyler.getColorProperty = function (v) {
var tab = v;
var tv = tab._getAndroidTabView().getTextViewForItemAt(0);
if (tv) {
return tv.getTextColors().getDefaultColor();
}
else {
return null;
}
};
TabViewStyler.setFontInternalProperty = function (v, newValue, nativeValue) {
var tab = v;
var fontValue = newValue;
var typeface = fontValue.getAndroidTypeface();
if (tab.items && tab.items.length > 0) {
var tabLayout = tab._getAndroidTabView();
for (var i = 0; i < tab.items.length; i++) {
var tv = tabLayout.getTextViewForItemAt(i);
if (typeface) {
tv.setTypeface(typeface);
}
else {
tv.setTypeface(nativeValue.typeface);
}
if (fontValue.fontSize) {
tv.setTextSize(fontValue.fontSize);
}
else {
tv.setTextSize(android.util.TypedValue.COMPLEX_UNIT_PX, nativeValue.size);
}
}
}
};
TabViewStyler.resetFontInternalProperty = function (v, nativeValue) {
var tab = v;
if (tab.items && tab.items.length > 0) {
var tabLayout = tab._getAndroidTabView();
for (var i = 0; i < tab.items.length; i++) {
var tv = tabLayout.getTextViewForItemAt(i);
tv.setTypeface(nativeValue.typeface);
tv.setTextSize(android.util.TypedValue.COMPLEX_UNIT_PX, nativeValue.size);
}
}
};
TabViewStyler.getNativeFontInternalValue = function (v) {
var tab = v;
var tv = tab._getAndroidTabView().getTextViewForItemAt(0);
if (tv) {
return {
typeface: tv.getTypeface(),
size: tv.getTextSize()
};
}
else {
return null;
}
};
TabViewStyler.registerHandlers = function () {
style.registerHandler(style.colorProperty, new style.StylePropertyChangedHandler(TabViewStyler.setColorProperty, TabViewStyler.resetColorProperty, TabViewStyler.getColorProperty), "TabView");
style.registerHandler(style.fontInternalProperty, new style.StylePropertyChangedHandler(TabViewStyler.setFontInternalProperty, TabViewStyler.resetFontInternalProperty, TabViewStyler.getNativeFontInternalValue), "TabView");
};
return TabViewStyler;
}());
exports.TabViewStyler = TabViewStyler;
TabViewStyler.registerHandlers();