import { LayoutBase as LayoutBaseDefinition } from './layout-base'; import { CoreTypes } from '../../core-types'; import { View, CustomLayoutView, AddChildFromBuilder } from '../core/view'; import { booleanConverter, getViewById } from '../core/view-base'; import { Property } from '../core/properties'; export class LayoutBaseCommon extends CustomLayoutView implements LayoutBaseDefinition, AddChildFromBuilder { private _subViews = new Array(); public _addChildFromBuilder(name: string, value: any) { if (value instanceof View) { this.addChild(value); } } getChildrenCount(): number { return this._subViews.length; } // overrides the base property. get _childrenCount(): number { return this._subViews.length; } getChildAt(index: number): View { return this._subViews[index]; } getChildIndex(child: View): number { return this._subViews.indexOf(child); } public getChildById(id: string) { return getViewById(this, id); } public _registerLayoutChild(child: View) { //Overridden } public _unregisterLayoutChild(child: View) { //Overridden } public addChild(child: View): void { // TODO: Do we need this method since we have the core logic in the View implementation? this._subViews.push(child); this._addView(child); this._registerLayoutChild(child); } public insertChild(child: View, atIndex: number): void { this._subViews.splice(atIndex, 0, child); this._addView(child, atIndex); this._registerLayoutChild(child); } public removeChild(child: View): void { this._removeView(child); // TODO: consider caching the index on the child. const index = this._subViews.indexOf(child); this._subViews.splice(index, 1); this._unregisterLayoutChild(child); } public removeChildren(): void { while (this.getChildrenCount() !== 0) { this.removeChild(this._subViews[this.getChildrenCount() - 1]); } } get padding(): string | CoreTypes.LengthType { return this.style.padding; } set padding(value: string | CoreTypes.LengthType) { this.style.padding = value; } get paddingTop(): CoreTypes.LengthType { return this.style.paddingTop; } set paddingTop(value: CoreTypes.LengthType) { this.style.paddingTop = value; } get paddingRight(): CoreTypes.LengthType { return this.style.paddingRight; } set paddingRight(value: CoreTypes.LengthType) { this.style.paddingRight = value; } get paddingBottom(): CoreTypes.LengthType { return this.style.paddingBottom; } set paddingBottom(value: CoreTypes.LengthType) { this.style.paddingBottom = value; } get paddingLeft(): CoreTypes.LengthType { return this.style.paddingLeft; } set paddingLeft(value: CoreTypes.LengthType) { this.style.paddingLeft = value; } public clipToBounds: boolean; public isPassThroughParentEnabled: boolean; public _childIndexToNativeChildIndex(index?: number): number { if (index === undefined) { return undefined; } let result = 0; for (let i = 0; i < index && i < this._subViews.length; i++) { result += this._subViews[i]._getNativeViewsCount(); } return result; } public eachChildView(callback: (child: View) => boolean): void { for (let i = 0, length = this._subViews.length; i < length; i++) { const retVal = callback(this._subViews[i]); if (retVal === false) { break; } } } public eachLayoutChild(callback: (child: View, isLast: boolean) => void): void { let lastChild: View = null; this.eachChildView((cv) => { cv._eachLayoutView((lv) => { if (lastChild && !lastChild.isCollapsed) { callback(lastChild, false); } lastChild = lv; }); return true; }); if (lastChild && !lastChild.isCollapsed) { callback(lastChild, true); } } } export const clipToBoundsProperty = new Property({ name: 'clipToBounds', defaultValue: true, valueConverter: booleanConverter, }); clipToBoundsProperty.register(LayoutBaseCommon); export const isPassThroughParentEnabledProperty = new Property({ name: 'isPassThroughParentEnabled', defaultValue: false, valueConverter: booleanConverter, }); isPassThroughParentEnabledProperty.register(LayoutBaseCommon);