Blame | Last modification | View Log | RSS feed
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 managementdojo.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 focusedreturn (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;}varc = 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 viewif(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 viewif(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 indexthis.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 indexif(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 focusif(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 cellvar 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 cellvar 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 focusvarrc = 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 nodeif(e && e.target != e.currentTarget){return;}// do not focus for scrolling if grid is about to blurif(!this.tabbingOut && this.isNoFocusCell()){// establish our virtual-focus, if necessarythis.setFocusIndex(0, 0);}this.tabbingOut = false;}});}