[Libreoffice-commits] .: sc/inc sc/source
Kohei Yoshida
kohei at kemper.freedesktop.org
Mon Mar 12 12:47:07 PDT 2012
sc/inc/dpcachetable.hxx | 21 +++-----
sc/source/core/data/dpcachetable.cxx | 67 +++++++------------------
sc/source/core/data/dpgroup.cxx | 91 ++++++++++++++++-------------------
sc/source/core/data/dptabres.cxx | 2
sc/source/core/data/dptabsrc.cxx | 7 +-
5 files changed, 76 insertions(+), 112 deletions(-)
New commits:
commit 85f580ac0c0ed73ee24cf88be7866015c903b2eb
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Mon Mar 12 15:46:10 2012 -0400
Get double-click drill-down of pivot data to work again.
diff --git a/sc/inc/dpcachetable.hxx b/sc/inc/dpcachetable.hxx
index 00e9db2..47114e0 100644
--- a/sc/inc/dpcachetable.hxx
+++ b/sc/inc/dpcachetable.hxx
@@ -32,6 +32,7 @@
#include "sal/types.h"
#include "osl/mutex.hxx"
#include "global.hxx"
+#include "dpitemdata.hxx"
#include <vector>
#include <boost/unordered_set.hpp>
@@ -68,12 +69,10 @@ public:
/** individual filter item used in SingleFilter and GroupFilter. */
struct FilterItem
{
- rtl::OUString maString;
- double mfValue;
- bool mbHasValue;
+ ScDPItemData maItem;
FilterItem();
- bool match( const ScDPItemData& rCellData ) const;
+ bool match(const ScDPItemData& rCellData) const;
};
/** interface class used for filtering of rows. */
@@ -90,19 +89,17 @@ public:
class SingleFilter : public FilterBase
{
public:
- explicit SingleFilter(const rtl::OUString& aString, double fValue, bool bHasValue);
+ explicit SingleFilter(const ScDPItemData &rItem);
virtual ~SingleFilter() {}
virtual bool match(const ScDPItemData& rCellData) const;
- const rtl::OUString& getMatchString() const;
- double getMatchValue() const;
- bool hasValue() const;
+ const ScDPItemData& getMatchValue() const;
private:
explicit SingleFilter();
- FilterItem maItem;
+ ScDPItemData maItem;
};
/** multi-item (group) filter. */
@@ -111,12 +108,12 @@ public:
public:
GroupFilter();
virtual ~GroupFilter() {}
- virtual bool match( const ScDPItemData& rCellData ) const;
- void addMatchItem(const rtl::OUString& rStr, double fVal, bool bHasValue);
+ virtual bool match(const ScDPItemData& rCellData) const;
+ void addMatchItem(const ScDPItemData& rItem);
size_t getMatchItemCount() const;
private:
- ::std::vector<FilterItem> maItems;
+ ::std::vector<ScDPItemData> maItems;
};
/** single filtering criterion. */
diff --git a/sc/source/core/data/dpcachetable.cxx b/sc/source/core/data/dpcachetable.cxx
index d751e39..ff0335e 100644
--- a/sc/source/core/data/dpcachetable.cxx
+++ b/sc/source/core/data/dpcachetable.cxx
@@ -84,74 +84,47 @@ ScDPCacheTable::RowFlag::RowFlag() :
{
}
-ScDPCacheTable::FilterItem::FilterItem() :
- mfValue(0.0),
- mbHasValue(false)
-{
-}
+ScDPCacheTable::FilterItem::FilterItem() {}
-bool ScDPCacheTable::FilterItem::match( const ScDPItemData& rCellData ) const
+bool ScDPCacheTable::FilterItem::match(const ScDPItemData& rCellData) const
{
- if (!rCellData.GetString().equals(maString) &&
- (!rCellData.IsValue()|| rCellData.GetValue()!= mfValue))
- return false;
- return true;
+ return rCellData == maItem;
}
// ----------------------------------------------------------------------------
-ScDPCacheTable::SingleFilter::SingleFilter(const rtl::OUString& aString, double fValue, bool bHasValue)
-{
- maItem.maString = aString;
- maItem.mfValue = fValue;
- maItem.mbHasValue = bHasValue;
-}
-
-bool ScDPCacheTable::SingleFilter::match( const ScDPItemData& rCellData ) const
-{
- return maItem.match(rCellData);
-}
+ScDPCacheTable::SingleFilter::SingleFilter(const ScDPItemData& rItem) :
+ maItem(rItem) {}
-const rtl::OUString& ScDPCacheTable::SingleFilter::getMatchString() const
+bool ScDPCacheTable::SingleFilter::match(const ScDPItemData& rCellData) const
{
- return maItem.maString;
+ return maItem == rCellData;
}
-double ScDPCacheTable::SingleFilter::getMatchValue() const
+const ScDPItemData& ScDPCacheTable::SingleFilter::getMatchValue() const
{
- return maItem.mfValue;
+ return maItem;
}
-bool ScDPCacheTable::SingleFilter::hasValue() const
-{
- return maItem.mbHasValue;
-}
-
-// ----------------------------------------------------------------------------
-
ScDPCacheTable::GroupFilter::GroupFilter()
{
}
-bool ScDPCacheTable::GroupFilter::match( const ScDPItemData& rCellData ) const
+bool ScDPCacheTable::GroupFilter::match(const ScDPItemData& rCellData) const
{
- vector<FilterItem>::const_iterator itrEnd = maItems.end();
- for (vector<FilterItem>::const_iterator itr = maItems.begin(); itr != itrEnd; ++itr)
- {
- bool bMatch = itr->match( rCellData);
- if (bMatch)
- return true;
- }
- return false;
+ vector<ScDPItemData>::const_iterator it = maItems.begin(), itEnd = maItems.end();
+ for (; it != itEnd; ++it)
+ {
+ bool bMatch = *it == rCellData;
+ if (bMatch)
+ return true;
+ }
+ return false;
}
-void ScDPCacheTable::GroupFilter::addMatchItem(const rtl::OUString& rStr, double fVal, bool bHasValue)
+void ScDPCacheTable::GroupFilter::addMatchItem(const ScDPItemData& rItem)
{
- FilterItem aItem;
- aItem.maString = rStr;
- aItem.mfValue = fVal;
- aItem.mbHasValue = bHasValue;
- maItems.push_back(aItem);
+ maItems.push_back(rItem);
}
size_t ScDPCacheTable::GroupFilter::getMatchItemCount() const
diff --git a/sc/source/core/data/dpgroup.cxx b/sc/source/core/data/dpgroup.cxx
index bcd7032..57403c0 100644
--- a/sc/source/core/data/dpgroup.cxx
+++ b/sc/source/core/data/dpgroup.cxx
@@ -81,28 +81,26 @@ class ScDPGroupDateFilter : public ScDPCacheTable::FilterBase
{
public:
virtual ~ScDPGroupDateFilter() {}
- ScDPGroupDateFilter(double fMatchValue, sal_Int32 nDatePart,
- const Date* pNullDate, const ScDPNumGroupInfo* pNumInfo);
+ ScDPGroupDateFilter(
+ const ScDPItemData& rValue, const Date& rNullDate, const ScDPNumGroupInfo& rNumInfo);
virtual bool match(const ScDPItemData & rCellData) const;
private:
ScDPGroupDateFilter(); // disabled
- const Date* mpNullDate;
- const ScDPNumGroupInfo* mpNumInfo;
- double mfMatchValue;
- sal_Int32 mnDatePart;
+ ScDPItemData maValue;
+ const Date maNullDate;
+ const ScDPNumGroupInfo maNumInfo;
};
// ----------------------------------------------------------------------------
-ScDPGroupDateFilter::ScDPGroupDateFilter(double fMatchValue, sal_Int32 nDatePart,
- const Date* pNullDate, const ScDPNumGroupInfo* pNumInfo) :
- mpNullDate(pNullDate),
- mpNumInfo(pNumInfo),
- mfMatchValue(fMatchValue),
- mnDatePart(nDatePart)
+ScDPGroupDateFilter::ScDPGroupDateFilter(
+ const ScDPItemData& rItem, const Date& rNullDate, const ScDPNumGroupInfo& rNumInfo) :
+ maValue(rItem),
+ maNullDate(rNullDate),
+ maNumInfo(rNumInfo)
{
}
@@ -115,20 +113,28 @@ bool ScDPGroupDateFilter::match( const ScDPItemData & rCellData ) const
if ( !rCellData.IsValue() )
return false;
- if (!mpNumInfo)
+ if (maValue.GetType() != ScDPItemData::GroupValue)
return false;
+ sal_Int32 nGroupType = maValue.GetGroupValue().mnGroupType;
+ sal_Int32 nValue = maValue.GetGroupValue().mnValue;
+
// Start and end dates are inclusive. (An end date without a time value
// is included, while an end date with a time value is not.)
- if ( rCellData.GetValue() < mpNumInfo->mfStart && !approxEqual(rCellData.GetValue(), mpNumInfo->mfStart) )
- return static_cast<sal_Int32>(mfMatchValue) == ScDPItemData::DateFirst;
+ if ( rCellData.GetValue() < maNumInfo.mfStart && !approxEqual(rCellData.GetValue(), maNumInfo.mfStart) )
+ {
+ return nValue == ScDPItemData::DateFirst;
+ }
+
+ if ( rCellData.GetValue() > maNumInfo.mfEnd && !approxEqual(rCellData.GetValue(), maNumInfo.mfEnd) )
+ {
+ return nValue == ScDPItemData::DateLast;
+ }
- if ( rCellData.GetValue() > mpNumInfo->mfEnd && !approxEqual(rCellData.GetValue(), mpNumInfo->mfEnd) )
- return static_cast<sal_Int32>(mfMatchValue) == ScDPItemData::DateLast;
- if (mnDatePart == DataPilotFieldGroupBy::HOURS || mnDatePart == DataPilotFieldGroupBy::MINUTES ||
- mnDatePart == DataPilotFieldGroupBy::SECONDS)
+ if (nGroupType == DataPilotFieldGroupBy::HOURS || nGroupType == DataPilotFieldGroupBy::MINUTES ||
+ nGroupType == DataPilotFieldGroupBy::SECONDS)
{
// handle time
// (as in the cell functions, ScInterpreter::ScGetHour etc.: seconds are rounded)
@@ -136,25 +142,22 @@ bool ScDPGroupDateFilter::match( const ScDPItemData & rCellData ) const
double time = rCellData.GetValue() - approxFloor(rCellData.GetValue());
long seconds = static_cast<long>(approxFloor(time*D_TIMEFACTOR + 0.5));
- switch (mnDatePart)
+ switch (nGroupType)
{
case DataPilotFieldGroupBy::HOURS:
{
sal_Int32 hrs = seconds / 3600;
- sal_Int32 matchHrs = static_cast<sal_Int32>(mfMatchValue);
- return hrs == matchHrs;
+ return hrs == nValue;
}
case DataPilotFieldGroupBy::MINUTES:
{
sal_Int32 minutes = (seconds % 3600) / 60;
- sal_Int32 matchMinutes = static_cast<sal_Int32>(mfMatchValue);
- return minutes == matchMinutes;
+ return minutes == nValue;
}
case DataPilotFieldGroupBy::SECONDS:
{
sal_Int32 sec = seconds % 60;
- sal_Int32 matchSec = static_cast<sal_Int32>(mfMatchValue);
- return sec == matchSec;
+ return sec == nValue;
}
default:
OSL_FAIL("invalid time part");
@@ -162,26 +165,23 @@ bool ScDPGroupDateFilter::match( const ScDPItemData & rCellData ) const
return false;
}
- Date date = *mpNullDate + static_cast<long>(approxFloor(rCellData.GetValue()));
- switch (mnDatePart)
+ Date date = maNullDate + static_cast<long>(approxFloor(rCellData.GetValue()));
+ switch (nGroupType)
{
case DataPilotFieldGroupBy::YEARS:
{
sal_Int32 year = static_cast<sal_Int32>(date.GetYear());
- sal_Int32 matchYear = static_cast<sal_Int32>(mfMatchValue);
- return year == matchYear;
+ return year == nValue;
}
case DataPilotFieldGroupBy::QUARTERS:
{
sal_Int32 qtr = 1 + (static_cast<sal_Int32>(date.GetMonth()) - 1) / 3;
- sal_Int32 matchQtr = static_cast<sal_Int32>(mfMatchValue);
- return qtr == matchQtr;
+ return qtr == nValue;
}
case DataPilotFieldGroupBy::MONTHS:
{
sal_Int32 month = static_cast<sal_Int32>(date.GetMonth());
- sal_Int32 matchMonth = static_cast<sal_Int32>(mfMatchValue);
- return month == matchMonth;
+ return month == nValue;
}
case DataPilotFieldGroupBy::DAYS:
{
@@ -192,8 +192,7 @@ bool ScDPGroupDateFilter::match( const ScDPItemData & rCellData ) const
// This is not a leap year. Adjust the value accordingly.
++days;
}
- sal_Int32 matchDays = static_cast<sal_Int32>(mfMatchValue);
- return days == matchDays;
+ return days == nValue;
}
default:
OSL_FAIL("invalid date part");
@@ -313,7 +312,7 @@ void ScDPGroupItem::FillGroupFilter( ScDPCacheTable::GroupFilter& rFilter ) cons
{
ScDPItemDataVec::const_iterator itrEnd = aElements.end();
for (ScDPItemDataVec::const_iterator itr = aElements.begin(); itr != itrEnd; ++itr)
- rFilter.addMatchItem(itr->GetString(), itr->GetValue(), itr->IsValue());
+ rFilter.addMatchItem(*itr);
}
// -----------------------------------------------------------------------
@@ -693,9 +692,9 @@ void ScDPGroupTableData::ModifyFilterCriteria(vector<ScDPCacheTable::Criterion>&
ScDPCacheTable::Criterion aCri;
aCri.mnFieldIndex = itr->mnFieldIndex;
- aCri.mpFilter.reset(new ScDPGroupDateFilter(
- pFilter->getMatchValue(), pDateHelper->GetDatePart(),
- pDoc->GetFormatTable()->GetNullDate(), &pDateHelper->GetNumInfo()));
+ aCri.mpFilter.reset(
+ new ScDPGroupDateFilter(
+ pFilter->getMatchValue(), *pDoc->GetFormatTable()->GetNullDate(), pDateHelper->GetNumInfo()));
aNewCriteria.push_back(aCri);
}
@@ -718,9 +717,9 @@ void ScDPGroupTableData::ModifyFilterCriteria(vector<ScDPCacheTable::Criterion>&
// external number group
ScDPCacheTable::Criterion aCri;
aCri.mnFieldIndex = nSrcDim; // use the source dimension, not the group dimension.
- aCri.mpFilter.reset(new ScDPGroupDateFilter(
- pFilter->getMatchValue(), pDateHelper->GetDatePart(),
- pDoc->GetFormatTable()->GetNullDate(), &pDateHelper->GetNumInfo()));
+ aCri.mpFilter.reset(
+ new ScDPGroupDateFilter(
+ pFilter->getMatchValue(), *pDoc->GetFormatTable()->GetNullDate(), pDateHelper->GetNumInfo()));
aNewCriteria.push_back(aCri);
}
@@ -733,11 +732,7 @@ void ScDPGroupTableData::ModifyFilterCriteria(vector<ScDPCacheTable::Criterion>&
for (size_t i = 0; i < nGroupItemCount; ++i)
{
const ScDPGroupItem* pGrpItem = pGrpDim->GetGroupByIndex(i);
- ScDPItemData aName;
- if (pFilter->hasValue())
- aName.SetValue(pFilter->getMatchValue());
- else
- aName.SetString(pFilter->getMatchString());
+ ScDPItemData aName = pFilter->getMatchValue();
if (!pGrpItem || !pGrpItem->GetName().IsCaseInsEqual(aName))
continue;
diff --git a/sc/source/core/data/dptabres.cxx b/sc/source/core/data/dptabres.cxx
index 3372d68..9ffe37c 100644
--- a/sc/source/core/data/dptabres.cxx
+++ b/sc/source/core/data/dptabres.cxx
@@ -3908,7 +3908,7 @@ void ScDPResultVisibilityData::fillFieldFilters(vector<ScDPCacheTable::Criterion
itrMem != itrMemEnd; ++itrMem)
{
const ScDPItemData& rMemItem = *itrMem;
- pGrpFilter->addMatchItem(rMemItem.GetString(), rMemItem.GetValue(), rMemItem.IsValue());
+ pGrpFilter->addMatchItem(rMemItem);
}
ScDPDimension* pDim = pDims->getByIndex(nDimIndex);
diff --git a/sc/source/core/data/dptabsrc.cxx b/sc/source/core/data/dptabsrc.cxx
index 65d70c7..b69b102 100644
--- a/sc/source/core/data/dptabsrc.cxx
+++ b/sc/source/core/data/dptabsrc.cxx
@@ -459,7 +459,7 @@ Sequence< Sequence<Any> > SAL_CALL ScDPSource::getDrillDownData(const Sequence<s
aFilterCriteria.push_back( ScDPCacheTable::Criterion() );
aFilterCriteria.back().mnFieldIndex = nCol;
aFilterCriteria.back().mpFilter.reset(
- new ScDPCacheTable::SingleFilter(aItem.GetString(), aItem.GetValue(), aItem.IsValue()));
+ new ScDPCacheTable::SingleFilter(aItem));
}
}
}
@@ -724,7 +724,7 @@ void ScDPSource::FilterCacheTableByPageDimensions()
{
ScDPItemData aData;
pMem->FillItemData(aData);
- pGrpFilter->addMatchItem(aData.GetString(), aData.GetValue(), aData.IsValue());
+ pGrpFilter->addMatchItem(aData);
}
}
if (pGrpFilter->getMatchItemCount() < static_cast<size_t>(nMemCount))
@@ -738,8 +738,7 @@ void ScDPSource::FilterCacheTableByPageDimensions()
aCriteria.push_back(ScDPCacheTable::Criterion());
ScDPCacheTable::Criterion& r = aCriteria.back();
r.mnFieldIndex = static_cast<sal_Int32>(nField);
- r.mpFilter.reset(
- new ScDPCacheTable::SingleFilter(rData.GetString()/*rSharedString, nStrId*/, rData.GetValue(), rData.IsValue()));
+ r.mpFilter.reset(new ScDPCacheTable::SingleFilter(rData));
}
if (!aCriteria.empty())
{
More information about the Libreoffice-commits
mailing list