# Source: core/meta/user-interface-descriptor.js

    var Montage = require("../core").Montage;

    /*

    List of PropertyInterfaceDescriptors, to show in UI, if not there, it's not viewable
    PropertyInspector:
    ViewInspector
    EditInspector

    Javier: per object, a limited amount of metadata:
    1 inspector, 1 creator, 1 inlineInspector,

    Javier want to be able to define which columns should be used in a table, the ratio of sizes between columns, the sorted by defaults, the filter criteria, etc…

    if a user resize a column, where does it get saved?
    The table would ask the object what does it has for a table.

    Needs groups of properties, like in blueprint

    When serializing their states, a table view that is data driven, the user tweaks needs to be  stored by component unique id and by the type they displayed at the time of change
    */

    /**
     * @class UserInterfaceDescriptor
     * @extends Montage
     */
    exports.UserInterfaceDescriptor = Montage.specialize( /** @lends UserInterfaceDescriptor.prototype # */ {
        /**
         * The object a UserInterfaceDescriptor describes. This is intented be an ObjectDescriptor/blueprint or a PropertyDescriptor/PropertyBlueprint
         *
         * @type {object} descriptor
         */
        descriptor: {
            value: void 0
        },

        /**
         * An expression that enables a UserInterfaceDescriptor to get a display name from its describedObject.
         * Like "fullName" or firstName + " "+ lastName
         * @type {MontageExpression} nameExpression
         */
        nameExpression: {
            value: void 0
        },

        /**
         * A component to be used to visually represent an object described by the descriptor
         *
         * @type {Component} iconComponent
         */
        iconComponent: {
            value: void 0
        },

        /**
         * A component to be used to create new objects as described by descriptor
         *
         * @type {Component} creatorComponent
         */
        creatorComponent: {
            value: void 0
        },

        /**
         * A component to be used to inspect an object described by descriptor
         *
         * @type {Component} inspectorComponent
         */
        inspectorComponent: {
            value: void 0
        },

        /**
         * A component to be used to edit descriptor's described object directly, over/around the object itself.
         * compared to the inspectorComponent that indirectly interact with the object.
         * This is especially relevant for authoring tools.
         *
         * @type {Component} editorComponent
         */
        editorComponent: {
            value: void 0
        },

        /**
         * A component to be used to inspect a collection of descriptor's described object
         *
         * @type {Component} collectionInspectorComponent
         */
        collectionInspectorComponent: {
            value: void 0
        },

        /**
         * A component to be used to represent a single instance of descriptor's described object in a collection of described objects
         *
         * @type {Component} collectionItemComponent
         */
        collectionItemComponent: {
            value: void 0
        },

        /**
         * An array of UserInterfaceDescriptors that individually describe the PropertyDescriptors/PropertyBlueprints of this object's descriptor's PropertyDescriptors
         * An ObjectDescriptor/Blueprint has groups of propery descriptors that should be respected in term of organization
         *
         * @type {Component} propertyUserInterfaceDescriptors
         */
        propertyUserInterfaceDescriptors: {
            value: void 0
        }

    });