From 390440d0fa49976115952827cb140883cb08e37e Mon Sep 17 00:00:00 2001 From: Debao Zhang Date: Thu, 21 Nov 2013 21:00:33 +0800 Subject: [PATCH] RichString: Using Format instead of Format * --- src/xlsx/xlsxformat.cpp | 19 +++- src/xlsx/xlsxformat.h | 4 + src/xlsx/xlsxrichstring.cpp | 23 ++--- src/xlsx/xlsxrichstring_p.h | 10 +- src/xlsx/xlsxsharedstrings.cpp | 98 +++++++++---------- src/xlsx/xlsxsharedstrings_p.h | 5 +- src/xlsx/xlsxworksheet.cpp | 2 +- tests/auto/richstring/tst_richstringtest.cpp | 12 +-- .../sharedstrings/tst_sharedstringstest.cpp | 27 +++-- 9 files changed, 103 insertions(+), 97 deletions(-) diff --git a/src/xlsx/xlsxformat.cpp b/src/xlsx/xlsxformat.cpp index 903b2db..652a3b2 100755 --- a/src/xlsx/xlsxformat.cpp +++ b/src/xlsx/xlsxformat.cpp @@ -50,7 +50,7 @@ FormatPrivate::FormatPrivate(const FormatPrivate &other) , xf_index(other.xf_index), xf_indexValid(other.xf_indexValid) , is_dxf_fomat(other.is_dxf_fomat), dxf_index(other.dxf_index), dxf_indexValid(other.dxf_indexValid) , theme(other.theme) - , property(property) + , property(other.property) { } @@ -375,6 +375,15 @@ QByteArray Format::fontKey() const return d->font_key; } +bool Format::hasFontData() const +{ + for (int i=FormatPrivate::P_Font_STARTID; iproperty.isEmpty(); +} + QByteArray Format::formatKey() const { if (d->dirty) { diff --git a/src/xlsx/xlsxformat.h b/src/xlsx/xlsxformat.h index 720584c..b621c16 100755 --- a/src/xlsx/xlsxformat.h +++ b/src/xlsx/xlsxformat.h @@ -213,6 +213,8 @@ public: bool hidden() const; void setHidden(bool hidden); + bool isValid() const; + bool operator == (const Format &format) const; bool operator != (const Format &format) const; @@ -232,6 +234,7 @@ private: friend class Worksheet; friend class WorksheetPrivate; friend class RichString; + friend class SharedStrings; friend class ::FormatTest; bool fontIndexValid() const; @@ -239,6 +242,7 @@ private: void setFontIndex(int index); QByteArray fontKey() const; + bool hasFontData() const; bool hasAlignmentData() const; bool borderIndexValid() const; diff --git a/src/xlsx/xlsxrichstring.cpp b/src/xlsx/xlsxrichstring.cpp index c13811c..dfff582 100644 --- a/src/xlsx/xlsxrichstring.cpp +++ b/src/xlsx/xlsxrichstring.cpp @@ -35,7 +35,7 @@ RichString::RichString() RichString::RichString(const QString text) :m_dirty(true) { - addFragment(text, 0); + addFragment(text, Format()); } bool RichString::isRichString() const @@ -65,7 +65,7 @@ int RichString::fragmentCount() const return m_fragmentTexts.size(); } -void RichString::addFragment(const QString &text, Format *format) +void RichString::addFragment(const QString &text, const Format &format) { m_fragmentTexts.append(text); m_fragmentFormats.append(format); @@ -80,25 +80,14 @@ QString RichString::fragmentText(int index) const return m_fragmentTexts[index]; } -Format *RichString::fragmentFormat(int index) const +Format RichString::fragmentFormat(int index) const { if (index < 0 || index >= fragmentCount()) - return 0; + return Format(); return m_fragmentFormats[index]; } -/*! - * \internal - */ -Format *RichString::createFormat() -{ - Format *format = new Format(); - m_createdFormats.append(QSharedPointer(format)); - - return format; -} - /*! * \internal */ @@ -116,8 +105,8 @@ QByteArray RichString::idKey() const bytes.append("@Text"); bytes.append(m_fragmentTexts[i].toUtf8()); bytes.append("@Format"); - if (m_fragmentFormats[i]) - bytes.append(m_fragmentFormats[i]->fontKey()); + if (m_fragmentFormats[i].hasFontData()) + bytes.append(m_fragmentFormats[i].fontKey()); } } rs->m_idKey = bytes; diff --git a/src/xlsx/xlsxrichstring_p.h b/src/xlsx/xlsxrichstring_p.h index b985a39..1b3fa42 100644 --- a/src/xlsx/xlsxrichstring_p.h +++ b/src/xlsx/xlsxrichstring_p.h @@ -46,11 +46,10 @@ public: QString toPlainString() const; int fragmentCount() const; - void addFragment(const QString &text, Format *format); + void addFragment(const QString &text, const Format &format); QString fragmentText(int index) const; - Format *fragmentFormat(int index) const; + Format fragmentFormat(int index) const; - Format *createFormat(); private: friend XLSX_AUTOTEST_EXPORT uint qHash(const RichString &rs, uint seed) Q_DECL_NOTHROW; friend XLSX_AUTOTEST_EXPORT bool operator==(const RichString &rs1, const RichString &rs2); @@ -60,10 +59,9 @@ private: QByteArray idKey() const; QStringList m_fragmentTexts; - QList m_fragmentFormats; + QList m_fragmentFormats; QByteArray m_idKey; bool m_dirty; - QList > m_createdFormats; }; @@ -77,6 +75,6 @@ XLSX_AUTOTEST_EXPORT bool operator!=(const QString &rs1, const RichString &rs2); QT_END_NAMESPACE_XLSX -Q_DECLARE_METATYPE(QXlsx::RichString); +Q_DECLARE_METATYPE(QXlsx::RichString) #endif // XLSXRICHSTRING_P_H diff --git a/src/xlsx/xlsxsharedstrings.cpp b/src/xlsx/xlsxsharedstrings.cpp index e44d212..b96fa93 100755 --- a/src/xlsx/xlsxsharedstrings.cpp +++ b/src/xlsx/xlsxsharedstrings.cpp @@ -125,23 +125,23 @@ QList SharedStrings::getSharedStrings() const return m_stringList; } -void SharedStrings::writeRichStringPart_rPr(XmlStreamWriter &writer, Format *format) const +void SharedStrings::writeRichStringPart_rPr(XmlStreamWriter &writer, const Format &format) const { - if (!format) + if (!format.hasFontData()) return; - if (format->fontBold()) + if (format.fontBold()) writer.writeEmptyElement(QStringLiteral("b")); - if (format->fontItalic()) + if (format.fontItalic()) writer.writeEmptyElement(QStringLiteral("i")); - if (format->fontStrikeOut()) + if (format.fontStrikeOut()) writer.writeEmptyElement(QStringLiteral("strike")); - if (format->fontOutline()) + if (format.fontOutline()) writer.writeEmptyElement(QStringLiteral("outline")); - if (format->boolProperty(FormatPrivate::P_Font_Shadow)) + if (format.boolProperty(FormatPrivate::P_Font_Shadow)) writer.writeEmptyElement(QStringLiteral("shadow")); - if (format->hasProperty(FormatPrivate::P_Font_Underline)) { - Format::FontUnderline u = format->fontUnderline(); + if (format.hasProperty(FormatPrivate::P_Font_Underline)) { + Format::FontUnderline u = format.fontUnderline(); if (u != Format::FontUnderlineNone) { writer.writeEmptyElement(QStringLiteral("u")); if (u== Format::FontUnderlineDouble) @@ -152,8 +152,8 @@ void SharedStrings::writeRichStringPart_rPr(XmlStreamWriter &writer, Format *for writer.writeAttribute(QStringLiteral("val"), QStringLiteral("doubleAccounting")); } } - if (format->hasProperty(FormatPrivate::P_Font_Script)) { - Format::FontScript s = format->fontScript(); + if (format.hasProperty(FormatPrivate::P_Font_Script)) { + Format::FontScript s = format.fontScript(); if (s != Format::FontScriptNormal) { writer.writeEmptyElement(QStringLiteral("vertAlign")); if (s == Format::FontScriptSuper) @@ -163,35 +163,35 @@ void SharedStrings::writeRichStringPart_rPr(XmlStreamWriter &writer, Format *for } } - if (format->hasProperty(FormatPrivate::P_Font_Size)) { + if (format.hasProperty(FormatPrivate::P_Font_Size)) { writer.writeEmptyElement(QStringLiteral("sz")); - writer.writeAttribute(QStringLiteral("val"), QString::number(format->fontSize())); + writer.writeAttribute(QStringLiteral("val"), QString::number(format.fontSize())); } - if (format->fontColor().isValid()) { + if (format.fontColor().isValid()) { writer.writeEmptyElement(QStringLiteral("color")); - QString color = format->fontColor().name(); + QString color = format.fontColor().name(); writer.writeAttribute(QStringLiteral("rgb"), QStringLiteral("FF")+color.mid(1));//remove # - } else if (format->hasProperty(FormatPrivate::P_Font_ThemeColor)) { + } else if (format.hasProperty(FormatPrivate::P_Font_ThemeColor)) { writer.writeEmptyElement(QStringLiteral("color")); - QStringList themes = format->stringProperty(FormatPrivate::P_Font_ThemeColor).split(QLatin1Char(':')); + QStringList themes = format.stringProperty(FormatPrivate::P_Font_ThemeColor).split(QLatin1Char(':')); writer.writeAttribute(QStringLiteral("theme"), themes[0]); if (!themes[1].isEmpty()) writer.writeAttribute(QStringLiteral("tint"), themes[1]); } - if (!format->fontName().isEmpty()) { + if (!format.fontName().isEmpty()) { writer.writeEmptyElement(QStringLiteral("rFont")); - writer.writeAttribute(QStringLiteral("val"), format->fontName()); + writer.writeAttribute(QStringLiteral("val"), format.fontName()); } - if (format->hasProperty(FormatPrivate::P_Font_Family)) { + if (format.hasProperty(FormatPrivate::P_Font_Family)) { writer.writeEmptyElement(QStringLiteral("family")); - writer.writeAttribute(QStringLiteral("val"), QString::number(format->intProperty(FormatPrivate::P_Font_Family))); + writer.writeAttribute(QStringLiteral("val"), QString::number(format.intProperty(FormatPrivate::P_Font_Family))); } - if (format->hasProperty(FormatPrivate::P_Font_Scheme)) { + if (format.hasProperty(FormatPrivate::P_Font_Scheme)) { writer.writeEmptyElement(QStringLiteral("scheme")); - writer.writeAttribute(QStringLiteral("val"), format->stringProperty(FormatPrivate::P_Font_Scheme)); + writer.writeAttribute(QStringLiteral("val"), format.stringProperty(FormatPrivate::P_Font_Scheme)); } } @@ -211,7 +211,7 @@ void SharedStrings::saveToXmlFile(QIODevice *device) const //Rich text string for (int i=0; isetFontName(attributes.value(QLatin1String("val")).toString()); + format.setFontName(attributes.value(QLatin1String("val")).toString()); } else if (reader.name() == QLatin1String("charset")) { - format->setProperty(FormatPrivate::P_Font_Charset, attributes.value(QLatin1String("val")).toString().toInt()); + format.setProperty(FormatPrivate::P_Font_Charset, attributes.value(QLatin1String("val")).toString().toInt()); } else if (reader.name() == QLatin1String("family")) { - format->setProperty(FormatPrivate::P_Font_Family, attributes.value(QLatin1String("val")).toString().toInt()); + format.setProperty(FormatPrivate::P_Font_Family, attributes.value(QLatin1String("val")).toString().toInt()); } else if (reader.name() == QLatin1String("b")) { - format->setFontBold(true); + format.setFontBold(true); } else if (reader.name() == QLatin1String("i")) { - format->setFontItalic(true); + format.setFontItalic(true); } else if (reader.name() == QLatin1String("strike")) { - format->setFontStrikeOut(true); + format.setFontStrikeOut(true); } else if (reader.name() == QLatin1String("outline")) { - format->setFontOutline(true); + format.setFontOutline(true); } else if (reader.name() == QLatin1String("shadow")) { - format->setProperty(FormatPrivate::P_Font_Shadow, true); + format.setProperty(FormatPrivate::P_Font_Shadow, true); } else if (reader.name() == QLatin1String("condense")) { - format->setProperty(FormatPrivate::P_Font_Condense, attributes.value(QLatin1String("val")).toString().toInt()); + format.setProperty(FormatPrivate::P_Font_Condense, attributes.value(QLatin1String("val")).toString().toInt()); } else if (reader.name() == QLatin1String("extend")) { - format->setProperty(FormatPrivate::P_Font_Extend, attributes.value(QLatin1String("val")).toString().toInt()); + format.setProperty(FormatPrivate::P_Font_Extend, attributes.value(QLatin1String("val")).toString().toInt()); } else if (reader.name() == QLatin1String("color")) { if (attributes.hasAttribute(QLatin1String("rgb"))) { QString colorString = attributes.value(QLatin1String("rgb")).toString(); - format->setFontColor(fromARGBString(colorString)); + format.setFontColor(fromARGBString(colorString)); } else if (attributes.hasAttribute(QLatin1String("indexed"))) { // color = getColorByIndex(attributes.value(QLatin1String("indexed")).toString().toInt()); } else if (attributes.hasAttribute(QLatin1String("theme"))) { QString theme = attributes.value(QLatin1String("theme")).toString(); QString tint = attributes.value(QLatin1String("tint")).toString(); - format->setProperty(FormatPrivate::P_Font_ThemeColor, QString(theme + QLatin1Char(':') + tint)); + format.setProperty(FormatPrivate::P_Font_ThemeColor, QString(theme + QLatin1Char(':') + tint)); } } else if (reader.name() == QLatin1String("sz")) { - format->setFontSize(attributes.value(QLatin1String("val")).toString().toInt()); + format.setFontSize(attributes.value(QLatin1String("val")).toString().toInt()); } else if (reader.name() == QLatin1String("u")) { QString value = attributes.value(QLatin1String("val")).toString(); if (value == QLatin1String("double")) - format->setFontUnderline(Format::FontUnderlineDouble); + format.setFontUnderline(Format::FontUnderlineDouble); else if (value == QLatin1String("doubleAccounting")) - format->setFontUnderline(Format::FontUnderlineDoubleAccounting); + format.setFontUnderline(Format::FontUnderlineDoubleAccounting); else if (value == QLatin1String("singleAccounting")) - format->setFontUnderline(Format::FontUnderlineSingleAccounting); + format.setFontUnderline(Format::FontUnderlineSingleAccounting); else - format->setFontUnderline(Format::FontUnderlineSingle); + format.setFontUnderline(Format::FontUnderlineSingle); } else if (reader.name() == QLatin1String("vertAlign")) { QString value = attributes.value(QLatin1String("val")).toString(); if (value == QLatin1String("superscript")) - format->setFontScript(Format::FontScriptSuper); + format.setFontScript(Format::FontScriptSuper); else if (value == QLatin1String("subscript")) - format->setFontScript(Format::FontScriptSub); + format.setFontScript(Format::FontScriptSub); } else if (reader.name() == QLatin1String("scheme")) { - format->setProperty(FormatPrivate::P_Font_Scheme, attributes.value(QLatin1String("val")).toString()); + format.setProperty(FormatPrivate::P_Font_Scheme, attributes.value(QLatin1String("val")).toString()); } } } diff --git a/src/xlsx/xlsxsharedstrings_p.h b/src/xlsx/xlsxsharedstrings_p.h index dec9031..af45ea6 100755 --- a/src/xlsx/xlsxsharedstrings_p.h +++ b/src/xlsx/xlsxsharedstrings_p.h @@ -37,7 +37,6 @@ namespace QXlsx { class XmlStreamReader; class XmlStreamWriter; -class RichString; class XlsxSharedStringInfo { @@ -77,8 +76,8 @@ private: void readString(XmlStreamReader &reader); // void readRichStringPart(XmlStreamReader &reader, RichString &rich); // void readPlainStringPart(XmlStreamReader &reader, RichString &rich); // - Format *readRichStringPart_rPr(XmlStreamReader &reader, RichString &richString); - void writeRichStringPart_rPr(XmlStreamWriter &writer, Format *format) const; + Format readRichStringPart_rPr(XmlStreamReader &reader); + void writeRichStringPart_rPr(XmlStreamWriter &writer, const Format &format) const; QHash m_stringTable; //for fast lookup QList m_stringList; diff --git a/src/xlsx/xlsxworksheet.cpp b/src/xlsx/xlsxworksheet.cpp index cf74244..9cd4c72 100755 --- a/src/xlsx/xlsxworksheet.cpp +++ b/src/xlsx/xlsxworksheet.cpp @@ -1175,7 +1175,7 @@ void WorksheetPrivate::writeCellData(XmlStreamWriter &writer, int row, int col, RichString string = cell->d_ptr->richString; for (int i=0; igetSharedString(0); QVERIFY(rs.fragmentText(0) == "e=mc"); QVERIFY(rs.fragmentText(1) == "2"); - QVERIFY(rs.fragmentFormat(0) == 0); - QXlsx::Format *format = rs.fragmentFormat(1); - QCOMPARE(format->fontName(), QString("MyFontName")); -// QCOMPARE(format->fontFamily(), 3); - QCOMPARE(format->fontScript(), QXlsx::Format::FontScriptSuper); - QCOMPARE(format->fontSize(), 11); + QVERIFY(rs.fragmentFormat(0) == QXlsx::Format()); + QXlsx::Format format = rs.fragmentFormat(1); + QCOMPARE(format.fontName(), QString("MyFontName")); + QCOMPARE(format.fontScript(), QXlsx::Format::FontScriptSuper); + QCOMPARE(format.fontSize(), 11); } QTEST_APPLESS_MAIN(SharedStringsTest)