/** * A custom drag proxy implementation specific to {@link Ext.panel.Panel}s. This class * is primarily used internally for the Panel's drag drop implementation, and * should never need to be created directly. * @private */Ext.define('Ext.panel.Proxy', { alternateClassName: 'Ext.dd.PanelProxy', /** * @cfg {Boolean} [moveOnDrag=true] * True to move the panel to the dragged position when dropped */ moveOnDrag: true, /** * Creates new panel proxy. * @param {Ext.panel.Panel} panel The {@link Ext.panel.Panel} to proxy for * @param {Object} [config] Config object */ constructor: function(panel, config){ var me = this; /** * @property panel * @type Ext.panel.Panel */ me.panel = panel; me.id = me.panel.id +'-ddproxy'; Ext.apply(me, config); }, /** * @cfg {Boolean} insertProxy * True to insert a placeholder proxy element while dragging the panel, false to drag with no proxy. * Most Panels are not absolute positioned and therefore we need to reserve this space. */ insertProxy: true, setStatus: Ext.emptyFn, reset: Ext.emptyFn, update: Ext.emptyFn, stop: Ext.emptyFn, sync: Ext.emptyFn, /** * Gets the proxy's element * @return {Ext.dom.Element} The proxy's element */ getEl: function(){ return this.ghost.el; }, /** * Gets the proxy's ghost Panel * @return {Ext.panel.Panel} The proxy's ghost Panel */ getGhost: function(){ return this.ghost; }, /** * Gets the proxy element. This is the element that represents where the * Panel was before we started the drag operation. * @return {Ext.dom.Element} The proxy's element */ getProxy: function(){ return this.proxy; }, /** * Hides the proxy */ hide : function(){ var me = this; if (me.ghost) { if (me.proxy) { me.proxy.destroy(); delete me.proxy; } // Unghost the Panel, do not move the Panel to where the ghost was me.panel.unghost(null, me.moveOnDrag); delete me.ghost; } }, /** * Shows the proxy */ show: function(){ var me = this, panelSize; if (!me.ghost) { panelSize = me.panel.getSize(); me.panel.el.setVisibilityMode(Ext.Element.DISPLAY); me.ghost = me.panel.ghost(); if (me.insertProxy) { // bc Panels aren't absolute positioned we need to take up the space // of where the panel previously was me.proxy = me.panel.el.insertSibling({ role: 'presentation', cls: Ext.baseCSSPrefix + 'panel-dd-spacer' }); me.proxy.setSize(panelSize); } } }, /** * @private */ repair: function(xy, callback, scope) { this.hide(); Ext.callback(callback, scope || this); }, /** * Moves the proxy to a different position in the DOM. This is typically * called while dragging the Panel to keep the proxy sync'd to the Panel's * location. * @param {HTMLElement} parentNode The proxy's parent DOM node * @param {HTMLElement} [before] The sibling node before which the * proxy should be inserted. Defaults to the parent's last child if not * specified. */ moveProxy : function(parentNode, before){ if (this.proxy) { parentNode.insertBefore(this.proxy.dom, before); } }});