diff options
-rw-r--r-- | editeng/inc/editeng/editobj.hxx | 1 | ||||
-rw-r--r-- | editeng/source/editeng/editobj.cxx | 21 | ||||
-rw-r--r-- | editeng/source/editeng/editobj2.hxx | 1 | ||||
-rw-r--r-- | sc/inc/column.hxx | 1 | ||||
-rw-r--r-- | sc/inc/document.hxx | 2 | ||||
-rw-r--r-- | sc/inc/table.hxx | 1 | ||||
-rw-r--r-- | sc/qa/unit/data/ods/rich-text-cells.ods | bin | 0 -> 11904 bytes | |||
-rw-r--r-- | sc/qa/unit/subsequent_filters-test.cxx | 183 | ||||
-rw-r--r-- | sc/source/core/data/column3.cxx | 13 | ||||
-rw-r--r-- | sc/source/core/data/document.cxx | 8 | ||||
-rw-r--r-- | sc/source/core/data/table2.cxx | 7 |
11 files changed, 238 insertions, 0 deletions
diff --git a/editeng/inc/editeng/editobj.hxx b/editeng/inc/editeng/editobj.hxx index 2730b46b166f..8e97b637d838 100644 --- a/editeng/inc/editeng/editobj.hxx +++ b/editeng/inc/editeng/editobj.hxx @@ -102,6 +102,7 @@ public: virtual sal_Bool IsFieldObject() const; virtual const SvxFieldItem* GetField() const; virtual sal_Bool HasField( TypeId aType = NULL ) const; + virtual bool HasField( sal_Int32 nType ) const = 0; virtual SfxItemSet GetParaAttribs(size_t nPara) const; virtual void SetParaAttribs(size_t nPara, const SfxItemSet& rAttribs); diff --git a/editeng/source/editeng/editobj.cxx b/editeng/source/editeng/editobj.cxx index 275aa77c5a47..56effb9686d7 100644 --- a/editeng/source/editeng/editobj.cxx +++ b/editeng/source/editeng/editobj.cxx @@ -878,6 +878,27 @@ sal_Bool BinTextObject::HasField( TypeId aType ) const return false; } +bool BinTextObject::HasField( sal_Int32 nType ) const +{ + size_t nParagraphs = aContents.size(); + for (size_t nPara = 0; nPara < nParagraphs; ++nPara) + { + const ContentInfo& rC = aContents[nPara]; + size_t nAttrs = rC.aAttribs.size(); + for (size_t nAttr = 0; nAttr < nAttrs; ++nAttr) + { + const XEditAttribute& rAttr = rC.aAttribs[nAttr]; + if (rAttr.GetItem()->Which() != EE_FEATURE_FIELD) + continue; + + const SvxFieldData* pFldData = static_cast<const SvxFieldItem*>(rAttr.GetItem())->GetField(); + if (pFldData && pFldData->GetClassId() == nType) + return true; + } + } + return false; +} + SfxItemSet BinTextObject::GetParaAttribs(size_t nPara) const { const ContentInfo& rC = aContents[nPara]; diff --git a/editeng/source/editeng/editobj2.hxx b/editeng/source/editeng/editobj2.hxx index 4b89ade1a510..52821c0ef822 100644 --- a/editeng/source/editeng/editobj2.hxx +++ b/editeng/source/editeng/editobj2.hxx @@ -233,6 +233,7 @@ public: virtual sal_Bool IsFieldObject() const; virtual const SvxFieldItem* GetField() const; virtual sal_Bool HasField( TypeId Type = NULL ) const; + virtual bool HasField( sal_Int32 nType ) const; virtual SfxItemSet GetParaAttribs(size_t nPara) const; virtual void SetParaAttribs(size_t nPara, const SfxItemSet& rAttribs); diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx index 7abce092966a..96df4d99403f 100644 --- a/sc/inc/column.hxx +++ b/sc/inc/column.hxx @@ -228,6 +228,7 @@ public: void GetString( SCROW nRow, rtl::OUString& rString ) const; void GetInputString( SCROW nRow, rtl::OUString& rString ) const; double GetValue( SCROW nRow ) const; + const EditTextObject* GetEditText( SCROW nRow ) const; void GetFormula( SCROW nRow, rtl::OUString& rFormula ) const; CellType GetCellType( SCROW nRow ) const; SCSIZE GetCellCount() const; diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index 5b5a472d95a7..a72f7596cd2d 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -144,6 +144,7 @@ class ScProgress; class SvtListener; class ScNotes; class ScEditDataArray; +class EditTextObject; namespace com { namespace sun { namespace star { namespace lang { @@ -772,6 +773,7 @@ public: SC_DLLPUBLIC double GetValue( const ScAddress& ); SC_DLLPUBLIC double GetValue( const SCCOL nCol, SCROW nRow, SCTAB nTab) { ScAddress aAdr(nCol, nRow, nTab); return GetValue(aAdr);} SC_DLLPUBLIC void GetValue( SCCOL nCol, SCROW nRow, SCTAB nTab, double& rValue ); + SC_DLLPUBLIC const EditTextObject* GetEditText( const ScAddress& rPos ) const; SC_DLLPUBLIC double RoundValueAsShown( double fVal, sal_uLong nFormat ); SC_DLLPUBLIC void GetNumberFormat( SCCOL nCol, SCROW nRow, SCTAB nTab, sal_uInt32& rFormat ) const; diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx index 512dee2b87cc..fa03a7f1e292 100644 --- a/sc/inc/table.hxx +++ b/sc/inc/table.hxx @@ -310,6 +310,7 @@ public: 0.0; } double GetValue( SCCOL nCol, SCROW nRow ) const; + const EditTextObject* GetEditText( SCCOL nCol, SCROW nRow ) const; void GetFormula( SCCOL nCol, SCROW nRow, rtl::OUString& rFormula ); CellType GetCellType( const ScAddress& rPos ) const diff --git a/sc/qa/unit/data/ods/rich-text-cells.ods b/sc/qa/unit/data/ods/rich-text-cells.ods Binary files differnew file mode 100644 index 000000000000..d60747a05c53 --- /dev/null +++ b/sc/qa/unit/data/ods/rich-text-cells.ods diff --git a/sc/qa/unit/subsequent_filters-test.cxx b/sc/qa/unit/subsequent_filters-test.cxx index 04a7ffeee618..f56bd6676e47 100644 --- a/sc/qa/unit/subsequent_filters-test.cxx +++ b/sc/qa/unit/subsequent_filters-test.cxx @@ -40,6 +40,10 @@ #include <svl/stritem.hxx> #include "svx/svdpage.hxx" +#include "editeng/wghtitem.hxx" +#include "editeng/postitem.hxx" +#include "editeng/udlnitem.hxx" +#include "editeng/editobj.hxx" #include <editeng/brshitem.hxx> #include <editeng/justifyitem.hxx> #include <editeng/borderline.hxx> @@ -59,6 +63,7 @@ #include <com/sun/star/sheet/GeneralFunction.hpp> #include <com/sun/star/container/XIndexAccess.hpp> #include <com/sun/star/frame/XModel.hpp> +#include <com/sun/star/text/textfield/Type.hpp> #define CALC_DEBUG_OUTPUT 0 #define TEST_BUG_FILES 0 @@ -171,6 +176,7 @@ public: void testFormulaDependency(); void testRowHeightODS(); + void testRichTextContentODS(); CPPUNIT_TEST_SUITE(ScFiltersTest); CPPUNIT_TEST(testRangeNameXLS); @@ -215,6 +221,7 @@ public: CPPUNIT_TEST(testPivotTableBasicODS); CPPUNIT_TEST(testRowHeightODS); CPPUNIT_TEST(testFormulaDependency); + CPPUNIT_TEST(testRichTextContentODS); //disable testPassword on MacOSX due to problems with libsqlite3 //also crashes on DragonFly due to problems with nss/nspr headers @@ -1516,6 +1523,182 @@ void ScFiltersTest::testRowHeightODS() xDocSh->DoClose(); } +void ScFiltersTest::testRichTextContentODS() +{ + ScDocShellRef xDocSh = loadDoc("rich-text-cells.", ODS); + CPPUNIT_ASSERT_MESSAGE("Failed to load rich-text-cells.ods", xDocSh.Is()); + ScDocument* pDoc = xDocSh->GetDocument(); + + OUString aTabName; + CPPUNIT_ASSERT_MESSAGE("Failed to get the name of the first sheet.", pDoc->GetName(0, aTabName)); + + // All tested cells are in the first column. + ScAddress aPos(0, 0, 0); + + // Normal simple string with no formatting. + aPos.IncRow(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, pDoc->GetCellType(aPos)); + CPPUNIT_ASSERT_EQUAL(OUString("Normal"), pDoc->GetString(aPos.Col(), aPos.Row(), aPos.Tab())); + + // Normal string with bold applied to the whole cell. + { + aPos.IncRow(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, pDoc->GetCellType(aPos)); + CPPUNIT_ASSERT_EQUAL(OUString("All bold"), pDoc->GetString(aPos.Col(), aPos.Row(), aPos.Tab())); + const ScPatternAttr* pAttr = pDoc->GetPattern(aPos.Col(), aPos.Row(), aPos.Tab()); + CPPUNIT_ASSERT_MESSAGE("Failed to get cell attribute.", pAttr); + const SvxWeightItem& rWeightItem = + static_cast<const SvxWeightItem&>(pAttr->GetItem(ATTR_FONT_WEIGHT)); + CPPUNIT_ASSERT_EQUAL(WEIGHT_BOLD, rWeightItem.GetWeight()); + } + + // This cell has an unformatted but multi-line content. Multi-line text is + // stored in edit cell even if it has no formatting applied. + aPos.IncRow(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_EDIT, pDoc->GetCellType(aPos)); + const EditTextObject* pEditText = pDoc->GetEditText(aPos); + CPPUNIT_ASSERT_MESSAGE("Failed to retrieve edit text object.", pEditText); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), pEditText->GetParagraphCount()); + OUString aParaText = pEditText->GetText(0); + CPPUNIT_ASSERT_EQUAL(OUString("one"), aParaText); + aParaText = pEditText->GetText(1); + CPPUNIT_ASSERT_EQUAL(OUString("two"), aParaText); + aParaText = pEditText->GetText(2); + CPPUNIT_ASSERT_EQUAL(OUString("three"), aParaText); + + // Cell with sheet name field item. + aPos.IncRow(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_EDIT, pDoc->GetCellType(aPos)); + pEditText = pDoc->GetEditText(aPos); + CPPUNIT_ASSERT_MESSAGE("Failed to retrieve edit text object.", pEditText); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pEditText->GetParagraphCount()); + aParaText = pEditText->GetText(0); + CPPUNIT_ASSERT_MESSAGE("Unexpected text.", aParaText.indexOf("Sheet name is ") == 0); + CPPUNIT_ASSERT_MESSAGE("Sheet name field item not found.", pEditText->HasField(text::textfield::Type::TABLE)); + + // Cell with URL field item. + aPos.IncRow(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_EDIT, pDoc->GetCellType(aPos)); + pEditText = pDoc->GetEditText(aPos); + CPPUNIT_ASSERT_MESSAGE("Failed to retrieve edit text object.", pEditText); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pEditText->GetParagraphCount()); + aParaText = pEditText->GetText(0); + CPPUNIT_ASSERT_MESSAGE("Unexpected text.", aParaText.indexOf("URL: ") == 0); + CPPUNIT_ASSERT_MESSAGE("URL field item not found.", pEditText->HasField(text::textfield::Type::URL)); + + // Cell with Date field item. + aPos.IncRow(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_EDIT, pDoc->GetCellType(aPos)); + pEditText = pDoc->GetEditText(aPos); + CPPUNIT_ASSERT_MESSAGE("Failed to retrieve edit text object.", pEditText); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pEditText->GetParagraphCount()); + aParaText = pEditText->GetText(0); + CPPUNIT_ASSERT_MESSAGE("Unexpected text.", aParaText.indexOf("Date: ") == 0); + CPPUNIT_ASSERT_MESSAGE("Date field item not found.", pEditText->HasField(text::textfield::Type::DATE)); + + // Cell with DocInfo title field item. + aPos.IncRow(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_EDIT, pDoc->GetCellType(aPos)); + pEditText = pDoc->GetEditText(aPos); + CPPUNIT_ASSERT_MESSAGE("Failed to retrieve edit text object.", pEditText); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pEditText->GetParagraphCount()); + aParaText = pEditText->GetText(0); + CPPUNIT_ASSERT_MESSAGE("Unexpected text.", aParaText.indexOf("Title: ") == 0); + CPPUNIT_ASSERT_MESSAGE("DocInfo title field item not found.", pEditText->HasField(text::textfield::Type::DOCINFO_TITLE)); + + // Cell with sentence with both bold and italic sequences. + aPos.IncRow(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_EDIT, pDoc->GetCellType(aPos)); + pEditText = pDoc->GetEditText(aPos); + CPPUNIT_ASSERT_MESSAGE("Failed to retrieve edit text object.", pEditText); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pEditText->GetParagraphCount()); + aParaText = pEditText->GetText(0); + CPPUNIT_ASSERT_EQUAL(OUString("Sentence with bold and italic."), aParaText); + std::vector<EECharAttrib> aAttribs; + pEditText->GetCharAttribs(0, aAttribs); + std::vector<EECharAttrib>::const_iterator it = aAttribs.begin(), itEnd = aAttribs.end(); + { + bool bHasBold = false, bHasItalic = false; + for (; it != itEnd; ++it) + { + OUString aSeg = aParaText.copy(it->nStart, it->nEnd - it->nStart); + const SfxPoolItem* pAttr = it->pAttr; + if (aSeg == "bold" && pAttr->Which() == EE_CHAR_WEIGHT && !bHasBold) + { + const SvxWeightItem& rItem = static_cast<const SvxWeightItem&>(*pAttr); + bHasBold = (rItem.GetWeight() == WEIGHT_BOLD); + } + else if (aSeg == "italic" && pAttr->Which() == EE_CHAR_ITALIC && !bHasItalic) + { + const SvxPostureItem& rItem = static_cast<const SvxPostureItem&>(*pAttr); + bHasItalic = (rItem.GetPosture() == ITALIC_NORMAL); + + } + } + CPPUNIT_ASSERT_MESSAGE("This sentence is expected to have both bold and italic sequences.", bHasBold && bHasItalic); + } + + // Cell with multi-line content with formatting applied. + aPos.IncRow(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_EDIT, pDoc->GetCellType(aPos)); + pEditText = pDoc->GetEditText(aPos); + CPPUNIT_ASSERT_MESSAGE("Failed to retrieve edit text object.", pEditText); + CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), pEditText->GetParagraphCount()); + aParaText = pEditText->GetText(0); + CPPUNIT_ASSERT_EQUAL(OUString("bold"), aParaText); + aParaText = pEditText->GetText(1); + CPPUNIT_ASSERT_EQUAL(OUString("italic"), aParaText); + aParaText = pEditText->GetText(2); + CPPUNIT_ASSERT_EQUAL(OUString("underlined"), aParaText); + + // first line is bold. + pEditText->GetCharAttribs(0, aAttribs); + bool bHasBold = false; + for (it = aAttribs.begin(), itEnd = aAttribs.end(); it != itEnd; ++it) + { + if (it->pAttr->Which() == EE_CHAR_WEIGHT) + { + const SvxWeightItem& rItem = static_cast<const SvxWeightItem&>(*it->pAttr); + bHasBold = (rItem.GetWeight() == WEIGHT_BOLD); + if (bHasBold) + break; + } + } + CPPUNIT_ASSERT_MESSAGE("First line should be bold.", bHasBold); + + // second line is italic. + pEditText->GetCharAttribs(1, aAttribs); + bool bHasItalic = false; + for (it = aAttribs.begin(), itEnd = aAttribs.end(); it != itEnd; ++it) + { + if (it->pAttr->Which() == EE_CHAR_ITALIC) + { + const SvxPostureItem& rItem = static_cast<const SvxPostureItem&>(*it->pAttr); + bHasItalic = (rItem.GetPosture() == ITALIC_NORMAL); + if (bHasItalic) + break; + } + } + CPPUNIT_ASSERT_MESSAGE("Second line should be italic.", bHasItalic); + + // third line is underlined. + pEditText->GetCharAttribs(2, aAttribs); + bool bHasUnderline = false; + for (it = aAttribs.begin(), itEnd = aAttribs.end(); it != itEnd; ++it) + { + if (it->pAttr->Which() == EE_CHAR_UNDERLINE) + { + const SvxUnderlineItem& rItem = static_cast<const SvxUnderlineItem&>(*it->pAttr); + bHasUnderline = (rItem.GetLineStyle() == UNDERLINE_SINGLE); + if (bHasUnderline) + break; + } + } + CPPUNIT_ASSERT_MESSAGE("Second line should be underlined.", bHasUnderline); + + xDocSh->DoClose(); +} + namespace { void testColorScaleFormat_Impl(const rtl::OUString& rFilePath, const ScConditionalFormat* pFormat) diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx index ad8444d5741d..1e0ce3c51653 100644 --- a/sc/source/core/data/column3.cxx +++ b/sc/source/core/data/column3.cxx @@ -1730,6 +1730,19 @@ double ScColumn::GetValue( SCROW nRow ) const return 0.0; } +const EditTextObject* ScColumn::GetEditText( SCROW nRow ) const +{ + SCSIZE nIndex; + if (!Search(nRow, nIndex)) + return NULL; + + const ScBaseCell* pCell = maItems[nIndex].pCell; + if (pCell->GetCellType() != CELLTYPE_EDIT) + return NULL; + + const ScEditCell* pEditCell = static_cast<const ScEditCell*>(pCell); + return pEditCell->GetData(); +} void ScColumn::GetFormula( SCROW nRow, rtl::OUString& rFormula ) const { diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx index 9d8a8c387db0..78ae82355230 100644 --- a/sc/source/core/data/document.cxx +++ b/sc/source/core/data/document.cxx @@ -3015,6 +3015,14 @@ void ScDocument::GetValue( SCCOL nCol, SCROW nRow, SCTAB nTab, double& rValue ) rValue = 0.0; } +const EditTextObject* ScDocument::GetEditText( const ScAddress& rPos ) const +{ + SCTAB nTab = rPos.Tab(); + if (!ValidTab(nTab) || nTab >= static_cast<SCTAB>(maTabs.size()) || !maTabs[nTab]) + return NULL; + + return maTabs[nTab]->GetEditText(rPos.Col(), rPos.Row()); +} double ScDocument::GetValue( const ScAddress& rPos ) { diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx index 073f7263f60e..6087841ce86d 100644 --- a/sc/source/core/data/table2.cxx +++ b/sc/source/core/data/table2.cxx @@ -1297,6 +1297,13 @@ double ScTable::GetValue( SCCOL nCol, SCROW nRow ) const return 0.0; } +const EditTextObject* ScTable::GetEditText( SCCOL nCol, SCROW nRow ) const +{ + if (!ValidColRow(nCol, nRow)) + return NULL; + + return aCol[nCol].GetEditText(nRow); +} void ScTable::GetFormula( SCCOL nCol, SCROW nRow, rtl::OUString& rFormula ) { |