| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 | <!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-resizer-Splitter'>/**</span> * This class functions **between siblings of a {@link Ext.layout.container.VBox VBox} or {@link Ext.layout.container.HBox HBox} * layout** to resize both immediate siblings. * * A Splitter will preserve the flex ratio of any flexed siblings it is required to resize. It does this by setting the `flex` property of *all* flexed siblings * to equal their pixel size. The actual numerical `flex` property in the Components will change, but the **ratio** to the total flex value will be preserved. * * A Splitter may be configured to show a centered mini-collapse tool orientated to collapse the {@link #collapseTarget}. * The Splitter will then call that sibling Panel's {@link Ext.panel.Panel#method-collapse collapse} or {@link Ext.panel.Panel#method-expand expand} method * to perform the appropriate operation (depending on the sibling collapse state). To create the mini-collapse tool but take care * of collapsing yourself, configure the splitter with `{@link #performCollapse}: false`. */Ext.define('Ext.resizer.Splitter', {    extend: 'Ext.Component',    requires: ['Ext.XTemplate'],    uses: ['Ext.resizer.SplitterTracker'],    alias: 'widget.splitter',    childEls: [        'collapseEl'    ],    renderTpl: [        '<tpl if="collapsible===true">',            '<div id="{id}-collapseEl" class="', Ext.baseCSSPrefix, 'collapse-el ',                Ext.baseCSSPrefix, 'layout-split-{collapseDir}">&#160;</div>',        '</tpl>'    ],    baseCls: Ext.baseCSSPrefix + 'splitter',    collapsedClsInternal: Ext.baseCSSPrefix + 'splitter-collapsed',        // Default to tree, allow internal classes to disable resizing    canResize: true,<span id='Ext-resizer-Splitter-cfg-collapsible'>    /**</span>     * @cfg {Boolean} collapsible     * True to show a mini-collapse tool in the Splitter to toggle expand and collapse on the {@link #collapseTarget} Panel.     * Defaults to the {@link Ext.panel.Panel#collapsible collapsible} setting of the Panel.     */    collapsible: false,<span id='Ext-resizer-Splitter-cfg-performCollapse'>    /**</span>     * @cfg {Boolean} performCollapse     * Set to false to prevent this Splitter's mini-collapse tool from managing the collapse     * state of the {@link #collapseTarget}.     */<span id='Ext-resizer-Splitter-cfg-collapseOnDblClick'>    /**</span>     * @cfg {Boolean} collapseOnDblClick     * True to enable dblclick to toggle expand and collapse on the {@link #collapseTarget} Panel.     */    collapseOnDblClick: true,<span id='Ext-resizer-Splitter-cfg-defaultSplitMin'>    /**</span>     * @cfg {Number} defaultSplitMin     * Provides a default minimum width or height for the two components     * that the splitter is between.     */    defaultSplitMin: 40,<span id='Ext-resizer-Splitter-cfg-defaultSplitMax'>    /**</span>     * @cfg {Number} defaultSplitMax     * Provides a default maximum width or height for the two components     * that the splitter is between.     */    defaultSplitMax: 1000,<span id='Ext-resizer-Splitter-cfg-collapsedCls'>    /**</span>     * @cfg {String} collapsedCls     * A class to add to the splitter when it is collapsed. See {@link #collapsible}.     */<span id='Ext-resizer-Splitter-cfg-collapseTarget'>    /**</span>     * @cfg {String/Ext.panel.Panel} collapseTarget     * A string describing the relative position of the immediate sibling Panel to collapse. May be 'prev' or 'next'.     *     * Or the immediate sibling Panel to collapse.     *     * The orientation of the mini-collapse tool will be inferred from this setting.     *     * **Note that only Panels may be collapsed.**     */    collapseTarget: 'next',<span id='Ext-resizer-Splitter-property-orientation'>    /**</span>     * @property {String} orientation     * Orientation of this Splitter. `'vertical'` when used in an hbox layout, `'horizontal'`     * when used in a vbox layout.     */    horizontal: false,    vertical: false,<span id='Ext-resizer-Splitter-method-getTrackerConfig'>    /**</span>     * Returns the config object (with an `xclass` property) for the splitter tracker. This     * is overridden by {@link Ext.resizer.BorderSplitter BorderSplitter} to create a     * {@link Ext.resizer.BorderSplitterTracker BorderSplitterTracker}.     * @protected     */    getTrackerConfig: function () {        return {            xclass: 'Ext.resizer.SplitterTracker',            el: this.el,            splitter: this        };    },    beforeRender: function() {        var me = this,            target = me.getCollapseTarget(),            collapseDir = me.getCollapseDirection(),            vertical = me.vertical,            fixedSizeProp = vertical ? 'width' : 'height',            stretchSizeProp = vertical ? 'height' : 'width',            cls;        me.callParent();        if (!me.hasOwnProperty(stretchSizeProp)) {            me[stretchSizeProp] = '100%';        }        if (!me.hasOwnProperty(fixedSizeProp)) {            me[fixedSizeProp] = 5;        }        if (target.collapsed) {            me.addCls(me.collapsedClsInternal);        }                cls = me.baseCls + '-' + me.orientation;        me.addCls(cls);        if (!me.canResize) {            me.addCls(cls + '-noresize');        }                Ext.applyIf(me.renderData, {            collapseDir: collapseDir,            collapsible: me.collapsible || target.collapsible        });    },    onRender: function() {        var me = this;        me.callParent(arguments);        // Add listeners on the mini-collapse tool unless performCollapse is set to false        if (me.performCollapse !== false) {            if (me.renderData.collapsible) {                me.mon(me.collapseEl, 'click', me.toggleTargetCmp, me);            }            if (me.collapseOnDblClick) {                me.mon(me.el, 'dblclick', me.toggleTargetCmp, me);            }        }        // Ensure the mini collapse icon is set to the correct direction when the target is collapsed/expanded by any means        me.mon(me.getCollapseTarget(), {            collapse: me.onTargetCollapse,            expand: me.onTargetExpand,            scope: me        });        me.el.unselectable();        if (me.canResize) {            me.tracker = Ext.create(me.getTrackerConfig());            // Relay the most important events to our owner (could open wider later):            me.relayEvents(me.tracker, [ 'beforedragstart', 'dragstart', 'dragend' ]);        }    },    getCollapseDirection: function() {        var me = this,            dir = me.collapseDirection,            collapseTarget, idx, items, type;        if (!dir) {            collapseTarget = me.collapseTarget;            if (collapseTarget.isComponent) {                dir = collapseTarget.collapseDirection;            }            if (!dir) {                // Avoid duplication of string tests.                // Create a two bit truth table of the configuration of the Splitter:                // Collapse Target | orientation                //        0              0             = next, horizontal                //        0              1             = next, vertical                //        1              0             = prev, horizontal                //        1              1             = prev, vertical                type = me.ownerCt.layout.type;                if (collapseTarget.isComponent) {                    items = me.ownerCt.items;                    idx = Number(items.indexOf(collapseTarget) == items.indexOf(me) - 1) << 1 | Number(type == 'hbox');                } else {                    idx = Number(me.collapseTarget == 'prev') << 1 | Number(type == 'hbox');                }                // Read the data out the truth table                dir = ['bottom', 'right', 'top', 'left'][idx];            }            me.collapseDirection = dir;        }        me.orientation = (dir == 'top' || dir == 'bottom') ? 'horizontal' : 'vertical';        me[me.orientation] = true;        return dir;    },    getCollapseTarget: function() {        var me = this;        return me.collapseTarget.isComponent ? me.collapseTarget : me.collapseTarget == 'prev' ? me.previousSibling() : me.nextSibling();    },    onTargetCollapse: function(target) {        this.el.addCls([this.collapsedClsInternal, this.collapsedCls]);    },    onTargetExpand: function(target) {        this.el.removeCls([this.collapsedClsInternal, this.collapsedCls]);    },    toggleTargetCmp: function(e, t) {        var cmp = this.getCollapseTarget(),            placeholder = cmp.placeholder,            toggle;        if (placeholder && !placeholder.hidden) {            toggle = true;        } else {            toggle = !cmp.hidden;        }        if (toggle) {            if (cmp.collapsed) {                cmp.expand();            } else if (cmp.collapseDirection) {                cmp.collapse();            } else {                cmp.collapse(this.renderData.collapseDir);            }        }    },    /*     * Work around IE bug. %age margins do not get recalculated on element resize unless repaint called.     */    setSize: function() {        var me = this;        me.callParent(arguments);        if (Ext.isIE && me.el) {            me.el.repaint();        }    },        beforeDestroy: function(){        Ext.destroy(this.tracker);        this.callParent();    }});</pre></body></html>
 |