2 * @class Ext.app.PortalDropZone
3 * @extends Ext.dd.DropTarget
4 * Internal class that manages drag/drop for {@link Ext.app.PortalPanel}.
6 Ext.define('Ext.app.PortalDropZone', {
7 extend: 'Ext.dd.DropTarget',
9 constructor: function(portal, cfg) {
11 Ext.dd.ScrollManager.register(portal.body);
12 Ext.app.PortalDropZone.superclass.constructor.call(this, portal.body, cfg);
13 portal.body.ddScrollConfig = this.ddScrollConfig;
23 createEvent: function(dd, e, data, col, c, pos) {
33 status: this.dropAllowed
37 notifyOver: function(dd, e, data) {
44 this.grid = this.getGrid();
47 // handle case scroll where scrollbars appear during drag
48 var cw = portal.body.dom.clientWidth;
50 // set initial client width
52 } else if (this.lastCW != cw) {
53 // client width has changed, so refresh layout & grid calcs
56 this.grid = this.getGrid();
62 cols = this.grid.columnX,
66 for (len; colIndex < len; colIndex++) {
67 colRight = cols[colIndex].x + cols[colIndex].w;
68 if (xy[0] < colRight) {
73 // no match, fix last index
78 // find insert position
79 var overPortlet, pos = 0,
82 overColumn = portal.items.getAt(colIndex),
83 portlets = overColumn.items.items,
86 len = portlets.length;
88 for (len; pos < len; pos++) {
89 overPortlet = portlets[pos];
90 h = overPortlet.el.getHeight();
93 } else if ((overPortlet.el.getY() + (h / 2)) > xy[1]) {
99 pos = (match && overPortlet ? pos : overColumn.items.getCount()) + (overSelf ? -1 : 0);
100 var overEvent = this.createEvent(dd, e, data, colIndex, overColumn, pos);
102 if (portal.fireEvent('validatedrop', overEvent) !== false && portal.fireEvent('beforedragover', overEvent) !== false) {
104 // make sure proxy width is fluid in different width columns
105 proxy.getProxy().setWidth('auto');
108 proxy.moveProxy(overPortlet.el.dom.parentNode, match ? overPortlet.el.dom : null);
110 proxy.moveProxy(overColumn.el.dom, null);
116 p: overSelf || (match && overPortlet) ? pos : false
118 this.scrollPos = portal.body.getScroll();
120 portal.fireEvent('dragover', overEvent);
121 return overEvent.status;
123 return overEvent.status;
128 notifyOut: function() {
132 notifyDrop: function(dd, e, data) {
137 var c = this.lastPos.c,
138 col = this.lastPos.col,
139 pos = this.lastPos.p,
141 dropEvent = this.createEvent(dd, e, data, col, c, pos !== false ? pos : c.items.getCount());
143 if (this.portal.fireEvent('validatedrop', dropEvent) !== false && this.portal.fireEvent('beforedrop', dropEvent) !== false) {
145 // make sure panel is visible prior to inserting so that the layout doesn't ignore it
146 panel.el.dom.style.display = '';
149 c.insert(pos, panel);
155 this.portal.fireEvent('drop', dropEvent);
157 // scroll position is lost on drop, fix it
158 var st = this.scrollPos.top;
160 var d = this.portal.body.dom;
161 setTimeout(function() {
172 // internal cache of body and column coords
173 getGrid: function() {
174 var box = this.portal.body.getBox();
176 this.portal.items.each(function(c) {
185 // unregister the dropzone from ScrollManager
187 Ext.dd.ScrollManager.unregister(this.portal.body);
188 Ext.app.PortalDropZone.superclass.unreg.call(this);