123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515 |
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>The source code</title>
- <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
- <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
- <style type="text/css">
- .highlight { display: block; background-color: #ddd; }
- </style>
- <script type="text/javascript">
- function highlight() {
- document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
- }
- </script>
- </head>
- <body onload="prettyPrint(); highlight();">
- <pre class="prettyprint lang-js"><span id='Ext-button-Button'>/**
- </span> * @docauthor Robert Dougan <rob@sencha.com>
- *
- * Create simple buttons with this component. Customisations include {@link #iconAlign aligned}
- * {@link #iconCls icons}, {@link #cfg-menu dropdown menus}, {@link #tooltip tooltips}
- * and {@link #scale sizing options}. Specify a {@link #handler handler} to run code when
- * a user clicks the button, or use {@link #listeners listeners} for other events such as
- * {@link #mouseover mouseover}. Example usage:
- *
- * @example
- * Ext.create('Ext.Button', {
- * text: 'Click me',
- * renderTo: Ext.getBody(),
- * handler: function() {
- * alert('You clicked the button!');
- * }
- * });
- *
- * The {@link #handler} configuration can also be updated dynamically using the {@link #setHandler}
- * method. Example usage:
- *
- * @example
- * Ext.create('Ext.Button', {
- * text : 'Dynamic Handler Button',
- * renderTo: Ext.getBody(),
- * handler : function() {
- * // this button will spit out a different number every time you click it.
- * // so firstly we must check if that number is already set:
- * if (this.clickCount) {
- * // looks like the property is already set, so lets just add 1 to that number and alert the user
- * this.clickCount++;
- * alert('You have clicked the button "' + this.clickCount + '" times.\n\nTry clicking it again..');
- * } else {
- * // if the clickCount property is not set, we will set it and alert the user
- * this.clickCount = 1;
- * alert('You just clicked the button for the first time!\n\nTry pressing it again..');
- * }
- * }
- * });
- *
- * A button within a container:
- *
- * @example
- * Ext.create('Ext.Container', {
- * renderTo: Ext.getBody(),
- * items : [
- * {
- * xtype: 'button',
- * text : 'My Button'
- * }
- * ]
- * });
- *
- * A useful option of Button is the {@link #scale} configuration. This configuration has three different options:
- *
- * - `'small'`
- * - `'medium'`
- * - `'large'`
- *
- * Example usage:
- *
- * @example
- * Ext.create('Ext.Button', {
- * renderTo: document.body,
- * text : 'Click me',
- * scale : 'large'
- * });
- *
- * Buttons can also be toggled. To enable this, you simple set the {@link #enableToggle} property to `true`.
- * Example usage:
- *
- * @example
- * Ext.create('Ext.Button', {
- * renderTo: Ext.getBody(),
- * text: 'Click Me',
- * enableToggle: true
- * });
- *
- * You can assign a menu to a button by using the {@link #cfg-menu} configuration. This standard configuration
- * can either be a reference to a {@link Ext.menu.Menu menu} object, a {@link Ext.menu.Menu menu} id or a
- * {@link Ext.menu.Menu menu} config blob. When assigning a menu to a button, an arrow is automatically
- * added to the button. You can change the alignment of the arrow using the {@link #arrowAlign} configuration
- * on button. Example usage:
- *
- * @example
- * Ext.create('Ext.Button', {
- * text : 'Menu button',
- * renderTo : Ext.getBody(),
- * arrowAlign: 'bottom',
- * menu : [
- * {text: 'Item 1'},
- * {text: 'Item 2'},
- * {text: 'Item 3'},
- * {text: 'Item 4'}
- * ]
- * });
- *
- * Using listeners, you can easily listen to events fired by any component, using the {@link #listeners}
- * configuration or using the {@link #addListener} method. Button has a variety of different listeners:
- *
- * - `click`
- * - `toggle`
- * - `mouseover`
- * - `mouseout`
- * - `mouseshow`
- * - `menuhide`
- * - `menutriggerover`
- * - `menutriggerout`
- *
- * Example usage:
- *
- * @example
- * Ext.create('Ext.Button', {
- * text : 'Button',
- * renderTo : Ext.getBody(),
- * listeners: {
- * click: function() {
- * // this == the button, as we are in the local scope
- * this.setText('I was clicked!');
- * },
- * mouseover: function() {
- * // set a new config which says we moused over, if not already set
- * if (!this.mousedOver) {
- * this.mousedOver = true;
- * alert('You moused over a button!\n\nI wont do this again.');
- * }
- * }
- * }
- * });
- */
- Ext.define('Ext.button.Button', {
- /* Begin Definitions */
- alias: 'widget.button',
- extend: 'Ext.Component',
- requires: [
- 'Ext.menu.Manager',
- 'Ext.util.ClickRepeater',
- 'Ext.layout.component.Button',
- 'Ext.util.TextMetrics',
- 'Ext.util.KeyMap'
- ],
- alternateClassName: 'Ext.Button',
- /* End Definitions */
- /*
- * @property {Boolean} isAction
- * `true` in this class to identify an object as an instantiated Button, or subclass thereof.
- */
- isButton: true,
- componentLayout: 'button',
- <span id='Ext-button-Button-property-hidden'> /**
- </span> * @property {Boolean} hidden
- * True if this button is hidden.
- * @readonly
- */
- hidden: false,
- <span id='Ext-button-Button-property-disabled'> /**
- </span> * @property {Boolean} disabled
- * True if this button is disabled.
- * @readonly
- */
- disabled: false,
- <span id='Ext-button-Button-property-pressed'> /**
- </span> * @property {Boolean} pressed
- * True if this button is pressed (only if enableToggle = true).
- * @readonly
- */
- pressed: false,
- <span id='Ext-button-Button-cfg-text'> /**
- </span> * @cfg {String} text
- * The button text to be used as innerHTML (html tags are accepted).
- */
- <span id='Ext-button-Button-cfg-icon'> /**
- </span> * @cfg {String} icon
- * The path to an image to display in the button.
- */
- <span id='Ext-button-Button-cfg-handler'> /**
- </span> * @cfg {Function} handler
- * A function called when the button is clicked (can be used instead of click event).
- * @cfg {Ext.button.Button} handler.button This button.
- * @cfg {Ext.EventObject} handler.e The click event.
- */
- <span id='Ext-button-Button-cfg-minWidth'> /**
- </span> * @cfg {Number} minWidth
- * The minimum width for this button (used to give a set of buttons a common width).
- * See also {@link Ext.panel.Panel}.{@link Ext.panel.Panel#minButtonWidth minButtonWidth}.
- */
- <span id='Ext-button-Button-cfg-tooltip'> /**
- </span> * @cfg {String/Object} tooltip
- * The tooltip for the button - can be a string to be used as innerHTML (html tags are accepted) or
- * QuickTips config object.
- */
- <span id='Ext-button-Button-cfg-hidden'> /**
- </span> * @cfg {Boolean} [hidden=false]
- * True to start hidden.
- */
- <span id='Ext-button-Button-cfg-disabled'> /**
- </span> * @cfg {Boolean} [disabled=false]
- * True to start disabled.
- */
- <span id='Ext-button-Button-cfg-pressed'> /**
- </span> * @cfg {Boolean} [pressed=false]
- * True to start pressed (only if enableToggle = true)
- */
- <span id='Ext-button-Button-cfg-toggleGroup'> /**
- </span> * @cfg {String} toggleGroup
- * The group this toggle button is a member of (only 1 per group can be pressed). If a toggleGroup
- * is specified, the {@link #enableToggle} configuration will automatically be set to true.
- */
- <span id='Ext-button-Button-cfg-repeat'> /**
- </span> * @cfg {Boolean/Object} [repeat=false]
- * True to repeat fire the click event while the mouse is down. This can also be a
- * {@link Ext.util.ClickRepeater ClickRepeater} config object.
- */
- <span id='Ext-button-Button-cfg-tabIndex'> /**
- </span> * @cfg {Number} tabIndex
- * Set a DOM tabIndex for this button.
- */
- <span id='Ext-button-Button-cfg-allowDepress'> /**
- </span> * @cfg {Boolean} [allowDepress=true]
- * False to not allow a pressed Button to be depressed. Only valid when {@link #enableToggle} is true.
- */
- <span id='Ext-button-Button-cfg-enableToggle'> /**
- </span> * @cfg {Boolean} [enableToggle=false]
- * True to enable pressed/not pressed toggling. If a {@link #toggleGroup} is specified, this
- * option will be set to true.
- */
- enableToggle: false,
- <span id='Ext-button-Button-cfg-toggleHandler'> /**
- </span> * @cfg {Function} toggleHandler
- * Function called when a Button with {@link #enableToggle} set to true is clicked.
- * @cfg {Ext.button.Button} toggleHandler.button This button.
- * @cfg {Boolean} toggleHandler.state The next state of the Button, true means pressed.
- */
- <span id='Ext-button-Button-cfg-menu'> /**
- </span> * @cfg {Ext.menu.Menu/String/Object} menu
- * Standard menu attribute consisting of a reference to a menu object, a menu id or a menu config blob.
- */
- <span id='Ext-button-Button-cfg-menuAlign'> /**
- </span> * @cfg {String} menuAlign
- * The position to align the menu to (see {@link Ext.Element#alignTo} for more details).
- */
- menuAlign: 'tl-bl?',
- <span id='Ext-button-Button-cfg-textAlign'> /**
- </span> * @cfg {String} textAlign
- * The text alignment for this button (center, left, right).
- */
- textAlign: 'center',
- <span id='Ext-button-Button-cfg-overflowText'> /**
- </span> * @cfg {String} overflowText
- * If used in a {@link Ext.toolbar.Toolbar Toolbar}, the text to be used if this item is shown in the overflow menu.
- * See also {@link Ext.toolbar.Item}.`{@link Ext.toolbar.Item#overflowText overflowText}`.
- */
- <span id='Ext-button-Button-cfg-iconCls'> /**
- </span> * @cfg {String} iconCls
- * A css class which sets a background image to be used as the icon for this button.
- */
- <span id='Ext-button-Button-cfg-type'> /**
- </span> * @cfg {String} type
- * The type of `<input>` to create: submit, reset or button.
- */
- type: 'button',
- <span id='Ext-button-Button-cfg-clickEvent'> /**
- </span> * @cfg {String} clickEvent
- * The DOM event that will fire the handler of the button. This can be any valid event name (dblclick, contextmenu).
- */
- clickEvent: 'click',
- <span id='Ext-button-Button-cfg-preventDefault'> /**
- </span> * @cfg {Boolean} preventDefault
- * True to prevent the default action when the {@link #clickEvent} is processed.
- */
- preventDefault: true,
- <span id='Ext-button-Button-cfg-handleMouseEvents'> /**
- </span> * @cfg {Boolean} handleMouseEvents
- * False to disable visual cues on mouseover, mouseout and mousedown.
- */
- handleMouseEvents: true,
- <span id='Ext-button-Button-cfg-tooltipType'> /**
- </span> * @cfg {String} tooltipType
- * The type of tooltip to use. Either 'qtip' for QuickTips or 'title' for title attribute.
- */
- tooltipType: 'qtip',
- <span id='Ext-button-Button-cfg-baseCls'> /**
- </span> * @cfg {String} [baseCls='x-btn']
- * The base CSS class to add to all buttons.
- */
- baseCls: Ext.baseCSSPrefix + 'btn',
- <span id='Ext-button-Button-cfg-pressedCls'> /**
- </span> * @cfg {String} pressedCls
- * The CSS class to add to a button when it is in the pressed state.
- */
- pressedCls: 'pressed',
- <span id='Ext-button-Button-cfg-overCls'> /**
- </span> * @cfg {String} overCls
- * The CSS class to add to a button when it is in the over (hovered) state.
- */
- overCls: 'over',
- <span id='Ext-button-Button-cfg-focusCls'> /**
- </span> * @cfg {String} focusCls
- * The CSS class to add to a button when it is in the focussed state.
- */
- focusCls: 'focus',
- <span id='Ext-button-Button-cfg-menuActiveCls'> /**
- </span> * @cfg {String} menuActiveCls
- * The CSS class to add to a button when it's menu is active.
- */
- menuActiveCls: 'menu-active',
- <span id='Ext-button-Button-cfg-href'> /**
- </span> * @cfg {String} href
- * The URL to open when the button is clicked. Specifying this config causes the Button to be
- * rendered with an anchor (An `<a>` element) as its active element, referencing the specified URL.
- *
- * This is better than specifying a click handler of
- *
- * function() { window.location = "http://www.sencha.com" }
- *
- * because the UI will provide meaningful hints to the user as to what to expect upon clicking
- * the button, and will also allow the user to open in a new tab or window, bookmark or drag the URL, or directly save
- * the URL stream to disk.
- *
- * See also the {@link #hrefTarget} config.
- */
-
- <span id='Ext-button-Button-cfg-hrefTarget'> /**
- </span> * @cfg {String} [hrefTarget="_blank"]
- * The target attribute to use for the underlying anchor. Only used if the {@link #href}
- * property is specified.
- */
- hrefTarget: '_blank',
-
- border: true,
- <span id='Ext-button-Button-cfg-baseParams'> /**
- </span> * @cfg {Object} baseParams
- * An object literal of parameters to pass to the url when the {@link #href} property is specified.
- */
- <span id='Ext-button-Button-cfg-params'> /**
- </span> * @cfg {Object} params
- * An object literal of parameters to pass to the url when the {@link #href} property is specified. Any params
- * override {@link #baseParams}. New params can be set using the {@link #setParams} method.
- */
- childEls: [
- 'btnEl', 'btnWrap', 'btnInnerEl', 'btnIconEl'
- ],
- renderTpl: [
- '<em id="{id}-btnWrap"<tpl if="splitCls"> class="{splitCls}"</tpl>>',
- '<tpl if="href">',
- '<a id="{id}-btnEl" href="{href}" class="{btnCls}" target="{hrefTarget}"',
- '<tpl if="tabIndex"> tabIndex="{tabIndex}"</tpl>',
- '<tpl if="disabled"> disabled="disabled"</tpl>',
- ' role="link">',
- '<span id="{id}-btnInnerEl" class="{baseCls}-inner">',
- '{text}',
- '</span>',
- '<span id="{id}-btnIconEl" class="{baseCls}-icon {iconCls}"<tpl if="iconUrl"> style="background-image:url({iconUrl})"</tpl>></span>',
- '</a>',
- '<tpl else>',
- '<button id="{id}-btnEl" type="{type}" class="{btnCls}" hidefocus="true"',
- // the autocomplete="off" is required to prevent Firefox from remembering
- // the button's disabled state between page reloads.
- '<tpl if="tabIndex"> tabIndex="{tabIndex}"</tpl>',
- '<tpl if="disabled"> disabled="disabled"</tpl>',
- ' role="button" autocomplete="off">',
- '<span id="{id}-btnInnerEl" class="{baseCls}-inner" style="{innerSpanStyle}">',
- '{text}',
- '</span>',
- '<span id="{id}-btnIconEl" class="{baseCls}-icon {iconCls}"<tpl if="iconUrl"> style="background-image:url({iconUrl})"</tpl>></span>',
- '</button>',
- '</tpl>',
- '</em>',
- '<tpl if="closable">',
- '<a id="{id}-closeEl" href="#" class="{baseCls}-close-btn" title="{closeText}"></a>',
- '</tpl>'
- ],
- <span id='Ext-button-Button-cfg-scale'> /**
- </span> * @cfg {String} scale
- * The size of the Button. Three values are allowed:
- *
- * - 'small' - Results in the button element being 16px high.
- * - 'medium' - Results in the button element being 24px high.
- * - 'large' - Results in the button element being 32px high.
- */
- scale: 'small',
- <span id='Ext-button-Button-property-allowedScales'> /**
- </span> * @private
- * An array of allowed scales.
- */
- allowedScales: ['small', 'medium', 'large'],
- <span id='Ext-button-Button-cfg-scope'> /**
- </span> * @cfg {Object} scope
- * The scope (**this** reference) in which the `{@link #handler}` and `{@link #toggleHandler}` is executed.
- * Defaults to this Button.
- */
- <span id='Ext-button-Button-cfg-iconAlign'> /**
- </span> * @cfg {String} iconAlign
- * The side of the Button box to render the icon. Four values are allowed:
- *
- * - 'top'
- * - 'right'
- * - 'bottom'
- * - 'left'
- */
- iconAlign: 'left',
- <span id='Ext-button-Button-cfg-arrowAlign'> /**
- </span> * @cfg {String} arrowAlign
- * The side of the Button box to render the arrow if the button has an associated {@link #cfg-menu}. Two
- * values are allowed:
- *
- * - 'right'
- * - 'bottom'
- */
- arrowAlign: 'right',
- <span id='Ext-button-Button-cfg-arrowCls'> /**
- </span> * @cfg {String} arrowCls
- * The className used for the inner arrow element if the button has a menu.
- */
- arrowCls: 'arrow',
- <span id='Ext-button-Button-property-template'> /**
- </span> * @property {Ext.Template} template
- * A {@link Ext.Template Template} used to create the Button's DOM structure.
- *
- * Instances, or subclasses which need a different DOM structure may provide a different template layout in
- * conjunction with an implementation of {@link #getTemplateArgs}.
- */
- <span id='Ext-button-Button-cfg-cls'> /**
- </span> * @cfg {String} cls
- * A CSS class string to apply to the button's main element.
- */
- <span id='Ext-button-Button-property-menu'> /**
- </span> * @property {Ext.menu.Menu} menu
- * The {@link Ext.menu.Menu Menu} object associated with this Button when configured with the {@link #cfg-menu} config
- * option.
- */
- maskOnDisable: false,
-
- <span id='Ext-button-Button-property-persistentPadding'> /**
- </span> * @private
- * @property persistentPadding
- * The padding spuriously added to a &lt;button> element which must be accounted for in the margins of the innerEl.
- * This is calculated at first render time by creating a hidden button and measuring its insides.
- */
- persistentPadding: undefined,
- shrinkWrap: 3,
- frame: true,
- // inherit docs
- initComponent: function() {
- var me = this;
- me.callParent(arguments);
- me.addEvents(
- <span id='Ext-button-Button-event-click'> /**
- </span> * @event click
- * Fires when this button is clicked, before the configured {@link #handler} is invoked. Execution of the
- * {@link #handler} may be vetoed by returning <code>false</code> to this event.
- * @param {Ext.button.Button} this
- * @param {Event} e The click event
- */
- 'click',
- <span id='Ext-button-Button-event-toggle'> /**
- </span> * @event toggle
- * Fires when the 'pressed' state of this button changes (only if enableToggle = true)
- * @param {Ext.button.Button} this
- * @param {Boolean} pressed
- */
- 'toggle',
- <span id='Ext-button-Button-event-mouseover'> /**
- </span> * @event mouseover
- * Fires when the mouse hovers over the button
- * @param {Ext.button.Button} this
- * @param {Event} e The event object
- */
- 'mouseover',
- <span id='Ext-button-Button-event-mouseout'> /**
- </span> * @event mouseout
- * Fires when the mouse exits the button
- * @param {Ext.button.Button} this
- * @param {Event} e The event object
- */
- 'mouseout',
- <span id='Ext-button-Button-event-menushow'> /**
- </span> * @event menushow
- * If this button has a menu, this event fires when it is shown
- * @param {Ext.button.Button} this
- * @param {Ext.menu.Menu} menu
- */
- 'menushow',
- <span id='Ext-button-Button-event-menuhide'> /**
- </span> * @event menuhide
- * If this button has a menu, this event fires when it is hidden
- * @param {Ext.button.Button} this
- * @param {Ext.menu.Menu} menu
- */
- 'menuhide',
- <span id='Ext-button-Button-event-menutriggerover'> /**
- </span> * @event menutriggerover
- * If this button has a menu, this event fires when the mouse enters the menu triggering element
- * @param {Ext.button.Button} this
- * @param {Ext.menu.Menu} menu
- * @param {Event} e
- */
- 'menutriggerover',
- <span id='Ext-button-Button-event-menutriggerout'> /**
- </span> * @event menutriggerout
- * If this button has a menu, this event fires when the mouse leaves the menu triggering element
- * @param {Ext.button.Button} this
- * @param {Ext.menu.Menu} menu
- * @param {Event} e
- */
- 'menutriggerout'
- );
- if (me.menu) {
- // Flag that we'll have a splitCls
- me.split = true;
- // retrieve menu by id or instantiate instance if needed
- me.menu = Ext.menu.Manager.get(me.menu);
- me.menu.ownerButton = me;
- }
- // Accept url as a synonym for href
- if (me.url) {
- me.href = me.url;
- }
- // preventDefault defaults to false for links
- if (me.href && !me.hasOwnProperty('preventDefault')) {
- me.preventDefault = false;
- }
- if (Ext.isString(me.toggleGroup) && me.toggleGroup !== '') {
- me.enableToggle = true;
- }
-
- if (me.html && !me.text) {
- me.text = me.html;
- delete me.html;
- }
- },
- // inherit docs
- getActionEl: function() {
- return this.btnEl;
- },
- // inherit docs
- getFocusEl: function() {
- return this.useElForFocus ? this.el : this.btnEl;
- },
- // Buttons add the focus class to the *outermost element*, not the focusEl!
- onFocus: function(e) {
- var me = this;
- // Set this flag, so that when AbstractComponent's onFocus gets the focusEl to add the focusCls
- // to, it will get the encapsulating element - that's what the CSS rules for Button need right now
- me.useElForFocus = true;
- me.callParent(arguments);
- me.useElForFocus = false;
- },
- // See comments in onFocus
- onBlur : function(e) {
- this.useElForFocus = true;
- this.callParent(arguments);
- this.useElForFocus = false;
- },
-
- // See comments in onFocus
- onDisable: function(){
- this.useElForFocus = true;
- this.callParent(arguments);
- this.useElForFocus = false;
- },
- // private
- setComponentCls: function() {
- var me = this,
- cls = me.getComponentCls();
- if (!Ext.isEmpty(me.oldCls)) {
- me.removeClsWithUI(me.oldCls);
- me.removeClsWithUI(me.pressedCls);
- }
- me.oldCls = cls;
- me.addClsWithUI(cls);
- },
- getComponentCls: function() {
- var me = this,
- cls = [];
- // Check whether the button has an icon or not, and if it has an icon, what is the alignment
- if (me.iconCls || me.icon) {
- if (me.text) {
- cls.push('icon-text-' + me.iconAlign);
- } else {
- cls.push('icon');
- }
- } else if (me.text) {
- cls.push('noicon');
- }
- if (me.pressed) {
- cls.push(me.pressedCls);
- }
- return cls;
- },
- beforeRender: function () {
- var me = this;
- me.callParent();
- // Add all needed classes to the protoElement.
- me.oldCls = me.getComponentCls();
- me.addClsWithUI(me.oldCls);
- // Apply the renderData to the template args
- Ext.applyIf(me.renderData, me.getTemplateArgs());
- if (me.scale) {
- me.setScale(me.scale);
- }
- },
- // private
- onRender: function() {
- var me = this,
- addOnclick,
- btn,
- btnListeners;
- me.doc = Ext.getDoc();
- me.callParent(arguments);
- // If it is a split button + has a toolip for the arrow
- if (me.split && me.arrowTooltip) {
- me.arrowEl.dom.setAttribute(me.getTipAttr(), me.arrowTooltip);
- }
- // Set btn as a local variable for easy access
- btn = me.el;
- if (me.tooltip) {
- me.setTooltip(me.tooltip, true);
- }
- // Add the mouse events to the button
- if (me.handleMouseEvents) {
- btnListeners = {
- scope: me,
- mouseover: me.onMouseOver,
- mouseout: me.onMouseOut,
- mousedown: me.onMouseDown
- };
- if (me.split) {
- btnListeners.mousemove = me.onMouseMove;
- }
- } else {
- btnListeners = {
- scope: me
- };
- }
- // Check if the button has a menu
- if (me.menu) {
- me.mon(me.menu, {
- scope: me,
- show: me.onMenuShow,
- hide: me.onMenuHide
- });
- me.keyMap = new Ext.util.KeyMap({
- target: me.el,
- key: Ext.EventObject.DOWN,
- handler: me.onDownKey,
- scope: me
- });
- }
- // Check if it is a repeat button
- if (me.repeat) {
- me.mon(new Ext.util.ClickRepeater(btn, Ext.isObject(me.repeat) ? me.repeat: {}), 'click', me.onRepeatClick, me);
- } else {
- // If the activation event already has a handler, make a note to add the handler later
- if (btnListeners[me.clickEvent]) {
- addOnclick = true;
- } else {
- btnListeners[me.clickEvent] = me.onClick;
- }
- }
- // Add whatever button listeners we need
- me.mon(btn, btnListeners);
- // If the listeners object had an entry for our clickEvent, add a listener now
- if (addOnclick) {
- me.mon(btn, me.clickEvent, me.onClick, me);
- }
- // Register the button in the toggle manager
- Ext.ButtonToggleManager.register(me);
- },
- <span id='Ext-button-Button-method-getTemplateArgs'> /**
- </span> * This method returns an object which provides substitution parameters for the {@link #renderTpl XTemplate} used to
- * create this Button's DOM structure.
- *
- * Instances or subclasses which use a different Template to create a different DOM structure may need to provide
- * their own implementation of this method.
- *
- * @return {Object} Substitution data for a Template. The default implementation which provides data for the default
- * {@link #template} returns an Object containing the following properties:
- * @return {String} return.type The `<button>`'s {@link #type}
- * @return {String} return.splitCls A CSS class to determine the presence and position of an arrow icon.
- * (`'x-btn-arrow'` or `'x-btn-arrow-bottom'` or `''`)
- * @return {String} return.cls A CSS class name applied to the Button's main `<tbody>` element which determines the
- * button's scale and icon alignment.
- * @return {String} return.text The {@link #text} to display ion the Button.
- * @return {Number} return.tabIndex The tab index within the input flow.
- */
- getTemplateArgs: function() {
- var me = this,
- persistentPadding = me.getPersistentPadding(),
- innerSpanStyle = '';
- // Create negative margin offsets to counteract persistent button padding if needed
- if (Math.max.apply(Math, persistentPadding) > 0) {
- innerSpanStyle = 'margin:' + Ext.Array.map(persistentPadding, function(pad) {
- return -pad + 'px';
- }).join(' ');
- }
- return {
- href : me.getHref(),
- disabled : me.disabled,
- hrefTarget: me.hrefTarget,
- type : me.type,
- btnCls : me.getBtnCls(),
- splitCls : me.getSplitCls(),
- iconUrl : me.icon,
- iconCls : me.iconCls,
- text : me.text || '&#160;',
- tabIndex : me.tabIndex,
- innerSpanStyle: innerSpanStyle
- };
- },
- <span id='Ext-button-Button-method-getHref'> /**
- </span> * @private
- * If there is a configured href for this Button, returns the href with parameters appended.
- * @returns The href string with parameters appended.
- */
- getHref: function() {
- var me = this,
- params = Ext.apply({}, me.baseParams);
- // write baseParams first, then write any params
- params = Ext.apply(params, me.params);
- return me.href ? Ext.urlAppend(me.href, Ext.Object.toQueryString(params)) : false;
- },
- <span id='Ext-button-Button-method-setParams'> /**
- </span> * Sets the href of the link dynamically according to the params passed, and any {@link #baseParams} configured.
- *
- * **Only valid if the Button was originally configured with a {@link #href}**
- *
- * @param {Object} params Parameters to use in the href URL.
- */
- setParams: function(params) {
- this.params = params;
- this.btnEl.dom.href = this.getHref();
- },
- getSplitCls: function() {
- var me = this;
- return me.split ? (me.baseCls + '-' + me.arrowCls) + ' ' + (me.baseCls + '-' + me.arrowCls + '-' + me.arrowAlign) : '';
- },
- getBtnCls: function() {
- return this.textAlign ? this.baseCls + '-' + this.textAlign : '';
- },
- <span id='Ext-button-Button-method-setIconCls'> /**
- </span> * Sets the CSS class that provides a background image to use as the button's icon. This method also changes the
- * value of the {@link #iconCls} config internally.
- * @param {String} cls The CSS class providing the icon image
- * @return {Ext.button.Button} this
- */
- setIconCls: function(cls) {
- var me = this,
- btnIconEl = me.btnIconEl,
- oldCls = me.iconCls;
-
- me.iconCls = cls;
- if (btnIconEl) {
- // Remove the previous iconCls from the button
- btnIconEl.removeCls(oldCls);
- btnIconEl.addCls(cls || '');
- me.setComponentCls();
- if (me.didIconStateChange(oldCls, cls)) {
- me.updateLayout();
- }
- }
- return me;
- },
- <span id='Ext-button-Button-method-setTooltip'> /**
- </span> * Sets the tooltip for this Button.
- *
- * @param {String/Object} tooltip This may be:
- *
- * - **String** : A string to be used as innerHTML (html tags are accepted) to show in a tooltip
- * - **Object** : A configuration object for {@link Ext.tip.QuickTipManager#register}.
- *
- * @return {Ext.button.Button} this
- */
- setTooltip: function(tooltip, initial) {
- var me = this;
- if (me.rendered) {
- if (!initial) {
- me.clearTip();
- }
- if (Ext.isObject(tooltip)) {
- Ext.tip.QuickTipManager.register(Ext.apply({
- target: me.btnEl.id
- },
- tooltip));
- me.tooltip = tooltip;
- } else {
- me.btnEl.dom.setAttribute(me.getTipAttr(), tooltip);
- }
- } else {
- me.tooltip = tooltip;
- }
- return me;
- },
- <span id='Ext-button-Button-method-setTextAlign'> /**
- </span> * Sets the text alignment for this button.
- * @param {String} align The new alignment of the button text. See {@link #textAlign}.
- */
- setTextAlign: function(align) {
- var me = this,
- btnEl = me.btnEl;
- if (btnEl) {
- btnEl.removeCls(me.baseCls + '-' + me.textAlign);
- btnEl.addCls(me.baseCls + '-' + align);
- }
- me.textAlign = align;
- return me;
- },
- getTipAttr: function(){
- return this.tooltipType == 'qtip' ? 'data-qtip' : 'title';
- },
- // private
- getRefItems: function(deep){
- var menu = this.menu,
- items;
-
- if (menu) {
- items = menu.getRefItems(deep);
- items.unshift(menu);
- }
- return items || [];
- },
- // private
- clearTip: function() {
- if (Ext.isObject(this.tooltip)) {
- Ext.tip.QuickTipManager.unregister(this.btnEl);
- }
- },
- // private
- beforeDestroy: function() {
- var me = this;
- if (me.rendered) {
- me.clearTip();
- }
- if (me.menu && me.destroyMenu !== false) {
- Ext.destroy(me.menu);
- }
- Ext.destroy(me.btnInnerEl, me.repeater);
- me.callParent();
- },
- // private
- onDestroy: function() {
- var me = this;
- if (me.rendered) {
- me.doc.un('mouseover', me.monitorMouseOver, me);
- me.doc.un('mouseup', me.onMouseUp, me);
- delete me.doc;
- Ext.ButtonToggleManager.unregister(me);
- Ext.destroy(me.keyMap);
- delete me.keyMap;
- }
- me.callParent();
- },
- <span id='Ext-button-Button-method-setHandler'> /**
- </span> * Assigns this Button's click handler
- * @param {Function} handler The function to call when the button is clicked
- * @param {Object} [scope] The scope (`this` reference) in which the handler function is executed.
- * Defaults to this Button.
- * @return {Ext.button.Button} this
- */
- setHandler: function(handler, scope) {
- this.handler = handler;
- this.scope = scope;
- return this;
- },
- <span id='Ext-button-Button-method-setText'> /**
- </span> * Sets this Button's text
- * @param {String} text The button text
- * @return {Ext.button.Button} this
- */
- setText: function(text) {
- var me = this;
- me.text = text;
- if (me.rendered) {
- me.btnInnerEl.update(text || '&#160;');
- me.setComponentCls();
- if (Ext.isStrict && Ext.isIE8) {
- // weird repaint issue causes it to not resize
- me.el.repaint();
- }
- me.updateLayout();
- }
- return me;
- },
- <span id='Ext-button-Button-method-setIcon'> /**
- </span> * Sets the background image (inline style) of the button. This method also changes the value of the {@link #icon}
- * config internally.
- * @param {String} icon The path to an image to display in the button
- * @return {Ext.button.Button} this
- */
- setIcon: function(icon) {
- var me = this,
- btnIconEl = me.btnIconEl,
- oldIcon = me.icon;
-
- me.icon = icon;
- if (btnIconEl) {
- btnIconEl.setStyle('background-image', icon ? 'url(' + icon + ')': '');
- me.setComponentCls();
- if (me.didIconStateChange(oldIcon, icon)) {
- me.updateLayout();
- }
- }
- return me;
- },
-
- <span id='Ext-button-Button-method-didIconStateChange'> /**
- </span> * Checks if the icon/iconCls changed from being empty to having a value, or having a value to being empty.
- * @private
- * @param {String} old The old icon/iconCls
- * @param {String} current The current icon/iconCls
- * @return {Boolean} True if the icon state changed
- */
- didIconStateChange: function(old, current) {
- var currentEmpty = Ext.isEmpty(current);
- return Ext.isEmpty(old) ? !currentEmpty : currentEmpty;
- },
- <span id='Ext-button-Button-method-getText'> /**
- </span> * Gets the text for this Button
- * @return {String} The button text
- */
- getText: function() {
- return this.text;
- },
- <span id='Ext-button-Button-method-toggle'> /**
- </span> * If a state it passed, it becomes the pressed state otherwise the current state is toggled.
- * @param {Boolean} [state] Force a particular state
- * @param {Boolean} [suppressEvent=false] True to stop events being fired when calling this method.
- * @return {Ext.button.Button} this
- */
- toggle: function(state, suppressEvent) {
- var me = this;
- state = state === undefined ? !me.pressed: !!state;
- if (state !== me.pressed) {
- if (me.rendered) {
- me[state ? 'addClsWithUI': 'removeClsWithUI'](me.pressedCls);
- }
- me.pressed = state;
- if (!suppressEvent) {
- me.fireEvent('toggle', me, state);
- Ext.callback(me.toggleHandler, me.scope || me, [me, state]);
- }
- }
- return me;
- },
-
- maybeShowMenu: function(){
- var me = this;
- if (me.menu && !me.hasVisibleMenu() && !me.ignoreNextClick) {
- me.showMenu();
- }
- },
- <span id='Ext-button-Button-method-showMenu'> /**
- </span> * Shows this button's menu (if it has one)
- */
- showMenu: function() {
- var me = this;
- if (me.rendered && me.menu) {
- if (me.tooltip && me.getTipAttr() != 'title') {
- Ext.tip.QuickTipManager.getQuickTip().cancelShow(me.btnEl);
- }
- if (me.menu.isVisible()) {
- me.menu.hide();
- }
- me.menu.showBy(me.el, me.menuAlign, ((!Ext.isStrict && Ext.isIE) || Ext.isIE6) ? [-2, -2] : undefined);
- }
- return me;
- },
- <span id='Ext-button-Button-method-hideMenu'> /**
- </span> * Hides this button's menu (if it has one)
- */
- hideMenu: function() {
- if (this.hasVisibleMenu()) {
- this.menu.hide();
- }
- return this;
- },
- <span id='Ext-button-Button-method-hasVisibleMenu'> /**
- </span> * Returns true if the button has a menu and it is visible
- * @return {Boolean}
- */
- hasVisibleMenu: function() {
- var menu = this.menu;
- return menu && menu.rendered && menu.isVisible();
- },
- // private
- onRepeatClick: function(repeat, e) {
- this.onClick(e);
- },
- // private
- onClick: function(e) {
- var me = this;
- if (me.preventDefault || (me.disabled && me.getHref()) && e) {
- e.preventDefault();
- }
- if (e.button !== 0) {
- return;
- }
- if (!me.disabled) {
- me.doToggle();
- me.maybeShowMenu();
- me.fireHandler(e);
- }
- },
-
- fireHandler: function(e){
- var me = this,
- handler = me.handler;
-
- if (me.fireEvent('click', me, e) !== false) {
- if (handler) {
- handler.call(me.scope || me, me, e);
- }
- me.blur();
- }
- },
-
- doToggle: function(){
- var me = this;
- if (me.enableToggle && (me.allowDepress !== false || !me.pressed)) {
- me.toggle();
- }
- },
- <span id='Ext-button-Button-method-onMouseOver'> /**
- </span> * @private mouseover handler called when a mouseover event occurs anywhere within the encapsulating element.
- * The targets are interrogated to see what is being entered from where.
- * @param e
- */
- onMouseOver: function(e) {
- var me = this;
- if (!me.disabled && !e.within(me.el, true, true)) {
- me.onMouseEnter(e);
- }
- },
- <span id='Ext-button-Button-method-onMouseOut'> /**
- </span> * @private
- * mouseout handler called when a mouseout event occurs anywhere within the encapsulating element -
- * or the mouse leaves the encapsulating element.
- * The targets are interrogated to see what is being exited to where.
- * @param e
- */
- onMouseOut: function(e) {
- var me = this;
- if (!e.within(me.el, true, true)) {
- if (me.overMenuTrigger) {
- me.onMenuTriggerOut(e);
- }
- me.onMouseLeave(e);
- }
- },
- <span id='Ext-button-Button-method-onMouseMove'> /**
- </span> * @private
- * mousemove handler called when the mouse moves anywhere within the encapsulating element.
- * The position is checked to determine if the mouse is entering or leaving the trigger area. Using
- * mousemove to check this is more resource intensive than we'd like, but it is necessary because
- * the trigger area does not line up exactly with sub-elements so we don't always get mouseover/out
- * events when needed. In the future we should consider making the trigger a separate element that
- * is absolutely positioned and sized over the trigger area.
- */
- onMouseMove: function(e) {
- var me = this,
- el = me.el,
- over = me.overMenuTrigger,
- overlap, btnSize;
- if (me.split) {
- if (me.arrowAlign === 'right') {
- overlap = e.getX() - el.getX();
- btnSize = el.getWidth();
- } else {
- overlap = e.getY() - el.getY();
- btnSize = el.getHeight();
- }
- if (overlap > (btnSize - me.getTriggerSize())) {
- if (!over) {
- me.onMenuTriggerOver(e);
- }
- } else {
- if (over) {
- me.onMenuTriggerOut(e);
- }
- }
- }
- },
- <span id='Ext-button-Button-method-getTriggerSize'> /**
- </span> * @private
- * Measures the size of the trigger area for menu and split buttons. Will be a width for
- * a right-aligned trigger and a height for a bottom-aligned trigger. Cached after first measurement.
- */
- getTriggerSize: function() {
- var me = this,
- size = me.triggerSize,
- side, sideFirstLetter, undef;
- if (size === undef) {
- side = me.arrowAlign;
- sideFirstLetter = side.charAt(0);
- size = me.triggerSize = me.el.getFrameWidth(sideFirstLetter) + me.btnWrap.getFrameWidth(sideFirstLetter) + me.frameSize[side];
- }
- return size;
- },
- <span id='Ext-button-Button-method-onMouseEnter'> /**
- </span> * @private
- * virtual mouseenter handler called when it is detected that the mouseout event
- * signified the mouse entering the encapsulating element.
- * @param e
- */
- onMouseEnter: function(e) {
- var me = this;
- me.addClsWithUI(me.overCls);
- me.fireEvent('mouseover', me, e);
- },
- <span id='Ext-button-Button-method-onMouseLeave'> /**
- </span> * @private
- * virtual mouseleave handler called when it is detected that the mouseover event
- * signified the mouse entering the encapsulating element.
- * @param e
- */
- onMouseLeave: function(e) {
- var me = this;
- me.removeClsWithUI(me.overCls);
- me.fireEvent('mouseout', me, e);
- },
- <span id='Ext-button-Button-method-onMenuTriggerOver'> /**
- </span> * @private
- * virtual mouseenter handler called when it is detected that the mouseover event
- * signified the mouse entering the arrow area of the button - the `<em>`.
- * @param e
- */
- onMenuTriggerOver: function(e) {
- var me = this;
- me.overMenuTrigger = true;
- me.fireEvent('menutriggerover', me, me.menu, e);
- },
- <span id='Ext-button-Button-method-onMenuTriggerOut'> /**
- </span> * @private
- * virtual mouseleave handler called when it is detected that the mouseout event
- * signified the mouse leaving the arrow area of the button - the `<em>`.
- * @param e
- */
- onMenuTriggerOut: function(e) {
- var me = this;
- delete me.overMenuTrigger;
- me.fireEvent('menutriggerout', me, me.menu, e);
- },
- // inherit docs
- enable : function(silent) {
- var me = this;
- me.callParent(arguments);
- if (me.btnEl) {
- me.btnEl.dom.disabled = false;
- }
- me.removeClsWithUI('disabled');
- return me;
- },
- // inherit docs
- disable : function(silent) {
- var me = this;
- me.callParent(arguments);
- if (me.btnEl) {
- me.btnEl.dom.disabled = true;
- }
- me.addClsWithUI('disabled');
- me.removeClsWithUI(me.overCls);
- // IE renders disabled text by layering gray text on top of white text, offset by 1 pixel. Normally this is fine
- // but in some circumstances (such as using formBind) it gets confused and renders them side by side instead.
- if (me.btnInnerEl && (Ext.isIE6 || Ext.isIE7)) {
- me.btnInnerEl.repaint();
- }
- return me;
- },
- <span id='Ext-button-Button-method-setScale'> /**
- </span> * Method to change the scale of the button. See {@link #scale} for allowed configurations.
- * @param {String} scale The scale to change to.
- */
- setScale: function(scale) {
- var me = this,
- ui = me.ui.replace('-' + me.scale, '');
- //check if it is an allowed scale
- if (!Ext.Array.contains(me.allowedScales, scale)) {
- throw('#setScale: scale must be an allowed scale (' + me.allowedScales.join(', ') + ')');
- }
- me.scale = scale;
- me.setUI(ui);
- },
- // inherit docs
- setUI: function(ui) {
- var me = this;
- //we need to append the scale to the UI, if not already done
- if (me.scale && !ui.match(me.scale)) {
- ui = ui + '-' + me.scale;
- }
- me.callParent([ui]);
- // Set all the state classNames, as they need to include the UI
- // me.disabledCls += ' ' + me.baseCls + '-' + me.ui + '-disabled';
- },
- // private
- onMouseDown: function(e) {
- var me = this;
- if (!me.disabled && e.button === 0) {
- me.addClsWithUI(me.pressedCls);
- me.doc.on('mouseup', me.onMouseUp, me);
- }
- },
- // private
- onMouseUp: function(e) {
- var me = this;
- if (e.button === 0) {
- if (!me.pressed) {
- me.removeClsWithUI(me.pressedCls);
- }
- me.doc.un('mouseup', me.onMouseUp, me);
- }
- },
- // private
- onMenuShow: function(e) {
- var me = this;
- me.ignoreNextClick = 0;
- me.addClsWithUI(me.menuActiveCls);
- me.fireEvent('menushow', me, me.menu);
- },
- // private
- onMenuHide: function(e) {
- var me = this;
- me.removeClsWithUI(me.menuActiveCls);
- me.ignoreNextClick = Ext.defer(me.restoreClick, 250, me);
- me.fireEvent('menuhide', me, me.menu);
- },
- // private
- restoreClick: function() {
- this.ignoreNextClick = 0;
- },
- // private
- onDownKey: function() {
- var me = this;
- if (!me.disabled) {
- if (me.menu) {
- me.showMenu();
- }
- }
- },
- <span id='Ext-button-Button-method-getPersistentPadding'> /**
- </span> * @private
- * Some browsers (notably Safari and older Chromes on Windows) add extra "padding" inside the button
- * element that cannot be removed. This method returns the size of that padding with a one-time detection.
- * @return {Number[]} [top, right, bottom, left]
- */
- getPersistentPadding: function() {
- var me = this,
- reset = Ext.scopeResetCSS,
- padding = me.persistentPadding,
- btn, leftTop, btnEl, btnInnerEl, wrap;
- // Create auto-size button offscreen and measure its insides
- // Short-circuit IE as it sometimes gives false positive for padding
- if (!padding) {
- padding = me.self.prototype.persistentPadding = [0, 0, 0, 0];
- if (!Ext.isIE) {
- btn = new Ext.button.Button({
- text: 'test',
- style: 'position:absolute;top:-999px;'
- });
- btn.el = Ext.DomHelper.append(Ext.resetElement, btn.getRenderTree(), true);
- btn.applyChildEls(btn.el);
- btnEl = btn.btnEl;
- btnInnerEl = btn.btnInnerEl;
- btnEl.setSize(null, null); //clear any hard dimensions on the button el to see what it does naturally
- leftTop = btnInnerEl.getOffsetsTo(btnEl);
- padding[0] = leftTop[1];
- padding[1] = btnEl.getWidth() - btnInnerEl.getWidth() - leftTop[0];
- padding[2] = btnEl.getHeight() - btnInnerEl.getHeight() - leftTop[1];
- padding[3] = leftTop[0];
-
- btn.destroy();
- btn.el.remove();
- }
- }
- return padding;
- }
- }, function() {
- var groups = {},
- toggleGroup = function(btn, state) {
- if (state) {
- var g = groups[btn.toggleGroup],
- length = g.length,
- i;
- for (i = 0; i < length; i++) {
- if (g[i] !== btn) {
- g[i].toggle(false);
- }
- }
- }
- };
- // Private utility class used by Button
- Ext.ButtonToggleManager = {
- register: function(btn) {
- if (!btn.toggleGroup) {
- return;
- }
- var group = groups[btn.toggleGroup];
- if (!group) {
- group = groups[btn.toggleGroup] = [];
- }
- group.push(btn);
- btn.on('toggle', toggleGroup);
- },
- unregister: function(btn) {
- if (!btn.toggleGroup) {
- return;
- }
- var group = groups[btn.toggleGroup];
- if (group) {
- Ext.Array.remove(group, btn);
- btn.un('toggle', toggleGroup);
- }
- },
- // Gets the pressed button in the passed group or null
- // @param {String} group
- // @return {Ext.button.Button}
- getPressed: function(group) {
- var g = groups[group],
- i = 0,
- len;
- if (g) {
- for (len = g.length; i < len; i++) {
- if (g[i].pressed === true) {
- return g[i];
- }
- }
- }
- return null;
- }
- };
- });
- </pre>
- </body>
- </html>
|