3 * Copyright(c) 2006-2010 Ext JS, Inc.
5 * http://www.extjs.com/license
7 Ext.ux.Portal = Ext.extend(Ext.Panel, {
11 defaultType : 'portalcolumn',
13 initComponent : function(){
14 Ext.ux.Portal.superclass.initComponent.call(this);
24 initEvents : function(){
25 Ext.ux.Portal.superclass.initEvents.call(this);
26 this.dd = new Ext.ux.Portal.DropZone(this, this.dropConfig);
29 beforeDestroy : function() {
33 Ext.ux.Portal.superclass.beforeDestroy.call(this);
37 Ext.reg('portal', Ext.ux.Portal);
40 Ext.ux.Portal.DropZone = function(portal, cfg){
42 Ext.dd.ScrollManager.register(portal.body);
43 Ext.ux.Portal.DropZone.superclass.constructor.call(this, portal.bwrap.dom, cfg);
44 portal.body.ddScrollConfig = this.ddScrollConfig;
47 Ext.extend(Ext.ux.Portal.DropZone, Ext.dd.DropTarget, {
55 createEvent : function(dd, e, data, col, c, pos){
65 status: this.dropAllowed
69 notifyOver : function(dd, e, data){
70 var xy = e.getXY(), portal = this.portal, px = dd.proxy;
74 this.grid = this.getGrid();
77 // handle case scroll where scrollbars appear during drag
78 var cw = portal.body.dom.clientWidth;
81 }else if(this.lastCW != cw){
84 this.grid = this.getGrid();
88 var col = 0, xs = this.grid.columnX, cmatch = false;
89 for(var len = xs.length; col < len; col++){
90 if(xy[0] < (xs[col].x + xs[col].w)){
95 // no match, fix last index
100 // find insert position
101 var p, match = false, pos = 0,
102 c = portal.items.itemAt(col),
103 items = c.items.items, overSelf = false;
105 for(var len = items.length; pos < len; pos++){
107 var h = p.el.getHeight();
111 else if((p.el.getY()+(h/2)) > xy[1]){
117 pos = (match && p ? pos : c.items.getCount()) + (overSelf ? -1 : 0);
118 var overEvent = this.createEvent(dd, e, data, col, c, pos);
120 if(portal.fireEvent('validatedrop', overEvent) !== false &&
121 portal.fireEvent('beforedragover', overEvent) !== false){
123 // make sure proxy width is fluid
124 px.getProxy().setWidth('auto');
127 px.moveProxy(p.el.dom.parentNode, match ? p.el.dom : null);
129 px.moveProxy(c.el.dom, null);
132 this.lastPos = {c: c, col: col, p: overSelf || (match && p) ? pos : false};
133 this.scrollPos = portal.body.getScroll();
135 portal.fireEvent('dragover', overEvent);
137 return overEvent.status;
139 return overEvent.status;
144 notifyOut : function(){
148 notifyDrop : function(dd, e, data){
153 var c = this.lastPos.c, col = this.lastPos.col, pos = this.lastPos.p;
155 var dropEvent = this.createEvent(dd, e, data, col, c,
156 pos !== false ? pos : c.items.getCount());
158 if(this.portal.fireEvent('validatedrop', dropEvent) !== false &&
159 this.portal.fireEvent('beforedrop', dropEvent) !== false){
161 dd.proxy.getProxy().remove();
162 dd.panel.el.dom.parentNode.removeChild(dd.panel.el.dom);
165 if(c == dd.panel.ownerCt && (c.items.items.indexOf(dd.panel) <= pos)){
168 c.insert(pos, dd.panel);
175 this.portal.fireEvent('drop', dropEvent);
177 // scroll position is lost on drop, fix it
178 var st = this.scrollPos.top;
180 var d = this.portal.body.dom;
181 setTimeout(function(){
190 // internal cache of body and column coords
191 getGrid : function(){
192 var box = this.portal.bwrap.getBox();
194 this.portal.items.each(function(c){
195 box.columnX.push({x: c.el.getX(), w: c.el.getWidth()});
200 // unregister the dropzone from ScrollManager
202 //Ext.dd.ScrollManager.unregister(this.portal.body);
203 Ext.ux.Portal.DropZone.superclass.unreg.call(this);