VaKeR CYBER ARMY
Logo of a company Server : Apache/2.4.41 (Ubuntu)
System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64
User : www-data ( 33)
PHP Version : 7.4.33
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Directory :  /var/www/html/libs/absol-form/js/propertyeditors/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /var/www/html/libs/absol-form/js/propertyeditors/MultiObjectPropertyEditor.js
import Context from "absol/src/AppPattern/Context";
import EventEmitter from "absol/src/HTML5/EventEmitter";
import FCore from "../core/FCore";
import {camelCaseToPascalCase} from "absol/src/String/stringFormat";
import {FONT_ITEMS} from "../font/GoogleFont";
import QuickMenu from "absol-acomp/js/QuickMenu";
import {base64EncodeUnicode} from "absol/src/Converter/base64";
import R from "../R";
import {randomIdent} from "absol/src/String/stringGenerate";
import SelectListEditor from "../editor/SelectListEditor";
import TokenField from "absol-acomp/js/TokenField";
import {AssemblerInstance} from "../core/Assembler";
import PEText from "./types/PEText";
import PEUniqueText from "./types/PEUniqueText";
import PEColor from "./types/PEColor";
import PEConst from "./types/PEConst";
import PEEnum from "./types/PEEnum";
import PEArrayOfText from "./types/PEArrayOfText";
import PEMeasureSize from "./types/PEMeasureSize";
import PEMeasurePosition from "./types/PEMeasurePosition";
import PEFont from "./types/PEFont";
import PETextAlign from "./types/PETextAlign";
import PEBoxAlign from "./types/PEBoxAlign";
import PEBool from "./types/PEBool";
import PENumber from "./types/PENumber";
import PEFragmentClass from "./types/PEFragmentClass";
import PESelectList from "./types/PESelectList";
import PELengthInPixel from "./types/PELengthInPixel";
import PEIcon from "./types/PEIcon";
import ResizeSystem from "absol/src/HTML5/ResizeSystem";

var _ = FCore._;
var $ = FCore.$;

function MultiObjectPropertyEditor() {
    Context.call(this);
    EventEmitter.call(this);
    this.dependents = {};
    this.propertyHolders = {};
    /**
     * @type {Array<import('../core/BaseComponent').default>}
     */
    this.objects = null;
    this.propertyNames = [];
    this.queuePools = {};
}


Object.defineProperties(MultiObjectPropertyEditor.prototype, Object.getOwnPropertyDescriptors(Context.prototype));
Object.defineProperties(MultiObjectPropertyEditor.prototype, Object.getOwnPropertyDescriptors(EventEmitter.prototype));
MultiObjectPropertyEditor.prototype.constructor = MultiObjectPropertyEditor;
MultiObjectPropertyEditor.prototype.pools = {};

MultiObjectPropertyEditor.prototype.type2EditorClass = {
    text: PEText,
    string: PEText,
    uniqueText: PEUniqueText,
    color: PEColor,
    'const': PEConst,
    'enum': PEEnum,
    arrayOfText: PEArrayOfText,
    measureSize: PEMeasureSize,
    measurePosition: PEMeasurePosition,
    font: PEFont,
    textAlign: PETextAlign,
    boxAlign: PEBoxAlign,
    bool: PEBool,
    boolean: PEBool,
    number: PENumber,
    fragmentClass: PEFragmentClass,
    SelectList: PESelectList,
    LengthInPixel: PELengthInPixel,
    icon: PEIcon
};

MultiObjectPropertyEditor.prototype.getPropertyNames = function (object) {
    return Object.keys(object);
};


MultiObjectPropertyEditor.prototype.getProperty = function (object, name) {
    return object[name];
};


MultiObjectPropertyEditor.prototype.setProperty = function (object, name, value) {
    return object[name] = value;
};


MultiObjectPropertyEditor.prototype.setPropertyAll = function () {
    for (var i = 0; i < this.objects.length; ++i)
        this.setProperty.apply(this, [this.objects[i]].concat(Array.prototype.slice.call(arguments)));
};


MultiObjectPropertyEditor.prototype.getPropertyDescriptor = function (object, name) {
    return {
        type: typeof object[name]
    };
};

MultiObjectPropertyEditor.prototype.edit = function () {
    this.objects = Array.prototype.slice.call(arguments);
    this.loadAttributes();
};

MultiObjectPropertyEditor.prototype.loadAttributes = function () {
    this.flushAllToPools();
    this.$body.clearChild();
    this.clearAllDependents();
    var self = this;
    var objects = this.objects;
    if (objects.length <= 0) return;
    var availablePropertyNames = objects.reduce(function (ac, obj) {
        var ret = {};
        var propNames = self.getPropertyNames(obj);
        var name;
        for (var i = 0; i < propNames.length; ++i) {
            name = propNames[i];
            if (ac === null || (typeof ac[name] == 'number')) {
                ret[name] = Math.max(i, ret[name] || 0);
            }
        }
        return ret;
    }, null);

    var names = Object.keys(availablePropertyNames);
    names.sort(function (a, b) {
        return availablePropertyNames[a] - availablePropertyNames[b];
    });

    var editableNames = names.filter(function (name) {
        var descriptor;
        var lastSign = null;
        if (objects.length === 1) return true;
        for (var i = 0; i < objects.length; ++i) {
            descriptor = self.getPropertyDescriptor(objects[i], name);
            if (!descriptor.independence) return false;
            if (lastSign === null) {
                lastSign = descriptor.sign;
            }
            else if (lastSign !== descriptor.sign) {
                return false;
            }
        }
        return true;
    });

    this.propertyNames = editableNames;
    this.propertyHolders = {};
    var object = objects[objects.length - 1];
    this.propertyNames.forEach(function (name) {
        var descriptor = self.getPropertyDescriptor(object, name) || { type: "NoDescriptor" };
        var displayName = descriptor.displayName || name;
        if (descriptor.hidden) return;
        var EditorClass = self.type2EditorClass[descriptor.type];
        var functionName = 'load' + camelCaseToPascalCase(descriptor.type) + 'Property';
        var cell = _('td');
        if (descriptor.dependency) {
            // self.addDependents(name, descriptor.dependency);
        }
        if (!self[functionName]) {
            // throw new Error('Not support type' + descriptor.type + '!')
            functionName = 'loadNotSupportedProperty';
        }

        var rowElt = _({
            tag: 'tr',
            child: [
                {
                    tag: 'td',
                    child: { text: displayName }
                },
                cell
            ]
        });

        rowElt.addTo(self.$body);
        if (descriptor.dependency) {
            self.addDependents(name, descriptor.dependency);
        }

        if (EditorClass) {
            self.propertyHolders[name] = new EditorClass(self, name, descriptor, cell)
        }
        else {
            self.propertyHolders[name] = self[functionName](name, descriptor, cell, cell);
        }
    });
    ResizeSystem.update();
};


