portal.html (Case Conflict 1)
上传用户:shuoshiled
上传日期:2018-01-28
资源大小:10124k
文件大小:6k
源码类别:

中间件编程

开发平台:

JavaScript

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