/**
* @class Ext.panel.Proxy
* @extends Object
* 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.
* @constructor
* @param panel The {@link Ext.panel.Panel} to proxy for
* @param config Configuration options
*/
Ext.define('Ext.panel.Proxy', {
alternateClassName: 'Ext.dd.PanelProxy',
constructor: function(panel, config){
/**
* @property panel
* @type Ext.panel.Panel
*/
this.panel = panel;
this.id = this.panel.id +'-ddproxy';
Ext.apply(this, config);
},
/**
* @cfg {Boolean} insertProxy True to insert a placeholder proxy element
* while dragging the panel, false to drag with no proxy (defaults to true).
* Most Panels are not absolute positioned and therefore we need to reserve
* this space.
*/
insertProxy: true,
// private overrides
setStatus: Ext.emptyFn,
reset: Ext.emptyFn,
update: Ext.emptyFn,
stop: Ext.emptyFn,
sync: Ext.emptyFn,
/**
* Gets the proxy's element
* @return {Element} The proxy's element
*/
getEl: function(){
return this.ghost.el;
},
/**
* Gets the proxy's ghost Panel
* @return {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 {Element} The proxy's element
*/
getProxy: function(){
return this.proxy;
},
/**
* Hides the proxy
*/
hide : function(){
if (this.ghost) {
if (this.proxy) {
this.proxy.remove();
delete this.proxy;
}
// Unghost the Panel, do not move the Panel to where the ghost was
this.panel.unghost(null, false);
delete this.ghost;
}
},
/**
* Shows the proxy
*/
show: function(){
if (!this.ghost) {
var panelSize = this.panel.getSize();
this.panel.el.setVisibilityMode(Ext.core.Element.DISPLAY);
this.ghost = this.panel.ghost();
if (this.insertProxy) {
// bc Panels aren't absolute positioned we need to take up the space
// of where the panel previously was
this.proxy = this.panel.el.insertSibling({cls: Ext.baseCSSPrefix + 'panel-dd-spacer'});
this.proxy.setSize(panelSize);
}
}
},
// private
repair: function(xy, callback, scope) {
this.hide();
if (typeof callback == "function") {
callback.call(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 (optional) 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);
}
}
});