summaryrefslogtreecommitdiff
path: root/js/dojo/dojox/grid/Selection.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/dojo/dojox/grid/Selection.js')
-rw-r--r--js/dojo/dojox/grid/Selection.js267
1 files changed, 267 insertions, 0 deletions
diff --git a/js/dojo/dojox/grid/Selection.js b/js/dojo/dojox/grid/Selection.js
new file mode 100644
index 0000000..56e6884
--- /dev/null
+++ b/js/dojo/dojox/grid/Selection.js
@@ -0,0 +1,267 @@
+//>>built
+define("dojox/grid/Selection", [
+ "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,
+
+ 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{
+ 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.isCopyKey(e), e.shiftKey);
+ },
+
+ clear: function(){
+ this._beginUpdate();
+ this.deselectAll();
+ this._endUpdate();
+ }
+});
+}); \ No newline at end of file