sc/source/ui/view/viewfun6.cxx | 81 +++++++++++++++++++++++++++++++++++------ 1 file changed, 70 insertions(+), 11 deletions(-)
New commits: commit 5a05115ee25683b5fc7c79ab418eaeed120bd3b0 Author: Eike Rathke <er...@redhat.com> Date: Tue Aug 19 21:47:33 2014 +0200 more flexible handling of current date/time hotkeys Let Ctrl+; current date and Shift+Ctrl+; (Ctrl+:) current time behave more flexible, depending on the formatting (and as such the type) of the existing cell content. key date on time cell => current date + time of cell => date+time formatted cell key date on other cell => current date => date formatted cell key time on date cell => date of cell + current time => date+time formatted cell key time on other cell => current time => time formatted cell Change-Id: I2ccbfbab3c50c36a72c4db4696520e32f94caefa diff --git a/sc/source/ui/view/viewfun6.cxx b/sc/source/ui/view/viewfun6.cxx index 483156b8..ba9fbfb 100644 --- a/sc/source/ui/view/viewfun6.cxx +++ b/sc/source/ui/view/viewfun6.cxx @@ -244,6 +244,25 @@ void ScViewFunc::InsertCurrentTime(short nCellFmt, const OUString& rUndoStr) ScDocument& rDoc = pDocSh->GetDocument(); ::svl::IUndoManager* pUndoMgr = pDocSh->GetUndoManager(); SvNumberFormatter* pFormatter = rDoc.GetFormatTable(); + const sal_uInt32 nCurNumFormat = rDoc.GetNumberFormat(aCurPos); + const SvNumberformat* pCurNumFormatEntry = pFormatter->GetEntry(nCurNumFormat); + const short nCurNumFormatType = (pCurNumFormatEntry ? + (pCurNumFormatEntry->GetType() & ~NUMBERFORMAT_DEFINED) : NUMBERFORMAT_UNDEFINED); + // Combine requested date/time stamp with existing cell time/date, if any. + switch (nCellFmt) + { + case NUMBERFORMAT_DATE: + if (nCurNumFormatType == NUMBERFORMAT_TIME) + nCellFmt = NUMBERFORMAT_DATETIME; + break; + case NUMBERFORMAT_TIME: + if (nCurNumFormatType == NUMBERFORMAT_DATE) + nCellFmt = NUMBERFORMAT_DATETIME; + break; + default: + assert(!"unhandled current date/time request"); + nCellFmt = NUMBERFORMAT_DATETIME; + } double fVal; switch (nCellFmt) { @@ -253,29 +272,53 @@ void ScViewFunc::InsertCurrentTime(short nCellFmt, const OUString& rUndoStr) fVal = aActDate - *pFormatter->GetNullDate(); } break; - default: - assert(!"unhandled current date/time"); - // fallthru case NUMBERFORMAT_TIME: - case NUMBERFORMAT_DATETIME: // for now treat datetime and time identically { - DateTime aActDateTime( DateTime::SYSTEM ); - // Converting the null date to DateTime forces the correct - // operator-() to be used, resulting in a fractional date&time - // instead of only date value. - fVal = aActDateTime - DateTime( *pFormatter->GetNullDate()); + Time aActTime( Time::SYSTEM ); + fVal = aActTime.GetTimeInDays(); + } + break; + case NUMBERFORMAT_DATETIME: + { + switch (nCurNumFormatType) + { + case NUMBERFORMAT_DATE: + { + double fDate = rtl::math::approxFloor( rDoc.GetValue( aCurPos)); + Time aActTime( Time::SYSTEM ); + fVal = fDate + aActTime.GetTimeInDays(); + } + break; + case NUMBERFORMAT_TIME: + { + double fCell = rDoc.GetValue( aCurPos); + double fTime = fCell - rtl::math::approxFloor( fCell); + Date aActDate( Date::SYSTEM ); + fVal = (aActDate - *pFormatter->GetNullDate()) + fTime; + } + break; + default: + { + DateTime aActDateTime( DateTime::SYSTEM ); + // Converting the null date to DateTime forces the + // correct operator-() to be used, resulting in a + // fractional date&time instead of only date value. + fVal = aActDateTime - DateTime( *pFormatter->GetNullDate()); + } + } } break; } + pUndoMgr->EnterListAction(rUndoStr, rUndoStr); + pDocSh->GetDocFunc().SetValueCell(aCurPos, fVal, true); // Set the new cell format only when it differs from the current cell // format type. - sal_uInt32 nCurNumFormat = rDoc.GetNumberFormat(aCurPos); - const SvNumberformat* pEntry = pFormatter->GetEntry(nCurNumFormat); - if (!pEntry || !(pEntry->GetType() & nCellFmt)) + if (nCellFmt != nCurNumFormatType) SetNumberFormat(nCellFmt); + pUndoMgr->LeaveListAction(); } commit 11f145d90f6a6781be5ec3787f41cb1b76eb8c8c Author: Eike Rathke <er...@redhat.com> Date: Tue Aug 19 19:05:40 2014 +0200 a date is a date, without time And use DateTime instead of manually concatenating Date and Time. Change-Id: I6f9fb988beea2a9a17c976d3b98860c4f9ed063b diff --git a/sc/source/ui/view/viewfun6.cxx b/sc/source/ui/view/viewfun6.cxx index f6addba..483156b8 100644 --- a/sc/source/ui/view/viewfun6.cxx +++ b/sc/source/ui/view/viewfun6.cxx @@ -244,15 +244,31 @@ void ScViewFunc::InsertCurrentTime(short nCellFmt, const OUString& rUndoStr) ScDocument& rDoc = pDocSh->GetDocument(); ::svl::IUndoManager* pUndoMgr = pDocSh->GetUndoManager(); SvNumberFormatter* pFormatter = rDoc.GetFormatTable(); - Date aActDate( Date::SYSTEM ); - double fDate = aActDate - *pFormatter->GetNullDate(); - Time aActTime( Time::SYSTEM ); - double fTime = aActTime.GetHour() / static_cast<double>(::Time::hourPerDay) + - aActTime.GetMin() / static_cast<double>(::Time::minutePerDay) + - aActTime.GetSec() / static_cast<double>(::Time::secondPerDay) + - aActTime.GetNanoSec() / static_cast<double>(::Time::nanoSecPerDay); + double fVal; + switch (nCellFmt) + { + case NUMBERFORMAT_DATE: + { + Date aActDate( Date::SYSTEM ); + fVal = aActDate - *pFormatter->GetNullDate(); + } + break; + default: + assert(!"unhandled current date/time"); + // fallthru + case NUMBERFORMAT_TIME: + case NUMBERFORMAT_DATETIME: // for now treat datetime and time identically + { + DateTime aActDateTime( DateTime::SYSTEM ); + // Converting the null date to DateTime forces the correct + // operator-() to be used, resulting in a fractional date&time + // instead of only date value. + fVal = aActDateTime - DateTime( *pFormatter->GetNullDate()); + } + break; + } pUndoMgr->EnterListAction(rUndoStr, rUndoStr); - pDocSh->GetDocFunc().SetValueCell(aCurPos, fDate+fTime, true); + pDocSh->GetDocFunc().SetValueCell(aCurPos, fVal, true); // Set the new cell format only when it differs from the current cell // format type. _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits