From 62fedaf63a776774186ffd687f48032496baad8b Mon Sep 17 00:00:00 2001
From: Noel Grandin <noel@peralex.com>
Date: Fri, 9 Mar 2012 09:10:26 +0200
Subject: [PATCH] Convert tools/table usage to std::set

Along the way, also convert some function parameters to use references
instead of points.
---
 svtools/inc/svtools/calendar.hxx    |   15 ++-
 svtools/source/control/calendar.cxx |  194 ++++++++++++++++-------------------
 2 files changed, 96 insertions(+), 113 deletions(-)

diff --git a/svtools/inc/svtools/calendar.hxx b/svtools/inc/svtools/calendar.hxx
index 94a7f5e..f1f18ad 100644
--- a/svtools/inc/svtools/calendar.hxx
+++ b/svtools/inc/svtools/calendar.hxx
@@ -36,8 +36,8 @@
 #include <vcl/ctrl.hxx>
 #include <vcl/timer.hxx>
 #include <vcl/field.hxx>
+#include <set>
 
-class Table;
 class MouseEvent;
 class TrackingEvent;
 class KeyEvent;
@@ -168,12 +168,14 @@ oder durch Beendigung einer Selektion ausgeloest.
 // - Calendar -
 // ------------
 
+typedef std::set<sal_uLong> DateSet;
+
 class SVT_DLLPUBLIC Calendar : public Control
 {
 private:
-    Table*          mpSelectTable;
-    Table*          mpOldSelectTable;
-    Table*          mpRestoreSelectTable;
+    DateSet         maSelectTable;
+    DateSet*        mpOldSelectTable;
+    DateSet*        mpRestoreSelectTable;
     XubString*      mpDayText[31];
     XubString       maDayText;
     XubString       maWeekText;
@@ -256,7 +258,7 @@ private:
                                   sal_uLong nToday = 0 );
     SVT_DLLPRIVATE void         ImplDraw( sal_Bool bPaint = sal_False );
     SVT_DLLPRIVATE void         ImplUpdateDate( const Date& rDate );
-    SVT_DLLPRIVATE void         ImplUpdateSelection( Table* pOld );
+    SVT_DLLPRIVATE void         ImplUpdateSelection( DateSet& rOld );
     SVT_DLLPRIVATE void         ImplMouseSelect( const Date& rDate, sal_uInt16 nHitTest,
                                      sal_Bool bMove, sal_Bool bExpand, sal_Bool bExtended );
     SVT_DLLPRIVATE void         ImplUpdate( sal_Bool bCalcNew = sal_False );
@@ -302,7 +304,8 @@ public:
     void            SelectDate( const Date& rDate, sal_Bool bSelect = sal_True );
     void            SetNoSelection();
     sal_Bool            IsDateSelected( const Date& rDate ) const;
-    Date            GetSelectDate( sal_uLong nIndex = 0 ) const;
+    Date            GetFirstSelectDate() const;
+    
     void            EnableCallEverySelect( sal_Bool bEvery = sal_True ) { mbAllSel = bEvery; }
     sal_Bool            IsCallEverySelectEnabled() const { return mbAllSel; }
 
diff --git a/svtools/source/control/calendar.cxx b/svtools/source/control/calendar.cxx
index c82b29f..67e94a5 100644
--- a/svtools/source/control/calendar.cxx
+++ b/svtools/source/control/calendar.cxx
@@ -30,7 +30,6 @@
 #include <rtl/oustringostreaminserter.hxx>
 #include <rtl/strbuf.hxx>
 #include <vcl/svapp.hxx>
-#include <tools/table.hxx>
 #include <vcl/help.hxx>
 #include <vcl/menu.hxx>
 #include <vcl/decoview.hxx>
@@ -78,17 +77,17 @@ using namespace ::com::sun::star;
 
 // =======================================================================
 
-static void ImplCalendarSelectDate( Table* pTable, const Date& rDate, sal_Bool bSelect )
+static void ImplCalendarSelectDate( DateSet& rTable, const Date& rDate, sal_Bool bSelect )
 {
     if ( bSelect )
-        pTable->Insert( rDate.GetDate(), TABLE_DATE_SELECTED );
+        rTable.insert( rDate.GetDate() );
     else
-        pTable->Remove( rDate.GetDate() );
+        rTable.erase( rDate.GetDate() );
 }
 
 // -----------------------------------------------------------------------
 
