123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576 |
- <!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-menu-Item'>/**
- </span> * A base class for all menu items that require menu-related functionality such as click handling,
- * sub-menus, icons, etc.
- *
- * @example
- * Ext.create('Ext.menu.Menu', {
- * width: 100,
- * height: 100,
- * floating: false, // usually you want this set to True (default)
- * renderTo: Ext.getBody(), // usually rendered by it's containing component
- * items: [{
- * text: 'icon item',
- * iconCls: 'add16'
- * },{
- * text: 'text item'
- * },{
- * text: 'plain item',
- * plain: true
- * }]
- * });
- */
- Ext.define('Ext.menu.Item', {
- extend: 'Ext.Component',
- alias: 'widget.menuitem',
- alternateClassName: 'Ext.menu.TextItem',
- <span id='Ext-menu-Item-property-activated'> /**
- </span> * @property {Boolean} activated
- * Whether or not this item is currently activated
- */
- <span id='Ext-menu-Item-property-parentMenu'> /**
- </span> * @property {Ext.menu.Menu} parentMenu
- * The parent Menu of this item.
- */
- <span id='Ext-menu-Item-cfg-activeCls'> /**
- </span> * @cfg {String} activeCls
- * The CSS class added to the menu item when the item is activated (focused/mouseover).
- */
- activeCls: Ext.baseCSSPrefix + 'menu-item-active',
- <span id='Ext-menu-Item-cfg-ariaRole'> /**
- </span> * @cfg {String} ariaRole
- * @private
- */
- ariaRole: 'menuitem',
- <span id='Ext-menu-Item-cfg-canActivate'> /**
- </span> * @cfg {Boolean} canActivate
- * Whether or not this menu item can be activated when focused/mouseovered.
- */
- canActivate: true,
- <span id='Ext-menu-Item-cfg-clickHideDelay'> /**
- </span> * @cfg {Number} clickHideDelay
- * The delay in milliseconds to wait before hiding the menu after clicking the menu item.
- * This only has an effect when `hideOnClick: true`.
- */
- clickHideDelay: 1,
- <span id='Ext-menu-Item-cfg-destroyMenu'> /**
- </span> * @cfg {Boolean} destroyMenu
- * Whether or not to destroy any associated sub-menu when this item is destroyed.
- */
- destroyMenu: true,
- <span id='Ext-menu-Item-cfg-disabledCls'> /**
- </span> * @cfg {String} disabledCls
- * The CSS class added to the menu item when the item is disabled.
- */
- disabledCls: Ext.baseCSSPrefix + 'menu-item-disabled',
- <span id='Ext-menu-Item-cfg-href'> /**
- </span> * @cfg {String} [href='#']
- * The href attribute to use for the underlying anchor link.
- */
- <span id='Ext-menu-Item-cfg-hrefTarget'> /**
- </span> * @cfg {String} hrefTarget
- * The target attribute to use for the underlying anchor link.
- */
- <span id='Ext-menu-Item-cfg-hideOnClick'> /**
- </span> * @cfg {Boolean} hideOnClick
- * Whether to not to hide the owning menu when this item is clicked.
- */
- hideOnClick: true,
- <span id='Ext-menu-Item-cfg-icon'> /**
- </span> * @cfg {String} icon
- * The path to an icon to display in this item.
- *
- * Defaults to `Ext.BLANK_IMAGE_URL`.
- */
- <span id='Ext-menu-Item-cfg-iconCls'> /**
- </span> * @cfg {String} iconCls
- * A CSS class that specifies a `background-image` to use as the icon for this item.
- */
- isMenuItem: true,
- <span id='Ext-menu-Item-cfg-menu'> /**
- </span> * @cfg {Ext.menu.Menu/Object} menu
- * Either an instance of {@link Ext.menu.Menu} or a config object for an {@link Ext.menu.Menu}
- * which will act as a sub-menu to this item.
- */
- <span id='Ext-menu-Item-property-menu'> /**
- </span> * @property {Ext.menu.Menu} menu The sub-menu associated with this item, if one was configured.
- */
- <span id='Ext-menu-Item-cfg-menuAlign'> /**
- </span> * @cfg {String} menuAlign
- * The default {@link Ext.Element#getAlignToXY Ext.Element.getAlignToXY} anchor position value for this
- * item's sub-menu relative to this item's position.
- */
- menuAlign: 'tl-tr?',
- <span id='Ext-menu-Item-cfg-menuExpandDelay'> /**
- </span> * @cfg {Number} menuExpandDelay
- * The delay in milliseconds before this item's sub-menu expands after this item is moused over.
- */
- menuExpandDelay: 200,
- <span id='Ext-menu-Item-cfg-menuHideDelay'> /**
- </span> * @cfg {Number} menuHideDelay
- * The delay in milliseconds before this item's sub-menu hides after this item is moused out.
- */
- menuHideDelay: 200,
- <span id='Ext-menu-Item-cfg-plain'> /**
- </span> * @cfg {Boolean} plain
- * Whether or not this item is plain text/html with no icon or visual activation.
- */
- <span id='Ext-menu-Item-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-menu-Item-cfg-tooltipType'> /**
- </span> * @cfg {String} tooltipType
- * The type of tooltip to use. Either 'qtip' for QuickTips or 'title' for title attribute.
- */
- tooltipType: 'qtip',
- arrowCls: Ext.baseCSSPrefix + 'menu-item-arrow',
- childEls: [
- 'itemEl', 'iconEl', 'textEl', 'arrowEl'
- ],
- renderTpl: [
- '<tpl if="plain">',
- '{text}',
- '<tpl else>',
- '<a id="{id}-itemEl" class="' + Ext.baseCSSPrefix + 'menu-item-link" href="{href}" <tpl if="hrefTarget">target="{hrefTarget}"</tpl> hidefocus="true" unselectable="on">',
- '<img id="{id}-iconEl" src="{icon}" class="' + Ext.baseCSSPrefix + 'menu-item-icon {iconCls}" />',
- '<span id="{id}-textEl" class="' + Ext.baseCSSPrefix + 'menu-item-text" <tpl if="arrowCls">style="margin-right: 17px;"</tpl> >{text}</span>',
- '<img id="{id}-arrowEl" src="{blank}" class="{arrowCls}" />',
- '</a>',
- '</tpl>'
- ],
- maskOnDisable: false,
- <span id='Ext-menu-Item-cfg-text'> /**
- </span> * @cfg {String} text
- * The text/html to display in this item.
- */
- <span id='Ext-menu-Item-cfg-handler'> /**
- </span> * @cfg {Function} handler
- * A function called when the menu item is clicked (can be used instead of {@link #click} event).
- * @cfg {Ext.menu.Item} handler.item The item that was clicked
- * @cfg {Ext.EventObject} handler.e The underyling {@link Ext.EventObject}.
- */
- activate: function() {
- var me = this;
- if (!me.activated && me.canActivate && me.rendered && !me.isDisabled() && me.isVisible()) {
- me.el.addCls(me.activeCls);
- me.focus();
- me.activated = true;
- me.fireEvent('activate', me);
- }
- },
- getFocusEl: function() {
- return this.itemEl;
- },
- deactivate: function() {
- var me = this;
- if (me.activated) {
- me.el.removeCls(me.activeCls);
- me.blur();
- me.hideMenu();
- me.activated = false;
- me.fireEvent('deactivate', me);
- }
- },
- deferExpandMenu: function() {
- var me = this;
- if (me.activated && (!me.menu.rendered || !me.menu.isVisible())) {
- me.parentMenu.activeChild = me.menu;
- me.menu.parentItem = me;
- me.menu.parentMenu = me.menu.ownerCt = me.parentMenu;
- me.menu.showBy(me, me.menuAlign);
- }
- },
- deferHideMenu: function() {
- if (this.menu.isVisible()) {
- this.menu.hide();
- }
- },
-
- cancelDeferHide: function(){
- clearTimeout(this.hideMenuTimer);
- },
- deferHideParentMenus: function() {
- var ancestor;
- Ext.menu.Manager.hideAll();
- if (!Ext.Element.getActiveElement()) {
- // If we have just hidden all Menus, and there is no currently focused element in the dom, transfer focus to the first visible ancestor if any.
- ancestor = this.up(':not([hidden])');
- if (ancestor) {
- ancestor.focus();
- }
- }
- },
- expandMenu: function(delay) {
- var me = this;
- if (me.menu) {
- me.cancelDeferHide();
- if (delay === 0) {
- me.deferExpandMenu();
- } else {
- me.expandMenuTimer = Ext.defer(me.deferExpandMenu, Ext.isNumber(delay) ? delay : me.menuExpandDelay, me);
- }
- }
- },
- getRefItems: function(deep){
- var menu = this.menu,
- items;
- if (menu) {
- items = menu.getRefItems(deep);
- items.unshift(menu);
- }
- return items || [];
- },
- hideMenu: function(delay) {
- var me = this;
- if (me.menu) {
- clearTimeout(me.expandMenuTimer);
- me.hideMenuTimer = Ext.defer(me.deferHideMenu, Ext.isNumber(delay) ? delay : me.menuHideDelay, me);
- }
- },
- initComponent: function() {
- var me = this,
- prefix = Ext.baseCSSPrefix,
- cls = [prefix + 'menu-item'],
- menu;
- me.addEvents(
- <span id='Ext-menu-Item-event-activate'> /**
- </span> * @event activate
- * Fires when this item is activated
- * @param {Ext.menu.Item} item The activated item
- */
- 'activate',
- <span id='Ext-menu-Item-event-click'> /**
- </span> * @event click
- * Fires when this item is clicked
- * @param {Ext.menu.Item} item The item that was clicked
- * @param {Ext.EventObject} e The underyling {@link Ext.EventObject}.
- */
- 'click',
- <span id='Ext-menu-Item-event-deactivate'> /**
- </span> * @event deactivate
- * Fires when this tiem is deactivated
- * @param {Ext.menu.Item} item The deactivated item
- */
- 'deactivate'
- );
- if (me.plain) {
- cls.push(prefix + 'menu-item-plain');
- }
- if (me.cls) {
- cls.push(me.cls);
- }
- me.cls = cls.join(' ');
- if (me.menu) {
- menu = me.menu;
- delete me.menu;
- me.setMenu(menu);
- }
- me.callParent(arguments);
- },
- onClick: function(e) {
- var me = this;
- if (!me.href) {
- e.stopEvent();
- }
- if (me.disabled) {
- return;
- }
- if (me.hideOnClick) {
- me.deferHideParentMenusTimer = Ext.defer(me.deferHideParentMenus, me.clickHideDelay, me);
- }
- Ext.callback(me.handler, me.scope || me, [me, e]);
- me.fireEvent('click', me, e);
- if (!me.hideOnClick) {
- me.focus();
- }
- },
- onRemoved: function() {
- var me = this;
- // Removing the active item, must deactivate it.
- if (me.activated && me.parentMenu.activeItem === me) {
- me.parentMenu.deactivateActiveItem();
- }
- me.callParent(arguments);
- delete me.parentMenu;
- delete me.ownerButton;
- },
- // private
- beforeDestroy: function() {
- var me = this;
- if (me.rendered) {
- me.clearTip();
- }
- me.callParent();
- },
- onDestroy: function() {
- var me = this;
- clearTimeout(me.expandMenuTimer);
- me.cancelDeferHide();
- clearTimeout(me.deferHideParentMenusTimer);
- me.setMenu(null);
- me.callParent(arguments);
- },
- beforeRender: function() {
- var me = this,
- blank = Ext.BLANK_IMAGE_URL,
- iconCls,
- arrowCls;
- me.callParent();
- if (me.iconAlign === 'right') {
- iconCls = me.checkChangeDisabled ? me.disabledCls : '';
- arrowCls = Ext.baseCSSPrefix + 'menu-item-icon-right ' + me.iconCls;
- } else {
- iconCls = me.iconCls + (me.checkChangeDisabled ? ' ' + me.disabledCls : '');
- arrowCls = me.menu ? me.arrowCls : '';
- }
- Ext.applyIf(me.renderData, {
- href: me.href || '#',
- hrefTarget: me.hrefTarget,
- icon: me.icon || blank,
- iconCls: iconCls,
- plain: me.plain,
- text: me.text,
- arrowCls: arrowCls,
- blank: blank
- });
- },
- onRender: function() {
- var me = this;
- me.callParent(arguments);
- if (me.tooltip) {
- me.setTooltip(me.tooltip, true);
- }
- },
-
- <span id='Ext-menu-Item-method-setMenu'> /**
- </span> * Set a child menu for this item. See the {@link #cfg-menu} configuration.
- * @param {Ext.menu.Menu/Object} menu A menu, or menu configuration. null may be
- * passed to remove the menu.
- * @param {Boolean} [destroyMenu] True to destroy any existing menu. False to
- * prevent destruction. If not specified, the {@link #destroyMenu} configuration
- * will be used.
- */
- setMenu: function(menu, destroyMenu) {
- var me = this,
- oldMenu = me.menu,
- arrowEl = me.arrowEl;
-
- if (oldMenu) {
- delete oldMenu.parentItem;
- delete oldMenu.parentMenu;
- delete oldMenu.ownerCt;
- delete oldMenu.ownerItem;
-
- if (destroyMenu === true || (destroyMenu !== false && me.destroyMenu)) {
- Ext.destroy(oldMenu);
- }
- }
- if (menu) {
- me.menu = Ext.menu.Manager.get(menu);
- me.menu.ownerItem = me;
- } else {
- me.menu = null;
- }
-
- if (me.rendered && !me.destroying && arrowEl) {
- arrowEl[me.menu ? 'addCls' : 'removeCls'](me.arrowCls);
- }
- },
- <span id='Ext-menu-Item-method-setHandler'> /**
- </span> * Sets the {@link #click} handler of this item
- * @param {Function} fn The handler function
- * @param {Object} [scope] The scope of the handler function
- */
- setHandler: function(fn, scope) {
- this.handler = fn || null;
- this.scope = scope;
- },
-
- <span id='Ext-menu-Item-method-setIcon'> /**
- </span> * Sets the {@link #icon} on this item.
- * @param {String} icon The new icon
- */
- setIcon: function(icon){
- var iconEl = this.iconEl;
- if (iconEl) {
- iconEl.src = icon || Ext.BLANK_IMAGE_URL;
- }
- this.icon = icon;
- },
- <span id='Ext-menu-Item-method-setIconCls'> /**
- </span> * Sets the {@link #iconCls} of this item
- * @param {String} iconCls The CSS class to set to {@link #iconCls}
- */
- setIconCls: function(iconCls) {
- var me = this,
- iconEl = me.iconEl;
- if (iconEl) {
- if (me.iconCls) {
- iconEl.removeCls(me.iconCls);
- }
- if (iconCls) {
- iconEl.addCls(iconCls);
- }
- }
- me.iconCls = iconCls;
- },
- <span id='Ext-menu-Item-method-setText'> /**
- </span> * Sets the {@link #text} of this item
- * @param {String} text The {@link #text}
- */
- setText: function(text) {
- var me = this,
- el = me.textEl || me.el;
- me.text = text;
- if (me.rendered) {
- el.update(text || '');
- // cannot just call layout on the component due to stretchmax
- me.ownerCt.updateLayout();
- }
- },
- getTipAttr: function(){
- return this.tooltipType == 'qtip' ? 'data-qtip' : 'title';
- },
- //private
- clearTip: function() {
- if (Ext.isObject(this.tooltip)) {
- Ext.tip.QuickTipManager.unregister(this.itemEl);
- }
- },
- <span id='Ext-menu-Item-method-setTooltip'> /**
- </span> * Sets the tooltip for this menu item.
- *
- * @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.menu.Item} 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.itemEl.id
- },
- tooltip));
- me.tooltip = tooltip;
- } else {
- me.itemEl.dom.setAttribute(me.getTipAttr(), tooltip);
- }
- } else {
- me.tooltip = tooltip;
- }
- return me;
- }
- });
- </pre>
- </body>
- </html>
|