/**
* A custom {@link Ext.data.Store} for the {@link Ext.grid.property.Grid}. This class handles
* the mapping between the custom data source objects supported by the grid and the
* {@link Ext.grid.property.Property} format used by the {@link Ext.data.Store} base class.
*/
Ext.define('Ext.grid.property.Store', {
extend: 'Ext.data.Store',
alternateClassName: 'Ext.grid.PropertyStore',
requires: [
'Ext.grid.property.Reader',
'Ext.data.proxy.Memory',
'Ext.grid.property.Property'
],
remoteSort: true,
/**
* Creates new property store.
* @param {Ext.grid.Panel} grid The grid this store will be bound to
* @param {Object} source The source data config object
*/
constructor: function(grid, source) {
var me = this;
me.grid = grid;
me.source = source;
me.callParent([{
data: source,
model: Ext.grid.property.Property,
proxy: me.getProxy()
}]);
},
// Return a singleton, customized Proxy object which configures itself with a custom Reader
getProxy: function() {
var proxy = this.proxy;
if (!proxy) {
proxy = this.proxy = new Ext.data.proxy.Memory({
model: Ext.grid.property.Property,
reader: this.getReader()
});
}
return proxy;
},
// Return a singleton, customized Reader object which reads Ext.grid.property.Property
// records from an object.
getReader: function() {
var reader = this.reader;
if (!reader) {
reader = this.reader = new Ext.grid.property.Reader({
model: Ext.grid.property.Property
});
}
return reader;
},
// @protected
// Should only be called by the grid. Use grid.setSource instead.
setSource: function(dataObject) {
var me = this;
me.source = dataObject;
me.suspendEvents();
me.removeAll();
me.getProxy().setData(dataObject);
me.load();
me.resumeEvents();
me.fireEvent('datachanged', me);
me.fireEvent('refresh', me);
},
/**
* @private
*/
getProperty: function(row) {
var rec = Ext.isNumber(row) ? this.getAt(row) : this.getById(row),
ret = null;
if (rec) {
ret = rec.get('value');
}
return ret;
},
/**
* @private
*/
setValue: function(prop, value, create) {
var me = this,
rec = me.getRec(prop);
if (rec) {
rec.set('value', value);
me.source[prop] = value;
}
else if (create) {
// only create if specified.
me.source[prop] = value;
rec = new Ext.grid.property.Property({ name: prop, value: value }, prop);
me.add(rec);
}
},
/**
* @private
*/
remove: function(prop) {
var rec = this.getRec(prop);
if (rec) {
this.callParent([rec]);
delete this.source[prop];
}
},
/**
* @private
*/
getRec: function(prop) {
return this.getById(prop);
},
/**
* @protected
* Should only be called by the grid. Use grid.getSource instead.
*/
getSource: function() {
return this.source;
},
doDestroy: function() {
Ext.destroy(this.reader, this.proxy);
this.callParent();
}
});