[Libreoffice-commits] .: sc/inc sc/source

Kohei Yoshida kohei at kemper.freedesktop.org
Sat May 28 22:14:04 PDT 2011


 sc/inc/userlist.hxx              |   75 +++++++++--------
 sc/source/core/tool/userlist.cxx |  164 ++++++++++++++++++++++++---------------
 sc/source/ui/optdlg/tpusrlst.cxx |    2 
 3 files changed, 144 insertions(+), 97 deletions(-)

New commits:
commit a98e2f4a692b100313bed8ce9298fff19ad7f144
Author: Kohei Yoshida <kyoshida at novell.com>
Date:   Sun May 29 01:12:03 2011 -0400

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

diff --git a/sc/inc/userlist.hxx b/sc/inc/userlist.hxx
index 5b12b51..add91ed 100644
--- a/sc/inc/userlist.hxx
+++ b/sc/inc/userlist.hxx
@@ -33,34 +33,46 @@
 #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
 {
-friend class ScUserList;
-    String	aStr;
-    sal_uInt16	nTokenCount;
-    String* pSubStrings;
-    String* pUpperSub;
+public:
+    struct SubStr
+    {
+        ::rtl::OUString maReal;
+        ::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();
 
 public:
-                    ScUserListData(const String& rStr);
-                    ScUserListData(const ScUserListData& rData);
-    virtual			~ScUserListData();
-
-    virtual	ScDataObject*		Clone() const { return new ScUserListData(*this); }
-
-    const	String&			GetString() const { return aStr; }
-            void			SetString( const String& rStr);
-            sal_uInt16			GetSubCount() const;
-            sal_Bool			GetSubIndex(const String& rSubStr, sal_uInt16& rIndex) const;
-            String			GetSubStr(sal_uInt16 nIndex) const;
-            StringCompare   Compare(const String& rSubStr1, const String& rSubStr2) const;
-            StringCompare   ICompare(const String& rSubStr1, const String& rSubStr2) const;
+    ScUserListData(const ::rtl::OUString& rStr);
+    ScUserListData(const ScUserListData& rData);
+    virtual ~ScUserListData();
+
+    virtual	ScDataObject* Clone() const { return new ScUserListData(*this); }
+
+    const ::rtl::OUString& GetString() const { return aStr; }
+    void SetString(const ::rtl::OUString& rStr);
+    size_t GetSubCount() const;
+    bool GetSubIndex(const ::rtl::OUString& rSubStr, sal_uInt16& rIndex) const;
+    ::rtl::OUString GetSubStr(sal_uInt16 nIndex) const;
+    StringCompare Compare(const ::rtl::OUString& rSubStr1, const ::rtl::OUString& 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
 {
 public:
@@ -69,25 +81,16 @@ public:
 
     virtual	ScDataObject*		Clone() const;
 
-            ScUserListData*	GetData( const String& rSubStr ) const;
-            /// If the list in rStr is already inserted
-            sal_Bool            HasEntry( const String& rStr ) const;
+    ScUserListData*	GetData( const ::rtl::OUString& rSubStr ) const;
+    /// If the list in rStr is already inserted
+    bool HasEntry( const ::rtl::OUString& rStr ) const;
 
-    inline	ScUserListData*	operator[]( const sal_uInt16 nIndex) const;
-    inline	ScUserList&		operator= ( const ScUserList& r );
-            sal_Bool			operator==( const ScUserList& r ) const;
-    inline  sal_Bool			operator!=( const ScUserList& r ) const;
+    ScUserListData*  operator[]( const sal_uInt16 nIndex) const;
+    ScUserList&     operator= ( const ScUserList& r );
+    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
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/core/tool/userlist.cxx b/sc/source/core/tool/userlist.cxx
index 7ba6eed..ebef40a 100644
--- a/sc/source/core/tool/userlist.cxx
+++ b/sc/source/core/tool/userlist.cxx
@@ -34,7 +34,6 @@
 //------------------------------------------------------------------------
 
 #include <unotools/charclass.hxx>
-#include <string.h>
 
 #include "global.hxx"
 #include "userlist.hxx"
@@ -42,30 +41,64 @@
 #include <unotools/calendarwrapper.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()
 {
     sal_Unicode cSep = ScGlobal::cListDelimiter;
-    nTokenCount = (sal_uInt16) aStr.GetTokenCount(cSep);
-    if (nTokenCount)
+    maSubStrings.clear();
+    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];
-        pUpperSub   = new String[nTokenCount];
-        for (sal_uInt16 i=0; i<nTokenCount; i++)
+        if (bFirst)
+        {
+            // 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);
-            ScGlobal::pCharClass->toUpper(pUpperSub[i]);
+            OUString aSub(p0, nLen);
+            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)
 {
     InitTokens();
@@ -80,60 +113,57 @@ ScUserListData::ScUserListData(const ScUserListData& rData) :
 
 ScUserListData::~ScUserListData()
 {
-    delete[] pSubStrings;
-    delete[] pUpperSub;
 }
 
-void ScUserListData::SetString( const String& rStr )
+void ScUserListData::SetString( const OUString& rStr )
 {
-    delete[] pSubStrings;
-    delete[] pUpperSub;
-
     aStr = rStr;
     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;
-    for (i=0; i<nTokenCount; i++)
-        if (rSubStr == pSubStrings[i])
-        {
-            rIndex = i;
-            return sal_True;
-        }
-
-    String aUpStr = rSubStr;
-    ScGlobal::pCharClass->toUpper(aUpStr);
-    for (i=0; i<nTokenCount; i++)
-        if (aUpStr == pUpperSub[i])
-        {
-            rIndex = i;
-            return sal_True;
-        }
+    // First, case sensitive search.
+    SubStringsType::const_iterator itr = ::std::find_if(
+        maSubStrings.begin(), maSubStrings.end(), FindByName(rSubStr, false));
+    if (itr != maSubStrings.end())
+    {
+        rIndex = ::std::distance(maSubStrings.begin(), itr);
+        return 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;
 }
 
-String ScUserListData::GetSubStr(sal_uInt16 nIndex) const
+OUString ScUserListData::GetSubStr(sal_uInt16 nIndex) const
 {
-    if (nIndex < nTokenCount)
-        return pSubStrings[nIndex];
+    if (nIndex < maSubStrings.size())
+        return maSubStrings[nIndex].maReal;
     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 nIndex2;
-    sal_Bool bFound1 = GetSubIndex(rSubStr1, nIndex1);
-    sal_Bool bFound2 = GetSubIndex(rSubStr2, nIndex2);
+    sal_uInt16 nIndex1, nIndex2;
+    bool bFound1 = GetSubIndex(rSubStr1, nIndex1);
+    bool bFound2 = GetSubIndex(rSubStr2, nIndex2);
     if (bFound1)
     {
         if (bFound2)
@@ -154,12 +184,11 @@ StringCompare ScUserListData::Compare(const String& rSubStr1, const String& rSub
         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 nIndex2;
-    sal_Bool bFound1 = GetSubIndex(rSubStr1, nIndex1);
-    sal_Bool bFound2 = GetSubIndex(rSubStr2, nIndex2);
+    sal_uInt16 nIndex1, nIndex2;
+    bool bFound1 = GetSubIndex(rSubStr1, nIndex1);
+    bool bFound2 = GetSubIndex(rSubStr2, nIndex2);
     if (bFound1)
     {
         if (bFound2)
@@ -252,7 +281,7 @@ ScDataObject* ScUserList::Clone() const
     return ( new ScUserList( *this ) );
 }
 
-ScUserListData* ScUserList::GetData(const String& rSubStr) const
+ScUserListData* ScUserList::GetData(const OUString& rSubStr) const
 {
     sal_uInt16	nIndex;
     sal_uInt16	i = 0;
@@ -262,9 +291,19 @@ ScUserListData* ScUserList::GetData(const String& rSubStr) const
     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 )
     {
@@ -276,22 +315,27 @@ sal_Bool ScUserList::operator==( const ScUserList& r ) const
             pMyData    = (ScUserListData*)At(i);
             pOtherData = (ScUserListData*)r.At(i);
 
-            bEqual =(   (pMyData->nTokenCount == pOtherData->nTokenCount)
-                     && (pMyData->aStr		  == pOtherData->aStr) );
+            bEqual = ((pMyData->GetSubCount() == pOtherData->GetSubCount())
+                     && (pMyData->GetString() == pOtherData->GetString()) );
         }
     }
 
     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++)
     {
         const ScUserListData* pMyData = (ScUserListData*) At(i);
-        if ( pMyData->aStr == rStr )
-            return sal_True;
+        if ( pMyData->GetString() == rStr )
+            return true;
     }
     return false;
 }
diff --git a/sc/source/ui/optdlg/tpusrlst.cxx b/sc/source/ui/optdlg/tpusrlst.cxx
index 7309abc..52f31ee 100644
--- a/sc/source/ui/optdlg/tpusrlst.cxx
+++ b/sc/source/ui/optdlg/tpusrlst.cxx
@@ -323,7 +323,7 @@ void ScTpUserLists::UpdateEntries( sal_uInt16 nList )
         {
             if ( i!=0 )
                 aEntryListStr += CR;
-            aEntryListStr += pList->GetSubStr( i );
+            aEntryListStr += String(pList->GetSubStr(i));
         }
 
         aEntryListStr.ConvertLineEnd();


More information about the Libreoffice-commits mailing list