Ext.define('Ext.ux.grid.menu.ListMenu', {
extend: 'Ext.menu.Menu',
labelField : 'text',
loadingText : 'Loading...',
loadOnShow : true,
single : false,
constructor : function (cfg) {
var me = this,
options,
i,
len,
value;
me.selected = [];
me.addEvents(
'checkchange'
);
me.callParent([cfg = cfg || {}]);
if(!cfg.store && cfg.options) {
options = [];
for(i = 0, len = cfg.options.length; i < len; i++){
value = cfg.options[i];
switch(Ext.type(value)){
case 'array': options.push(value); break;
case 'object': options.push([value.id, value[me.labelField]]); break;
case 'string': options.push([value, value]); break;
}
}
me.store = Ext.create('Ext.data.ArrayStore', {
fields: ['id', me.labelField],
data: options,
listeners: {
load: me.onLoad,
scope: me
}
});
me.loaded = true;
me.autoStore = true;
} else {
me.add({
text: me.loadingText,
iconCls: 'loading-indicator'
});
me.store.on('load', me.onLoad, me);
}
},
destroy : function () {
var me = this,
store = me.store;
if (store) {
if (me.autoStore) {
store.destroyStore();
} else {
store.un('unload', me.onLoad, me);
}
}
me.callParent();
},
show : function () {
if (this.loadOnShow && !this.loaded && !this.store.loading) {
this.store.load();
}
this.callParent();
},
onLoad : function (store, records) {
var me = this,
gid, itemValue, i, len,
listeners = {
checkchange: me.checkChange,
scope: me
};
Ext.suspendLayouts();
me.removeAll(true);
gid = me.single ? Ext.id() : null;
for (i = 0, len = records.length; i < len; i++) {
itemValue = records[i].get('id');
me.add(Ext.create('Ext.menu.CheckItem', {
text: records[i].get(me.labelField),
group: gid,
checked: Ext.Array.contains(me.selected, itemValue),
hideOnClick: false,
value: itemValue,
listeners: listeners
}));
}
me.loaded = true;
Ext.resumeLayouts(true);
me.fireEvent('load', me, records);
},
getSelected : function () {
return this.selected;
},
setSelected : function (value) {
value = this.selected = [].concat(value);
if (this.loaded) {
this.items.each(function(item){
item.setChecked(false, true);
for (var i = 0, len = value.length; i < len; i++) {
if (item.value == value[i]) {
item.setChecked(true, true);
}
}
}, this);
}
},
checkChange : function (item, checked) {
var value = [];
this.items.each(function(item){
if (item.checked) {
value.push(item.value);
}
},this);
this.selected = value;
this.fireEvent('checkchange', item, checked);
}
});