summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2023-04-09 14:47:41 +0200
committerEike Rathke <erack@redhat.com>2023-04-10 00:56:42 +0200
commit185cf4496d8750c9e4905c4e384252b01b85d130 (patch)
tree959344bffa2d94e0db174de3f82230fca157ea57
parenteaf071397a1ff30536616f2ed76051f77fd38ed6 (diff)
Resolves: tdf#154217 Edit date+time User Field and Set Variable
... instead of the raw numeric value. Change-Id: I256cb4fde1e4ea6b0580b3208c5d4948e2573448 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150169 Reviewed-by: Eike Rathke <erack@redhat.com> Tested-by: Jenkins
-rw-r--r--sw/inc/fldbas.hxx5
-rw-r--r--sw/inc/usrfld.hxx4
-rw-r--r--sw/source/core/fields/fldbas.cxx37
-rw-r--r--sw/source/core/fields/usrfld.cxx7
-rw-r--r--sw/source/ui/fldui/fldvar.cxx44
5 files changed, 79 insertions, 18 deletions
diff --git a/sw/inc/fldbas.hxx b/sw/inc/fldbas.hxx
index 5768d822d853..8ece6e214da1 100644
--- a/sw/inc/fldbas.hxx
+++ b/sw/inc/fldbas.hxx
@@ -442,6 +442,8 @@ public:
OUString ExpandValue(const double& rVal, sal_uInt32 nFormat, LanguageType nLng) const;
OUString DoubleToString(const double &rVal, LanguageType eLng) const;
OUString DoubleToString(const double &rVal, sal_uInt32 nFormat) const;
+ /// Query input or formatted value for dialog.
+ OUString GetInputOrDateTime( const OUString& rInput, const double& rVal, sal_uInt32 nFormat ) const;
};
class SW_DLLPUBLIC SwValueField : public SwField
@@ -489,6 +491,9 @@ public:
void SetExpandedFormula(const OUString& rStr);
OUString GetExpandedFormula() const;
+
+ /// Query formula or formatted value for dialog.
+ OUString GetInputOrDateTime() const;
};
#endif // INCLUDED_SW_INC_FLDBAS_HXX
diff --git a/sw/inc/usrfld.hxx b/sw/inc/usrfld.hxx
index faedb80671a8..28d582c4c5ac 100644
--- a/sw/inc/usrfld.hxx
+++ b/sw/inc/usrfld.hxx
@@ -52,9 +52,11 @@ public:
OUString Expand(sal_uInt32 nFormat, sal_uInt16 nSubType, LanguageType nLng);
- OUString GetContent( sal_uInt32 nFormat = 0 );
+ OUString GetContent( sal_uInt32 nFormat = 0 ) const;
void SetContent( const OUString& rStr, sal_uInt32 nFormat = 0 );
+ OUString GetInputOrDateTime( sal_uInt32 nFormat ) const;
+
inline bool IsValid() const;
double GetValue(SwCalc& rCalc); // Recalculate member nValue.
diff --git a/sw/source/core/fields/fldbas.cxx b/sw/source/core/fields/fldbas.cxx
index 2f816d208938..f511c047b183 100644
--- a/sw/source/core/fields/fldbas.cxx
+++ b/sw/source/core/fields/fldbas.cxx
@@ -24,6 +24,7 @@
#include <libxml/xmlwriter.h>
#include <rtl/math.hxx>
+#include <comphelper/string.hxx>
#include <svl/numformat.hxx>
#include <svl/zforlist.hxx>
#include <svl/zformat.hxx>
@@ -648,6 +649,22 @@ OUString SwValueFieldType::DoubleToString( const double &rVal,
pFormatter->GetNumDecimalSep()[0], true );
}
+OUString SwValueFieldType::GetInputOrDateTime( const OUString& rInput, const double& rVal, sal_uInt32 nFormat ) const
+{
+ if (nFormat && nFormat != SAL_MAX_UINT32 && UseFormat())
+ {
+ SvNumberFormatter* pFormatter = m_pDoc->GetNumberFormatter();
+ const SvNumberformat* pEntry = pFormatter->GetEntry(nFormat);
+ if (pEntry && (pEntry->GetType() & SvNumFormatType::DATETIME))
+ {
+ OUString aEdit;
+ pFormatter->GetInputLineString( rVal, nFormat, aEdit);
+ return aEdit;
+ }
+ }
+ return rInput;
+}
+
SwValueField::SwValueField( SwValueFieldType* pFieldType, sal_uInt32 nFormat,
LanguageType nLng, const double fVal )
: SwField(pFieldType, nFormat, nLng)
@@ -861,6 +878,26 @@ OUString SwFormulaField::GetExpandedFormula() const
return GetFormula();
}
+OUString SwFormulaField::GetInputOrDateTime() const
+{
+ // GetFormula() leads to problems with date formats because only the
+ // number string without formatting is returned (additionally that may or
+ // may not use a localized decimal separator due to the convoluted handling
+ // of "formula"). It must be used for expressions though because otherwise
+ // with GetPar2() only the value calculated by SwCalc would be displayed
+ // (instead of test2 = test + 1).
+ // Force a formatted edit value for date+time formats, assuming they are
+ // not editable calculated expressions if the formula doesn't contain
+ // arithmetic operators or assignment.
+
+ const OUString aFormula( GetFormula());
+
+ if (comphelper::string::indexOfAny( aFormula, u"=+-*/", 0) == -1)
+ return static_cast<SwValueFieldType*>(GetTyp())->GetInputOrDateTime( aFormula, GetValue(), GetFormat());
+
+ return aFormula;
+}
+
OUString SwField::GetDescription() const
{
return SwResId(STR_FIELD);
diff --git a/sw/source/core/fields/usrfld.cxx b/sw/source/core/fields/usrfld.cxx
index 4f84b8b7bcbb..b24123c552d3 100644
--- a/sw/source/core/fields/usrfld.cxx
+++ b/sw/source/core/fields/usrfld.cxx
@@ -275,7 +275,12 @@ double SwUserFieldType::GetValue( SwCalc& rCalc )
return m_nValue;
}
-OUString SwUserFieldType::GetContent( sal_uInt32 nFormat )
+OUString SwUserFieldType::GetInputOrDateTime( sal_uInt32 nFormat ) const
+{
+ return static_cast<const SwValueFieldType*>(this)->GetInputOrDateTime( m_aContent, GetValue(), nFormat);
+}
+
+OUString SwUserFieldType::GetContent( sal_uInt32 nFormat ) const
{
if (nFormat && nFormat != SAL_MAX_UINT32)
{
diff --git a/sw/source/ui/fldui/fldvar.cxx b/sw/source/ui/fldui/fldvar.cxx
index bf2456ee8c41..ae3af154f0b5 100644
--- a/sw/source/ui/fldui/fldvar.cxx
+++ b/sw/source/ui/fldui/fldvar.cxx
@@ -225,6 +225,19 @@ IMPL_LINK( SwFieldVarPage, SubTypeListBoxHdl, weld::TreeView&, rBox, void )
SubTypeHdl(&rBox);
}
+static inline sal_uInt32 lcl_getUsedNumFormat( const SwNumFormatTreeView& rNumFormatLB, bool& rbText )
+{
+ sal_uInt32 nNumberFormat = 0;
+ const sal_Int32 nNumFormatPos = rNumFormatLB.get_selected_index();
+ if (nNumFormatPos != -1)
+ {
+ nNumberFormat = rNumFormatLB.GetFormat();
+ if ((rbText = (nNumFormatPos == 0 && nNumberFormat == SAL_MAX_UINT32)))
+ nNumberFormat = 0;
+ }
+ return nNumberFormat;
+}
+
void SwFieldVarPage::SubTypeHdl(const weld::TreeView* pBox)
{
SwFieldTypesEnum nTypeId = static_cast<SwFieldTypesEnum>(m_xTypeLB->get_id(GetTypeSel()).toUInt32());
@@ -277,11 +290,19 @@ void SwFieldVarPage::SubTypeHdl(const weld::TreeView* pBox)
m_xNumFormatLB->select(0);
}
else
- m_xValueED->set_text(pType->GetContent());
+ {
+ bool bText = false;
+ const sal_uInt32 nNumberFormat = lcl_getUsedNumFormat( *m_xNumFormatLB, bText);
+ m_xValueED->set_text(pType->GetInputOrDateTime(nNumberFormat));
+ }
}
}
else
- m_xValueED->set_text(pType->GetContent());
+ {
+ bool bText = false;
+ const sal_uInt32 nNumberFormat = lcl_getUsedNumFormat( *m_xNumFormatLB, bText);
+ m_xValueED->set_text(pType->GetInputOrDateTime(nNumberFormat));
+ }
}
else
{
@@ -336,12 +357,7 @@ void SwFieldVarPage::SubTypeHdl(const weld::TreeView* pBox)
}
if (GetCurField() != nullptr && IsFieldEdit())
{
- // GetFormula leads to problems with date formats because
- // only the numeric value without formatting is returned.
- // It must be used though because otherwise in GetPar2 only
- // the value calculated by Kalkulator would be displayed
- // (instead of test2 = test + 1)
- m_xValueED->set_text(static_cast<SwSetExpField*>(GetCurField())->GetFormula());
+ m_xValueED->set_text(static_cast<SwSetExpField*>(GetCurField())->GetInputOrDateTime());
}
m_xValueED->SetDropEnable(true);
break;
@@ -1010,10 +1026,8 @@ IMPL_LINK(SwFieldVarPage, TBClickHdl, weld::Button&, rBox, void)
// Formula and both are SAL_MAX_UINT32 :-/ but only if
// not another yet unlisted of Additional Formats was
// selected that may claim the top position :-/
- sal_uInt32 nNumberFormat = m_xNumFormatLB->GetFormat();
- const bool bText = (nNumFormatPos == 0 && nNumberFormat == SAL_MAX_UINT32);
- if (bText)
- nNumberFormat = 0;
+ bool bText = false;
+ sal_uInt32 nNumberFormat = lcl_getUsedNumFormat( *m_xNumFormatLB, bText);
if (nNumberFormat && nNumberFormat != SAL_MAX_UINT32)
{ // Switch language to office-language because Kalkulator expects
// String in office format and it should be fed into dialog like
@@ -1060,10 +1074,8 @@ IMPL_LINK(SwFieldVarPage, TBClickHdl, weld::Button&, rBox, void)
// Formula and both are SAL_MAX_UINT32 :-/ but only if
// not another yet unlisted of Additional Formats was
// selected that may claim the top position :-/
- sal_uInt32 nNumberFormat = m_xNumFormatLB->GetFormat();
- const bool bText = (nNumFormatPos == 0 && nNumberFormat == SAL_MAX_UINT32);
- if (bText)
- nNumberFormat = 0;
+ bool bText = false;
+ sal_uInt32 nNumberFormat = lcl_getUsedNumFormat( *m_xNumFormatLB, bText);
aType.SetType(bText ? nsSwGetSetExpType::GSE_STRING : nsSwGetSetExpType::GSE_EXPR);
aType.SetContent( sValue, nNumberFormat );
m_xSelectionLB->append_text(sName);