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

Kohei Yoshida kohei at kemper.freedesktop.org
Tue Nov 15 09:42:36 PST 2011


 sc/source/ui/dbgui/filtdlg.cxx |  200 ++++++++++++++++++++---------------------
 sc/source/ui/inc/filtdlg.hxx   |   22 +++-
 2 files changed, 117 insertions(+), 105 deletions(-)

New commits:
commit 20baf7f8c5f33c4961241b0df2dc93d51fed3a12
Author: Kohei Yoshida <kohei.yoshida at suse.com>
Date:   Tue Nov 15 12:07:33 2011 -0500

    Use size_t and remove static_cast'ing.

diff --git a/sc/source/ui/dbgui/filtdlg.cxx b/sc/source/ui/dbgui/filtdlg.cxx
index ae0f847..daffd24 100644
--- a/sc/source/ui/dbgui/filtdlg.cxx
+++ b/sc/source/ui/dbgui/filtdlg.cxx
@@ -340,7 +340,7 @@ void ScFilterDlg::Init( const SfxItemSet& rArgSet )
         maValueEdArr[i]->SetText( aValStr );
         maValueEdArr[i]->EnableAutocomplete( false );
         maValueEdArr[i]->SetModifyHdl( LINK( this, ScFilterDlg, ValModifyHdl ) );
-        UpdateValueList( static_cast<sal_uInt16>(i+1) );
+        UpdateValueList(i+1);
     }
 
     aScrollBar.SetEndScrollHdl( LINK( this, ScFilterDlg, ScrollHdl ) );
@@ -505,7 +505,7 @@ void ScFilterDlg::FillFieldLists()
 
 //----------------------------------------------------------------------------
 
