[libreoffice/f20] refine current date/time hotkey handling
Eike Rathke
erack at fedoraproject.org
Tue Aug 26 12:10:08 UTC 2014
commit 1634af7e472480ad94253d71098dfcc1ec3afb8f
Author: Eike Rathke <erack at redhat.com>
Date: Tue Aug 26 14:09:40 2014 +0200
refine current date/time hotkey handling
...-refine-current-date-time-hotkey-handling.patch | 316 ++++++++++++++++++++
libreoffice.spec | 2 +
2 files changed, 318 insertions(+), 0 deletions(-)
---
diff --git a/0001-refine-current-date-time-hotkey-handling.patch b/0001-refine-current-date-time-hotkey-handling.patch
new file mode 100644
index 0000000..14eb1ce
--- /dev/null
+++ b/0001-refine-current-date-time-hotkey-handling.patch
@@ -0,0 +1,316 @@
+From 351235d046c48cf2d9ccbca4175c5b70bdbae847 Mon Sep 17 00:00:00 2001
+Message-Id: <351235d046c48cf2d9ccbca4175c5b70bdbae847.1409054200.git.erack at redhat.com>
+From: Eike Rathke <erack at redhat.com>
+Date: Mon, 25 Aug 2014 16:34:20 +0200
+Subject: [PATCH] refine current date/time hotkey handling
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="------------erAck-patch-parts"
+
+This is a multi-part message in MIME format.
+--------------erAck-patch-parts
+Content-Type: text/plain; charset=UTF-8; format=fixed
+Content-Transfer-Encoding: 8bit
+
+
+Previously, a date or time hotkey lead to always the current date+time
+value being set at the current cell, just formatted differently to
+either date or time. This not only looked strange in the input line that
+still displayed the full date+time value, but also affected day and time
+calculations involving these values.
+
+With this change the result depends on the previous value and formatting
+of the cell. Furthermore, inserting a current date or time value at the
+cursor position while editing a cell is now possible.
+
+If cell is in input or edit mode, insert date/time at cursor position,
+else create a date or time or date+time cell as follows:
+
+* 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
+
+This is a backport of a series of commits on master, i.e. mainly
+32e8c47df81292c71ce1d885762358f18559bdb7
+0f4a999e02aff56043506e38dfa53ea3b349ce25
+and others.
+
+Conflicts:
+ sc/source/ui/view/viewfun6.cxx
+
+Change-Id: Ief48b3e312345ad5e289921ff5120dd074661882
+---
+ sc/source/ui/view/viewfun6.cxx | 229 ++++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 205 insertions(+), 24 deletions(-)
+
+
+--------------erAck-patch-parts
+Content-Type: text/x-patch; name="0001-refine-current-date-time-hotkey-handling.patch"
+Content-Transfer-Encoding: 8bit
+Content-Disposition: attachment; filename="0001-refine-current-date-time-hotkey-handling.patch"
+
+diff --git a/sc/source/ui/view/viewfun6.cxx b/sc/source/ui/view/viewfun6.cxx
+index 8ec8bf1..a55dec3 100644
+--- a/sc/source/ui/view/viewfun6.cxx
++++ b/sc/source/ui/view/viewfun6.cxx
+@@ -25,6 +25,7 @@
+ #include <vcl/msgbox.hxx>
+ #include "svl/zforlist.hxx"
+ #include "svl/zformat.hxx"
++#include <editeng/editview.hxx>
+
+ #include "viewfunc.hxx"
+ #include "detfunc.hxx"
+@@ -44,6 +45,7 @@
+ #include "markdata.hxx"
+ #include "drawview.hxx"
+ #include "globalnames.hxx"
++#include "inputhdl.hxx"
+
+ #include <vector>
+
+@@ -237,31 +239,210 @@ void ScViewFunc::DetectiveMarkSucc()
+ MarkAndJumpToRanges(aDestRanges);
+ }
+
+-void ScViewFunc::InsertCurrentTime(short nCellFmt, const OUString& rUndoStr)
++/** Insert date or time into current cell.
++
++ If cell is in input or edit mode, insert date/time at cursor position, else
++ create a date or time or date+time cell as follows:
++
++ - 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* pViewData = GetViewData();
+- ScAddress aCurPos = pViewData->GetCurPos();
+- ScDocShell* pDocSh = pViewData->GetDocShell();
+- ScDocument* pDoc = pDocSh->GetDocument();
+- ::svl::IUndoManager* pUndoMgr = pDocSh->GetUndoManager();
+- SvNumberFormatter* pFormatter = pDoc->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);
+- pUndoMgr->EnterListAction(rUndoStr, rUndoStr);
+- pDocSh->GetDocFunc().SetValueCell(aCurPos, fDate+fTime, true);
+-
+- // Set the new cell format only when it differs from the current cell
+- // format type.
+- sal_uInt32 nCurNumFormat = pDoc->GetNumberFormat(aCurPos);
+- const SvNumberformat* pEntry = pFormatter->GetEntry(nCurNumFormat);
+- if (!pEntry || !(pEntry->GetType() & nCellFmt))
+- SetNumberFormat(nCellFmt);
+- pUndoMgr->LeaveListAction();
++ ScViewData& rViewData = *GetViewData();
++
++ ScInputHandler* pInputHdl = SC_MOD()->GetInputHdl( rViewData.GetViewShell());
++ bool bInputMode = (pInputHdl && pInputHdl->IsInputMode());
++
++ ScDocShell* pDocSh = rViewData.GetDocShell();
++ ScDocument& rDoc = *pDocSh->GetDocument();
++ ScAddress aCurPos = rViewData.GetCurPos();
++ const sal_uInt32 nCurNumFormat = rDoc.GetNumberFormat(aCurPos);
++ SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
++ const SvNumberformat* pCurNumFormatEntry = pFormatter->GetEntry(nCurNumFormat);
++
++ if (bInputMode)
++ {
++ double fVal = 0.0;
++ switch (nReqFmt)
++ {
++ case NUMBERFORMAT_DATE:
++ {
++ Date aActDate( Date::SYSTEM );
++ fVal = aActDate - *pFormatter->GetNullDate();
++ }
++ break;
++ case NUMBERFORMAT_TIME:
++ {
++ Time aActTime( Time::SYSTEM );
++ fVal = aActTime.GetTimeInDays();
++ }
++ break;
++ default:
++ assert(!"unhandled current date/time request");
++ nReqFmt = NUMBERFORMAT_DATETIME;
++ // fallthru
++ case NUMBERFORMAT_DATETIME:
++ {
++ DateTime aActDateTime( DateTime::SYSTEM );
++ fVal = aActDateTime - DateTime( *pFormatter->GetNullDate());
++ }
++ break;
++ }
++
++ LanguageType nLang = (pCurNumFormatEntry ? pCurNumFormatEntry->GetLanguage() : ScGlobal::eLnge);
++ sal_uInt32 nFormat = pFormatter->GetStandardFormat( nReqFmt, nLang);
++ // This would return a more precise format with seconds and 100th
++ // seconds for a time request.
++ //nFormat = pFormatter->GetStandardFormat( fVal, nFormat, nReqFmt, nLang);
++ OUString aString;
++ Color* pColor;
++ pFormatter->GetOutputString( fVal, nFormat, aString, &pColor);
++
++ pInputHdl->DataChanging();
++ EditView* pTopView = pInputHdl->GetTopView();
++ if (pTopView)
++ pTopView->InsertText( aString);
++ EditView* pTableView = pInputHdl->GetTableView();
++ if (pTableView)
++ pTableView->InsertText( aString);
++ pInputHdl->DataChanged( false, true);
++ }
++ else
++ {
++ 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 (nReqFmt)
++ {
++ case NUMBERFORMAT_DATE:
++ 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:
++ 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");
++ nReqFmt = NUMBERFORMAT_DATETIME;
++ // fallthru
++ case NUMBERFORMAT_DATETIME:
++ break;
++ }
++ double fVal = 0.0;
++ switch (nReqFmt)
++ {
++ case NUMBERFORMAT_DATE:
++ {
++ Date aActDate( Date::SYSTEM );
++ fVal = aActDate - *pFormatter->GetNullDate();
++ }
++ break;
++ case NUMBERFORMAT_TIME:
++ {
++ Time aActTime( Time::SYSTEM );
++ fVal = aActTime.GetTimeInDays();
++ }
++ break;
++ case NUMBERFORMAT_DATETIME:
++ switch (nCurNumFormatType)
++ {
++ case NUMBERFORMAT_DATE:
++ {
++ double fDate = rtl::math::approxFloor( fCell);
++ Time aActTime( Time::SYSTEM );
++ fVal = fDate + aActTime.GetTimeInDays();
++ }
++ break;
++ case NUMBERFORMAT_TIME:
++ {
++ 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;
++ }
++
++ ::svl::IUndoManager* pUndoMgr = pDocSh->GetUndoManager();
++ 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. Preserve a date+time format unless we force a format
++ // through.
++ if (bForceReqFmt || (nReqFmt != nCurNumFormatType && nCurNumFormatType != NUMBERFORMAT_DATETIME))
++ SetNumberFormat(nReqFmt);
++ else
++ rViewData.UpdateInputHandler(); // update input bar with new value
++
++ pUndoMgr->LeaveListAction();
++ }
+ }
+
+ void ScViewFunc::ShowNote( bool bShow )
+
+--------------erAck-patch-parts--
+
+
diff --git a/libreoffice.spec b/libreoffice.spec
index 4edb4e3..4be8018 100644
--- a/libreoffice.spec
+++ b/libreoffice.spec
@@ -301,6 +301,7 @@ Patch46: 0001-Related-rhbz-1130264-plausible-fix-for-reported-cras.patch
Patch47: 0001-disable-libe-book-support.patch
%endif
Patch47: 0001-Resolves-rhbz-1125588-port-LibreOffice-to-ppc64le.patch
+Patch48: 0001-refine-current-date-time-hotkey-handling.patch
%define instdir %{_libdir}
%define baseinstdir %{instdir}/libreoffice
@@ -2246,6 +2247,7 @@ update-desktop-database %{_datadir}/applications &> /dev/null || :
- Resolves: rhbz#1079672: FileDialog: don't insert stale preview image
- Related: rhbz#1130264 plausible fix for reported crash in avmedia
- Resolves: rhbz#1125588 port LibreOffice to ppc64le
+- refine current date/time hotkey handling
* Mon Jul 28 2014 David Tardon <dtardon at redhat.com> - 1:4.2.6.2-1
- new bugfix release
More information about the scm-commits
mailing list