Upgrade to ExtJS 4.0.0 - Released 04/26/2011
[extjs.git] / src / menu / CheckItem.js
1 /**
2  * @class Ext.menu.CheckItem
3  * @extends Ext.menu.Item
4
5 A menu item that contains a togglable checkbox by default, but that can also be a part of a radio group.
6 {@img Ext.menu.CheckItem/Ext.menu.CheckItem.png Ext.menu.CheckItem component}
7 __Example Usage__    
8     Ext.create('Ext.menu.Menu', {
9                 width: 100,
10                 height: 110,
11                 floating: false,  // usually you want this set to True (default)
12                 renderTo: Ext.getBody(),  // usually rendered by it's containing component
13                 items: [{
14                     xtype: 'menucheckitem',
15                     text: 'select all'
16                 },{
17                     xtype: 'menucheckitem',
18                         text: 'select specific',
19                 },{
20             iconCls: 'add16',
21                     text: 'icon item' 
22                 },{
23                     text: 'regular item'
24                 }]
25         }); 
26         
27  * @xtype menucheckitem
28  * @markdown
29  * @constructor
30  * @param {Object} config The config object
31  */
32
33 Ext.define('Ext.menu.CheckItem', {
34     extend: 'Ext.menu.Item',
35     alias: 'widget.menucheckitem',
36
37     /**
38      * @cfg {String} checkedCls
39      * The CSS class used by {@link #cls} to show the checked state.
40      * Defaults to `Ext.baseCSSPrefix + 'menu-item-checked'`.
41      * @markdown
42      */
43     checkedCls: Ext.baseCSSPrefix + 'menu-item-checked',
44     /**
45      * @cfg {String} uncheckedCls
46      * The CSS class used by {@link #cls} to show the unchecked state.
47      * Defaults to `Ext.baseCSSPrefix + 'menu-item-unchecked'`.
48      * @markdown
49      */
50     uncheckedCls: Ext.baseCSSPrefix + 'menu-item-unchecked',
51     /**
52      * @cfg {String} groupCls
53      * The CSS class applied to this item's icon image to denote being a part of a radio group.
54      * Defaults to `Ext.baseCSSClass + 'menu-group-icon'`.
55      * Any specified {@link #iconCls} overrides this.
56      * @markdown
57      */
58     groupCls: Ext.baseCSSPrefix + 'menu-group-icon',
59
60     /**
61      * @cfg {Boolean} hideOnClick
62      * Whether to not to hide the owning menu when this item is clicked.
63      * Defaults to `false` for checkbox items, and to `true` for radio group items.
64      * @markdown
65      */
66     hideOnClick: false,
67
68     afterRender: function() {
69         var me = this;
70         this.callParent();
71         me.checked = !me.checked;
72         me.setChecked(!me.checked, true);
73     },
74
75     initComponent: function() {
76         var me = this;
77         me.addEvents(
78             /**
79              * @event beforecheckchange
80              * Fires before a change event. Return false to cancel.
81              * @param {Ext.menu.CheckItem} this
82              * @param {Boolean} checked
83              */
84             'beforecheckchange',
85
86             /**
87              * @event checkchange
88              * Fires after a change event.
89              * @param {Ext.menu.CheckItem} this
90              * @param {Boolean} checked
91              */
92             'checkchange'
93         );
94
95         me.callParent(arguments);
96
97         Ext.menu.Manager.registerCheckable(me);
98
99         if (me.group) {
100             if (!me.iconCls) {
101                 me.iconCls = me.groupCls;
102             }
103             if (me.initialConfig.hideOnClick !== false) {
104                 me.hideOnClick = true;
105             }
106         }
107     },
108
109     /**
110      * Disables just the checkbox functionality of this menu Item. If this menu item has a submenu, that submenu
111      * will still be accessible
112      */
113     disableCheckChange: function() {
114         var me = this;
115
116         me.iconEl.addCls(me.disabledCls);
117         me.checkChangeDisabled = true;
118     },
119
120     /**
121      * Reenables the checkbox functionality of this menu item after having been disabled by {@link #disableCheckChange}
122      */
123     enableCheckChange: function() {
124         var me = this;
125
126         me.iconEl.removeCls(me.disabledCls);
127         me.checkChangeDisabled = false;
128     },
129
130     onClick: function(e) {
131         var me = this;
132         if(!me.disabled && !me.checkChangeDisabled && !(me.checked && me.group)) {
133             me.setChecked(!me.checked);
134         }
135         this.callParent([e]);
136     },
137
138     onDestroy: function() {
139         Ext.menu.Manager.unregisterCheckable(this);
140         this.callParent(arguments);
141     },
142
143     /**
144      * Sets the checked state of the item
145      * @param {Boolean} checked True to check, false to uncheck
146      * @param {Boolean} suppressEvents (optional) True to prevent firing the checkchange events. Defaults to `false`.
147      * @markdown
148      */
149     setChecked: function(checked, suppressEvents) {
150         var me = this;
151         if (me.checked !== checked && (suppressEvents || me.fireEvent('beforecheckchange', me, checked) !== false)) {
152             if (me.el) {
153                 me.el[checked  ? 'addCls' : 'removeCls'](me.checkedCls)[!checked ? 'addCls' : 'removeCls'](me.uncheckedCls);
154             }
155             me.checked = checked;
156             Ext.menu.Manager.onCheckChange(me, checked);
157             if (!suppressEvents) {
158                 Ext.callback(me.checkHandler, me.scope, [me, checked]);
159                 me.fireEvent('checkchange', me, checked);
160             }
161         }
162     }
163 });