-void ScFilterDlg::UpdateValueList( sal_uInt16 nList )
+void ScFilterDlg::UpdateValueList( size_t nList )
 {
     if (pDoc && nList > 0 && nList <= QUERY_ENTRY_COUNT)
     {
@@ -527,7 +527,7 @@ void ScFilterDlg::UpdateValueList( sal_uInt16 nList )
             EntryList* pList = NULL;
             if (!maEntryLists.count(nColumn))
             {
-                sal_uInt16 nOffset = GetSliderPos();
+                size_t nOffset = GetSliderPos();
                 SCTAB nTab       = nSrcTab;
                 SCROW nFirstRow = theQueryData.nRow1;
                 SCROW nLastRow   = theQueryData.nRow2;
@@ -590,7 +590,7 @@ void ScFilterDlg::UpdateValueList( sal_uInt16 nList )
     UpdateHdrInValueList( nList );
 }
 
-void ScFilterDlg::UpdateHdrInValueList( sal_uInt16 nList )
+void ScFilterDlg::UpdateHdrInValueList( size_t nList )
 {
     //! GetText / SetText ??
 
@@ -643,7 +643,7 @@ void ScFilterDlg::UpdateHdrInValueList( sal_uInt16 nList )
 
 //----------------------------------------------------------------------------
 
-void ScFilterDlg::ClearValueList( sal_uInt16 nList )
+void ScFilterDlg::ClearValueList( size_t nList )
 {
     if (nList > 0 && nList <= QUERY_ENTRY_COUNT)
     {
@@ -1201,7 +1201,7 @@ void ScFilterDlg::RefreshEditRow( size_t nOffset )
     else
         maConnLbArr[0]->Show();
 
-    for ( sal_uInt16 i=0; i<4; i++ )
+    for (size_t i = 0; i < QUERY_ENTRY_COUNT; ++i)
     {
         rtl::OUString aValStr;
         size_t nCondPos = 0;
@@ -1296,7 +1296,7 @@ void ScFilterDlg::RefreshEditRow( size_t nOffset )
         maFieldLbArr[i]->SelectEntryPos( nFieldSelPos );
         maCondLbArr [i]->SelectEntryPos( nCondPos );
         maValueEdArr[i]->SetText( aValStr );
-        UpdateValueList( static_cast<sal_uInt16>(i+1) );
+        UpdateValueList(i+1);
     }
 }
 
diff --git a/sc/source/ui/inc/filtdlg.hxx b/sc/source/ui/inc/filtdlg.hxx
index 500d01b..693c2d7 100644
--- a/sc/source/ui/inc/filtdlg.hxx
+++ b/sc/source/ui/inc/filtdlg.hxx
@@ -161,9 +161,9 @@ private:
     void            Init            ( const SfxItemSet& rArgSet );
     void            FillFieldLists  ();
     void            FillAreaList    ();
-    void            UpdateValueList ( sal_uInt16 nList );
-    void            UpdateHdrInValueList( sal_uInt16 nList );
-    void            ClearValueList  ( sal_uInt16 nList );
+    void            UpdateValueList ( size_t nList );
+    void            UpdateHdrInValueList( size_t nList );
+    void            ClearValueList  ( size_t nList );
     size_t          GetFieldSelPos  ( SCCOL nField );
     ScQueryItem*    GetOutputItem   ();
 
commit 6a4fc2cb91f933f4bc79a546547c00ee17ce5d8b
Author: Kohei Yoshida <kohei.yoshida at suse.com>
Date:   Tue Nov 15 12:02:51 2011 -0500

    More cleanups.

diff --git a/sc/source/ui/dbgui/filtdlg.cxx b/sc/source/ui/dbgui/filtdlg.cxx
index f57a3f0..ae0f847 100644
--- a/sc/source/ui/dbgui/filtdlg.cxx
+++ b/sc/source/ui/dbgui/filtdlg.cxx
@@ -436,7 +436,7 @@ void ScFilterDlg::SetReference( const ScRange& rRef, ScDocument* pDocP )
     {
         if ( rRef.aStart != rRef.aEnd )
             RefInputStart( &aEdCopyArea );
-        String aRefStr;
+        rtl::OUString aRefStr;
         rRef.aStart.Format( aRefStr, SCA_ABS_3D, pDocP, pDocP->GetAddressConvention() );
         aEdCopyArea.SetRefString( aRefStr );
     }
@@ -474,7 +474,7 @@ void ScFilterDlg::FillFieldLists()
 
     if ( pDoc )
     {
-        String  aFieldName;
+        rtl::OUString aFieldName;
         SCTAB   nTab        = nSrcTab;
         SCCOL   nFirstCol   = theQueryData.nCol1;
         SCROW   nFirstRow   = theQueryData.nRow1;
@@ -485,11 +485,13 @@ void ScFilterDlg::FillFieldLists()
         for ( col=nFirstCol; col<=nMaxCol; col++ )
         {
             pDoc->GetString( col, nFirstRow, nTab, aFieldName );
-            if ( !aBtnHeader.IsChecked() || (aFieldName.Len() == 0) )
+            if (!aBtnHeader.IsChecked() || aFieldName.isEmpty())
             {
-                aFieldName  = aStrColumn;
-                aFieldName += ' ';
-                aFieldName += ScColToAlpha( col );
+                rtl::OUStringBuffer aBuf;
+                aBuf.append(aStrColumn);
+                aBuf.append(sal_Unicode(' '));
+                aBuf.append(ScColToAlpha(col));
+                aFieldName = aBuf.makeStringAndClear();
             }
             aLbField1.InsertEntry( aFieldName, i );
             aLbField2.InsertEntry( aFieldName, i );
@@ -510,7 +512,7 @@ void ScFilterDlg::UpdateValueList( sal_uInt16 nList )
         ComboBox*   pValList        = maValueEdArr[nList-1];
         sal_uInt16      nFieldSelPos    = maFieldLbArr[nList-1]->GetSelectEntryPos();
         sal_uInt16      nListPos        = 0;
-        String      aCurValue       = pValList->GetText();
+        rtl::OUString aCurValue = pValList->GetText();
 
         pValList->Clear();
         pValList->InsertEntry( aStrNotEmpty, 0 );
@@ -727,7 +729,7 @@ IMPL_LINK( ScFilterDlg, EndDlgHdl, Button*, pBtn )
 {
     if ( pBtn == &aBtnOk )
     {
-        sal_Bool bAreaInputOk = true;
+        bool bAreaInputOk = true;
 
         if ( aBtnCopyResult.IsChecked() )
         {
@@ -1101,7 +1103,7 @@ IMPL_LINK( ScFilterDlg, ValModifyHdl, ComboBox*, pEd )
     size_t nQE = i + nOffset;
     if ( pEd )
     {
-        String    aStrVal   = pEd->GetText();
+        rtl::OUString aStrVal = pEd->GetText();
         ListBox*  pLbCond   = &aLbCond1;
         ListBox*  pLbField  = &aLbField1;
         if ( pEd == &aEdVal2 )
@@ -1201,9 +1203,9 @@ void ScFilterDlg::RefreshEditRow( size_t nOffset )
 
     for ( sal_uInt16 i=0; i<4; i++ )
     {
-        String  aValStr;
-        sal_uInt16  nCondPos     = 0;
-        sal_uInt16  nFieldSelPos = 0;
+        rtl::OUString aValStr;
+        size_t nCondPos = 0;
+        size_t nFieldSelPos = 0;
         size_t nQE = i + nOffset;
 
         if (maRefreshExceptQuery.size() < nQE + 1)
@@ -1212,7 +1214,7 @@ void ScFilterDlg::RefreshEditRow( size_t nOffset )
         ScQueryEntry& rEntry = theQueryData.GetEntry( nQE);
         if ( rEntry.bDoQuery || maRefreshExceptQuery[nQE] )
         {
-            nCondPos     = (sal_uInt16)rEntry.eOp;
+            nCondPos = static_cast<size_t>(rEntry.eOp);
             if(rEntry.bDoQuery)
                nFieldSelPos = GetFieldSelPos( static_cast<SCCOL>(rEntry.nField) );
 
commit 92b3d2a9038e4f79b22b9ec89424290ca2588e79
Author: Kohei Yoshida <kohei.yoshida at suse.com>
Date:   Tue Nov 15 11:51:50 2011 -0500

    Use the range parser instead of local string parsing.

diff --git a/sc/source/ui/dbgui/filtdlg.cxx b/sc/source/ui/dbgui/filtdlg.cxx
index 44cf29e..f57a3f0 100644
--- a/sc/source/ui/dbgui/filtdlg.cxx
+++ b/sc/source/ui/dbgui/filtdlg.cxx
@@ -674,14 +674,10 @@ ScQueryItem* ScFilterDlg::GetOutputItem()
 
     if ( aBtnCopyResult.IsChecked() )
     {
-        String theCopyStr( aEdCopyArea.GetText() );
-        xub_StrLen nColonPos = theCopyStr.Search( ':' );
-
-        if ( STRING_NOTFOUND != nColonPos )
-            theCopyStr.Erase( nColonPos );
-
-        sal_uInt16 nResult = theCopyPos.Parse( theCopyStr, pDoc, pDoc->GetAddressConvention() );
+        ScRange aTempRange;
+        sal_uInt16 nResult = aTempRange.Parse(aEdCopyArea.GetText(), pDoc, pDoc->GetAddressConvention());
         bCopyPosOk = ( SCA_VALID == (nResult & SCA_VALID) );
+        theCopyPos = aTempRange.aStart;
     }
 
     if ( aBtnCopyResult.IsChecked() && bCopyPosOk )
commit 129ff6855e5f5a591b9b2e00e829164bc676843c
Author: Kohei Yoshida <kohei.yoshida at suse.com>
Date:   Tue Nov 15 11:47:04 2011 -0500

    More cleanups.

diff --git a/sc/source/ui/dbgui/filtdlg.cxx b/sc/source/ui/dbgui/filtdlg.cxx
index cdbfa80..44cf29e 100644
--- a/sc/source/ui/dbgui/filtdlg.cxx
+++ b/sc/source/ui/dbgui/filtdlg.cxx
@@ -132,7 +132,6 @@ ScFilterDlg::ScFilterDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent,
         pViewData       ( NULL ),
         pDoc            ( NULL ),
         nSrcTab         ( 0 ),
-        nFieldCount     ( 0 ),
         bRefInputMode   ( false ),
         pTimer          ( NULL )
 {
@@ -302,15 +301,15 @@ void ScFilterDlg::Init( const SfxItemSet& rArgSet )
 
     for (size_t i = 0; i < QUERY_ENTRY_COUNT; ++i)
     {
-        String  aValStr;
-        sal_uInt16  nCondPos     = 0;
-        sal_uInt16  nFieldSelPos = 0;
+        rtl::OUString aValStr;
+        size_t nCondPos = 0;
+        size_t nFieldSelPos = 0;
 
         ScQueryEntry& rEntry = theQueryData.GetEntry(i);
         if ( rEntry.bDoQuery )
         {
             const ScQueryEntry::Item& rItem = rEntry.GetQueryItem();
-            nCondPos     = (sal_uInt16)rEntry.eOp;
+            nCondPos = static_cast<size_t>(rEntry.eOp);
             nFieldSelPos = GetFieldSelPos( static_cast<SCCOL>(rEntry.nField) );
             if (rEntry.IsQueryByEmpty())
             {
@@ -498,7 +497,6 @@ void ScFilterDlg::FillFieldLists()
             aLbField4.InsertEntry( aFieldName, i );
             i++;
         }
-        nFieldCount = i;
     }
 }
 
@@ -600,7 +598,7 @@ void ScFilterDlg::UpdateHdrInValueList( sal_uInt16 nList )
     if (nList == 0 || nList > QUERY_ENTRY_COUNT)
         return;
 
-    sal_uInt16 nFieldSelPos = maFieldLbArr[nList-1]->GetSelectEntryPos();
+    size_t nFieldSelPos = maFieldLbArr[nList-1]->GetSelectEntryPos();
     if (!nFieldSelPos)
         return;
 
@@ -625,9 +623,9 @@ void ScFilterDlg::UpdateHdrInValueList( sal_uInt16 nList )
         return;
     }
 
-    String aHdrStr = pHdrEntry->GetString();
-    sal_Bool bWasThere = ( pValList->GetEntry(nListPos) == aHdrStr );
-    sal_Bool bInclude = !aBtnHeader.IsChecked();
+    rtl::OUString aHdrStr = pHdrEntry->GetString();
+    bool bWasThere = aHdrStr.equals(pValList->GetEntry(nListPos));
+    bool bInclude = !aBtnHeader.IsChecked();
 
     if (bInclude)           // Include entry
     {
@@ -658,10 +656,10 @@ void ScFilterDlg::ClearValueList( sal_uInt16 nList )
 
 //----------------------------------------------------------------------------
 
-sal_uInt16 ScFilterDlg::GetFieldSelPos( SCCOL nField )
+size_t ScFilterDlg::GetFieldSelPos( SCCOL nField )
 {
     if ( nField >= theQueryData.nCol1 && nField <= theQueryData.nCol2 )
-        return static_cast<sal_uInt16>(nField - theQueryData.nCol1 + 1);
+        return static_cast<size_t>(nField - theQueryData.nCol1 + 1);
     else
         return 0;
 }
@@ -672,7 +670,7 @@ ScQueryItem* ScFilterDlg::GetOutputItem()
 {
     ScAddress       theCopyPos;
     ScQueryParam    theParam( theQueryData );
-    sal_Bool            bCopyPosOk = false;
+    bool            bCopyPosOk = false;
 
     if ( aBtnCopyResult.IsChecked() )
     {
diff --git a/sc/source/ui/inc/filtdlg.hxx b/sc/source/ui/inc/filtdlg.hxx
index 79516e0..500d01b 100644
--- a/sc/source/ui/inc/filtdlg.hxx
+++ b/sc/source/ui/inc/filtdlg.hxx
@@ -149,7 +149,6 @@ private:
 
     std::deque<bool>   maHasDates;
     std::deque<bool>   maRefreshExceptQuery;
-    sal_uInt16          nFieldCount;
     bool                bRefInputMode;
 
     EntryListsMap maEntryLists;
@@ -165,7 +164,7 @@ private:
     void            UpdateValueList ( sal_uInt16 nList );
     void            UpdateHdrInValueList( sal_uInt16 nList );
     void            ClearValueList  ( sal_uInt16 nList );
-    sal_uInt16          GetFieldSelPos  ( SCCOL nField );
+    size_t          GetFieldSelPos  ( SCCOL nField );
     ScQueryItem*    GetOutputItem   ();
 
     // Handler:
commit be8d1d48ed3adbd07e911e2b9b232be95850126a
Author: Kohei Yoshida <kohei.yoshida at suse.com>
Date:   Tue Nov 15 11:37:59 2011 -0500

    Reduce scoping level by early bailout.

diff --git a/sc/source/ui/dbgui/filtdlg.cxx b/sc/source/ui/dbgui/filtdlg.cxx
index 094cd3a..cdbfa80 100644
--- a/sc/source/ui/dbgui/filtdlg.cxx
+++ b/sc/source/ui/dbgui/filtdlg.cxx
@@ -594,49 +594,50 @@ void ScFilterDlg::UpdateHdrInValueList( sal_uInt16 nList )
 {
     //! GetText / SetText ??
 
-    if (pDoc && nList > 0 && nList <= QUERY_ENTRY_COUNT)
+    if (!pDoc)
+        return;
+
+    if (nList == 0 || nList > QUERY_ENTRY_COUNT)
+        return;
+
+    sal_uInt16 nFieldSelPos = maFieldLbArr[nList-1]->GetSelectEntryPos();
+    if (!nFieldSelPos)
+        return;
+
+    SCCOL nColumn = theQueryData.nCol1 + static_cast<SCCOL>(nFieldSelPos) - 1;
+    if (!maEntryLists.count(nColumn))
     {
-        sal_uInt16 nFieldSelPos = maFieldLbArr[nList-1]->GetSelectEntryPos();
-        if ( nFieldSelPos )
-        {
-            SCCOL nColumn = theQueryData.nCol1 + static_cast<SCCOL>(nFieldSelPos) - 1;
-            if (maEntryLists.count(nColumn))
-            {
-                size_t nPos = maEntryLists[nColumn].mnHeaderPos;
-                if (nPos != INVALID_HEADER_POS)
-                {
-                    ComboBox* pValList = maValueEdArr[nList-1];
-                    size_t nListPos = nPos + 2;                 // for "empty" and "non-empty"
+        OSL_FAIL("Spalte noch nicht initialisiert");
+        return;
+    }
 
-                    TypedStrData* pHdrEntry = maEntryLists[nColumn].maList[nPos];
-                    if ( pHdrEntry )
-                    {
-                        String aHdrStr = pHdrEntry->GetString();
-                        sal_Bool bWasThere = ( pValList->GetEntry(nListPos) == aHdrStr );
-                        sal_Bool bInclude = !aBtnHeader.IsChecked();
-
-                        if (bInclude)           // Include entry
-                        {
-                            if (!bWasThere)
-                                pValList->InsertEntry(aHdrStr, nListPos);
-                        }
-                        else                    // Omit entry
-                        {
-                            if (bWasThere)
-                                pValList->RemoveEntry(nListPos);
-                        }
-                    }
-                    else
-                    {
-                        OSL_FAIL("Eintag in Liste nicht gefunden");
-                    }
-                }
-            }
-            else
-            {
-                OSL_FAIL("Spalte noch nicht initialisiert");
-            }
-        }
+    size_t nPos = maEntryLists[nColumn].mnHeaderPos;
+    if (nPos == INVALID_HEADER_POS)
+        return;
+
+    ComboBox* pValList = maValueEdArr[nList-1];
+    size_t nListPos = nPos + 2;                 // for "empty" and "non-empty"
+
+    TypedStrData* pHdrEntry = maEntryLists[nColumn].maList[nPos];
+    if (!pHdrEntry)
+    {
+        OSL_FAIL("Eintag in Liste nicht gefunden");
+        return;
+    }
+
+    String aHdrStr = pHdrEntry->GetString();
+    sal_Bool bWasThere = ( pValList->GetEntry(nListPos) == aHdrStr );
+    sal_Bool bInclude = !aBtnHeader.IsChecked();
+
+    if (bInclude)           // Include entry
+    {
+        if (!bWasThere)
+            pValList->InsertEntry(aHdrStr, nListPos);
+    }
+    else                    // Omit entry
+    {
+        if (bWasThere)
+            pValList->RemoveEntry(nListPos);
     }
 }
 
commit 90f9521ba46786e64a36c17ceb2f4424cf53d16f
Author: Kohei Yoshida <kohei.yoshida at suse.com>
Date:   Tue Nov 15 11:33:23 2011 -0500

    Store header position this way.

diff --git a/sc/source/ui/dbgui/filtdlg.cxx b/sc/source/ui/dbgui/filtdlg.cxx
index af87b9f..094cd3a 100644
--- a/sc/source/ui/dbgui/filtdlg.cxx
+++ b/sc/source/ui/dbgui/filtdlg.cxx
@@ -57,6 +57,8 @@
 #undef _FILTDLG_CXX
 #include <vcl/msgbox.hxx>
 
+#include <limits>
+
 using ::rtl::OUString;
 using ::rtl::OUStringBuffer;
 
@@ -64,6 +66,11 @@ using ::rtl::OUStringBuffer;
                                    ScGlobal::GetRscString(rid) ).Execute()
 
 #define QUERY_ENTRY_COUNT 4
+#define INVALID_HEADER_POS std::numeric_limits<size_t>::max()
+
+ScFilterDlg::EntryList::EntryList() :
+    maList(128, 128),
+    mnHeaderPos(INVALID_HEADER_POS) {}
 
 ScFilterDlg::ScFilterDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent,
                           const SfxItemSet& rArgSet )
@@ -517,7 +524,7 @@ void ScFilterDlg::UpdateValueList( sal_uInt16 nList )
             WaitObject aWaiter( this );     // even if only the list box has content
 
             SCCOL nColumn = theQueryData.nCol1 + static_cast<SCCOL>(nFieldSelPos) - 1;
-            TypedScStrCollection* pColl = NULL;
+            EntryList* pList = NULL;
             if (!maEntryLists.count(nColumn))
             {
                 sal_uInt16 nOffset = GetSliderPos();
@@ -530,20 +537,20 @@ void ScFilterDlg::UpdateValueList( sal_uInt16 nList )
 
                 // first without the first line
                 std::pair<EntryListsMap::iterator, bool> r =
-                    maEntryLists.insert(nColumn, new TypedScStrCollection(128, 128));
+                    maEntryLists.insert(nColumn, new EntryList);
                 if (!r.second)
                     // insertion failed.
                     return;
 
-                pColl = r.first->second;
-                pColl->SetCaseSensitive(aBtnCase.IsChecked());
+                pList = r.first->second;
+                pList->maList.SetCaseSensitive(aBtnCase.IsChecked());
                 pDoc->GetFilterEntriesArea( nColumn, nFirstRow+1, nLastRow,
-                                            nTab, *pColl, maHasDates[nOffset+nList-1] );
+                                            nTab, pList->maList, maHasDates[nOffset+nList-1] );
 
                 // Entry for the first line
                 //! Entry (pHdrEntry) doesn't generate collection?
 
-                nHeaderPos[nColumn] = USHRT_MAX;
+                pList->mnHeaderPos = INVALID_HEADER_POS;
                 TypedScStrCollection aHdrColl( 1, 1 );
                 bool bDummy = false;
                 pDoc->GetFilterEntriesArea( nColumn, nFirstRow, nFirstRow,
@@ -552,10 +559,10 @@ void ScFilterDlg::UpdateValueList( sal_uInt16 nList )
                 if ( pHdrEntry )
                 {
                     TypedStrData* pNewEntry = new TypedStrData(*pHdrEntry);
-                    if ( pColl->Insert(pNewEntry) )
+                    if ( pList->maList.Insert(pNewEntry) )
                     {
-                        nHeaderPos[nColumn] = pColl->IndexOf(pNewEntry);
-                        OSL_ENSURE( nHeaderPos[nColumn] != USHRT_MAX,
+                        pList->mnHeaderPos = pList->maList.IndexOf(pNewEntry);
+                        OSL_ENSURE( pList->mnHeaderPos != INVALID_HEADER_POS,
                                     "Header-Eintrag nicht wiedergefunden" );
                     }
                     else
@@ -563,15 +570,15 @@ void ScFilterDlg::UpdateValueList( sal_uInt16 nList )
                 }
             }
             else
-                pColl = &maEntryLists[nColumn];
+                pList = &maEntryLists[nColumn];
 
-            OSL_ASSERT(pColl);
-            sal_uInt16 nValueCount = pColl->GetCount();
+            OSL_ASSERT(pList);
+            sal_uInt16 nValueCount = pList->maList.GetCount();
             if ( nValueCount > 0 )
             {
                 for ( sal_uInt16 i=0; i<nValueCount; i++ )
                 {
-                    pValList->InsertEntry( (*pColl)[i]->GetString(), nListPos );
+                    pValList->InsertEntry(pList->maList[i]->GetString(), nListPos);
                     nListPos++;
                 }
             }
@@ -595,13 +602,13 @@ void ScFilterDlg::UpdateHdrInValueList( sal_uInt16 nList )
             SCCOL nColumn = theQueryData.nCol1 + static_cast<SCCOL>(nFieldSelPos) - 1;
             if (maEntryLists.count(nColumn))
             {
-                sal_uInt16 nPos = nHeaderPos[nColumn];
-                if ( nPos != USHRT_MAX )
+                size_t nPos = maEntryLists[nColumn].mnHeaderPos;
+                if (nPos != INVALID_HEADER_POS)
                 {
                     ComboBox* pValList = maValueEdArr[nList-1];
-                    sal_uInt16 nListPos = nPos + 2;                 // for "empty" and "non-empty"
+                    size_t nListPos = nPos + 2;                 // for "empty" and "non-empty"
 
-                    TypedStrData* pHdrEntry = maEntryLists[nColumn][nPos];
+                    TypedStrData* pHdrEntry = maEntryLists[nColumn].maList[nPos];
                     if ( pHdrEntry )
                     {
                         String aHdrStr = pHdrEntry->GetString();
diff --git a/sc/source/ui/inc/filtdlg.hxx b/sc/source/ui/inc/filtdlg.hxx
index b28797f..79516e0 100644
--- a/sc/source/ui/inc/filtdlg.hxx
+++ b/sc/source/ui/inc/filtdlg.hxx
@@ -39,7 +39,9 @@
 
 #include <deque>
 #include <vector>
+#include <map>
 #include <boost/ptr_container/ptr_map.hpp>
+#include <boost/noncopyable.hpp>
 
 //----------------------------------------------------------------------------
 
@@ -52,6 +54,13 @@ class TypedScStrCollection;
 
 class ScFilterDlg : public ScAnyRefDlg
 {
+    struct EntryList : boost::noncopyable
+    {
+        TypedScStrCollection maList;
+        size_t mnHeaderPos;
+        EntryList();
+    };
+    typedef boost::ptr_map<SCCOL,EntryList> EntryListsMap;
 public:
                     ScFilterDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent,
                                  const SfxItemSet&  rArgSet );
@@ -143,9 +152,7 @@ private:
     sal_uInt16          nFieldCount;
     bool                bRefInputMode;
 
-    typedef boost::ptr_map<SCCOL,TypedScStrCollection> EntryListsMap;
     EntryListsMap maEntryLists;
-    sal_uInt16              nHeaderPos[MAXCOLCOUNT];
 
     // Hack: RefInput control
     Timer*  pTimer;
commit ec3e71d0784a087e0e4fc71e20f7d91819743227
Author: Kohei Yoshida <kohei.yoshida at suse.com>
Date:   Tue Nov 15 11:17:24 2011 -0500

    Use map and avoid MAXCOLCOUNT-sized array.

diff --git a/sc/source/ui/dbgui/filtdlg.cxx b/sc/source/ui/dbgui/filtdlg.cxx
index aff212b..af87b9f 100644
--- a/sc/source/ui/dbgui/filtdlg.cxx
+++ b/sc/source/ui/dbgui/filtdlg.cxx
@@ -129,9 +129,6 @@ ScFilterDlg::ScFilterDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent,
         bRefInputMode   ( false ),
         pTimer          ( NULL )
 {
-    for (sal_uInt16 i=0; i<=MAXCOL; i++)
-        pEntryLists[i] = NULL;
-
     aBtnMore.SetMoreText( String(ScResId( SCSTR_MOREBTN_MOREOPTIONS )) );
     aBtnMore.SetLessText( String(ScResId( SCSTR_MOREBTN_FEWEROPTIONS )) );
     Init( rArgSet );
@@ -208,9 +205,6 @@ ScFilterDlg::ScFilterDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent,
 
 ScFilterDlg::~ScFilterDlg()
 {
-    for (sal_uInt16 i=0; i<=MAXCOL; i++)
-        delete pEntryLists[i];
-
     delete pOptionsMgr;
     delete pOutItem;
 
@@ -523,7 +517,8 @@ void ScFilterDlg::UpdateValueList( sal_uInt16 nList )
             WaitObject aWaiter( this );     // even if only the list box has content
 
             SCCOL nColumn = theQueryData.nCol1 + static_cast<SCCOL>(nFieldSelPos) - 1;
-            if (!pEntryLists[nColumn])
+            TypedScStrCollection* pColl = NULL;
+            if (!maEntryLists.count(nColumn))
             {
                 sal_uInt16 nOffset = GetSliderPos();
                 SCTAB nTab       = nSrcTab;
@@ -534,11 +529,16 @@ void ScFilterDlg::UpdateValueList( sal_uInt16 nList )
                 maHasDates[nOffset+nList-1] = false;
 
                 // first without the first line
-
-                pEntryLists[nColumn] = new TypedScStrCollection( 128, 128 );
-                pEntryLists[nColumn]->SetCaseSensitive( aBtnCase.IsChecked() );
+                std::pair<EntryListsMap::iterator, bool> r =
+                    maEntryLists.insert(nColumn, new TypedScStrCollection(128, 128));
+                if (!r.second)
+                    // insertion failed.
+                    return;
+
+                pColl = r.first->second;
+                pColl->SetCaseSensitive(aBtnCase.IsChecked());
                 pDoc->GetFilterEntriesArea( nColumn, nFirstRow+1, nLastRow,
-                                            nTab, *pEntryLists[nColumn], maHasDates[nOffset+nList-1] );
+                                            nTab, *pColl, maHasDates[nOffset+nList-1] );
 
                 // Entry for the first line
                 //! Entry (pHdrEntry) doesn't generate collection?
@@ -552,9 +552,9 @@ void ScFilterDlg::UpdateValueList( sal_uInt16 nList )
                 if ( pHdrEntry )
                 {
                     TypedStrData* pNewEntry = new TypedStrData(*pHdrEntry);
-                    if ( pEntryLists[nColumn]->Insert( pNewEntry ) )
+                    if ( pColl->Insert(pNewEntry) )
                     {
-                        nHeaderPos[nColumn] = pEntryLists[nColumn]->IndexOf( pNewEntry );
+                        nHeaderPos[nColumn] = pColl->IndexOf(pNewEntry);
                         OSL_ENSURE( nHeaderPos[nColumn] != USHRT_MAX,
                                     "Header-Eintrag nicht wiedergefunden" );
                     }
@@ -562,8 +562,10 @@ void ScFilterDlg::UpdateValueList( sal_uInt16 nList )
                         delete pNewEntry;           // was already there
                 }
             }
+            else
+                pColl = &maEntryLists[nColumn];
 
-            TypedScStrCollection* pColl = pEntryLists[nColumn];
+            OSL_ASSERT(pColl);
             sal_uInt16 nValueCount = pColl->GetCount();
             if ( nValueCount > 0 )
             {
@@ -591,7 +593,7 @@ void ScFilterDlg::UpdateHdrInValueList( sal_uInt16 nList )
         if ( nFieldSelPos )
         {
             SCCOL nColumn = theQueryData.nCol1 + static_cast<SCCOL>(nFieldSelPos) - 1;
-            if ( pEntryLists[nColumn] )
+            if (maEntryLists.count(nColumn))
             {
                 sal_uInt16 nPos = nHeaderPos[nColumn];
                 if ( nPos != USHRT_MAX )
@@ -599,7 +601,7 @@ void ScFilterDlg::UpdateHdrInValueList( sal_uInt16 nList )
                     ComboBox* pValList = maValueEdArr[nList-1];
                     sal_uInt16 nListPos = nPos + 2;                 // for "empty" and "non-empty"
 
-                    TypedStrData* pHdrEntry = (*pEntryLists[nColumn])[nPos];
+                    TypedStrData* pHdrEntry = maEntryLists[nColumn][nPos];
                     if ( pHdrEntry )
                     {
                         String aHdrStr = pHdrEntry->GetString();
@@ -1077,9 +1079,7 @@ IMPL_LINK( ScFilterDlg, CheckBoxHdl, CheckBox*, pBox )
 
     if ( pBox == &aBtnCase )            // Complete value list
     {
-        for (sal_uInt16 i=0; i<=MAXCOL; i++)
-            DELETEZ( pEntryLists[i] );
-
+        maEntryLists.clear();
         UpdateValueList( 1 );       // current text is recorded
         UpdateValueList( 2 );
         UpdateValueList( 3 );
diff --git a/sc/source/ui/inc/filtdlg.hxx b/sc/source/ui/inc/filtdlg.hxx
index 654f289..b28797f 100644
--- a/sc/source/ui/inc/filtdlg.hxx
+++ b/sc/source/ui/inc/filtdlg.hxx
@@ -39,6 +39,7 @@
 
 #include <deque>
 #include <vector>
+#include <boost/ptr_container/ptr_map.hpp>
 
 //----------------------------------------------------------------------------
 
@@ -142,7 +143,8 @@ private:
     sal_uInt16          nFieldCount;
     bool                bRefInputMode;
 
-    TypedScStrCollection*   pEntryLists[MAXCOLCOUNT];
+    typedef boost::ptr_map<SCCOL,TypedScStrCollection> EntryListsMap;
+    EntryListsMap maEntryLists;
     sal_uInt16              nHeaderPos[MAXCOLCOUNT];
 
     // Hack: RefInput control


More information about the Libreoffice-commits mailing list