MultiObjectPropertyEditor.prototype.flushAllToPools = function () {
    var self = this;
    Object.keys(this.queuePools).forEach(function (key) {
        self.pools[key] = self.pools[key] === undefined ? [] : self.pools[key];
        var all = self.queuePools[key].splice(0);
        self.pools[key].push.apply(self.pools[key], all);
    });
};


MultiObjectPropertyEditor.prototype.assignToPool = function (key, value) {
    this.queuePools[key] = this.queuePools[key] === undefined ? [] : this.queuePools[key];
    if (value.__pool_assign__) {
        console.warn("Pool: reassign object", key, value);
    }
    else {
        value.__pool_assign__ = true;
        this.queuePools[key].push(value);
    }
};


MultiObjectPropertyEditor.prototype.putOnceFromPool = function (key) {
    var res = null;
    if (this.pools[key] && this.pools[key].length > 0) {
        res = this.pools[key].pop();
    }
    if (res) res.__pool_assign__ = false;
    return res;
};


MultiObjectPropertyEditor.prototype.getView = function () {
    if (this.$view) return this.$view;
    this.$view = _({
        class: 'as-property-editor',
        child: {
            tag: 'table',
            child: [
                {
                    tag: 'thead',
                    child: [

                        {
                            tag: 'tr',
                            child: [
                                {
                                    tag: 'td',
                                    child: { text: "key" }
                                },
                                {
                                    tag: 'td',
                                    attr: { colspan: '3' },
                                    child: { text: 'value' }
                                }
                            ]
                        }
                    ]
                },
                {
                    tag: 'tbody'
                }
            ]
        }
    });
    this.$body = $('tbody', this.$view);
    return this.$view;
};


MultiObjectPropertyEditor.prototype.loadNotSupportedProperty = function (name, descriptor, cell, cellElt) {
    cellElt.addChild(_({ text: 'Not supported ' }))
        .addChild(_({
            tag: 'strong',
            child: { text: descriptor.type }
        }));
    return {};
};


MultiObjectPropertyEditor.prototype.clearAllDependents = function () {
    for (var key in this.dependents)
        delete this.dependents[key];
};


/**
 * @param {String} propertyName
 * @param {Array<String>} dependencyProperties
 */
MultiObjectPropertyEditor.prototype.addDependents = function (propertyName, dependencyProperties) {
    var dependencyProperty;
    for (var i = 0; i < dependencyProperties.length; ++i) {
        dependencyProperty = dependencyProperties[i];
        this.dependents[dependencyProperty] = this.dependents[dependencyProperty] || {};
        this.dependents[dependencyProperty][propertyName] = true;
    }
};

MultiObjectPropertyEditor.prototype.updateDependentsOf = function (name, excludes) {
    excludes = excludes || {};
    excludes[name] = true;
    for (var dependentPropertyName in this.dependents[name]) {
        if (!excludes[dependentPropertyName] && this.propertyHolders[dependentPropertyName]) {
            excludes[dependentPropertyName] = true;
            if (this.propertyHolders[dependentPropertyName].requestUpdate) {
                this.propertyHolders[dependentPropertyName].requestUpdate();
            }
            else if (this.propertyHolders[dependentPropertyName].reload) {
                this.propertyHolders[dependentPropertyName].reload();
            }
            this.updateDependentsOf(dependentPropertyName, excludes);
        }
    }
};

MultiObjectPropertyEditor.prototype.updatePropertyRecursive = function (name) {
    if (!this.propertyHolders[name]) return;
    if (this.propertyHolders[name].requestUpdate)
        this.propertyHolders[name].requestUpdate();
    else if (this.propertyHolders[name].reload) {
        this.propertyHolders[name].reload();
    }
    this.updateDependentsOf(name);
}


MultiObjectPropertyEditor.prototype.notifyChange = function (name, from) {
    this.updateDependentsOf(name);
    this.emit('change', { type: 'change', target: this, from: from, name: name, objects: this.objects }, this);
};


MultiObjectPropertyEditor.prototype.notifyStopChange = function (name) {
    this.emit('stopchange', { type: 'stopchange', name: name, objects: this.objects }, this);
};

MultiObjectPropertyEditor.prototype.getBound = function () {
    var bound = this.$body.getBoundingClientRect();
    return { width: bound.width + 15, height: bound.height + 24 + 24 + 10 };
};

export default MultiObjectPropertyEditor;



VaKeR 2022