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
    }


});