]> git.pond.sub.org Git - eow/blobdiff - static/dojo-release-1.1.1/dojox/grid/_grid/edit.js
add Dojo 1.1.1
[eow] / static / dojo-release-1.1.1 / dojox / grid / _grid / edit.js
diff --git a/static/dojo-release-1.1.1/dojox/grid/_grid/edit.js b/static/dojo-release-1.1.1/dojox/grid/_grid/edit.js
new file mode 100644 (file)
index 0000000..d918423
--- /dev/null
@@ -0,0 +1,238 @@
+if(!dojo._hasResource["dojox.grid._grid.edit"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.grid._grid.edit"] = true;
+dojo.provide("dojox.grid._grid.edit");
+
+dojo.declare("dojox.grid.edit", 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;
+               this.connections = [];
+               if(dojo.isIE){
+                       this.connections.push(dojo.connect(document.body, "onfocus", dojo.hitch(this, "_boomerangFocus")));
+               }
+       },
+       
+       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.editor||0).alwaysOn)){
+                       // 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 += ' dojoxGrid-row-editing';
+               }
+       },
+
+       dispatchEvent: function(e){
+               var c = e.cell, ed = c && c.editor;
+               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(inCell, inRowIndex)){
+                       this.start(inCell, inRowIndex, this.isEditRow(inRowIndex) || inCell.editor);
+               }
+       },
+
+       _focusEditor: function(inCell, inRowIndex){
+               dojox.grid.fire(inCell.editor, "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;}
+       },
+       // end boomerang fix API
+
+       start: function(inCell, inRowIndex, inEditing){
+               this.grid.beginUpdate();
+               this.editorApply();
+               if(this.isEditing() && !this.isEditRow(inRowIndex)){
+                       this.applyRowEdit();
+                       this.grid.updateRow(inRowIndex);
+               }
+               if(inEditing){
+                       this.info = { cell: inCell, rowIndex: inRowIndex };
+                       this.grid.doStartEdit(inCell, inRowIndex); 
+                       this.grid.updateRow(inRowIndex);
+               }else{
+                       this.info = {};
+               }
+               this.grid.endUpdate();
+               // make sure we don't utterly lose focus
+               this.grid.focus.focusGrid();
+               // let the editor focus itself as needed
+               this._focusEditor(inCell, inRowIndex);
+               // give ourselves a few ms to boomerang IE focus effects
+               this._doCatchBoomerang();
+       },
+
+       _editorDo: function(inMethod){
+               var c = this.info.cell
+               //c && c.editor && c.editor[inMethod](c, this.info.rowIndex);
+               c && c.editor && c.editor[inMethod](this.info.rowIndex);
+       },
+
+       editorApply: function(){
+               this._editorDo("apply");
+       },
+
+       editorCancel: function(){
+               this._editorDo("cancel");
+       },
+
+       applyCellEdit: function(inValue, inCell, inRowIndex){
+               if(this.grid.canEdit(inCell, inRowIndex)){
+                       this.grid.doApplyCellEdit(inValue, inRowIndex, inCell.fieldIndex);
+               }
+       },
+
+       applyRowEdit: function(){
+               this.grid.doApplyEdit(this.info.rowIndex);
+       },
+
+       apply: function(){
+               // summary:
+               //              Apply a grid edit
+               if(this.isEditing()){
+                       this.grid.beginUpdate();
+                       this.editorApply();
+                       this.applyRowEdit();
+                       this.info = {};
+                       this.grid.endUpdate();
+                       this.grid.focus.focusGrid();
+                       this._doCatchBoomerang();
+               }
+       },
+
+       cancel: function(){
+               // summary:
+               //              Cancel a grid edit
+               if(this.isEditing()){
+                       this.grid.beginUpdate();
+                       this.editorCancel();
+                       this.info = {};
+                       this.grid.endUpdate();
+                       this.grid.focus.focusGrid();
+                       this._doCatchBoomerang();
+               }
+       },
+
+       save: function(inRowIndex, inView){
+               // summary:
+               //              Save the grid editing state
+               // inRowIndex: Integer
+               //              Grid row index
+               // inView: Object
+               //              Grid view
+               var c = this.info.cell;
+               if(this.isEditRow(inRowIndex) && (!inView || c.view==inView) && c.editor){
+                       c.editor.save(c, this.info.rowIndex);
+               }
+       },
+
+       restore: function(inView, inRowIndex){
+               // summary:
+               //              Restores the grid editing state
+               // inRowIndex: Integer
+               //              Grid row index
+               // inView: Object
+               //              Grid view
+               var c = this.info.cell;
+               if(this.isEditRow(inRowIndex) && c.view == inView && c.editor){
+                       c.editor.restore(c, this.info.rowIndex);
+               }
+       }
+});
+
+}