Portal.js
上传用户:dawnssy
上传日期:2022-08-06
资源大小:9345k
文件大小:6k
源码类别:

JavaScript

开发平台:

JavaScript

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