fdo#73565: Populate date members in a locale-safe way.

Change-Id: Id90b2829465fada690b0446d6d823e76e792c77b
(cherry picked from commit 2be2786879883badd6d0075e63965bacd312ed23)
Reviewed-on: https://gerrit.libreoffice.org/8139
Tested-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
diff --git a/sc/source/ui/cctrl/checklistmenu.cxx b/sc/source/ui/cctrl/checklistmenu.cxx
index 2cde8eb..848d84c 100644
--- a/sc/source/ui/cctrl/checklistmenu.cxx
+++ b/sc/source/ui/cctrl/checklistmenu.cxx
@@ -32,6 +32,7 @@
#include "svtools/fmtfield.hxx"
#include "document.hxx"

using namespace com::sun::star;
using ::com::sun::star::uno::Reference;
using ::com::sun::star::accessibility::XAccessible;
using ::com::sun::star::accessibility::XAccessibleContext;
@@ -1279,50 +1280,71 @@ void ScCheckListMenuWindow::setMemberSize(size_t n)
void ScCheckListMenuWindow::addDateMember(const OUString& rsName, double nVal, bool bVisible)
{
    ScDocument* pDoc = getDoc();
    if ( pDoc )
    SvNumberFormatter* pFormatter = pDoc->GetFormatTable();

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

    sal_uInt16 nYear = aDate.GetYear();
    sal_uInt16 nMonth = aDate.GetMonth();
    sal_uInt16 nDay = aDate.GetDay();

    // Get the localized month name list.
    CalendarWrapper* pCalendar = ScGlobal::GetCalendar();
    uno::Sequence<i18n::CalendarItem2> aMonths = pCalendar->getMonths();
    if (aMonths.getLength() < nMonth)
        return;

    OUString aYearName = OUString::number(nYear);
    OUString aMonthName = aMonths[nMonth-1].FullName;
    OUString aDayName = OUString::number(nDay);

    maChecks.SetUpdateMode(false);

    SvTreeListEntry* pYearEntry = maChecks.FindEntry(NULL, aYearName);
    if (!pYearEntry)
    {
        SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
        OUString rsDate;
        if ( pFormatter )
        {
            OUString sFormat("YYYY/MMMM/DD");
            Color* pColor = NULL;
            pFormatter->GetPreviewString(sFormat,
                nVal,
                rsDate,
                &pColor,
                ScGlobal::eLnge );
        }
        maChecks.SetUpdateMode(false);
        sal_Int32 nIndex = 0;
        OUString sParent;
        SvTreeListEntry* pParent = NULL;
        int count = 0;
        do
        {
            OUString sPart = rsDate.getToken( 0, '/', nIndex );
            bool bLeaf = ( ++count == 3 );
            SvTreeListEntry* pChild = maChecks.FindEntry( pParent, sPart );
            if ( !pChild )
            {
                if ( bLeaf )
                    pChild = maChecks.SvTreeListBox::InsertEntry( sPart, pParent, sal_False, LISTBOX_APPEND, NULL, SvLBoxButtonKind_enabledCheckbox );
                else
                    pChild = maChecks.SvTreeListBox::InsertEntry( sPart, pParent, sal_True, LISTBOX_APPEND, NULL, SvLBoxButtonKind_enabledCheckbox );
                Member aMember;
                aMember.maName = sPart;
                aMember.maRealName = rsName;
                aMember.mbDate = true;
                aMember.mbLeaf = bLeaf;
                aMember.mbVisible = bVisible;
                aMember.mpParent = pParent;
                maMembers.push_back(aMember);
            }
            sParent = sPart;
            pParent = pChild;
        } while ( nIndex >= 0 );
        maChecks.SetUpdateMode(true);
        pYearEntry = maChecks.InsertEntry(aYearName, NULL, true);
        Member aMemYear;
        aMemYear.maName = aYearName;
        aMemYear.maRealName = rsName;
        aMemYear.mbDate = true;
        aMemYear.mbLeaf = false;
        aMemYear.mbVisible = bVisible;
        aMemYear.mpParent = NULL;
        maMembers.push_back(aMemYear);
    }

    SvTreeListEntry* pMonthEntry = maChecks.FindEntry(pYearEntry, aMonthName);
    if (!pMonthEntry)
    {
        pMonthEntry = maChecks.InsertEntry(aMonthName, pYearEntry, true);
        Member aMemMonth;
        aMemMonth.maName = aMonthName;
        aMemMonth.maRealName = rsName;
        aMemMonth.mbDate = true;
        aMemMonth.mbLeaf = false;
        aMemMonth.mbVisible = bVisible;
        aMemMonth.mpParent = pYearEntry;
        maMembers.push_back(aMemMonth);
    }

    SvTreeListEntry* pDayEntry = maChecks.FindEntry(pMonthEntry, aDayName);
    if (!pDayEntry)
    {
        pDayEntry = maChecks.InsertEntry(aDayName, pMonthEntry, false);
        Member aMemDay;
        aMemDay.maName = aDayName;
        aMemDay.maRealName = rsName;
        aMemDay.mbDate = true;
        aMemDay.mbLeaf = true;
        aMemDay.mbVisible = bVisible;
        aMemDay.mpParent = pMonthEntry;
        maMembers.push_back(aMemDay);
    }

    maChecks.SetUpdateMode(true);
}

void ScCheckListMenuWindow::addMember(const OUString& rName, bool bVisible)