UNPKG

tns-core-modules

Version:

Telerik NativeScript Core Modules

372 lines (371 loc) • 13.4 kB
var common = require("./action-bar-common"); var frame = require("ui/frame"); var types = require("utils/types"); var enums = require("ui/enums"); var application = require("application"); var style = require("ui/styling/style"); var R_ID_HOME = 0x0102002c; var ACTION_ITEM_ID_OFFSET = 1000; global.moduleMerge(common, exports); var trace; function ensureTrace() { if (!trace) { trace = require("trace"); } } var utils; function ensureUtils() { if (!utils) { utils = require("utils/utils"); } } var imageSource; function ensureImageSource() { if (!imageSource) { imageSource = require("image-source"); } } var actionItemIdGenerator = ACTION_ITEM_ID_OFFSET; function generateItemId() { actionItemIdGenerator++; return actionItemIdGenerator; } var ActionItem = (function (_super) { __extends(ActionItem, _super); function ActionItem() { _super.call(this); this._androidPosition = { position: enums.AndroidActionItemPosition.actionBar, systemIcon: undefined }; this._itemId = generateItemId(); } Object.defineProperty(ActionItem.prototype, "android", { get: function () { return this._androidPosition; }, set: function (value) { throw new Error("ActionItem.android is read-only"); }, enumerable: true, configurable: true }); ActionItem.prototype._getItemId = function () { return this._itemId; }; return ActionItem; }(common.ActionItem)); exports.ActionItem = ActionItem; var AndroidActionBarSettings = (function () { function AndroidActionBarSettings(actionBar) { this._iconVisibility = enums.AndroidActionBarIconVisibility.auto; this._actionBar = actionBar; } Object.defineProperty(AndroidActionBarSettings.prototype, "icon", { get: function () { return this._icon; }, set: function (value) { if (value !== this._icon) { this._icon = value; this._actionBar._onIconPropertyChanged(); } }, enumerable: true, configurable: true }); Object.defineProperty(AndroidActionBarSettings.prototype, "iconVisibility", { get: function () { return this._iconVisibility; }, set: function (value) { if (value !== this._iconVisibility) { this._iconVisibility = value; this._actionBar._onIconPropertyChanged(); } }, enumerable: true, configurable: true }); return AndroidActionBarSettings; }()); exports.AndroidActionBarSettings = AndroidActionBarSettings; var NavigationButton = (function (_super) { __extends(NavigationButton, _super); function NavigationButton() { _super.apply(this, arguments); } return NavigationButton; }(ActionItem)); exports.NavigationButton = NavigationButton; var ActionBar = (function (_super) { __extends(ActionBar, _super); function ActionBar() { _super.call(this); this._appResources = application.android.context.getResources(); this._android = new AndroidActionBarSettings(this); } Object.defineProperty(ActionBar.prototype, "android", { get: function () { return this._android; }, set: function (value) { throw new Error("ActionBar.android is read-only"); }, enumerable: true, configurable: true }); Object.defineProperty(ActionBar.prototype, "_nativeView", { get: function () { return this._toolbar; }, enumerable: true, configurable: true }); ActionBar.prototype._createUI = function () { this._toolbar = new android.support.v7.widget.Toolbar(this._context); var owner = this; this._toolbar.setOnMenuItemClickListener(new android.support.v7.widget.Toolbar.OnMenuItemClickListener({ onMenuItemClick: function (item) { var itemId = item.getItemId(); return owner._onAndroidItemSelected(itemId); } })); }; ActionBar.prototype.onLoaded = function () { _super.prototype.onLoaded.call(this); this.update(); }; ActionBar.prototype.update = function () { if (!this._toolbar) { return; } if (!this.page.frame || !this.page.frame._getNavBarVisible(this.page)) { this._toolbar.setVisibility(android.view.View.GONE); return; } this._toolbar.setVisibility(android.view.View.VISIBLE); this._addActionItems(); this._updateTitleAndTitleView(); this._updateIcon(); this._updateNavigationButton(); }; ActionBar.prototype._onAndroidItemSelected = function (itemId) { if (this.navigationButton && itemId === R_ID_HOME) { this.navigationButton._raiseTap(); return true; } var menuItem = undefined; var items = this.actionItems.getItems(); for (var i = 0; i < items.length; i++) { if (items[i]._getItemId() === itemId) { menuItem = items[i]; break; } } if (menuItem) { menuItem._raiseTap(); return true; } return false; }; ActionBar.prototype._updateNavigationButton = function () { var navButton = this.navigationButton; if (navButton && common.isVisible(navButton)) { if (navButton.android.systemIcon) { var systemResourceId = getSystemResourceId(navButton.android.systemIcon); if (systemResourceId) { this._toolbar.setNavigationIcon(systemResourceId); } } else if (navButton.icon) { var drawableOrId = getDrawableOrResourceId(navButton.icon, this._appResources); this._toolbar.setNavigationIcon(drawableOrId); } this._toolbar.setNavigationOnClickListener(new android.view.View.OnClickListener({ onClick: function (v) { if (navButton) { navButton._raiseTap(); } } })); } else { this._toolbar.setNavigationIcon(null); } }; ActionBar.prototype._updateIcon = function () { var visibility = getIconVisibility(this.android.iconVisibility); if (visibility) { var icon = this.android.icon; if (types.isDefined(icon)) { var drawableOrId = getDrawableOrResourceId(icon, this._appResources); if (drawableOrId) { this._toolbar.setLogo(drawableOrId); } } else { var defaultIcon = application.android.nativeApp.getApplicationInfo().icon; this._toolbar.setLogo(defaultIcon); } } else { this._toolbar.setLogo(null); } }; ActionBar.prototype._updateTitleAndTitleView = function () { if (!this.titleView) { var title = this.title; if (types.isDefined(title)) { this._toolbar.setTitle(title); } else { var appContext = application.android.context; var appInfo = appContext.getApplicationInfo(); var appLabel = appContext.getPackageManager().getApplicationLabel(appInfo); if (appLabel) { this._toolbar.setTitle(appLabel); } } } }; ActionBar.prototype._addActionItems = function () { var menu = this._toolbar.getMenu(); var items = this.actionItems.getVisibleItems(); menu.clear(); for (var i = 0; i < items.length; i++) { var item = items[i]; var menuItem = menu.add(android.view.Menu.NONE, item._getItemId(), android.view.Menu.NONE, item.text + ""); if (item.actionView && item.actionView.android) { item.android.position = enums.AndroidActionItemPosition.actionBar; menuItem.setActionView(item.actionView.android); menuItem.getActionView().setOnClickListener(new android.view.View.OnClickListener({ onClick: function () { item._raiseTap(); } })); } else if (item.android.systemIcon) { var systemResourceId = getSystemResourceId(item.android.systemIcon); if (systemResourceId) { menuItem.setIcon(systemResourceId); } } else if (item.icon) { var drawableOrId = getDrawableOrResourceId(item.icon, this._appResources); if (drawableOrId) { menuItem.setIcon(drawableOrId); } else { throw new Error("Error loading icon from " + item.icon); } } var showAsAction = getShowAsAction(item); menuItem.setShowAsAction(showAsAction); } }; ActionBar.prototype._onTitlePropertyChanged = function () { var topFrame = frame.topmost(); if (this._toolbar && topFrame && topFrame.currentPage === this.page) { this._updateTitleAndTitleView(); } }; ActionBar.prototype._onIconPropertyChanged = function () { var topFrame = frame.topmost(); if (this._toolbar && topFrame && topFrame.currentPage === this.page) { this._updateIcon(); } }; ActionBar.prototype._clearAndroidReference = function () { this._toolbar = undefined; }; ActionBar.prototype._addViewToNativeVisualTree = function (child, atIndex) { _super.prototype._addViewToNativeVisualTree.call(this, child); if (this._toolbar && child._nativeView) { if (types.isNullOrUndefined(atIndex) || atIndex >= this._nativeView.getChildCount()) { this._toolbar.addView(child._nativeView); } else { this._toolbar.addView(child._nativeView, atIndex); } return true; } return false; }; ActionBar.prototype._removeViewFromNativeVisualTree = function (child) { _super.prototype._removeViewFromNativeVisualTree.call(this, child); if (this._toolbar && child._nativeView) { this._toolbar.removeView(child._nativeView); ensureTrace(); trace.notifyEvent(child, "childInLayoutRemovedFromNativeVisualTree"); } }; return ActionBar; }(common.ActionBar)); exports.ActionBar = ActionBar; function getDrawableOrResourceId(icon, resources) { if (!types.isString(icon)) { return undefined; } ensureUtils(); if (icon.indexOf(utils.RESOURCE_PREFIX) === 0) { var resourceId = resources.getIdentifier(icon.substr(utils.RESOURCE_PREFIX.length), 'drawable', application.android.packageName); if (resourceId > 0) { return resourceId; } } else { var drawable; ensureImageSource(); var is = imageSource.fromFileOrResource(icon); if (is) { drawable = new android.graphics.drawable.BitmapDrawable(is.android); } return drawable; } return undefined; } function getShowAsAction(menuItem) { switch (menuItem.android.position) { case enums.AndroidActionItemPosition.actionBarIfRoom: return android.view.MenuItem.SHOW_AS_ACTION_IF_ROOM; case enums.AndroidActionItemPosition.popup: return android.view.MenuItem.SHOW_AS_ACTION_NEVER; case enums.AndroidActionItemPosition.actionBar: default: return android.view.MenuItem.SHOW_AS_ACTION_ALWAYS; } } function getIconVisibility(iconVisibility) { switch (iconVisibility) { case enums.AndroidActionBarIconVisibility.always: return true; case enums.AndroidActionBarIconVisibility.auto: case enums.AndroidActionBarIconVisibility.never: default: return false; } } function getSystemResourceId(systemIcon) { return android.content.res.Resources.getSystem().getIdentifier(systemIcon, "drawable", "android"); } var ActionBarStyler = (function () { function ActionBarStyler() { } ActionBarStyler.setColorProperty = function (v, newValue) { var toolbar = v._nativeView; toolbar.setTitleTextColor(newValue); }; ActionBarStyler.resetColorProperty = function (v, nativeValue) { if (types.isNullOrUndefined(nativeValue)) { nativeValue = android.graphics.Color.BLACK; } v._nativeView.setTitleTextColor(nativeValue); }; ActionBarStyler.registerHandlers = function () { style.registerHandler(style.colorProperty, new style.StylePropertyChangedHandler(ActionBarStyler.setColorProperty, ActionBarStyler.resetColorProperty), "ActionBar"); }; return ActionBarStyler; }()); exports.ActionBarStyler = ActionBarStyler; ActionBarStyler.registerHandlers();