tdf#153023 Disable Thousand separator for NatNum12
Add some helper to get NatNum12 state
Modify both Number format dialog and Sidebar
Transform CAT_ defines in enum
Change-Id: Iaa3127bf07223caac60e409306a1bee2edc37428
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145513
Tested-by: Jenkins
Reviewed-by: Eike Rathke <erack@redhat.com>
diff --git a/cui/source/tabpages/numfmt.cxx b/cui/source/tabpages/numfmt.cxx
index e6e669d..63f9d5c 100644
--- a/cui/source/tabpages/numfmt.cxx
+++ b/cui/source/tabpages/numfmt.cxx
@@ -942,7 +942,8 @@ void SvxNumberFormatTabPage::UpdateOptions_Impl( bool bCheckCatChange /*= sal_Fa
m_xBtnNegRed->set_active( bNegRed );
if ( nCategory != CAT_SCIENTIFIC )
{
m_xBtnThousand->set_sensitive( nCategory != CAT_TIME );
m_xBtnThousand->set_sensitive( nCategory != CAT_TIME
&& !pNumFmtShell->IsNatNum12( theFormat ) );
m_xBtnThousand->set_active( bThousand && nCategory != CAT_TIME );
}
break;
diff --git a/include/svl/numformat.hxx b/include/svl/numformat.hxx
index 6ff0483..0a374f3 100644
--- a/include/svl/numformat.hxx
+++ b/include/svl/numformat.hxx
@@ -238,6 +238,9 @@ public:
/// Whether format index nFIndex is of type text or not
bool IsTextFormat(sal_uInt32 nFIndex) const;
/// Whether format index nFIndex has NatNum12 modifier
bool IsNatNum12(sal_uInt32 nFIndex) const;
/// Get additional info of a format index, e.g. for dialog box
void GetFormatSpecialInfo(sal_uInt32 nFormat, bool& bThousand, bool& IsRed,
sal_uInt16& nPrecision, sal_uInt16& nLeadingCnt);
diff --git a/include/svx/numfmtsh.hxx b/include/svx/numfmtsh.hxx
index 360a067..db593eb 100644
--- a/include/svx/numfmtsh.hxx
+++ b/include/svx/numfmtsh.hxx
@@ -38,17 +38,20 @@ enum class SvxNumberValueType
};
// sort order of the category ListBox entries in the TabPage
#define CAT_ALL 0
#define CAT_USERDEFINED 1
#define CAT_NUMBER 2
#define CAT_PERCENT 3
#define CAT_CURRENCY 4
#define CAT_DATE 5
#define CAT_TIME 6
#define CAT_SCIENTIFIC 7
#define CAT_FRACTION 8
#define CAT_BOOLEAN 9
#define CAT_TEXT 10
enum SvxNumberFormatCategory
{
CAT_ALL = 0,
CAT_USERDEFINED,
CAT_NUMBER,
CAT_PERCENT,
CAT_CURRENCY,
CAT_DATE,
CAT_TIME,
CAT_SCIENTIFIC,
CAT_FRACTION,
CAT_BOOLEAN,
CAT_TEXT
};
#define SELPOS_NONE -1
@@ -130,6 +133,8 @@ public:
sal_uInt16 GetFormatIntegerDigits( std::u16string_view rFormat ) const;
bool IsNatNum12( std::u16string_view rFormat ) const;
void MakePreviewString( const OUString& rFormatStr,
OUString& rPreviewStr,
const Color*& rpFontColor );
diff --git a/sc/source/ui/sidebar/NumberFormatPropertyPanel.cxx b/sc/source/ui/sidebar/NumberFormatPropertyPanel.cxx
index c9910cc..b2530df 100644
--- a/sc/source/ui/sidebar/NumberFormatPropertyPanel.cxx
+++ b/sc/source/ui/sidebar/NumberFormatPropertyPanel.cxx
@@ -23,6 +23,7 @@
#include <sfx2/dispatch.hxx>
#include <svl/intitem.hxx>
#include <svl/stritem.hxx>
#include <svx/numfmtsh.hxx>
#include <o3tl/string_view.hxx>
#include <com/sun/star/lang/IllegalArgumentException.hpp>
@@ -185,12 +186,17 @@ void NumberFormatPropertyPanel::NotifyItemUpdate(
sal_uInt16 nVal = pItem->GetValue();
mnCategorySelected = nVal;
mxLbCategory->set_active(nVal);
if (nVal < 8 && // General, Number, Percent, Currency, Time, Scientific, Fraction
nVal != 4 ) // not Date
// There is an offset between category list enum and listbox in side panel
SvxNumberFormatCategory nCategory = static_cast< SvxNumberFormatCategory >( nVal + 1 );
if (nCategory <= CAT_FRACTION && // General, Number, Percent, Currency, Time, Scientific, Fraction
nCategory != CAT_DATE ) // not Date
{
bool bIsScientific ( nVal == 6 );// For scientific, Thousand separator is replaced by Engineering notation
bool bIsFraction ( nVal == 7 ); // For fraction, Decimal places is replaced by Denominator places
bool bIsTime ( nVal == 5 ); // For Time, Decimal places and NegRed available
// For scientific, Thousand separator is replaced by Engineering notation
bool bIsScientific ( nCategory == CAT_SCIENTIFIC );
// For fraction, Decimal places is replaced by Denominator places
bool bIsFraction ( nCategory == CAT_FRACTION );
// For Time, Decimal places and NegRed available
bool bIsTime ( nCategory == CAT_TIME );
mxBtnThousand->set_visible( !bIsScientific );
mxBtnThousand->set_sensitive( !bIsScientific && !bIsTime );
mxBtnThousand->set_active(false);
@@ -226,12 +232,14 @@ void NumberFormatPropertyPanel::NotifyItemUpdate(
bool bNegRed = false;
sal_uInt16 nPrecision = 0;
sal_uInt16 nLeadZeroes = 0;
bool bNatNum12 = false;
SvxNumberFormatCategory nCategory = static_cast< SvxNumberFormatCategory >( mnCategorySelected + 1 );
if( eState >= SfxItemState::DEFAULT)
{
const SfxStringItem* pItem = static_cast<const SfxStringItem*>(pState);
const OUString& aCode = pItem->GetValue();
sal_Int32 nIndex = 0;
sal_Int32 aFormat[4] = {0};
sal_Int32 aFormat[5] = {0};
for (sal_Int32 & rn : aFormat)
{
rn = o3tl::toInt32(o3tl::getToken(aCode, 0, ',', nIndex));
@@ -242,6 +250,7 @@ void NumberFormatPropertyPanel::NotifyItemUpdate(
bNegRed = static_cast<bool>(aFormat[1]);
nPrecision = static_cast<sal_uInt16>(aFormat[2]);
nLeadZeroes = static_cast<sal_uInt16>(aFormat[3]);
bNatNum12 = static_cast< bool >( aFormat[4] );
}
else
{
@@ -250,6 +259,11 @@ void NumberFormatPropertyPanel::NotifyItemUpdate(
nPrecision = 0;
nLeadZeroes = 1;
}
if ( nCategory == CAT_NUMBER ||
nCategory == CAT_PERCENT ||
nCategory == CAT_CURRENCY ||
nCategory == CAT_FRACTION )
mxBtnThousand->set_sensitive( !bNatNum12 );
if ( mxBtnThousand->get_visible() )
mxBtnThousand->set_active(bThousand);
else if ( mxBtnEngineering->get_visible() )
diff --git a/sc/source/ui/view/formatsh.cxx b/sc/source/ui/view/formatsh.cxx
index 9c35f3f..cc3c731 100644
--- a/sc/source/ui/view/formatsh.cxx
+++ b/sc/source/ui/view/formatsh.cxx
@@ -2519,6 +2519,7 @@ void ScFormatShell::GetNumFormatState( SfxItemSet& rSet )
const OUString sNegRed = OUString::number(static_cast<sal_Int32>(bNegRed));
const OUString sPrecision = OUString::number(nPrecision);
const OUString sLeadZeroes = OUString::number(nLeadZeroes);
const OUString sNatNum12 = OUString::number( static_cast< sal_Int32 >( pFormatter->IsNatNum12( nNumberFormat ) ) );
aFormat += sThousand +
sBreak +
@@ -2527,6 +2528,8 @@ void ScFormatShell::GetNumFormatState( SfxItemSet& rSet )
sPrecision +
sBreak +
sLeadZeroes +
sBreak +
sNatNum12 +
sBreak;
rSet.Put(SfxStringItem(nWhich, aFormat));
diff --git a/svl/source/numbers/zforlist.cxx b/svl/source/numbers/zforlist.cxx
index ca8b652..c85ae2a 100644
--- a/svl/source/numbers/zforlist.cxx
+++ b/svl/source/numbers/zforlist.cxx
@@ -2257,6 +2257,13 @@ OUString SvNumberFormatter::GetLangDecimalSep( LanguageType nLang ) const
return aRet;
}
bool SvNumberFormatter::IsNatNum12( sal_uInt32 nFIndex ) const
{
::osl::MutexGuard aGuard( GetInstanceMutex() );
const SvNumberformat* pFormat = GetFormatEntry( nFIndex );
return pFormat && pFormat->GetNatNumModifierString().startsWith( "[NatNum12" );
}
sal_uInt32 SvNumberFormatter::GetFormatSpecialInfo( const OUString& rFormatString,
bool& bThousand, bool& IsRed, sal_uInt16& nPrecision,
diff --git a/svx/source/items/numfmtsh.cxx b/svx/source/items/numfmtsh.cxx
index 1aa58a32..8605817 100644
--- a/svx/source/items/numfmtsh.cxx
+++ b/svx/source/items/numfmtsh.cxx
@@ -346,6 +346,13 @@ sal_uInt16 SvxNumberFormatShell::GetFormatIntegerDigits(std::u16string_view rFor
return pFormatter->GetFormatIntegerDigits(nFmtKey);
}
bool SvxNumberFormatShell::IsNatNum12(std::u16string_view rFormat) const
{
sal_uInt32 nFmtKey = pFormatter->GetEntryKey(rFormat, eCurLanguage);
return pFormatter->IsNatNum12(nFmtKey);
}
void SvxNumberFormatShell::GetOptions(const OUString& rFormat, bool& rThousand, bool& rNegRed,
sal_uInt16& rPrecision, sal_uInt16& rLeadingZeroes,
sal_uInt16& rCatLbPos)