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.
		
		
		
		
		
			
		
			
				
					
					
						
							244 lines
						
					
					
						
							6.8 KiB
						
					
					
				
			
		
		
	
	
							244 lines
						
					
					
						
							6.8 KiB
						
					
					
				
 | 
						|
/* | 
						|
* Licensed to the Apache Software Foundation (ASF) under one | 
						|
* or more contributor license agreements.  See the NOTICE file | 
						|
* distributed with this work for additional information | 
						|
* regarding copyright ownership.  The ASF licenses this file | 
						|
* to you under the Apache License, Version 2.0 (the | 
						|
* "License"); you may not use this file except in compliance | 
						|
* with the License.  You may obtain a copy of the License at | 
						|
* | 
						|
*   http://www.apache.org/licenses/LICENSE-2.0 | 
						|
* | 
						|
* Unless required by applicable law or agreed to in writing, | 
						|
* software distributed under the License is distributed on an | 
						|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
						|
* KIND, either express or implied.  See the License for the | 
						|
* specific language governing permissions and limitations | 
						|
* under the License. | 
						|
*/ | 
						|
 | 
						|
var zrUtil = require("zrender/lib/core/util"); | 
						|
 | 
						|
var Model = require("./Model"); | 
						|
 | 
						|
var componentUtil = require("../util/component"); | 
						|
 | 
						|
var _clazz = require("../util/clazz"); | 
						|
 | 
						|
var enableClassManagement = _clazz.enableClassManagement; | 
						|
var parseClassType = _clazz.parseClassType; | 
						|
 | 
						|
var _model = require("../util/model"); | 
						|
 | 
						|
var makeInner = _model.makeInner; | 
						|
 | 
						|
var layout = require("../util/layout"); | 
						|
 | 
						|
var boxLayoutMixin = require("./mixin/boxLayout"); | 
						|
 | 
						|
/* | 
						|
* Licensed to the Apache Software Foundation (ASF) under one | 
						|
* or more contributor license agreements.  See the NOTICE file | 
						|
* distributed with this work for additional information | 
						|
* regarding copyright ownership.  The ASF licenses this file | 
						|
* to you under the Apache License, Version 2.0 (the | 
						|
* "License"); you may not use this file except in compliance | 
						|
* with the License.  You may obtain a copy of the License at | 
						|
* | 
						|
*   http://www.apache.org/licenses/LICENSE-2.0 | 
						|
* | 
						|
* Unless required by applicable law or agreed to in writing, | 
						|
* software distributed under the License is distributed on an | 
						|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
						|
* KIND, either express or implied.  See the License for the | 
						|
* specific language governing permissions and limitations | 
						|
* under the License. | 
						|
*/ | 
						|
 | 
						|
/** | 
						|
 * Component model | 
						|
 * | 
						|
 * @module echarts/model/Component | 
						|
 */ | 
						|
var inner = makeInner(); | 
						|
/** | 
						|
 * @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: '', | 
						|
 | 
						|
  /** | 
						|
   * Because simplified concept is probably better, series.name (or component.name) | 
						|
   * has been having too many resposibilities: | 
						|
   * (1) Generating id (which requires name in option should not be modified). | 
						|
   * (2) As an index to mapping series when merging option or calling API (a name | 
						|
   * can refer to more then one components, which is convinient is some case). | 
						|
   * (3) Display. | 
						|
   * @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, | 
						|
  $constructor: function (option, parentModel, ecModel, extraOpt) { | 
						|
    Model.call(this, option, parentModel, ecModel, extraOpt); | 
						|
    this.uid = componentUtil.getUID('ec_cpt_model'); | 
						|
  }, | 
						|
  init: function (option, parentModel, ecModel, extraOpt) { | 
						|
    this.mergeDefaultAndTheme(option, 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, extraOpt) { | 
						|
    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 (newCptOption, isInit) {}, | 
						|
  getDefaultOption: function () { | 
						|
    var fields = inner(this); | 
						|
 | 
						|
    if (!fields.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); | 
						|
      } | 
						|
 | 
						|
      fields.defaultOption = defaultOption; | 
						|
    } | 
						|
 | 
						|
    return fields.defaultOption; | 
						|
  }, | 
						|
  getReferringComponents: function (mainType) { | 
						|
    return this.ecModel.queryComponents({ | 
						|
      mainType: mainType, | 
						|
      index: this.get(mainType + 'Index', true), | 
						|
      id: this.get(mainType + 'Id', true) | 
						|
    }); | 
						|
  } | 
						|
}); // 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. | 
						|
 | 
						|
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) { | 
						|
    deps = deps.concat(Clazz.prototype.dependencies || []); | 
						|
  }); // Ensure main type. | 
						|
 | 
						|
  deps = zrUtil.map(deps, function (type) { | 
						|
    return parseClassType(type).main; | 
						|
  }); // Hack dataset for convenience. | 
						|
 | 
						|
  if (componentType !== 'dataset' && zrUtil.indexOf(deps, 'dataset') <= 0) { | 
						|
    deps.unshift('dataset'); | 
						|
  } | 
						|
 | 
						|
  return deps; | 
						|
} | 
						|
 | 
						|
zrUtil.mixin(ComponentModel, boxLayoutMixin); | 
						|
var _default = ComponentModel; | 
						|
module.exports = _default; |