X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/ee06f37b0f6f6d94cd05a6ffae556660f7c4a2bc..c930e9176a5a85509c5b0230e2bff5c22a591432:/docs/source/EditorGrid.html diff --git a/docs/source/EditorGrid.html b/docs/source/EditorGrid.html new file mode 100644 index 00000000..73d5d358 --- /dev/null +++ b/docs/source/EditorGrid.html @@ -0,0 +1,294 @@ + +
+/** + * @class Ext.grid.EditorGridPanel + * @extends Ext.grid.GridPanel + *This class extends the {@link Ext.grid.GridPanel GridPanel Class} to provide cell editing + * on selected {@link Ext.grid.Column columns}. The editable columns are specified by providing + * an {@link Ext.grid.ColumnModel#editor editor} in the {@link Ext.grid.Column column configuration}.
+ *Editability of columns may be controlled programatically by inserting an implementation + * of {@link Ext.grid.ColumnModel#isCellEditable isCellEditable} into the + * {@link Ext.grid.ColumnModel ColumnModel}.
+ *Editing is performed on the value of the field specified by the column's + * {@link Ext.grid.ColumnModel#dataIndex dataIndex} in the backing {@link Ext.data.Store Store} + * (so if you are using a {@link Ext.grid.ColumnModel#setRenderer renderer} in order to display + * transformed data, this must be accounted for).
+ *If a value-to-description mapping is used to render a column, then a {@link Ext.form.Field#ComboBox ComboBox} + * which uses the same {@link Ext.form.Field#valueField value}-to-{@link Ext.form.Field#displayFieldField description} + * mapping would be an appropriate editor.
+ * If there is a more complex mismatch between the visible data in the grid, and the editable data in + * the {@link Edt.data.Store Store}, then code to transform the data both before and after editing can be + * injected using the {@link #beforeedit} and {@link #afteredit} events. + * @constructor + * @param {Object} config The config object + * @xtype editorgrid + */ +Ext.grid.EditorGridPanel = Ext.extend(Ext.grid.GridPanel, { + /** + * @cfg {Number} clicksToEdit + *The number of clicks on a cell required to display the cell's editor (defaults to 2).
+ *Setting this option to 'auto' means that mousedown on the selected cell starts + * editing that cell.
+ */ + clicksToEdit: 2, + + /** + * @cfg {Boolean} forceValidation + * True to force validation even if the value is unmodified (defaults to false) + */ + forceValidation: false, + + // private + isEditor : true, + // private + detectEdit: false, + + /** + * @cfg {Boolean} autoEncode + * True to automatically HTML encode and decode values pre and post edit (defaults to false) + */ + autoEncode : false, + + /** + * @cfg {Boolean} trackMouseOver @hide + */ + // private + trackMouseOver: false, // causes very odd FF errors + + // private + initComponent : function(){ + Ext.grid.EditorGridPanel.superclass.initComponent.call(this); + + if(!this.selModel){ + /** + * @cfg {Object} selModel Any subclass of AbstractSelectionModel that will provide the selection model for + * the grid (defaults to {@link Ext.grid.CellSelectionModel} if not specified). + */ + this.selModel = new Ext.grid.CellSelectionModel(); + } + + this.activeEditor = null; + + this.addEvents( + /** + * @event beforeedit + * Fires before cell editing is triggered. The edit event object has the following properties
+ *
+grid.on('afteredit', afterEdit, this );
+
+function afterEdit(e) {
+ // execute an XHR to send/commit data to the server, in callback do (if successful):
+ e.record.commit();
+};
+ *
+ * @param {Object} e An edit event (see above for description)
+ */
+ "afteredit",
+ /**
+ * @event validateedit
+ * Fires after a cell is edited, but before the value is set in the record. Return false
+ * to cancel the change. The edit event object has the following properties
+grid.on('validateedit', function(e) {
+ var myTargetRow = 6;
+
+ if (e.row == myTargetRow) {
+ e.cancel = true;
+ e.record.data[e.field] = e.value;
+ }
+});
+ *
+ * @param {Object} e An edit event (see above for description)
+ */
+ "validateedit"
+ );
+ },
+
+ // private
+ initEvents : function(){
+ Ext.grid.EditorGridPanel.superclass.initEvents.call(this);
+
+ this.on("bodyscroll", this.stopEditing, this, [true]);
+ this.on("columnresize", this.stopEditing, this, [true]);
+
+ if(this.clicksToEdit == 1){
+ this.on("cellclick", this.onCellDblClick, this);
+ }else {
+ if(this.clicksToEdit == 'auto' && this.view.mainBody){
+ this.view.mainBody.on("mousedown", this.onAutoEditClick, this);
+ }
+ this.on("celldblclick", this.onCellDblClick, this);
+ }
+ },
+
+ // private
+ onCellDblClick : function(g, row, col){
+ this.startEditing(row, col);
+ },
+
+ // private
+ onAutoEditClick : function(e, t){
+ if(e.button !== 0){
+ return;
+ }
+ var row = this.view.findRowIndex(t);
+ var col = this.view.findCellIndex(t);
+ if(row !== false && col !== false){
+ this.stopEditing();
+ if(this.selModel.getSelectedCell){ // cell sm
+ var sc = this.selModel.getSelectedCell();
+ if(sc && sc[0] === row && sc[1] === col){
+ this.startEditing(row, col);
+ }
+ }else{
+ if(this.selModel.isSelected(row)){
+ this.startEditing(row, col);
+ }
+ }
+ }
+ },
+
+ // private
+ onEditComplete : function(ed, value, startValue){
+ this.editing = false;
+ this.activeEditor = null;
+ ed.un("specialkey", this.selModel.onEditorKey, this.selModel);
+ var r = ed.record;
+ var field = this.colModel.getDataIndex(ed.col);
+ value = this.postEditValue(value, startValue, r, field);
+ if(this.forceValidation === true || String(value) !== String(startValue)){
+ var e = {
+ grid: this,
+ record: r,
+ field: field,
+ originalValue: startValue,
+ value: value,
+ row: ed.row,
+ column: ed.col,
+ cancel:false
+ };
+ if(this.fireEvent("validateedit", e) !== false && !e.cancel && String(value) !== String(startValue)){
+ r.set(field, e.value);
+ delete e.cancel;
+ this.fireEvent("afteredit", e);
+ }
+ }
+ this.view.focusCell(ed.row, ed.col);
+ },
+
+ /**
+ * Starts editing the specified for the specified row/column
+ * @param {Number} rowIndex
+ * @param {Number} colIndex
+ */
+ startEditing : function(row, col){
+ this.stopEditing();
+ if(this.colModel.isCellEditable(col, row)){
+ this.view.ensureVisible(row, col, true);
+ var r = this.store.getAt(row);
+ var field = this.colModel.getDataIndex(col);
+ var e = {
+ grid: this,
+ record: r,
+ field: field,
+ value: r.data[field],
+ row: row,
+ column: col,
+ cancel:false
+ };
+ if(this.fireEvent("beforeedit", e) !== false && !e.cancel){
+ this.editing = true;
+ var ed = this.colModel.getCellEditor(col, row);
+ if(!ed){
+ return;
+ }
+ if(!ed.rendered){
+ ed.render(this.view.getEditorParent(ed));
+ }
+ (function(){ // complex but required for focus issues in safari, ie and opera
+ ed.row = row;
+ ed.col = col;
+ ed.record = r;
+ ed.on("complete", this.onEditComplete, this, {single: true});
+ ed.on("specialkey", this.selModel.onEditorKey, this.selModel);
+ /**
+ * The currently active editor or null
+ * @type Ext.Editor
+ */
+ this.activeEditor = ed;
+ var v = this.preEditValue(r, field);
+ ed.startEdit(this.view.getCell(row, col).firstChild, v === undefined ? '' : v);
+ }).defer(50, this);
+ }
+ }
+ },
+
+ // private
+ preEditValue : function(r, field){
+ var value = r.data[field];
+ return this.autoEncode && typeof value == 'string' ? Ext.util.Format.htmlDecode(value) : value;
+ },
+
+ // private
+ postEditValue : function(value, originalValue, r, field){
+ return this.autoEncode && typeof value == 'string' ? Ext.util.Format.htmlEncode(value) : value;
+ },
+
+ /**
+ * Stops any active editing
+ * @param {Boolean} cancel (optional) True to cancel any changes
+ */
+ stopEditing : function(cancel){
+ if(this.activeEditor){
+ this.activeEditor[cancel === true ? 'cancelEdit' : 'completeEdit']();
+ }
+ this.activeEditor = null;
+ }
+});
+Ext.reg('editorgrid', Ext.grid.EditorGridPanel);
+
+
\ No newline at end of file