| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 | <!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-ux-ToolbarDroppable'>/**</span> * @class Ext.ux.ToolbarDroppable * @extends Object * Plugin which allows items to be dropped onto a toolbar and be turned into new Toolbar items. * To use the plugin, you just need to provide a createItem implementation that takes the drop * data as an argument and returns an object that can be placed onto the toolbar. Example: * <pre> * Ext.create('Ext.ux.ToolbarDroppable', { *   createItem: function(data) { *     return Ext.create('Ext.Button', {text: data.text}); *   } * }); * </pre> * The afterLayout function can also be overridden, and is called after a new item has been * created and inserted into the Toolbar. Use this for any logic that needs to be run after * the item has been created. */ Ext.define('Ext.ux.ToolbarDroppable', {    extend: 'Object',<span id='Ext-ux-ToolbarDroppable-method-constructor'>    /**</span>     * @constructor     */    constructor: function(config) {      Ext.apply(this, config);    },<span id='Ext-ux-ToolbarDroppable-method-init'>    /**</span>     * Initializes the plugin and saves a reference to the toolbar     * @param {Ext.toolbar.Toolbar} toolbar The toolbar instance     */    init: function(toolbar) {<span id='Ext-ux-ToolbarDroppable-property-toolbar'>      /**</span>       * @property toolbar       * @type Ext.toolbar.Toolbar       * The toolbar instance that this plugin is tied to       */      this.toolbar = toolbar;      this.toolbar.on({          scope : this,          render: this.createDropTarget      });    },<span id='Ext-ux-ToolbarDroppable-method-createDropTarget'>    /**</span>     * Creates a drop target on the toolbar     */    createDropTarget: function() {<span id='Ext-ux-ToolbarDroppable-property-dropTarget'>        /**</span>         * @property dropTarget         * @type Ext.dd.DropTarget         * The drop target attached to the toolbar instance         */        this.dropTarget = Ext.create('Ext.dd.DropTarget', this.toolbar.getEl(), {            notifyOver: Ext.Function.bind(this.notifyOver, this),            notifyDrop: Ext.Function.bind(this.notifyDrop, this)        });    },<span id='Ext-ux-ToolbarDroppable-method-addDDGroup'>    /**</span>     * Adds the given DD Group to the drop target     * @param {String} ddGroup The DD Group     */    addDDGroup: function(ddGroup) {        this.dropTarget.addToGroup(ddGroup);    },<span id='Ext-ux-ToolbarDroppable-method-calculateEntryIndex'>    /**</span>     * Calculates the location on the toolbar to create the new sorter button based on the XY of the     * drag event     * @param {Ext.EventObject} e The event object     * @return {Number} The index at which to insert the new button     */        calculateEntryIndex: function(e) {        var entryIndex = 0,            toolbar = this.toolbar,            items = toolbar.items.items,            count = items.length,            xHover = e.getXY()[0],            index = 0,            el, xTotal, width, midpoint;         for (; index < count; index++) {            el = items[index].getEl();            xTotal = el.getXY()[0];            width = el.getWidth();            midpoint = xTotal + width / 2;             if (xHover < midpoint) {                entryIndex = index;                 break;            } else {                entryIndex = index + 1;            }       }       return entryIndex;    },<span id='Ext-ux-ToolbarDroppable-method-canDrop'>    /**</span>     * Returns true if the drop is allowed on the drop target. This function can be overridden     * and defaults to simply return true     * @param {Object} data Arbitrary data from the drag source     * @return {Boolean} True if the drop is allowed     */    canDrop: function(data) {        return true;    },<span id='Ext-ux-ToolbarDroppable-method-notifyOver'>    /**</span>     * Custom notifyOver method which will be used in the plugin's internal DropTarget     * @return {String} The CSS class to add     */    notifyOver: function(dragSource, event, data) {        return this.canDrop.apply(this, arguments) ? this.dropTarget.dropAllowed : this.dropTarget.dropNotAllowed;    },<span id='Ext-ux-ToolbarDroppable-method-notifyDrop'>    /**</span>     * Called when the drop has been made. Creates the new toolbar item, places it at the correct location     * and calls the afterLayout callback.     */    notifyDrop: function(dragSource, event, data) {        var canAdd = this.canDrop(dragSource, event, data),            tbar   = this.toolbar;        if (canAdd) {            var entryIndex = this.calculateEntryIndex(event);            tbar.insert(entryIndex, this.createItem(data));            tbar.doLayout();            this.afterLayout();        }        return canAdd;    },<span id='Ext-ux-ToolbarDroppable-method-createItem'>    /**</span>     * Creates the new toolbar item based on drop data. This method must be implemented by the plugin instance     * @param {Object} data Arbitrary data from the drop     * @return {Mixed} An item that can be added to a toolbar     */    createItem: function(data) {        //<debug>        Ext.Error.raise("The createItem method must be implemented in the ToolbarDroppable plugin");        //</debug>    },<span id='Ext-ux-ToolbarDroppable-method-afterLayout'>    /**</span>     * Called after a new button has been created and added to the toolbar. Add any required cleanup logic here     */    afterLayout: Ext.emptyFn});</pre></body></html>
 |