EditorGrid.js
上传用户:shuoshiled
上传日期:2018-01-28
资源大小:10124k
文件大小:11k
源码类别:

中间件编程

开发平台:

JavaScript

  1. /*!
  2.  * Ext JS Library 3.0.0
  3.  * Copyright(c) 2006-2009 Ext JS, LLC
  4.  * licensing@extjs.com
  5.  * http://www.extjs.com/license
  6.  */
  7. /**
  8.  * @class Ext.grid.EditorGridPanel
  9.  * @extends Ext.grid.GridPanel
  10.  * <p>This class extends the {@link Ext.grid.GridPanel GridPanel Class} to provide cell editing
  11.  * on selected {@link Ext.grid.Column columns}. The editable columns are specified by providing
  12.  * an {@link Ext.grid.ColumnModel#editor editor} in the {@link Ext.grid.Column column configuration}.</p>
  13.  * <p>Editability of columns may be controlled programatically by inserting an implementation
  14.  * of {@link Ext.grid.ColumnModel#isCellEditable isCellEditable} into the
  15.  * {@link Ext.grid.ColumnModel ColumnModel}.</p>
  16.  * <p>Editing is performed on the value of the <i>field</i> specified by the column's
  17.  * <tt>{@link Ext.grid.ColumnModel#dataIndex dataIndex}</tt> in the backing {@link Ext.data.Store Store}
  18.  * (so if you are using a {@link Ext.grid.ColumnModel#setRenderer renderer} in order to display
  19.  * transformed data, this must be accounted for).</p>
  20.  * <p>If a value-to-description mapping is used to render a column, then a {@link Ext.form.Field#ComboBox ComboBox}
  21.  * which uses the same {@link Ext.form.Field#valueField value}-to-{@link Ext.form.Field#displayFieldField description}
  22.  * mapping would be an appropriate editor.</p>
  23.  * If there is a more complex mismatch between the visible data in the grid, and the editable data in
  24.  * the {@link Edt.data.Store Store}, then code to transform the data both before and after editing can be
  25.  * injected using the {@link #beforeedit} and {@link #afteredit} events.
  26.  * @constructor
  27.  * @param {Object} config The config object
  28.  * @xtype editorgrid
  29.  */
  30. Ext.grid.EditorGridPanel = Ext.extend(Ext.grid.GridPanel, {
  31.     /**
  32.      * @cfg {Number} clicksToEdit
  33.      * <p>The number of clicks on a cell required to display the cell's editor (defaults to 2).</p>
  34.      * <p>Setting this option to 'auto' means that mousedown <i>on the selected cell</i> starts
  35.      * editing that cell.</p>
  36.      */
  37.     clicksToEdit: 2,
  38.     
  39.     /**
  40.     * @cfg {Boolean} forceValidation
  41.     * True to force validation even if the value is unmodified (defaults to false)
  42.     */
  43.     forceValidation: false,
  44.     // private
  45.     isEditor : true,
  46.     // private
  47.     detectEdit: false,
  48. /**
  49.  * @cfg {Boolean} autoEncode
  50.  * True to automatically HTML encode and decode values pre and post edit (defaults to false)
  51.  */
  52. autoEncode : false,
  53. /**
  54.  * @cfg {Boolean} trackMouseOver @hide
  55.  */
  56.     // private
  57.     trackMouseOver: false, // causes very odd FF errors
  58.     // private
  59.     initComponent : function(){
  60.         Ext.grid.EditorGridPanel.superclass.initComponent.call(this);
  61.         if(!this.selModel){
  62.             /**
  63.              * @cfg {Object} selModel Any subclass of AbstractSelectionModel that will provide the selection model for
  64.              * the grid (defaults to {@link Ext.grid.CellSelectionModel} if not specified).
  65.              */
  66.             this.selModel = new Ext.grid.CellSelectionModel();
  67.         }
  68.         this.activeEditor = null;
  69.     this.addEvents(
  70.             /**
  71.              * @event beforeedit
  72.              * Fires before cell editing is triggered. The edit event object has the following properties <br />
  73.              * <ul style="padding:5px;padding-left:16px;">
  74.              * <li>grid - This grid</li>
  75.              * <li>record - The record being edited</li>
  76.              * <li>field - The field name being edited</li>
  77.              * <li>value - The value for the field being edited.</li>
  78.              * <li>row - The grid row index</li>
  79.              * <li>column - The grid column index</li>
  80.              * <li>cancel - Set this to true to cancel the edit or return false from your handler.</li>
  81.              * </ul>
  82.              * @param {Object} e An edit event (see above for description)
  83.              */
  84.             "beforeedit",
  85.             /**
  86.              * @event afteredit
  87.              * Fires after a cell is edited. The edit event object has the following properties <br />
  88.              * <ul style="padding:5px;padding-left:16px;">
  89.              * <li>grid - This grid</li>
  90.              * <li>record - The record being edited</li>
  91.              * <li>field - The field name being edited</li>
  92.              * <li>value - The value being set</li>
  93.              * <li>originalValue - The original value for the field, before the edit.</li>
  94.              * <li>row - The grid row index</li>
  95.              * <li>column - The grid column index</li>
  96.              * </ul>
  97.              *
  98.              * <pre><code> 
  99. grid.on('afteredit', afterEdit, this );
  100. function afterEdit(e) {
  101.     // execute an XHR to send/commit data to the server, in callback do (if successful):
  102.     e.record.commit();
  103. }; 
  104.              * </code></pre>
  105.              * @param {Object} e An edit event (see above for description)
  106.              */
  107.             "afteredit",
  108.             /**
  109.              * @event validateedit
  110.              * Fires after a cell is edited, but before the value is set in the record. Return false
  111.              * to cancel the change. The edit event object has the following properties <br />
  112.              * <ul style="padding:5px;padding-left:16px;">
  113.              * <li>grid - This grid</li>
  114.              * <li>record - The record being edited</li>
  115.              * <li>field - The field name being edited</li>
  116.              * <li>value - The value being set</li>
  117.              * <li>originalValue - The original value for the field, before the edit.</li>
  118.              * <li>row - The grid row index</li>
  119.              * <li>column - The grid column index</li>
  120.              * <li>cancel - Set this to true to cancel the edit or return false from your handler.</li>
  121.              * </ul>
  122.              * Usage example showing how to remove the red triangle (dirty record indicator) from some
  123.              * records (not all).  By observing the grid's validateedit event, it can be cancelled if
  124.              * the edit occurs on a targeted row (for example) and then setting the field's new value
  125.              * in the Record directly:
  126.              * <pre><code> 
  127. grid.on('validateedit', function(e) {
  128.   var myTargetRow = 6;
  129.  
  130.   if (e.row == myTargetRow) {
  131.     e.cancel = true;
  132.     e.record.data[e.field] = e.value;
  133.   }
  134. });
  135.              * </code></pre>
  136.              * @param {Object} e An edit event (see above for description)
  137.              */
  138.             "validateedit"
  139.         );
  140.     },
  141.     // private
  142.     initEvents : function(){
  143.         Ext.grid.EditorGridPanel.superclass.initEvents.call(this);
  144.         this.on("bodyscroll", this.stopEditing, this, [true]);
  145.         this.on("columnresize", this.stopEditing, this, [true]);
  146.         if(this.clicksToEdit == 1){
  147.             this.on("cellclick", this.onCellDblClick, this);
  148.         }else {
  149.             if(this.clicksToEdit == 'auto' && this.view.mainBody){
  150.                 this.view.mainBody.on("mousedown", this.onAutoEditClick, this);
  151.             }
  152.             this.on("celldblclick", this.onCellDblClick, this);
  153.         }
  154.     },
  155.     // private
  156.     onCellDblClick : function(g, row, col){
  157.         this.startEditing(row, col);
  158.     },
  159.     // private
  160.     onAutoEditClick : function(e, t){
  161.         if(e.button !== 0){
  162.             return;
  163.         }
  164.         var row = this.view.findRowIndex(t);
  165.         var col = this.view.findCellIndex(t);
  166.         if(row !== false && col !== false){
  167.             this.stopEditing();
  168.             if(this.selModel.getSelectedCell){ // cell sm
  169.                 var sc = this.selModel.getSelectedCell();
  170.                 if(sc && sc[0] === row && sc[1] === col){
  171.                     this.startEditing(row, col);
  172.                 }
  173.             }else{
  174.                 if(this.selModel.isSelected(row)){
  175.                     this.startEditing(row, col);
  176.                 }
  177.             }
  178.         }
  179.     },
  180.     // private
  181.     onEditComplete : function(ed, value, startValue){
  182.         this.editing = false;
  183.         this.activeEditor = null;
  184.         ed.un("specialkey", this.selModel.onEditorKey, this.selModel);
  185. var r = ed.record;
  186.         var field = this.colModel.getDataIndex(ed.col);
  187.         value = this.postEditValue(value, startValue, r, field);
  188.         if(this.forceValidation === true || String(value) !== String(startValue)){
  189.             var e = {
  190.                 grid: this,
  191.                 record: r,
  192.                 field: field,
  193.                 originalValue: startValue,
  194.                 value: value,
  195.                 row: ed.row,
  196.                 column: ed.col,
  197.                 cancel:false
  198.             };
  199.             if(this.fireEvent("validateedit", e) !== false && !e.cancel && String(value) !== String(startValue)){
  200.                 r.set(field, e.value);
  201.                 delete e.cancel;
  202.                 this.fireEvent("afteredit", e);
  203.             }
  204.         }
  205.         this.view.focusCell(ed.row, ed.col);
  206.     },
  207.     /**
  208.      * Starts editing the specified for the specified row/column
  209.      * @param {Number} rowIndex
  210.      * @param {Number} colIndex
  211.      */
  212.     startEditing : function(row, col){
  213.         this.stopEditing();
  214.         if(this.colModel.isCellEditable(col, row)){
  215.             this.view.ensureVisible(row, col, true);
  216.             var r = this.store.getAt(row);
  217.             var field = this.colModel.getDataIndex(col);
  218.             var e = {
  219.                 grid: this,
  220.                 record: r,
  221.                 field: field,
  222.                 value: r.data[field],
  223.                 row: row,
  224.                 column: col,
  225.                 cancel:false
  226.             };
  227.             if(this.fireEvent("beforeedit", e) !== false && !e.cancel){
  228.                 this.editing = true;
  229.                 var ed = this.colModel.getCellEditor(col, row);
  230.                 if(!ed){
  231.                     return;
  232.                 }
  233.                 if(!ed.rendered){
  234.                     ed.render(this.view.getEditorParent(ed));
  235.                 }
  236.                 (function(){ // complex but required for focus issues in safari, ie and opera
  237.                     ed.row = row;
  238.                     ed.col = col;
  239.                     ed.record = r;
  240.                     ed.on("complete", this.onEditComplete, this, {single: true});
  241.                     ed.on("specialkey", this.selModel.onEditorKey, this.selModel);
  242.                     /**
  243.                      * The currently active editor or null
  244.                       * @type Ext.Editor
  245.                      */
  246.                     this.activeEditor = ed;
  247.                     var v = this.preEditValue(r, field);
  248.                     ed.startEdit(this.view.getCell(row, col).firstChild, v === undefined ? '' : v);
  249.                 }).defer(50, this);
  250.             }
  251.         }
  252.     },
  253.     // private
  254.     preEditValue : function(r, field){
  255.         var value = r.data[field];
  256.         return this.autoEncode && typeof value == 'string' ? Ext.util.Format.htmlDecode(value) : value;
  257.     },
  258.     // private
  259. postEditValue : function(value, originalValue, r, field){
  260. return this.autoEncode && typeof value == 'string' ? Ext.util.Format.htmlEncode(value) : value;
  261. },
  262.     /**
  263.      * Stops any active editing
  264.      * @param {Boolean} cancel (optional) True to cancel any changes
  265.      */
  266.     stopEditing : function(cancel){
  267.         if(this.activeEditor){
  268.             this.activeEditor[cancel === true ? 'cancelEdit' : 'completeEdit']();
  269.         }
  270.         this.activeEditor = null;
  271.     }
  272. });
  273. Ext.reg('editorgrid', Ext.grid.EditorGridPanel);