diff --git a/WebWidgets/ExtJS/src/TableRenderer.cpp b/WebWidgets/ExtJS/src/TableRenderer.cpp index 64597ece3..918829aac 100644 --- a/WebWidgets/ExtJS/src/TableRenderer.cpp +++ b/WebWidgets/ExtJS/src/TableRenderer.cpp @@ -94,8 +94,14 @@ void TableRenderer::renderHead(const Renderable* pRenderable, const RenderContex if ((*it) && (*it)->getCell()) editable |= (*it)->isEditable(); } + if (editable) - ostr << "new Ext.grid.EditorGridPanel({"; + { + if (pTable->autoEdit()) + ostr << "new Ext.grid.AppinfTable({autoEdit:true,"; + else + ostr << "new Ext.grid.EditorGridPanel({"; + } else ostr << "new Ext.grid.GridPanel({"; diff --git a/WebWidgets/ExtJS/src/Utility.cpp b/WebWidgets/ExtJS/src/Utility.cpp index 40722c385..7582325b2 100644 --- a/WebWidgets/ExtJS/src/Utility.cpp +++ b/WebWidgets/ExtJS/src/Utility.cpp @@ -147,6 +147,7 @@ void Utility::initialize(ResourceManager::Ptr ptr, const Poco::Path& extJSDir) #else ptr->appendJSInclude(Poco::Path(aDir, "ext-all.js")); #endif + ptr->appendJSInclude(Poco::Path(aDir, "AppinfTable.js")); ptr->appendJSInclude(Poco::Path(aDir, "DDView.js")); ptr->appendJSInclude(Poco::Path(aDir, "Multiselect.js")); diff --git a/WebWidgets/ExtJS/testsuite/bin/AppinfTable.js b/WebWidgets/ExtJS/testsuite/bin/AppinfTable.js new file mode 100644 index 000000000..3fd0562b8 --- /dev/null +++ b/WebWidgets/ExtJS/testsuite/bin/AppinfTable.js @@ -0,0 +1,125 @@ + +Ext.grid.AppinfTable = Ext.extend(Ext.grid.EditorGridPanel, { + /** + * @cfg {Boolean} autoEdit + * enables autoEdit Mode + */ + autoEdit: true, + + charThatStartedEdit: null, + + origEditValue: null, + + // private + initComponent : function(){ + //make sure we have cell selection! + this.selModel = new Ext.grid.CellSelectionModel(); + Ext.grid.AppinfTable.superclass.initComponent.call(this); + }, + + // private + initEvents : function(){ + Ext.grid.AppinfTable.superclass.initEvents.call(this); + this.on("keydown", this.onKeyDownEvent, this); + }, + + //private + onKeyDownEvent: function(e){ + var code = e.getKey(); + if (code != undefined && code != e.LEFT && code != e.RIGHT && code != e.UP && code != e.DOWN && code != e.ESC && code != e.ENTER + && code != e.TAB && code != e.SHIFT && code != e.PAGEUP && code != e.PAGEDOWN && code != e.HOME && code != e.F5 && + code != e.END && code != e.DELETE && code != e.CONTROL && code != e.BACKSPACE){ + this.charThatStartedEdit = code; + var sc = this.selModel.getSelectedCell(); + var col = sc[1]; + var row = sc[0]; + this.startEditing(row, col); + } + else + this.charThatStartedEdit = null; + }, +}); + +Ext.reg('appinfgrid', Ext.grid.AppinfTable); + +Ext.override(Ext.grid.AppinfTable, { + 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.rendered){ + var edView = this.view.getEditorParent(ed); + ed.render(edView); + } + var edfield = ed.field; + ed.row = row; + ed.col = col; + ed.record = r; + ed.field = edfield; + ed.on("complete", this.onEditComplete, this, {single: true}); + ed.on("specialkey", this.selModel.onEditorKey, this.selModel); + this.activeEditor = ed; + var v = this.preEditValue(r, field); + this.origEditValue = v; + if (v == e.value) + { + if (this.autoEdit && this.charThatStartedEdit) + { + e.value = String.fromCharCode(this.charThatStartedEdit); + ed.field.selectOnFocus = false; + } + else + ed.field.selectOnFocus = true; + } + else + ed.field.selectOnFocus = false; + this.charThatStartedEdit = null; + (function(){ + ed.startEdit(this.view.getCell(row, col), e.value); + ed.field.preFocus(); + }).defer(50, this); + } + } + }, + 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(String(value) !== String(this.origEditValue)){ + var e = { + grid: this, + record: r, + field: field, + originalValue: this.origEditValue, + value: value, + row: ed.row, + column: ed.col, + cancel:false + }; + if(this.fireEvent("validateedit", e) !== false && !e.cancel){ + r.set(field, e.value); + delete e.cancel; + this.fireEvent("afteredit", e); + } + } + this.view.focusCell(ed.row, ed.col); + }, +}); + \ No newline at end of file diff --git a/WebWidgets/include/Poco/WebWidgets/Table.h b/WebWidgets/include/Poco/WebWidgets/Table.h index f17da4424..216b059cf 100644 --- a/WebWidgets/include/Poco/WebWidgets/Table.h +++ b/WebWidgets/include/Poco/WebWidgets/Table.h @@ -202,6 +202,12 @@ public: int getPagingSize() const; /// Returns the paging size + void autoEdit(bool val); + /// Enables/disables autoedit. autoedit works only with cell based selection! + + bool autoEdit() const; + // Returns if autoEdit is on/off + protected: Table(const std::string& name, const std::type_info& type, const TableColumns& tc, TableModel::Ptr pModel); /// Creates a Table and assigns it the given name. @@ -220,6 +226,7 @@ private: TableColumns _columns; SelectionModel _sm; bool _dragAndDrop; + bool _autoEdit; int _maxRowsPerPage; }; @@ -299,6 +306,18 @@ inline int Table::getPagingSize() const } +inline void Table::autoEdit(bool val) +{ + _autoEdit = val; +} + + +inline bool Table::autoEdit() const +{ + return _autoEdit; +} + + } } // namespace Poco::WebWidgets diff --git a/WebWidgets/src/Table.cpp b/WebWidgets/src/Table.cpp index 83f9003f5..32000a2f5 100644 --- a/WebWidgets/src/Table.cpp +++ b/WebWidgets/src/Table.cpp @@ -72,6 +72,7 @@ Table::Table(const TableColumns& tc, TableModel::Ptr pModel): _columns(tc), _sm(SM_CELL), _dragAndDrop(false), + _autoEdit(false), _maxRowsPerPage(0) { checkValidConfig();