| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348 | <!DOCTYPE html><html><head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  <title>The source code</title>  <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />  <script type="text/javascript" src="../resources/prettify/prettify.js"></script>  <style type="text/css">    .highlight { display: block; background-color: #ddd; }  </style>  <script type="text/javascript">    function highlight() {      document.getElementById(location.hash.replace(/#/, "")).className = "highlight";    }  </script></head><body onload="prettyPrint(); highlight();">  <pre class="prettyprint lang-js"><span id='Ext-chart-series-Cartesian'>/**</span> * @class Ext.chart.series.Cartesian * * Common base class for series implementations which plot values using x/y coordinates. */Ext.define('Ext.chart.series.Cartesian', {    /* Begin Definitions */    extend: 'Ext.chart.series.Series',    alternateClassName: ['Ext.chart.CartesianSeries', 'Ext.chart.CartesianChart'],    /* End Definitions */<span id='Ext-chart-series-Cartesian-property-xField'>    /**</span>     * The field used to access the x axis value from the items from the data     * source.     *     * @cfg xField     * @type String     */    xField: null,<span id='Ext-chart-series-Cartesian-property-yField'>    /**</span>     * The field used to access the y-axis value from the items from the data     * source.     *     * @cfg yField     * @type String     */    yField: null,<span id='Ext-chart-series-Cartesian-cfg-axis'>    /**</span>     * @cfg {String/String[]} axis     * The position of the axis to bind the values to. Possible values are 'left', 'bottom', 'top' and 'right'.     * You must explicitly set this value to bind the values of the line series to the ones in the axis, otherwise a     * relative scale will be used. For example, if you're using a Scatter or Line series and you'd like to have the     * values in the chart relative to the bottom and left axes then `axis` should be `['left', 'bottom']`.     */    axis: 'left',    getLegendLabels: function() {        var me = this,            labels = [],            fields, i, ln,            combinations = me.combinations,            title,            combo, label0, label1;        fields = [].concat(me.yField);        for (i = 0, ln = fields.length; i < ln; i++) {            title = me.title;            // Use the 'title' config if present, otherwise use the raw yField name            labels.push((Ext.isArray(title) ? title[i] : title) || fields[i]);        }        // Handle yFields combined via legend drag-drop        // TODO need to check to see if this is supported in extjs 4 branch        if (combinations) {            combinations = Ext.Array.from(combinations);            for (i = 0, ln = combinations.length; i < ln; i++) {                combo = combinations[i];                label0 = labels[combo[0]];                label1 = labels[combo[1]];                labels[combo[1]] = label0 + ' & ' + label1;                labels.splice(combo[0], 1);            }        }        return labels;    },<span id='Ext-chart-series-Cartesian-method-eachYValue'>    /**</span>     * @protected Iterates over a given record's values for each of this series's yFields,     * executing a given function for each value. Any yFields that have been combined     * via legend drag-drop will be treated as a single value.     * @param {Ext.data.Model} record     * @param {Function} fn     * @param {Object} scope     */    eachYValue: function(record, fn, scope) {        var me = this,            yValueAccessors = me.getYValueAccessors(),            i, ln, accessor;                for (i = 0, ln = yValueAccessors.length; i < ln; i++) {            accessor = yValueAccessors[i];            fn.call(scope, accessor(record), i);        }    },<span id='Ext-chart-series-Cartesian-method-getYValueCount'>    /**</span>     * @protected Returns the number of yField values, taking into account fields combined     * via legend drag-drop.     * @return {Number}     */    getYValueCount: function() {        return this.getYValueAccessors().length;    },    combine: function(index1, index2) {        var me = this,            accessors = me.getYValueAccessors(),            accessor1 = accessors[index1],            accessor2 = accessors[index2];        // Combine the yValue accessors for the two indexes into a single accessor that returns their sum        accessors[index2] = function(record) {            return accessor1(record) + accessor2(record);        };        accessors.splice(index1, 1);        me.callParent([index1, index2]);    },    clearCombinations: function() {        // Clear combined accessors, they'll get regenerated on next call to getYValueAccessors        delete this.yValueAccessors;        this.callParent();    },<span id='Ext-chart-series-Cartesian-method-getYValueAccessors'>    /**</span>     * @protected Returns an array of functions, each of which returns the value of the yField     * corresponding to function's index in the array, for a given record (each function takes the     * record as its only argument.) If yFields have been combined by the user via legend drag-drop,     * this list of accessors will be kept in sync with those combinations.     * @return {Array} array of accessor functions     */    getYValueAccessors: function() {        var me = this,            accessors = me.yValueAccessors,            yFields, yField, i, ln;        if (!accessors) {            accessors = me.yValueAccessors = [];            yFields = [].concat(me.yField);                        for (i = 0, ln = yFields.length; i < ln; i++) {                yField = yFields[i];                accessors.push(function(record) {                    return record.get(yField);                });            }        }        return accessors;    },<span id='Ext-chart-series-Cartesian-method-getMinMaxXValues'>    /**</span>     * Calculate the min and max values for this series's xField.     * @return {Array} [min, max]     */    getMinMaxXValues: function() {        var me = this,            chart = me.chart,            store = chart.getChartStore(),            data = store.data.items,            i, ln, record,            min, max,            xField = me.xField,            xValue;        if (me.getRecordCount() > 0) {            min = Infinity;            max = -min;                            for (i = 0, ln = data.length; i < ln; i++) {                record = data[i];                xValue = record.get(xField);                if (xValue > max) {                    max = xValue;                }                if (xValue < min) {                    min = xValue;                }            }        } else {            min = max = 0;        }        return [min, max];    },<span id='Ext-chart-series-Cartesian-method-getMinMaxYValues'>    /**</span>     * Calculate the min and max values for this series's yField(s). Takes into account yField     * combinations, exclusions, and stacking.     * @return {Array} [min, max]     */    getMinMaxYValues: function() {        var me = this,            chart = me.chart,            store = chart.getChartStore(),            data = store.data.items,            i, ln, record,            stacked = me.stacked,            min, max,            positiveTotal, negativeTotal;        function eachYValueStacked(yValue, i) {            if (!me.isExcluded(i)) {                if (yValue < 0) {                    negativeTotal += yValue;                } else {                    positiveTotal += yValue;                }            }        }        function eachYValue(yValue, i) {            if (!me.isExcluded(i)) {                if (yValue > max) {                    max = yValue;                }                if (yValue < min) {                    min = yValue;                }            }        }        if (me.getRecordCount() > 0) {            min = Infinity;            max = -min;                        for (i = 0, ln = data.length; i < ln; i++) {                record = data[i];                if (stacked) {                    positiveTotal = 0;                    negativeTotal = 0;                    me.eachYValue(record, eachYValueStacked);                    if (positiveTotal > max) {                        max = positiveTotal;                    }                    if (negativeTotal < min) {                        min = negativeTotal;                    }                } else {                    me.eachYValue(record, eachYValue);                }            }        } else {            min = max = 0;        }        return [min, max];    },    getAxesForXAndYFields: function() {        var me = this,            axes = me.chart.axes,            axis = [].concat(me.axis),            yFields = {}, yFieldList = [].concat(me.yField),            xFields = {}, xFieldList = [].concat(me.xField),            fields, xAxis, yAxis, i, ln, flipXY;                flipXY = me.type === 'bar' && me.column === false;        if(flipXY) {            fields = yFieldList;            yFieldList = xFieldList;            xFieldList = fields;        }        if (Ext.Array.indexOf(axis, 'top') > -1) {            xAxis = 'top';        } else if (Ext.Array.indexOf(axis, 'bottom') > -1) {            xAxis = 'bottom';        } else {            if (axes.get('top') && axes.get('bottom')) {                for (i = 0, ln = xFieldList.length; i < ln; i++) {                    xFields[xFieldList[i]] = true;                }                fields = [].concat(axes.get('bottom').fields);                for (i = 0, ln = fields.length; i < ln; i++) {                    if (xFields[fields[i]]) {                        xAxis = 'bottom';                        break                    }                }                fields = [].concat(axes.get('top').fields);                for (i = 0, ln = fields.length; i < ln; i++) {                    if (xFields[fields[i]]) {                        xAxis = 'top';                        break                    }                }            } else if (axes.get('top')) {                xAxis = 'top';            } else if (axes.get('bottom')) {                xAxis = 'bottom';            }        }        if (Ext.Array.indexOf(axis, 'left') > -1) {            yAxis = 'left';        } else if (Ext.Array.indexOf(axis, 'right') > -1) {            yAxis = 'right';        } else {            if (axes.get('left') && axes.get('right')) {                for (i = 0, ln = yFieldList.length; i < ln; i++) {                    yFields[yFieldList[i]] = true;                }                fields = [].concat(axes.get('right').fields);                for (i = 0, ln = fields.length; i < ln; i++) {                    if (yFields[fields[i]]) {                        break                    }                }                fields = [].concat(axes.get('left').fields);                for (i = 0, ln = fields.length; i < ln; i++) {                    if (yFields[fields[i]]) {                        yAxis = 'left';                        break                    }                }            } else if (axes.get('left')) {                yAxis = 'left';            } else if (axes.get('right')) {                yAxis = 'right';            }        }        return flipXY ? {            xAxis: yAxis,            yAxis: xAxis        }: {            xAxis: xAxis,            yAxis: yAxis        };    }});</pre></body></html>
 |