Factor out DateTime::NormalizeTimeRemainderAndApply(tools::Time& rTime)

Change-Id: Ie520b10baaeb4c94973c44435c3241e5d2254968
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152345
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Jenkins
diff --git a/include/tools/datetime.hxx b/include/tools/datetime.hxx
index 7b78b29..dd435e3 100644
--- a/include/tools/datetime.hxx
+++ b/include/tools/datetime.hxx
@@ -83,6 +83,9 @@ public:
    void            AddTime( double fTimeInDays );
    DateTime&       operator +=( const tools::Time& rTime );
    DateTime&       operator -=( const tools::Time& rTime );
private:
    void            NormalizeTimeRemainderAndApply( tools::Time& rTime );
public:

    TOOLS_DLLPUBLIC friend DateTime operator +( const DateTime& rDateTime, sal_Int32 nDays );
    TOOLS_DLLPUBLIC friend DateTime operator -( const DateTime& rDateTime, sal_Int32 nDays );
diff --git a/tools/source/datetime/datetime.cxx b/tools/source/datetime/datetime.cxx
index efdb928..47dc055 100644
--- a/tools/source/datetime/datetime.cxx
+++ b/tools/source/datetime/datetime.cxx
@@ -94,33 +94,37 @@ sal_Int64 DateTime::GetSecFromDateTime( const Date& rDate ) const
    }
}

DateTime& DateTime::operator +=( const tools::Time& rTime )
void DateTime::NormalizeTimeRemainderAndApply( tools::Time& rTime )
{
    tools::Time aTime = *this;
    aTime += rTime;
    sal_uInt16 nHours = aTime.GetHour();
    if ( aTime.GetTime() > 0 )
    sal_uInt16 nHours = rTime.GetHour();
    if ( rTime.GetTime() > 0 )
    {
        if (nHours >= 24)
        {
            AddDays( nHours / 24 );
            nHours %= 24;
            aTime.SetHour( nHours );
            rTime.SetHour( nHours );
        }
    }
    else if ( aTime.GetTime() != 0 )
    else if ( rTime.GetTime() != 0 )
    {
        if (nHours >= 24)
        {
            AddDays( -static_cast<sal_Int32>(nHours) / 24 );
            nHours %= 24;
            aTime.SetHour( nHours );
            rTime.SetHour( nHours );
        }
        Date::operator--();
        aTime = Time( 24, 0, 0 )+aTime;
        rTime = Time( 24, 0, 0 ) + rTime;
    }
    tools::Time::operator=( aTime );
    tools::Time::operator=( rTime );
}

DateTime& DateTime::operator +=( const tools::Time& rTime )
{
    tools::Time aTime = *this;
    aTime += rTime;
    NormalizeTimeRemainderAndApply(aTime);
    return *this;
}

@@ -128,29 +132,7 @@ DateTime& DateTime::operator -=( const tools::Time& rTime )
{
    tools::Time aTime = *this;
    aTime -= rTime;
    sal_uInt16 nHours = aTime.GetHour();
    if ( aTime.GetTime() > 0 )
    {
        if (nHours >= 24)
        {
            AddDays( nHours / 24 );
            nHours %= 24;
            aTime.SetHour( nHours );
        }
    }
    else if ( aTime.GetTime() != 0 )
    {
        if (nHours >= 24)
        {
            AddDays( -static_cast<sal_Int32>(nHours) / 24 );
            nHours %= 24;
            aTime.SetHour( nHours );
        }
        Date::operator--();
        aTime = Time( 24, 0, 0 )+aTime;
    }
    tools::Time::operator=( aTime );

    NormalizeTimeRemainderAndApply(aTime);
    return *this;
}