221 lines
6.1 KiB
JavaScript
221 lines
6.1 KiB
JavaScript
define("dojox/widget/Selection", ["dojo/_base/declare", "dojo/_base/array", "dojo/_base/lang", "dojo/Stateful"],
|
|
function(declare, arr, lang, Stateful){
|
|
|
|
return declare("dojox.widget.Selection", Stateful, {
|
|
// summary:
|
|
// Base class for widgets that manage a list of selected data items.
|
|
|
|
constructor: function(){
|
|
this.selectedItems = [];
|
|
},
|
|
|
|
// selectionMode: String
|
|
// Valid values are:
|
|
//
|
|
// 1. "none": No selection can be done.
|
|
// 2. "single": Only one item can be selected at a time.
|
|
// 3. "multiple": Several item can be selected using the control key modifier.
|
|
// Default value is "single".
|
|
selectionMode: "single",
|
|
|
|
_setSelectionModeAttr: function(value){
|
|
if(value != "none" && value != "single" && value != "multiple"){
|
|
value = "single"; //default value
|
|
}
|
|
if(value != this.selectionMode){
|
|
this.selectionMode = value;
|
|
if(value == "none"){
|
|
this.set("selectedItems", null);
|
|
}else if(value == "single"){
|
|
this.set("selectedItem", this.selectedItem); // null or last selected item
|
|
}
|
|
}
|
|
},
|
|
|
|
// selectedItem: Object
|
|
// In single selection mode, the selected item or in multiple selection mode the last selected item.
|
|
// Warning: Do not use this property directly, make sure to call set() or get() methods.
|
|
selectedItem: null,
|
|
|
|
_setSelectedItemAttr: function(value){
|
|
if(this.selectedItem != value){
|
|
this._set("selectedItem", value);
|
|
this.set("selectedItems", value ? [value] : null);
|
|
}
|
|
},
|
|
|
|
// selectedItems: Object[]
|
|
// The list of selected items.
|
|
// Warning: Do not use this property directly, make sure to call set() or get() methods.
|
|
selectedItems: null,
|
|
|
|
_setSelectedItemsAttr: function(value){
|
|
var oldSelectedItems = this.selectedItems;
|
|
|
|
this.selectedItems = value;
|
|
this.selectedItem = null;
|
|
|
|
if(oldSelectedItems != null && oldSelectedItems.length>0){
|
|
this.updateRenderers(oldSelectedItems, true);
|
|
}
|
|
if(this.selectedItems && this.selectedItems.length>0){
|
|
this.selectedItem = this.selectedItems[0];
|
|
this.updateRenderers(this.selectedItems, true);
|
|
}
|
|
},
|
|
|
|
_getSelectedItemsAttr: function(){
|
|
return this.selectedItems == null ? [] : this.selectedItems.concat();
|
|
},
|
|
|
|
isItemSelected: function(item){
|
|
// summary:
|
|
// Returns wether an item is selected or not.
|
|
// item: Object
|
|
// The item to test the selection for.
|
|
if(this.selectedItems == null || this.selectedItems.length== 0){
|
|
return false;
|
|
}
|
|
|
|
return arr.some(this.selectedItems, lang.hitch(this, function(sitem){
|
|
return this.getIdentity(sitem) == this.getIdentity(item);
|
|
}));
|
|
},
|
|
|
|
getIdentity: function(item){
|
|
// summary:
|
|
// This function must be implemented to return the id of a item.
|
|
// item: Object
|
|
// The item to query the identity for.
|
|
},
|
|
|
|
setItemSelected: function(item, value){
|
|
// summary:
|
|
// Change the selection state of an item.
|
|
// item: Object
|
|
// The item to change the selection state for.
|
|
// value: Boolean
|
|
// True to select the item, false to deselect it.
|
|
|
|
if(this.selectionMode == "none" || item == null){
|
|
return;
|
|
}
|
|
|
|
// copy is returned
|
|
var sel = this.get("selectedItems");
|
|
var old = this.get("selectedItems");
|
|
|
|
if(this.selectionMode == "single"){
|
|
if(value){
|
|
this.set("selectedItem", item);
|
|
}else if(this.isItemSelected(item)){
|
|
this.set("selectedItems", null);
|
|
}
|
|
}else{ // multiple
|
|
if(value){
|
|
if(this.isItemSelected(item)){
|
|
return; // already selected
|
|
}
|
|
if(sel == null){
|
|
sel = [item];
|
|
}else{
|
|
sel.unshift(item);
|
|
}
|
|
this.set("selectedItems", sel);
|
|
}else{
|
|
var res = arr.filter(sel, function(sitem){
|
|
return sitem.id != item.id;
|
|
});
|
|
if(res == null || res.length == sel.length){
|
|
return; // already not selected
|
|
}
|
|
this.set("selectedItems", res);
|
|
}
|
|
}
|
|
},
|
|
|
|
selectFromEvent: function(e, item, renderer, dispatch){
|
|
// summary:
|
|
// Applies selection triggered by an user interaction
|
|
// e: Event
|
|
// The source event of the user interaction.
|
|
// item: Object
|
|
// The render item that has been selected/deselected.
|
|
// renderer: Object
|
|
// The visual renderer of the selected/deselected item.
|
|
// dispatch: Boolean
|
|
// Whether an event must be dispatched or not.
|
|
// returns: Boolean
|
|
// Returns true if the selection has changed and false otherwise.
|
|
// tags:
|
|
// protected
|
|
|
|
if(this.selectionMode == "none"){
|
|
return false;
|
|
}
|
|
|
|
var changed;
|
|
var oldSelectedItem = this.get("selectedItem");
|
|
var selected = item ? this.isItemSelected(item): false;
|
|
|
|
if(item == null){
|
|
if(!e.ctrlKey && this.selectedItem != null){
|
|
this.set("selectedItem", null);
|
|
changed = true;
|
|
}
|
|
}else if(this.selectionMode == "multiple"){
|
|
if(e.ctrlKey){
|
|
this.setItemSelected(item, !selected);
|
|
changed = true;
|
|
}else{
|
|
this.set("selectedItem", item);
|
|
changed = true;
|
|
}
|
|
}else{ // single
|
|
if(e.ctrlKey){
|
|
//if the object is selected deselects it.
|
|
this.set("selectedItem", selected ? null : item);
|
|
changed = true;
|
|
}else{
|
|
if(!selected){
|
|
this.set("selectedItem", item);
|
|
changed = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(dispatch && changed){
|
|
this.dispatchChange(oldSelectedItem, this.get("selectedItem"), renderer, e);
|
|
}
|
|
|
|
return changed;
|
|
},
|
|
|
|
dispatchChange: function(oldSelectedItem, newSelectedItem, renderer, triggerEvent){
|
|
// summary:
|
|
// Dispatch a selection change event.
|
|
// oldSelectedItem: Object
|
|
// The previously selectedItem.
|
|
// newSelectedItem: Object
|
|
// The new selectedItem.
|
|
// renderer: Object
|
|
// The visual renderer of the selected/deselected item.
|
|
// triggerEvent: Event
|
|
// The event that lead to the selection of the item.
|
|
this.onChange({
|
|
oldValue: oldSelectedItem,
|
|
newValue: newSelectedItem,
|
|
renderer: renderer,
|
|
triggerEvent: triggerEvent
|
|
});
|
|
},
|
|
|
|
onChange: function(){
|
|
// summary:
|
|
// Called when the selection changed.
|
|
// tags:
|
|
// callback
|
|
}
|
|
});
|
|
});
|