From 8128fe0008a8daa2f19638127836b47d860a169e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9gory=20Soutad=C3=A9?= Date: Sun, 12 Feb 2012 10:20:02 +0100 Subject: [PATCH] Use QXml for export engine Change import/export engine filter to Qt format Qt doesn't add extension in its file dialog Fix a bug : op was not correctly set by default in OnOperationModified (GridAccount) --- src/controller/KissCount.cpp | 34 +++++-- src/controller/KissCount.hpp | 4 +- src/model/export/ExportEngine.cpp | 5 + src/model/export/ExportEngine.hpp | 5 +- src/model/export/XMLExportEngine.cpp | 124 +++++++++++++----------- src/model/export/XMLExportEngine.hpp | 2 +- src/model/import/GrisbiImportEngine.cpp | 4 +- src/model/import/ImportEngine.cpp | 5 + src/model/import/ImportEngine.hpp | 4 +- src/model/import/OFXImportEngine.cpp | 4 +- src/model/import/XMLImportEngine.cpp | 4 +- src/view/ExportPanel.cpp | 6 +- src/view/grid/GridAccount.cpp | 16 +++ 13 files changed, 136 insertions(+), 81 deletions(-) diff --git a/src/controller/KissCount.cpp b/src/controller/KissCount.cpp index c15f772..1bc177a 100644 --- a/src/controller/KissCount.cpp +++ b/src/controller/KissCount.cpp @@ -538,7 +538,7 @@ QString KissCount::GetImportEngineExtensions() std::vector* importEngines = KissCount::GetImportEngines(); for(i=0; i<(int)importEngines->size()-1; i++) - res = res + (*importEngines)[i]->GetFileExt() + "|" ; + res = res + (*importEngines)[i]->GetFileExt() + ";;" ; if (importEngines->size()) res = res + (*importEngines)[i]->GetFileExt(); @@ -546,14 +546,23 @@ QString KissCount::GetImportEngineExtensions() return res; } -ImportEngine* KissCount::GetImportEngine(QString path) +ImportEngine* KissCount::GetImportEngine(QString path, QString filter) { std::vector::iterator it; std::vector* importEngines = KissCount::GetImportEngines(); + QString tmp; for(it=importEngines->begin(); it!=importEngines->end(); it++) - if ((*it)->HandleFile(path, _user, _db, this)) - return *it; + { + if (filter == (*it)->GetFileExt()) + { + tmp = path; + if (!tmp.endsWith((*it)->GetShortExt())) + tmp += (*it)->GetShortExt(); + if ((*it)->HandleFile(path, _user, _db, this)) + return *it; + } + } return 0; } @@ -587,7 +596,7 @@ QString KissCount::GetExportEngineExtensions() std::vector* exportEngines = KissCount::GetExportEngines(); for(i=0; i<(int)exportEngines->size()-1; i++) - res = res + (*exportEngines)[i]->GetFileExt() + "|" ; + res = res + (*exportEngines)[i]->GetFileExt() + ";;" ; if (exportEngines->size()) res = res + (*exportEngines)[i]->GetFileExt(); @@ -595,14 +604,23 @@ QString KissCount::GetExportEngineExtensions() return res; } -ExportEngine* KissCount::GetExportEngine(QString path) +ExportEngine* KissCount::GetExportEngine(QString path, QString filter) { std::vector::iterator it; std::vector* exportEngines = KissCount::GetExportEngines(); + QString tmp; for(it=exportEngines->begin(); it!=exportEngines->end(); it++) - if ((*it)->HandleFile(path, _user, _db, this)) - return *it; + { + if (filter == (*it)->GetFileExt()) + { + tmp = path; + if (!tmp.endsWith((*it)->GetShortExt())) + tmp += (*it)->GetShortExt(); + if ((*it)->HandleFile(tmp, _user, _db, this)) + return *it; + } + } return 0; } diff --git a/src/controller/KissCount.hpp b/src/controller/KissCount.hpp index 011368e..1041d07 100644 --- a/src/controller/KissCount.hpp +++ b/src/controller/KissCount.hpp @@ -125,13 +125,13 @@ public: static void UnRegisterImportEngine(ImportEngine* engine); QString GetImportEngineExtensions(); - ImportEngine* GetImportEngine(QString path); + ImportEngine* GetImportEngine(QString path, QString filter); static void RegisterExportEngine(ExportEngine* engine); static void UnRegisterExportEngine(ExportEngine* engine); QString GetExportEngineExtensions(); - ExportEngine* GetExportEngine(QString path); + ExportEngine* GetExportEngine(QString path, QString filter); void UpdateImportPattern(); diff --git a/src/model/export/ExportEngine.cpp b/src/model/export/ExportEngine.cpp index ff8ff8a..441b056 100644 --- a/src/model/export/ExportEngine.cpp +++ b/src/model/export/ExportEngine.cpp @@ -105,3 +105,8 @@ QString ExportEngine::GetFileExt() return _(_longExt.toStdString().c_str()); } +QString ExportEngine::GetShortExt() +{ + return _shortExt; +} + diff --git a/src/model/export/ExportEngine.hpp b/src/model/export/ExportEngine.hpp index 311a79f..ae81d1e 100644 --- a/src/model/export/ExportEngine.hpp +++ b/src/model/export/ExportEngine.hpp @@ -32,9 +32,12 @@ public: ~ExportEngine(); // Get supported file extension. Example : - // "OFX files (*.ofx)|*.ofx" + // "OFX files (*.ofx)" virtual QString GetFileExt(); + // ".ofx" + virtual QString GetShortExt(); + // Handle the file virtual bool HandleFile(const QString& path, User* user, Database* db, KissCount* kiss)=0; diff --git a/src/model/export/XMLExportEngine.cpp b/src/model/export/XMLExportEngine.cpp index 69ff884..3fd3a27 100644 --- a/src/model/export/XMLExportEngine.cpp +++ b/src/model/export/XMLExportEngine.cpp @@ -17,8 +17,8 @@ along with KissCount. If not, see . */ -#include -#include +#include +#include #include @@ -30,8 +30,8 @@ XMLExportEngine::XMLExportEngine() { KissCount::RegisterExportEngine(this); - _shortExt = "xml"; - _longExt = _("KissCount XML files (*.xml)|*.xml"); + _shortExt = ".xml"; + _longExt = _("KissCount XML files (*.xml)"); } XMLExportEngine::~XMLExportEngine() @@ -55,17 +55,17 @@ bool XMLExportEngine::SaveAccounts() ESCAPE_CHARS(account.name); ESCAPE_CHARS(account.number); - xmlTextWriterStartElement(_writer, (const xmlChar*) "account"); - xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "id", (const xmlChar*) QString::number(account.id).toStdString().c_str()); - xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "name", (const xmlChar*) account.name.toStdString().c_str()); - xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "number", (const xmlChar*) account.number.toStdString().c_str()); - // xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "shared", (const xmlChar*) (account.shared ? "1" : "0")); - xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "blocked", (const xmlChar*) (account.blocked ? "1" : "0")); - // xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "default", (const xmlChar*) (account._default ? "1" : "0")); - // xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "is_owner", (const xmlChar*) (account.is_owner ? "1" : "0")); - xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "virtual", (const xmlChar*) (account._virtual ? "1" : "0")); - xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "hidden", (const xmlChar*) (account.hidden ? "1" : "0")); - xmlTextWriterEndElement(_writer); + _writer->writeStartElement("account"); + _writer->writeAttribute("id", QString::number(account.id)); + _writer->writeAttribute("name", account.name); + _writer->writeAttribute("number", account.number); + // _writer->writeAttribute("shared", (account.shared ? "1" : "0")); + _writer->writeAttribute("blocked", (account.blocked ? "1" : "0")); + // _writer->writeAttribute("default", (account._default ? "1" : "0")); + // _writer->writeAttribute("is_owner", (account.is_owner ? "1" : "0")); + _writer->writeAttribute("virtual", (account._virtual ? "1" : "0")); + _writer->writeAttribute("hidden", (account.hidden ? "1" : "0")); + _writer->writeEndElement(); } return true; @@ -74,15 +74,16 @@ bool XMLExportEngine::SaveAccounts() bool XMLExportEngine::SaveAccountAmounts() { std::map::iterator it; + QString v; for(it=_accountAmounts.begin(); it!=_accountAmounts.end(); it++) { - xmlTextWriterStartElement(_writer, (const xmlChar*) "account_amount"); - xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "account", (const xmlChar*) QString::number(it->first.account).toStdString().c_str()); - xmlTextWriterWriteFormatAttribute(_writer, (const xmlChar*) "month", "%d", it->first.month); - xmlTextWriterWriteFormatAttribute(_writer, (const xmlChar*) "year", "%d", it->first.year); - xmlTextWriterWriteFormatAttribute(_writer, (const xmlChar*) "amount", "%.2lf", it->second); - xmlTextWriterEndElement(_writer); + _writer->writeStartElement("account_amount"); + _writer->writeAttribute("account", QString::number(it->first.account)); + _writer->writeAttribute("month", QString::number(it->first.month)); + _writer->writeAttribute("year", QString::number(it->first.year)); + _writer->writeAttribute("amount", v.sprintf("%.2lf", it->second)); + _writer->writeEndElement(); } return true; @@ -93,6 +94,7 @@ bool XMLExportEngine::SaveCategories() Category category; std::map::iterator it; int rgb; + QString v; for(it=_categories.begin(); it!=_categories.end(); it++) { @@ -100,21 +102,21 @@ bool XMLExportEngine::SaveCategories() ESCAPE_CHARS(category.name); - xmlTextWriterStartElement(_writer, (const xmlChar*) "category"); - xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "id", (const xmlChar*) QString::number(category.id).toStdString().c_str()); - xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "parent", (const xmlChar*) QString::number(category.parent).toStdString().c_str()); - xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "name", (const xmlChar*) category.name.toStdString().c_str()); - xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "font", (const xmlChar*) category.font.toStdString().c_str()); + _writer->writeStartElement("category"); + _writer->writeAttribute("id", QString::number(category.id)); + _writer->writeAttribute("parent", QString::number(category.parent)); + _writer->writeAttribute("name", category.name); + _writer->writeAttribute("font", category.font); rgb = category.backcolor.blue(); rgb |= category.backcolor.green() << 8; rgb |= category.backcolor.red() << 16; - xmlTextWriterWriteFormatAttribute(_writer, (const xmlChar*) "backcolor", "0x%08X", rgb); + _writer->writeAttribute("backcolor", v.sprintf("0x%08X", rgb)); rgb = category.forecolor.blue(); rgb |= category.forecolor.green() << 8; rgb |= category.forecolor.red() << 16; - xmlTextWriterWriteFormatAttribute(_writer, (const xmlChar*) "forecolor", "0x%08X", rgb); - xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "fix_cost", (const xmlChar*) (category.fix_cost ? "1" : "0")); - xmlTextWriterEndElement(_writer); + _writer->writeAttribute("forecolor", v.sprintf("0x%08X", rgb)); + _writer->writeAttribute("fix_cost", (category.fix_cost ? "1" : "0")); + _writer->writeEndElement(); } return true; @@ -123,28 +125,29 @@ bool XMLExportEngine::SaveCategories() bool XMLExportEngine::SaveOperations(std::vector* operations) { std::vector::iterator it; + QString v; for(it=operations->begin(); it!=operations->end(); it++) { ESCAPE_CHARS(it->description); - xmlTextWriterStartElement(_writer, (const xmlChar*) "operation"); - xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "id", (const xmlChar*) QString::number(it->id).toStdString().c_str()); - xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "parent", (const xmlChar*) QString::number(it->parent).toStdString().c_str()); - xmlTextWriterWriteFormatAttribute(_writer, (const xmlChar*) "day", "%d", it->day); - xmlTextWriterWriteFormatAttribute(_writer, (const xmlChar*) "month", "%d", it->month); - xmlTextWriterWriteFormatAttribute(_writer, (const xmlChar*) "year", "%d", it->year); - xmlTextWriterWriteFormatAttribute(_writer, (const xmlChar*) "amount", "%.2lf", it->amount); - xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "description", (const xmlChar*) it->description.toStdString().c_str()); - xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "category", (const xmlChar*) QString::number(it->category).toStdString().c_str()); - xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "fix_cost", (const xmlChar*) (it->fix_cost ? "1" : "0")); - xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "account", (const xmlChar*) QString::number(it->account).toStdString().c_str()); - xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "checked", (const xmlChar*) (it->checked ? "1" : "0")); - xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "transfert", (const xmlChar*) QString::number(it->transfert).toStdString().c_str()); - xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "formula", (const xmlChar*) it->formula.toStdString().c_str()); - xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "meta", (const xmlChar*) (it->meta ? "1" : "0")); - xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "virtual", (const xmlChar*) (it->_virtual ? "1" : "0")); - xmlTextWriterEndElement(_writer); + _writer->writeStartElement("operation"); + _writer->writeAttribute("id", QString::number(it->id)); + _writer->writeAttribute("parent", QString::number(it->parent)); + _writer->writeAttribute("day", QString::number(it->day)); + _writer->writeAttribute("month", QString::number(it->month)); + _writer->writeAttribute("year", QString::number(it->year)); + _writer->writeAttribute("amount", v.sprintf("%.2lf", it->amount)); + _writer->writeAttribute("description", it->description); + _writer->writeAttribute("category", QString::number(it->category)); + _writer->writeAttribute("fix_cost", (it->fix_cost ? "1" : "0")); + _writer->writeAttribute("account", QString::number(it->account)); + _writer->writeAttribute("checked", (it->checked ? "1" : "0")); + _writer->writeAttribute("transfert", QString::number(it->transfert)); + _writer->writeAttribute("formula", it->formula); + _writer->writeAttribute("meta", (it->meta ? "1" : "0")); + _writer->writeAttribute("virtual", (it->_virtual ? "1" : "0")); + _writer->writeEndElement(); } return true; @@ -152,37 +155,40 @@ bool XMLExportEngine::SaveOperations(std::vector* operations) bool XMLExportEngine::SaveFile(std::vector* operations) { + QFile file(_path); int rc; rc = ExportEngine::SaveFile(operations); if (!rc) return false; - _writer = xmlNewTextWriterFilename(_path.toStdString().c_str(), 0); - - if (!_writer) + if (!file.open(QIODevice::ReadWrite)) { - std::cout << "Error can't open the file" << std::endl; + std::cout << "Error can't open the file " << _path.toStdString() << std::endl; return false; } - rc = xmlTextWriterStartDocument(_writer, 0, "UTF-8", 0); + _writer = new QXmlStreamWriter(&file); - if (rc < 0) return false; - - xmlTextWriterStartElement(_writer, (const xmlChar*) "kisscount"); - xmlTextWriterWriteAttribute(_writer, (const xmlChar*) "version", (const xmlChar*) "1"); + _writer->setCodec("UTF-8"); + _writer->setAutoFormatting(true); + _writer->setAutoFormattingIndent(4); + _writer->writeStartDocument("1.0"); + _writer->writeStartElement("kisscount"); + _writer->writeAttribute("version", "1"); SaveAccounts(); SaveAccountAmounts(); SaveCategories(); SaveOperations(operations); - xmlTextWriterEndElement(_writer); + _writer->writeEndElement(); + _writer->writeEndDocument(); - xmlTextWriterEndDocument(_writer); + file.flush(); + file.close(); - xmlFreeTextWriter(_writer); + delete _writer; return true; } diff --git a/src/model/export/XMLExportEngine.hpp b/src/model/export/XMLExportEngine.hpp index 45fdf1c..05d091d 100644 --- a/src/model/export/XMLExportEngine.hpp +++ b/src/model/export/XMLExportEngine.hpp @@ -33,7 +33,7 @@ public: bool SaveFile(std::vector* operations); private: - xmlTextWriterPtr _writer; + QXmlStreamWriter* _writer; bool SaveAccounts(); bool SaveAccountAmounts(); diff --git a/src/model/import/GrisbiImportEngine.cpp b/src/model/import/GrisbiImportEngine.cpp index 633628d..8287760 100644 --- a/src/model/import/GrisbiImportEngine.cpp +++ b/src/model/import/GrisbiImportEngine.cpp @@ -199,8 +199,8 @@ GrisbiImportEngine::GrisbiImportEngine() { KissCount::RegisterImportEngine(this); - _shortExt = "gsb"; - _longExt = _("Grisbi files (*.gsb)|*.gsb"); + _shortExt = ".gsb"; + _longExt = _("Grisbi files (*.gsb)"); _sax.startElement = GrisbiStartElement ; } diff --git a/src/model/import/ImportEngine.cpp b/src/model/import/ImportEngine.cpp index 6343d4d..bf1ea78 100644 --- a/src/model/import/ImportEngine.cpp +++ b/src/model/import/ImportEngine.cpp @@ -52,6 +52,11 @@ QString ImportEngine::GetFileExt() return _(_longExt.toStdString().c_str()); } +QString ImportEngine::GetShortExt() +{ + return _shortExt; +} + std::vector ExplodeString(QString& s) { QString tmp = s, cur = ""; diff --git a/src/model/import/ImportEngine.hpp b/src/model/import/ImportEngine.hpp index a60f4b8..c02d6fd 100644 --- a/src/model/import/ImportEngine.hpp +++ b/src/model/import/ImportEngine.hpp @@ -41,9 +41,11 @@ public: ~ImportEngine(); // Get supported file extension. Example : - // "OFX files (*.ofx)|*.ofx" + // "OFX files (*.ofx)" virtual QString GetFileExt(); + virtual QString GetShortExt(); + // Handle the file virtual bool HandleFile(const QString& path, User* user, Database* db, KissCount* kiss)=0; diff --git a/src/model/import/OFXImportEngine.cpp b/src/model/import/OFXImportEngine.cpp index a4f027c..0851df0 100644 --- a/src/model/import/OFXImportEngine.cpp +++ b/src/model/import/OFXImportEngine.cpp @@ -136,8 +136,8 @@ OFXImportEngine::OFXImportEngine() ofx_set_transaction_cb(_ctx, transaction_cb, this); ofx_set_statement_cb(_ctx, account_balance_cb, this); - _shortExt = "ofx"; - _longExt = _("OFX files (*.ofx)|*.ofx"); + _shortExt = ".ofx"; + _longExt = _("OFX files (*.ofx)"); } OFXImportEngine::~OFXImportEngine() diff --git a/src/model/import/XMLImportEngine.cpp b/src/model/import/XMLImportEngine.cpp index d994c83..366f8b5 100644 --- a/src/model/import/XMLImportEngine.cpp +++ b/src/model/import/XMLImportEngine.cpp @@ -263,8 +263,8 @@ XMLImportEngine::XMLImportEngine() { KissCount::RegisterImportEngine(this); - _shortExt = "xml"; - _longExt = _("KissCount xml files (*.xml)|*.xml"); + _shortExt = ".xml"; + _longExt = _("KissCount xml files (*.xml)"); _sax.startElement = XmlStartElement ; } diff --git a/src/view/ExportPanel.cpp b/src/view/ExportPanel.cpp index 72dd016..51221de 100644 --- a/src/view/ExportPanel.cpp +++ b/src/view/ExportPanel.cpp @@ -111,7 +111,7 @@ void ExportPanel::OnButtonSearch() void ExportPanel::OnButtonExport() { - QString path; + QString path, filter; if (!_operations || !_operations->size()) { @@ -119,12 +119,12 @@ void ExportPanel::OnButtonExport() return; } - path = QFileDialog::getSaveFileName(0, _("Save as"), "", _kiss->GetExportEngineExtensions()); + path = QFileDialog::getSaveFileName(0, _("Save as"), "", _kiss->GetExportEngineExtensions(), &filter); if (path.size() == 0) return; - _exportEngine = _kiss->GetExportEngine(path); + _exportEngine = _kiss->GetExportEngine(path, filter); if (!_exportEngine) { diff --git a/src/view/grid/GridAccount.cpp b/src/view/grid/GridAccount.cpp index 8475fe4..239e0fb 100644 --- a/src/view/grid/GridAccount.cpp +++ b/src/view/grid/GridAccount.cpp @@ -867,6 +867,22 @@ void GridAccount::OnOperationModified(int row, int col) cur_op = (_displayedOperations)[row] ; + new_op.id = 0; + new_op.parent = 0; + new_op.day = 0; + new_op.month = 0; + new_op.year = 0; + new_op.amount = 0.0; + new_op.description = ""; + new_op.category = 0; + new_op.fix_cost = false; + new_op.account = 0; + new_op.checked = 0; + new_op.transfert = 0; + new_op.formula = ""; + new_op.meta = false; + new_op._virtual = false; + if (col == DEBIT) setItem(row, CREDIT, new QTableWidgetItem("")); else if (col == CREDIT)