241 lines
4.8 KiB
JavaScript
241 lines
4.8 KiB
JavaScript
|
dojo.provide('dojox.grid.Selection');
|
||
|
|
||
|
dojo.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,
|
||
|
|
||
|
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; }
|
||
|
inIndex = Number(inIndex);
|
||
|
if(this.selected[inIndex]){
|
||
|
this.selectedIndex = inIndex;
|
||
|
}else{
|
||
|
if(this.onCanSelect(inIndex) !== false){
|
||
|
this.selectedIndex = inIndex;
|
||
|
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; }
|
||
|
inIndex = Number(inIndex);
|
||
|
if(this.selectedIndex == inIndex){
|
||
|
this.selectedIndex = -1;
|
||
|
}
|
||
|
if(this.selected[inIndex]){
|
||
|
if(this.onCanDeselect(inIndex) === false){
|
||
|
return;
|
||
|
}
|
||
|
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){
|
||
|
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, dojo.hitch(this, "addToSelection"));
|
||
|
},
|
||
|
|
||
|
deselectRange: function(inFrom, inTo){
|
||
|
this._range(inFrom, inTo, dojo.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{
|
||
|
var lastSelected = this.selectedIndex;
|
||
|
if(!inCtrlKey){
|
||
|
this.deselectAll(inIndex);
|
||
|
}
|
||
|
if(inShiftKey){
|
||
|
this.selectRange(lastSelected, inIndex);
|
||
|
}else if(inCtrlKey){
|
||
|
this.toggleSelect(inIndex);
|
||
|
}else{
|
||
|
this.addToSelection(inIndex)
|
||
|
}
|
||
|
}
|
||
|
this._endUpdate();
|
||
|
},
|
||
|
|
||
|
clickSelectEvent: function(e){
|
||
|
this.clickSelect(e.rowIndex, dojo.dnd.getCopyKeyState(e), e.shiftKey);
|
||
|
},
|
||
|
|
||
|
clear: function(){
|
||
|
this._beginUpdate();
|
||
|
this.deselectAll();
|
||
|
this._endUpdate();
|
||
|
}
|
||
|
});
|