source: [view]
dojo.provide("dojox.grid._EditManager");
dojo.require("dojox.grid.util");
dojo.declare("dojox.grid._EditManager", null, {
// summary:
// Controls grid cell editing process. Owned by grid and used internally for editing.
constructor: function(inGrid){
// inGrid: dojox.Grid
// The dojox.Grid this editor should be attached to
this.grid = inGrid;
if(dojo.isIE){
this.connections = [dojo.connect(document.body, "onfocus", dojo.hitch(this, "_boomerangFocus"))];
}else{
this.connections = [dojo.connect(this.grid, 'onBlur', this, 'apply')];
}
},
info: {},
destroy: function(){
dojo.forEach(this.connections,dojo.disconnect);
},
cellFocus: function(inCell, inRowIndex){
// summary:
// Invoke editing when cell is focused
// inCell: cell object
// Grid cell object
// inRowIndex: Integer
// Grid row index
if(this.grid.singleClickEdit || this.isEditRow(inRowIndex)){
// if same row or quick editing, edit
this.setEditCell(inCell, inRowIndex);
}else{
// otherwise, apply any pending row edits
this.apply();
}
// if dynamic or static editing...
if(this.isEditing() || (inCell && inCell.editable && inCell.alwaysEditing)){
// let the editor focus itself as needed
this._focusEditor(inCell, inRowIndex);
}
},
rowClick: function(e){
if(this.isEditing() && !this.isEditRow(e.rowIndex)){
this.apply();
}
},
styleRow: function(inRow){
if(inRow.index == this.info.rowIndex){
inRow.customClasses += ' dojoxGridRowEditing';
}
},
dispatchEvent: function(e){
var c = e.cell, ed = (c && c["editable"]) ? c : 0;
return ed && ed.dispatchEvent(e.dispatch, e);
},
// Editing
isEditing: function(){
// summary:
// Indicates editing state of the grid.
// returns: Boolean
// True if grid is actively editing
return this.info.rowIndex !== undefined;
},
isEditCell: function(inRowIndex, inCellIndex){
// summary:
// Indicates if the given cell is being edited.
// inRowIndex: Integer
// Grid row index
// inCellIndex: Integer
// Grid cell index
// returns: Boolean
// True if given cell is being edited
return (this.info.rowIndex === inRowIndex) && (this.info.cell.index == inCellIndex);
},
isEditRow: function(inRowIndex){
// summary:
// Indicates if the given row is being edited.
// inRowIndex: Integer
// Grid row index
// returns: Boolean
// True if given row is being edited
return this.info.rowIndex === inRowIndex;
},
setEditCell: function(inCell, inRowIndex){
// summary:
// Set the given cell to be edited
// inRowIndex: Integer
// Grid row index
// inCell: Object
// Grid cell object
if(!this.isEditCell(inRowIndex, inCell.index) && this.grid.canEdit && this.grid.canEdit(inCell, inRowIndex)){
this.start(inCell, inRowIndex, this.isEditRow(inRowIndex) || inCell.editable);
}
},
_focusEditor: function(inCell, inRowIndex){
dojox.grid.util.fire(inCell, "focus", [inRowIndex]);
},
focusEditor: function(){
if(this.isEditing()){
this._focusEditor(this.info.cell, this.info.rowIndex);
}
},
// implement fix for focus boomerang effect on IE
_boomerangWindow: 500,
_shouldCatchBoomerang: function(){
return this._catchBoomerang > new Date().getTime();
},
_boomerangFocus: function(){
//console.log("_boomerangFocus");
if(this._shouldCatchBoomerang()){
// make sure we don't utterly lose focus
this.grid.focus.focusGrid();
// let the editor focus itself as needed
this.focusEditor();
// only catch once
this._catchBoomerang = 0;
}
},
_doCatchBoomerang: function(){
// give ourselves a few ms to boomerang IE focus effects
if(dojo.isIE){this._catchBoomerang = new Date().getTime() + this._boomerangWindow;}