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

String to rtl::OUString & sal_Bool to bool in ScUserList et. al.

üst 6882d598
...@@ -33,34 +33,46 @@ ...@@ -33,34 +33,46 @@
#include "scdllapi.h" #include "scdllapi.h"
#include "collect.hxx" #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 ScDataObject
{ {
friend class ScUserList; public:
String aStr; struct SubStr
sal_uInt16 nTokenCount; {
String* pSubStrings; ::rtl::OUString maReal;
String* pUpperSub; ::rtl::OUString maUpper;
SubStr(const ::rtl::OUString& rReal, const ::rtl::OUString& rUpper);
};
private:
typedef ::boost::ptr_vector<SubStr> SubStringsType;
SubStringsType maSubStrings;
::rtl::OUString aStr;
SC_DLLPRIVATE void InitTokens(); SC_DLLPRIVATE void InitTokens();
public: public:
ScUserListData(const String& rStr); ScUserListData(const ::rtl::OUString& rStr);
ScUserListData(const ScUserListData& rData); ScUserListData(const ScUserListData& rData);
virtual ~ScUserListData(); virtual ~ScUserListData();
virtual ScDataObject* Clone() const { return new ScUserListData(*this); } virtual ScDataObject* Clone() const { return new ScUserListData(*this); }
const String& GetString() const { return aStr; } const ::rtl::OUString& GetString() const { return aStr; }
void SetString( const String& rStr); void SetString(const ::rtl::OUString& rStr);
sal_uInt16 GetSubCount() const; size_t GetSubCount() const;
sal_Bool GetSubIndex(const String& rSubStr, sal_uInt16& rIndex) const; bool GetSubIndex(const ::rtl::OUString& rSubStr, sal_uInt16& rIndex) const;
String GetSubStr(sal_uInt16 nIndex) const; ::rtl::OUString GetSubStr(sal_uInt16 nIndex) const;
StringCompare Compare(const String& rSubStr1, const String& rSubStr2) const; StringCompare Compare(const ::rtl::OUString& rSubStr1, const ::rtl::OUString& rSubStr2) const;
StringCompare ICompare(const String& rSubStr1, const String& rSubStr2) const; StringCompare ICompare(const ::rtl::OUString& rSubStr1, const ::rtl::OUString& rSubStr2) const;
}; };
//------------------------------------------------------------------------ /**
* Collection of user-defined sort lists.
*/
class SC_DLLPUBLIC ScUserList : public ScCollection class SC_DLLPUBLIC ScUserList : public ScCollection
{ {
public: public:
...@@ -69,25 +81,16 @@ public: ...@@ -69,25 +81,16 @@ public:
virtual ScDataObject* Clone() const; virtual ScDataObject* Clone() const;
ScUserListData* GetData( const String& rSubStr ) const; ScUserListData* GetData( const ::rtl::OUString& rSubStr ) const;
/// If the list in rStr is already inserted /// If the list in rStr is already inserted
sal_Bool HasEntry( const String& rStr ) const; bool HasEntry( const ::rtl::OUString& rStr ) const;
inline ScUserListData* operator[]( const sal_uInt16 nIndex) const; ScUserListData* operator[]( const sal_uInt16 nIndex) const;
inline ScUserList& operator= ( const ScUserList& r ); ScUserList& operator= ( const ScUserList& r );
sal_Bool operator==( const ScUserList& r ) const; bool operator==( const ScUserList& r ) const;
inline sal_Bool operator!=( const ScUserList& r ) const; bool operator!=( const ScUserList& r ) const;
}; };
inline ScUserList& ScUserList::operator=( const ScUserList& r )
{ return (ScUserList&)ScCollection::operator=( r ); }
inline ScUserListData* ScUserList::operator[]( const sal_uInt16 nIndex) const
{ return (ScUserListData*)At(nIndex); }
inline sal_Bool ScUserList::operator!=( const ScUserList& r ) const
{ return !operator==( r ); }
#endif #endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -34,7 +34,6 @@ ...@@ -34,7 +34,6 @@
//------------------------------------------------------------------------ //------------------------------------------------------------------------
#include <unotools/charclass.hxx> #include <unotools/charclass.hxx>
#include <string.h>
#include "global.hxx" #include "global.hxx"
#include "userlist.hxx" #include "userlist.hxx"
...@@ -42,30 +41,64 @@ ...@@ -42,30 +41,64 @@
#include <unotools/calendarwrapper.hxx> #include <unotools/calendarwrapper.hxx>
#include <unotools/transliterationwrapper.hxx> #include <unotools/transliterationwrapper.hxx>
// STATIC DATA ----------------------------------------------------------- using ::rtl::OUString;
namespace {
//------------------------------------------------------------------------ class FindByName : public ::std::unary_function<ScUserListData::SubStr, bool>
{
const OUString& mrName;
bool mbUpper;
public:
FindByName(const OUString& rName, bool bUpper) : mrName(rName), mbUpper(bUpper) {}
bool operator() (const ScUserListData::SubStr& r) const
{
return mbUpper ? r.maUpper.equals(mrName) : r.maReal.equals(mrName);
}
};
}
ScUserListData::SubStr::SubStr(const OUString& rReal, const OUString& rUpper) :
maReal(rReal), maUpper(rUpper) {}
void ScUserListData::InitTokens() void ScUserListData::InitTokens()
{ {
sal_Unicode cSep = ScGlobal::cListDelimiter; sal_Unicode cSep = ScGlobal::cListDelimiter;
nTokenCount = (sal_uInt16) aStr.GetTokenCount(cSep); maSubStrings.clear();
if (nTokenCount) const sal_Unicode* p = aStr.getStr();
const sal_Unicode* p0 = p;
sal_Int32 nLen = 0;
bool bFirst = true;
for (sal_Int32 i = 0, n = aStr.getLength(); i < n; ++i, ++p, ++nLen)
{ {
pSubStrings = new String[nTokenCount]; if (bFirst)
pUpperSub = new String[nTokenCount]; {
for (sal_uInt16 i=0; i<nTokenCount; i++) // very first character, or the first character after a separator.
p0 = p;
nLen = 0;
bFirst = false;
}
if (*p == cSep && nLen)
{ {
pUpperSub[i] = pSubStrings[i] = aStr.GetToken((xub_StrLen)i,cSep); OUString aSub(p0, nLen);
ScGlobal::pCharClass->toUpper(pUpperSub[i]); String aUpStr = aSub;
ScGlobal::pCharClass->toUpper(aUpStr);
maSubStrings.push_back(new SubStr(aSub, aUpStr));
bFirst = true;
} }
} }
else
pSubStrings = pUpperSub = NULL; if (nLen)
{
OUString aSub(p0, nLen);
String aUpStr = aSub;
ScGlobal::pCharClass->toUpper(aUpStr);
maSubStrings.push_back(new SubStr(aSub, aUpStr));
}
} }
ScUserListData::ScUserListData(const String& rStr) : ScUserListData::ScUserListData(const OUString& rStr) :
aStr(rStr) aStr(rStr)
{ {
InitTokens(); InitTokens();
...@@ -80,60 +113,57 @@ ScUserListData::ScUserListData(const ScUserListData& rData) : ...@@ -80,60 +113,57 @@ ScUserListData::ScUserListData(const ScUserListData& rData) :
ScUserListData::~ScUserListData() ScUserListData::~ScUserListData()
{ {
delete[] pSubStrings;
delete[] pUpperSub;
} }
void ScUserListData::SetString( const String& rStr ) void ScUserListData::SetString( const OUString& rStr )
{ {
delete[] pSubStrings;
delete[] pUpperSub;
aStr = rStr; aStr = rStr;
InitTokens(); InitTokens();
} }
sal_uInt16 ScUserListData::GetSubCount() const size_t ScUserListData::GetSubCount() const
{ {
return nTokenCount; return maSubStrings.size();
} }
sal_Bool ScUserListData::GetSubIndex(const String& rSubStr, sal_uInt16& rIndex) const bool ScUserListData::GetSubIndex(const OUString& rSubStr, sal_uInt16& rIndex) const
{ {
sal_uInt16 i; // First, case sensitive search.
for (i=0; i<nTokenCount; i++) SubStringsType::const_iterator itr = ::std::find_if(
if (rSubStr == pSubStrings[i]) maSubStrings.begin(), maSubStrings.end(), FindByName(rSubStr, false));
{ if (itr != maSubStrings.end())
rIndex = i; {
return sal_True; rIndex = ::std::distance(maSubStrings.begin(), itr);
} return true;
}
String aUpStr = rSubStr;
ScGlobal::pCharClass->toUpper(aUpStr);
for (i=0; i<nTokenCount; i++)
if (aUpStr == pUpperSub[i])
{
rIndex = i;
return sal_True;
}
// When that fails, do a case insensitive search.
String aTmp = rSubStr;
ScGlobal::pCharClass->toUpper(aTmp);
OUString aUpStr = aTmp;
itr = ::std::find_if(
maSubStrings.begin(), maSubStrings.end(), FindByName(aUpStr, true));
if (itr != maSubStrings.end())
{
rIndex = ::std::distance(maSubStrings.begin(), itr);
return true;
}
return false; return false;
} }
String ScUserListData::GetSubStr(sal_uInt16 nIndex) const OUString ScUserListData::GetSubStr(sal_uInt16 nIndex) const
{ {
if (nIndex < nTokenCount) if (nIndex < maSubStrings.size())
return pSubStrings[nIndex]; return maSubStrings[nIndex].maReal;
else else
return EMPTY_STRING; return OUString();
} }
StringCompare ScUserListData::Compare(const String& rSubStr1, const String& rSubStr2) const StringCompare ScUserListData::Compare(const OUString& rSubStr1, const OUString& rSubStr2) const
{ {
sal_uInt16 nIndex1; sal_uInt16 nIndex1, nIndex2;
sal_uInt16 nIndex2; bool bFound1 = GetSubIndex(rSubStr1, nIndex1);
sal_Bool bFound1 = GetSubIndex(rSubStr1, nIndex1); bool bFound2 = GetSubIndex(rSubStr2, nIndex2);
sal_Bool bFound2 = GetSubIndex(rSubStr2, nIndex2);
if (bFound1) if (bFound1)
{ {
if (bFound2) if (bFound2)
...@@ -154,12 +184,11 @@ StringCompare ScUserListData::Compare(const String& rSubStr1, const String& rSub ...@@ -154,12 +184,11 @@ StringCompare ScUserListData::Compare(const String& rSubStr1, const String& rSub
return (StringCompare) ScGlobal::GetCaseTransliteration()->compareString( rSubStr1, rSubStr2 ); return (StringCompare) ScGlobal::GetCaseTransliteration()->compareString( rSubStr1, rSubStr2 );
} }
StringCompare ScUserListData::ICompare(const String& rSubStr1, const String& rSubStr2) const StringCompare ScUserListData::ICompare(const OUString& rSubStr1, const OUString& rSubStr2) const
{ {
sal_uInt16 nIndex1; sal_uInt16 nIndex1, nIndex2;
sal_uInt16 nIndex2; bool bFound1 = GetSubIndex(rSubStr1, nIndex1);
sal_Bool bFound1 = GetSubIndex(rSubStr1, nIndex1); bool bFound2 = GetSubIndex(rSubStr2, nIndex2);
sal_Bool bFound2 = GetSubIndex(rSubStr2, nIndex2);
if (bFound1) if (bFound1)
{ {
if (bFound2) if (bFound2)
...@@ -252,7 +281,7 @@ ScDataObject* ScUserList::Clone() const ...@@ -252,7 +281,7 @@ ScDataObject* ScUserList::Clone() const
return ( new ScUserList( *this ) ); return ( new ScUserList( *this ) );
} }
ScUserListData* ScUserList::GetData(const String& rSubStr) const ScUserListData* ScUserList::GetData(const OUString& rSubStr) const
{ {
sal_uInt16 nIndex; sal_uInt16 nIndex;
sal_uInt16 i = 0; sal_uInt16 i = 0;
...@@ -262,9 +291,19 @@ ScUserListData* ScUserList::GetData(const String& rSubStr) const ...@@ -262,9 +291,19 @@ ScUserListData* ScUserList::GetData(const String& rSubStr) const
return NULL; return NULL;
} }
sal_Bool ScUserList::operator==( const ScUserList& r ) const ScUserListData* ScUserList::operator[]( const sal_uInt16 nIndex) const
{
return (ScUserListData*)At(nIndex);
}
ScUserList& ScUserList::operator=( const ScUserList& r )
{
return (ScUserList&)ScCollection::operator=( r );
}
bool ScUserList::operator==( const ScUserList& r ) const
{ {
sal_Bool bEqual = (nCount == r.nCount); bool bEqual = (nCount == r.nCount);
if ( bEqual ) if ( bEqual )
{ {
...@@ -276,22 +315,27 @@ sal_Bool ScUserList::operator==( const ScUserList& r ) const ...@@ -276,22 +315,27 @@ sal_Bool ScUserList::operator==( const ScUserList& r ) const
pMyData = (ScUserListData*)At(i); pMyData = (ScUserListData*)At(i);
pOtherData = (ScUserListData*)r.At(i); pOtherData = (ScUserListData*)r.At(i);
bEqual =( (pMyData->nTokenCount == pOtherData->nTokenCount) bEqual = ((pMyData->GetSubCount() == pOtherData->GetSubCount())
&& (pMyData->aStr == pOtherData->aStr) ); && (pMyData->GetString() == pOtherData->GetString()) );
} }
} }
return bEqual; return bEqual;
} }
bool ScUserList::operator!=( const ScUserList& r ) const
{
return !operator==( r );
}
sal_Bool ScUserList::HasEntry( const String& rStr ) const bool ScUserList::HasEntry( const OUString& rStr ) const
{ {
for ( sal_uInt16 i=0; i<nCount; i++) for ( sal_uInt16 i=0; i<nCount; i++)
{ {
const ScUserListData* pMyData = (ScUserListData*) At(i); const ScUserListData* pMyData = (ScUserListData*) At(i);
if ( pMyData->aStr == rStr ) if ( pMyData->GetString() == rStr )
return sal_True; return true;
} }
return false; return false;
} }
......
...@@ -323,7 +323,7 @@ void ScTpUserLists::UpdateEntries( sal_uInt16 nList ) ...@@ -323,7 +323,7 @@ void ScTpUserLists::UpdateEntries( sal_uInt16 nList )
{ {
if ( i!=0 ) if ( i!=0 )
aEntryListStr += CR; aEntryListStr += CR;
aEntryListStr += pList->GetSubStr( i ); aEntryListStr += String(pList->GetSubStr(i));
} }
aEntryListStr.ConvertLineEnd(); aEntryListStr.ConvertLineEnd();
......
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