GroupTab.js
上传用户:shuoshiled
上传日期:2018-01-28
资源大小:10124k
文件大小:8k
源码类别:

中间件编程

开发平台:

JavaScript

  1. /*!  * Ext JS Library 3.0.0  * Copyright(c) 2006-2009 Ext JS, LLC  * licensing@extjs.com  * http://www.extjs.com/license  */ Ext.ux.GroupTab = Ext.extend(Ext.Container, {
  2.     mainItem: 0,
  3.     
  4.     expanded: true,
  5.     
  6.     deferredRender: true,
  7.     
  8.     activeTab: null,
  9.     
  10.     idDelimiter: '__',
  11.     
  12.     headerAsText: false,
  13.     
  14.     frame: false,
  15.     
  16.     hideBorders: true,
  17.     
  18.     initComponent: function(config){
  19.         Ext.apply(this, config);
  20.         this.frame = false;
  21.         
  22.         Ext.ux.GroupTab.superclass.initComponent.call(this);
  23.         
  24.         this.addEvents('activate', 'deactivate', 'changemainitem', 'beforetabchange', 'tabchange');
  25.         
  26.         this.setLayout(new Ext.layout.CardLayout({
  27.             deferredRender: this.deferredRender
  28.         }));
  29.         
  30.         if (!this.stack) {
  31.             this.stack = Ext.TabPanel.AccessStack();
  32.         }
  33.         
  34.         this.initItems();
  35.         
  36.         this.on('beforerender', function(){
  37.             this.groupEl = this.ownerCt.getGroupEl(this);
  38.         }, this);
  39.         
  40.         this.on('add', this.onAdd, this, {
  41.             target: this
  42.         });
  43.         this.on('remove', this.onRemove, this, {
  44.             target: this
  45.         });
  46.         
  47.         if (this.mainItem !== undefined) {
  48.             var item = (typeof this.mainItem == 'object') ? this.mainItem : this.items.get(this.mainItem);
  49.             delete this.mainItem;
  50.             this.setMainItem(item);
  51.         }
  52.     },
  53.     
  54.     /**
  55.      * Sets the specified tab as the active tab. This method fires the {@link #beforetabchange} event which
  56.      * can return false to cancel the tab change.
  57.      * @param {String/Panel} tab The id or tab Panel to activate
  58.      */
  59.     setActiveTab : function(item){
  60.         item = this.getComponent(item);
  61.         if(!item || this.fireEvent('beforetabchange', this, item, this.activeTab) === false){
  62.             return;
  63.         }
  64.         if(!this.rendered){
  65.             this.activeTab = item;
  66.             return;
  67.         }
  68.         if(this.activeTab != item){
  69.             if(this.activeTab && this.activeTab != this.mainItem){
  70.                 var oldEl = this.getTabEl(this.activeTab);
  71.                 if(oldEl){
  72.                     Ext.fly(oldEl).removeClass('x-grouptabs-strip-active');
  73.                 }
  74.                 this.activeTab.fireEvent('deactivate', this.activeTab);
  75.             }
  76.             var el = this.getTabEl(item);
  77.             Ext.fly(el).addClass('x-grouptabs-strip-active');
  78.             this.activeTab = item;
  79.             this.stack.add(item);
  80.             this.layout.setActiveItem(item);
  81.             if(this.layoutOnTabChange && item.doLayout){
  82.                 item.doLayout();
  83.             }
  84.             if(this.scrolling){
  85.                 this.scrollToTab(item, this.animScroll);
  86.             }
  87.             item.fireEvent('activate', item);
  88.             this.fireEvent('tabchange', this, item);
  89.         }
  90.     },
  91.     
  92.     getTabEl: function(item){
  93.         if (item == this.mainItem) {
  94.             return this.groupEl;
  95.         }
  96.         return Ext.TabPanel.prototype.getTabEl.call(this, item);
  97.     },
  98.     
  99.     onRender: function(ct, position){
  100.         Ext.ux.GroupTab.superclass.onRender.call(this, ct, position);
  101.         
  102.         this.strip = Ext.fly(this.groupEl).createChild({
  103.             tag: 'ul',
  104.             cls: 'x-grouptabs-sub'
  105.         });
  106.         this.tooltip = new Ext.ToolTip({
  107.            target: this.groupEl,
  108.            delegate: 'a.x-grouptabs-text',
  109.            trackMouse: true,
  110.            renderTo: document.body,
  111.            listeners: {
  112.                beforeshow: function(tip) {
  113.                    var item = (tip.triggerElement.parentNode === this.mainItem.tabEl)
  114.                        ? this.mainItem
  115.                        : this.findById(tip.triggerElement.parentNode.id.split(this.idDelimiter)[1]);
  116.                    if(!item.tabTip) {
  117.                        return false;
  118.                    }
  119.                    tip.body.dom.innerHTML = item.tabTip;
  120.                },
  121.                scope: this
  122.            }
  123.         });
  124.                 
  125.         if (!this.itemTpl) {
  126.             var tt = new Ext.Template('<li class="{cls}" id="{id}">', '<a onclick="return false;" class="x-grouptabs-text {iconCls}">{text}</a>', '</li>');
  127.             tt.disableFormats = true;
  128.             tt.compile();
  129.             Ext.ux.GroupTab.prototype.itemTpl = tt;
  130.         }
  131.         
  132.         this.items.each(this.initTab, this);
  133.     },
  134.     
  135.     afterRender: function(){
  136.         Ext.ux.GroupTab.superclass.afterRender.call(this);
  137.         
  138.         if (this.activeTab !== undefined) {
  139.             var item = (typeof this.activeTab == 'object') ? this.activeTab : this.items.get(this.activeTab);
  140.             delete this.activeTab;
  141.             this.setActiveTab(item);
  142.         }
  143.     },
  144.     
  145.     // private
  146.     initTab: function(item, index){
  147.         var before = this.strip.dom.childNodes[index];
  148.         var p = Ext.TabPanel.prototype.getTemplateArgs.call(this, item);
  149.         
  150.         if (item === this.mainItem) {
  151.             item.tabEl = this.groupEl;
  152.             p.cls += ' x-grouptabs-main-item';
  153.         }
  154.         
  155.         var el = before ? this.itemTpl.insertBefore(before, p) : this.itemTpl.append(this.strip, p);
  156.         
  157.         item.tabEl = item.tabEl || el;
  158.                 
  159.         item.on('disable', this.onItemDisabled, this);
  160.         item.on('enable', this.onItemEnabled, this);
  161.         item.on('titlechange', this.onItemTitleChanged, this);
  162.         item.on('iconchange', this.onItemIconChanged, this);
  163.         item.on('beforeshow', this.onBeforeShowItem, this);
  164.     },
  165.     
  166.     setMainItem: function(item){
  167.         item = this.getComponent(item);
  168.         if (!item || this.fireEvent('changemainitem', this, item, this.mainItem) === false) {
  169.             return;
  170.         }
  171.         
  172.         this.mainItem = item;
  173.     },
  174.     
  175.     getMainItem: function(){
  176.         return this.mainItem || null;
  177.     },
  178.     
  179.     // private
  180.     onBeforeShowItem: function(item){
  181.         if (item != this.activeTab) {
  182.             this.setActiveTab(item);
  183.             return false;
  184.         }
  185.     },
  186.     
  187.     // private
  188.     onAdd: function(gt, item, index){
  189.         if (this.rendered) {
  190.             this.initTab.call(this, item, index);
  191.         }
  192.     },
  193.     
  194.     // private
  195.     onRemove: function(tp, item){
  196.         Ext.destroy(Ext.get(this.getTabEl(item)));
  197.         this.stack.remove(item);
  198.         item.un('disable', this.onItemDisabled, this);
  199.         item.un('enable', this.onItemEnabled, this);
  200.         item.un('titlechange', this.onItemTitleChanged, this);
  201.         item.un('iconchange', this.onItemIconChanged, this);
  202.         item.un('beforeshow', this.onBeforeShowItem, this);
  203.         if (item == this.activeTab) {
  204.             var next = this.stack.next();
  205.             if (next) {
  206.                 this.setActiveTab(next);
  207.             }
  208.             else if (this.items.getCount() > 0) {
  209.                 this.setActiveTab(0);
  210.             }
  211.             else {
  212.                 this.activeTab = null;
  213.             }
  214.         }
  215.     },
  216.     
  217.     // private
  218.     onBeforeAdd: function(item){
  219.         var existing = item.events ? (this.items.containsKey(item.getItemId()) ? item : null) : this.items.get(item);
  220.         if (existing) {
  221.             this.setActiveTab(item);
  222.             return false;
  223.         }
  224.         Ext.TabPanel.superclass.onBeforeAdd.apply(this, arguments);
  225.         var es = item.elements;
  226.         item.elements = es ? es.replace(',header', '') : es;
  227.         item.border = (item.border === true);
  228.     },
  229.     
  230.     // private
  231.     onItemDisabled: Ext.TabPanel.prototype.onItemDisabled,
  232.     onItemEnabled: Ext.TabPanel.prototype.onItemEnabled,
  233.     
  234.     // private
  235.     onItemTitleChanged: function(item){
  236.         var el = this.getTabEl(item);
  237.         if (el) {
  238.             Ext.fly(el).child('a.x-grouptabs-text', true).innerHTML = item.title;
  239.         }
  240.     },
  241.     
  242.     //private
  243.     onItemIconChanged: function(item, iconCls, oldCls){
  244.         var el = this.getTabEl(item);
  245.         if (el) {
  246.             Ext.fly(el).child('a.x-grouptabs-text').replaceClass(oldCls, iconCls);
  247.         }
  248.     },
  249.     
  250.     beforeDestroy: function(){
  251.         Ext.TabPanel.prototype.beforeDestroy.call(this);
  252.         this.tooltip.destroy();
  253.     }
  254. });
  255. Ext.reg('grouptab', Ext.ux.GroupTab);