tns-core-modules
Version:
Telerik NativeScript Core Modules
505 lines (504 loc) • 22.2 kB
JavaScript
var viewCommon = require("./view-common");
var trace = require("trace");
var utils = require("utils/utils");
var types = require("utils/types");
var style = require("ui/styling/style");
var enums = require("ui/enums");
var background = require("ui/styling/background");
global.moduleMerge(viewCommon, exports);
var ANDROID = "_android";
var NATIVE_VIEW = "_nativeView";
var VIEW_GROUP = "_viewGroup";
function onAutomationTextPropertyChanged(data) {
var view = data.object;
view._nativeView.setContentDescription(data.newValue);
}
viewCommon.View.automationTextProperty.metadata.onSetNativeValue = onAutomationTextPropertyChanged;
function onIdPropertyChanged(data) {
var view = data.object;
view._nativeView.setTag(data.newValue);
}
viewCommon.View.idProperty.metadata.onSetNativeValue = onIdPropertyChanged;
function onTranslateXPropertyChanged(data) {
var view = data.object;
view._nativeView.setTranslationX(data.newValue * utils.layout.getDisplayDensity());
}
viewCommon.View.translateXProperty.metadata.onSetNativeValue = onTranslateXPropertyChanged;
function onTranslateYPropertyChanged(data) {
var view = data.object;
view._nativeView.setTranslationY(data.newValue * utils.layout.getDisplayDensity());
}
viewCommon.View.translateYProperty.metadata.onSetNativeValue = onTranslateYPropertyChanged;
function onScaleXPropertyChanged(data) {
var view = data.object;
view._nativeView.setScaleX(data.newValue);
}
viewCommon.View.scaleXProperty.metadata.onSetNativeValue = onScaleXPropertyChanged;
function onScaleYPropertyChanged(data) {
var view = data.object;
view._nativeView.setScaleY(data.newValue);
}
viewCommon.View.scaleYProperty.metadata.onSetNativeValue = onScaleYPropertyChanged;
function onOriginXPropertyChanged(data) {
org.nativescript.widgets.OriginPoint.setX(data.object._nativeView, data.newValue);
}
viewCommon.View.originXProperty.metadata.onSetNativeValue = onOriginXPropertyChanged;
function onOriginYPropertyChanged(data) {
org.nativescript.widgets.OriginPoint.setY(data.object._nativeView, data.newValue);
}
viewCommon.View.originYProperty.metadata.onSetNativeValue = onOriginYPropertyChanged;
function onRotatePropertyChanged(data) {
var view = data.object;
view._nativeView.setRotation(data.newValue);
}
viewCommon.View.rotateProperty.metadata.onSetNativeValue = onRotatePropertyChanged;
function onIsEnabledPropertyChanged(data) {
var view = data.object;
view._nativeView.setEnabled(data.newValue);
}
viewCommon.View.isEnabledProperty.metadata.onSetNativeValue = onIsEnabledPropertyChanged;
function onIsUserInteractionEnabledPropertyChanged(data) {
var view = data.object;
view._updateOnTouchListener(data.newValue);
}
viewCommon.View.isUserInteractionEnabledProperty.metadata.onSetNativeValue = onIsUserInteractionEnabledPropertyChanged;
var View = (function (_super) {
__extends(View, _super);
function View() {
_super.apply(this, arguments);
this._disableUserInteractionListener = new android.view.View.OnTouchListener({
onTouch: function (view, event) {
return true;
}
});
}
View.prototype._updateOnTouchListener = function (isUserInteractionEnabled) {
if (!isUserInteractionEnabled) {
this._nativeView.setOnTouchListener(this._disableUserInteractionListener);
return;
}
if (this._gesturesListener) {
this._nativeView.setOnTouchListener(this._gesturesListener);
return;
}
this._nativeView.setOnTouchListener(null);
};
Object.defineProperty(View.prototype, "gesturesListener", {
set: function (value) {
this._gesturesListener = value;
this._updateOnTouchListener(this.isUserInteractionEnabled);
},
enumerable: true,
configurable: true
});
View.prototype.observe = function (type, callback, thisArg) {
_super.prototype.observe.call(this, type, callback, thisArg);
if (this.isLoaded && !this.touchListenerIsSet) {
this.setOnTouchListener();
}
};
View.prototype.onLoaded = function () {
_super.prototype.onLoaded.call(this);
this.setOnTouchListener();
};
View.prototype.onUnloaded = function () {
_super.prototype.onUnloaded.call(this);
if (this._nativeView && this._nativeView.setOnTouchListener) {
this._nativeView.setOnTouchListener(null);
this.touchListenerIsSet = false;
}
};
View.prototype.hasGestureObservers = function () {
return this._gestureObservers && Object.keys(this._gestureObservers).length > 0;
};
View.prototype.setOnTouchListener = function () {
if (this._nativeView && this._nativeView.setOnTouchListener && this.hasGestureObservers()) {
this.touchListenerIsSet = true;
var that = new WeakRef(this);
if (this._nativeView.setClickable) {
this._nativeView.setClickable(true);
}
this._nativeView.setOnTouchListener(new android.view.View.OnTouchListener({
onTouch: function (view, motionEvent) {
var owner = that.get();
if (!owner) {
return false;
}
for (var type in owner._gestureObservers) {
var list = owner._gestureObservers[type];
for (var i = 0; i < list.length; i++) {
list[i].androidOnTouchEvent(motionEvent);
}
}
if (!owner._nativeView || !owner._nativeView.onTouchEvent) {
return false;
}
return owner._nativeView.onTouchEvent(motionEvent);
}
}));
}
};
View.prototype._addViewCore = function (view, atIndex) {
if (this._context) {
view._onAttached(this._context);
}
_super.prototype._addViewCore.call(this, view, atIndex);
};
View.prototype._removeViewCore = function (view) {
_super.prototype._removeViewCore.call(this, view);
if (view._context) {
view._onDetached();
}
};
View.prototype._onAttached = function (context) {
if (!context) {
throw new Error("Expected valid android.content.Context instance.");
}
trace.write("calling _onAttached on view " + this._domId, trace.categories.VisualTreeEvents);
if (this._context === context) {
return;
}
if (this._context) {
this._onDetached(true);
}
this._context = context;
this._onContextChanged();
trace.notifyEvent(this, "_onAttached");
if (this._childrenCount > 0) {
var that = this;
var eachChild = function (child) {
child._onAttached(context);
if (!child._isAddedToNativeVisualTree) {
child._isAddedToNativeVisualTree = that._addViewToNativeVisualTree(child);
}
return true;
};
this._eachChildView(eachChild);
}
};
View.prototype._onDetached = function (force) {
if (this._childrenCount > 0) {
var that = this;
var eachChild = function (child) {
if (child._isAddedToNativeVisualTree) {
that._removeViewFromNativeVisualTree(child);
}
if (child._context) {
child._onDetached(force);
}
return true;
};
this._eachChildView(eachChild);
}
trace.write("calling _onDetached on view " + this._domId, trace.categories.VisualTreeEvents);
this._clearAndroidReference();
this._context = undefined;
trace.notifyEvent(this, "_onDetached");
};
View.prototype._clearAndroidReference = function () {
if (this[NATIVE_VIEW] === this[ANDROID]) {
this[NATIVE_VIEW] = undefined;
}
if (this[VIEW_GROUP] === this[ANDROID]) {
this[VIEW_GROUP] = undefined;
}
this[ANDROID] = undefined;
};
View.prototype._onContextChanged = function () {
trace.write("calling _onContextChanged on view " + this._domId, trace.categories.VisualTreeEvents);
this._createUI();
if (this._nativeView && !(this._nativeView.getLayoutParams() instanceof org.nativescript.widgets.CommonLayoutParams)) {
this._nativeView.setLayoutParams(new org.nativescript.widgets.CommonLayoutParams());
}
utils.copyFrom(this._options, this);
delete this._options;
this._syncNativeProperties();
trace.notifyEvent(this, "_onContextChanged");
};
Object.defineProperty(View.prototype, "_nativeView", {
get: function () {
return this.android;
},
enumerable: true,
configurable: true
});
Object.defineProperty(View.prototype, "isLayoutValid", {
get: function () {
if (this._nativeView) {
return !this._nativeView.isLayoutRequested();
}
return false;
},
enumerable: true,
configurable: true
});
View.prototype.layoutNativeView = function (left, top, right, bottom) {
if (this._nativeView) {
this._nativeView.layout(left, top, right, bottom);
}
};
View.prototype.requestLayout = function () {
_super.prototype.requestLayout.call(this);
if (this._nativeView) {
return this._nativeView.requestLayout();
}
};
View.prototype.measure = function (widthMeasureSpec, heightMeasureSpec) {
_super.prototype.measure.call(this, widthMeasureSpec, heightMeasureSpec);
this.onMeasure(widthMeasureSpec, heightMeasureSpec);
};
View.prototype.layout = function (left, top, right, bottom) {
_super.prototype.layout.call(this, left, top, right, bottom);
this.onLayout(left, top, right, bottom);
};
View.prototype.onMeasure = function (widthMeasureSpec, heightMeasureSpec) {
var view = this._nativeView;
if (view) {
view.measure(widthMeasureSpec, heightMeasureSpec);
this.setMeasuredDimension(view.getMeasuredWidth(), view.getMeasuredHeight());
}
};
View.prototype.onLayout = function (left, top, right, bottom) {
var view = this._nativeView;
if (view) {
this.layoutNativeView(left, top, right, bottom);
}
};
View.prototype._getCurrentLayoutBounds = function () {
if (this._nativeView) {
return {
left: this._nativeView.getLeft(),
top: this._nativeView.getTop(),
right: this._nativeView.getRight(),
bottom: this._nativeView.getBottom()
};
}
return _super.prototype._getCurrentLayoutBounds.call(this);
};
View.prototype.getMeasuredWidth = function () {
if (this._nativeView) {
return this._nativeView.getMeasuredWidth();
}
return _super.prototype.getMeasuredWidth.call(this);
};
View.prototype.getMeasuredHeight = function () {
if (this._nativeView) {
return this._nativeView.getMeasuredHeight();
}
return _super.prototype.getMeasuredHeight.call(this);
};
View.prototype.focus = function () {
if (this._nativeView) {
return this._nativeView.requestFocus();
}
return false;
};
View.resolveSizeAndState = function (size, specSize, specMode, childMeasuredState) {
var result = size;
switch (specMode) {
case utils.layout.UNSPECIFIED:
result = size;
break;
case utils.layout.AT_MOST:
if (specSize < size) {
result = specSize | utils.layout.MEASURED_STATE_TOO_SMALL;
}
break;
case utils.layout.EXACTLY:
result = specSize;
break;
}
return result | (childMeasuredState & utils.layout.MEASURED_STATE_MASK);
};
return View;
}(viewCommon.View));
exports.View = View;
var CustomLayoutView = (function (_super) {
__extends(CustomLayoutView, _super);
function CustomLayoutView() {
_super.apply(this, arguments);
}
Object.defineProperty(CustomLayoutView.prototype, "android", {
get: function () {
return this._viewGroup;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CustomLayoutView.prototype, "_nativeView", {
get: function () {
return this._viewGroup;
},
enumerable: true,
configurable: true
});
CustomLayoutView.prototype._createUI = function () {
this._viewGroup = new org.nativescript.widgets.ContentLayout(this._context);
};
CustomLayoutView.prototype._addViewToNativeVisualTree = function (child, atIndex) {
_super.prototype._addViewToNativeVisualTree.call(this, child);
if (this._nativeView && child._nativeView) {
if (types.isNullOrUndefined(atIndex) || atIndex >= this._nativeView.getChildCount()) {
this._nativeView.addView(child._nativeView);
}
else {
this._nativeView.addView(child._nativeView, atIndex);
}
return true;
}
return false;
};
CustomLayoutView.prototype._removeViewFromNativeVisualTree = function (child) {
_super.prototype._removeViewFromNativeVisualTree.call(this, child);
if (this._nativeView && child._nativeView) {
this._nativeView.removeView(child._nativeView);
trace.notifyEvent(child, "childInLayoutRemovedFromNativeVisualTree");
}
};
return CustomLayoutView;
}(View));
exports.CustomLayoutView = CustomLayoutView;
var ViewStyler = (function () {
function ViewStyler() {
}
ViewStyler.setBackgroundBorderProperty = function (view, newValue, defaultValue) {
background.ad.onBackgroundOrBorderPropertyChanged(view);
};
ViewStyler.resetBackgroundBorderProperty = function (view, nativeValue) {
background.ad.onBackgroundOrBorderPropertyChanged(view);
};
ViewStyler.setVisibilityProperty = function (view, newValue) {
var androidValue = (newValue === enums.Visibility.visible) ? android.view.View.VISIBLE : android.view.View.GONE;
view._nativeView.setVisibility(androidValue);
};
ViewStyler.resetVisibilityProperty = function (view, nativeValue) {
view._nativeView.setVisibility(android.view.View.VISIBLE);
};
ViewStyler.setOpacityProperty = function (view, newValue) {
view._nativeView.setAlpha(float(newValue));
};
ViewStyler.resetOpacityProperty = function (view, nativeValue) {
view._nativeView.setAlpha(float(1.0));
};
ViewStyler.setMinWidthProperty = function (view, newValue) {
view._nativeView.setMinimumWidth(Math.round(newValue * utils.layout.getDisplayDensity()));
};
ViewStyler.resetMinWidthProperty = function (view, nativeValue) {
view._nativeView.setMinimumWidth(0);
};
ViewStyler.setMinHeightProperty = function (view, newValue) {
view._nativeView.setMinimumHeight(Math.round(newValue * utils.layout.getDisplayDensity()));
};
ViewStyler.resetMinHeightProperty = function (view, nativeValue) {
view._nativeView.setMinimumHeight(0);
};
ViewStyler.getNativeLayoutParams = function (nativeView) {
var lp = nativeView.getLayoutParams();
if (!(lp instanceof org.nativescript.widgets.CommonLayoutParams)) {
lp = new org.nativescript.widgets.CommonLayoutParams();
}
return lp;
};
ViewStyler.setNativeLayoutParamsProperty = function (view, params) {
var nativeView = view._nativeView;
var lp = ViewStyler.getNativeLayoutParams(nativeView);
lp.widthPercent = params.widthPercent;
lp.heightPercent = params.heightPercent;
lp.leftMarginPercent = params.leftMarginPercent;
lp.topMarginPercent = params.topMarginPercent;
lp.rightMarginPercent = params.rightMarginPercent;
lp.bottomMarginPercent = params.bottomMarginPercent;
lp.leftMargin = Math.round(params.leftMargin * utils.layout.getDisplayDensity());
lp.topMargin = Math.round(params.topMargin * utils.layout.getDisplayDensity());
lp.rightMargin = Math.round(params.rightMargin * utils.layout.getDisplayDensity());
lp.bottomMargin = Math.round(params.bottomMargin * utils.layout.getDisplayDensity());
var width = params.width * utils.layout.getDisplayDensity();
var height = params.height * utils.layout.getDisplayDensity();
if (width < 0) {
width = -2;
}
if (height < 0) {
height = -2;
}
var gravity = 0;
switch (params.horizontalAlignment) {
case enums.HorizontalAlignment.left:
gravity |= android.view.Gravity.LEFT;
break;
case enums.HorizontalAlignment.center:
gravity |= android.view.Gravity.CENTER_HORIZONTAL;
break;
case enums.HorizontalAlignment.right:
gravity |= android.view.Gravity.RIGHT;
break;
case enums.HorizontalAlignment.stretch:
gravity |= android.view.Gravity.FILL_HORIZONTAL;
if (width < 0) {
width = -1;
}
break;
default:
throw new Error("Invalid horizontalAlignment value: " + params.horizontalAlignment);
}
switch (params.verticalAlignment) {
case enums.VerticalAlignment.top:
gravity |= android.view.Gravity.TOP;
break;
case enums.VerticalAlignment.center || enums.VerticalAlignment.middle:
gravity |= android.view.Gravity.CENTER_VERTICAL;
break;
case enums.VerticalAlignment.bottom:
gravity |= android.view.Gravity.BOTTOM;
break;
case enums.VerticalAlignment.stretch:
gravity |= android.view.Gravity.FILL_VERTICAL;
if (height < 0) {
height = -1;
}
break;
default:
throw new Error("Invalid verticalAlignment value: " + params.verticalAlignment);
}
lp.gravity = gravity;
lp.width = Math.round(width);
lp.height = Math.round(height);
nativeView.setLayoutParams(lp);
};
ViewStyler.resetNativeLayoutParamsProperty = function (view, nativeValue) {
ViewStyler.setNativeLayoutParamsProperty(view, style.nativeLayoutParamsProperty.metadata.defaultValue);
};
ViewStyler.setPaddingProperty = function (view, newValue) {
var density = utils.layout.getDisplayDensity();
var left = Math.round((newValue.left + view.borderWidth) * density);
var top = Math.round((newValue.top + view.borderWidth) * density);
var right = Math.round((newValue.right + view.borderWidth) * density);
var bottom = Math.round((newValue.bottom + view.borderWidth) * density);
view._nativeView.setPadding(left, top, right, bottom);
};
ViewStyler.resetPaddingProperty = function (view, nativeValue) {
var density = utils.layout.getDisplayDensity();
var left = Math.round((nativeValue.left + view.borderWidth) * density);
var top = Math.round((nativeValue.top + view.borderWidth) * density);
var right = Math.round((nativeValue.right + view.borderWidth) * density);
var bottom = Math.round((nativeValue.bottom + view.borderWidth) * density);
view._nativeView.setPadding(left, top, right, bottom);
};
ViewStyler.registerHandlers = function () {
style.registerHandler(style.visibilityProperty, new style.StylePropertyChangedHandler(ViewStyler.setVisibilityProperty, ViewStyler.resetVisibilityProperty));
style.registerHandler(style.opacityProperty, new style.StylePropertyChangedHandler(ViewStyler.setOpacityProperty, ViewStyler.resetOpacityProperty));
style.registerHandler(style.minWidthProperty, new style.StylePropertyChangedHandler(ViewStyler.setMinWidthProperty, ViewStyler.resetMinWidthProperty));
style.registerHandler(style.minHeightProperty, new style.StylePropertyChangedHandler(ViewStyler.setMinHeightProperty, ViewStyler.resetMinHeightProperty));
var borderHandler = new style.StylePropertyChangedHandler(ViewStyler.setBackgroundBorderProperty, ViewStyler.resetBackgroundBorderProperty);
style.registerHandler(style.backgroundInternalProperty, borderHandler);
style.registerHandler(style.borderWidthProperty, borderHandler);
style.registerHandler(style.borderColorProperty, borderHandler);
style.registerHandler(style.borderRadiusProperty, borderHandler);
style.registerHandler(style.nativeLayoutParamsProperty, new style.StylePropertyChangedHandler(ViewStyler.setNativeLayoutParamsProperty, ViewStyler.resetNativeLayoutParamsProperty));
style.registerHandler(style.nativePaddingsProperty, new style.StylePropertyChangedHandler(ViewStyler.setPaddingProperty, ViewStyler.resetPaddingProperty), "TextBase");
style.registerHandler(style.nativePaddingsProperty, new style.StylePropertyChangedHandler(ViewStyler.setPaddingProperty, ViewStyler.resetPaddingProperty), "Button");
style.registerHandler(style.nativePaddingsProperty, new style.StylePropertyChangedHandler(ViewStyler.setPaddingProperty, ViewStyler.resetPaddingProperty), "LayoutBase");
};
return ViewStyler;
}());
exports.ViewStyler = ViewStyler;
ViewStyler.registerHandlers();