summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@suse.com>2012-02-23 15:02:28 -0500
committerKohei Yoshida <kohei.yoshida@suse.com>2012-02-24 00:51:40 -0500
commit57875110e3365988bb01cfef42d8094cb076002d (patch)
tree3ba29fd9d2d4629d55ed58238b34047e0021c693
parentefae4424c0f9381e6050541784358bfe1095189a (diff)
Ensure that the save dimension and regular dimension have identical name.
This was not the case previously, for duplicated dimensions. Without this, setting layout names (aka custom names) to data fields would not work properly especially when the data fields are duplicated.
-rw-r--r--sc/inc/dpsave.hxx10
-rw-r--r--sc/source/core/data/dpsave.cxx71
2 files changed, 58 insertions, 23 deletions
diff --git a/sc/inc/dpsave.hxx b/sc/inc/dpsave.hxx
index 65d04984cbac..3107da8f8985 100644
--- a/sc/inc/dpsave.hxx
+++ b/sc/inc/dpsave.hxx
@@ -237,10 +237,13 @@ public:
class ScDPSaveData
{
+ typedef boost::unordered_map<rtl::OUString, size_t, rtl::OUStringHash> DupNameCountType;
public:
typedef boost::ptr_vector<ScDPSaveDimension> DimsType;
+
private:
DimsType aDimList;
+ DupNameCountType maDupNameCounts; /// keep track of number of duplicates in each name.
ScDPDimensionSaveData* pDimensionData; // settings that create new dimensions
sal_uInt16 nColumnGrandMode;
sal_uInt16 nRowGrandMode;
@@ -281,8 +284,7 @@ public:
com::sun::star::sheet::DataPilotFieldOrientation eOrientation,
std::vector<const ScDPSaveDimension*>& rDims) const;
- void AddDimension(ScDPSaveDimension* pDim)
- { aDimList.push_back(pDim); }
+ void AddDimension(ScDPSaveDimension* pDim);
/**
* Get a dimension object by its name. <i>If one doesn't exist for the
@@ -351,6 +353,10 @@ public:
* @param rDimName dimension name
*/
SC_DLLPUBLIC bool HasInvisibleMember(const ::rtl::OUString& rDimName) const;
+
+private:
+ void CheckDuplicateName(ScDPSaveDimension& rDim);
+ void RemoveDuplicateNameCount(const rtl::OUString& rName);
};
#endif
diff --git a/sc/source/core/data/dpsave.cxx b/sc/source/core/data/dpsave.cxx
index a16732c13176..00ff28939899 100644
--- a/sc/source/core/data/dpsave.cxx
+++ b/sc/source/core/data/dpsave.cxx
@@ -37,6 +37,7 @@
#include "global.hxx"
#include <sal/types.h>
+#include "comphelper/string.hxx"
#include <com/sun/star/sheet/GeneralFunction.hpp>
#include <com/sun/star/sheet/DataPilotFieldAutoShowInfo.hpp>
@@ -845,6 +846,15 @@ void ScDPSaveData::GetAllDimensionsByOrientation(
rDims.swap(aDims);
}
+void ScDPSaveData::AddDimension(ScDPSaveDimension* pDim)
+{
+ if (!pDim)
+ return;
+
+ CheckDuplicateName(*pDim);
+ aDimList.push_back(pDim);
+}
+
ScDPSaveDimension* ScDPSaveData::GetDimensionByName(const ::rtl::OUString& rName)
{
boost::ptr_vector<ScDPSaveDimension>::const_iterator iter;
@@ -915,7 +925,7 @@ ScDPSaveDimension* ScDPSaveData::DuplicateDimension(const ::rtl::OUString& rName
return NULL;
ScDPSaveDimension* pNew = new ScDPSaveDimension( *pOld );
- pNew->SetDupFlag( true );
+ CheckDuplicateName(*pNew);
aDimList.push_back(pNew);
return pNew;
}
@@ -925,18 +935,19 @@ void ScDPSaveData::RemoveDimensionByName(const ::rtl::OUString& rName)
boost::ptr_vector<ScDPSaveDimension>::iterator iter;
for (iter = aDimList.begin(); iter != aDimList.end(); ++iter)
{
- if ( iter->GetName() == rName && !iter->IsDataLayout() )
- {
- aDimList.erase(iter);
- break;
- }
+ if (iter->GetName() != rName || iter->IsDataLayout())
+ continue;
+
+ aDimList.erase(iter);
+ RemoveDuplicateNameCount(rName);
+ return;
}
}
ScDPSaveDimension& ScDPSaveData::DuplicateDimension( const ScDPSaveDimension& rDim )
{
ScDPSaveDimension* pNew = new ScDPSaveDimension( rDim );
- pNew->SetDupFlag( true );
+ CheckDuplicateName(*pNew);
aDimList.push_back(pNew);
return *pNew;
}
@@ -1113,6 +1124,7 @@ void ScDPSaveData::WriteToSource( const uno::Reference<sheet::XDimensionsSupplie
for (long i = 0; iter != aDimList.end(); ++iter, ++i)
{
rtl::OUString aName = iter->GetName();
+ rtl::OUString aCoreName = comphelper::string::removeTrailingChars(aName, sal_Unicode('*'));
OSL_TRACE( "%s", aName.getStr() );
@@ -1137,30 +1149,24 @@ void ScDPSaveData::WriteToSource( const uno::Reference<sheet::XDimensionsSupplie
else
{
uno::Reference<container::XNamed> xDimName( xIntDim, uno::UNO_QUERY );
- if ( xDimName.is() && xDimName->getName() == aName )
+ if (xDimName.is() && xDimName->getName() == aCoreName)
bFound = true;
}
- if ( bFound )
+ if (bFound)
{
- if ( iter->GetDupFlag() )
+ if (iter->GetDupFlag())
{
- OUStringBuffer aBuf(iter->GetName());
-
- // different name for each duplication of a (real) dimension...
- for (long j=0; j<=i; ++j) //! Test !!!!!!
- aBuf.append(sal_Unicode('*')); //! modify name at creation of SaveDimension
-
- uno::Reference<util::XCloneable> xCloneable( xIntDim, uno::UNO_QUERY );
- OSL_ENSURE( xCloneable.is(), "cannot clone dimension" );
+ uno::Reference<util::XCloneable> xCloneable(xIntDim, uno::UNO_QUERY);
+ OSL_ENSURE(xCloneable.is(), "cannot clone dimension");
if (xCloneable.is())
{
uno::Reference<util::XCloneable> xNew = xCloneable->createClone();
- uno::Reference<container::XNamed> xNewName( xNew, uno::UNO_QUERY );
+ uno::Reference<container::XNamed> xNewName(xNew, uno::UNO_QUERY);
if (xNewName.is())
{
- xNewName->setName(aBuf.makeStringAndClear());
- iter->WriteToSource( xNew );
+ xNewName->setName(aName);
+ iter->WriteToSource(xNew);
}
}
}
@@ -1270,6 +1276,29 @@ bool ScDPSaveData::HasInvisibleMember(const OUString& rDimName) const
return pDim->HasInvisibleMember();
}
+void ScDPSaveData::CheckDuplicateName(ScDPSaveDimension& rDim)
+{
+ const rtl::OUString aName = comphelper::string::removeTrailingChars(rDim.GetName(), sal_Unicode('*'));
+ DupNameCountType::iterator it = maDupNameCounts.find(aName);
+ if (it != maDupNameCounts.end())
+ {
+ // This is a duplicate name. Up the counter and append '*' to make the name unique.
+ rtl::OUStringBuffer aBuf(aName);
+ it->second = it->second + 1;
+ for (size_t i = 0, n = it->second; i < n; ++i)
+ aBuf.append(sal_Unicode('*'));
+ rDim.SetName(aBuf.makeStringAndClear());
+ rDim.SetDupFlag(true);
+ }
+ else
+ // New name.
+ maDupNameCounts.insert(DupNameCountType::value_type(aName, 0));
+}
+
+void ScDPSaveData::RemoveDuplicateNameCount(const rtl::OUString& rName)
+{
+}
+
void ScDPSaveDimension::Refresh( const com::sun::star::uno::Reference<
com::sun::star::sheet::XDimensionsSupplier>& xSource ,
const std::list<rtl::OUString>& deletedDims)