diff --git a/src/common/KReportData.h b/src/common/KReportData.h --- a/src/common/KReportData.h +++ b/src/common/KReportData.h @@ -29,16 +29,27 @@ { public: + KReportData(); virtual ~KReportData(); //! Describes sorting for single field /*! By default the order is ascending. */ class KREPORT_EXPORT SortedField { public: SortedField(); - QString field; - Qt::SortOrder order; + ~SortedField(); + SortedField& operator=(const SortedField &other); + void setField(const QString &field); + void setOrder(Qt::SortOrder order); + QString field() const; + QString field(); + Qt::SortOrder order() const; + Qt::SortOrder order(); + + private: + class Private; + Private * const d; }; //! Open the dataset @@ -117,6 +128,11 @@ //! @a source is implementation-specific identifier. //! Owner of the returned pointer is the caller. virtual KReportData* create(const QString &source) const Q_REQUIRED_RESULT; + +private: + Q_DISABLE_COPY(KReportData) + class Private; + Private * const d; }; #endif diff --git a/src/common/KReportData.cpp b/src/common/KReportData.cpp --- a/src/common/KReportData.cpp +++ b/src/common/KReportData.cpp @@ -18,13 +18,81 @@ #include "KReportData.h" #include -KReportData::~KReportData() +class KReportData::SortedField::Private { -} + +public: + QString field; + Qt::SortOrder order = Qt::AscendingOrder; +}; + +class KReportData::Private +{ +public: + bool dummy = true; +}; + +//==========KReportData::SortedField========== KReportData::SortedField::SortedField() - : order(Qt::AscendingOrder) + : d(new Private()) +{ +} + +KReportData::SortedField::~SortedField() +{ + delete d; +} + +KReportData::SortedField & KReportData::SortedField::operator=(const KReportData::SortedField& other) +{ + if (this != &other) { + setField(other.field()); + setOrder(other.order()); + } + return *this; +} + +QString KReportData::SortedField::field() +{ + return d->field; +} + +QString KReportData::SortedField::field() const +{ + return d->field; +} + +Qt::SortOrder KReportData::SortedField::order() +{ + return d->order; +} + +Qt::SortOrder KReportData::SortedField::order() const +{ + return d->order; +} + +void KReportData::SortedField::setField(const QString& field) +{ + d->field = field; +} + +void KReportData::SortedField::setOrder(Qt::SortOrder order) +{ + d->order = order; +} + + +//==========KReportData========== + +KReportData::KReportData() : d(new Private()) +{ +} + +KReportData::~KReportData() { + delete d; } QStringList KReportData::fieldKeys() const diff --git a/src/common/KReportDesign.h b/src/common/KReportDesign.h --- a/src/common/KReportDesign.h +++ b/src/common/KReportDesign.h @@ -39,21 +39,34 @@ /*! For empty status objects isError() returns false. */ KReportDesignReadingStatus(); + ~KReportDesignReadingStatus(); + KReportDesignReadingStatus(const KReportDesignReadingStatus &other); + KReportDesignReadingStatus& operator=(const KReportDesignReadingStatus &other); + //! @return true if the status is error. - //! Equivalent of lineNumber >= 0. + //! Equivalent of errorLineNumber() >= 0 && errorColumnNumber() >= 0. bool isError() const; - + //! Error message suitable for displaying to the user, translated. - QString errorMessage; - - //! Detailed error message, partially translated. - QString errorDetails; - + QString errorMessage() const; + + //! Detailed error message, partially translated. + QString errorDetails() const; + //! Line number (counting from 0) in which the error occured. -1 if there is no error. - int lineNumber; - + int errorLineNumber() const; + //! Column number (counting from 0) in which the error occured. -1 if there is no error. - int columnNumber; + int errorColumnNumber() const; + + void setErrorMessage(const QString& msg); + void setErrorDetails(const QString& details); + void setErrorLineNumber(int line); + void setErrorColumnNumber(int column); + +private: + class Private; + Private * const d; }; //! Sends information about the reading status @a status to debug output @a dbg. diff --git a/src/common/KReportDesign.cpp b/src/common/KReportDesign.cpp --- a/src/common/KReportDesign.cpp +++ b/src/common/KReportDesign.cpp @@ -30,24 +30,96 @@ #include #include -KReportDesignReadingStatus::KReportDesignReadingStatus() - : lineNumber(-1), columnNumber(-1) +class Q_DECL_HIDDEN KReportDesignReadingStatus::Private { +public: + QString errorMessage; + QString errorDetails; + int errorLineNumber = -1; + int errorColumnNumber = -1; +}; + +KReportDesignReadingStatus::KReportDesignReadingStatus() : d(new Private) +{ +} + +KReportDesignReadingStatus::~KReportDesignReadingStatus() +{ + delete d; +} + +KReportDesignReadingStatus::KReportDesignReadingStatus(const KReportDesignReadingStatus& other) : d(new Private) +{ + *this = other; +} + +KReportDesignReadingStatus& KReportDesignReadingStatus::operator=(const KReportDesignReadingStatus &other) +{ + if (this != &other) { + setErrorMessage(other.errorMessage()); + setErrorDetails(other.errorDetails()); + setErrorLineNumber(other.errorLineNumber()); + setErrorColumnNumber(other.errorColumnNumber()); + } + + return *this; } + bool KReportDesignReadingStatus::isError() const { - return lineNumber >= 0; + return d->errorLineNumber >= 0 && d->errorColumnNumber >= 0; +} + +int KReportDesignReadingStatus::errorColumnNumber() const +{ + return d->errorColumnNumber; +} + +QString KReportDesignReadingStatus::errorDetails() const +{ + return d->errorDetails; +} + +QString KReportDesignReadingStatus::errorMessage() const +{ + return d->errorMessage; +} + + +int KReportDesignReadingStatus::errorLineNumber() const +{ + return d->errorLineNumber; +} + +void KReportDesignReadingStatus::setErrorColumnNumber(int column) +{ + d->errorColumnNumber = column; +} + +void KReportDesignReadingStatus::setErrorDetails(const QString& details) +{ + d->errorDetails = details; +} + +void KReportDesignReadingStatus::setErrorLineNumber(int line) +{ + d->errorLineNumber = line; +} + +void KReportDesignReadingStatus::setErrorMessage(const QString& msg) +{ + d->errorMessage = msg; } QDebug operator<<(QDebug dbg, const KReportDesignReadingStatus& status) { if (status.isError()) { dbg.nospace() << qPrintable( QString::fromLatin1("KReportDesignReadingStatus: errorMessage=\"%1\" " "errorDetails=\"%2\" line=%3 column=%4") - .arg(status.errorMessage).arg(status.errorDetails) - .arg(status.lineNumber).arg(status.columnNumber)); + .arg(status.errorMessage()).arg(status.errorDetails()) + .arg(status.errorLineNumber()).arg(status.errorColumnNumber())); } else { dbg.nospace() << "KReportDesignReadingStatus: OK"; } @@ -69,15 +141,25 @@ bool KReportDesign::setContent(const QString &text, KReportDesignReadingStatus *status) { QDomDocument doc; - if (!doc.setContent(text, status ? &status->errorDetails : 0, status ? &status->lineNumber : 0, - status ? &status->columnNumber : 0)) + QString errorDetails; + int errorLine; + int errorColumn; + + if (!doc.setContent(text, &errorDetails, &errorLine, &errorColumn)) { if (status) { - status->errorMessage = tr("Could not parse XML document."); + status->setErrorMessage(tr("Could not parse XML document.")); + status->setErrorDetails(errorDetails); + status->setErrorLineNumber(errorLine); + status->setErrorColumnNumber(errorColumn); } return false; } - return d->processDocument(doc, status); + bool ret = d->processDocument(doc, status); + if (!ret && status) { + status->setErrorMessage(tr("Error in XML document.")); + } + return ret; } QString KReportDesign::toString(int indent) const @@ -115,7 +197,7 @@ KReportPluginInterface* plugin = d->findPlugin(typeName, el, &status); if (!plugin) { if (errorMessage) { - *errorMessage = status.errorMessage; + *errorMessage = status.errorMessage(); } return KReportElement(); } diff --git a/src/common/KReportDesign_p.cpp b/src/common/KReportDesign_p.cpp --- a/src/common/KReportDesign_p.cpp +++ b/src/common/KReportDesign_p.cpp @@ -110,9 +110,9 @@ const QDomNode &node) { if (status) { - status->errorDetails = details; - status->lineNumber = node.lineNumber() == -1 ? 0 /* mark error */ : node.lineNumber(); - status->columnNumber = node.columnNumber() == -1 ? 0 /* mark error */ : node.columnNumber(); + status->setErrorDetails(details); + status->setErrorLineNumber(node.lineNumber() == -1 ? 0 /* mark error */ : node.lineNumber()); + status->setErrorColumnNumber(node.columnNumber() == -1 ? 0 /* mark error */ : node.columnNumber()); } } @@ -452,10 +452,7 @@ } if (status) { - status->lineNumber = -1; - status->columnNumber = -1; - status->errorMessage.clear(); - status->errorDetails.clear(); + *status = KReportDesignReadingStatus(); } return true; } diff --git a/src/common/KReportDetailSectionData.cpp b/src/common/KReportDetailSectionData.cpp --- a/src/common/KReportDetailSectionData.cpp +++ b/src/common/KReportDetailSectionData.cpp @@ -91,8 +91,8 @@ } m_groupList.append(dgsd); KReportData::SortedField s; - s.field = dgsd->m_column; - s.order = dgsd->m_sort; + s.setField(dgsd->m_column); + s.setOrder(dgsd->m_sort); m_sortedFields.append(s); } else if (elemThis.tagName() == QLatin1String("report:section") && elemThis.attribute(QLatin1String("report:section-type")) == QLatin1String("detail")) { diff --git a/src/wrtembed/KReportDesignerItemBase.h b/src/wrtembed/KReportDesignerItemBase.h --- a/src/wrtembed/KReportDesignerItemBase.h +++ b/src/wrtembed/KReportDesignerItemBase.h @@ -79,6 +79,7 @@ QString renderText() const; private: + Q_DISABLE_COPY(KReportDesignerItemBase) class Private; Private * const d; };