UNPKG

ovuse

Version:

WPF-inspired Web UI framework

188 lines (187 loc) 8.86 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const _1 = require("."); const _2 = require("."); const utils_1 = require("./utils"); // function getPropertyRegistrationsFromObject(obj: any) : string { // return obj[typeIdKey]; // } // function setPropertiesFromType(type: any) : string { // return type.prototype[typeIdKey]; // } const dpIdKey = "__dpId"; const dpDefaultKey = "__dpDefault"; class DependencyPropertyDefaultValue { constructor(dp, defaultValue) { this.dp = dp; this.defaultValue = defaultValue; } } class DependencyObject { constructor() { this.localPropertyValueMap = {}; this.dpcHandlers = []; this.pcHandlers = []; this.bindings = new Array(); } static finalizePropertyRegistrations(type) { var typeName = _2.getTypeId(type); if (typeName == undefined) throw new Error("Unable to finalize property registrations for type without DependencyObjectId"); var depPropertRegistration = type.prototype[dpIdKey]; if (depPropertRegistration != undefined) { if (DependencyObject.globalPropertyMap[typeName] == undefined) DependencyObject.globalPropertyMap[typeName] = new _1.PropertyMap(); depPropertRegistration.forEach(dpReg => { dpReg.typeName = typeName; DependencyObject.globalPropertyMap[typeName].register(dpReg.name, dpReg); }); type.prototype[dpIdKey] = undefined; } var depPropertyDefaultValue = type.prototype[dpDefaultKey]; if (depPropertyDefaultValue != undefined) { depPropertyDefaultValue.forEach(dpDefaultValue => { dpDefaultValue.dp.overrideDefaultValue(type, dpDefaultValue.defaultValue); }); type.prototype[dpDefaultKey] = undefined; } } static registerPropertyDefaultValue(dependencyProperty, type, defaultValue) { var typeName = _2.getTypeId(type); if (typeName != undefined) throw new Error("Property '{0}' on type '{1}' has already registered a default value".format(dependencyProperty.name, typeName)); var depPropertyDefaultValue = type.prototype[dpDefaultKey]; if (depPropertyDefaultValue == undefined) type.prototype[dpDefaultKey] = depPropertyDefaultValue = new Array(); depPropertyDefaultValue.push(new DependencyPropertyDefaultValue(dependencyProperty, defaultValue)); } ///Register a dependency property for the object static registerProperty(type, name, defaultValue, options, converter) { var typeName = _2.getTypeId(type); if (typeName != undefined) return DependencyObject.registerPropertyByTypeName(typeName, name, defaultValue, options, converter); var depPropertyRegistration = type.prototype[dpIdKey]; if (depPropertyRegistration == undefined) type.prototype[dpIdKey] = depPropertyRegistration = new Array(); var newProperty = new _1.DependencyProperty(name, undefined, defaultValue, options, converter); depPropertyRegistration.push(newProperty); return newProperty; } ///Register a dependency property for the object static registerPropertyByTypeName(typeName, name, defaultValue, options, converter) { if (DependencyObject.globalPropertyMap[typeName] == undefined) DependencyObject.globalPropertyMap[typeName] = new _1.PropertyMap(); var newProperty = new _1.DependencyProperty(name, typeName, defaultValue, options, converter); DependencyObject.globalPropertyMap[typeName].register(name, newProperty); return newProperty; } ///Get the dependency property registered with this type of object (or undefined if property doesn't exist on object) static getProperty(typeName, name) { if (DependencyObject.globalPropertyMap[typeName] == undefined) return null; return DependencyObject.globalPropertyMap[typeName].getProperty(name); } ///Get only dependency properties registered with this type of object static getProperties(typeName) { if (DependencyObject.globalPropertyMap[typeName] == undefined) return null; return DependencyObject.globalPropertyMap[typeName].all(); } ///Iterate over all dependency properties registered with this type of object and its ancestors static forAllProperties(obj, callback) { if (obj == undefined) throw new Error("obj == undefined"); //var typeName = <string>obj["typeName"]; var typeName = _2.getObjectTypeId(obj); var propertiesOfObject = DependencyObject.getProperties(typeName); if (propertiesOfObject != undefined) propertiesOfObject.forEach(_ => callback(_)); if (DependencyObject.globalPropertyMap[typeName] == undefined) return; var firstAnchestor = utils_1.getFirstAnchestor(obj); if (firstAnchestor != undefined) DependencyObject.forAllProperties(firstAnchestor, callback); } static lookupProperty(obj, name) { if (obj == undefined) throw new Error("obj == undefined"); //var typeName = <string>obj["typeName"]; var typeName = _2.getObjectTypeId(obj); var property = DependencyObject.globalPropertyMap[typeName] == undefined ? null : DependencyObject.globalPropertyMap[typeName].getProperty(name); var firstAnchestor = utils_1.getFirstAnchestor(obj); if (property == undefined && firstAnchestor != undefined) return DependencyObject.lookupProperty(firstAnchestor, name); return property; } //Get property value for this object getValue(property) { if (property.name in this.localPropertyValueMap) { return this.localPropertyValueMap[property.name]; } return property.getDefaultValue(this); } //set property value to this object setValue(property, value) { var oldValue = this.getValue(property); var valueToSet = property.converter != undefined && utils_1.isString(value) ? property.converter(value) : value; if (oldValue != valueToSet) { this.localPropertyValueMap[property.name] = valueToSet; this.onDependencyPropertyChanged(property, valueToSet, oldValue); } } //reset property value to its default resetValue(property) { if (property.name in this.localPropertyValueMap) { var oldValue = this.getValue(property); delete this.localPropertyValueMap[property.name]; this.onDependencyPropertyChanged(property, undefined, oldValue); } } //Called when a value of a dependency property is changed (manually or by a binding) onDependencyPropertyChanged(property, value, oldValue) { this.dpcHandlers.forEach((h) => { h.onDependencyPropertyChanged(this, property); }); } //subscribe to dep property change events subscribeDependencyPropertyChanges(observer) { if (this.dpcHandlers.indexOf(observer) == -1) this.dpcHandlers.push(observer); } //unsubscribe from dep property change events unsubscribeDependencyPropertyChanges(observer) { var index = this.dpcHandlers.indexOf(observer, 0); if (index != -1) { this.dpcHandlers.splice(index, 1); } } //Called when a value of a plain property is changed onPropertyChanged(propertyName, value, oldValue) { this.pcHandlers.forEach((h) => { h.onChangeProperty(this, propertyName, value); }); } //subscribe to property change events subscribePropertyChanges(observer) { if (this.pcHandlers.indexOf(observer) == -1) this.pcHandlers.push(observer); } //unsubscribe from property change events unsubscribePropertyChanges(observer) { var index = this.pcHandlers.indexOf(observer, 0); if (index != -1) { this.pcHandlers.splice(index, 1); } } //bind a property of this object to a source object thru a path bind(property, propertyPath, twoway, source, converter, converterParameter, format) { var newBinding = new _1.Binding(this, property, propertyPath, source, twoway, converter, converterParameter, format); this.bindings.push(newBinding); } } ///Map of properties for each dependency object DependencyObject.globalPropertyMap = {}; DependencyObject.logBindingTraceToConsole = false; exports.DependencyObject = DependencyObject;