[Libreoffice-commits] core.git: 2 commits - sc/source
Eike Rathke
erack at redhat.com
Wed Aug 20 04:45:49 PDT 2014
sc/source/ui/view/viewfun6.cxx | 89 ++++++++++++++++++++++++++++++++++-------
1 file changed, 75 insertions(+), 14 deletions(-)
New commits:
commit fdb7429bf5275469d05ea028a94aa6935399494e
Author: Eike Rathke <erack at redhat.com>
Date: Wed Aug 20 13:35:33 2014 +0200
update input bar with new value
If setting the number format isn't called we need to explicitly update
the input bar.
Change-Id: I60c4808ce86eb659d3faf92d368c5118ee9673b2
diff --git a/sc/source/ui/view/viewfun6.cxx b/sc/source/ui/view/viewfun6.cxx
index bfe6dfd..3874548 100644
--- a/sc/source/ui/view/viewfun6.cxx
+++ b/sc/source/ui/view/viewfun6.cxx
@@ -377,6 +377,8 @@ void ScViewFunc::InsertCurrentTime(short nReqFmt, const OUString& rUndoStr)
// through.
if (bForceReqFmt || (nReqFmt != nCurNumFormatType && nCurNumFormatType != NUMBERFORMAT_DATETIME))
SetNumberFormat(nReqFmt);
+ else
+ rViewData.UpdateInputHandler(); // update input bar with new value
pUndoMgr->LeaveListAction();
}
commit 32e8c47df81292c71ce1d885762358f18559bdb7
Author: Eike Rathke <erack at redhat.com>
Date: Wed Aug 20 12:27:07 2014 +0200
refine current date/time hotkey handling
Nearing the "do what I mean" principle..
* key date on time cell => current date + time of cell => date+time formatted cell
* unless time cell was empty or 00:00 time => current date => date formatted cell
* key date on date+time cell => current date + 00:00 time => date+time formatted cell
* unless date was current date => current date => date 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
* unless date cell was empty => current time => time formatted cell
* key time on date+time cell => current time => time formatted cell
* unless cell was empty => current date+time => date+time formatted cell
* key time on other cell => current time => time formatted cell
Change-Id: I5025e0d0ea9ac83d1b9e0b130262df6db4693a56
diff --git a/sc/source/ui/view/viewfun6.cxx b/sc/source/ui/view/viewfun6.cxx
index b7a429c..bfe6dfd 100644
--- a/sc/source/ui/view/viewfun6.cxx
+++ b/sc/source/ui/view/viewfun6.cxx
@@ -236,7 +236,20 @@ void ScViewFunc::DetectiveMarkSucc()
MarkAndJumpToRanges(aDestRanges);
}
-void ScViewFunc::InsertCurrentTime(short nCellFmt, const OUString& rUndoStr)
+/** Insert date or time into current cell.
+
+ - key date on time cell => current date + time of cell => date+time formatted cell
+ - unless time cell was empty or 00:00 time => current date => date formatted cell
+ - key date on date+time cell => current date + 00:00 time => date+time formatted cell
+ - unless date was current date => current date => date 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
+ - unless date cell was empty => current time => time formatted cell
+ - key time on date+time cell => current time => time formatted cell
+ - unless cell was empty => current date+time => date+time formatted cell
+ - key time on other cell => current time => time formatted cell
+ */
+void ScViewFunc::InsertCurrentTime(short nReqFmt, const OUString& rUndoStr)
{
ScViewData& rViewData = GetViewData();
ScAddress aCurPos = rViewData.GetCurPos();
@@ -248,23 +261,69 @@ void ScViewFunc::InsertCurrentTime(short nCellFmt, const OUString& rUndoStr)
const SvNumberformat* pCurNumFormatEntry = pFormatter->GetEntry(nCurNumFormat);
const short nCurNumFormatType = (pCurNumFormatEntry ?
(pCurNumFormatEntry->GetType() & ~NUMBERFORMAT_DEFINED) : NUMBERFORMAT_UNDEFINED);
+ bool bForceReqFmt = false;
+ const double fCell = rDoc.GetValue( aCurPos);
// Combine requested date/time stamp with existing cell time/date, if any.
- switch (nCellFmt)
+ switch (nReqFmt)
{
case NUMBERFORMAT_DATE:
- if (nCurNumFormatType == NUMBERFORMAT_TIME)
- nCellFmt = NUMBERFORMAT_DATETIME;
+ switch (nCurNumFormatType)
+ {
+ case NUMBERFORMAT_TIME:
+ // An empty cell formatted as time (or 00:00 time) shall
+ // not result in the current date with 00:00 time, but only
+ // in current date.
+ if (fCell != 0.0)
+ nReqFmt = NUMBERFORMAT_DATETIME;
+ break;
+ case NUMBERFORMAT_DATETIME:
+ {
+ // Force to only date if the existing date+time is the
+ // current date. This way inserting current date twice
+ // on an existing date+time cell can be used to force
+ // date, which otherwise would only be possible by
+ // applying a date format.
+ double fDate = rtl::math::approxFloor( fCell);
+ if (fDate == (Date( Date::SYSTEM) - *pFormatter->GetNullDate()))
+ bForceReqFmt = true;
+ }
+ break;
+ }
break;
case NUMBERFORMAT_TIME:
- if (nCurNumFormatType == NUMBERFORMAT_DATE)
- nCellFmt = NUMBERFORMAT_DATETIME;
+ switch (nCurNumFormatType)
+ {
+ case NUMBERFORMAT_DATE:
+ // An empty cell formatted as date shall not result in the
+ // null date and current time, but only in current time.
+ if (fCell != 0.0)
+ nReqFmt = NUMBERFORMAT_DATETIME;
+ break;
+ case NUMBERFORMAT_DATETIME:
+ // Requesting current time on an empty date+time cell
+ // inserts both current date+time.
+ if (fCell == 0.0)
+ nReqFmt = NUMBERFORMAT_DATETIME;
+ else
+ {
+ // Add current time to an existing date+time where time is
+ // zero and date is current date, else force time only.
+ double fDate = rtl::math::approxFloor( fCell);
+ double fTime = fCell - fDate;
+ if (fTime == 0.0 && fDate == (Date( Date::SYSTEM) - *pFormatter->GetNullDate()))
+ nReqFmt = NUMBERFORMAT_DATETIME;
+ else
+ bForceReqFmt = true;
+ }
+ break;
+ }
break;
default:
assert(!"unhandled current date/time request");
- nCellFmt = NUMBERFORMAT_DATETIME;
+ nReqFmt = NUMBERFORMAT_DATETIME;
}
double fVal(0);
- switch (nCellFmt)
+ switch (nReqFmt)
{
case NUMBERFORMAT_DATE:
{
@@ -284,14 +343,13 @@ void ScViewFunc::InsertCurrentTime(short nCellFmt, const OUString& rUndoStr)
{
case NUMBERFORMAT_DATE:
{
- double fDate = rtl::math::approxFloor( rDoc.GetValue( aCurPos));
+ double fDate = rtl::math::approxFloor( fCell);
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;
@@ -302,7 +360,7 @@ void ScViewFunc::InsertCurrentTime(short nCellFmt, const OUString& rUndoStr)
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.
+ // fractional date+time instead of only date value.
fVal = aActDateTime - DateTime( *pFormatter->GetNullDate());
}
}
@@ -315,9 +373,10 @@ void ScViewFunc::InsertCurrentTime(short nCellFmt, const OUString& rUndoStr)
pDocSh->GetDocFunc().SetValueCell(aCurPos, fVal, true);
// Set the new cell format only when it differs from the current cell
- // format type.
- if (nCellFmt != nCurNumFormatType)
- SetNumberFormat(nCellFmt);
+ // format type. Preserve a date+time format unless we force a format
+ // through.
+ if (bForceReqFmt || (nReqFmt != nCurNumFormatType && nCurNumFormatType != NUMBERFORMAT_DATETIME))
+ SetNumberFormat(nReqFmt);
pUndoMgr->LeaveListAction();
}
More information about the Libreoffice-commits
mailing list