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

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.ToolbarLayout
  9.  * @extends Ext.layout.ContainerLayout
  10.  * Layout manager implicitly used by Ext.Toolbar.
  11.  */
  12. Ext.layout.ToolbarLayout = Ext.extend(Ext.layout.ContainerLayout, {
  13.     monitorResize : true,
  14.     triggerWidth : 18,
  15.     lastOverflow : false,
  16.     forceLayout: true,
  17.     noItemsMenuText : '<div class="x-toolbar-no-items">(None)</div>',
  18.     // private
  19.     onLayout : function(ct, target){
  20.         if(!this.leftTr){
  21.             var align = ct.buttonAlign == 'center' ? 'center' : 'left';
  22.             target.addClass('x-toolbar-layout-ct');
  23.             target.insertHtml('beforeEnd',
  24.                  '<table cellspacing="0" class="x-toolbar-ct"><tbody><tr><td class="x-toolbar-left" align="' + align + '"><table cellspacing="0"><tbody><tr class="x-toolbar-left-row"></tr></tbody></table></td><td class="x-toolbar-right" align="right"><table cellspacing="0" class="x-toolbar-right-ct"><tbody><tr><td><table cellspacing="0"><tbody><tr class="x-toolbar-right-row"></tr></tbody></table></td><td><table cellspacing="0"><tbody><tr class="x-toolbar-extras-row"></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table>');
  25.             this.leftTr = target.child('tr.x-toolbar-left-row', true);
  26.             this.rightTr = target.child('tr.x-toolbar-right-row', true);
  27.             this.extrasTr = target.child('tr.x-toolbar-extras-row', true);
  28.         }
  29.         var side = ct.buttonAlign == 'right' ? this.rightTr : this.leftTr,
  30.             pos = 0,
  31.             items = ct.items.items;
  32.         for(var i = 0, len = items.length, c; i < len; i++, pos++) {
  33.             c = items[i];
  34.             if(c.isFill){
  35.                 side = this.rightTr;
  36.                 pos = -1;
  37.             }else if(!c.rendered){
  38.                 c.render(this.insertCell(c, side, pos));
  39.             }else{
  40.                 if(!c.xtbHidden && !this.isValidParent(c, side.childNodes[pos])){
  41.                     var td = this.insertCell(c, side, pos);
  42.                     td.appendChild(c.getPositionEl().dom);
  43.                     c.container = Ext.get(td);
  44.                 }
  45.             }
  46.         }
  47.         //strip extra empty cells
  48.         this.cleanup(this.leftTr);
  49.         this.cleanup(this.rightTr);
  50.         this.cleanup(this.extrasTr);
  51.         this.fitToSize(target);
  52.     },
  53.     cleanup : function(row){
  54.         var cn = row.childNodes;
  55.         for(var i = cn.length-1, c; i >= 0 && (c = cn[i]); i--){
  56.             if(!c.firstChild){
  57.                 row.removeChild(c);
  58.             }
  59.         }
  60.     },
  61.     insertCell : function(c, side, pos){
  62.         var td = document.createElement('td');
  63.         td.className='x-toolbar-cell';
  64.         side.insertBefore(td, side.childNodes[pos]||null);
  65.         return td;
  66.     },
  67.     hideItem : function(item){
  68.         var h = (this.hiddens = this.hiddens || []);
  69.         h.push(item);
  70.         item.xtbHidden = true;
  71.         item.xtbWidth = item.getPositionEl().dom.parentNode.offsetWidth;
  72.         item.hide();
  73.     },
  74.     unhideItem : function(item){
  75.         item.show();
  76.         item.xtbHidden = false;
  77.         this.hiddens.remove(item);
  78.         if(this.hiddens.length < 1){
  79.             delete this.hiddens;
  80.         }
  81.     },
  82.     getItemWidth : function(c){
  83.         return c.hidden ? (c.xtbWidth || 0) : c.getPositionEl().dom.parentNode.offsetWidth;
  84.     },
  85.     fitToSize : function(t){
  86.         if(this.container.enableOverflow === false){
  87.             return;
  88.         }
  89.         var w = t.dom.clientWidth,
  90.             lw = this.lastWidth || 0,
  91.             iw = t.dom.firstChild.offsetWidth,
  92.             clipWidth = w - this.triggerWidth,
  93.             hideIndex = -1;
  94.         this.lastWidth = w;
  95.         if(iw > w || (this.hiddens && w >= lw)){
  96.             var i, items = this.container.items.items,
  97.                 len = items.length, c,
  98.                 loopWidth = 0;
  99.             for(i = 0; i < len; i++) {
  100.                 c = items[i];
  101.                 if(!c.isFill){
  102.                     loopWidth += this.getItemWidth(c);
  103.                     if(loopWidth > clipWidth){
  104.                         if(!(c.hidden || c.xtbHidden)){
  105.                             this.hideItem(c);
  106.                         }
  107.                     }else if(c.xtbHidden){
  108.                         this.unhideItem(c);
  109.                     }
  110.                 }
  111.             }
  112.         }
  113.         if(this.hiddens){
  114.             this.initMore();
  115.             if(!this.lastOverflow){
  116.                 this.container.fireEvent('overflowchange', this.container, true);
  117.                 this.lastOverflow = true;
  118.             }
  119.         }else if(this.more){
  120.             this.clearMenu();
  121.             this.more.destroy();
  122.             delete this.more;
  123.             if(this.lastOverflow){
  124.                 this.container.fireEvent('overflowchange', this.container, false);
  125.                 this.lastOverflow = false;
  126.             }
  127.         }
  128.     },
  129.     createMenuConfig : function(c, hideOnClick){
  130.         var cfg = Ext.apply({}, c.initialConfig),
  131.             group = c.toggleGroup;
  132.         Ext.apply(cfg, {
  133.             text: c.overflowText || c.text,
  134.             iconCls: c.iconCls,
  135.             icon: c.icon,
  136.             itemId: c.itemId,
  137.             disabled: c.disabled,
  138.             handler: c.handler,
  139.             scope: c.scope,
  140.             menu: c.menu,
  141.             hideOnClick: hideOnClick
  142.         });
  143.         if(group || c.enableToggle){
  144.             Ext.apply(cfg, {
  145.                 group: group,
  146.                 checked: c.pressed,
  147.                 listeners: {
  148.                     checkchange: function(item, checked){
  149.                         c.toggle(checked);
  150.                     }
  151.                 }
  152.             });
  153.         }
  154.         delete cfg.ownerCt;
  155.         delete cfg.xtype;
  156.         delete cfg.id;
  157.         return cfg;
  158.     },
  159.     // private
  160.     addComponentToMenu : function(m, c){
  161.         if(c instanceof Ext.Toolbar.Separator){
  162.             m.add('-');
  163.         }else if(Ext.isFunction(c.isXType)){
  164.             if(c.isXType('splitbutton')){
  165.                 m.add(this.createMenuConfig(c, true));
  166.             }else if(c.isXType('button')){
  167.                 m.add(this.createMenuConfig(c, !c.menu));
  168.             }else if(c.isXType('buttongroup')){
  169.                 c.items.each(function(item){
  170.                      this.addComponentToMenu(m, item);
  171.                 }, this);
  172.             }
  173.         }
  174.     },
  175.     clearMenu : function(){
  176.         var m = this.moreMenu;
  177.         if(m && m.items){
  178.             m.items.each(function(item){
  179.                 delete item.menu;
  180.             });
  181.         }
  182.     },
  183.     // private
  184.     beforeMoreShow : function(m){
  185.         var h = this.container.items.items,
  186.             len = h.length,
  187.             c,
  188.             prev,
  189.             needsSep = function(group, item){
  190.                 return group.isXType('buttongroup') && !(item instanceof Ext.Toolbar.Separator);
  191.             };
  192.         this.clearMenu();
  193.         m.removeAll();
  194.         for(var i = 0; i < len; i++){
  195.             c = h[i];
  196.             if(c.xtbHidden){
  197.                 if(prev && (needsSep(c, prev) || needsSep(prev, c))){
  198.                     m.add('-');
  199.                 }
  200.                 this.addComponentToMenu(m, c);
  201.                 prev = c;
  202.             }
  203.         }
  204.         // put something so the menu isn't empty
  205.         // if no compatible items found
  206.         if(m.items.length < 1){
  207.             m.add(this.noItemsMenuText);
  208.         }
  209.     },
  210.     initMore : function(){
  211.         if(!this.more){
  212.             this.moreMenu = new Ext.menu.Menu({
  213.                 listeners: {
  214.                     beforeshow: this.beforeMoreShow,
  215.                     scope: this
  216.                 }
  217.             });
  218.             this.moreMenu.ownerCt = this.container;
  219.             this.more = new Ext.Button({
  220.                 iconCls: 'x-toolbar-more-icon',
  221.                 cls: 'x-toolbar-more',
  222.                 menu: this.moreMenu
  223.             });
  224.             var td = this.insertCell(this.more, this.extrasTr, 100);
  225.             this.more.render(td);
  226.         }
  227.     },
  228.     onRemove : function(c){
  229.         delete this.leftTr;
  230.         delete this.rightTr;
  231.         delete this.extrasTr;
  232.         Ext.layout.ToolbarLayout.superclass.onRemove.call(this, c);
  233.     },
  234.     destroy : function(){
  235.         Ext.destroy(this.more, this.moreMenu);
  236.         delete this.leftTr;
  237.         delete this.rightTr;
  238.         delete this.extrasTr;
  239.         Ext.layout.ToolbarLayout.superclass.destroy.call(this);
  240.     }
  241.     /**
  242.      * @property activeItem
  243.      * @hide
  244.      */
  245. });
  246. Ext.Container.LAYOUTS.toolbar = Ext.layout.ToolbarLayout;
  247. /**
  248.  * @class Ext.Toolbar
  249.  * @extends Ext.Container
  250.  * <p>Basic Toolbar class. Although the <tt>{@link Ext.Container#defaultType defaultType}</tt> for Toolbar
  251.  * is <tt>{@link Ext.Button button}</tt>, Toolbar elements (child items for the Toolbar container) may
  252.  * be virtually any type of Component. Toolbar elements can be created explicitly via their constructors,
  253.  * or implicitly via their xtypes, and can be <tt>{@link #add}</tt>ed dynamically.</p>
  254.  * <p>Some items have shortcut strings for creation:</p>
  255.  * <pre>
  256. <u>Shortcut</u>  <u>xtype</u>          <u>Class</u>                  <u>Description</u>
  257. '->'      'tbfill'       {@link Ext.Toolbar.Fill}       begin using the right-justified button container
  258. '-'       'tbseparator'  {@link Ext.Toolbar.Separator}  add a vertical separator bar between toolbar items
  259. ' '       'tbspacer'     {@link Ext.Toolbar.Spacer}     add horiztonal space between elements
  260.  * </pre>
  261.  *
  262.  * Example usage of various elements:
  263.  * <pre><code>
  264. var tb = new Ext.Toolbar({
  265.     renderTo: document.body,
  266.     width: 600,
  267.     height: 100,
  268.     items: [
  269.         {
  270.             // xtype: 'button', // default for Toolbars, same as 'tbbutton'
  271.             text: 'Button'
  272.         },
  273.         {
  274.             xtype: 'splitbutton', // same as 'tbsplitbutton'
  275.             text: 'Split Button'
  276.         },
  277.         // begin using the right-justified button container
  278.         '->', // same as {xtype: 'tbfill'}, // Ext.Toolbar.Fill
  279.         {
  280.             xtype: 'textfield',
  281.             name: 'field1',
  282.             emptyText: 'enter search term'
  283.         },
  284.         // add a vertical separator bar between toolbar items
  285.         '-', // same as {xtype: 'tbseparator'} to create Ext.Toolbar.Separator
  286.         'text 1', // same as {xtype: 'tbtext', text: 'text1'} to create Ext.Toolbar.TextItem
  287.         {xtype: 'tbspacer'},// same as ' ' to create Ext.Toolbar.Spacer
  288.         'text 2',
  289.         {xtype: 'tbspacer', width: 50}, // add a 50px space
  290.         'text 3'
  291.     ]
  292. });
  293.  * </code></pre>
  294.  * Example adding a ComboBox within a menu of a button:
  295.  * <pre><code>
  296. // ComboBox creation
  297. var combo = new Ext.form.ComboBox({
  298.     store: new Ext.data.ArrayStore({
  299.         autoDestroy: true,
  300.         fields: ['initials', 'fullname'],
  301.         data : [
  302.             ['FF', 'Fred Flintstone'],
  303.             ['BR', 'Barney Rubble']
  304.         ]
  305.     }),
  306.     displayField: 'fullname',
  307.     typeAhead: true,
  308.     mode: 'local',
  309.     forceSelection: true,
  310.     triggerAction: 'all',
  311.     emptyText: 'Select a name...',
  312.     selectOnFocus: true,
  313.     width: 135,
  314.     getListParent: function() {
  315.         return this.el.up('.x-menu');
  316.     },
  317.     iconCls: 'no-icon' //use iconCls if placing within menu to shift to right side of menu
  318. });
  319. // put ComboBox in a Menu
  320. var menu = new Ext.menu.Menu({
  321.     id: 'mainMenu',
  322.     items: [
  323.         combo // A Field in a Menu
  324.     ]
  325. });
  326. // add a Button with the menu
  327. tb.add({
  328.         text:'Button w/ Menu',
  329.         menu: menu  // assign menu by instance
  330.     });
  331. tb.doLayout();
  332.  * </code></pre>
  333.  * @constructor
  334.  * Creates a new Toolbar
  335.  * @param {Object/Array} config A config object or an array of buttons to <tt>{@link #add}</tt>
  336.  * @xtype toolbar
  337.  */
  338. Ext.Toolbar = function(config){
  339.     if(Ext.isArray(config)){
  340.         config = {items: config, layout: 'toolbar'};
  341.     } else {
  342.         config = Ext.apply({
  343.             layout: 'toolbar'
  344.         }, config);
  345.         if(config.buttons) {
  346.             config.items = config.buttons;
  347.         }
  348.     }
  349.     Ext.Toolbar.superclass.constructor.call(this, config);
  350. };
  351. (function(){
  352. var T = Ext.Toolbar;
  353. Ext.extend(T, Ext.Container, {
  354.     defaultType: 'button',
  355.     /**
  356.      * @cfg {String/Object} layout
  357.      * This class assigns a default layout (<code>layout:'<b>toolbar</b>'</code>).
  358.      * Developers <i>may</i> override this configuration option if another layout
  359.      * is required (the constructor must be passed a configuration object in this
  360.      * case instead of an array).
  361.      * See {@link Ext.Container#layout} for additional information.
  362.      */
  363.     /**
  364.      * @cfg {Boolean} enableOverflow
  365.      * Defaults to false. Configure <code>true<code> to make the toolbar provide a button
  366.      * which activates a dropdown Menu to show items which overflow the Toolbar's width.
  367.      */
  368.     trackMenus : true,
  369.     internalDefaults: {removeMode: 'container', hideParent: true},
  370.     toolbarCls: 'x-toolbar',
  371.     initComponent : function(){
  372.         T.superclass.initComponent.call(this);
  373.         /**
  374.          * @event overflowchange
  375.          * Fires after the overflow state has changed.
  376.          * @param {Object} c The Container
  377.          * @param {Boolean} lastOverflow overflow state
  378.          */
  379.         this.addEvents('overflowchange');
  380.     },
  381.     // private
  382.     onRender : function(ct, position){
  383.         if(!this.el){
  384.             if(!this.autoCreate){
  385.                 this.autoCreate = {
  386.                     cls: this.toolbarCls + ' x-small-editor'
  387.                 };
  388.             }
  389.             this.el = ct.createChild(Ext.apply({ id: this.id },this.autoCreate), position);
  390.             Ext.Toolbar.superclass.onRender.apply(this, arguments);
  391.         }
  392.     },
  393.     /**
  394.      * <p>Adds element(s) to the toolbar -- this function takes a variable number of
  395.      * arguments of mixed type and adds them to the toolbar.</p>
  396.      * <br><p><b>Note</b>: See the notes within {@link Ext.Container#add}.</p>
  397.      * @param {Mixed} arg1 The following types of arguments are all valid:<br />
  398.      * <ul>
  399.      * <li>{@link Ext.Button} config: A valid button config object (equivalent to {@link #addButton})</li>
  400.      * <li>HtmlElement: Any standard HTML element (equivalent to {@link #addElement})</li>
  401.      * <li>Field: Any form field (equivalent to {@link #addField})</li>
  402.      * <li>Item: Any subclass of {@link Ext.Toolbar.Item} (equivalent to {@link #addItem})</li>
  403.      * <li>String: Any generic string (gets wrapped in a {@link Ext.Toolbar.TextItem}, equivalent to {@link #addText}).
  404.      * Note that there are a few special strings that are treated differently as explained next.</li>
  405.      * <li>'-': Creates a separator element (equivalent to {@link #addSeparator})</li>
  406.      * <li>' ': Creates a spacer element (equivalent to {@link #addSpacer})</li>
  407.      * <li>'->': Creates a fill element (equivalent to {@link #addFill})</li>
  408.      * </ul>
  409.      * @param {Mixed} arg2
  410.      * @param {Mixed} etc.
  411.      * @method add
  412.      */
  413.     // private
  414.     lookupComponent : function(c){
  415.         if(Ext.isString(c)){
  416.             if(c == '-'){
  417.                 c = new T.Separator();
  418.             }else if(c == ' '){
  419.                 c = new T.Spacer();
  420.             }else if(c == '->'){
  421.                 c = new T.Fill();
  422.             }else{
  423.                 c = new T.TextItem(c);
  424.             }
  425.             this.applyDefaults(c);
  426.         }else{
  427.             if(c.isFormField || c.render){ // some kind of form field, some kind of Toolbar.Item
  428.                 c = this.createComponent(c);
  429.             }else if(c.tag){ // DomHelper spec
  430.                 c = new T.Item({autoEl: c});
  431.             }else if(c.tagName){ // element
  432.                 c = new T.Item({el:c});
  433.             }else if(Ext.isObject(c)){ // must be button config?
  434.                 c = c.xtype ? this.createComponent(c) : this.constructButton(c);
  435.             }
  436.         }
  437.         return c;
  438.     },
  439.     // private
  440.     applyDefaults : function(c){
  441.         if(!Ext.isString(c)){
  442.             c = Ext.Toolbar.superclass.applyDefaults.call(this, c);
  443.             var d = this.internalDefaults;
  444.             if(c.events){
  445.                 Ext.applyIf(c.initialConfig, d);
  446.                 Ext.apply(c, d);
  447.             }else{
  448.                 Ext.applyIf(c, d);
  449.             }
  450.         }
  451.         return c;
  452.     },
  453.     /**
  454.      * Adds a separator
  455.      * <br><p><b>Note</b>: See the notes within {@link Ext.Container#add}.</p>
  456.      * @return {Ext.Toolbar.Item} The separator {@link Ext.Toolbar.Item item}
  457.      */
  458.     addSeparator : function(){
  459.         return this.add(new T.Separator());
  460.     },
  461.     /**
  462.      * Adds a spacer element
  463.      * <br><p><b>Note</b>: See the notes within {@link Ext.Container#add}.</p>
  464.      * @return {Ext.Toolbar.Spacer} The spacer item
  465.      */
  466.     addSpacer : function(){
  467.         return this.add(new T.Spacer());
  468.     },
  469.     /**
  470.      * Forces subsequent additions into the float:right toolbar
  471.      * <br><p><b>Note</b>: See the notes within {@link Ext.Container#add}.</p>
  472.      */
  473.     addFill : function(){
  474.         this.add(new T.Fill());
  475.     },
  476.     /**
  477.      * Adds any standard HTML element to the toolbar
  478.      * <br><p><b>Note</b>: See the notes within {@link Ext.Container#add}.</p>
  479.      * @param {Mixed} el The element or id of the element to add
  480.      * @return {Ext.Toolbar.Item} The element's item
  481.      */
  482.     addElement : function(el){
  483.         return this.addItem(new T.Item({el:el}));
  484.     },
  485.     /**
  486.      * Adds any Toolbar.Item or subclass
  487.      * <br><p><b>Note</b>: See the notes within {@link Ext.Container#add}.</p>
  488.      * @param {Ext.Toolbar.Item} item
  489.      * @return {Ext.Toolbar.Item} The item
  490.      */
  491.     addItem : function(item){
  492.         return this.add.apply(this, arguments);
  493.     },
  494.     /**
  495.      * Adds a button (or buttons). See {@link Ext.Button} for more info on the config.
  496.      * <br><p><b>Note</b>: See the notes within {@link Ext.Container#add}.</p>
  497.      * @param {Object/Array} config A button config or array of configs
  498.      * @return {Ext.Button/Array}
  499.      */
  500.     addButton : function(config){
  501.         if(Ext.isArray(config)){
  502.             var buttons = [];
  503.             for(var i = 0, len = config.length; i < len; i++) {
  504.                 buttons.push(this.addButton(config[i]));
  505.             }
  506.             return buttons;
  507.         }
  508.         return this.add(this.constructButton(config));
  509.     },
  510.     /**
  511.      * Adds text to the toolbar
  512.      * <br><p><b>Note</b>: See the notes within {@link Ext.Container#add}.</p>
  513.      * @param {String} text The text to add
  514.      * @return {Ext.Toolbar.Item} The element's item
  515.      */
  516.     addText : function(text){
  517.         return this.addItem(new T.TextItem(text));
  518.     },
  519.     /**
  520.      * Adds a new element to the toolbar from the passed {@link Ext.DomHelper} config
  521.      * <br><p><b>Note</b>: See the notes within {@link Ext.Container#add}.</p>
  522.      * @param {Object} config
  523.      * @return {Ext.Toolbar.Item} The element's item
  524.      */
  525.     addDom : function(config){
  526.         return this.add(new T.Item({autoEl: config}));
  527.     },
  528.     /**
  529.      * Adds a dynamically rendered Ext.form field (TextField, ComboBox, etc). Note: the field should not have
  530.      * been rendered yet. For a field that has already been rendered, use {@link #addElement}.
  531.      * <br><p><b>Note</b>: See the notes within {@link Ext.Container#add}.</p>
  532.      * @param {Ext.form.Field} field
  533.      * @return {Ext.Toolbar.Item}
  534.      */
  535.     addField : function(field){
  536.         return this.add(field);
  537.     },
  538.     /**
  539.      * Inserts any {@link Ext.Toolbar.Item}/{@link Ext.Button} at the specified index.
  540.      * <br><p><b>Note</b>: See the notes within {@link Ext.Container#add}.</p>
  541.      * @param {Number} index The index where the item is to be inserted
  542.      * @param {Object/Ext.Toolbar.Item/Ext.Button/Array} item The button, or button config object to be
  543.      * inserted, or an array of buttons/configs.
  544.      * @return {Ext.Button/Item}
  545.      */
  546.     insertButton : function(index, item){
  547.         if(Ext.isArray(item)){
  548.             var buttons = [];
  549.             for(var i = 0, len = item.length; i < len; i++) {
  550.                buttons.push(this.insertButton(index + i, item[i]));
  551.             }
  552.             return buttons;
  553.         }
  554.         return Ext.Toolbar.superclass.insert.call(this, index, item);
  555.     },
  556.     // private
  557.     trackMenu : function(item, remove){
  558.         if(this.trackMenus && item.menu){
  559.             var method = remove ? 'mun' : 'mon';
  560.             this[method](item, 'menutriggerover', this.onButtonTriggerOver, this);
  561.             this[method](item, 'menushow', this.onButtonMenuShow, this);
  562.             this[method](item, 'menuhide', this.onButtonMenuHide, this);
  563.         }
  564.     },
  565.     // private
  566.     constructButton : function(item){
  567.         var b = item.events ? item : this.createComponent(item, item.split ? 'splitbutton' : this.defaultType);
  568.         return b;
  569.     },
  570.     // private
  571.     onAdd : function(c){
  572.         Ext.Toolbar.superclass.onAdd.call(this);
  573.         this.trackMenu(c);
  574.     },
  575.     // private
  576.     onRemove : function(c){
  577.         Ext.Toolbar.superclass.onRemove.call(this);
  578.         this.trackMenu(c, true);
  579.     },
  580.     // private
  581.     onDisable : function(){
  582.         this.items.each(function(item){
  583.              if(item.disable){
  584.                  item.disable();
  585.              }
  586.         });
  587.     },
  588.     // private
  589.     onEnable : function(){
  590.         this.items.each(function(item){
  591.              if(item.enable){
  592.                  item.enable();
  593.              }
  594.         });
  595.     },
  596.     // private
  597.     onButtonTriggerOver : function(btn){
  598.         if(this.activeMenuBtn && this.activeMenuBtn != btn){
  599.             this.activeMenuBtn.hideMenu();
  600.             btn.showMenu();
  601.             this.activeMenuBtn = btn;
  602.         }
  603.     },
  604.     // private
  605.     onButtonMenuShow : function(btn){
  606.         this.activeMenuBtn = btn;
  607.     },
  608.     // private
  609.     onButtonMenuHide : function(btn){
  610.         delete this.activeMenuBtn;
  611.     }
  612. });
  613. Ext.reg('toolbar', Ext.Toolbar);
  614. /**
  615.  * @class Ext.Toolbar.Item
  616.  * @extends Ext.BoxComponent
  617.  * The base class that other non-interacting Toolbar Item classes should extend in order to
  618.  * get some basic common toolbar item functionality.
  619.  * @constructor
  620.  * Creates a new Item
  621.  * @param {HTMLElement} el
  622.  * @xtype tbitem
  623.  */
  624. T.Item = Ext.extend(Ext.BoxComponent, {
  625.     hideParent: true, //  Hiding a Toolbar.Item hides its containing TD
  626.     enable:Ext.emptyFn,
  627.     disable:Ext.emptyFn,
  628.     focus:Ext.emptyFn
  629.     /**
  630.      * @cfg {String} overflowText Text to be used for the menu if the item is overflowed.
  631.      */
  632. });
  633. Ext.reg('tbitem', T.Item);
  634. /**
  635.  * @class Ext.Toolbar.Separator
  636.  * @extends Ext.Toolbar.Item
  637.  * A simple class that adds a vertical separator bar between toolbar items
  638.  * (css class:<tt>'xtb-sep'</tt>). Example usage:
  639.  * <pre><code>
  640. new Ext.Panel({
  641.     tbar : [
  642.         'Item 1',
  643.         {xtype: 'tbseparator'}, // or '-'
  644.         'Item 2'
  645.     ]
  646. });
  647. </code></pre>
  648.  * @constructor
  649.  * Creates a new Separator
  650.  * @xtype tbseparator
  651.  */
  652. T.Separator = Ext.extend(T.Item, {
  653.     onRender : function(ct, position){
  654.         this.el = ct.createChild({tag:'span', cls:'xtb-sep'}, position);
  655.     }
  656. });
  657. Ext.reg('tbseparator', T.Separator);
  658. /**
  659.  * @class Ext.Toolbar.Spacer
  660.  * @extends Ext.Toolbar.Item
  661.  * A simple element that adds extra horizontal space between items in a toolbar.
  662.  * By default a 2px wide space is added via css specification:<pre><code>
  663. .x-toolbar .xtb-spacer {
  664.     width:2px;
  665. }
  666.  * </code></pre>
  667.  * <p>Example usage:</p>
  668.  * <pre><code>
  669. new Ext.Panel({
  670.     tbar : [
  671.         'Item 1',
  672.         {xtype: 'tbspacer'}, // or ' '
  673.         'Item 2',
  674.         // space width is also configurable via javascript
  675.         {xtype: 'tbspacer', width: 50}, // add a 50px space
  676.         'Item 3'
  677.     ]
  678. });
  679. </code></pre>
  680.  * @constructor
  681.  * Creates a new Spacer
  682.  * @xtype tbspacer
  683.  */
  684. T.Spacer = Ext.extend(T.Item, {
  685.     /**
  686.      * @cfg {Number} width
  687.      * The width of the spacer in pixels (defaults to 2px via css style <tt>.x-toolbar .xtb-spacer</tt>).
  688.      */
  689.     onRender : function(ct, position){
  690.         this.el = ct.createChild({tag:'div', cls:'xtb-spacer', style: this.width?'width:'+this.width+'px':''}, position);
  691.     }
  692. });
  693. Ext.reg('tbspacer', T.Spacer);
  694. /**
  695.  * @class Ext.Toolbar.Fill
  696.  * @extends Ext.Toolbar.Spacer
  697.  * A non-rendering placeholder item which instructs the Toolbar's Layout to begin using
  698.  * the right-justified button container.
  699.  * <pre><code>
  700. new Ext.Panel({
  701.     tbar : [
  702.         'Item 1',
  703.         {xtype: 'tbfill'}, // or '->'
  704.         'Item 2'
  705.     ]
  706. });
  707. </code></pre>
  708.  * @constructor
  709.  * Creates a new Fill
  710.  * @xtype tbfill
  711.  */
  712. T.Fill = Ext.extend(T.Item, {
  713.     // private
  714.     render : Ext.emptyFn,
  715.     isFill : true
  716. });
  717. Ext.reg('tbfill', T.Fill);
  718. /**
  719.  * @class Ext.Toolbar.TextItem
  720.  * @extends Ext.Toolbar.Item
  721.  * A simple class that renders text directly into a toolbar
  722.  * (with css class:<tt>'xtb-text'</tt>). Example usage:
  723.  * <pre><code>
  724. new Ext.Panel({
  725.     tbar : [
  726.         {xtype: 'tbtext', text: 'Item 1'} // or simply 'Item 1'
  727.     ]
  728. });
  729. </code></pre>
  730.  * @constructor
  731.  * Creates a new TextItem
  732.  * @param {String/Object} text A text string, or a config object containing a <tt>text</tt> property
  733.  * @xtype tbtext
  734.  */
  735. T.TextItem = Ext.extend(T.Item, {
  736.     /**
  737.      * @cfg {String} text The text to be used as innerHTML (html tags are accepted)
  738.      */
  739.     constructor: function(config){
  740.         T.TextItem.superclass.constructor.call(this, Ext.isString(config) ? {text: config} : config);
  741.     },
  742.     // private
  743.     onRender : function(ct, position) {
  744.         this.autoEl = {cls: 'xtb-text', html: this.text || ''};
  745.         T.TextItem.superclass.onRender.call(this, ct, position);
  746.     },
  747.     /**
  748.      * Updates this item's text, setting the text to be used as innerHTML.
  749.      * @param {String} t The text to display (html accepted).
  750.      */
  751.     setText : function(t) {
  752.         if(this.rendered){
  753.             this.el.update(t);
  754.         }else{
  755.             this.text = t;
  756.         }
  757.     }
  758. });
  759. Ext.reg('tbtext', T.TextItem);
  760. // backwards compat
  761. T.Button = Ext.extend(Ext.Button, {});
  762. T.SplitButton = Ext.extend(Ext.SplitButton, {});
  763. Ext.reg('tbbutton', T.Button);
  764. Ext.reg('tbsplit', T.SplitButton);
  765. })();