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

JavaScript

开发平台:

JavaScript

  1. /*!
  2.  * Ext JS Library 3.1.0
  3.  * Copyright(c) 2006-2009 Ext JS, LLC
  4.  * licensing@extjs.com
  5.  * http://www.extjs.com/license
  6.  */
  7. /**
  8.  * @class Ext.layout.ContainerLayout
  9.  * <p>The ContainerLayout class is the default layout manager delegated by {@link Ext.Container} to
  10.  * render any child Components when no <tt>{@link Ext.Container#layout layout}</tt> is configured into
  11.  * a {@link Ext.Container Container}. ContainerLayout provides the basic foundation for all other layout
  12.  * classes in Ext. It simply renders all child Components into the Container, performing no sizing or
  13.  * positioning services. To utilize a layout that provides sizing and positioning of child Components,
  14.  * specify an appropriate <tt>{@link Ext.Container#layout layout}</tt>.</p>
  15.  * <p>This class is intended to be extended or created via the <tt><b>{@link Ext.Container#layout layout}</b></tt>
  16.  * configuration property.  See <tt><b>{@link Ext.Container#layout}</b></tt> for additional details.</p>
  17.  */
  18. Ext.layout.ContainerLayout = Ext.extend(Object, {
  19.     /**
  20.      * @cfg {String} extraCls
  21.      * <p>An optional extra CSS class that will be added to the container. This can be useful for adding
  22.      * customized styles to the container or any of its children using standard CSS rules. See
  23.      * {@link Ext.Component}.{@link Ext.Component#ctCls ctCls} also.</p>
  24.      * <p><b>Note</b>: <tt>extraCls</tt> defaults to <tt>''</tt> except for the following classes
  25.      * which assign a value by default:
  26.      * <div class="mdetail-params"><ul>
  27.      * <li>{@link Ext.layout.AbsoluteLayout Absolute Layout} : <tt>'x-abs-layout-item'</tt></li>
  28.      * <li>{@link Ext.layout.Box Box Layout} : <tt>'x-box-item'</tt></li>
  29.      * <li>{@link Ext.layout.ColumnLayout Column Layout} : <tt>'x-column'</tt></li>
  30.      * </ul></div>
  31.      * To configure the above Classes with an extra CSS class append to the default.  For example,
  32.      * for ColumnLayout:<pre><code>
  33.      * extraCls: 'x-column custom-class'
  34.      * </code></pre>
  35.      * </p>
  36.      */
  37.     /**
  38.      * @cfg {Boolean} renderHidden
  39.      * True to hide each contained item on render (defaults to false).
  40.      */
  41.     /**
  42.      * A reference to the {@link Ext.Component} that is active.  For example, <pre><code>
  43.      * if(myPanel.layout.activeItem.id == 'item-1') { ... }
  44.      * </code></pre>
  45.      * <tt>activeItem</tt> only applies to layout styles that can display items one at a time
  46.      * (like {@link Ext.layout.AccordionLayout}, {@link Ext.layout.CardLayout}
  47.      * and {@link Ext.layout.FitLayout}).  Read-only.  Related to {@link Ext.Container#activeItem}.
  48.      * @type {Ext.Component}
  49.      * @property activeItem
  50.      */
  51.     // private
  52.     monitorResize:false,
  53.     // private
  54.     activeItem : null,
  55.     constructor : function(config){
  56.         Ext.apply(this, config);
  57.     },
  58.     // private
  59.     layout : function(){
  60.         var target = this.container.getLayoutTarget();
  61.         if(!(this.hasLayout || Ext.isEmpty(this.targetCls))){
  62.             target.addClass(this.targetCls)
  63.         }
  64.         this.onLayout(this.container, target);
  65.         this.container.fireEvent('afterlayout', this.container, this);
  66.         this.hasLayout = true;
  67.     },
  68.     // private
  69.     onLayout : function(ct, target){
  70.         this.renderAll(ct, target);
  71.     },
  72.     // private
  73.     isValidParent : function(c, target){
  74.         return target && c.getPositionEl().dom.parentNode == (target.dom || target);
  75.     },
  76.     // private
  77.     renderAll : function(ct, target){
  78.         var items = ct.items.items;
  79.         for(var i = 0, len = items.length; i < len; i++) {
  80.             var c = items[i];
  81.             if(c && (!c.rendered || !this.isValidParent(c, target))){
  82.                 this.renderItem(c, i, target);
  83.             }
  84.         }
  85.     },
  86.     // private
  87.     renderItem : function(c, position, target){
  88.         if(c && !c.rendered){
  89.             c.render(target, position);
  90.             this.configureItem(c, position);
  91.         }else if(c && !this.isValidParent(c, target)){
  92.             if(Ext.isNumber(position)){
  93.                 position = target.dom.childNodes[position];
  94.             }
  95.             target.dom.insertBefore(c.getPositionEl().dom, position || null);
  96.             c.container = target;
  97.             this.configureItem(c, position);
  98.         }
  99.     },
  100.     // private
  101.     configureItem: function(c, position){
  102.         if(this.extraCls){
  103.             var t = c.getPositionEl ? c.getPositionEl() : c;
  104.             t.addClass(this.extraCls);
  105.         }
  106.         // If we are forcing a layout, do so *before* we hide so elements have height/width
  107.         if(c.doLayout && this.forceLayout){
  108.             c.doLayout(false, true);
  109.         }
  110.         if (this.renderHidden && c != this.activeItem) {
  111.             c.hide();
  112.         }
  113.     },
  114.     onRemove: function(c){
  115.          if(this.activeItem == c){
  116.             delete this.activeItem;
  117.          }
  118.          if(c.rendered && this.extraCls){
  119.             var t = c.getPositionEl ? c.getPositionEl() : c;
  120.             t.removeClass(this.extraCls);
  121.         }
  122.     },
  123.     // private
  124.     onResize: function(){
  125.         var ct = this.container,
  126.             b = ct.bufferResize;
  127.         if (ct.collapsed){
  128.             return;
  129.         }
  130.         // Not having an ownerCt negates the buffering: floating and top level
  131.         // Containers (Viewport, Window, ToolTip, Menu) need to lay out ASAP.
  132.         if (b && ct.ownerCt) {
  133.             // If we do NOT already have a layout pending from an ancestor, schedule one.
  134.             // If there is a layout pending, we do nothing here.
  135.             // buffering to be deprecated soon
  136.             if (!ct.hasLayoutPending()){
  137.                 if(!this.resizeTask){
  138.                     this.resizeTask = new Ext.util.DelayedTask(this.runLayout, this);
  139.                     this.resizeBuffer = Ext.isNumber(b) ? b : 50;
  140.                 }
  141.                 ct.layoutPending = true;
  142.                 this.resizeTask.delay(this.resizeBuffer);
  143.             }
  144.         }else{
  145.             ct.doLayout(false, this.forceLayout);
  146.         }
  147.     },
  148.     // private
  149.     runLayout: function(){
  150.         var ct = this.container;
  151.         ct.doLayout();
  152.         delete ct.layoutPending;
  153.     },
  154.     // private
  155.     setContainer : function(ct){
  156.         // No longer use events to handle resize. Instead this will be handled through a direct function call.
  157.         /*
  158.         if(this.monitorResize && ct != this.container){
  159.             var old = this.container;
  160.             if(old){
  161.                 old.un(old.resizeEvent, this.onResize, this);
  162.             }
  163.             if(ct){
  164.                 ct.on(ct.resizeEvent, this.onResize, this);
  165.             }
  166.         }
  167.         */
  168.         this.container = ct;
  169.     },
  170.     // private
  171.     parseMargins : function(v){
  172.         if(Ext.isNumber(v)){
  173.             v = v.toString();
  174.         }
  175.         var ms = v.split(' ');
  176.         var len = ms.length;
  177.         if(len == 1){
  178.             ms[1] = ms[0];
  179.             ms[2] = ms[0];
  180.             ms[3] = ms[0];
  181.         }
  182.         if(len == 2){
  183.             ms[2] = ms[0];
  184.             ms[3] = ms[1];
  185.         }
  186.         if(len == 3){
  187.             ms[3] = ms[1];
  188.         }
  189.         return {
  190.             top:parseInt(ms[0], 10) || 0,
  191.             right:parseInt(ms[1], 10) || 0,
  192.             bottom:parseInt(ms[2], 10) || 0,
  193.             left:parseInt(ms[3], 10) || 0
  194.         };
  195.     },
  196.     /**
  197.      * The {@link Ext.Template Ext.Template} used by Field rendering layout classes (such as
  198.      * {@link Ext.layout.FormLayout}) to create the DOM structure of a fully wrapped,
  199.      * labeled and styled form Field. A default Template is supplied, but this may be
  200.      * overriden to create custom field structures. The template processes values returned from
  201.      * {@link Ext.layout.FormLayout#getTemplateArgs}.
  202.      * @property fieldTpl
  203.      * @type Ext.Template
  204.      */
  205.     fieldTpl: (function() {
  206.         var t = new Ext.Template(
  207.             '<div class="x-form-item {itemCls}" tabIndex="-1">',
  208.                 '<label for="{id}" style="{labelStyle}" class="x-form-item-label">{label}{labelSeparator}</label>',
  209.                 '<div class="x-form-element" id="x-form-el-{id}" style="{elementStyle}">',
  210.                 '</div><div class="{clearCls}"></div>',
  211.             '</div>'
  212.         );
  213.         t.disableFormats = true;
  214.         return t.compile();
  215.     })(),
  216.     /*
  217.      * Destroys this layout. This is a template method that is empty by default, but should be implemented
  218.      * by subclasses that require explicit destruction to purge event handlers or remove DOM nodes.
  219.      * @protected
  220.      */
  221.     destroy : function(){
  222.         if(!Ext.isEmpty(this.targetCls)){
  223.             var target = this.container.getLayoutTarget();
  224.             if(target){
  225.                 target.removeClass(this.targetCls);
  226.             }
  227.         }
  228.     }
  229. });
  230. Ext.Container.LAYOUTS['auto'] = Ext.layout.ContainerLayout;