blob: 18a72cf3d703c9517b70350675aa754d16120afe [file] [log] [blame]
/*
Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
if(!dojo._hasResource["dojox.grid.enhanced.dnd._DndSelectingManager"]){
dojo._hasResource["dojox.grid.enhanced.dnd._DndSelectingManager"]=true;
dojo.provide("dojox.grid.enhanced.dnd._DndSelectingManager");
dojo.require("dojox.grid.util");
dojo.require("dojox.grid._Builder");
dojo.require("dojox.grid.enhanced.dnd._DndGrid");
dojo.require("dojox.grid.enhanced.dnd._DndBuilder");
dojo.require("dojox.grid.enhanced.dnd._DndRowSelector");
dojo.require("dojox.grid.enhanced.dnd._DndFocusManager");
dojo.declare("dojox.grid.enhanced.dnd._DndSelectingManager",null,{typeSelectingMode:[],selectingDisabledTypes:[],drugSelectionStart:null,drugCurrentPoint:null,drugMode:null,keepState:false,extendSelect:false,headerNodes:null,selectedCells:null,selectedColumns:[],selectedClass:"dojoxGridRowSelected",autoScrollRate:1000,constructor:function(_1){
this.grid=_1;
this.typeSelectingMode=[];
this.selectingDisabledTypes=[];
this.selectedColumns=[];
this.drugSelectionStart=new Object();
this.drugCurrentPoint=new Object();
this.resetStartPoint();
this.extendGridForDnd(_1);
this.selectedCells=[];
dojo.connect(this.grid,"_onFetchComplete",dojo.hitch(this,"refreshColumnSelection"));
dojo.connect(this.grid.scroller,"scroll",dojo.hitch(this,"refreshColumnSelection"));
dojo.subscribe(this.grid.rowSelectionChangedTopic,dojo.hitch(this,function(_2){
try{
if(_2.grid==this.grid&&_2!=this){
this.cleanCellSelection();
}
}
catch(e){
}
}));
},extendGridForDnd:function(_3){
var _4=_3.constructor;
_3.mixin(_3,dojo.hitch(new dojox.grid.enhanced.dnd._DndGrid(this)));
_3.constructor=_4;
_3.mixin(_3.focus,new dojox.grid.enhanced.dnd._DndFocusManager());
_3.mixin(_3.selection,{clickSelect:function(){
}});
dojo.forEach(_3.views.views,function(_5){
_3.mixin(_5.content,new dojox.grid.enhanced.dnd._DndBuilder());
_3.mixin(_5.header,new dojox.grid.enhanced.dnd._DndHeaderBuilder());
if(_5.declaredClass=="dojox.grid._RowSelector"){
_3.mixin(_5,new dojox.grid.enhanced.dnd._DndRowSelector());
}
dojox.grid.util.funnelEvents(_5.contentNode,_5,"doContentEvent",["mouseup"]);
dojox.grid.util.funnelEvents(_5.headerNode,_5,"doHeaderEvent",["mouseup"]);
});
dojo.forEach(this.grid.dndDisabledTypes,function(_6){
this.disableSelecting(_6);
},this);
this.disableFeatures();
},disableFeatures:function(){
if(this.selectingDisabledTypes["cell"]){
this.cellClick=function(){
};
this.drugSelectCell=function(){
};
}
if(this.selectingDisabledTypes["row"]){
this.drugSelectRow=function(){
};
}
if(this.selectingDisabledTypes["col"]){
this.selectColumn=function(){
};
this.drugSelectColumn=function(){
};
}
},disableSelecting:function(_7){
this.selectingDisabledTypes[_7]=true;
},isInSelectingMode:function(_8){
return !!this.typeSelectingMode[_8];
},setInSelectingMode:function(_9,_a){
this.typeSelectingMode[_9]=_a;
},getSelectedRegionInfo:function(){
var _b=[],_c="";
if(this.selectedColumns.length>0){
_c="col";
dojo.forEach(this.selectedColumns,function(_d,_e){
!!_d&&_b.push(_e);
});
}else{
if(this.grid.selection.getSelectedCount()>0){
_c="row";
_b=dojox.grid.Selection.prototype.getSelected.call(this.grid.selection);
}
}
return {"selectionType":_c,"selectedIdx":_b};
},clearInSelectingMode:function(){
this.typeSelectingMode=[];
},getHeaderNodes:function(){
return this.headerNodes==null?dojo.query("[role*='columnheader']",this.grid.viewsHeaderNode):this.headerNode;
},_range:function(_f,_10,_11){
var s=(_f>=0?_f:_10),e=_10;
if(s>e){
e=s;
s=_10;
}
for(var i=s;i<=e;i++){
_11(i);
}
},cellClick:function(_12,_13){
if(_12>this.exceptColumnsTo){
this.grid.selection.clear();
this.publishRowChange();
var _14=this.getCellNode(_12,_13);
this.cleanAll();
this.addCellToSelection(_14);
}
},setDrugStartPoint:function(_15,_16){
this.drugSelectionStart.colIndex=_15;
this.drugSelectionStart.rowIndex=_16;
this.drugCurrentPoint.colIndex=_15;
this.firstOut=true;
var _17=dojo.connect(dojo.doc,"onmousemove",dojo.hitch(this,function(e){
this.outRangeValue=e.clientY-dojo.coords(this.grid.domNode).y-this.grid.domNode.offsetHeight;
if(this.outRangeValue>0){
if(this.drugSelectionStart.colIndex==-1){
if(!this.outRangeY){
this.autoRowScrollDrug(e);
}
}else{
if(this.drugSelectionStart.rowIndex==-1){
}else{
this.autoCellScrollDrug(e);
}
}
}else{
this.firstOut=true;
this.outRangeY=false;
}
}));
var _18=dojo.connect(dojo.doc,"onmouseup",dojo.hitch(this,function(e){
this.outRangeY=false;
dojo.disconnect(_18);
dojo.disconnect(_17);
this.grid.onMouseUp(e);
}));
},autoRowScrollDrug:function(e){
this.outRangeY=true;
this.autoSelectNextRow();
},autoSelectNextRow:function(){
if(this.grid.select.outRangeY){
this.grid.scrollToRow(this.grid.scroller.firstVisibleRow+1);
this.drugSelectRow(this.drugCurrentPoint.rowIndex+1);
setTimeout(dojo.hitch(this,"autoSelectNextRow",this.drugCurrentPoint.rowIndex+1),this.getAutoScrollRate());
}
},autoCellScrollDrug:function(e){
var _19=null;
dojo.forEach(this.getHeaderNodes(),function(_1a){
var _1b=dojo.coords(_1a);
if(e.clientX>=_1b.x&&e.clientX<=_1b.x+_1b.w){
_19=Number(_1a.attributes.getNamedItem("idx").value);
}
});
if(_19!=this.drugCurrentPoint.colIndex||this.firstOut){
if(!this.firstOut){
this.colChanged=true;
this.drugCurrentPoint.colIndex=_19;
}
this.firstOut=false;
this.outRangeY=true;
dojo.hitch(this,"autoSelectCellInNextRow")();
}
},autoSelectCellInNextRow:function(){
if(this.grid.select.outRangeY){
this.grid.scrollToRow(this.grid.scroller.firstVisibleRow+1);
this.drugSelectCell(this.drugCurrentPoint.colIndex,this.drugCurrentPoint.rowIndex+1);
if(this.grid.select.colChanged){
this.grid.select.colChanged=false;
}else{
setTimeout(dojo.hitch(this,"autoSelectCellInNextRow",this.drugCurrentPoint.rowIndex+1),this.getAutoScrollRate());
}
}
},getAutoScrollRate:function(){
return this.autoScrollRate;
},resetStartPoint:function(){
if(this.drugSelectionStart.colIndex==-1&&this.drugSelectionStart.rowIndex==-1){
return;
}
this.lastDrugSelectionStart=dojo.clone(this.drugSelectionStart);
this.drugSelectionStart.colIndex=-1;
this.drugSelectionStart.rowIndex=-1;
},restorLastDragPoint:function(){
this.drugSelectionStart=dojo.clone(this.lastDrugSelectionStart);
},drugSelectCell:function(_1c,_1d){
this.cleanAll();
this.drugCurrentPoint.columnIndex=_1c;
this.drugCurrentPoint.rowIndex=_1d;
var _1e,_1f,_20,_21;
if(_1d<this.drugSelectionStart.rowIndex){
_1e=_1d;
_1f=this.drugSelectionStart.rowIndex;
}else{
_1e=this.drugSelectionStart.rowIndex;
_1f=_1d;
}
if(_1c<this.drugSelectionStart.colIndex){
_20=_1c;
_21=this.drugSelectionStart.colIndex;
}else{
_20=this.drugSelectionStart.colIndex;
_21=_1c;
}
for(var i=_20;i<=_21;i++){
this.addColumnRangeToSelection(i,_1e,_1f);
}
},selectColumn:function(_22){
this.addColumnToSelection(_22);
},drugSelectColumn:function(_23){
this.selectColumnRange(this.drugSelectionStart.colIndex,_23);
},drugSelectColumnToMax:function(dir){
if(dir=="left"){
this.selectColumnRange(this.drugSelectionStart.colIndex,0);
}else{
this.selectColumnRange(this.drugSelectionStart.colIndex,this.getHeaderNodes().length-1);
}
},selectColumnRange:function(_24,_25){
if(!this.keepState){
this.cleanAll();
}
this._range(_24,_25,dojo.hitch(this,"addColumnToSelection"));
},addColumnToSelection:function(_26){
this.selectedColumns[_26]=true;
dojo.toggleClass(this.getHeaderNodes()[_26],"dojoxGridHeaderSelected",true);
this._rangCellsInColumn(_26,-1,Number.POSITIVE_INFINITY,this.addCellToSelection);
},addColumnRangeToSelection:function(_27,_28,to){
var _29=this.grid.views;
var _2a=[];
var _2b=this;
dojo.forEach(_29.views,function(_2c){
dojo.forEach(this.getViewRowNodes(_2c.rowNodes),function(_2d,_2e){
if(!_2d){
return;
}
if(_2e>=_28&&_2e<=to){
dojo.forEach(_2d.firstChild.rows[0].cells,function(_2f){
if(_2f&&_2f.attributes&&(idx=_2f.attributes.getNamedItem("idx"))&&Number(idx.value)==_27){
_2b.addCellToSelection(_2f);
}
});
}
},this);
},this);
},_rangCellsInColumn:function(_30,_31,to,_32){
var _33=this.grid.views;
var _34=[];
var _35=this;
dojo.forEach(_33.views,function(_36){
dojo.forEach(this.getViewRowNodes(_36.rowNodes),function(_37,_38){
if(!_37){
return;
}
if(_38>=_31&&_38<=to){
dojo.forEach(_37.firstChild.rows[0].cells,function(_39){
if(_39&&_39.attributes&&(idx=_39.attributes.getNamedItem("idx"))&&Number(idx.value)==_30){
_32(_39,_35);
}
});
}
},this);
},this);
},drugSelectRow:function(_3a){
this.drugCurrentPoint.rowIndex=_3a;
this.cleanCellSelection();
this.clearDrugDivs();
var _3b=this.grid.selection;
_3b._beginUpdate();
if(!this.keepState){
_3b.deselectAll();
}
_3b.selectRange(this.drugSelectionStart.rowIndex,_3a);
_3b._endUpdate();
this.publishRowChange();
},drugSelectRowToMax:function(dir){
if(dir=="up"){
this.drugSelectRow(0);
}else{
this.drugSelectRow(this.grid.rowCount);
}
},getCellNode:function(_3c,_3d){
var _3e=[],_3f=null;
var _40=this.grid.views;
for(var i=0,v,n;(v=_40.views[i])&&(n=v.getRowNode(_3d));i++){
_3e.push(n);
}
dojo.forEach(_3e,dojo.hitch(function(_41,_42){
if(_3f){
return;
}
var _43=dojo.query("[idx='"+_3c+"']",_41);
if(_43&&_43[0]){
_3f=_43[0];
}
}));
return _3f;
},addCellToSelection:function(_44,_45){
if(!_45){
_45=this;
}
_45.selectedCells[_45.selectedCells.length]=_44;
dojo.toggleClass(_44,_45.selectedClass,true);
},isColSelected:function(_46){
return this.selectedColumns[_46];
},isRowSelected:function(_47){
return this.grid.selection.selected[_47];
},isContinuousSelection:function(_48){
var _49=-1;
for(var i=0;i<_48.length;i++){
if(!_48[i]){
continue;
}
if(_49<0||i-_49==1){
_49=i;
}else{
if(i-_49>=2){
return false;
}
}
}
return _49>=0?true:false;
},cleanCellSelection:function(){
dojo.forEach(this.selectedCells,dojo.hitch(this,"removeCellSelectedState"));
this.selectedCells=[];
dojo.forEach(this.selectedColumns,function(_4a,_4b){
if(_4a){
dojo.toggleClass(this.getHeaderNodes()[_4b],"dojoxGridHeaderSelected",false);
}
},this);
this.selectedColumns=[];
this.grid.edit.isEditing()&&this.grid.edit.apply();
},removeCellSelectedState:function(_4c){
dojo.toggleClass(_4c,this.selectedClass,false);
},cleanAll:function(){
this.cleanCellSelection();
this.grid.selection.clear();
this.publishRowChange();
},refreshColumnSelection:function(){
dojo.forEach(this.selectedColumns,dojo.hitch(this,function(_4d,_4e){
if(_4d){
this.grid.select.addColumnToSelection(_4e);
}
}));
},inSelectedArea:function(_4f,_50){
return this.selectedColumns[_4f]||this.gird.selection.selecteded[_50];
},publishRowChange:function(){
dojo.publish(this.grid.rowSelectionChangedTopic,[this]);
},getViewRowNodes:function(_51){
var _52=[];
for(i in _51){
_52.push(_51[i]);
}
return _52;
},getFirstSelected:function(){
return dojo.hitch(this.grid.selection,dojox.grid.Selection.prototype.getFirstSelected)();
},getLastSelected:function(){
var _53=this.grid.selection.selected;
for(var i=_53.length-1;i>=0;i--){
if(_53[i]){
return i;
}
}
return -1;
}});
}