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

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.ns('Ext.ux');
  2. Ext.ux.GroupTabPanel = Ext.extend(Ext.TabPanel, {
  3.     tabPosition: 'left',
  4.     
  5.     alternateColor: false,
  6.     
  7.     alternateCls: 'x-grouptabs-panel-alt',
  8.     
  9.     defaultType: 'grouptab',
  10.     
  11.     deferredRender: false,
  12.     
  13.     activeGroup : null,
  14.     
  15.     initComponent: function(){
  16.         Ext.ux.GroupTabPanel.superclass.initComponent.call(this);
  17.         
  18.         this.addEvents(
  19.             'beforegroupchange',
  20.             'groupchange'
  21.         );
  22.         this.elements = 'body,header';
  23.         this.stripTarget = 'header';
  24.         
  25.         this.tabPosition = this.tabPosition == 'right' ? 'right' : 'left';
  26.         
  27.         this.addClass('x-grouptabs-panel');
  28.         
  29.         if (this.tabStyle && this.tabStyle != '') {
  30.             this.addClass('x-grouptabs-panel-' + this.tabStyle);
  31.         }
  32.         
  33.         if (this.alternateColor) {
  34.             this.addClass(this.alternateCls);
  35.         }
  36.         
  37.         this.on('beforeadd', function(gtp, item, index){
  38.             this.initGroup(item, index);
  39.         });      
  40.     },
  41.     
  42.     initEvents : function() {
  43.         this.mon(this.strip, 'mousedown', this.onStripMouseDown, this);
  44.     },
  45.         
  46.     onRender: function(ct, position){
  47.         Ext.TabPanel.superclass.onRender.call(this, ct, position);
  48.         if(this.plain){
  49.             var pos = this.tabPosition == 'top' ? 'header' : 'footer';
  50.             this[pos].addClass('x-tab-panel-'+pos+'-plain');
  51.         }
  52.         var st = this[this.stripTarget];
  53.         this.stripWrap = st.createChild({cls:'x-tab-strip-wrap ', cn:{
  54.             tag:'ul', cls:'x-grouptabs-strip x-grouptabs-tab-strip-'+this.tabPosition}});
  55.         var beforeEl = (this.tabPosition=='bottom' ? this.stripWrap : null);
  56.         this.strip = new Ext.Element(this.stripWrap.dom.firstChild);
  57. this.header.addClass('x-grouptabs-panel-header');
  58. this.bwrap.addClass('x-grouptabs-bwrap');
  59.         this.body.addClass('x-tab-panel-body-'+this.tabPosition + ' x-grouptabs-panel-body');
  60.         if (!this.groupTpl) {
  61.             var tt = new Ext.Template(
  62.                 '<li class="{cls}" id="{id}">', 
  63.                 '<a class="x-grouptabs-expand" onclick="return false;"></a>', 
  64.                 '<a class="x-grouptabs-text {iconCls}" href="#" onclick="return false;">',
  65.                 '<span>{text}</span></a>', 
  66.                 '</li>'
  67.             );
  68.             tt.disableFormats = true;
  69.             tt.compile();
  70.             Ext.ux.GroupTabPanel.prototype.groupTpl = tt;
  71.         }
  72.         this.items.each(this.initGroup, this);
  73.     },
  74.     
  75.     afterRender: function(){
  76.         Ext.ux.GroupTabPanel.superclass.afterRender.call(this);
  77.         
  78.         this.tabJoint = Ext.fly(this.body.dom.parentNode).createChild({
  79.             cls: 'x-tab-joint'
  80.         });
  81.         
  82.         this.addClass('x-tab-panel-' + this.tabPosition);
  83.         this.header.setWidth(this.tabWidth);
  84.         
  85.         if (this.activeGroup !== undefined) {
  86.             var group = (typeof this.activeGroup == 'object') ? this.activeGroup : this.items.get(this.activeGroup);
  87.             delete this.activeGroup;
  88.             this.setActiveGroup(group);
  89.             group.setActiveTab(group.getMainItem());
  90.         }
  91.     },
  92.     getGroupEl : Ext.TabPanel.prototype.getTabEl,
  93.         
  94.     // private
  95.     findTargets: function(e){
  96.         var item = null,
  97.             itemEl = e.getTarget('li', this.strip);
  98.         if (itemEl) {
  99.             item = this.findById(itemEl.id.split(this.idDelimiter)[1]);
  100.             if (item.disabled) {
  101.                 return {
  102.                     expand: null,
  103.                     item: null,
  104.                     el: null
  105.                 };
  106.             }
  107.         }
  108.         return {
  109.             expand: e.getTarget('.x-grouptabs-expand', this.strip),
  110.             isGroup: !e.getTarget('ul.x-grouptabs-sub', this.strip),
  111.             item: item,
  112.             el: itemEl
  113.         };
  114.     },
  115.     
  116.     // private
  117.     onStripMouseDown: function(e){
  118.         if (e.button != 0) {
  119.             return;
  120.         }
  121.         e.preventDefault();
  122.         var t = this.findTargets(e);
  123.         if (t.expand) {
  124.             this.toggleGroup(t.el);
  125.         }
  126.         else if (t.item) {
  127.             if(t.isGroup) {
  128.                 t.item.setActiveTab(t.item.getMainItem());
  129.             }
  130.             else {
  131.                 t.item.ownerCt.setActiveTab(t.item);
  132.             }
  133.         }
  134.     },
  135.     
  136.     expandGroup: function(groupEl){
  137.         if(groupEl.isXType) {
  138.             groupEl = this.getGroupEl(groupEl);
  139.         }
  140.         Ext.fly(groupEl).addClass('x-grouptabs-expanded');
  141. this.syncTabJoint();
  142.     },
  143.     
  144.     toggleGroup: function(groupEl){
  145.         if(groupEl.isXType) {
  146.             groupEl = this.getGroupEl(groupEl);
  147.         }        
  148.         Ext.fly(groupEl).toggleClass('x-grouptabs-expanded');
  149. this.syncTabJoint();
  150.     },    
  151.     collapseGroup: function(groupEl){
  152.         if(groupEl.isXType) {
  153.             groupEl = this.getGroupEl(groupEl);
  154.         }
  155.         Ext.fly(groupEl).removeClass('x-grouptabs-expanded');
  156. this.syncTabJoint();
  157.     },
  158.         
  159.     syncTabJoint: function(groupEl){
  160.         if (!this.tabJoint) {
  161.             return;
  162.         }
  163.         
  164.         groupEl = groupEl || this.getGroupEl(this.activeGroup);
  165.         if(groupEl) {
  166.             this.tabJoint.setHeight(Ext.fly(groupEl).getHeight() - 2); 
  167.             var y = Ext.isGecko2 ? 0 : 1;
  168.             if (this.tabPosition == 'left'){
  169.                 this.tabJoint.alignTo(groupEl, 'tl-tr', [-2,y]);
  170.             }
  171.             else {
  172.                 this.tabJoint.alignTo(groupEl, 'tr-tl', [1,y]);
  173.             }           
  174.         }
  175.         else {
  176.             this.tabJoint.hide();
  177.         }
  178.     },
  179.     
  180.     getActiveTab : function() {
  181.         if(!this.activeGroup) return null;
  182.         return this.activeGroup.getTabEl(this.activeGroup.activeTab) || null;  
  183.     },
  184.     
  185.     onResize: function(){
  186.         Ext.ux.GroupTabPanel.superclass.onResize.apply(this, arguments);
  187.         this.syncTabJoint();
  188.     },
  189.     
  190.     createCorner: function(el, pos){
  191.         return Ext.fly(el).createChild({
  192.             cls: 'x-grouptabs-corner x-grouptabs-corner-' + pos
  193.         });
  194.     },
  195.     
  196.     initGroup: function(group, index){
  197.         var before = this.strip.dom.childNodes[index],   
  198.             p = this.getTemplateArgs(group);
  199.         if (index === 0) {
  200.             p.cls += ' x-tab-first';
  201.         }
  202.         p.cls += ' x-grouptabs-main';
  203.         p.text = group.getMainItem().title;
  204.         
  205.         var el = before ? this.groupTpl.insertBefore(before, p) : this.groupTpl.append(this.strip, p),
  206.             tl = this.createCorner(el, 'top-' + this.tabPosition),
  207.             bl = this.createCorner(el, 'bottom-' + this.tabPosition);
  208.         group.tabEl = el;
  209.         if (group.expanded) {
  210.             this.expandGroup(el);
  211.         }
  212.         if (Ext.isIE6 || (Ext.isIE && !Ext.isStrict)){
  213.             bl.setLeft('-10px');
  214.             bl.setBottom('-5px');
  215.             tl.setLeft('-10px');
  216.             tl.setTop('-5px');
  217.         }
  218.         this.mon(group, {
  219.             scope: this,
  220.             changemainitem: this.onGroupChangeMainItem,
  221.             beforetabchange: this.onGroupBeforeTabChange
  222.         });
  223.     },
  224.     
  225.     setActiveGroup : function(group) {
  226.         group = this.getComponent(group);
  227.         if(!group){
  228.             return false;
  229.         }
  230.         if(!this.rendered){
  231.             this.activeGroup = group;
  232.             return true;
  233.         }
  234.         if(this.activeGroup != group && this.fireEvent('beforegroupchange', this, group, this.activeGroup) !== false){
  235.             if(this.activeGroup){
  236.                 var oldEl = this.getGroupEl(this.activeGroup);
  237.                 if(oldEl){
  238.                     Ext.fly(oldEl).removeClass('x-grouptabs-strip-active');
  239.                 }
  240.             }
  241.             var groupEl = this.getGroupEl(group);
  242.             Ext.fly(groupEl).addClass('x-grouptabs-strip-active');
  243.                         
  244.             this.activeGroup = group;
  245.             this.stack.add(group);
  246.             this.layout.setActiveItem(group);
  247.             this.syncTabJoint(groupEl);
  248.             this.fireEvent('groupchange', this, group);
  249.             return true;
  250.         }
  251.         return false; 
  252.     },
  253.     
  254.     onGroupBeforeTabChange: function(group, newTab, oldTab){
  255.         if(group !== this.activeGroup || newTab !== oldTab) {
  256.             this.strip.select('.x-grouptabs-sub > li.x-grouptabs-strip-active', true).removeClass('x-grouptabs-strip-active');
  257.         } 
  258.         this.expandGroup(this.getGroupEl(group));
  259.         if(group !== this.activeGroup) {
  260.             return this.setActiveGroup(group);
  261.         }        
  262.     },
  263.     
  264.     getFrameHeight: function(){
  265.         var h = this.el.getFrameWidth('tb');
  266.         h += (this.tbar ? this.tbar.getHeight() : 0) +
  267.         (this.bbar ? this.bbar.getHeight() : 0);
  268.         
  269.         return h;
  270.     },
  271.     
  272.     adjustBodyWidth: function(w){
  273.         return w - this.tabWidth;
  274.     }
  275. });
  276. Ext.reg('grouptabpanel', Ext.ux.GroupTabPanel);