Kaydet (Commit) 43769b7a authored tarafından Lionel Elie Mamane's avatar Lionel Elie Mamane Kaydeden (comit) Eike Rathke

tdf#93390 correctly handle back-and-forth between numeric and text value

Change-Id: I06711afd5d668816608661f0fe433efd93fef99e
Reviewed-on: https://gerrit.libreoffice.org/19372Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarEike Rathke <erack@redhat.com>
üst 0fff374f
...@@ -66,10 +66,11 @@ protected: ...@@ -66,10 +66,11 @@ protected:
bool m_bStrictFormat : 1; bool m_bStrictFormat : 1;
bool m_bValueDirty : 1;
bool m_bEnableEmptyField : 1; bool m_bEnableEmptyField : 1;
bool m_bAutoColor : 1; bool m_bAutoColor : 1;
bool m_bEnableNaN : 1; bool m_bEnableNaN : 1;
enum valueState { valueDirty, valueString, valueDouble };
valueState m_ValueState;
double m_dCurrentValue; double m_dCurrentValue;
double m_dDefaultValue; double m_dDefaultValue;
...@@ -121,7 +122,7 @@ public: ...@@ -121,7 +122,7 @@ public:
void EnableEmptyField(bool bEnable); void EnableEmptyField(bool bEnable);
// If disabled, the value will be resetted to the last valid value on leave // If disabled, the value will be resetted to the last valid value on leave
void SetDefaultValue(double dDefault) { m_dDefaultValue = dDefault; m_bValueDirty = true; } void SetDefaultValue(double dDefault) { m_dDefaultValue = dDefault; m_ValueState = valueDirty; }
// If the current String is invalid, GetValue() returns this value // If the current String is invalid, GetValue() returns this value
double GetDefaultValue() const { return m_dDefaultValue; } double GetDefaultValue() const { return m_dDefaultValue; }
......
...@@ -304,10 +304,10 @@ FormattedField::FormattedField(vcl::Window* pParent, WinBits nStyle, SvNumberFor ...@@ -304,10 +304,10 @@ FormattedField::FormattedField(vcl::Window* pParent, WinBits nStyle, SvNumberFor
,m_bHasMin(false) ,m_bHasMin(false)
,m_bHasMax(false) ,m_bHasMax(false)
,m_bStrictFormat(true) ,m_bStrictFormat(true)
,m_bValueDirty(true)
,m_bEnableEmptyField(true) ,m_bEnableEmptyField(true)
,m_bAutoColor(false) ,m_bAutoColor(false)
,m_bEnableNaN(false) ,m_bEnableNaN(false)
,m_ValueState(valueDirty)
,m_dCurrentValue(0) ,m_dCurrentValue(0)
,m_dDefaultValue(0) ,m_dDefaultValue(0)
,m_nFormatKey(0) ,m_nFormatKey(0)
...@@ -333,14 +333,14 @@ void FormattedField::SetText(const OUString& rStr) ...@@ -333,14 +333,14 @@ void FormattedField::SetText(const OUString& rStr)
{ {
SpinField::SetText(rStr); SpinField::SetText(rStr);
m_bValueDirty = true; m_ValueState = valueDirty;
} }
void FormattedField::SetText( const OUString& rStr, const Selection& rNewSelection ) void FormattedField::SetText( const OUString& rStr, const Selection& rNewSelection )
{ {
SpinField::SetText( rStr, rNewSelection ); SpinField::SetText( rStr, rNewSelection );
m_bValueDirty = true; m_ValueState = valueDirty;
} }
void FormattedField::SetTextFormatted(const OUString& rStr) void FormattedField::SetTextFormatted(const OUString& rStr)
...@@ -402,15 +402,15 @@ void FormattedField::SetTextFormatted(const OUString& rStr) ...@@ -402,15 +402,15 @@ void FormattedField::SetTextFormatted(const OUString& rStr)
else else
aNewSel = aSel; // don't use the justified version aNewSel = aSel; // don't use the justified version
SpinField::SetText(sFormatted, aNewSel); SpinField::SetText(sFormatted, aNewSel);
m_bValueDirty = false; m_ValueState = valueString;
} }
OUString FormattedField::GetTextValue() const OUString FormattedField::GetTextValue() const
{ {
if (m_bValueDirty) if (m_ValueState != valueString )
{ {
const_cast<FormattedField*>(this)->m_sCurrentTextValue = GetText(); const_cast<FormattedField*>(this)->m_sCurrentTextValue = GetText();
const_cast<FormattedField*>(this)->m_bValueDirty = false; const_cast<FormattedField*>(this)->m_ValueState = valueString;
} }
return m_sCurrentTextValue; return m_sCurrentTextValue;
} }
...@@ -444,7 +444,7 @@ void FormattedField::impl_Modify(bool makeValueDirty) ...@@ -444,7 +444,7 @@ void FormattedField::impl_Modify(bool makeValueDirty)
if (!IsStrictFormat()) if (!IsStrictFormat())
{ {
if(makeValueDirty) if(makeValueDirty)
m_bValueDirty = true; m_ValueState = valueDirty;
SpinField::Modify(); SpinField::Modify();
return; return;
} }
...@@ -455,7 +455,7 @@ void FormattedField::impl_Modify(bool makeValueDirty) ...@@ -455,7 +455,7 @@ void FormattedField::impl_Modify(bool makeValueDirty)
m_sLastValidText = sCheck; m_sLastValidText = sCheck;
m_aLastSelection = GetSelection(); m_aLastSelection = GetSelection();
if(makeValueDirty) if(makeValueDirty)
m_bValueDirty = true; m_ValueState = valueDirty;
} }
else else
{ {
...@@ -518,7 +518,7 @@ void FormattedField::ImplSetTextImpl(const OUString& rNew, Selection* pNewSel) ...@@ -518,7 +518,7 @@ void FormattedField::ImplSetTextImpl(const OUString& rNew, Selection* pNewSel)
SpinField::SetText(rNew, aSel); SpinField::SetText(rNew, aSel);
} }
m_bValueDirty = true; // not always necessary, but better re-evaluate for safety reasons m_ValueState = valueDirty; // not always necessary, but better re-evaluate for safety reasons
} }
bool FormattedField::PreNotify(NotifyEvent& rNEvt) bool FormattedField::PreNotify(NotifyEvent& rNEvt)
...@@ -800,6 +800,7 @@ bool FormattedField::Notify(NotifyEvent& rNEvt) ...@@ -800,6 +800,7 @@ bool FormattedField::Notify(NotifyEvent& rNEvt)
{ {
ImplSetValue(m_dCurrentValue, true); ImplSetValue(m_dCurrentValue, true);
Modify(); Modify();
m_ValueState = valueDouble;
} }
else else
{ {
...@@ -808,8 +809,8 @@ bool FormattedField::Notify(NotifyEvent& rNEvt) ...@@ -808,8 +809,8 @@ bool FormattedField::Notify(NotifyEvent& rNEvt)
SetTextFormatted(sNew); SetTextFormatted(sNew);
else else
SetTextFormatted(m_sDefaultText); SetTextFormatted(m_sDefaultText);
m_ValueState = valueString;
} }
m_bValueDirty = false;
} }
} }
else else
...@@ -869,7 +870,7 @@ void FormattedField::ImplSetValue(double dVal, bool bForce) ...@@ -869,7 +870,7 @@ void FormattedField::ImplSetValue(double dVal, bool bForce)
DBG_ASSERT(ImplGetFormatter() != NULL, "FormattedField::ImplSetValue : can't set a value without a formatter !"); DBG_ASSERT(ImplGetFormatter() != NULL, "FormattedField::ImplSetValue : can't set a value without a formatter !");
m_bValueDirty = false; m_ValueState = valueDouble;
m_dCurrentValue = dVal; m_dCurrentValue = dVal;
OUString sNewText; OUString sNewText;
...@@ -894,7 +895,7 @@ void FormattedField::ImplSetValue(double dVal, bool bForce) ...@@ -894,7 +895,7 @@ void FormattedField::ImplSetValue(double dVal, bool bForce)
} }
ImplSetTextImpl(sNewText, NULL); ImplSetTextImpl(sNewText, NULL);
m_bValueDirty = false; m_ValueState = valueDouble;
DBG_ASSERT(CheckText(sNewText), "FormattedField::ImplSetValue : formatted string doesn't match the criteria !"); DBG_ASSERT(CheckText(sNewText), "FormattedField::ImplSetValue : formatted string doesn't match the criteria !");
} }
...@@ -902,7 +903,7 @@ bool FormattedField::ImplGetValue(double& dNewVal) ...@@ -902,7 +903,7 @@ bool FormattedField::ImplGetValue(double& dNewVal)
{ {
dNewVal = m_dCurrentValue; dNewVal = m_dCurrentValue;
if (!m_bValueDirty) if (m_ValueState == valueDouble)
return true; return true;
dNewVal = m_dDefaultValue; dNewVal = m_dDefaultValue;
...@@ -948,7 +949,7 @@ bool FormattedField::ImplGetValue(double& dNewVal) ...@@ -948,7 +949,7 @@ bool FormattedField::ImplGetValue(double& dNewVal)
void FormattedField::SetValue(double dVal) void FormattedField::SetValue(double dVal)
{ {
ImplSetValue(dVal, m_bValueDirty); ImplSetValue(dVal, m_ValueState != valueDouble);
} }
double FormattedField::GetValue() double FormattedField::GetValue()
...@@ -962,7 +963,7 @@ double FormattedField::GetValue() ...@@ -962,7 +963,7 @@ double FormattedField::GetValue()
m_dCurrentValue = m_dDefaultValue; m_dCurrentValue = m_dDefaultValue;
} }
m_bValueDirty = false; m_ValueState = valueDouble;
return m_dCurrentValue; return m_dCurrentValue;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment