Kaydet (Commit) 4eedf5dc authored tarafından Kohei Yoshida's avatar Kohei Yoshida

Correctly set pivot's popup flag when importing from Excel docs.

üst 691f2451
...@@ -240,8 +240,10 @@ public: ...@@ -240,8 +240,10 @@ public:
class ScDPSaveData class ScDPSaveData
{ {
public:
typedef boost::ptr_vector<ScDPSaveDimension> DimsType;
private: private:
boost::ptr_vector<ScDPSaveDimension> aDimList; DimsType aDimList;
ScDPDimensionSaveData* pDimensionData; // settings that create new dimensions ScDPDimensionSaveData* pDimensionData; // settings that create new dimensions
sal_uInt16 nColumnGrandMode; sal_uInt16 nColumnGrandMode;
sal_uInt16 nRowGrandMode; sal_uInt16 nRowGrandMode;
...@@ -270,8 +272,19 @@ public: ...@@ -270,8 +272,19 @@ public:
SC_DLLPUBLIC void SetGrandTotalName(const ::rtl::OUString& rName); SC_DLLPUBLIC void SetGrandTotalName(const ::rtl::OUString& rName);
SC_DLLPUBLIC const ::rtl::OUString* GetGrandTotalName() const; SC_DLLPUBLIC const ::rtl::OUString* GetGrandTotalName() const;
const boost::ptr_vector<ScDPSaveDimension>& GetDimensions() const SC_DLLPUBLIC const DimsType& GetDimensions() const;
{ return aDimList; }
/**
* Get all dimensions in a given orientation. The order represents the
* actual order of occurrence. The returned list also includes data
* layout dimension.
*
* @param eOrientation orientation
* @param rDims (out) list of dimensions for specified orientation
*/
SC_DLLPUBLIC void GetAllDimensionsByOrientation(
com::sun::star::sheet::DataPilotFieldOrientation eOrientation,
std::vector<const ScDPSaveDimension*>& rDims) const;
void AddDimension(ScDPSaveDimension* pDim) void AddDimension(ScDPSaveDimension* pDim)
{ aDimList.push_back(pDim); } { aDimList.push_back(pDim); }
......
...@@ -818,6 +818,28 @@ const OUString* ScDPSaveData::GetGrandTotalName() const ...@@ -818,6 +818,28 @@ const OUString* ScDPSaveData::GetGrandTotalName() const
return mpGrandTotalName.get(); return mpGrandTotalName.get();
} }
const ScDPSaveData::DimsType& ScDPSaveData::GetDimensions() const
{
return aDimList;
}
void ScDPSaveData::GetAllDimensionsByOrientation(
sheet::DataPilotFieldOrientation eOrientation, std::vector<const ScDPSaveDimension*>& rDims) const
{
std::vector<const ScDPSaveDimension*> aDims;
DimsType::const_iterator it = aDimList.begin(), itEnd = aDimList.end();
for (; it != itEnd; ++it)
{
const ScDPSaveDimension& rDim = *it;
if (rDim.GetOrientation() != static_cast<sal_uInt16>(eOrientation))
continue;
aDims.push_back(&rDim);
}
rDims.swap(aDims);
}
ScDPSaveDimension* ScDPSaveData::GetDimensionByName(const ::rtl::OUString& rName) ScDPSaveDimension* ScDPSaveData::GetDimensionByName(const ::rtl::OUString& rName)
{ {
boost::ptr_vector<ScDPSaveDimension>::const_iterator iter; boost::ptr_vector<ScDPSaveDimension>::const_iterator iter;
......
...@@ -60,6 +60,8 @@ ...@@ -60,6 +60,8 @@
#include <vector> #include <vector>
using namespace com::sun::star;
using ::rtl::OUString; using ::rtl::OUString;
using ::rtl::OUStringBuffer; using ::rtl::OUStringBuffer;
using ::com::sun::star::sheet::DataPilotFieldOrientation; using ::com::sun::star::sheet::DataPilotFieldOrientation;
...@@ -1476,9 +1478,11 @@ void XclImpPivotTable::ApplyMergeFlags(const ScRange& rOutRange, const ScDPSaveD ...@@ -1476,9 +1478,11 @@ void XclImpPivotTable::ApplyMergeFlags(const ScRange& rOutRange, const ScDPSaveD
ScDocument& rDoc = GetDoc(); ScDocument& rDoc = GetDoc();
vector<ScAddress> aPageBtns; vector<const ScDPSaveDimension*> aFieldDims;
aGeometry.getPageFieldPositions(aPageBtns); vector<ScAddress> aFieldBtns;
vector<ScAddress>::const_iterator itr = aPageBtns.begin(), itrEnd = aPageBtns.end();
aGeometry.getPageFieldPositions(aFieldBtns);
vector<ScAddress>::const_iterator itr = aFieldBtns.begin(), itrEnd = aFieldBtns.end();
for (; itr != itrEnd; ++itr) for (; itr != itrEnd; ++itr)
{ {
sal_uInt16 nMFlag = SC_MF_BUTTON; sal_uInt16 nMFlag = SC_MF_BUTTON;
...@@ -1491,32 +1495,42 @@ void XclImpPivotTable::ApplyMergeFlags(const ScRange& rOutRange, const ScDPSaveD ...@@ -1491,32 +1495,42 @@ void XclImpPivotTable::ApplyMergeFlags(const ScRange& rOutRange, const ScDPSaveD
rDoc.ApplyFlagsTab(itr->Col()+1, itr->Row(), itr->Col()+1, itr->Row(), itr->Tab(), SC_MF_AUTO); rDoc.ApplyFlagsTab(itr->Col()+1, itr->Row(), itr->Col()+1, itr->Row(), itr->Tab(), SC_MF_AUTO);
} }
vector<ScAddress> aColBtns; aGeometry.getColumnFieldPositions(aFieldBtns);
aGeometry.getColumnFieldPositions(aColBtns); rSaveData.GetAllDimensionsByOrientation(sheet::DataPilotFieldOrientation_COLUMN, aFieldDims);
itr = aColBtns.begin(); if (aFieldBtns.size() == aFieldDims.size())
itrEnd = aColBtns.end();
for (; itr != itrEnd; ++itr)
{ {
sal_Int16 nMFlag = SC_MF_BUTTON | SC_MF_BUTTON_POPUP; itr = aFieldBtns.begin();
rtl::OUString aName; itrEnd = aFieldBtns.end();
rDoc.GetString(itr->Col(), itr->Row(), itr->Tab(), aName); vector<const ScDPSaveDimension*>::const_iterator itDim = aFieldDims.begin();
if (rSaveData.HasInvisibleMember(aName)) for (; itr != itrEnd; ++itr, ++itDim)
nMFlag |= SC_MF_HIDDEN_MEMBER; {
rDoc.ApplyFlagsTab(itr->Col(), itr->Row(), itr->Col(), itr->Row(), itr->Tab(), nMFlag); sal_Int16 nMFlag = SC_MF_BUTTON;
const ScDPSaveDimension* pDim = *itDim;
if (pDim->HasInvisibleMember())
nMFlag |= SC_MF_HIDDEN_MEMBER;
if (!pDim->IsDataLayout())
nMFlag |= SC_MF_BUTTON_POPUP;
rDoc.ApplyFlagsTab(itr->Col(), itr->Row(), itr->Col(), itr->Row(), itr->Tab(), nMFlag);
}
} }
vector<ScAddress> aRowBtns; aGeometry.getRowFieldPositions(aFieldBtns);
aGeometry.getRowFieldPositions(aRowBtns); rSaveData.GetAllDimensionsByOrientation(sheet::DataPilotFieldOrientation_ROW, aFieldDims);
itr = aRowBtns.begin(); if (aFieldBtns.size() == aFieldDims.size())
itrEnd = aRowBtns.end();
for (; itr != itrEnd; ++itr)
{ {
sal_Int16 nMFlag = SC_MF_BUTTON | SC_MF_BUTTON_POPUP; itr = aFieldBtns.begin();
rtl::OUString aName; itrEnd = aFieldBtns.end();
rDoc.GetString(itr->Col(), itr->Row(), itr->Tab(), aName); vector<const ScDPSaveDimension*>::const_iterator itDim = aFieldDims.begin();
if (rSaveData.HasInvisibleMember(aName)) for (; itr != itrEnd; ++itr, ++itDim)
nMFlag |= SC_MF_HIDDEN_MEMBER; {
rDoc.ApplyFlagsTab(itr->Col(), itr->Row(), itr->Col(), itr->Row(), itr->Tab(), nMFlag); sal_Int16 nMFlag = SC_MF_BUTTON;
const ScDPSaveDimension* pDim = *itDim;
if (pDim->HasInvisibleMember())
nMFlag |= SC_MF_HIDDEN_MEMBER;
if (!pDim->IsDataLayout())
nMFlag |= SC_MF_BUTTON_POPUP;
rDoc.ApplyFlagsTab(itr->Col(), itr->Row(), itr->Col(), itr->Row(), itr->Tab(), nMFlag);
}
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment