You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
269 lines
5.4 KiB
269 lines
5.4 KiB
define([ |
|
"dojo/_base/declare", |
|
"dojo/_base/array", |
|
"dojo/_base/lang", |
|
"dojo/dom-attr" |
|
], function(declare, array, lang, domAttr){ |
|
|
|
return declare("dojox.grid.Selection", null, { |
|
// summary: |
|
// Manages row selection for grid. Owned by grid and used internally |
|
// for selection. Override to implement custom selection. |
|
|
|
constructor: function(inGrid){ |
|
this.grid = inGrid; |
|
this.selected = []; |
|
|
|
this.setMode(inGrid.selectionMode); |
|
}, |
|
|
|
mode: 'extended', |
|
|
|
selected: null, |
|
updating: 0, |
|
selectedIndex: -1, |
|
rangeStartIndex: -1, |
|
|
|
setMode: function(mode){ |
|
if(this.selected.length){ |
|
this.deselectAll(); |
|
} |
|
if(mode != 'extended' && mode != 'multiple' && mode != 'single' && mode != 'none'){ |
|
this.mode = 'extended'; |
|
}else{ |
|
this.mode = mode; |
|
} |
|
}, |
|
|
|
onCanSelect: function(inIndex){ |
|
return this.grid.onCanSelect(inIndex); |
|
}, |
|
|
|
onCanDeselect: function(inIndex){ |
|
return this.grid.onCanDeselect(inIndex); |
|
}, |
|
|
|
onSelected: function(inIndex){ |
|
}, |
|
|
|
onDeselected: function(inIndex){ |
|
}, |
|
|
|
//onSetSelected: function(inIndex, inSelect) { }; |
|
onChanging: function(){ |
|
}, |
|
|
|
onChanged: function(){ |
|
}, |
|
|
|
isSelected: function(inIndex){ |
|
if(this.mode == 'none'){ |
|
return false; |
|
} |
|
return this.selected[inIndex]; |
|
}, |
|
|
|
getFirstSelected: function(){ |
|
if(!this.selected.length||this.mode == 'none'){ return -1; } |
|
for(var i=0, l=this.selected.length; i<l; i++){ |
|
if(this.selected[i]){ |
|
return i; |
|
} |
|
} |
|
return -1; |
|
}, |
|
|
|
getNextSelected: function(inPrev){ |
|
if(this.mode == 'none'){ return -1; } |
|
for(var i=inPrev+1, l=this.selected.length; i<l; i++){ |
|
if(this.selected[i]){ |
|
return i; |
|
} |
|
} |
|
return -1; |
|
}, |
|
|
|
getSelected: function(){ |
|
var result = []; |
|
for(var i=0, l=this.selected.length; i<l; i++){ |
|
if(this.selected[i]){ |
|
result.push(i); |
|
} |
|
} |
|
return result; |
|
}, |
|
|
|
getSelectedCount: function(){ |
|
var c = 0; |
|
for(var i=0; i<this.selected.length; i++){ |
|
if(this.selected[i]){ |
|
c++; |
|
} |
|
} |
|
return c; |
|
}, |
|
|
|
_beginUpdate: function(){ |
|
if(this.updating === 0){ |
|
this.onChanging(); |
|
} |
|
this.updating++; |
|
}, |
|
|
|
_endUpdate: function(){ |
|
this.updating--; |
|
if(this.updating === 0){ |
|
this.onChanged(); |
|
} |
|
}, |
|
|
|
select: function(inIndex){ |
|
if(this.mode == 'none'){ return; } |
|
if(this.mode != 'multiple'){ |
|
this.deselectAll(inIndex); |
|
this.addToSelection(inIndex); |
|
}else{ |
|
this.toggleSelect(inIndex); |
|
} |
|
}, |
|
|
|
addToSelection: function(inIndex){ |
|
if(this.mode == 'none'){ return; } |
|
if(lang.isArray(inIndex)){ |
|
array.forEach(inIndex, this.addToSelection, this); |
|
return; |
|
} |
|
inIndex = Number(inIndex); |
|
if(this.selected[inIndex]){ |
|
this.selectedIndex = inIndex; |
|
}else{ |
|
if(this.onCanSelect(inIndex) !== false){ |
|
this.selectedIndex = inIndex; |
|
var rowNode = this.grid.getRowNode(inIndex); |
|
if(rowNode){ |
|
domAttr.set(rowNode, "aria-selected", "true"); |
|
} |
|
this._beginUpdate(); |
|
this.selected[inIndex] = true; |
|
//this.grid.onSelected(inIndex); |
|
this.onSelected(inIndex); |
|
//this.onSetSelected(inIndex, true); |
|
this._endUpdate(); |
|
} |
|
} |
|
}, |
|
|
|
deselect: function(inIndex){ |
|
if(this.mode == 'none'){ return; } |
|
if(lang.isArray(inIndex)){ |
|
array.forEach(inIndex, this.deselect, this); |
|
return; |
|
} |
|
inIndex = Number(inIndex); |
|
if(this.selectedIndex == inIndex){ |
|
this.selectedIndex = -1; |
|
} |
|
if(this.selected[inIndex]){ |
|
if(this.onCanDeselect(inIndex) === false){ |
|
return; |
|
} |
|
var rowNode = this.grid.getRowNode(inIndex); |
|
if(rowNode){ |
|
domAttr.set(rowNode, "aria-selected", "false"); |
|
} |
|
this._beginUpdate(); |
|
delete this.selected[inIndex]; |
|
//this.grid.onDeselected(inIndex); |
|
this.onDeselected(inIndex); |
|
//this.onSetSelected(inIndex, false); |
|
this._endUpdate(); |
|
} |
|
}, |
|
|
|
setSelected: function(inIndex, inSelect){ |
|
this[(inSelect ? 'addToSelection' : 'deselect')](inIndex); |
|
}, |
|
|
|
toggleSelect: function(inIndex){ |
|
if(lang.isArray(inIndex)){ |
|
array.forEach(inIndex, this.toggleSelect, this); |
|
return; |
|
} |
|
this.setSelected(inIndex, !this.selected[inIndex]); |
|
}, |
|
|
|
_range: function(inFrom, inTo, func){ |
|
var s = (inFrom >= 0 ? inFrom : inTo), e = inTo; |
|
if(s > e){ |
|
e = s; |
|
s = inTo; |
|
} |
|
for(var i=s; i<=e; i++){ |
|
func(i); |
|
} |
|
}, |
|
|
|
selectRange: function(inFrom, inTo){ |
|
this._range(inFrom, inTo, lang.hitch(this, "addToSelection")); |
|
}, |
|
|
|
deselectRange: function(inFrom, inTo){ |
|
this._range(inFrom, inTo, lang.hitch(this, "deselect")); |
|
}, |
|
|
|
insert: function(inIndex){ |
|
this.selected.splice(inIndex, 0, false); |
|
if(this.selectedIndex >= inIndex){ |
|
this.selectedIndex++; |
|
} |
|
}, |
|
|
|
remove: function(inIndex){ |
|
this.selected.splice(inIndex, 1); |
|
if(this.selectedIndex >= inIndex){ |
|
this.selectedIndex--; |
|
} |
|
}, |
|
|
|
deselectAll: function(inExcept){ |
|
for(var i in this.selected){ |
|
if((i!=inExcept)&&(this.selected[i]===true)){ |
|
this.deselect(i); |
|
} |
|
} |
|
}, |
|
|
|
clickSelect: function(inIndex, inCtrlKey, inShiftKey){ |
|
if(this.mode == 'none'){ return; } |
|
this._beginUpdate(); |
|
if(this.mode != 'extended'){ |
|
this.select(inIndex); |
|
}else{ |
|
if(!inShiftKey || this.rangeStartIndex < 0){ |
|
this.rangeStartIndex = inIndex; |
|
} |
|
if(!inCtrlKey){ |
|
this.deselectAll(inIndex); |
|
} |
|
if(inShiftKey){ |
|
this.selectRange(this.rangeStartIndex, inIndex); |
|
}else if(inCtrlKey){ |
|
this.toggleSelect(inIndex); |
|
}else{ |
|
this.addToSelection(inIndex); |
|
} |
|
} |
|
this._endUpdate(); |
|
}, |
|
|
|
clickSelectEvent: function(e){ |
|
this.clickSelect(e.rowIndex, dojo.isCopyKey(e), e.shiftKey); |
|
}, |
|
|
|
clear: function(){ |
|
this._beginUpdate(); |
|
this.deselectAll(); |
|
this._endUpdate(); |
|
} |
|
}); |
|
}); |