-static void ImplCalendarSelectDateRange( Table* pTable,
+static void ImplCalendarSelectDateRange( DateSet& rTable,
                                          const Date& rStartDate,
                                          const Date& rEndDate,
                                          sal_Bool bSelect )
@@ -106,31 +105,30 @@ static void ImplCalendarSelectDateRange( Table* pTable,
     {
         while ( aStartDate <= aEndDate )
         {
-            pTable->Insert( aStartDate.GetDate(), TABLE_DATE_SELECTED );
+            rTable.insert( aStartDate.GetDate() );
             aStartDate++;
         }
     }
     else
     {
-        void* p = pTable->First();
-        while ( p )
+        for ( DateSet::iterator it = rTable.begin(); it != rTable.end(); )
         {
-            Date aDate( pTable->GetCurKey() );
+            Date aDate( *it );
             if ( aDate > aEndDate )
                 break;
 
             if ( aDate >= aStartDate )
-                pTable->Remove( aDate.GetDate() );
+                it = rTable.erase( it );
             else
-                p = pTable->Next();
+                ++it;
         }
     }
 }
 
 // -----------------------------------------------------------------------
 
-static void ImplCalendarUnSelectDateRange( Table* pTable,
-                                           Table* pOldTable,
+static void ImplCalendarUnSelectDateRange( DateSet& rTable,
+                                           DateSet& rOldTable,
                                            const Date& rStartDate,
                                            const Date& rEndDate )
 {
@@ -143,44 +141,40 @@ static void ImplCalendarUnSelectDateRange( Table* pTable,
         aEndDate = aTempDate;
     }
 
-    void* p = pTable->First();
-    while ( p )
+    for ( DateSet::iterator it = rTable.begin(); it != rTable.end(); )
     {
-        Date aDate( pTable->GetCurKey() );
+        Date aDate( *it );
         if ( aDate > aEndDate )
             break;
 
         if ( aDate >= aStartDate )
-            pTable->Remove( aDate.GetDate() );
+            it = rTable.erase( it );
         else
-            p = pTable->Next();
+            ++it;
     }
 
-    p = pOldTable->First();
-    while ( p )
+    for ( DateSet::iterator it = rOldTable.begin(); it != rOldTable.end(); ++it )
     {
-        Date aDate( pOldTable->GetCurKey() );
+        Date aDate( *it );
         if ( aDate > aEndDate )
             break;
         if ( aDate >= aStartDate )
-            pTable->Insert( aDate.GetDate(), TABLE_DATE_SELECTED );
-
-        p = pOldTable->Next();
+            rTable.insert( aDate.GetDate() );
     }
 }
 
 // -----------------------------------------------------------------------
 
-inline void ImplCalendarClearSelectDate( Table* pTable )
+inline void ImplCalendarClearSelectDate( DateSet& rTable )
 {
-    pTable->Clear();
+    rTable.clear();
 }
 
 // =======================================================================
 
 void Calendar::ImplInit( WinBits nWinStyle )
 {
-    mpSelectTable           = new Table;
+    maSelectTable.clear();
     mpOldSelectTable        = NULL;
     mpRestoreSelectTable    = NULL;
     mpStandardColor         = NULL;
@@ -233,7 +227,7 @@ void Calendar::ImplInit( WinBits nWinStyle )
     }
 
     SetFirstDate( maCurDate );
-    ImplCalendarSelectDate( mpSelectTable, maCurDate, sal_True );
+    ImplCalendarSelectDate( maSelectTable, maCurDate, sal_True );
 
     // Sonstige Strings erzeugen
     maDayText = XubString( SvtResId( STR_SVT_CALENDAR_DAY ) );
@@ -286,7 +280,6 @@ Calendar::~Calendar()
     delete mpSaturdayColor;
     delete mpSundayColor;
 
-    delete mpSelectTable;
     if ( mpOldSelectTable )
         delete mpOldSelectTable;
     if ( mpRestoreSelectTable )
@@ -748,11 +741,8 @@ void Calendar::ImplDrawDate( long nX, long nY,
          (nMonth == maCurDate.GetMonth()) &&
          (nYear  == maCurDate.GetYear()) )
         bFocus = sal_True;
-    if ( mpSelectTable )
-    {
-        if ( mpSelectTable->IsKeyValid( Date( nDay, nMonth, nYear ).GetDate() ) )
-            bSel = sal_True;
-    }
+    if ( maSelectTable.count( Date( nDay, nMonth, nYear ).GetDate() ) > 0 )
+        bSel = sal_True;
 
     // Textfarbe ermitteln
     if ( bSel )
@@ -1091,36 +1081,26 @@ void Calendar::ImplUpdateDate( const Date& rDate )
 
 // -----------------------------------------------------------------------
 
-void Calendar::ImplUpdateSelection( Table* pOld )
+void Calendar::ImplUpdateSelection( DateSet& rOld )
 {
-    Table*  pNew = mpSelectTable;
-    void*   p;
-    sal_uLong   nKey;
-
-    p = pOld->First();
-    while ( p )
+    for ( DateSet::iterator it = rOld.begin(); it != rOld.end(); ++it )
     {
-        nKey = pOld->GetCurKey();
-        if ( !pNew->Get( nKey ) )
+        sal_uLong nKey = *it;
+        if ( maSelectTable.count( nKey ) == 0 )
         {
             Date aTempDate( nKey );
             ImplUpdateDate( aTempDate );
         }
-
-        p = pOld->Next();
     }
 
-    p = pNew->First();
-    while ( p )
+    for ( DateSet::iterator it = maSelectTable.begin(); it != maSelectTable.end(); ++it )
     {
-        nKey = pNew->GetCurKey();
-        if ( !pOld->Get( nKey ) )
+        sal_uLong nKey = *it;
+        if ( rOld.count( nKey ) == 0 )
         {
             Date aTempDate( nKey );
             ImplUpdateDate( aTempDate );
         }
-
-        p = pNew->Next();
     }
 }
 
@@ -1129,7 +1109,7 @@ void Calendar::ImplUpdateSelection( Table* pOld )
 void Calendar::ImplMouseSelect( const Date& rDate, sal_uInt16 nHitTest,
                                 sal_Bool bMove, sal_Bool bExpand, sal_Bool bExtended )
 {
-    Table*  pOldSel = new Table( *mpSelectTable );
+    DateSet*  pOldSel = new DateSet( maSelectTable );
     Date    aOldDate = maCurDate;
     Date    aTempDate = rDate;
 
@@ -1145,15 +1125,15 @@ void Calendar::ImplMouseSelect( const Date& rDate, sal_uInt16 nHitTest,
         {
             if ( mbSelLeft )
             {
-                ImplCalendarUnSelectDateRange( mpSelectTable, mpRestoreSelectTable, Date( 1, 1, 0 ), aTempDate );
-                ImplCalendarUnSelectDateRange( mpSelectTable, mpRestoreSelectTable, maAnchorDate, Date( 31, 12, 9999 ) );
+                ImplCalendarUnSelectDateRange( maSelectTable, *mpRestoreSelectTable, Date( 1, 1, 0 ), aTempDate );
+                ImplCalendarUnSelectDateRange( maSelectTable, *mpRestoreSelectTable, maAnchorDate, Date( 31, 12, 9999 ) );
             }
             else
             {
-                ImplCalendarUnSelectDateRange( mpSelectTable, mpRestoreSelectTable, Date( 1, 1, 0 ), maAnchorDate );
-                ImplCalendarUnSelectDateRange( mpSelectTable, mpRestoreSelectTable, aTempDate, Date( 31, 12, 9999 ) );
+                ImplCalendarUnSelectDateRange( maSelectTable, *mpRestoreSelectTable, Date( 1, 1, 0 ), maAnchorDate );
+                ImplCalendarUnSelectDateRange( maSelectTable, *mpRestoreSelectTable, aTempDate, Date( 31, 12, 9999 ) );
             }
-            ImplCalendarSelectDateRange( mpSelectTable, aTempDate, maAnchorDate, !mbUnSel );
+            ImplCalendarSelectDateRange( maSelectTable, aTempDate, maAnchorDate, !mbUnSel );
         }
         else
         {
@@ -1163,16 +1143,16 @@ void Calendar::ImplMouseSelect( const Date& rDate, sal_uInt16 nHitTest,
                 {
                     if ( mbSelLeft )
                     {
-                        ImplCalendarSelectDateRange( mpSelectTable, Date( 1, 1, 0 ), aTempDate, sal_False );
-                        ImplCalendarSelectDateRange( mpSelectTable, maAnchorDate, Date( 31, 12, 9999 ), sal_False );
+                        ImplCalendarSelectDateRange( maSelectTable, Date( 1, 1, 0 ), aTempDate, sal_False );
+                        ImplCalendarSelectDateRange( maSelectTable, maAnchorDate, Date( 31, 12, 9999 ), sal_False );
                     }
                     else
                     {
-                        ImplCalendarSelectDateRange( mpSelectTable, Date( 1, 1, 0 ), maAnchorDate, sal_False );
-                        ImplCalendarSelectDateRange( mpSelectTable, aTempDate, Date( 31, 12, 9999 ), sal_False );
+                        ImplCalendarSelectDateRange( maSelectTable, Date( 1, 1, 0 ), maAnchorDate, sal_False );
+                        ImplCalendarSelectDateRange( maSelectTable, aTempDate, Date( 31, 12, 9999 ), sal_False );
                     }
                 }
-                ImplCalendarSelectDateRange( mpSelectTable, aTempDate, maAnchorDate, sal_True );
+                ImplCalendarSelectDateRange( maSelectTable, aTempDate, maAnchorDate, sal_True );
             }
             else if ( bExtended && !(mnWinStyle & WB_RANGESELECT) )
             {
@@ -1180,21 +1160,21 @@ void Calendar::ImplMouseSelect( const Date& rDate, sal_uInt16 nHitTest,
                 if ( IsDateSelected( aTempDate ) )
                 {
                     mbUnSel = sal_True;
-                    ImplCalendarSelectDate( mpSelectTable, aTempDate, sal_False );
+                    ImplCalendarSelectDate( maSelectTable, aTempDate, sal_False );
                 }
                 else
                 {
-                    ImplCalendarSelectDate( mpSelectTable, aTempDate, sal_True );
+                    ImplCalendarSelectDate( maSelectTable, aTempDate, sal_True );
                 }
             }
             else
             {
                 maAnchorDate = aTempDate;
-                ImplCalendarClearSelectDate( mpSelectTable );
-                ImplCalendarSelectDate( mpSelectTable, aTempDate, sal_True );
+                ImplCalendarClearSelectDate( maSelectTable );
+                ImplCalendarSelectDate( maSelectTable, aTempDate, sal_True );
             }
 
-            mpRestoreSelectTable = new Table( *mpSelectTable );
+            mpRestoreSelectTable = new DateSet( maSelectTable );
         }
     }
     else
@@ -1210,12 +1190,12 @@ void Calendar::ImplMouseSelect( const Date& rDate, sal_uInt16 nHitTest,
         if ( aTempDate != maCurDate )
         {
             maCurDate = aTempDate;
-            ImplCalendarSelectDate( mpSelectTable, aOldDate, sal_False );
-            ImplCalendarSelectDate( mpSelectTable, maCurDate, sal_True );
+            ImplCalendarSelectDate( maSelectTable, aOldDate, sal_False );
+            ImplCalendarSelectDate( maSelectTable, maCurDate, sal_True );
         }
     }
 
-    sal_Bool bNewSel = *pOldSel != *mpSelectTable;
+    sal_Bool bNewSel = *pOldSel != maSelectTable;
     if ( (maCurDate != aOldDate) || bNewSel )
     {
         if ( bNewSel )
@@ -1226,11 +1206,11 @@ void Calendar::ImplMouseSelect( const Date& rDate, sal_uInt16 nHitTest,
         }
         HideFocus();
         if ( bNewSel )
-            ImplUpdateSelection( pOldSel );
-        if ( !bNewSel || !pOldSel->Get( aOldDate.GetDate() ) )
+            ImplUpdateSelection( *pOldSel );
+        if ( !bNewSel || pOldSel->count( aOldDate.GetDate() ) == 0 )
             ImplUpdateDate( aOldDate );
         // Damit Focus-Rechteck auch wieder neu ausgegeben wird
-        if ( HasFocus() || !bNewSel || !mpSelectTable->Get( maCurDate.GetDate() ) )
+        if ( HasFocus() || !bNewSel || maSelectTable.count( maCurDate.GetDate() ) == 0 )
             ImplUpdateDate( maCurDate );
     }
     delete pOldSel;
@@ -1399,16 +1379,16 @@ void Calendar::ImplEndTracking( sal_Bool bCancel )
 
         if ( !bSpinDown )
         {
-            Table*  pOldSel = new Table( *mpSelectTable );
-            Date    aOldDate = maCurDate;
+            DateSet* pOldSel = new DateSet( maSelectTable );
+            Date     aOldDate = maCurDate;
             maCurDate       = maOldCurDate;
-            *mpSelectTable  = *mpOldSelectTable;
+            maSelectTable  = *mpOldSelectTable;
             HideFocus();
-            ImplUpdateSelection( pOldSel );
-            if ( !pOldSel->Get( aOldDate.GetDate() ) )
+            ImplUpdateSelection( *pOldSel );
+            if ( pOldSel->count( aOldDate.GetDate() ) == 0 )
                 ImplUpdateDate( aOldDate );
             // Damit Focus-Rechteck auch wieder neu ausgegeben wird
-            if ( HasFocus() || !mpSelectTable->Get( maCurDate.GetDate() ) )
+            if ( HasFocus() || maSelectTable.count( maCurDate.GetDate() ) == 0 )
                 ImplUpdateDate( maCurDate );
             delete pOldSel;
         }
@@ -1419,11 +1399,11 @@ void Calendar::ImplEndTracking( sal_Bool bCancel )
         if ( !bCancel )
         {
             // Feststellen, ob wir sichtbaren Bereich scrollen sollen
-            sal_uLong nSelCount = mpSelectTable->Count();
+            sal_uLong nSelCount = maSelectTable.size();
             if ( nSelCount )
             {
-                Date aFirstSelDate( mpSelectTable->GetObjectKey( 0 ) );
-                Date aLastSelDate( mpSelectTable->GetObjectKey( nSelCount-1 ) );
+                Date aFirstSelDate( *maSelectTable.begin() );
+                Date aLastSelDate( *maSelectTable.rbegin() );
                 if ( aLastSelDate < GetFirstMonth() )
                     ImplScroll( sal_True );
                 else if ( GetLastMonth() < aFirstSelDate )
@@ -1432,7 +1412,7 @@ void Calendar::ImplEndTracking( sal_Bool bCancel )
         }
 
         if ( mbAllSel ||
-             (!bCancel && ((maCurDate != maOldCurDate) || (*mpOldSelectTable != *mpSelectTable))) )
+             (!bCancel && ((maCurDate != maOldCurDate) || (*mpOldSelectTable != maSelectTable))) )
             Select();
 
         if ( !bSelection && (mnWinStyle & WB_TABSTOP) && !bCancel )
@@ -1498,7 +1478,7 @@ void Calendar::MouseButtonDown( const MouseEvent& rMEvt )
                         if ( mpOldSelectTable )
                             delete mpOldSelectTable;
                         maOldCurDate = maCurDate;
-                        mpOldSelectTable = new Table( *mpSelectTable );
+                        mpOldSelectTable = new DateSet( maSelectTable );
 
                         if ( !mbSelection )
                         {
@@ -1629,23 +1609,23 @@ void Calendar::KeyInput( const KeyEvent& rKEvt )
     {
         if ( bMultiSel && bExpand )
         {
-            Table* pOldSel = new Table( *mpSelectTable );
+            DateSet* pOldSel = new DateSet( maSelectTable );
             Date aOldAnchorDate = maAnchorDate;
             mbSelLeft = aNewDate < maAnchorDate;
             if ( !bExtended )
             {
                 if ( mbSelLeft )
                 {
-                    ImplCalendarSelectDateRange( mpSelectTable, Date( 1, 1, 0 ), aNewDate, sal_False );
-                    ImplCalendarSelectDateRange( mpSelectTable, maAnchorDate, Date( 31, 12, 9999 ), sal_False );
+                    ImplCalendarSelectDateRange( maSelectTable, Date( 1, 1, 0 ), aNewDate, sal_False );
+                    ImplCalendarSelectDateRange( maSelectTable, maAnchorDate, Date( 31, 12, 9999 ), sal_False );
                 }
                 else
                 {
-                    ImplCalendarSelectDateRange( mpSelectTable, Date( 1, 1, 0 ), maAnchorDate, sal_False );
-                    ImplCalendarSelectDateRange( mpSelectTable, aNewDate, Date( 31, 12, 9999 ), sal_False );
+                    ImplCalendarSelectDateRange( maSelectTable, Date( 1, 1, 0 ), maAnchorDate, sal_False );
+                    ImplCalendarSelectDateRange( maSelectTable, aNewDate, Date( 31, 12, 9999 ), sal_False );
                 }
             }
-            ImplCalendarSelectDateRange( mpSelectTable, aNewDate, maAnchorDate, sal_True );
+            ImplCalendarSelectDateRange( maSelectTable, aNewDate, maAnchorDate, sal_True );
             mbDirect = sal_True;
             SetCurDate( aNewDate );
             mbDirect = sal_False;
@@ -1653,7 +1633,7 @@ void Calendar::KeyInput( const KeyEvent& rKEvt )
             mbInSelChange = sal_True;
             SelectionChanging();
             mbInSelChange = sal_False;
-            ImplUpdateSelection( pOldSel );
+            ImplUpdateSelection( *pOldSel );
             delete pOldSel;
         }
         else
@@ -1868,18 +1848,18 @@ void Calendar::SelectDate( const Date& rDate, sal_Bool bSelect )
     if ( !rDate.IsValidAndGregorian() )
         return;
 
-    Table* pOldSel;
+    DateSet* pOldSel;
 
     if ( !mbInSelChange )
-        pOldSel = new Table( *mpSelectTable );
+        pOldSel = new DateSet( maSelectTable );
     else
         pOldSel = NULL;
 
-    ImplCalendarSelectDate( mpSelectTable, rDate, bSelect );
+    ImplCalendarSelectDate( maSelectTable, rDate, bSelect );
 
     if ( pOldSel )
     {
-        ImplUpdateSelection( pOldSel );
+        ImplUpdateSelection( *pOldSel );
         delete pOldSel;
     }
 }
@@ -1888,18 +1868,18 @@ void Calendar::SelectDate( const Date& rDate, sal_Bool bSelect )
 
 void Calendar::SetNoSelection()
 {
-    Table* pOldSel;
+    DateSet* pOldSel;
 
     if ( !mbInSelChange )
-        pOldSel = new Table( *mpSelectTable );
+        pOldSel = new DateSet( maSelectTable );
     else
         pOldSel = NULL;
 
-    ImplCalendarClearSelectDate( mpSelectTable );
+    ImplCalendarClearSelectDate( maSelectTable );
 
     if ( pOldSel )
     {
-        ImplUpdateSelection( pOldSel );
+        ImplUpdateSelection( *pOldSel );
         delete pOldSel;
     }
 }
@@ -1908,15 +1888,15 @@ void Calendar::SetNoSelection()
 
 sal_Bool Calendar::IsDateSelected( const Date& rDate ) const
 {
-    return mpSelectTable->IsKeyValid( rDate.GetDate() );
+    return maSelectTable.count( rDate.GetDate() ) > 0 ? sal_True : sal_False;
 }
 
 // -----------------------------------------------------------------------
 
-Date Calendar::GetSelectDate( sal_uLong nIndex ) const
+Date Calendar::GetFirstSelectDate() const
 {
-    if ( nIndex < mpSelectTable->Count() )
-        return Date( mpSelectTable->GetObjectKey( nIndex ) );
+    if ( !maSelectTable.empty() )
+        return Date( *maSelectTable.begin() );
     else
     {
         Date aDate( 0, 0, 0 );
@@ -1940,8 +1920,8 @@ void Calendar::SetCurDate( const Date& rNewDate )
 
         if ( !(mnWinStyle & (WB_RANGESELECT | WB_MULTISELECT)) )
         {
-            ImplCalendarSelectDate( mpSelectTable, aOldDate, sal_False );
-            ImplCalendarSelectDate( mpSelectTable, maCurDate, sal_True );
+            ImplCalendarSelectDate( maSelectTable, aOldDate, sal_False );
+            ImplCalendarSelectDate( maSelectTable, maCurDate, sal_True );
         }
         else if ( !HasFocus() )
             bUpdate = sal_False;
@@ -2155,7 +2135,7 @@ void Calendar::StartSelection()
     if ( mpOldSelectTable )
         delete mpOldSelectTable;
     maOldCurDate = maCurDate;
-    mpOldSelectTable = new Table( *mpSelectTable );
+    mpOldSelectTable = new DateSet( maSelectTable );
 
     mbSelection = sal_True;
 }
@@ -2459,7 +2439,7 @@ IMPL_LINK( CalendarField, ImplSelectHdl, Calendar*, pCalendar )
         mpFloatWin->EndPopupMode();
         EndDropDown();
         GrabFocus();
-        Date aNewDate = mpCalendar->GetSelectDate( 0 );
+        Date aNewDate = mpCalendar->GetFirstSelectDate();
         if ( IsEmptyDate() || ( aNewDate != GetDate() ) )
         {
             SetDate( aNewDate );
-- 
1.7.5.4

