Version 3.18.1
Show:

File: charts/js/Renderer.js

            /**
             * The Charts widget provides an api for displaying data
             * graphically.
             *
             * @module charts
             * @main charts
             */
            
            /**
             * Provides functionality for the handling of axis data in a chart.
             *
             * @module charts
             * @submodule axis-base
             */
            var Y_Lang = Y.Lang;
            
            /**
             * The Renderer class is a base class for chart components that use the `styles`
             * attribute.
             *
             * @module charts
             * @class Renderer
             * @constructor
             */
            function Renderer(){}
            
            Renderer.ATTRS = {
                    /**
                     * Style properties for class
                     *
                     * @attribute styles
                     * @type Object
                     */
                    styles:
                    {
                        getter: function()
                        {
                            this._styles = this._styles || this._getDefaultStyles();
                            return this._styles;
                        },
            
                        setter: function(val)
                        {
                            this._styles = this._setStyles(val);
                        }
                    },
            
                    /**
                     * The graphic in which drawings will be rendered.
                     *
                     * @attribute graphic
                     * @type Graphic
                     */
                    graphic: {}
            };
            Renderer.NAME = "renderer";
            
            Renderer.prototype = {
                /**
                 * Storage for `styles` attribute.
                 *
                 * @property _styles
                 * @type Object
                 * @private
                 */
            	_styles: null,
            
                /**
                 * Method used by `styles` setter.
                 *
                 * @method _setStyles
                 * @param {Object} newStyles Hash of properties to update.
                 * @return Object
                 * @protected
                 */
            	_setStyles: function(newstyles)
            	{
            		var styles = this.get("styles");
                    return this._mergeStyles(newstyles, styles);
            	},
            
                /**
                 * Merges to object literals so that only specified properties are
                 * overwritten.
                 *
                 * @method _mergeStyles
                 * @param {Object} a Hash of new styles
                 * @param {Object} b Hash of original styles
                 * @return Object
                 * @protected
                 */
                _mergeStyles: function(a, b)
                {
                    if(!b)
                    {
                        b = {};
                    }
                    var newstyles = Y.merge(b, {});
                    Y.Object.each(a, function(value, key)
                    {
                        if(b.hasOwnProperty(key) && Y_Lang.isObject(value) && !Y_Lang.isFunction(value) && !Y_Lang.isArray(value))
                        {
                            newstyles[key] = this._mergeStyles(value, b[key]);
                        }
                        else
                        {
                            newstyles[key] = value;
                        }
                    }, this);
                    return newstyles;
                },
            
                /**
                 * Copies an object literal.
                 *
                 * @method _copyObject
                 * @param {Object} obj Object literal to be copied.
                 * @return Object
                 * @private
                 */
                _copyObject: function(obj) {
                    var newObj = {},
                        key,
                        val;
                    for(key in obj)
                    {
                        if(obj.hasOwnProperty(key))
                        {
                            val = obj[key];
                            if(typeof val === "object" && !Y_Lang.isArray(val))
                            {
                                newObj[key] = this._copyObject(val);
                            }
                            else
                            {
                                newObj[key] = val;
                            }
                        }
                    }
                    return newObj;
                },
            
                /**
                 * Gets the default value for the `styles` attribute.
                 *
                 * @method _getDefaultStyles
                 * @return Object
                 * @protected
                 */
                _getDefaultStyles: function()
                {
                    return {padding:{
                        top:0,
                        right: 0,
                        bottom: 0,
                        left: 0
                    }};
                }
            };
            
            Y.augment(Renderer, Y.Attribute);
            Y.Renderer = Renderer;