Eliminate Date::operator+=() and -=() and replace with Date::AddDays()

Clarifies code and gets rid of explicitly casting the operand to sal_Int32.

Also in preparation of removing DateTime::operator+=(sal_Int32) that is
confusingly similar to DateTime::operator+=(double) and just depends on type.

Change-Id: I83422e2940fbb017978db9b5734b4966228af3de
Reviewed-on: https://gerrit.libreoffice.org/40248
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Eike Rathke <erack@redhat.com>
diff --git a/basic/source/runtime/methods.cxx b/basic/source/runtime/methods.cxx
index 56fa68c..f1b5b7d 100644
--- a/basic/source/runtime/methods.cxx
+++ b/basic/source/runtime/methods.cxx
@@ -1702,7 +1702,7 @@ sal_Int16 implGetDateDay( double aDate )
    aDate -= 2.0; // standardize: 1.1.1900 => 0.0
    aDate = floor( aDate );
    Date aRefDate( 1, 1, 1900 );
    aRefDate += static_cast<sal_Int32>(aDate);
    aRefDate.AddDays( aDate );

    sal_Int16 nRet = (sal_Int16)( aRefDate.GetDay() );
    return nRet;
@@ -1711,9 +1711,9 @@ sal_Int16 implGetDateDay( double aDate )
sal_Int16 implGetDateMonth( double aDate )
{
    Date aRefDate( 1,1,1900 );
    long nDays = (long)aDate;
    sal_Int32 nDays = (sal_Int32)aDate;
    nDays -= 2; // standardize: 1.1.1900 => 0.0
    aRefDate += nDays;
    aRefDate.AddDays( nDays );
    sal_Int16 nRet = (sal_Int16)( aRefDate.GetMonth() );
    return nRet;
}
@@ -4582,7 +4582,7 @@ sal_Int16 implGetDateYear( double aDate )
    Date aRefDate( 1,1,1900 );
    long nDays = (long) aDate;
    nDays -= 2; // standardize: 1.1.1900 => 0.0
    aRefDate += nDays;
    aRefDate.AddDays( nDays );
    sal_Int16 nRet = aRefDate.GetYear();
    return nRet;
}
@@ -4672,7 +4672,7 @@ bool implDateSerial( sal_Int16 nYear, sal_Int16 nMonth, sal_Int16 nDay,
        if (nAddMonths)
            aCurDate.AddMonths( nAddMonths);
        if (nAddDays)
            aCurDate += nAddDays;
            aCurDate.AddDays( nAddDays);
    }

    long nDiffDays = GetDayDiff( aCurDate );
