Форк Rambox
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

261 lines
7.5 KiB

/**
* This class describes a size determination strategy or algorithm used by the layout
* system. There are special instances of this class stored as static properties to
* avoid needless object instantiation. These instances should be treated as readonly.
*
* * `calculated`
* * `configured`
* * `constrainedMax`
* * `constrainedMin`
* * `natural`
* * `shrinkWrap`
* * `calculatedFromConfigured`
* * `calculatedFromNatural`
* * `calculatedFromShrinkWrap`
*
* Using one of these instances is simply:
*
* var calculated = Ext.layout.SizeModel.calculated;
*
* @private
*/
Ext.define('Ext.layout.SizeModel', {
constructor: function (config) {
var me = this,
SizeModel = me.self,
sizeModelsArray = SizeModel.sizeModelsArray,
name;
Ext.apply(me, config);
me[name = me.name] = true; // set the one special flag that matches our name
me.fixed = !(me.auto = me.natural || me.shrinkWrap);
/**
* @property {Number} ordinal
* The 0-based ordinal for this `SizeModel` instance.
* @readonly
*/
sizeModelsArray[me.ordinal = sizeModelsArray.length] =
SizeModel[name] =
SizeModel.sizeModels[name] = me;
},
statics: {
/**
* An array of all SizeModel instances.
* @private
*/
sizeModelsArray: [],
/**
* An object containing all SizeModel instances keyed by `name`.
* @private
*/
sizeModels: {}
},
/**
* @property {String} name
* The name of this size model (e.g., "calculated").
* @readonly
*/
/**
* @property {Boolean} auto
* True if the size is either `natural` or `shrinkWrap`, otherwise false.
* @readonly
*/
/**
* @property {Boolean} calculated
* True if the size is calculated by the `ownerLayout`.
* @readonly
*/
calculated: false,
/**
* @property {Boolean} configured
* True if the size is configured (e.g., by a `width` or `minWidth`). The names of
* configuration properties can be found in the {@link #names} property.
* @readonly
*/
configured: false,
/**
* @property {Boolean} constrainedMax
* True if the size is constrained by a `maxWidth` or `maxHeight` configuration. This
* is a flavor of `configured` (since `maxWidth` and `maxHeight` are config options).
* If true, the {@link #names} property will be defined as well.
* @readonly
*/
constrainedMax: false,
/**
* @property {Boolean} constrainedMin
* True if the size is constrained by a `minWidth` or `minHeight` configuration. This
* is a flavor of `configured` (since `minWidth` and `minHeight` are config options).
* If true, the {@link #names} property will be defined as well.
* @readonly
*/
constrainedMin: false,
/**
* @property {Boolean} fixed
* True if the size is either `calculated` or `configured`, otherwise false.
* @readonly
*/
/**
* @property {Boolean} natural
* True if the size is determined by CSS and not by content. Such sizes are assumed to
* be dependent on the container box and measurement occurs on the outer-most element.
* @readonly
*/
natural: false,
/**
* @property {Boolean} shrinkWrap
* True if the size is determined by content irrespective of the container box.
* @readonly
*/
shrinkWrap: false,
/**
* @property {Boolean} calculatedFromConfigured
* True if the size is calculated by the `ownerLayout` based on a configured size.
* @readonly
*/
calculatedFromConfigured: false,
/**
* @property {Boolean} calculatedFromNatural
* True if the size is calculated by the `ownerLayout` based on `natural` size model
* results.
* @readonly
*/
calculatedFromNatural: false,
/**
* @property {Boolean} calculatedFromShrinkWrap
* True if the size is calculated by the `ownerLayout` based on `shrinkWrap` size model
* results.
* @readonly
*/
calculatedFromShrinkWrap: false,
/**
* @property {Object} names An object with the config property names that determine the
* size.
* @property {String} names.width The width property name (e.g., 'width').
* @property {String} names.height The height property name (e.g., 'minHeight').
* @readonly
*/
names: null
},
function () {
var SizeModel = this,
sizeModelsArray = SizeModel.sizeModelsArray,
i, j, n, pairs, sizeModel;
//-------------------------------------------------------------------------------
// These are the 4 fundamental size models.
new SizeModel({ // jshint ignore:line
name: 'calculated'
});
new SizeModel({ // jshint ignore:line
name: 'configured',
names: { width: 'width', height: 'height' }
});
new SizeModel({ // jshint ignore:line
name: 'natural'
});
new SizeModel({ // jshint ignore:line
name: 'shrinkWrap'
});
//-------------------------------------------------------------------------------
// These are the size models are flavors of the above but with some extra detail
// about their dynamic use.
new SizeModel({ // jshint ignore:line
name: 'calculatedFromConfigured',
configured: true,
calculatedFrom: true,
names: { width: 'width', height: 'height' }
});
new SizeModel({ // jshint ignore:line
name: 'calculatedFromNatural',
natural: true,
calculatedFrom: true
});
new SizeModel({ // jshint ignore:line
name: 'calculatedFromShrinkWrap',
shrinkWrap: true,
calculatedFrom: true
});
new SizeModel({ // jshint ignore:line
name: 'constrainedMax',
configured: true,
constrained: true,
names: { width: 'maxWidth', height: 'maxHeight' }
});
new SizeModel({ // jshint ignore:line
name: 'constrainedMin',
configured: true,
constrained: true,
names: { width: 'minWidth', height: 'minHeight' }
});
new SizeModel({ // jshint ignore:line
name: 'constrainedDock',
configured: true,
constrained: true,
constrainedByMin: true,
names: { width: 'dockConstrainedWidth', height: 'dockConstrainedHeight' }
});
for (i = 0, n = sizeModelsArray.length; i < n; ++i) {
sizeModel = sizeModelsArray[i];
/**
* An array of objects indexed by the {@link #ordinal} of a height `SizeModel` on
* a width `SizeModel` to yield an object describing both height and width size
* models.
*
* Used like this:
*
* widthModel.pairsByHeightOrdinal[heightModel.ordinal]
*
* This provides a reusable object equivalent to the following:
*
* {
* width: widthModel,
* height: heightModel
* }
*
* @property {Object[]} pairsByHeightOrdinal
* @property {Ext.layout.SizeModel} pairsByHeightOrdinal.width The `SizeModel` for
* the width.
* @property {Ext.layout.SizeModel} pairsByHeightOrdinal.height The `SizeModel` for
* the height.
*/
sizeModel.pairsByHeightOrdinal = pairs = [];
for (j = 0; j < n; ++j) {
pairs.push({
width: sizeModel,
height: sizeModelsArray[j]
});
}
}
});