New file |
0,0 → 1,204 |
if(!dojo._hasResource["dojox.grid._grid.focus"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. |
dojo._hasResource["dojox.grid._grid.focus"] = true; |
dojo.provide("dojox.grid._grid.focus"); |
|
// focus management |
dojo.declare("dojox.grid.focus", null, { |
// summary: |
// Controls grid cell focus. Owned by grid and used internally for focusing. |
// Note: grid cell actually receives keyboard input only when cell is being edited. |
constructor: function(inGrid){ |
this.grid = inGrid; |
this.cell = null; |
this.rowIndex = -1; |
dojo.connect(this.grid.domNode, "onfocus", this, "doFocus"); |
}, |
tabbingOut: false, |
focusClass: "dojoxGrid-cell-focus", |
focusView: null, |
initFocusView: function(){ |
this.focusView = this.grid.views.getFirstScrollingView(); |
}, |
isFocusCell: function(inCell, inRowIndex){ |
// summary: |
// states if the given cell is focused |
// inCell: object |
// grid cell object |
// inRowIndex: int |
// grid row index |
// returns: |
// true of the given grid cell is focused |
return (this.cell == inCell) && (this.rowIndex == inRowIndex); |
}, |
isLastFocusCell: function(){ |
return (this.rowIndex == this.grid.rowCount-1) && (this.cell.index == this.grid.layout.cellCount-1); |
}, |
isFirstFocusCell: function(){ |
return (this.rowIndex == 0) && (this.cell.index == 0); |
}, |
isNoFocusCell: function(){ |
return (this.rowIndex < 0) || !this.cell; |
}, |
_focusifyCellNode: function(inBork){ |
var n = this.cell && this.cell.getNode(this.rowIndex); |
if(n){ |
dojo.toggleClass(n, this.focusClass, inBork); |
this.scrollIntoView(); |
try{ |
if(!this.grid.edit.isEditing()) |
dojox.grid.fire(n, "focus"); |
}catch(e){} |
} |
}, |
scrollIntoView: function() { |
if(!this.cell){ |
return; |
} |
var |
c = this.cell, |
s = c.view.scrollboxNode, |
sr = { |
w: s.clientWidth, |
l: s.scrollLeft, |
t: s.scrollTop, |
h: s.clientHeight |
}, |
n = c.getNode(this.rowIndex), |
r = c.view.getRowNode(this.rowIndex), |
rt = this.grid.scroller.findScrollTop(this.rowIndex); |
// place cell within horizontal view |
if(n.offsetLeft + n.offsetWidth > sr.l + sr.w){ |
s.scrollLeft = n.offsetLeft + n.offsetWidth - sr.w; |
}else if(n.offsetLeft < sr.l){ |
s.scrollLeft = n.offsetLeft; |
} |
// place cell within vertical view |
if(rt + r.offsetHeight > sr.t + sr.h){ |
this.grid.setScrollTop(rt + r.offsetHeight - sr.h); |
}else if(rt < sr.t){ |
this.grid.setScrollTop(rt); |
} |
}, |
styleRow: function(inRow){ |
if(inRow.index == this.rowIndex){ |
this._focusifyCellNode(true); |
} |
}, |
setFocusIndex: function(inRowIndex, inCellIndex){ |
// summary: |
// focuses the given grid cell |
// inRowIndex: int |
// grid row index |
// inCellIndex: int |
// grid cell index |
this.setFocusCell(this.grid.getCell(inCellIndex), inRowIndex); |
}, |
setFocusCell: function(inCell, inRowIndex){ |
// summary: |
// focuses the given grid cell |
// inCell: object |
// grid cell object |
// inRowIndex: int |
// grid row index |
if(inCell && !this.isFocusCell(inCell, inRowIndex)){ |
this.tabbingOut = false; |
this.focusGrid(); |
this._focusifyCellNode(false); |
this.cell = inCell; |
this.rowIndex = inRowIndex; |
this._focusifyCellNode(true); |
} |
// even if this cell isFocusCell, the document focus may need to be rejiggered |
// call opera on delay to prevent keypress from altering focus |
if(dojo.isOpera){ |
setTimeout(dojo.hitch(this.grid, 'onCellFocus', this.cell, this.rowIndex), 1); |
}else{ |
this.grid.onCellFocus(this.cell, this.rowIndex); |
} |
}, |
next: function(){ |
// summary: |
// focus next grid cell |
var row=this.rowIndex, col=this.cell.index+1, cc=this.grid.layout.cellCount-1, rc=this.grid.rowCount-1; |
if(col > cc){ |
col = 0; |
row++; |
} |
if(row > rc){ |
col = cc; |
row = rc; |
} |
this.setFocusIndex(row, col); |
}, |
previous: function(){ |
// summary: |
// focus previous grid cell |
var row=(this.rowIndex || 0), col=(this.cell.index || 0) - 1; |
if(col < 0){ |
col = this.grid.layout.cellCount-1; |
row--; |
} |
if(row < 0){ |
row = 0; |
col = 0; |
} |
this.setFocusIndex(row, col); |
}, |
move: function(inRowDelta, inColDelta) { |
// summary: |
// focus grid cell based on position relative to current focus |
// inRowDelta: int |
// vertical distance from current focus |
// inColDelta: int |
// horizontal distance from current focus |
var |
rc = this.grid.rowCount-1, |
cc = this.grid.layout.cellCount-1, |
r = this.rowIndex, |
i = this.cell.index, |
row = Math.min(rc, Math.max(0, r+inRowDelta)), |
col = Math.min(cc, Math.max(0, i+inColDelta)); |
this.setFocusIndex(row, col); |
if(inRowDelta){ |
this.grid.updateRow(r); |
} |
}, |
previousKey: function(e){ |
if(this.isFirstFocusCell()){ |
this.tabOut(this.grid.domNode); |
}else{ |
dojo.stopEvent(e); |
this.previous(); |
} |
}, |
nextKey: function(e) { |
if(this.isLastFocusCell()){ |
this.tabOut(this.grid.lastFocusNode); |
}else{ |
dojo.stopEvent(e); |
this.next(); |
} |
}, |
tabOut: function(inFocusNode){ |
this.tabbingOut = true; |
inFocusNode.focus(); |
}, |
focusGrid: function(){ |
dojox.grid.fire(this.focusView, "focus"); |
this._focusifyCellNode(true); |
}, |
doFocus: function(e){ |
// trap focus only for grid dom node |
if(e && e.target != e.currentTarget){ |
return; |
} |
// do not focus for scrolling if grid is about to blur |
if(!this.tabbingOut && this.isNoFocusCell()){ |
// establish our virtual-focus, if necessary |
this.setFocusIndex(0, 0); |
} |
this.tabbingOut = false; |
} |
}); |
|
} |