sc/inc/column.hxx | 1 sc/inc/dociter.hxx | 18 ++++++++++ sc/inc/document.hxx | 4 ++ sc/inc/table.hxx | 1 sc/qa/unit/ucalc.cxx | 12 ++++++ sc/source/core/data/dociter.cxx | 52 +++++++++++++++++++++++++++++ sc/source/core/data/document.cxx | 15 ++++++++ sc/source/ui/docshell/tpstat.cxx | 2 + sc/source/ui/inc/tpstat.hxx | 1 sc/source/ui/view/cellsh2.cxx | 18 +++++++++- sc/uiconfig/scalc/ui/statisticsinfopage.ui | 32 +++++++++++++++++ 11 files changed, 155 insertions(+), 1 deletion(-)
New commits: commit 51262ef0d11d9aef246001d8a9b1c1d8753023bd Author: Benjamin Ni <benjaminn...@hotmail.com> Date: Wed May 27 09:00:45 2015 +0100 Implemented formula group count statistic Change-Id: I8b9c11fdd4b6e4343b467f1e5b1d1e96f1dd3140 Reviewed-on: https://gerrit.libreoffice.org/15927 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Markus Mohrhard <markus.mohrh...@googlemail.com> diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx index 9d96793..d5e6625 100644 --- a/sc/inc/column.hxx +++ b/sc/inc/column.hxx @@ -145,6 +145,7 @@ friend class ScValueIterator; friend class ScHorizontalValueIterator; friend class ScDBQueryDataIterator; friend class ScQueryCellIterator; +friend class ScFormulaGroupIterator; friend class ScCellIterator; friend class ScHorizontalCellIterator; friend class ScHorizontalAttrIterator; diff --git a/sc/inc/dociter.hxx b/sc/inc/dociter.hxx index 5b32930..49a782e 100644 --- a/sc/inc/dociter.hxx +++ b/sc/inc/dociter.hxx @@ -21,6 +21,7 @@ #define INCLUDED_SC_INC_DOCITER_HXX #include "address.hxx" +#include "formulagroup.hxx" #include <tools/solar.h> #include "global.hxx" #include "scdllapi.h" @@ -184,6 +185,23 @@ public: bool GetNext(Value& rValue); }; +class ScFormulaGroupIterator +{ +private: + ScDocument* mpDoc; + SCTAB mnTab; + SCCOL mnCol; + bool mbNullCol; + size_t mnIndex; + std::vector<sc::FormulaGroupEntry> maEntries; + +public: + ScFormulaGroupIterator( ScDocument* pDoc ); + + sc::FormulaGroupEntry* first(); + sc::FormulaGroupEntry* next(); +}; + /** * Walk through all cells in an area. For SubTotal and Aggregate depending on mnSubTotalFlags. **/ diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index 7ea90f1..79ea555 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -231,10 +231,12 @@ struct ScDocStat OUString aDocName; SCTAB nTableCount; sal_uLong nCellCount; + sal_uLong nFormulaCount; sal_uInt16 nPageCount; ScDocStat() : nTableCount(0) , nCellCount(0) + , nFormulaCount(0) , nPageCount(0) { } @@ -251,6 +253,7 @@ class ScDocument friend class ScValueIterator; friend class ScHorizontalValueIterator; friend class ScDBQueryDataIterator; +friend class ScFormulaGroupIterator; friend class ScCellIterator; friend class ScQueryCellIterator; friend class ScHorizontalCellIterator; @@ -465,6 +468,7 @@ public: bool IsUsingEmbededFonts() { return mbUseEmbedFonts; } void SetIsUsingEmbededFonts( bool bUse ) { mbUseEmbedFonts = bUse; } SC_DLLPUBLIC sal_uLong GetCellCount() const; // all cells + SC_DLLPUBLIC sal_uLong GetFormulaGroupCount() const; // all cells sal_uLong GetCodeCount() const; // RPN-Code in formulas DECL_LINK( GetUserDefinedColor, sal_uInt16 * ); // number formatter diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx index 7454188..8bbf7df 100644 --- a/sc/inc/table.hxx +++ b/sc/inc/table.hxx @@ -209,6 +209,7 @@ friend class ScDocument; // for FillInfo friend class ScValueIterator; friend class ScHorizontalValueIterator; friend class ScDBQueryDataIterator; +friend class ScFormulaGroupIterator; friend class ScCellIterator; friend class ScQueryCellIterator; friend class ScHorizontalCellIterator; diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx index 494b535..dcc8cc1 100644 --- a/sc/qa/unit/ucalc.cxx +++ b/sc/qa/unit/ucalc.cxx @@ -767,6 +767,18 @@ void Test::testDocStatistics() m_pDoc->SetString(ScAddress(1,1,1), "Test"); CPPUNIT_ASSERT_EQUAL(static_cast<sal_uLong>(3), m_pDoc->GetCellCount()); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uLong>(0), m_pDoc->GetFormulaGroupCount()); + m_pDoc->SetString(ScAddress(3,0,1), "=A1"); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uLong>(1), m_pDoc->GetFormulaGroupCount()); + m_pDoc->SetString(ScAddress(3,1,1), "=A2"); + m_pDoc->SetString(ScAddress(3,2,1), "=A3"); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uLong>(1), m_pDoc->GetFormulaGroupCount()); + m_pDoc->SetString(ScAddress(3,3,1), "=A5"); + m_pDoc->SetString(ScAddress(3,4,1), "=A6"); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uLong>(2), m_pDoc->GetFormulaGroupCount()); + m_pDoc->SetString(ScAddress(3,1,1), "=A3"); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uLong>(4), m_pDoc->GetFormulaGroupCount()); + m_pDoc->DeleteTab(1); CPPUNIT_ASSERT_MESSAGE("Failed to decrement sheet count.", m_pDoc->GetTableCount() == nStartTabs+1); m_pDoc->DeleteTab(0); // This may fail in case there is only one sheet in the document. diff --git a/sc/source/core/data/dociter.cxx b/sc/source/core/data/dociter.cxx index 8cf40b6..575f13f 100644 --- a/sc/source/core/data/dociter.cxx +++ b/sc/source/core/data/dociter.cxx @@ -785,6 +785,58 @@ bool ScDBQueryDataIterator::GetNext(Value& rValue) return mpData->getNext(rValue); } +ScFormulaGroupIterator::ScFormulaGroupIterator( ScDocument* pDoc ) : + mpDoc(pDoc), + mnTab(0), + mnCol(0), + mnIndex(0) +{ + ScTable *pTab = mpDoc->FetchTable(mnTab); + ScColumn *pCol = pTab->FetchColumn(mnCol); + if (pCol) + { + mbNullCol = false; + maEntries = pCol->GetFormulaGroupEntries(); + } + else + mbNullCol = true; +} + +sc::FormulaGroupEntry* ScFormulaGroupIterator::first() +{ + return this->next(); +} + +sc::FormulaGroupEntry* ScFormulaGroupIterator::next() +{ + if (mnIndex >= maEntries.size() || mbNullCol) + { + while (mnIndex >= maEntries.size() || mbNullCol) + { + mnIndex = 0; + mnCol++; + if (mnCol > MAXCOL) + { + mnCol = 0; + mnTab++; + if (mnTab >= mpDoc->GetTableCount()) + return NULL; + } + ScTable *pTab = mpDoc->FetchTable(mnTab); + ScColumn *pCol = pTab->FetchColumn(mnCol); + if (pCol) + { + mbNullCol = false; + maEntries = pCol->GetFormulaGroupEntries(); + } + else + mbNullCol = true; + } + } + + return &maEntries[mnIndex++]; +} + ScCellIterator::ScCellIterator( ScDocument* pDoc, const ScRange& rRange, sal_uInt16 nSubTotalFlags ) : mpDoc(pDoc), maStartPos(rRange.aStart), diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx index c445d63..b45bc8e 100644 --- a/sc/source/core/data/document.cxx +++ b/sc/source/core/data/document.cxx @@ -47,6 +47,7 @@ #include "document.hxx" #include "table.hxx" +#include "column.hxx" #include "attrib.hxx" #include "attarray.hxx" #include "markarr.hxx" @@ -5748,6 +5749,19 @@ sal_uLong ScDocument::GetCellCount() const return nCellCount; } +sal_uLong ScDocument::GetFormulaGroupCount() const +{ + sal_uLong nFormulaGroupCount = 0L; + + ScFormulaGroupIterator aIter( const_cast<ScDocument*>(this) ); + for ( sc::FormulaGroupEntry* ptr = aIter.first(); ptr; ptr = aIter.next()) + { + nFormulaGroupCount++; + } + + return nFormulaGroupCount; +} + sal_uLong ScDocument::GetCodeCount() const { sal_uLong nCodeCount = 0; @@ -5832,6 +5846,7 @@ void ScDocument::GetDocStat( ScDocStat& rDocStat ) { rDocStat.nTableCount = GetTableCount(); rDocStat.aDocName = aDocName; + rDocStat.nFormulaCount = GetFormulaGroupCount(); rDocStat.nCellCount = GetCellCount(); } diff --git a/sc/source/ui/docshell/tpstat.cxx b/sc/source/ui/docshell/tpstat.cxx index 7aca08e..c18f331 100644 --- a/sc/source/ui/docshell/tpstat.cxx +++ b/sc/source/ui/docshell/tpstat.cxx @@ -38,6 +38,7 @@ ScDocStatPage::ScDocStatPage( vcl::Window *pParent, const SfxItemSet& rSet ) get(m_pFtTables,"nosheets"); get(m_pFtCells,"nocells"); get(m_pFtPages,"nopages"); + get(m_pFtFormula,"noformula"); ScDocShell* pDocSh = PTR_CAST( ScDocShell, SfxObjectShell::Current() ); ScDocStat aDocStat; @@ -51,6 +52,7 @@ ScDocStatPage::ScDocStatPage( vcl::Window *pParent, const SfxItemSet& rSet ) m_pFtTables ->SetText( OUString::number( aDocStat.nTableCount ) ); m_pFtCells ->SetText( OUString::number( aDocStat.nCellCount ) ); m_pFtPages ->SetText( OUString::number( aDocStat.nPageCount ) ); + m_pFtFormula ->SetText( OUString::number( aDocStat.nFormulaCount ) ); } diff --git a/sc/source/ui/inc/tpstat.hxx b/sc/source/ui/inc/tpstat.hxx index a5cbdf7..d143610 100644 --- a/sc/source/ui/inc/tpstat.hxx +++ b/sc/source/ui/inc/tpstat.hxx @@ -41,6 +41,7 @@ private: VclPtr<FixedText> m_pFtTables; VclPtr<FixedText> m_pFtCells; VclPtr<FixedText> m_pFtPages; + VclPtr<FixedText> m_pFtFormula; }; #endif diff --git a/sc/source/ui/view/cellsh2.cxx b/sc/source/ui/view/cellsh2.cxx index 0ba2224..4eb52acc 100644 --- a/sc/source/ui/view/cellsh2.cxx +++ b/sc/source/ui/view/cellsh2.cxx @@ -887,11 +887,27 @@ void ScCellShell::ExecuteDB( SfxRequest& rReq ) ScGlobal::pLocaleData->getNumDecimalSep()[0], true)); else aExpr2 = aTemp2; + if ( eMode == SC_VALID_TIME ) { + sal_Int32 wraparound = aExpr1.compareTo(aExpr2); + if (wraparound > 0) { + if (eOper == SC_COND_BETWEEN) { + eOper = SC_COND_NOTBETWEEN; + OUString tmp = aExpr1; + aExpr1 = aExpr2; + aExpr2 = tmp; + } + else if (eOper == SC_COND_NOTBETWEEN) { + eOper = SC_COND_BETWEEN; + OUString tmp = aExpr1; + aExpr1 = aExpr2; + aExpr2 = tmp; + } + } + } } else aExpr2 = aTemp2; } - if ( pOutSet->GetItemState( FID_VALID_BLANK, true, &pItem ) == SfxItemState::SET ) bBlank = static_cast<const SfxBoolItem*>(pItem)->GetValue(); if ( pOutSet->GetItemState( FID_VALID_LISTTYPE, true, &pItem ) == SfxItemState::SET ) diff --git a/sc/uiconfig/scalc/ui/statisticsinfopage.ui b/sc/uiconfig/scalc/ui/statisticsinfopage.ui index 14955b4..f3f648d 100644 --- a/sc/uiconfig/scalc/ui/statisticsinfopage.ui +++ b/sc/uiconfig/scalc/ui/statisticsinfopage.ui @@ -113,6 +113,38 @@ <property name="height">1</property> </packing> </child> + <child> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Number of Formula Groups:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">noformula</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">3</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="noformula"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="hexpand">True</property> + <property name="xalign">0</property> + <property name="use_underline">True</property> + <property name="width_chars">10</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">3</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> </object> </child> </object> _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits