180 lines
4.9 KiB
Plaintext
180 lines
4.9 KiB
Plaintext
/**
|
|
* Component model
|
|
*
|
|
* @module echarts/model/Component
|
|
*/
|
|
define(function(require) {
|
|
|
|
var Model = require('./Model');
|
|
var zrUtil = require('zrender/core/util');
|
|
var arrayPush = Array.prototype.push;
|
|
var componentUtil = require('../util/component');
|
|
var clazzUtil = require('../util/clazz');
|
|
var layout = require('../util/layout');
|
|
|
|
/**
|
|
* @alias module:echarts/model/Component
|
|
* @constructor
|
|
* @param {Object} option
|
|
* @param {module:echarts/model/Model} parentModel
|
|
* @param {module:echarts/model/Model} ecModel
|
|
*/
|
|
var ComponentModel = Model.extend({
|
|
|
|
type: 'component',
|
|
|
|
/**
|
|
* @readOnly
|
|
* @type {string}
|
|
*/
|
|
id: '',
|
|
|
|
/**
|
|
* @readOnly
|
|
*/
|
|
name: '',
|
|
|
|
/**
|
|
* @readOnly
|
|
* @type {string}
|
|
*/
|
|
mainType: '',
|
|
|
|
/**
|
|
* @readOnly
|
|
* @type {string}
|
|
*/
|
|
subType: '',
|
|
|
|
/**
|
|
* @readOnly
|
|
* @type {number}
|
|
*/
|
|
componentIndex: 0,
|
|
|
|
/**
|
|
* @type {Object}
|
|
* @protected
|
|
*/
|
|
defaultOption: null,
|
|
|
|
/**
|
|
* @type {module:echarts/model/Global}
|
|
* @readOnly
|
|
*/
|
|
ecModel: null,
|
|
|
|
/**
|
|
* key: componentType
|
|
* value: Component model list, can not be null.
|
|
* @type {Object.<string, Array.<module:echarts/model/Model>>}
|
|
* @readOnly
|
|
*/
|
|
dependentModels: [],
|
|
|
|
/**
|
|
* @type {string}
|
|
* @readOnly
|
|
*/
|
|
uid: null,
|
|
|
|
/**
|
|
* Support merge layout params.
|
|
* Only support 'box' now (left/right/top/bottom/width/height).
|
|
* @type {string|Object} Object can be {ignoreSize: true}
|
|
* @readOnly
|
|
*/
|
|
layoutMode: null,
|
|
|
|
|
|
init: function (option, parentModel, ecModel, extraOpt) {
|
|
this.mergeDefaultAndTheme(this.option, this.ecModel);
|
|
},
|
|
|
|
mergeDefaultAndTheme: function (option, ecModel) {
|
|
var layoutMode = this.layoutMode;
|
|
var inputPositionParams = layoutMode
|
|
? layout.getLayoutParams(option) : {};
|
|
|
|
var themeModel = ecModel.getTheme();
|
|
zrUtil.merge(option, themeModel.get(this.mainType));
|
|
zrUtil.merge(option, this.getDefaultOption());
|
|
|
|
if (layoutMode) {
|
|
layout.mergeLayoutParam(option, inputPositionParams, layoutMode);
|
|
}
|
|
},
|
|
|
|
mergeOption: function (option) {
|
|
zrUtil.merge(this.option, option, true);
|
|
|
|
var layoutMode = this.layoutMode;
|
|
if (layoutMode) {
|
|
layout.mergeLayoutParam(this.option, option, layoutMode);
|
|
}
|
|
},
|
|
|
|
// Hooker after init or mergeOption
|
|
optionUpdated: function (ecModel) {},
|
|
|
|
getDefaultOption: function () {
|
|
if (!this.hasOwnProperty('__defaultOption')) {
|
|
var optList = [];
|
|
var Class = this.constructor;
|
|
while (Class) {
|
|
var opt = Class.prototype.defaultOption;
|
|
opt && optList.push(opt);
|
|
Class = Class.superClass;
|
|
}
|
|
|
|
var defaultOption = {};
|
|
for (var i = optList.length - 1; i >= 0; i--) {
|
|
defaultOption = zrUtil.merge(defaultOption, optList[i], true);
|
|
}
|
|
this.__defaultOption = defaultOption;
|
|
}
|
|
return this.__defaultOption;
|
|
}
|
|
|
|
});
|
|
|
|
// Reset ComponentModel.extend, add preConstruct.
|
|
clazzUtil.enableClassExtend(
|
|
ComponentModel,
|
|
function (option, parentModel, ecModel, extraOpt) {
|
|
// Set dependentModels, componentIndex, name, id, mainType, subType.
|
|
zrUtil.extend(this, extraOpt);
|
|
|
|
this.uid = componentUtil.getUID('componentModel');
|
|
|
|
// this.setReadOnly([
|
|
// 'type', 'id', 'uid', 'name', 'mainType', 'subType',
|
|
// 'dependentModels', 'componentIndex'
|
|
// ]);
|
|
}
|
|
);
|
|
|
|
// Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
|
|
clazzUtil.enableClassManagement(
|
|
ComponentModel, {registerWhenExtend: true}
|
|
);
|
|
componentUtil.enableSubTypeDefaulter(ComponentModel);
|
|
|
|
// Add capability of ComponentModel.topologicalTravel.
|
|
componentUtil.enableTopologicalTravel(ComponentModel, getDependencies);
|
|
|
|
function getDependencies(componentType) {
|
|
var deps = [];
|
|
zrUtil.each(ComponentModel.getClassesByMainType(componentType), function (Clazz) {
|
|
arrayPush.apply(deps, Clazz.prototype.dependencies || []);
|
|
});
|
|
// Ensure main type
|
|
return zrUtil.map(deps, function (type) {
|
|
return clazzUtil.parseClassType(type).main;
|
|
});
|
|
}
|
|
|
|
zrUtil.mixin(ComponentModel, require('./mixin/boxLayout'));
|
|
|
|
return ComponentModel;
|
|
}); |