island.js 8.8 KB
Newer Older
K
kener 已提交
1 2 3 4 5 6 7 8
/**
 * echarts组件:孤岛数据
 *
 * @desc echarts基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据统计图表。
 * @author Kener (@Kener-林峰, linzhifeng@baidu.com)
 *
 */
define(function (require) {
K
kener 已提交
9 10 11 12
    var ComponentBase = require('../component/base');
    var CalculableBase = require('./calculableBase');
    
    // 图形依赖
K
kener 已提交
13 14
    var CircleShape = require('zrender/shape/Circle');
    
K
kener 已提交
15 16 17 18 19
    var ecConfig = require('../config');
    var ecData = require('../util/ecData');
    var zrUtil = require('zrender/tool/util');
    var zrEvent = require('zrender/tool/event');
    
K
kener 已提交
20 21 22 23 24 25
    /**
     * 构造函数
     * @param {Object} messageCenter echart消息中心
     * @param {ZRender} zr zrender实例
     * @param {Object} option 图表选项
     */
K
kener 已提交
26 27 28
    function Island(ecTheme, messageCenter, zr) {
        // 基类
        ComponentBase.call(this, ecTheme, zr, {});
K
kener 已提交
29
        // 可计算特性装饰
K
kener 已提交
30
        CalculableBase.call(this);
K
kener 已提交
31

K
kener 已提交
32 33 34 35 36
        this._nameConnector;
        this._valueConnector;
        this._zrHeight = this.zr.getHeight();
        this._zrWidth = this.zr.getWidth();

K
kener 已提交
37
        var self = this;
K
kener 已提交
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
        /**
         * 滚轮改变孤岛数据值
         */
        self.shapeHandler.onmousewheel = function (param) {
            var shape = param.target;

            var event = param.event;
            var delta = zrEvent.getDelta(event);
            delta = delta > 0 ? (-1) : 1;
            shape.style.r -= delta;
            shape.style.r = shape.style.r < 5 ? 5 : shape.style.r;

            var value = ecData.get(shape, 'value');
            var dvalue = value * self.option.island.calculateStep;
            if (dvalue > 1) {
                value = Math.round(value - dvalue * delta);
            }
            else {
                value = (value - dvalue * delta).toFixed(2) - 0;
            }
K
kener 已提交
58

K
kener 已提交
59 60
            var name = ecData.get(shape, 'name');
            shape.style.text = name + ':' + value;
K
kener 已提交
61

K
kener 已提交
62 63 64
            ecData.set(shape, 'value', value);
            ecData.set(shape, 'name', name);

K
kener 已提交
65
            self.zr.modShape(shape.id);
K
kener 已提交
66 67 68 69 70 71 72
            self.zr.refresh();
            zrEvent.stop(event);
        };
    }
    
    Island.prototype = {
        type : ecConfig.CHART_TYPE_ISLAND,
K
kener 已提交
73 74 75 76 77 78
        /**
         * 孤岛合并
         *
         * @param {string} tarShapeIndex 目标索引
         * @param {Object} srcShape 源目标,合入目标后删除
         */
K
kener 已提交
79
        _combine : function (tarShape, srcShape) {
K
kener 已提交
80
            var zrColor = require('zrender/tool/color');
K
kener 已提交
81 82 83 84 85
            var accMath = require('../util/accMath');
            var value = accMath.accAdd(
                            ecData.get(tarShape, 'value'),
                            ecData.get(srcShape, 'value')
                        );
K
kener 已提交
86
            var name = ecData.get(tarShape, 'name')
K
kener 已提交
87
                       + this._nameConnector
K
kener 已提交
88 89
                       + ecData.get(srcShape, 'name');

K
kener 已提交
90
            tarShape.style.text = name + this._valueConnector + value;
K
kener 已提交
91 92 93

            ecData.set(tarShape, 'value', value);
            ecData.set(tarShape, 'name', name);
K
kener 已提交
94
            tarShape.style.r = this.option.island.r;
K
kener 已提交
95 96 97 98
            tarShape.style.color = zrColor.mix(
                tarShape.style.color,
                srcShape.style.color
            );
K
kener 已提交
99
        },
K
kener 已提交
100

101 102 103
        /**
         * 刷新
         */
K
kener 已提交
104
        refresh : function (newOption) {
105
            if (newOption) {
K
kener 已提交
106 107
                newOption.island = this.reformOption(newOption.island);
                this.option = newOption;
108
    
K
kener 已提交
109 110
                this._nameConnector = this.option.nameConnector;
                this._valueConnector = this.option.valueConnector;
111
            }
K
kener 已提交
112
        },
113
        
K
kener 已提交
114 115
        render : function (newOption) {
            this.refresh(newOption);
K
kener 已提交
116

K
kener 已提交
117 118
            for (var i = 0, l = this.shapeList.length; i < l; i++) {
                this.zr.addShape(this.shapeList[i]);
K
kener 已提交
119
            }
K
kener 已提交
120
        },
K
kener 已提交
121
        
K
kener 已提交
122 123 124
        getOption : function () {
            return this.option;
        },
K
kener 已提交
125

K
kener 已提交
126 127 128 129 130
        resize : function () {
            var newWidth = this.zr.getWidth();
            var newHieght = this.zr.getHeight();
            var xScale = newWidth / (this._zrWidth || newWidth);
            var yScale = newHieght / (this._zrHeight || newHieght);
K
kener 已提交
131 132 133
            if (xScale == 1 && yScale == 1) {
                return;
            }
K
kener 已提交
134 135 136 137 138
            this._zrWidth = newWidth;
            this._zrHeight = newHieght;
            for (var i = 0, l = this.shapeList.length; i < l; i++) {
                this.zr.modShape(
                    this.shapeList[i].id,
K
kener 已提交
139 140
                    {
                        style: {
K
kener 已提交
141 142
                            x: Math.round(this.shapeList[i].style.x * xScale),
                            y: Math.round(this.shapeList[i].style.y * yScale)
K
kener 已提交
143
                        }
K
kener 已提交
144
                    }
K
kener 已提交
145 146
                );
            }
K
kener 已提交
147
        },
K
kener 已提交
148

K
kener 已提交
149
        add : function (shape) {
K
kener 已提交
150 151 152 153 154
            var name = ecData.get(shape, 'name');
            var value = ecData.get(shape, 'value');
            var seriesName = typeof ecData.get(shape, 'series') != 'undefined'
                             ? ecData.get(shape, 'series').name
                             : '';
K
kener 已提交
155
            var font = this.getFont(this.option.island.textStyle);
K
kener 已提交
156
            var islandShape = {
K
kener 已提交
157
                zlevel : this._zlevelBase,
K
kener 已提交
158 159 160
                style : {
                    x : shape.style.x,
                    y : shape.style.y,
K
kener 已提交
161
                    r : this.option.island.r,
K
kener 已提交
162
                    color : shape.style.color || shape.style.strokeColor,
K
kener 已提交
163
                    text : name + this._valueConnector + value,
K
kener 已提交
164 165 166 167
                    textFont : font
                },
                draggable : true,
                hoverable : true,
K
kener 已提交
168
                onmousewheel : this.shapeHandler.onmousewheel,
K
kener 已提交
169 170
                _type : 'island'
            };
K
kener 已提交
171 172 173
            if (islandShape.style.color == '#fff') {
                islandShape.style.color = shape.style.strokeColor;
            }
K
kener 已提交
174
            this.setCalculable(islandShape);
175
            islandShape.dragEnableTime = 0;
K
kener 已提交
176 177 178 179 180 181
            ecData.pack(
                islandShape,
                {name:seriesName}, -1,
                value, -1,
                name
            );
K
kener 已提交
182
            islandShape = new CircleShape(islandShape);
K
kener 已提交
183 184 185
            this.shapeList.push(islandShape);
            this.zr.addShape(islandShape);
        },
K
kener 已提交
186

K
kener 已提交
187 188
        del : function (shape) {
            this.zr.delShape(shape.id);
K
kener 已提交
189
            var newShapeList = [];
K
kener 已提交
190 191 192
            for (var i = 0, l = this.shapeList.length; i < l; i++) {
                if (this.shapeList[i].id != shape.id) {
                    newShapeList.push(this.shapeList[i]);
K
kener 已提交
193 194
                }
            }
K
kener 已提交
195 196
            this.shapeList = newShapeList;
        },
K
kener 已提交
197 198 199 200

        /**
         * 数据项被拖拽进来, 重载基类方法
         */
K
kener 已提交
201 202
        ondrop : function (param, status) {
            if (!this.isDrop || !param.target) {
K
kener 已提交
203 204 205 206 207 208 209
                // 没有在当前实例上发生拖拽行为则直接返回
                return;
            }
            // 拖拽产生孤岛数据合并
            var target = param.target;      // 拖拽安放目标
            var dragged = param.dragged;    // 当前被拖拽的图形对象

K
kener 已提交
210
            this._combine(target, dragged);
K
kener 已提交
211
            this.zr.modShape(target.id);
K
kener 已提交
212 213 214 215

            status.dragIn = true;

            // 处理完拖拽事件后复位
K
kener 已提交
216
            this.isDrop = false;
K
kener 已提交
217 218

            return;
K
kener 已提交
219
        },
K
kener 已提交
220 221 222 223

        /**
         * 数据项被拖拽出去, 重载基类方法
         */
K
kener 已提交
224
        ondragend : function (param, status) {
K
kener 已提交
225
            var target = param.target;      // 拖拽安放目标
K
kener 已提交
226
            if (!this.isDragend) {
K
kener 已提交
227 228 229 230
                // 拖拽的不是孤岛数据,如果没有图表接受孤岛数据,需要新增孤岛数据
                if (!status.dragIn) {
                    target.style.x = zrEvent.getX(param.event);
                    target.style.y = zrEvent.getY(param.event);
K
kener 已提交
231
                    this.add(target);
K
kener 已提交
232 233 234 235 236 237
                    status.needRefresh = true;
                }
            }
            else {
                // 拖拽的是孤岛数据,如果有图表接受了孤岛数据,需要删除孤岛数据
                if (status.dragIn) {
K
kener 已提交
238
                    this.del(target);
K
kener 已提交
239 240 241 242 243
                    status.needRefresh = true;
                }
            }

            // 处理完拖拽事件后复位
K
kener 已提交
244
            this.isDragend = false;
K
kener 已提交
245 246 247 248

            return;
        }
    }
K
kener 已提交
249 250 251 252
    
    zrUtil.inherits(Island, CalculableBase);
    zrUtil.inherits(Island, ComponentBase);
    
253 254 255
    // 图表注册
    require('../chart').define('island', Island);
    
K
kener 已提交
256 257
    return Island;
});