/** * @private */Ext.define('Ext.dataview.component.Container', { extend: 'Ext.Container', requires: [ 'Ext.dataview.component.DataItem' ], /** * @event itemtouchstart * Fires whenever an item is touched * @param {Ext.dataview.component.Container} this * @param {Ext.dataview.component.DataItem} item The item touched * @param {Number} index The index of the item touched * @param {Ext.event.Event} e The event object */ /** * @event itemtouchmove * Fires whenever an item is moved * @param {Ext.dataview.component.Container} this * @param {Ext.dataview.component.DataItem} item The item moved * @param {Number} index The index of the item moved * @param {Ext.event.Event} e The event object */ /** * @event itemtouchend * Fires whenever an item is touched * @param {Ext.dataview.component.Container} this * @param {Ext.dataview.component.DataItem} item The item touched * @param {Number} index The index of the item touched * @param {Ext.event.Event} e The event object */ /** * @event itemtap * Fires whenever an item is tapped * @param {Ext.dataview.component.Container} this * @param {Ext.dataview.component.DataItem} item The item tapped * @param {Number} index The index of the item tapped * @param {Ext.event.Event} e The event object */ /** * @event itemtaphold * Fires whenever an item is tapped * @param {Ext.dataview.component.Container} this * @param {Ext.dataview.component.DataItem} item The item tapped * @param {Number} index The index of the item tapped * @param {Ext.event.Event} e The event object */ /** * @event itemsingletap * Fires whenever an item is doubletapped * @param {Ext.dataview.component.Container} this * @param {Ext.dataview.component.DataItem} item The item singletapped * @param {Number} index The index of the item singletapped * @param {Ext.event.Event} e The event object */ /** * @event itemdoubletap * Fires whenever an item is doubletapped * @param {Ext.dataview.component.Container} this * @param {Ext.dataview.component.DataItem} item The item doubletapped * @param {Number} index The index of the item doubletapped * @param {Ext.event.Event} e The event object */ /** * @event itemswipe * Fires whenever an item is swiped * @param {Ext.dataview.component.Container} this * @param {Ext.dataview.component.DataItem} item The item swiped * @param {Number} index The index of the item swiped * @param {Ext.event.Event} e The event object */ /** * @event mouseover * Fires whenever the a mouseover event is received on an item * @param {Ext.dataview.component.Container} this * @param {Ext.dataview.component.DataItem} item The item * @param {Number} index The index of the item * @param {Ext.event.Event} e The event object */ /** * @event mouseout * Fires whenever a mouseout event is received on an item * @param {Ext.dataview.component.Container} this * @param {Ext.dataview.component.DataItem} item The item * @param {Number} index The index of the item * @param {Ext.event.Event} e The event object */ classCls: Ext.baseCSSPrefix + 'dataview-container', itemSelector: '.' + Ext.baseCSSPrefix + 'dataview-container > .' + Ext.baseCSSPrefix + 'dataitem', constructor: function() { this.itemCache = []; this.callParent(arguments); }, /** * @private */ doInitialize: function() { this.innerElement.on({ touchstart: 'onItemTouchStart', touchend: 'onItemTouchEnd', tap: 'onItemTap', taphold: 'onItemTapHold', touchmove: 'onItemTouchMove', singletap: 'onItemSingleTap', doubletap: 'onItemDoubleTap', swipe: 'onItemSwipe', mouseover: 'onItemMouseOver', mouseout: 'onItemMouseOut', delegate: '> .' + Ext.baseCSSPrefix + 'dataitem', scope: this }); }, /** * @private */ initialize: function() { this.callParent(); this.doInitialize(); }, onItemTouchStart: function(e) { var me = this, target = e.currentTarget, item = Ext.getCmp(target.id); item.on({ touchmove: 'onItemTouchMove', scope : me, single: true }); me.fireEvent('itemtouchstart', me, item, me.indexOf(item), e); }, onItemTouchMove: function(e) { var me = this, target = e.currentTarget, item = Ext.getCmp(target.id); me.fireEvent('itemtouchmove', me, item, me.indexOf(item), e); }, onItemTouchEnd: function(e) { var me = this, target = e.currentTarget, item = Ext.getCmp(target.id); item.un({ touchmove: 'onItemTouchMove', scope : me }); me.fireEvent('itemtouchend', me, item, me.indexOf(item), e); }, onItemTap: function(e) { var me = this, target = e.currentTarget, item = Ext.getCmp(target.id); me.fireEvent('itemtap', me, item, me.indexOf(item), e); }, onItemTapHold: function(e) { var me = this, target = e.currentTarget, item = Ext.getCmp(target.id); me.fireEvent('itemtaphold', me, item, me.indexOf(item), e); }, onItemSingleTap: function(e) { var me = this, target = e.currentTarget, item = Ext.getCmp(target.id); me.fireEvent('itemsingletap', me, item, me.indexOf(item), e); }, onItemDoubleTap: function(e) { var me = this, target = e.currentTarget, item = Ext.getCmp(target.id); me.fireEvent('itemdoubletap', me, item, me.indexOf(item), e); }, onItemSwipe: function(e) { var me = this, target = e.currentTarget, item = Ext.getCmp(target.id); me.fireEvent('itemswipe', me, item, me.indexOf(item), e); }, onItemMouseOver: function(e) { var me = this, target = e.currentTarget, item = Ext.getCmp(target.id); me.fireEvent('itemmouseover', me, item, me.indexOf(item), e); }, onItemMouseOut: function(e) { var me = this, target = e.currentTarget, item = Ext.getCmp(target.id); me.fireEvent('itemmouseout', me, item, me.indexOf(item), e); }, moveItemsToCache: function(from, to) { var me = this, dataview = me.dataview, maxItemCache = dataview.getMaxItemCache(), items = me.getViewItems(), itemCache = me.itemCache, cacheLn = itemCache.length, pressedCls = dataview.pressedCls, selectedCls = dataview.selectedCls, i = to - from, item; for (; i >= 0; i--) { item = items[from + i]; if (cacheLn !== maxItemCache) { me.remove(item, false); item.removeCls([pressedCls, selectedCls]); itemCache.push(item); cacheLn++; } else { item.destroy(); } } if (me.getViewItems().length == 0) { this.dataview.showEmptyText(); } }, moveItemsFromCache: function(records) { var me = this, dataview = me.dataview, store = dataview.getStore(), ln = records.length, xtype = dataview.getDefaultType(), itemConfig = dataview.getItemConfig(), itemCache = me.itemCache, cacheLn = itemCache.length, items = [], i, item, record; if (ln) { dataview.hideEmptyText(); } for (i = 0; i < ln; i++) { records[i]._tmpIndex = store.indexOf(records[i]); } Ext.Array.sort(records, function(record1, record2) { return record1._tmpIndex > record2._tmpIndex ? 1 : -1; }); for (i = 0; i < ln; i++) { record = records[i]; if (cacheLn) { cacheLn--; item = itemCache.pop(); this.updateListItem(record, item); } else { item = me.getDataItemConfig(xtype, record, itemConfig); } item = this.insert(record._tmpIndex, item); delete record._tmpIndex; } return items; }, getViewItems: function() { return this.getInnerItems(); }, updateListItem: function(record, item) { if (item.updateRecord) { if (item.getRecord() === record) { item.updateRecord(record); } else { item.setRecord(record); } } }, getDataItemConfig: function(xtype, record, itemConfig) { var dataview = this.dataview, dataItemConfig = { xtype: xtype, record: record, itemCls: dataview.getItemCls(), defaults: itemConfig, dataview: dataview }; return Ext.merge(dataItemConfig, itemConfig); }, doRemoveItemCls: function(cls) { var items = this.getViewItems(), ln = items.length, i = 0; for (; i < ln; i++) { items[i].removeCls(cls); } }, doAddItemCls: function(cls) { var items = this.getViewItems(), ln = items.length, i = 0; for (; i < ln; i++) { items[i].addCls(cls); } }, updateAtNewIndex: function(oldIndex, newIndex, record) { this.moveItemsToCache(oldIndex, oldIndex); this.moveItemsFromCache([record]); }, doDestroy: function() { var me = this, itemCache = me.itemCache, ln = itemCache.length, i = 0; for (; i < ln; i++) { itemCache[i].destroy(); } this.callParent(); }});