source: trunk/web/addons/job_monarch/lib/extjs/examples/portal/Portal.js @ 619

Last change on this file since 619 was 619, checked in by ramonb, 15 years ago

lib/:

  • added new AJAX dependancies: ExtJS, pChart, Lightbox2
File size: 5.8 KB
Line 
1/*
2 * Ext JS Library 2.2.1
3 * Copyright(c) 2006-2009, Ext JS, LLC.
4 * licensing@extjs.com
5 *
6 * http://extjs.com/license
7 */
8
9Ext.ux.Portal = Ext.extend(Ext.Panel, {
10    layout: 'column',
11    autoScroll:true,
12    cls:'x-portal',
13    defaultType: 'portalcolumn',
14   
15    initComponent : function(){
16        Ext.ux.Portal.superclass.initComponent.call(this);
17        this.addEvents({
18            validatedrop:true,
19            beforedragover:true,
20            dragover:true,
21            beforedrop:true,
22            drop:true
23        });
24    },
25
26    initEvents : function(){
27        Ext.ux.Portal.superclass.initEvents.call(this);
28        this.dd = new Ext.ux.Portal.DropZone(this, this.dropConfig);
29    },
30   
31    beforeDestroy: function() {
32        if(this.dd){
33            this.dd.unreg();
34        }
35        Ext.ux.Portal.superclass.beforeDestroy.call(this);
36    }
37});
38Ext.reg('portal', Ext.ux.Portal);
39
40
41Ext.ux.Portal.DropZone = function(portal, cfg){
42    this.portal = portal;
43    Ext.dd.ScrollManager.register(portal.body);
44    Ext.ux.Portal.DropZone.superclass.constructor.call(this, portal.bwrap.dom, cfg);
45    portal.body.ddScrollConfig = this.ddScrollConfig;
46};
47
48Ext.extend(Ext.ux.Portal.DropZone, Ext.dd.DropTarget, {
49    ddScrollConfig : {
50        vthresh: 50,
51        hthresh: -1,
52        animate: true,
53        increment: 200
54    },
55
56    createEvent : function(dd, e, data, col, c, pos){
57        return {
58            portal: this.portal,
59            panel: data.panel,
60            columnIndex: col,
61            column: c,
62            position: pos,
63            data: data,
64            source: dd,
65            rawEvent: e,
66            status: this.dropAllowed
67        };
68    },
69
70    notifyOver : function(dd, e, data){
71        var xy = e.getXY(), portal = this.portal, px = dd.proxy;
72
73        // case column widths
74        if(!this.grid){
75            this.grid = this.getGrid();
76        }
77
78        // handle case scroll where scrollbars appear during drag
79        var cw = portal.body.dom.clientWidth;
80        if(!this.lastCW){
81            this.lastCW = cw;
82        }else if(this.lastCW != cw){
83            this.lastCW = cw;
84            portal.doLayout();
85            this.grid = this.getGrid();
86        }
87
88        // determine column
89        var col = 0, xs = this.grid.columnX, cmatch = false;
90        for(var len = xs.length; col < len; col++){
91            if(xy[0] < (xs[col].x + xs[col].w)){
92                cmatch = true;
93                break;
94            }
95        }
96        // no match, fix last index
97        if(!cmatch){
98            col--;
99        }
100
101        // find insert position
102        var p, match = false, pos = 0,
103            c = portal.items.itemAt(col),
104            items = c.items.items, overSelf = false;
105
106        for(var len = items.length; pos < len; pos++){
107            p = items[pos];
108            var h = p.el.getHeight();
109            if(h === 0){
110                overSelf = true;
111            }
112            else if((p.el.getY()+(h/2)) > xy[1]){
113                match = true;
114                break;
115            }
116        }
117
118        pos = (match && p ? pos : c.items.getCount()) + (overSelf ? -1 : 0);
119        var overEvent = this.createEvent(dd, e, data, col, c, pos);
120
121        if(portal.fireEvent('validatedrop', overEvent) !== false &&
122           portal.fireEvent('beforedragover', overEvent) !== false){
123
124            // make sure proxy width is fluid
125            px.getProxy().setWidth('auto');
126
127            if(p){
128                px.moveProxy(p.el.dom.parentNode, match ? p.el.dom : null);
129            }else{
130                px.moveProxy(c.el.dom, null);
131            }
132
133            this.lastPos = {c: c, col: col, p: overSelf || (match && p) ? pos : false};
134            this.scrollPos = portal.body.getScroll();
135
136            portal.fireEvent('dragover', overEvent);
137
138            return overEvent.status;
139        }else{
140            return overEvent.status;
141        }
142
143    },
144
145    notifyOut : function(){
146        delete this.grid;
147    },
148
149    notifyDrop : function(dd, e, data){
150        delete this.grid;
151        if(!this.lastPos){
152            return;
153        }
154        var c = this.lastPos.c, col = this.lastPos.col, pos = this.lastPos.p;
155
156        var dropEvent = this.createEvent(dd, e, data, col, c,
157            pos !== false ? pos : c.items.getCount());
158
159        if(this.portal.fireEvent('validatedrop', dropEvent) !== false &&
160           this.portal.fireEvent('beforedrop', dropEvent) !== false){
161
162            dd.proxy.getProxy().remove();
163            dd.panel.el.dom.parentNode.removeChild(dd.panel.el.dom);
164           
165            if(pos !== false){
166                if(c == dd.panel.ownerCt && (c.items.items.indexOf(dd.panel) <= pos)){
167                    pos++;
168                }
169                c.insert(pos, dd.panel);
170            }else{
171                c.add(dd.panel);
172            }
173           
174            c.doLayout();
175
176            this.portal.fireEvent('drop', dropEvent);
177
178            // scroll position is lost on drop, fix it
179            var st = this.scrollPos.top;
180            if(st){
181                var d = this.portal.body.dom;
182                setTimeout(function(){
183                    d.scrollTop = st;
184                }, 10);
185            }
186
187        }
188        delete this.lastPos;
189    },
190
191    // internal cache of body and column coords
192    getGrid : function(){
193        var box = this.portal.bwrap.getBox();
194        box.columnX = [];
195        this.portal.items.each(function(c){
196             box.columnX.push({x: c.el.getX(), w: c.el.getWidth()});
197        });
198        return box;
199    },
200
201    // unregister the dropzone from ScrollManager
202    unreg: function() {
203        //Ext.dd.ScrollManager.unregister(this.portal.body);
204        Ext.ux.Portal.DropZone.superclass.unreg.call(this);
205    }
206});
Note: See TracBrowser for help on using the repository browser.