diff --git a/basic/source/runtime/methods1.cxx b/basic/source/runtime/methods1.cxx
index 1dbfa9d..a67de74 100644
--- a/basic/source/runtime/methods1.cxx
+++ b/basic/source/runtime/methods1.cxx
@@ -3037,9 +3037,9 @@ void SbRtl_Me(StarBASIC *, SbxArray & rPar, bool)
sal_Int16 implGetWeekDay( double aDate, bool bFirstDayParam, sal_Int16 nFirstDay )
{
    Date aRefDate( 1,1,1900 );
    long nDays = (long) aDate;
    sal_Int32 nDays = (sal_Int32) aDate;
    nDays -= 2; // normalize: 1.1.1900 => 0
    aRefDate += nDays;
    aRefDate.AddDays( nDays);
    DayOfWeek aDay = aRefDate.GetDayOfWeek();
    sal_Int16 nDay;
    if ( aDay != SUNDAY )
diff --git a/chart2/source/view/axes/DateHelper.cxx b/chart2/source/view/axes/DateHelper.cxx
index afefa62..f90ac57 100644
--- a/chart2/source/view/axes/DateHelper.cxx
+++ b/chart2/source/view/axes/DateHelper.cxx
@@ -69,7 +69,7 @@ bool DateHelper::IsLessThanOneYearAway( const Date& rD1, const Date& rD2 )

double DateHelper::RasterizeDateValue( double fValue, const Date& rNullDate, long TimeResolution )
{
    Date aDate(rNullDate); aDate += static_cast<sal_Int32>(::rtl::math::approxFloor(fValue));
    Date aDate(rNullDate); aDate.AddDays(::rtl::math::approxFloor(fValue));
    switch(TimeResolution)
    {
        case css::chart::TimeUnit::DAY:
diff --git a/chart2/source/view/axes/DateScaling.cxx b/chart2/source/view/axes/DateScaling.cxx
index 449c25c..663e55e 100644
--- a/chart2/source/view/axes/DateScaling.cxx
+++ b/chart2/source/view/axes/DateScaling.cxx
@@ -59,7 +59,7 @@ double SAL_CALL DateScaling::doScaling( double value )
    else
    {
        Date aDate(m_aNullDate);
        aDate += static_cast<sal_Int32>(::rtl::math::approxFloor(value));
        aDate.AddDays(::rtl::math::approxFloor(value));
        switch( m_nTimeUnit )
        {
            case DAY:
diff --git a/chart2/source/view/axes/ScaleAutomatism.cxx b/chart2/source/view/axes/ScaleAutomatism.cxx
index 97d84fa..f712ecf 100644
--- a/chart2/source/view/axes/ScaleAutomatism.cxx
+++ b/chart2/source/view/axes/ScaleAutomatism.cxx
@@ -548,8 +548,8 @@ void ScaleAutomatism::calculateExplicitIncrementAndScaleForDateTimeAxis(
        ExplicitIncrementData& rExplicitIncrement,
        bool bAutoMinimum, bool bAutoMaximum ) const
{
    Date aMinDate(m_aNullDate); aMinDate += static_cast<sal_Int32>(::rtl::math::approxFloor(rExplicitScale.Minimum));
    Date aMaxDate(m_aNullDate); aMaxDate += static_cast<sal_Int32>(::rtl::math::approxFloor(rExplicitScale.Maximum));
    Date aMinDate(m_aNullDate); aMinDate.AddDays(::rtl::math::approxFloor(rExplicitScale.Minimum));
    Date aMaxDate(m_aNullDate); aMaxDate.AddDays(::rtl::math::approxFloor(rExplicitScale.Maximum));
    rExplicitIncrement.PostEquidistant = false;

    if( aMinDate > aMaxDate )
diff --git a/chart2/source/view/axes/Tickmarks_Dates.cxx b/chart2/source/view/axes/Tickmarks_Dates.cxx
index b7ba848..2b14d86 100644
--- a/chart2/source/view/axes/Tickmarks_Dates.cxx
+++ b/chart2/source/view/axes/Tickmarks_Dates.cxx
@@ -98,7 +98,7 @@ void DateTickFactory::getAllTicks( TickInfoArraysType& rAllTickInfos, bool bShif
        switch( m_aIncrement.MajorTimeInterval.TimeUnit )
        {
        case DAY:
            aDate += m_aIncrement.MajorTimeInterval.Number;
            aDate.AddDays( m_aIncrement.MajorTimeInterval.Number );
            break;
        case YEAR:
            aDate = DateHelper::GetDateSomeYearsAway( aDate, m_aIncrement.MajorTimeInterval.Number );
@@ -129,7 +129,7 @@ void DateTickFactory::getAllTicks( TickInfoArraysType& rAllTickInfos, bool bShif
        switch( m_aIncrement.MinorTimeInterval.TimeUnit )
        {
        case DAY:
            aDate += m_aIncrement.MinorTimeInterval.Number;
            aDate.AddDays( m_aIncrement.MinorTimeInterval.Number );
            break;
        case YEAR:
            aDate = DateHelper::GetDateSomeYearsAway( aDate, m_aIncrement.MinorTimeInterval.Number );
diff --git a/chart2/source/view/charttypes/VSeriesPlotter.cxx b/chart2/source/view/charttypes/VSeriesPlotter.cxx
index 3697f94..b4173b6 100644
--- a/chart2/source/view/charttypes/VSeriesPlotter.cxx
+++ b/chart2/source/view/charttypes/VSeriesPlotter.cxx
@@ -1382,11 +1382,11 @@ long VSeriesPlotter::calculateTimeResolutionOnXAxis()
            aNullDate = m_apNumberFormatterWrapper->getNullDate();
        if( aIt!=aEnd )
        {
            Date aPrevious(aNullDate); aPrevious+=static_cast<sal_Int32>(rtl::math::approxFloor(*aIt));
            Date aPrevious(aNullDate); aPrevious.AddDays(rtl::math::approxFloor(*aIt));
            ++aIt;
            for(;aIt!=aEnd;++aIt)
            {
                Date aCurrent(aNullDate); aCurrent+=static_cast<sal_Int32>(rtl::math::approxFloor(*aIt));
                Date aCurrent(aNullDate); aCurrent.AddDays(rtl::math::approxFloor(*aIt));
                if( nRet == css::chart::TimeUnit::YEAR )
                {
                    if( DateHelper::IsInSameYear( aPrevious, aCurrent ) )
diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx
index 181b283..20a4c1c 100644
--- a/chart2/source/view/main/ChartView.cxx
+++ b/chart2/source/view/main/ChartView.cxx
@@ -1861,7 +1861,7 @@ bool ChartView::getExplicitValuesForAxis(
            //remove 'one' from max
            if( rExplicitScale.AxisType == css::chart2::AxisType::DATE )
            {
                Date aMaxDate(rExplicitScale.NullDate); aMaxDate += static_cast<sal_Int32>(::rtl::math::approxFloor(rExplicitScale.Maximum));
                Date aMaxDate(rExplicitScale.NullDate); aMaxDate.AddDays(::rtl::math::approxFloor(rExplicitScale.Maximum));
                //for explicit scales with shifted categories we need one interval more
                switch( rExplicitScale.TimeResolution )
                {
diff --git a/connectivity/source/drivers/calc/CTable.cxx b/connectivity/source/drivers/calc/CTable.cxx
index 52737b6..eab69b4 100644
--- a/connectivity/source/drivers/calc/CTable.cxx
+++ b/connectivity/source/drivers/calc/CTable.cxx
@@ -348,7 +348,7 @@ static void lcl_SetValue( ORowSetValue& rValue, const Reference<XSpreadsheet>& x
                if ( eCellType == CellContentType_VALUE )
                {
                    ::Date aDate( rNullDate );
                    aDate += static_cast<sal_Int32>(::rtl::math::approxFloor( xCell->getValue() ));
                    aDate.AddDays(::rtl::math::approxFloor( xCell->getValue() ));
                    rValue = aDate.GetUNODate();
                }
                else
@@ -402,7 +402,7 @@ static void lcl_SetValue( ORowSetValue& rValue, const Reference<XSpreadsheet>& x
                    aDateTime.Hours = (sal_uInt16) nIntTime;

                    ::Date aDate( rNullDate );
                    aDate += nIntDays;
                    aDate.AddDays( nIntDays );
                    aDateTime.Day = aDate.GetDay();
                    aDateTime.Month = aDate.GetMonth();
                    aDateTime.Year = aDate.GetYear();
diff --git a/include/tools/date.hxx b/include/tools/date.hxx
index 3e038be..071b3c3 100644
--- a/include/tools/date.hxx
+++ b/include/tools/date.hxx
@@ -125,6 +125,10 @@ public:
    */
    void            AddMonths( sal_Int32 nAddMonths );

    /** Add days skipping year 0 and truncating at limits.
     */
    void            AddDays( sal_Int32 nAddDays );

    /** Obtain the day of the week for the date.

        Internally normalizes a copy of values.
@@ -216,8 +220,6 @@ public:
                        { mnDate = rDate.mnDate; return *this; }
    Date&           operator =( const css::util::Date& rUDate )
                        { setDateFromDMY( rUDate.Day, rUDate.Month, rUDate.Year); return *this; }
    Date&           operator +=( sal_Int32 nDays );
    Date&           operator -=( sal_Int32 nDays );
    Date&           operator ++();
    Date&           operator --();

diff --git a/include/tools/datetime.hxx b/include/tools/datetime.hxx
index 7e2756f..8d224dd 100644
--- a/include/tools/datetime.hxx
+++ b/include/tools/datetime.hxx
@@ -81,9 +81,9 @@ public:
    void            ConvertToLocalTime() { *this += Time::GetUTCOffset(); }

    DateTime&       operator +=( sal_Int32 nDays )
                        { Date::operator+=( nDays ); return *this; }
                        { AddDays( nDays ); return *this; }
    DateTime&       operator -=( sal_Int32 nDays )
                        { Date::operator-=( nDays ); return *this; }
                        { AddDays( -nDays ); return *this; }
    DateTime&       operator +=( double fTimeInDays );
    DateTime&       operator -=( double fTimeInDays )
                        { return operator+=( -fTimeInDays ); }
diff --git a/sc/source/core/data/conditio.cxx b/sc/source/core/data/conditio.cxx
index 3f83ea2..a3a7853 100644
--- a/sc/source/core/data/conditio.cxx
+++ b/sc/source/core/data/conditio.cxx
@@ -1624,7 +1624,7 @@ bool ScCondDateFormatEntry::IsValid( const ScAddress& rPos ) const
    double nVal = rCell.getValue();
    sal_Int32 nCellDate = static_cast<sal_Int32>(::rtl::math::approxFloor(nVal));
    Date aCellDate = pFormatter->GetNullDate();
    aCellDate += static_cast<sal_Int32>(::rtl::math::approxFloor(nVal));
    aCellDate.AddDays(nCellDate);

    switch(meType)
    {
diff --git a/sc/source/core/data/dpgroup.cxx b/sc/source/core/data/dpgroup.cxx
index 705d62d..3e36951 100644
--- a/sc/source/core/data/dpgroup.cxx
+++ b/sc/source/core/data/dpgroup.cxx
@@ -286,7 +286,7 @@ bool isDateInGroup(const ScDPItemData& rGroupItem, const ScDPItemData& rChildIte
                nGroupPart == css::sheet::DataPilotFieldGroupBy::QUARTERS)
            {
                Date aDate(1, 1, SC_DP_LEAPYEAR);
                aDate += (nChildValue - 1);            // days are 1-based
                aDate.AddDays(nChildValue - 1);            // days are 1-based
                sal_Int32 nCompare = aDate.GetMonth();
                if (nGroupPart == css::sheet::DataPilotFieldGroupBy::QUARTERS)
                    nCompare = ( ( nCompare - 1 ) / 3 ) + 1;    // get quarter from date
diff --git a/sc/source/core/data/dptabdat.cxx b/sc/source/core/data/dptabdat.cxx
index 5e44937b..1481849 100644
--- a/sc/source/core/data/dptabdat.cxx
+++ b/sc/source/core/data/dptabdat.cxx
@@ -66,7 +66,7 @@ long ScDPTableData::GetDatePart( long nDateVal, long nHierarchy, long nLevel )
        return nLastRet;

    Date aDate( 30,12,1899 );                   //TODO: get from source data (and cache here)
    aDate += nDateVal;
    aDate.AddDays( nDateVal);

    long nRet = 0;
    switch (nHierarchy)
diff --git a/sc/source/core/data/dputil.cxx b/sc/source/core/data/dputil.cxx
index 00b8b26..a543a32 100644
--- a/sc/source/core/data/dputil.cxx
+++ b/sc/source/core/data/dputil.cxx
@@ -121,7 +121,7 @@ OUString ScDPUtil::getDateGroupName(
        case sheet::DataPilotFieldGroupBy::DAYS:
        {
            Date aDate(1, 1, SC_DP_LEAPYEAR);
            aDate += (nValue - 1);            // nValue is 1-based
            aDate.AddDays(nValue - 1);            // nValue is 1-based
            long nDays = aDate - pFormatter->GetNullDate();

            const sal_uInt32 nFormat = pFormatter->GetFormatIndex(NF_DATE_SYS_DDMMM, ScGlobal::eLnge);
@@ -334,7 +334,7 @@ sal_Int32 ScDPUtil::getDatePartValue(
    else
    {
        Date aDate = pFormatter->GetNullDate();
        aDate += static_cast<sal_Int32>(::rtl::math::approxFloor(fValue));
        aDate.AddDays(::rtl::math::approxFloor(fValue));

        switch ( nDatePart )
        {
diff --git a/sc/source/core/data/table4.cxx b/sc/source/core/data/table4.cxx
index f211d97..fb12231 100644
--- a/sc/source/core/data/table4.cxx
+++ b/sc/source/core/data/table4.cxx
@@ -270,10 +270,10 @@ void ScTable::FillAnalyse( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
                Date aNullDate = pDocument->GetFormatTable()->GetNullDate();
                Date aDate1 = aNullDate;
                nVal = aFirstCell.mfValue;
                aDate1 += static_cast<sal_Int32>(nVal);
                aDate1.AddDays(nVal);
                Date aDate2 = aNullDate;
                nVal = GetValue(nCol+nAddX, nRow+nAddY);
                aDate2 += static_cast<sal_Int32>(nVal);
                aDate2.AddDays(nVal);
                if ( aDate1 != aDate2 )
                {
                    long nCmpInc = 0;
@@ -1079,26 +1079,26 @@ void ScTable::IncDate(double& rVal, sal_uInt16& nDayOfMonth, double nStep, FillD
    long nInc = (long) nStep;       // upper/lower limits ?
    Date aNullDate = pDocument->GetFormatTable()->GetNullDate();
    Date aDate = aNullDate;
    aDate += static_cast<sal_Int32>(rVal);
    aDate.AddDays(rVal);
    switch (eCmd)
    {
        case FILL_WEEKDAY:
            {
                aDate += nInc;
                aDate.AddDays(nInc);
                DayOfWeek eWeekDay = aDate.GetDayOfWeek();
                if (nInc >= 0)
                {
                    if (eWeekDay == SATURDAY)
                        aDate += 2;
                        aDate.AddDays(2);
                    else if (eWeekDay == SUNDAY)
                        aDate += 1;
                        aDate.AddDays(1);
                }
                else
                {
                    if (eWeekDay == SATURDAY)
                        aDate -= 1;
                        aDate.AddDays(-1);
                    else if (eWeekDay == SUNDAY)
                        aDate -= 2;
                        aDate.AddDays(-2);
                }
            }
            break;
diff --git a/sc/source/core/tool/interpr2.cxx b/sc/source/core/tool/interpr2.cxx
index 3c3a5f4..08a36f5 100644
--- a/sc/source/core/tool/interpr2.cxx
+++ b/sc/source/core/tool/interpr2.cxx
@@ -92,7 +92,7 @@ double ScInterpreter::GetDateSerial( sal_Int16 nYear, sal_Int16 nMonth, sal_Int1
    }
    Date aDate( nD, nM, nY);
    if (!bStrict)
        aDate += nDay - 1;
        aDate.AddDays( nDay - 1 );
    if (aDate.IsValidAndGregorian())
        return (double) (aDate - pFormatter->GetNullDate());
    else
@@ -126,21 +126,21 @@ void ScInterpreter::ScGetActTime()
void ScInterpreter::ScGetYear()
{
    Date aDate = pFormatter->GetNullDate();
    aDate += GetInt32();
    aDate.AddDays( GetInt32());
    PushDouble( (double) aDate.GetYear() );
}

void ScInterpreter::ScGetMonth()
{
    Date aDate = pFormatter->GetNullDate();
    aDate += GetInt32();
    aDate.AddDays( GetInt32());
    PushDouble( (double) aDate.GetMonth() );
}

void ScInterpreter::ScGetDay()
{
    Date aDate = pFormatter->GetNullDate();
    aDate += GetInt32();
    aDate.AddDays( GetInt32());
    PushDouble((double) aDate.GetDay());
}

@@ -200,7 +200,7 @@ void ScInterpreter::ScGetDayOfWeek()
            nFlag = 1;

        Date aDate = pFormatter->GetNullDate();
        aDate += GetInt32();
        aDate.AddDays( GetInt32());
        int nVal = (int) aDate.GetDayOfWeek();  // MONDAY = 0
        switch (nFlag)
        {
@@ -242,7 +242,7 @@ void ScInterpreter::ScWeeknumOOo()
        sal_Int16 nFlag = GetInt16();

        Date aDate = pFormatter->GetNullDate();
        aDate += GetInt32();
        aDate.AddDays( GetInt32());
        PushInt( (int) aDate.GetWeekOfYear( nFlag == 1 ? SUNDAY : MONDAY ));
    }
}
@@ -259,7 +259,7 @@ void ScInterpreter::ScGetWeekOfYear()
            nFlag = GetInt16();

        Date aDate = pFormatter->GetNullDate();
        aDate += GetInt32();
        aDate.AddDays( GetInt32());

        sal_Int32 nMinimumNumberOfDaysInWeek;
        DayOfWeek eFirstDayOfWeek;
@@ -302,7 +302,7 @@ void ScInterpreter::ScGetIsoWeekOfYear()
    if ( MustHaveParamCount( GetByte(), 1 ) )
    {
        Date aDate = pFormatter->GetNullDate();
        aDate += GetInt32();
        aDate.AddDays( GetInt32());
        PushInt( (int) aDate.GetWeekOfYear() );
    }
}
@@ -737,11 +737,11 @@ void ScInterpreter::ScGetDiffDate360()
            else
                nSign = 1;
            Date aDate1 = pFormatter->GetNullDate();
            aDate1 += nDate1;
            aDate1.AddDays( nDate1);
            Date aDate2 = pFormatter->GetNullDate();
            aDate2 += nDate2;
            aDate2.AddDays( nDate2);
            if (aDate1.GetDay() == 31)
                aDate1 -= (sal_uLong) 1;
                aDate1.AddDays( -1);
            else if (!bFlag)
            {
                if (aDate1.GetMonth() == 2)
@@ -763,7 +763,7 @@ void ScInterpreter::ScGetDiffDate360()
                if (!bFlag )
                {
                    if (aDate1.GetDay() == 30)
                        aDate2 -= (sal_uLong) 1;
                        aDate2.AddDays( -1);
                }
                else
                    aDate2.SetDay(30);
@@ -811,12 +811,12 @@ void ScInterpreter::ScGetDateDif()
        sal_uInt16 d1, m1, d2, m2;
        sal_Int16 y1, y2;
        Date aDate1( pFormatter->GetNullDate());
        aDate1 += nDate1;
        aDate1.AddDays( nDate1);
        y1 = aDate1.GetYear();
        m1 = aDate1.GetMonth();
        d1 = aDate1.GetDay();
        Date aDate2( pFormatter->GetNullDate());
        aDate2 += nDate2;
        aDate2.AddDays( nDate2);
        y2 = aDate2.GetYear();
        m2 = aDate2.GetMonth();
        d2 = aDate2.GetDay();
diff --git a/sc/source/ui/cctrl/checklistmenu.cxx b/sc/source/ui/cctrl/checklistmenu.cxx
index 9a04bad..b5729dc 100644
--- a/sc/source/ui/cctrl/checklistmenu.cxx
+++ b/sc/source/ui/cctrl/checklistmenu.cxx
@@ -1435,7 +1435,7 @@ void ScCheckListMenuWindow::addDateMember(const OUString& rsName, double nVal, b

    // Convert the numeric date value to a date object.
    Date aDate = pFormatter->GetNullDate();
    aDate += static_cast<sal_Int32>(rtl::math::approxFloor(nVal));
    aDate.AddDays(rtl::math::approxFloor(nVal));

    sal_Int16 nYear = aDate.GetYear();
    sal_uInt16 nMonth = aDate.GetMonth();
diff --git a/sc/source/ui/dbgui/dpgroupdlg.cxx b/sc/source/ui/dbgui/dpgroupdlg.cxx
index e29cf93..a8071c7 100644
--- a/sc/source/ui/dbgui/dpgroupdlg.cxx
+++ b/sc/source/ui/dbgui/dpgroupdlg.cxx
@@ -141,7 +141,7 @@ bool ScDPDateGroupEditHelper::ImplGetValue( double& rfValue ) const
void ScDPDateGroupEditHelper::ImplSetValue( double fValue )
{
    Date aDate( maNullDate );
    aDate += static_cast< sal_Int32 >( fValue );
    aDate.AddDays( fValue );
    mpEdValue->SetDate( aDate );
}

diff --git a/sc/source/ui/docshell/docsh8.cxx b/sc/source/ui/docshell/docsh8.cxx
index 47b58ab..bdb2032 100644
--- a/sc/source/ui/docshell/docsh8.cxx
+++ b/sc/source/ui/docshell/docsh8.cxx
@@ -967,7 +967,7 @@ ErrCode ScDocShell::DBaseExport( const OUString& rFullFileName, rtl_TextEncoding
                            else
                            {
                                Date aDate = pNumFmt->GetNullDate();        // tools date
                                aDate += static_cast<sal_Int32>(fVal);      //! approxfloor?
                                aDate.AddDays(fVal);                        //! approxfloor?
                                xRowUpdate->updateDate( nCol+1, aDate.GetUNODate() );
                            }
                        }
diff --git a/sc/source/ui/view/cellsh1.cxx b/sc/source/ui/view/cellsh1.cxx
index c576d27..e559a6b 100644
--- a/sc/source/ui/view/cellsh1.cxx
+++ b/sc/source/ui/view/cellsh1.cxx
@@ -691,9 +691,9 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq )
                        {
                            const Date& rNullDate = pDoc->GetFormatTable()->GetNullDate();
                            Date aStartDate = rNullDate;
                            aStartDate += static_cast<sal_Int32>(fStartVal);
                            aStartDate.AddDays(fStartVal);
                            Date aEndDate = rNullDate;
                            aEndDate += static_cast<sal_Int32>(fInputEndVal);
                            aEndDate.AddDays(fInputEndVal);
                            double fTempDate=0;

                            if(aStartDate.GetYear()!=aEndDate.GetYear())
diff --git a/sfx2/source/doc/oleprops.cxx b/sfx2/source/doc/oleprops.cxx
index d5e7348..7c34acc 100644
--- a/sfx2/source/doc/oleprops.cxx
+++ b/sfx2/source/doc/oleprops.cxx
@@ -574,7 +574,7 @@ void SfxOleDateProperty::ImplLoad( SvStream& rStrm )
    //stored as number of days (not seconds) since December 31, 1899
    ::Date aDate(31, 12, 1899);
    long nDays = fValue;
    aDate += nDays;
    aDate.AddDays( nDays );
    maDate.Day = aDate.GetDay();
    maDate.Month = aDate.GetMonth();
    maDate.Year = aDate.GetYear();
diff --git a/svtools/source/control/calendar.cxx b/svtools/source/control/calendar.cxx
index f791743..562b003 100644
--- a/svtools/source/control/calendar.cxx
+++ b/svtools/source/control/calendar.cxx
@@ -418,7 +418,7 @@ void Calendar::ImplFormat()
    maFirstDate = aTempDate;
    nWeekDay = (sal_uInt16)aTempDate.GetDayOfWeek();
    nWeekDay = (nWeekDay+(7-(sal_uInt16)eStartDay)) % 7;
    maFirstDate -= static_cast<sal_Int32>(nWeekDay);
    maFirstDate.AddDays( -nWeekDay );
    mnDayCount = nWeekDay;
    sal_uInt16 nDaysInMonth;
    sal_uInt16 nMonthCount = (sal_uInt16)(mnMonthPerLine*mnLines);
@@ -426,12 +426,12 @@ void Calendar::ImplFormat()
    {
        nDaysInMonth = aTempDate.GetDaysInMonth();
        mnDayCount += nDaysInMonth;
        aTempDate += nDaysInMonth;
        aTempDate.AddDays( nDaysInMonth );
    }
    Date aTempDate2 = aTempDate;
    --aTempDate2;
    nDaysInMonth = aTempDate2.GetDaysInMonth();
    aTempDate2 -= nDaysInMonth-1;
    aTempDate2.AddDays( -(nDaysInMonth-1) );
    nWeekDay = (sal_uInt16)aTempDate2.GetDayOfWeek();
    nWeekDay = (nWeekDay+(7-(sal_uInt16)eStartDay)) % 7;
    mnDayCount += 42-nDaysInMonth-nWeekDay;
@@ -484,7 +484,7 @@ sal_uInt16 Calendar::ImplHitTest( const Point& rPos, Date& rDate ) const

    long        nY;
    long        nOffX;
    sal_uInt16      nDay;
    sal_Int32   nDay;
    DayOfWeek   eStartDay = ImplGetWeekStart();

    rDate = GetFirstMonth();
@@ -515,12 +515,12 @@ sal_uInt16 Calendar::ImplHitTest( const Point& rPos, Date& rDate ) const
                    long nDayY = nY+mnDaysOffY;
                    if ( rPos.Y() < nDayY )
                        return 0;
                    sal_uInt16 nDayIndex = (sal_uInt16)rDate.GetDayOfWeek();
                    nDayIndex = (nDayIndex+(7-(sal_uInt16)eStartDay)) % 7;
                    sal_Int32 nDayIndex = (sal_Int32)rDate.GetDayOfWeek();
                    nDayIndex = (nDayIndex+(7-(sal_Int32)eStartDay)) % 7;
                    if ( (i == 0) && (j == 0) )
                    {
                        Date aTempDate = rDate;
                        aTempDate -= nDayIndex;
                        aTempDate.AddDays( -nDayIndex );
                        for ( nDay = 0; nDay < nDayIndex; nDay++ )
                        {
                            nOffX = nDayX + (nDay*mnDayWidth);
@@ -528,7 +528,7 @@ sal_uInt16 Calendar::ImplHitTest( const Point& rPos, Date& rDate ) const
                                 (rPos.X() >= nOffX) && (rPos.X() < nOffX+mnDayWidth) )
                            {
                                rDate = aTempDate;
                                rDate += nDay;
                                rDate.AddDays( nDay );
                                return CALENDAR_HITTEST_DAY;
                            }
                        }
@@ -537,14 +537,14 @@ sal_uInt16 Calendar::ImplHitTest( const Point& rPos, Date& rDate ) const
                    {
                        if ( rPos.Y() < nDayY )
                        {
                            rDate += nDayIndex;
                            rDate.AddDays( nDayIndex );
                            return 0;
                        }
                        nOffX = nDayX + (nDayIndex*mnDayWidth);
                        if ( (rPos.Y() >= nDayY) && (rPos.Y() < nDayY+mnDayHeight) &&
                             (rPos.X() >= nOffX) && (rPos.X() < nOffX+mnDayWidth) )
                        {
                            rDate += nDay-1;
                            rDate.AddDays( nDay-1 );
                            return CALENDAR_HITTEST_DAY;
                        }
                        if ( nDayIndex == 6 )
@@ -559,14 +559,14 @@ sal_uInt16 Calendar::ImplHitTest( const Point& rPos, Date& rDate ) const
                    {
                        sal_uInt16 nWeekDay = (sal_uInt16)rDate.GetDayOfWeek();
                        nWeekDay = (nWeekDay+(7-(sal_uInt16)eStartDay)) % 7;
                        sal_uInt16 nDayCount = 42-nDaysInMonth-nWeekDay;
                        sal_Int32 nDayCount = 42-nDaysInMonth-nWeekDay;
                        Date aTempDate = rDate;
                        aTempDate += nDaysInMonth;
                        aTempDate.AddDays( nDaysInMonth );
                        for ( nDay = 1; nDay <= nDayCount; nDay++ )
                        {
                            if ( rPos.Y() < nDayY )
                            {
                                rDate += nDayIndex;
                                rDate.AddDays( nDayIndex );
                                return 0;
                            }
                            nOffX = nDayX + (nDayIndex*mnDayWidth);
@@ -574,7 +574,7 @@ sal_uInt16 Calendar::ImplHitTest( const Point& rPos, Date& rDate ) const
                                 (rPos.X() >= nOffX) && (rPos.X() < nOffX+mnDayWidth) )
                            {
                                rDate = aTempDate;
                                rDate += nDay-1;
                                rDate.AddDays( nDay-1 );
                                return CALENDAR_HITTEST_DAY;
                            }
                            if ( nDayIndex == 6 )
@@ -589,7 +589,7 @@ sal_uInt16 Calendar::ImplHitTest( const Point& rPos, Date& rDate ) const
                }
            }

            rDate += nDaysInMonth;
            rDate.AddDays( nDaysInMonth );
            nX += mnMonthWidth;
        }

@@ -905,7 +905,7 @@ void Calendar::ImplDraw(vcl::RenderContext& rRenderContext)
            if (i == 0 && j == 0)
            {
                Date aTempDate = aDate;
                aTempDate -= nDayIndex;
                aTempDate.AddDays( -nDayIndex );
                for (nDay = 0; nDay < nDayIndex; ++nDay)
                {
                    nDeltaX = nDayX + (nDay * mnDayWidth);
@@ -934,7 +934,7 @@ void Calendar::ImplDraw(vcl::RenderContext& rRenderContext)
                nWeekDay = (nWeekDay + (7 - (sal_uInt16)eStartDay)) % 7;
                sal_uInt16 nDayCount = 42 - nDaysInMonth - nWeekDay;
                Date aTempDate = aDate;
                aTempDate += nDaysInMonth;
                aTempDate.AddDays( nDaysInMonth );
                for (nDay = 1; nDay <= nDayCount; ++nDay)
                {
                    nDeltaX = nDayX + (nDayIndex * mnDayWidth);
@@ -952,7 +952,7 @@ void Calendar::ImplDraw(vcl::RenderContext& rRenderContext)
                }
            }

            aDate += nDaysInMonth;
            aDate.AddDays( nDaysInMonth );
            nX += mnMonthWidth;
        }

@@ -1137,10 +1137,10 @@ void Calendar::ImplScroll( bool bPrev )
    if ( bPrev )
    {
        --aNewFirstMonth;
        aNewFirstMonth -= aNewFirstMonth.GetDaysInMonth()-1;
        aNewFirstMonth.AddDays( -(aNewFirstMonth.GetDaysInMonth()-1));
    }
    else
        aNewFirstMonth += aNewFirstMonth.GetDaysInMonth();
        aNewFirstMonth.AddDays( aNewFirstMonth.GetDaysInMonth());
    SetFirstDate( aNewFirstMonth );
}

@@ -1395,23 +1395,23 @@ void Calendar::KeyInput( const KeyEvent& rKEvt )
            break;

        case KEY_UP:
            aNewDate -= 7;
            aNewDate.AddDays( -7 );
            break;

        case KEY_DOWN:
            aNewDate += 7;
            aNewDate.AddDays( 7 );
            break;

        case KEY_PAGEUP:
            {
            Date aTempDate = aNewDate;
            aTempDate -= aNewDate.GetDay()+1;
            aNewDate -= aTempDate.GetDaysInMonth();
            aTempDate.AddDays( -(aNewDate.GetDay()+1) );
            aNewDate.AddDays( -aTempDate.GetDaysInMonth() );
            }
            break;

        case KEY_PAGEDOWN:
            aNewDate += aNewDate.GetDaysInMonth();
            aNewDate.AddDays( aNewDate.GetDaysInMonth() );
            break;

        case KEY_SPACE:
@@ -1689,13 +1689,13 @@ void Calendar::SetCurDate( const Date& rNewDate )
            if ( nDateOff < 365 )
            {
                Date aFirstDate = GetFirstMonth();
                aFirstDate += aFirstDate.GetDaysInMonth();
                aFirstDate.AddDays( aFirstDate.GetDaysInMonth() );
                ++aTempDate;
                while ( nDateOff > aTempDate.GetDaysInMonth() )
                {
                    aFirstDate += aFirstDate.GetDaysInMonth();
                    aFirstDate.AddDays( aFirstDate.GetDaysInMonth() );
                    sal_Int32 nDaysInMonth = aTempDate.GetDaysInMonth();
                    aTempDate += nDaysInMonth;
                    aTempDate.AddDays( nDaysInMonth );
                    nDateOff -= nDaysInMonth;
                }
                SetFirstDate( aFirstDate );
@@ -1743,7 +1743,7 @@ Date Calendar::GetLastMonth() const
    Date aDate = GetFirstMonth();
    sal_uInt16 nMonthCount = GetMonthCount();
    for ( sal_uInt16 i = 0; i < nMonthCount; i++ )
        aDate += aDate.GetDaysInMonth();
        aDate.AddDays( aDate.GetDaysInMonth() );
    --aDate;
    return aDate;
}
@@ -1796,9 +1796,9 @@ tools::Rectangle Calendar::GetDateRect( const Date& rDate ) const
        Date aLastDate = GetLastMonth();
        if ( rDate > aLastDate )
        {
            sal_uInt16 nWeekDay = (sal_uInt16)aLastDate.GetDayOfWeek();
            nWeekDay = (nWeekDay+(7-(sal_uInt16)ImplGetWeekStart())) % 7;
            aLastDate -= nWeekDay;
            sal_Int32 nWeekDay = (sal_Int32)aLastDate.GetDayOfWeek();
            nWeekDay = (nWeekDay+(7-ImplGetWeekStart())) % 7;
            aLastDate.AddDays( nWeekDay );
            aRect = GetDateRect( aLastDate );
            nDaysOff = rDate-aLastDate;
            nDayIndex = 0;
@@ -1859,7 +1859,7 @@ tools::Rectangle Calendar::GetDateRect( const Date& rDate ) const
                }
            }

            aDate += nDaysInMonth;
            aDate.AddDays( nDaysInMonth );
            nX += mnMonthWidth;
        }

diff --git a/tools/qa/cppunit/test_date.cxx b/tools/qa/cppunit/test_date.cxx
index 4f36baa0..74d37ef 100644
--- a/tools/qa/cppunit/test_date.cxx
+++ b/tools/qa/cppunit/test_date.cxx
@@ -39,9 +39,11 @@ void DateTest::testDate()
    CPPUNIT_ASSERT_EQUAL( static_cast<sal_Int32>(1), aCE - aBCE);
    CPPUNIT_ASSERT_EQUAL( static_cast<sal_Int32>(-1), aBCE - aCE);
    aDate = aBCE;
    CPPUNIT_ASSERT_EQUAL( aCE.GetDate(), (aDate += 1).GetDate());
    aDate.AddDays(1);
    CPPUNIT_ASSERT_EQUAL( aCE.GetDate(), aDate.GetDate());
    aDate = aCE;
    CPPUNIT_ASSERT_EQUAL( aBCE.GetDate(), (aDate -= 1).GetDate());
    aDate.AddDays(-1);
    CPPUNIT_ASSERT_EQUAL( aBCE.GetDate(), aDate.GetDate());

    // The entire BCE and CE ranges cover that many days. Day 0 is -0001-12-31
    CPPUNIT_ASSERT_EQUAL( kMaxDays, aMax - aBCE);
@@ -49,13 +51,17 @@ void DateTest::testDate()

    // Truncate at limits, not under-/overflow or wrap.
    aDate = aMin;
    CPPUNIT_ASSERT_EQUAL( aMin.GetDate(), (aDate -= 1).GetDate());
    aDate.AddDays(-1);
    CPPUNIT_ASSERT_EQUAL( aMin.GetDate(), aDate.GetDate());
    aDate = aMax;
    CPPUNIT_ASSERT_EQUAL( aMax.GetDate(), (aDate += 1).GetDate());
    aDate.AddDays(1);
    CPPUNIT_ASSERT_EQUAL( aMax.GetDate(), aDate.GetDate());
    aDate = aBCE;
    CPPUNIT_ASSERT_EQUAL( aMin.GetDate(), (aDate += (kMinDays-10)).GetDate());
    aDate.AddDays(kMinDays-10);
    CPPUNIT_ASSERT_EQUAL( aMin.GetDate(), aDate.GetDate());
    aDate = aBCE;
    CPPUNIT_ASSERT_EQUAL( aMax.GetDate(), (aDate += (kMaxDays+10)).GetDate());
    aDate.AddDays(kMaxDays+10);
    CPPUNIT_ASSERT_EQUAL( aMax.GetDate(), aDate.GetDate());
    aDate = aMax;
    aDate.SetDay(32);
    aDate.Normalize();
@@ -109,14 +115,18 @@ void DateTest::testDate()

    // Year -1 is a leap year.
    aDate = Date(28,2,-1);
    CPPUNIT_ASSERT_EQUAL( Date(29,2,-1).GetDate(), (aDate += 1).GetDate());
    aDate.AddDays(1);
    CPPUNIT_ASSERT_EQUAL( Date(29,2,-1).GetDate(), aDate.GetDate());
    aDate = Date(1,3,-1);
    CPPUNIT_ASSERT_EQUAL( Date(29,2,-1).GetDate(), (aDate -= 1).GetDate());
    aDate.AddDays(-1);
    CPPUNIT_ASSERT_EQUAL( Date(29,2,-1).GetDate(), aDate.GetDate());
    // Year -5 is a leap year.
    aDate = Date(28,2,-5);
    CPPUNIT_ASSERT_EQUAL( Date(29,2,-5).GetDate(), (aDate += 1).GetDate());
    aDate.AddDays(1);
    CPPUNIT_ASSERT_EQUAL( Date(29,2,-5).GetDate(), aDate.GetDate());
    aDate = Date(1,3,-5);
    CPPUNIT_ASSERT_EQUAL( Date(29,2,-5).GetDate(), (aDate -= 1).GetDate());
    aDate.AddDays(-1);
    CPPUNIT_ASSERT_EQUAL( Date(29,2,-5).GetDate(), aDate.GetDate());
}

CPPUNIT_TEST_SUITE_REGISTRATION(DateTest);
diff --git a/tools/source/datetime/datetime.cxx b/tools/source/datetime/datetime.cxx
index aa17d65..b87fcdf 100644
--- a/tools/source/datetime/datetime.cxx
+++ b/tools/source/datetime/datetime.cxx
@@ -190,7 +190,7 @@ DateTime& DateTime::operator +=( double fTimeInDays )
        fInt = ::rtl::math::approxFloor( fTimeInDays );
        fFrac = fInt >= fTimeInDays ? 0.0 : fTimeInDays - fInt;
    }
    Date::operator+=( sal_Int32(fInt) );     // full days
    AddDays( sal_Int32(fInt) );     // full days
    if ( fFrac )
    {
        tools::Time aTime(0);  // default ctor calls system time, we don't need that
@@ -268,7 +268,7 @@ DateTime DateTime::CreateFromWin32FileDateTime( sal_uInt32 rLower, sal_uInt32 rU
    Date aDate(1,1,1601);
    // (0xffffffffffffffff / a100nPerDay = 21350398) fits into sal_Int32
    // (0x7fffffff = 2147483647)
    aDate += static_cast<sal_Int32>(nDays);
    aDate.AddDays(nDays);

    SAL_WARN_IF( aDate - Date(1,1,1601) != static_cast<sal_Int32>(nDays), "tools.datetime",
            "DateTime::CreateFromWin32FileDateTime - date truncated to max");
@@ -287,7 +287,7 @@ DateTime DateTime::CreateFromUnixTime(const double fSecondsSinceEpoch)
    const sal_Int32 nDays = static_cast <sal_Int32>(::rtl::math::approxFloor(fValue));

    Date aDate (1, 1, 1970);
    aDate += nDays;
    aDate.AddDays(nDays);
    SAL_WARN_IF(aDate - Date(1, 1, 1970) != static_cast<sal_Int32>(nDays), "tools.datetime",
                "DateTime::CreateFromUnixTime - date truncated to max");

diff --git a/tools/source/datetime/tdate.cxx b/tools/source/datetime/tdate.cxx
index 4206b13..1829806 100644
--- a/tools/source/datetime/tdate.cxx
+++ b/tools/source/datetime/tdate.cxx
@@ -571,20 +571,10 @@ bool Date::Normalize( sal_uInt16 & rDay, sal_uInt16 & rMonth, sal_Int16 & rYear 
    return true;
}

Date& Date::operator +=( sal_Int32 nDays )
void Date::AddDays( sal_Int32 nDays )
{
    if (nDays != 0)
        *this = lcl_DaysToDate( GetAsNormalizedDays() + nDays );

    return *this;
}

Date& Date::operator -=( sal_Int32 nDays )
{
    if (nDays != 0)
        *this = lcl_DaysToDate( GetAsNormalizedDays() - nDays );

    return *this;
}

Date& Date::operator ++()
@@ -602,14 +592,14 @@ Date& Date::operator --()
Date operator +( const Date& rDate, sal_Int32 nDays )
{
    Date aDate( rDate );
    aDate += nDays;
    aDate.AddDays( nDays );
    return aDate;
}

Date operator -( const Date& rDate, sal_Int32 nDays )
{
    Date aDate( rDate );
    aDate -= nDays;
    aDate.AddDays( -nDays );
    return aDate;
}

diff --git a/xmloff/source/core/xmluconv.cxx b/xmloff/source/core/xmluconv.cxx
index d65ad04..7aaa01c 100644
--- a/xmloff/source/core/xmluconv.cxx
+++ b/xmloff/source/core/xmluconv.cxx
@@ -321,7 +321,7 @@ void SvXMLUnitConverter::convertDateTime( OUStringBuffer& rBuffer,
    double fValue = fDateTime;
    sal_Int32 nValue = static_cast <sal_Int32> (::rtl::math::approxFloor (fValue));
    Date aDate (aTempNullDate.Day, aTempNullDate.Month, aTempNullDate.Year);
    aDate += nValue;
    aDate.AddDays( nValue);
    fValue -= nValue;
    double fCount;
    if (nValue > 0)
@@ -371,7 +371,7 @@ void SvXMLUnitConverter::convertDateTime( OUStringBuffer& rBuffer,
        if (fHoursValue >= 24.0)
        {
            fHoursValue -= 24.0;
            aDate += 1;
            aDate.AddDays(1);
        }
    }
    sal_Int16 nTempYear = aDate.GetYear();