| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 | <!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-Mask'>/**</span> * Defines a mask for a chart's series. * The 'chart' member must be set prior to rendering. * * A Mask can be used to select a certain region in a chart. * When enabled, the `select` event will be triggered when a * region is selected by the mask, allowing the user to perform * other tasks like zooming on that region, etc. * * In order to use the mask one has to set the Chart `mask` option to * `true`, `vertical` or `horizontal`. Then a possible configuration for the * listener could be: * *     items: { *         xtype: 'chart', *         animate: true, *         store: store1, *         mask: 'horizontal', *         listeners: { *             select: { *                 fn: function(me, selection) { *                     me.setZoom(selection); *                     me.mask.hide(); *                 } *             } *         } *     } * * In this example we zoom the chart to that particular region. You can also get * a handle to a mask instance from the chart object. The `chart.mask` element is a * `Ext.Panel`. *  */Ext.define('Ext.chart.Mask', {    requires: [        'Ext.chart.MaskLayer'    ],    <span id='Ext-chart-Mask-cfg-mask'>    /**</span>     * @cfg {Boolean/String} mask     * Enables selecting a region on chart. True to enable any selection,     * 'horizontal' or 'vertical' to restrict the selection to X or Y axis.     *     * The mask in itself will do nothing but fire 'select' event.     * See {@link Ext.chart.Mask} for example.     */<span id='Ext-chart-Mask-method-constructor'>    /**</span>     * Creates new Mask.     * @param {Object} [config] Config object.     */    constructor: function(config) {        var me = this,            resizeHandler;        me.addEvents('select');        if (config) {            Ext.apply(me, config);        }        if (me.enableMask) {            me.on('afterrender', function() {                //create a mask layer component                var comp = new Ext.chart.MaskLayer({                    renderTo: me.el,                    hidden: true                });                comp.el.on({                    'mousemove': function(e) {                        me.onMouseMove(e);                    },                    'mouseup': function(e) {                        me.resized(e);                    }                });                //create a resize handler for the component                resizeHandler = new Ext.resizer.Resizer({                    el: comp.el,                    handles: 'all',                    pinned: true                });                resizeHandler.on({                    'resize': function(e) {                        me.resized(e);                        }                    });                comp.initDraggable();                me.maskType = me.mask;                me.mask = comp;                me.maskSprite = me.surface.add({                    type: 'path',                    path: ['M', 0, 0],                    zIndex: 1001,                    opacity: 0.7,                    hidden: true,                    stroke: '#444'                });            }, me, { single: true });        }    },        resized: function(e) {        var me = this,            bbox = me.bbox || me.chartBBox,            x = bbox.x,            y = bbox.y,            width = bbox.width,            height = bbox.height,            box = me.mask.getBox(true),            max = Math.max,            min = Math.min,            staticX = box.x - x,            staticY = box.y - y;                staticX = max(staticX, x);        staticY = max(staticY, y);        staticX = min(staticX, width);        staticY = min(staticY, height);        box.x = staticX;        box.y = staticY;        me.fireEvent('select', me, box);    },    onMouseUp: function(e) {        var me = this,            bbox = me.bbox || me.chartBBox,            sel = me.maskSelection;        me.maskMouseDown = false;        me.mouseDown = false;        if (me.mouseMoved) {            me.onMouseMove(e);            me.mouseMoved = false;            me.fireEvent('select', me, {                x: sel.x - bbox.x,                y: sel.y - bbox.y,                width: sel.width,                height: sel.height            });        }    },    onMouseDown: function(e) {        var me = this;        me.mouseDown = true;        me.mouseMoved = false;        me.maskMouseDown = {            x: e.getPageX() - me.el.getX(),            y: e.getPageY() - me.el.getY()        };    },    onMouseMove: function(e) {        var me = this,            mask = me.maskType,            bbox = me.bbox || me.chartBBox,            x = bbox.x,            y = bbox.y,            math = Math,            floor = math.floor,            abs = math.abs,            min = math.min,            max = math.max,            height = floor(y + bbox.height),            width = floor(x + bbox.width),            posX = e.getPageX(),            posY = e.getPageY(),            staticX = posX - me.el.getX(),            staticY = posY - me.el.getY(),            maskMouseDown = me.maskMouseDown,            path;                me.mouseMoved = me.mouseDown;        staticX = max(staticX, x);        staticY = max(staticY, y);        staticX = min(staticX, width);        staticY = min(staticY, height);        if (maskMouseDown && me.mouseDown) {            if (mask == 'horizontal') {                staticY = y;                maskMouseDown.y = height;                posY = me.el.getY() + bbox.height + me.insetPadding;            }            else if (mask == 'vertical') {                staticX = x;                maskMouseDown.x = width;            }            width = maskMouseDown.x - staticX;            height = maskMouseDown.y - staticY;            path = ['M', staticX, staticY, 'l', width, 0, 0, height, -width, 0, 'z'];            me.maskSelection = {                x: width > 0 ? staticX : staticX + width,                y: height > 0 ? staticY : staticY + height,                width: abs(width),                height: abs(height)            };            me.mask.updateBox(me.maskSelection);            me.mask.show();            me.maskSprite.setAttributes({                hidden: true                }, true);        }        else {            if (mask == 'horizontal') {                path = ['M', staticX, y, 'L', staticX, height];            }            else if (mask == 'vertical') {                path = ['M', x, staticY, 'L', width, staticY];            }            else {                path = ['M', staticX, y, 'L', staticX, height, 'M', x, staticY, 'L', width, staticY];            }            me.maskSprite.setAttributes({                path: path,                fill: me.maskMouseDown ? me.maskSprite.stroke : false,                'stroke-width': mask === true ? 1 : 3,                hidden: false            }, true);        }    },    onMouseLeave: function(e) {        var me = this;        me.mouseMoved = false;        me.mouseDown = false;        me.maskMouseDown = false;        me.mask.hide();        me.maskSprite.hide(true);    }});    </pre></body></html>
 |