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

ScUserList and ScUserListData no longer dependent of ScCollection.

üst 3471d7ee
......@@ -31,14 +31,13 @@
#include <tools/stream.hxx>
#include "scdllapi.h"
#include "collect.hxx"
#include <boost/ptr_container/ptr_vector.hpp>
/**
* Stores individual user-defined sort list.
*/
class SC_DLLPUBLIC ScUserListData : public ScDataObject
class SC_DLLPUBLIC ScUserListData
{
public:
struct SubStr
......@@ -57,9 +56,7 @@ private:
public:
ScUserListData(const ::rtl::OUString& rStr);
ScUserListData(const ScUserListData& rData);
virtual ~ScUserListData();
virtual ScDataObject* Clone() const { return new ScUserListData(*this); }
~ScUserListData();
const ::rtl::OUString& GetString() const { return aStr; }
void SetString(const ::rtl::OUString& rStr);
......@@ -73,22 +70,35 @@ public:
/**
* Collection of user-defined sort lists.
*/
class SC_DLLPUBLIC ScUserList : public ScCollection
class SC_DLLPUBLIC ScUserList
{
typedef ::boost::ptr_vector<ScUserListData> DataType;
DataType maData;
public:
ScUserList( sal_uInt16 nLim = 4, sal_uInt16 nDel = 4);
ScUserList( const ScUserList& rUserList ) : ScCollection ( rUserList ) {}
typedef DataType::iterator iterator;
typedef DataType::const_iterator const_iterator;
virtual ScDataObject* Clone() const;
ScUserList();
ScUserList(const ScUserList& r);
ScUserListData* GetData( const ::rtl::OUString& rSubStr ) const;
const ScUserListData* GetData( const ::rtl::OUString& rSubStr ) const;
/// If the list in rStr is already inserted
bool HasEntry( const ::rtl::OUString& rStr ) const;
ScUserListData* operator[]( const sal_uInt16 nIndex) const;
const ScUserListData* operator[](size_t nIndex) const;
ScUserListData* operator[](size_t nIndex);
ScUserList& operator= ( const ScUserList& r );
bool operator==( const ScUserList& r ) const;
bool operator!=( const ScUserList& r ) const;
iterator begin();
iterator end();
const_iterator begin() const;
const_iterator end() const;
void clear();
size_t size() const;
void push_back(ScUserListData* p);
void erase(iterator itr);
};
#endif
......
......@@ -427,9 +427,8 @@ short ScTable::CompareCell( sal_uInt16 nSort,
if (bUserDef)
{
ScUserListData* pData =
static_cast<ScUserListData*>( (ScGlobal::GetUserList()->At(
aSortParam.nUserIndex)) );
ScUserList* pList = ScGlobal::GetUserList();
const ScUserListData* pData = (*pList)[aSortParam.nUserIndex];
if (pData)
{
......
......@@ -219,13 +219,12 @@ void lcl_SetSortList( const Any& rValue )
if (!bDefault)
{
aList.FreeAll();
aList.clear();
for (long i=0; i<nCount; i++)
{
ScUserListData* pNew = new ScUserListData( pArray[i] );
if ( !aList.Insert(pNew) )
delete pNew;
aList.push_back(pNew);
}
}
......@@ -238,10 +237,10 @@ void lcl_GetSortList( Any& rDest )
const ScUserList* pUserList = ScGlobal::GetUserList();
if (pUserList)
{
long nCount = pUserList->GetCount();
size_t nCount = pUserList->size();
Sequence<OUString> aSeq( nCount );
OUString* pArray = aSeq.getArray();
for (long i=0; i<nCount; i++)
for (size_t i=0; i<nCount; ++i)
pArray[i] = (*pUserList)[sal::static_int_cast<sal_uInt16>(i)]->GetString();
rDest <<= aSeq;
}
......
......@@ -41,6 +41,8 @@
#include <unotools/calendarwrapper.hxx>
#include <unotools/transliterationwrapper.hxx>
#include <boost/bind.hpp>
using ::rtl::OUString;
namespace {
......@@ -108,7 +110,6 @@ ScUserListData::ScUserListData(const OUString& rStr) :
}
ScUserListData::ScUserListData(const ScUserListData& rData) :
ScDataObject(),
aStr(rData.aStr)
{
InitTokens();
......@@ -212,8 +213,7 @@ StringCompare ScUserListData::ICompare(const OUString& rSubStr1, const OUString&
return (StringCompare) ScGlobal::GetpTransliteration()->compareString( rSubStr1, rSubStr2 );
}
ScUserList::ScUserList(sal_uInt16 nLim, sal_uInt16 nDel) :
ScCollection ( nLim, nDel )
ScUserList::ScUserList()
{
using namespace ::com::sun::star;
......@@ -250,9 +250,9 @@ ScUserList::ScUserList(sal_uInt16 nLim, sal_uInt16 nDel) :
sDayLong += String( xCal[i].FullName );
if ( !HasEntry( sDayShort ) )
Insert( new ScUserListData( sDayShort ));
maData.push_back( new ScUserListData( sDayShort ));
if ( !HasEntry( sDayLong ) )
Insert( new ScUserListData( sDayLong ));
maData.push_back( new ScUserListData( sDayLong ));
}
xCal = xCalendars[j].Months;
......@@ -272,58 +272,58 @@ ScUserList::ScUserList(sal_uInt16 nLim, sal_uInt16 nDel) :
sMonthLong += String( xCal[i].FullName );
if ( !HasEntry( sMonthShort ) )
Insert( new ScUserListData( sMonthShort ));
maData.push_back( new ScUserListData( sMonthShort ));
if ( !HasEntry( sMonthLong ) )
Insert( new ScUserListData( sMonthLong ));
maData.push_back( new ScUserListData( sMonthLong ));
}
}
}
ScDataObject* ScUserList::Clone() const
ScUserList::ScUserList(const ScUserList& r) :
maData(r.maData) {}
const ScUserListData* ScUserList::GetData(const OUString& rSubStr) const
{
return ( new ScUserList( *this ) );
DataType::const_iterator itr = maData.begin(), itrEnd = maData.end();
for (; itr != itrEnd; ++itr)
{
sal_uInt16 nIndex;
if (itr->GetSubIndex(rSubStr, nIndex))
return &(*itr);
}
return NULL;
}
ScUserListData* ScUserList::GetData(const OUString& rSubStr) const
const ScUserListData* ScUserList::operator[](size_t nIndex) const
{
sal_uInt16 nIndex;
sal_uInt16 i = 0;
for (i=0; i < nCount; i++)
if (((ScUserListData*)pItems[i])->GetSubIndex(rSubStr, nIndex))
return (ScUserListData*)pItems[i];
return NULL;
return &maData[nIndex];
}
ScUserListData* ScUserList::operator[]( const sal_uInt16 nIndex) const
ScUserListData* ScUserList::operator[](size_t nIndex)
{
return (ScUserListData*)At(nIndex);
return &maData[nIndex];
}
ScUserList& ScUserList::operator=( const ScUserList& r )
{
return (ScUserList&)ScCollection::operator=( r );
maData = r.maData;
return *this;
}
bool ScUserList::operator==( const ScUserList& r ) const
{
bool bEqual = (nCount == r.nCount);
if (size() != r.size())
return false;
if ( bEqual )
DataType::const_iterator itr1 = maData.begin(), itr2 = r.maData.begin(), itrEnd = maData.end();
for (; itr1 != itrEnd; ++itr1, ++itr2)
{
ScUserListData* pMyData = NULL;
ScUserListData* pOtherData = NULL;
for ( sal_uInt16 i=0; i<nCount && bEqual; i++)
{
pMyData = (ScUserListData*)At(i);
pOtherData = (ScUserListData*)r.At(i);
bEqual = ((pMyData->GetSubCount() == pOtherData->GetSubCount())
&& (pMyData->GetString() == pOtherData->GetString()) );
}
const ScUserListData& v1 = *itr1;
const ScUserListData& v2 = *itr2;
if (v1.GetString() != v2.GetString() || v1.GetSubCount() != v2.GetSubCount())
return false;
}
return bEqual;
return true;
}
bool ScUserList::operator!=( const ScUserList& r ) const
......@@ -334,13 +334,49 @@ bool ScUserList::operator!=( const ScUserList& r ) const
bool ScUserList::HasEntry( const OUString& rStr ) const
{
for ( sal_uInt16 i=0; i<nCount; i++)
{
const ScUserListData* pMyData = (ScUserListData*) At(i);
if ( pMyData->GetString() == rStr )
return true;
}
return false;
DataType::const_iterator itr = ::std::find_if(
maData.begin(), maData.end(), ::boost::bind(&ScUserListData::GetString, _1) == rStr);
return itr != maData.end();
}
ScUserList::iterator ScUserList::begin()
{
return maData.begin();
}
ScUserList::iterator ScUserList::end()
{
return maData.end();
}
ScUserList::const_iterator ScUserList::begin() const
{
return maData.begin();
}
ScUserList::const_iterator ScUserList::end() const
{
return maData.end();
}
void ScUserList::clear()
{
maData.clear();
}
size_t ScUserList::size() const
{
return maData.size();
}
void ScUserList::push_back(ScUserListData* p)
{
maData.push_back(p);
}
void ScUserList::erase(iterator itr)
{
maData.erase(itr);
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
......@@ -935,9 +935,9 @@ void ScTabPageSortOptions::FillUserSortListBox()
aLbSortUser.Clear();
if ( pUserLists )
{
sal_uInt16 nCount = pUserLists->GetCount();
size_t nCount = pUserLists->size();
if ( nCount > 0 )
for ( sal_uInt16 i=0; i<nCount; i++ )
for ( size_t i=0; i<nCount; ++i )
aLbSortUser.InsertEntry( (*pUserLists)[i]->GetString() );
}
}
......
......@@ -617,10 +617,9 @@ void ScTpSubTotalOptions::FillUserSortListBox()
aLbUserDef.Clear();
if ( pUserLists )
{
sal_uInt16 nCount = pUserLists->GetCount();
if ( nCount > 0 )
for ( sal_uInt16 i=0; i<nCount; i++ )
aLbUserDef.InsertEntry( (*pUserLists)[i]->GetString() );
size_t nCount = pUserLists->size();
for ( size_t i=0; i<nCount; ++i )
aLbUserDef.InsertEntry( (*pUserLists)[i]->GetString() );
}
}
......
......@@ -96,10 +96,10 @@ private:
private:
void Init ();
sal_uInt16 UpdateUserListBox ();
void UpdateEntries ( sal_uInt16 nList );
void UpdateEntries ( size_t nList );
void MakeListStr ( String& rListStr );
void AddNewList ( const String& rEntriesStr );
void RemoveList ( sal_uInt16 nList );
void RemoveList ( size_t nList );
void ModifyList ( sal_uInt16 nSelList,
const String& rEntriesStr );
void CopyListFromArea ( const ScRefAddress& rStartPos,
......
......@@ -289,17 +289,14 @@ sal_uInt16 ScTpUserLists::UpdateUserListBox()
//----------------------------------------------------------
sal_uInt16 nCount = pUserLists->GetCount();
size_t nCount = pUserLists->size();
String aEntry;
if ( nCount > 0 )
for ( size_t i=0; i<nCount; ++i )
{
for ( sal_uInt16 i=0; i<nCount; i++ )
{
aEntry = (*pUserLists)[i]->GetString();
OSL_ENSURE( aEntry.Len() > 0, "Empty UserList-entry :-/" );
aLbLists.InsertEntry( aEntry );
}
aEntry = (*pUserLists)[i]->GetString();
OSL_ENSURE( aEntry.Len() > 0, "Empty UserList-entry :-/" );
aLbLists.InsertEntry( aEntry );
}
return nCount;
......@@ -307,15 +304,15 @@ sal_uInt16 ScTpUserLists::UpdateUserListBox()
// -----------------------------------------------------------------------
void ScTpUserLists::UpdateEntries( sal_uInt16 nList )
void ScTpUserLists::UpdateEntries( size_t nList )
{
if ( !pUserLists ) return;
//----------------------------------------------------------
if ( nList < pUserLists->GetCount() )
if ( nList < pUserLists->size() )
{
ScUserListData* pList = (*pUserLists)[nList];
const ScUserListData* pList = (*pUserLists)[nList];
sal_uInt16 nSubCount = pList->GetSubCount();
String aEntryListStr;
......@@ -393,10 +390,7 @@ void ScTpUserLists::AddNewList( const String& rEntriesStr )
MakeListStr( theEntriesStr );
if ( !pUserLists->Insert( new ScUserListData( theEntriesStr ) ) )
{
OSL_FAIL( "Entry could not be inserted :-/" );
}
pUserLists->push_back(new ScUserListData(theEntriesStr));
}
// -----------------------------------------------------------------------
......@@ -509,9 +503,14 @@ void ScTpUserLists::ModifyList( sal_uInt16 nSelList,
// -----------------------------------------------------------------------
void ScTpUserLists::RemoveList( sal_uInt16 nList )
void ScTpUserLists::RemoveList( size_t nList )
{
if ( pUserLists ) pUserLists->AtFree( nList );
if (pUserLists && nList < pUserLists->size())
{
ScUserList::iterator itr = pUserLists->begin();
::std::advance(itr, nList);
pUserLists->erase(itr);
}
}
//-----------------------------------------------------------------------
......
......@@ -522,15 +522,14 @@ void SAL_CALL ScSpreadsheetSettings::setPropertyValue(
// es wird direkt die "lebende" Liste veraendert,
// mehr tut ScGlobal::SetUserList auch nicht
pUserList->FreeAll(); // alle Eintraege raus
pUserList->clear(); // alle Eintraege raus
sal_uInt16 nCount = (sal_uInt16)aSeq.getLength();
const rtl::OUString* pAry = aSeq.getConstArray();
for (sal_uInt16 i=0; i<nCount; i++)
{
String aEntry = pAry[i];
ScUserListData* pData = new ScUserListData(aEntry);
if (!pUserList->Insert(pData)) // hinten anhaengen
delete pData; // sollte nicht vorkommen
pUserList->push_back(pData);
}
bSaveApp = sal_True; // Liste wird mit den App-Optionen gespeichert
}
......@@ -603,10 +602,10 @@ uno::Any SAL_CALL ScSpreadsheetSettings::getPropertyValue( const rtl::OUString&
ScUserList* pUserList = ScGlobal::GetUserList();
if (pUserList)
{
sal_uInt16 nCount = pUserList->GetCount();
size_t nCount = pUserList->size();
uno::Sequence<rtl::OUString> aSeq(nCount);
rtl::OUString* pAry = aSeq.getArray();
for (sal_uInt16 i=0; i<nCount; i++)
for (size_t i=0; i<nCount; ++i)
{
String aEntry((*pUserList)[i]->GetString());
pAry[i] = aEntry;
......
......@@ -1803,12 +1803,12 @@ bool ScDBFunc::DataPilotSort( const ScAddress& rPos, bool bAscending, sal_uInt16
return false;
{
sal_uInt16 n = pUserList->GetCount();
if (!n || *pUserListId >= n)
size_t n = pUserList->size();
if (!n || *pUserListId >= static_cast<sal_uInt16>(n))
return false;
}
ScUserListData* pData = static_cast<ScUserListData*>((*pUserList)[*pUserListId]);
const ScUserListData* pData = (*pUserList)[*pUserListId];
if (pData)
{
sal_uInt16 n = pData->GetSubCount();
......
......@@ -490,11 +490,11 @@ void ScGridWindow::DPLaunchFieldPopupMenu(
ScUserList* pUserList = ScGlobal::GetUserList();
if (pUserList)
{
sal_uInt16 n = pUserList->GetCount();
size_t n = pUserList->size();
aUserSortNames.reserve(n);
for (sal_uInt16 i = 0; i < n; ++i)
for (size_t i = 0; i < n; ++i)
{
ScUserListData* pData = static_cast<ScUserListData*>((*pUserList)[i]);
const ScUserListData* pData = (*pUserList)[i];
aUserSortNames.push_back(pData->GetString());
}
}
......
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