/** _enyo.Selection_ is used to manage row selection state for lists. It provides selection state management for both single-select and multi-select lists. // The following is an excerpt from enyo.FlyweightRepeater. enyo.kind({ name: "enyo.FlyweightRepeater", ... components: [ {kind: "Selection", onSelect: "selectDeselect", onDeselect: "selectDeselect"}, ... ], tap: function(inSender, inEvent) { ... // mark the tapped row as selected this.$.selection.select(inEvent.index); ... }, selectDeselect: function(inSender, inEvent) { // this is where a row selection highlight might be applied this.renderRow(inEvent.key); } ... }) */ enyo.kind({ name: "enyo.Selection", kind: enyo.Component, published: { //* If true, multiple selections are allowed. multi: false }, events: { /** Fires when an item is selected. {kind: "Selection", onSelect: "selectRow"... ... selectRow: function(inSender, inKey, inPrivateData) { ... _inKey_ is whatever key was used to register the selection (usually a row index). _inPrivateData_ references data registered with this key by the code that made the original selection. */ onSelect: "", /** Fires when an item is deselected. {kind: "Selection", onSelect: "deselectRow"... ... deselectRow: function(inSender, inKey, inPrivateData) ... _inKey_ is whatever key was used to request the deselection (usually a row index). _inPrivateData_ references data registered with this key by the code that made the selection. */ onDeselect: "", //* Sent when selection changes (but not when the selection is cleared). onChange: "" }, //* @protected create: function() { this.clear(); this.inherited(arguments); }, multiChanged: function() { if (!this.multi) { this.clear(); } this.doChange(); }, highlander: function(inKey) { if (!this.multi) { this.deselect(this.lastSelected); } }, //* @public //* Removes all selections. clear: function() { this.selected = {}; }, //* Returns true if the _inKey_ row is selected. isSelected: function(inKey) { return this.selected[inKey]; }, //* Manually sets a row's state to selected or unselected. setByKey: function(inKey, inSelected, inData) { if (inSelected) { this.selected[inKey] = (inData || true); this.lastSelected = inKey; this.doSelect({key: inKey, data: this.selected[inKey]}); } else { var was = this.isSelected(inKey); delete this.selected[inKey]; this.doDeselect({key: inKey, data: was}); } this.doChange(); }, //* Deselects a row. deselect: function(inKey) { if (this.isSelected(inKey)) { this.setByKey(inKey, false); } }, /** Selects a row. If the _multi_ property is set to false, _select_ will also deselect the previous selection. */ select: function(inKey, inData) { if (this.multi) { this.setByKey(inKey, !this.isSelected(inKey), inData); } else if (!this.isSelected(inKey)) { this.highlander(); this.setByKey(inKey, true, inData); } }, /** Toggles selection state for a row. If the _multi_ property is set to false, toggling a selection on will deselect the previous selection. */ toggle: function(inKey, inData) { if (!this.multi && this.lastSelected != inKey) { this.deselect(this.lastSelected); } this.setByKey(inKey, !this.isSelected(inKey), inData); }, /** Returns the selection as a hash in which each selected item has a value; unselected items are undefined. */ getSelected: function() { return this.selected; } });