diff options
Diffstat (limited to 'cui/source/tabpages/numfmt.cxx')
-rw-r--r-- | cui/source/tabpages/numfmt.cxx | 1771 |
1 files changed, 1771 insertions, 0 deletions
diff --git a/cui/source/tabpages/numfmt.cxx b/cui/source/tabpages/numfmt.cxx new file mode 100644 index 0000000000..21972673cc --- /dev/null +++ b/cui/source/tabpages/numfmt.cxx @@ -0,0 +1,1771 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <sal/config.h> + +#include <o3tl/safeint.hxx> +#include <svl/eitem.hxx> +#include <svl/intitem.hxx> +#include <sfx2/objsh.hxx> +#include <vcl/outdev.hxx> +#include <i18nlangtag/lang.h> +#include <svx/svxids.hrc> +#include <svtools/colorcfg.hxx> + +#include <numcategories.hrc> +#include <strings.hrc> + +#include <svx/numinf.hxx> + +#include <numfmt.hxx> +#include <svx/numfmtsh.hxx> +#include <dialmgr.hxx> +#include <sfx2/basedlgs.hxx> +#include <svx/flagsdef.hxx> +#include <vector> +#include <com/sun/star/frame/XModel.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <limits> +#include <memory> + +using ::com::sun::star::uno::Reference; +using ::com::sun::star::lang::XServiceInfo; +using ::com::sun::star::uno::UNO_QUERY; + +#define NUMKEY_UNDEFINED SAL_MAX_UINT32 + +// static ---------------------------------------------------------------- + +const WhichRangesContainer SvxNumberFormatTabPage::pRanges( + svl::Items< + SID_ATTR_NUMBERFORMAT_VALUE, SID_ATTR_NUMBERFORMAT_INFO, // 10085 - 10086 + SID_ATTR_NUMBERFORMAT_ONE_AREA, SID_ATTR_NUMBERFORMAT_ONE_AREA, // 10580 - 10580 + SID_ATTR_NUMBERFORMAT_NOLANGUAGE, SID_ATTR_NUMBERFORMAT_NOLANGUAGE, // 10700 - 10700 + SID_ATTR_NUMBERFORMAT_SOURCE, SID_ATTR_NUMBERFORMAT_SOURCE>); // 10932 - 10932 + +/************************************************************************* +#* Method: SvxNumberPreview +#*------------------------------------------------------------------------ +#* +#* Class: SvxNumberPreview +#* Function: Constructor of the class SvxNumberPreview +#* Input: Window, Resource-ID +#* Output: --- +#* +#************************************************************************/ + +SvxNumberPreview::SvxNumberPreview() + : mnPos(-1) + , mnChar(0x0) +{ +} + +/************************************************************************* +#* Method: NotifyChange +#*------------------------------------------------------------------------ +#* +#* Class: SvxNumberPreview +#* Function: Function for changing the preview string +#* Input: String, color +#* Output: --- +#* +#************************************************************************/ + +void SvxNumberPreview::NotifyChange( const OUString& rPrevStr, + const Color* pColor ) +{ + // detect and strip out '*' related placeholders + aPrevStr = rPrevStr; + mnPos = aPrevStr.indexOf( 0x1B ); + if ( mnPos != -1 ) + { + // Right during user input the star symbol is the very + // last character before the user enters another one. + if (mnPos < aPrevStr.getLength() - 1) + { + mnChar = aPrevStr[ mnPos + 1 ]; + // delete placeholder and char to repeat + aPrevStr = aPrevStr.replaceAt( mnPos, 2, u"" ); + } + else + { + // delete placeholder + aPrevStr = aPrevStr.replaceAt( mnPos, 1, u"" ); + // do not attempt to draw a 0 fill character + mnPos = -1; + } + } + if (pColor) + aPrevCol = *pColor; + else + { + svtools::ColorConfig aColorConfig; + Color aFgColor = aColorConfig.GetColorValue(svtools::FONTCOLOR, false).nColor; + if (aFgColor == COL_AUTO) + { + Color aBgColor = aColorConfig.GetColorValue(svtools::DOCCOLOR).nColor; + aFgColor = aBgColor.IsDark() ? COL_WHITE : COL_BLACK; + } + aPrevCol = aFgColor; + } + Invalidate(); +} + +/************************************************************************* +#* Method: Paint +#*------------------------------------------------------------------------ +#* +#* Class: SvxNumberPreview +#* Function: Function for repainting the window. +#* Input: --- +#* Output: --- +#* +#************************************************************************/ + +void SvxNumberPreview::Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle&) +{ + rRenderContext.Push(vcl::PushFlags::ALL); + + svtools::ColorConfig aColorConfig; + Color aBgColor = aColorConfig.GetColorValue(svtools::DOCCOLOR).nColor; + Color aFgColor = aColorConfig.GetColorValue(svtools::FONTCOLOR, false).nColor; + if (aFgColor == COL_AUTO) + aFgColor = aBgColor.IsDark() ? COL_WHITE : COL_BLACK; + rRenderContext.SetBackground(aBgColor); + rRenderContext.SetTextColor(aFgColor); + rRenderContext.Erase(); + + vcl::Font aDrawFont = rRenderContext.GetFont(); + Size aSzWnd(GetOutputSizePixel()); + OUString aTmpStr(aPrevStr); + tools::Long nLeadSpace = (aSzWnd.Width() - rRenderContext.GetTextWidth(aTmpStr)) / 2; + + aDrawFont.SetTransparent(true); + aDrawFont.SetColor(aPrevCol); + rRenderContext.SetFont(aDrawFont); + + if (mnPos != -1) + { + tools::Long nCharWidth = rRenderContext.GetTextWidth(OUString(mnChar)); + + int nNumCharsToInsert = 0; + if (nCharWidth > 0) + nNumCharsToInsert = nLeadSpace / nCharWidth; + + if (nNumCharsToInsert > 0) + { + for (int i = 0; i < nNumCharsToInsert; ++i) + aTmpStr = aTmpStr.replaceAt(mnPos, 0, rtl::OUStringChar(mnChar)); + } + } + + tools::Long nX = 0; + if (mnPos == -1 && nLeadSpace > 0) //tdf#122120 if it won't fit anyway, then left align it + { + nX = nLeadSpace; + } + + Point aPosText(nX, (aSzWnd.Height() - GetTextHeight()) / 2); + rRenderContext.DrawText(aPosText, aTmpStr); + rRenderContext.Pop(); +} + +// class SvxNumberFormatTabPage ------------------------------------------ + +#define REMOVE_DONTKNOW() \ + if (!m_xFtLanguage->get_sensitive()) \ + { \ + m_xFtLanguage->set_sensitive(true); \ + m_xLbLanguage->set_sensitive(true); \ + m_xLbLanguage->set_active_id(pNumFmtShell->GetCurLanguage()); \ + } + +SvxNumberFormatTabPage::SvxNumberFormatTabPage(weld::Container* pPage, weld::DialogController* pController, + const SfxItemSet& rCoreAttrs) + : SfxTabPage(pPage, pController, "cui/ui/numberingformatpage.ui", "NumberingFormatPage", &rCoreAttrs) + , nInitFormat(std::numeric_limits<sal_uInt32>::max()) + , m_nLbFormatSelPosEdComment(SELPOS_NONE) + , bLegacyAutomaticCurrency(false) + , sAutomaticLangEntry(CuiResId(RID_CUISTR_AUTO_ENTRY)) + , m_xFtCategory(m_xBuilder->weld_label("categoryft")) + , m_xLbCategory(m_xBuilder->weld_tree_view("categorylb")) + , m_xFtFormat(m_xBuilder->weld_label("formatft")) + , m_xLbCurrency(m_xBuilder->weld_combo_box("currencylb")) + , m_xLbFormat(m_xBuilder->weld_tree_view("formatlb")) + , m_xFtLanguage(m_xBuilder->weld_label("languageft")) + , m_xCbSourceFormat(m_xBuilder->weld_check_button("sourceformat")) + , m_xFtOptions(m_xBuilder->weld_label("optionsft")) + , m_xFtDecimals(m_xBuilder->weld_label("decimalsft")) + , m_xEdDecimals(m_xBuilder->weld_spin_button("decimalsed")) + , m_xFtDenominator(m_xBuilder->weld_label("denominatorft")) + , m_xEdDenominator(m_xBuilder->weld_spin_button("denominatored")) + , m_xBtnNegRed(m_xBuilder->weld_check_button("negnumred")) + , m_xFtLeadZeroes(m_xBuilder->weld_label("leadzerosft")) + , m_xEdLeadZeroes(m_xBuilder->weld_spin_button("leadzerosed")) + , m_xBtnThousand(m_xBuilder->weld_check_button("thousands")) + , m_xBtnEngineering(m_xBuilder->weld_check_button("engineering")) + , m_xFormatCodeFrame(m_xBuilder->weld_widget("formatcode")) + , m_xEdFormat(m_xBuilder->weld_entry("formatted")) + , m_xIbAdd(m_xBuilder->weld_button("add")) + , m_xIbInfo(m_xBuilder->weld_button("edit")) + , m_xIbRemove(m_xBuilder->weld_button("delete")) + , m_xFtComment(m_xBuilder->weld_label("commentft")) + , m_xEdComment(m_xBuilder->weld_entry("commented")) + , m_xLbLanguage(new SvxLanguageBox(m_xBuilder->weld_combo_box("languagelb"))) + , m_xWndPreview(new weld::CustomWeld(*m_xBuilder, "preview", m_aWndPreview)) +{ + for (size_t i = 0; i < std::size(NUM_CATEGORIES); ++i) + m_xLbCategory->append_text(CuiResId(NUM_CATEGORIES[i])); + + auto nWidth = m_xLbCategory->get_approximate_digit_width() * 22; + m_xLbCategory->set_size_request(nWidth, m_xLbCategory->get_height_rows(7)); + m_xLbFormat->set_size_request(nWidth, m_xLbFormat->get_height_rows(5)); + m_xLbCurrency->set_size_request(nWidth, -1); // force using (narrower) width of its LbFormat sibling + + // Initially remove the "Automatically" entry. + m_xLbCurrency->set_active(-1); // First ensure that nothing is selected. + sAutomaticCurrencyEntry = m_xLbCurrency->get_text(0); + m_xLbCurrency->remove(0); + + Init_Impl(); + SetExchangeSupport(); // this page needs ExchangeSupport + nFixedCategory=-1; +} + +SvxNumberFormatTabPage::~SvxNumberFormatTabPage() +{ + pNumFmtShell.reset(); + pNumItem.reset(); + m_xWndPreview.reset(); + m_xLbLanguage.reset(); +} + +void SvxNumberFormatTabPage::Init_Impl() +{ + bNumItemFlag=true; + bOneAreaFlag=false; + + m_xIbAdd->set_sensitive(false ); + m_xIbRemove->set_sensitive(false ); + m_xIbInfo->set_sensitive(false ); + + m_xEdComment->set_text(m_xLbCategory->get_text(1)); // string for user defined + + m_xEdComment->hide(); + + m_xCbSourceFormat->set_active( false ); + m_xCbSourceFormat->set_sensitive(false); + m_xCbSourceFormat->hide(); + + Link<weld::TreeView&,void> aLink2 = LINK(this, SvxNumberFormatTabPage, SelFormatTreeListBoxHdl_Impl); + Link<weld::ComboBox&,void> aLink3 = LINK(this, SvxNumberFormatTabPage, SelFormatListBoxHdl_Impl); + m_xLbCategory->connect_changed(aLink2); + m_xLbCategory->connect_focus_in(LINK(this, SvxNumberFormatTabPage, LostFocusHdl_Impl)); + m_xLbFormat->connect_changed(aLink2); + m_xLbFormat->connect_focus_in(LINK(this, SvxNumberFormatTabPage, LostFocusHdl_Impl)); + m_xLbLanguage->connect_changed(aLink3); + m_xLbLanguage->connect_focus_in(LINK(this, SvxNumberFormatTabPage, LostFocusHdl_Impl)); + m_xLbCurrency->connect_changed(aLink3); + m_xLbCurrency->connect_focus_in(LINK(this, SvxNumberFormatTabPage, LostFocusHdl_Impl)); + m_xCbSourceFormat->connect_toggled(LINK(this, SvxNumberFormatTabPage, SelFormatClickHdl_Impl)); + m_xCbSourceFormat->connect_focus_in(LINK(this, SvxNumberFormatTabPage, LostFocusHdl_Impl)); + + Link<weld::SpinButton&,void> aLink = LINK( this, SvxNumberFormatTabPage, OptEditHdl_Impl ); + + m_xEdDecimals->connect_value_changed(aLink); + m_xEdDecimals->connect_focus_in(LINK(this, SvxNumberFormatTabPage, LostFocusHdl_Impl)); + m_xEdDenominator->connect_value_changed(aLink); + m_xEdDenominator->connect_focus_in(LINK(this, SvxNumberFormatTabPage, LostFocusHdl_Impl)); + m_xEdLeadZeroes->connect_value_changed(aLink); + m_xEdLeadZeroes->connect_focus_in(LINK(this, SvxNumberFormatTabPage, LostFocusHdl_Impl)); + + m_xBtnNegRed->connect_toggled(LINK(this, SvxNumberFormatTabPage, OptClickHdl_Impl)); + m_xBtnNegRed->connect_focus_in(LINK(this, SvxNumberFormatTabPage, LostFocusHdl_Impl)); + m_xBtnThousand->connect_toggled(LINK(this, SvxNumberFormatTabPage, OptClickHdl_Impl)); + m_xBtnThousand->connect_focus_in(LINK(this, SvxNumberFormatTabPage, LostFocusHdl_Impl)); + m_xBtnEngineering->connect_toggled(LINK(this, SvxNumberFormatTabPage, OptClickHdl_Impl)); + m_xBtnEngineering->connect_focus_in(LINK(this, SvxNumberFormatTabPage, LostFocusHdl_Impl)); + m_xLbFormat->connect_row_activated(LINK(this, SvxNumberFormatTabPage, DoubleClickHdl_Impl)); + m_xEdFormat->connect_changed(LINK(this, SvxNumberFormatTabPage, EditModifyHdl_Impl)); + m_xEdFormat->connect_focus_in(LINK(this, SvxNumberFormatTabPage, LostFocusHdl_Impl)); + m_xIbAdd->connect_clicked(LINK(this, SvxNumberFormatTabPage, ClickHdl_Impl)); + m_xIbAdd->connect_focus_in(LINK(this, SvxNumberFormatTabPage, LostFocusHdl_Impl)); + m_xIbRemove->connect_clicked(LINK(this, SvxNumberFormatTabPage, ClickHdl_Impl)); + m_xIbRemove->connect_focus_in(LINK(this, SvxNumberFormatTabPage, LostFocusHdl_Impl)); + m_xIbInfo->connect_clicked(LINK(this, SvxNumberFormatTabPage, ClickHdl_Impl)); + UpdateThousandEngineeringCheckBox(); + UpdateDecimalsDenominatorEditBox(); + + // initialize language ListBox + + m_xLbLanguage->SetLanguageList(SvxLanguageListFlags::ALL | SvxLanguageListFlags::ONLY_KNOWN, + false, false, false, true, LANGUAGE_SYSTEM, + css::i18n::ScriptType::WEAK); +} + +std::unique_ptr<SfxTabPage> SvxNumberFormatTabPage::Create( weld::Container* pPage, weld::DialogController* pController, + const SfxItemSet* rAttrSet ) +{ + return std::make_unique<SvxNumberFormatTabPage>(pPage, pController, *rAttrSet); +} + + +/************************************************************************* +#* Method: Reset +#*------------------------------------------------------------------------ +#* +#* Class: SvxNumberFormatTabPage +#* Function: The dialog's attributes are reset +#* using the Itemset. +#* Input: SfxItemSet +#* Output: --- +#* +#************************************************************************/ + +void SvxNumberFormatTabPage::set_active_currency(sal_Int32 nPos) +{ + static_assert(SELPOS_NONE == -1, "SELPOS_NONE was -1 at time of writing"); + if (nPos == 0 && !bLegacyAutomaticCurrency) + { + // Insert "Automatically" if currently used so it is selectable. + m_xLbCurrency->insert_text(0, sAutomaticCurrencyEntry); + bLegacyAutomaticCurrency = true; + } + if (nPos != -1 && !bLegacyAutomaticCurrency) + --nPos; + m_xLbCurrency->set_active(nPos); +} + +sal_uInt32 SvxNumberFormatTabPage::get_active_currency() const +{ + static_assert(SELPOS_NONE == -1, "SELPOS_NONE was -1 at time of writing"); + sal_Int32 nCurrencyPos = m_xLbCurrency->get_active(); + if (nCurrencyPos != -1 && !bLegacyAutomaticCurrency) + ++nCurrencyPos; + return nCurrencyPos; +} + +void SvxNumberFormatTabPage::Reset( const SfxItemSet* rSet ) +{ + const SfxUInt32Item* pValFmtAttr = nullptr; + const SfxPoolItem* pItem = nullptr; + const SfxBoolItem* pAutoEntryAttr = nullptr; + + sal_uInt16 nCatLbSelPos = 0; + sal_uInt16 nFmtLbSelPos = 0; + LanguageType eLangType = LANGUAGE_DONTKNOW; + std::vector<OUString> aFmtEntryList; + SvxNumberValueType eValType = SvxNumberValueType::Undefined; + double nValDouble = 0; + OUString aValString; + + if(const SfxBoolItem* pBoolLangItem = rSet->GetItemIfSet( SID_ATTR_NUMBERFORMAT_NOLANGUAGE )) + { + if(pBoolLangItem->GetValue()) + { + HideLanguage(); + } + else + { + HideLanguage(false); + } + + } + + SfxItemState eState = rSet->GetItemState( GetWhich( SID_ATTR_NUMBERFORMAT_INFO ),true,&pItem); + + if(eState==SfxItemState::SET) + { + if(pNumItem==nullptr) + { + bNumItemFlag=true; + pNumItem.reset( static_cast<SvxNumberInfoItem *>(pItem->Clone()) ); + } + else + { + bNumItemFlag=false; + } + } + else + { + bNumItemFlag=false; + } + + + eState = rSet->GetItemState( GetWhich( SID_ATTR_NUMBERFORMAT_ONE_AREA )); + + if(eState==SfxItemState::SET) + { + const SfxBoolItem* pBoolItem = GetItem( *rSet, SID_ATTR_NUMBERFORMAT_ONE_AREA); + + if(pBoolItem!=nullptr) + { + bOneAreaFlag= pBoolItem->GetValue(); + } + } + + eState = rSet->GetItemState( SID_ATTR_NUMBERFORMAT_SOURCE ); + + if ( eState == SfxItemState::SET ) + { + const SfxBoolItem* pBoolItem = + GetItem( *rSet, SID_ATTR_NUMBERFORMAT_SOURCE ); + if ( pBoolItem ) + m_xCbSourceFormat->set_active(pBoolItem->GetValue()); + else + m_xCbSourceFormat->set_active( false ); + m_xCbSourceFormat->set_sensitive(true); + m_xCbSourceFormat->show(); + } + else + { + bool bInit = false; // set to sal_True for debug test + m_xCbSourceFormat->set_active( bInit ); + m_xCbSourceFormat->set_sensitive( bInit ); + m_xCbSourceFormat->set_visible( bInit ); + } + + // pNumItem must have been set from outside! + DBG_ASSERT( pNumItem, "No NumberInfo, no NumberFormatter, goodbye. CRASH. :-(" ); + + eState = rSet->GetItemState( GetWhich( SID_ATTR_NUMBERFORMAT_VALUE ) ); + + if ( SfxItemState::DONTCARE != eState ) + pValFmtAttr = GetItem( *rSet, SID_ATTR_NUMBERFORMAT_VALUE ); + + eValType = pNumItem->GetValueType(); + + switch ( eValType ) + { + case SvxNumberValueType::String: + aValString = pNumItem->GetValueString(); + break; + case SvxNumberValueType::Number: + // #50441# string may be set in addition to the value + aValString = pNumItem->GetValueString(); + nValDouble = pNumItem->GetValueDouble(); + break; + case SvxNumberValueType::Undefined: + default: + break; + } + + pNumFmtShell.reset(); // delete old shell if applicable (== reset) + + nInitFormat = pValFmtAttr // memorize init key + ? pValFmtAttr->GetValue() // (for FillItemSet()) + : std::numeric_limits<sal_uInt32>::max(); // == DONT_KNOW + + + if ( eValType == SvxNumberValueType::String ) + pNumFmtShell.reset( SvxNumberFormatShell::Create( + pNumItem->GetNumberFormatter(), + pValFmtAttr ? nInitFormat : 0, + eValType, + aValString ) ); + else + pNumFmtShell.reset( SvxNumberFormatShell::Create( + pNumItem->GetNumberFormatter(), + pValFmtAttr ? nInitFormat : 0, + eValType, + nValDouble, + &aValString ) ); + + + bool bUseStarFormat = false; + if (SfxObjectShell* pDocSh = SfxObjectShell::Current()) + { + // is this a calc document + Reference< XServiceInfo > xSI( pDocSh->GetModel(), UNO_QUERY ); + if ( xSI.is() ) + bUseStarFormat = xSI->supportsService("com.sun.star.sheet.SpreadsheetDocument"); + } + pNumFmtShell->SetUseStarFormat( bUseStarFormat ); + + FillCurrencyBox(); + + OUString aPrevString; + const Color* pDummy = nullptr; + pNumFmtShell->GetInitSettings( nCatLbSelPos, eLangType, nFmtLbSelPos, + aFmtEntryList, aPrevString, pDummy ); + + if (nCatLbSelPos==CAT_CURRENCY) + set_active_currency(pNumFmtShell->GetCurrencySymbol()); + + nFixedCategory=nCatLbSelPos; + if(bOneAreaFlag) + { + OUString sFixedCategory = m_xLbCategory->get_text(nFixedCategory); + m_xLbCategory->clear(); + m_xLbCategory->append_text(sFixedCategory); + SetCategory(0); + } + else + { + SetCategory(nCatLbSelPos ); + } + eState = rSet->GetItemState( SID_ATTR_NUMBERFORMAT_ADD_AUTO ); + if(SfxItemState::SET == eState) + pAutoEntryAttr = GetItem( *rSet, SID_ATTR_NUMBERFORMAT_ADD_AUTO ); + // no_NO is an alias for nb_NO and normally isn't listed, we need it for + // backwards compatibility, but only if the format passed is of + // LanguageType no_NO. + if ( eLangType == LANGUAGE_NORWEGIAN ) + { + m_xLbLanguage->remove_id(eLangType); // in case we're already called + m_xLbLanguage->InsertLanguage( eLangType ); + } + m_xLbLanguage->set_active_id(eLangType); + if(pAutoEntryAttr) + AddAutomaticLanguage_Impl(eLangType, pAutoEntryAttr->GetValue()); + UpdateFormatListBox_Impl(false,true); + +//! This spoils everything because it rematches currency formats based on +//! the selected m_xLbCurrency entry instead of the current format. +//! Besides that everything seems to be initialized by now, so why call it? +// SelFormatHdl_Impl(m_xLbCategory.get()); + + if ( pValFmtAttr ) + { + EditHdl_Impl(m_xEdFormat.get()); // UpdateOptions_Impl() as a side effect + } + else // DONT_KNOW + { + // everything disabled except direct input or changing the category + Obstructing(); + } + + if ( m_xCbSourceFormat->get_active() ) + { + // everything disabled except SourceFormat checkbox + EnableBySourceFormat_Impl(); + } +} + +/************************************************************************* +#* Method: Obstructing +#*------------------------------------------------------------------------ +#* +#* Class: SvxNumberFormatTabPage +#* Function: Disable the controls except from changing the category +#* and direct input. +#* Input: --- +#* Output: --- +#* +#************************************************************************/ +void SvxNumberFormatTabPage::Obstructing() +{ + m_xLbFormat->select(-1); + m_xLbLanguage->set_active(-1); + m_xFtLanguage->set_sensitive(false); + m_xLbLanguage->set_sensitive(false); + + m_xIbAdd->set_sensitive(false ); + m_xIbRemove->set_sensitive(false ); + m_xIbInfo->set_sensitive(false ); + + m_xBtnNegRed->set_sensitive(false); + m_xBtnThousand->set_sensitive(false); + m_xBtnEngineering->set_sensitive(false); + m_xFtLeadZeroes->set_sensitive(false); + m_xFtDecimals->set_sensitive(false); + m_xFtDenominator->set_sensitive(false); + m_xEdLeadZeroes->set_sensitive(false); + m_xEdDecimals->set_sensitive(false); + m_xEdDenominator->set_sensitive(false); + m_xFtOptions->set_sensitive(false); + m_xEdDecimals->set_text( OUString() ); + m_xEdLeadZeroes->set_text( OUString() ); + m_xBtnNegRed->set_active( false ); + m_xBtnThousand->set_active( false ); + m_xBtnEngineering->set_active( false ); + m_aWndPreview.NotifyChange( OUString() ); + + m_xLbCategory->select(0); + m_xEdFormat->set_text( OUString() ); + m_xFtComment->set_label( OUString() ); + m_xEdComment->set_text(m_xLbCategory->get_text(1)); // string for user defined + + m_xEdFormat->grab_focus(); +} + + +/************************************************************************* +#* Enable/Disable dialog parts depending on the value of the SourceFormat +#* checkbox. +#************************************************************************/ +void SvxNumberFormatTabPage::EnableBySourceFormat_Impl() +{ + bool bEnable = !m_xCbSourceFormat->get_active(); + if ( !bEnable ) + m_xCbSourceFormat->grab_focus(); + m_xFtCategory->set_sensitive( bEnable ); + m_xLbCategory->set_sensitive( bEnable ); + m_xFtFormat->set_sensitive( bEnable ); + m_xLbCurrency->set_sensitive( bEnable ); + m_xLbFormat->set_sensitive( bEnable ); + m_xFtLanguage->set_sensitive( bEnable ); + m_xLbLanguage->set_sensitive( bEnable ); + m_xFtDecimals->set_sensitive( bEnable ); + m_xEdDecimals->set_sensitive( bEnable ); + m_xFtDenominator->set_sensitive( bEnable ); + m_xEdDenominator->set_sensitive( bEnable ); + m_xFtLeadZeroes->set_sensitive( bEnable ); + m_xEdLeadZeroes->set_sensitive( bEnable ); + m_xBtnNegRed->set_sensitive( bEnable ); + m_xBtnThousand->set_sensitive( bEnable ); + m_xBtnEngineering->set_sensitive( bEnable ); + m_xFtOptions->set_sensitive( bEnable ); + m_xFormatCodeFrame->set_sensitive( bEnable ); +} + + +/************************************************************************* +#* Method: HideLanguage +#*------------------------------------------------------------------------ +#* +#* Class: SvxNumberFormatTabPage +#* Function: Hides the Languages and Locales: +#* Input: sal_Bool nFlag +#* Output: --- +#* +#************************************************************************/ + +void SvxNumberFormatTabPage::HideLanguage(bool bFlag) +{ + m_xFtLanguage->set_visible(!bFlag); + m_xLbLanguage->set_visible(!bFlag); +} + +/************************************************************************* +#* Method: FillItemSet +#*------------------------------------------------------------------------ +#* +#* Class: SvxNumberFormatTabPage +#* Function: Adjusts the attributes in the ItemSet, +#* and - if bNumItemFlag is not set - the +#* numItem in the DocShell. +#* Input: SfxItemSet +#* Output: --- +#* +#************************************************************************/ + +bool SvxNumberFormatTabPage::FillItemSet( SfxItemSet* rCoreAttrs ) +{ + bool bDataChanged = m_xFtLanguage->get_sensitive() || m_xCbSourceFormat->get_sensitive(); + if ( bDataChanged ) + { + const SfxItemSet& rMyItemSet = GetItemSet(); + TypedWhichId<SfxUInt32Item> nWhich = GetWhich( SID_ATTR_NUMBERFORMAT_VALUE ); + SfxItemState eItemState = rMyItemSet.GetItemState( nWhich, false ); + + // OK chosen - Is format code input entered already taken over? + // If not, simulate Add. Upon syntax error ignore input and prevent Put. + OUString aFormat = m_xEdFormat->get_text(); + sal_uInt32 nCurKey = pNumFmtShell->GetCurNumFmtKey(); + + if ( m_xIbAdd->get_sensitive() || pNumFmtShell->IsTmpCurrencyFormat(aFormat) ) + { // #79599# It is not sufficient to just add the format code (or + // delete it in case of bOneAreaFlag and resulting category change). + // Upon switching tab pages we need all settings to be consistent + // in case this page will be redisplayed later. + bDataChanged = Click_Impl(*m_xIbAdd); + nCurKey = pNumFmtShell->GetCurNumFmtKey(); + } + else if(nCurKey == NUMKEY_UNDEFINED) + { // something went wrong, e.g. in Writer #70281# + pNumFmtShell->FindEntry(aFormat, &nCurKey); + } + + + // Chosen format: + + if ( bDataChanged ) + { + bDataChanged = ( nInitFormat != nCurKey ); + + if (bDataChanged) + { + rCoreAttrs->Put( SfxUInt32Item( nWhich, nCurKey ) ); + } + else if(SfxItemState::DEFAULT == eItemState) + { + rCoreAttrs->ClearItem( nWhich ); + } + } + + + // List of changed user defined formats: + + std::vector<sal_uInt32> const & aDelFormats = pNumFmtShell->GetUpdateData(); + + if ( !aDelFormats.empty() ) + { + + pNumItem->SetDelFormats( std::vector(aDelFormats) ); + + if(bNumItemFlag) + { + rCoreAttrs->Put( *pNumItem ); + } + else + { + SfxObjectShell* pDocSh = SfxObjectShell::Current(); + DBG_ASSERT( pDocSh, "DocShell not found!" ); + if (pDocSh) + pDocSh->PutItem( *pNumItem ); + } + } + + + // Whether source format is to be taken or not: + + if ( m_xCbSourceFormat->get_sensitive() ) + { + SfxItemState _eItemState = rMyItemSet.GetItemState( SID_ATTR_NUMBERFORMAT_SOURCE, false ); + const SfxBoolItem* pBoolItem = + GetItem( rMyItemSet, SID_ATTR_NUMBERFORMAT_SOURCE ); + bool bOld = pBoolItem && pBoolItem->GetValue(); + rCoreAttrs->Put( SfxBoolItem( SID_ATTR_NUMBERFORMAT_SOURCE, m_xCbSourceFormat->get_active() ) ); + if ( !bDataChanged ) + bDataChanged = (bOld != m_xCbSourceFormat->get_active() || + _eItemState != SfxItemState::SET); + } + + // FillItemSet is only called on OK, here we can notify the + // NumberFormatShell that all new user defined formats are valid. + pNumFmtShell->ValidateNewEntries(); + if(m_xLbLanguage->get_visible() && + m_xLbLanguage->find_text(sAutomaticLangEntry) != -1) + rCoreAttrs->Put(SfxBoolItem(SID_ATTR_NUMBERFORMAT_ADD_AUTO, + m_xLbLanguage->get_active_text() == sAutomaticLangEntry)); + } + + return bDataChanged; +} + + +DeactivateRC SvxNumberFormatTabPage::DeactivatePage( SfxItemSet* _pSet ) +{ + if ( _pSet ) + FillItemSet( _pSet ); + return DeactivateRC::LeavePage; +} + +void SvxNumberFormatTabPage::FillFormatListBox_Impl( std::vector<OUString>& rEntries ) +{ + OUString aEntry; + OUString aTmpString; + size_t i = 0; + short nTmpCatPos; + + m_xLbFormat->clear(); + if (rEntries.empty()) + return; + + m_xLbFormat->freeze(); + + if(bOneAreaFlag) + { + nTmpCatPos=nFixedCategory; + } + else + { + nTmpCatPos=m_xLbCategory->get_selected_index(); + } + + switch (nTmpCatPos) + { + case CAT_ALL: + case CAT_TEXT: + case CAT_NUMBER: i=1; + aEntry=rEntries[0]; + if (nTmpCatPos == CAT_TEXT) + aTmpString=aEntry; + else + aTmpString = pNumFmtShell->GetStandardName(); + m_xLbFormat->append_text(aTmpString); + break; + + default: break; + } + + if(pNumFmtShell!=nullptr) + { + for ( ; i < rEntries.size(); ++i ) + { + aEntry = rEntries[i]; + short aPrivCat = pNumFmtShell->GetCategory4Entry( static_cast<short>(i) ); + if(aPrivCat!=CAT_TEXT) + { + const Color* pPreviewColor = nullptr; + OUString aPreviewString( GetExpColorString( pPreviewColor, aEntry, aPrivCat ) ); + m_xLbFormat->append_text(aPreviewString); + if (pPreviewColor) + m_xLbFormat->set_font_color(m_xLbFormat->n_children() - 1, *pPreviewColor); + } + else + { + m_xLbFormat->append_text(aEntry); + } + } + } + m_xLbFormat->thaw(); + rEntries.clear(); +} + +/************************************************************************* +#* Method: UpdateOptions_Impl +#*------------------------------------------------------------------------ +#* +#* Class: SvxNumberFormatTabPage +#* Function: Adjusts the options attributes +#* depending on the selected format. +#* Input: Flag, whether the category has changed. +#* Output: --- +#* +#************************************************************************/ + +void SvxNumberFormatTabPage::UpdateOptions_Impl( bool bCheckCatChange /*= sal_False*/ ) +{ + OUString theFormat = m_xEdFormat->get_text(); + sal_Int32 nCurCategory = m_xLbCategory->get_selected_index(); + sal_uInt16 nCategory = static_cast<sal_uInt16>(nCurCategory); + sal_uInt16 nDecimals = 0; + sal_uInt16 nZeroes = 0; + bool bNegRed = false; + bool bThousand = false; + sal_Int32 nCurrencyPos = get_active_currency(); + + if(bOneAreaFlag) + nCurCategory=nFixedCategory; + + + pNumFmtShell->GetOptions( theFormat, + bThousand, bNegRed, + nDecimals, nZeroes, + nCategory ); + bool bDoIt=false; + if(nCategory==CAT_CURRENCY) + { + sal_uInt16 nTstPos=pNumFmtShell->FindCurrencyFormat(theFormat); + if(nCurrencyPos!=static_cast<sal_Int32>(nTstPos) && nTstPos!=sal_uInt16(-1)) + { + set_active_currency(nTstPos); + pNumFmtShell->SetCurrencySymbol(nTstPos); + bDoIt=true; + } + } + + if ( nCategory != nCurCategory || bDoIt) + { + if ( bCheckCatChange ) + { + if(bOneAreaFlag) + SetCategory(0); + else + SetCategory(nCategory ); + + UpdateFormatListBox_Impl( true, false ); + } + } + else if ( m_xLbFormat->n_children() > 0 ) + { + sal_uInt32 nCurEntryKey=NUMKEY_UNDEFINED; + if(!pNumFmtShell->FindEntry( m_xEdFormat->get_text(),&nCurEntryKey)) + { + m_xLbFormat->select(-1); + } + } + if(bOneAreaFlag) + { + nCategory=nFixedCategory; + } + + UpdateThousandEngineeringCheckBox(); + UpdateDecimalsDenominatorEditBox(); + switch ( nCategory ) + { + case CAT_SCIENTIFIC: // bThousand is for Engineering notation + { + sal_uInt16 nIntDigits = pNumFmtShell->GetFormatIntegerDigits(theFormat); + bThousand = (nIntDigits > 0) && (nIntDigits % 3 == 0); + m_xBtnEngineering->set_sensitive(true); + m_xBtnEngineering->set_active( bThousand ); + } + [[fallthrough]]; + case CAT_NUMBER: + case CAT_PERCENT: + case CAT_CURRENCY: + case CAT_FRACTION: + case CAT_TIME: + m_xFtOptions->set_sensitive(true); + if ( nCategory == CAT_FRACTION ) + { + m_xFtDenominator->set_sensitive(true); + m_xEdDenominator->set_sensitive(true); + } + else + { + m_xFtDecimals->set_sensitive(true); + m_xEdDecimals->set_sensitive(true); + } + m_xFtLeadZeroes->set_sensitive( nCategory != CAT_TIME ); + m_xEdLeadZeroes->set_sensitive( nCategory != CAT_TIME ); + m_xBtnNegRed->set_sensitive(true); + if ( nCategory == CAT_NUMBER && m_xLbFormat->get_selected_index() == 0 ) + m_xEdDecimals->set_text( "" ); //General format tdf#44399 + else + if ( nCategory == CAT_FRACTION ) + m_xEdDenominator->set_value( nDecimals ); + else + m_xEdDecimals->set_value( nDecimals ); + if ( nCategory != CAT_TIME ) + m_xEdLeadZeroes->set_value( nZeroes ); + m_xBtnNegRed->set_active( bNegRed ); + if ( nCategory != CAT_SCIENTIFIC ) + { + m_xBtnThousand->set_sensitive( nCategory != CAT_TIME + && !pNumFmtShell->IsNatNum12( theFormat ) ); + m_xBtnThousand->set_active( bThousand && nCategory != CAT_TIME ); + } + break; + + case CAT_ALL: + case CAT_USERDEFINED: + case CAT_TEXT: + case CAT_DATE: + case CAT_BOOLEAN: + default: + m_xFtOptions->set_sensitive(false); + m_xFtDecimals->set_sensitive(false); + m_xEdDecimals->set_sensitive(false); + m_xFtDenominator->set_sensitive(false); + m_xEdDenominator->set_sensitive(false); + m_xFtLeadZeroes->set_sensitive(false); + m_xEdLeadZeroes->set_sensitive(false); + m_xBtnNegRed->set_sensitive(false); + m_xBtnThousand->set_sensitive(false); + m_xBtnEngineering->set_sensitive(false); + m_xEdDecimals->set_text( OUString() ); + m_xEdLeadZeroes->set_text( OUString() ); + m_xBtnNegRed->set_active( false ); + m_xBtnThousand->set_active( false ); + m_xBtnEngineering->set_active( false ); + } +} + + +/************************************************************************* +#* Method: UpdateFormatListBox_Impl +#*------------------------------------------------------------------------ +#* +#* Class: SvxNumberFormatTabPage +#* Function: Updates the format listbox and additionally the +#* string in the editbox is changed depending on +#* the bUpdateEdit flag. +#* Input: Flags for category and editbox. +#* Output: --- +#* +#************************************************************************/ + +void SvxNumberFormatTabPage::UpdateFormatListBox_Impl + ( + bool bCat, // Category or country/language ListBox? + bool bUpdateEdit + ) +{ + std::vector<OUString> aEntryList; + short nFmtLbSelPos = 0; + short nTmpCatPos; + + if(bOneAreaFlag) + { + nTmpCatPos=nFixedCategory; + } + else + { + nTmpCatPos=m_xLbCategory->get_selected_index(); + } + + + if ( bCat ) + { + if(nTmpCatPos!=CAT_CURRENCY) + m_xLbCurrency->hide(); + else + m_xLbCurrency->show(); + + pNumFmtShell->CategoryChanged(nTmpCatPos,nFmtLbSelPos, aEntryList); + } + else + pNumFmtShell->LanguageChanged(m_xLbLanguage->get_active_id(), + nFmtLbSelPos,aEntryList); + + REMOVE_DONTKNOW() // possibly UI-Enable + + + if ( (!aEntryList.empty()) && (nFmtLbSelPos != SELPOS_NONE) ) + { + if(bUpdateEdit) + { + OUString aFormat=aEntryList[nFmtLbSelPos]; + m_xEdFormat->set_text(aFormat); + m_xFtComment->set_label(pNumFmtShell->GetComment4Entry(nFmtLbSelPos)); + } + + if(!bOneAreaFlag || !bCat) + { + FillFormatListBox_Impl( aEntryList ); + m_xLbFormat->select(nFmtLbSelPos); + + m_xFtComment->set_label(pNumFmtShell->GetComment4Entry(nFmtLbSelPos)); + if(pNumFmtShell->GetUserDefined4Entry(nFmtLbSelPos)) + { + if(pNumFmtShell->GetComment4Entry(nFmtLbSelPos).isEmpty()) + { + m_xFtComment->set_label(m_xLbCategory->get_text(1)); + } + } + ChangePreviewText( static_cast<sal_uInt16>(nFmtLbSelPos) ); + } + + } + else + { + FillFormatListBox_Impl( aEntryList ); + if(nFmtLbSelPos != SELPOS_NONE) + { + m_xLbFormat->select(static_cast<sal_uInt16>(nFmtLbSelPos)); + + m_xFtComment->set_label(pNumFmtShell->GetComment4Entry(nFmtLbSelPos)); + if(pNumFmtShell->GetUserDefined4Entry(nFmtLbSelPos)) + { + if(pNumFmtShell->GetComment4Entry(nFmtLbSelPos).isEmpty()) + { + m_xFtComment->set_label(m_xLbCategory->get_text(1)); + } + } + } + else + { + m_xLbFormat->select(-1); + } + + if ( bUpdateEdit ) + { + m_xEdFormat->set_text( OUString() ); + m_aWndPreview.NotifyChange( OUString() ); + } + } + + aEntryList.clear(); +} + + +/** + * Change visible checkbox according to category format + * if scientific format "Engineering notation" + * else "Thousands separator" + */ + +void SvxNumberFormatTabPage::UpdateThousandEngineeringCheckBox() +{ + bool bIsScientific = m_xLbCategory->get_selected_index() == CAT_SCIENTIFIC; + m_xBtnThousand->set_visible( !bIsScientific ); + m_xBtnEngineering->set_visible( bIsScientific ); +} + + +/** + * Change visible Edit box and Fixed text according to category format + * if fraction format "Denominator places" + * else "Decimal places" + */ + +void SvxNumberFormatTabPage::UpdateDecimalsDenominatorEditBox() +{ + bool bIsFraction = m_xLbCategory->get_selected_index() == CAT_FRACTION; + m_xFtDecimals->set_visible( !bIsFraction ); + m_xEdDecimals->set_visible( !bIsFraction ); + m_xFtDenominator->set_visible( bIsFraction ); + m_xEdDenominator->set_visible( bIsFraction ); +} + + +/************************************************************************* +#* Handle: DoubleClickHdl_Impl +#*------------------------------------------------------------------------ +#* +#* Class: SvxNumberFormatTabPage +#* Function: On a double click in the format listbox the +#* value is adopted and the OK button pushed. +#* Input: Pointer on the Listbox +#* Output: --- +#* +#************************************************************************/ +IMPL_LINK(SvxNumberFormatTabPage, DoubleClickHdl_Impl, weld::TreeView&, rLb, bool) +{ + SelFormatHdl_Impl(&rLb); + + SfxOkDialogController* pController = GetDialogController(); + assert(pController); + weld::Button& rOkButton = pController->GetOKButton(); + rOkButton.clicked(); + + return true; +} + +/************************************************************************* +#* Method: SelFormatHdl_Impl +#*------------------------------------------------------------------------ +#* +#* Class: SvxNumberFormatTabPage +#* Function: Is called when the language, the category or the format +#* is changed. Accordingly the settings are adjusted. +#* Input: Pointer on the Listbox +#* Output: --- +#* +#************************************************************************/ + +IMPL_LINK(SvxNumberFormatTabPage, SelFormatClickHdl_Impl, weld::Toggleable&, rLb, void) +{ + SelFormatHdl_Impl(&rLb); +} + +IMPL_LINK(SvxNumberFormatTabPage, SelFormatTreeListBoxHdl_Impl, weld::TreeView&, rLb, void) +{ + SelFormatHdl_Impl(&rLb); +} + +IMPL_LINK(SvxNumberFormatTabPage, SelFormatListBoxHdl_Impl, weld::ComboBox&, rLb, void) +{ + SelFormatHdl_Impl(&rLb); +} + +void SvxNumberFormatTabPage::SelFormatHdl_Impl(weld::Widget* pLb) +{ + if (m_nLbFormatSelPosEdComment != SELPOS_NONE) + { + // Click handler is called before focus change handler, so finish + // comment editing of previous format, otherwise a new format will have + // the old comment displayed after LostFocusHdl_Impl() is called + // later. Also, clicking into another category invalidates the format + // list and SvxNumberFormatShell::SetComment4Entry() could either + // access a wrong format from aCurEntryList[nEntry] or crash there if + // the new vector has less elements. + LostFocusHdl_Impl(*pLb); + } + + if (pLb == m_xCbSourceFormat.get()) + { + EnableBySourceFormat_Impl(); // enable/disable everything else + if ( m_xCbSourceFormat->get_active() ) + return; // just disabled everything else + + // Reinit options enable/disable for current selection. + + // Current category may be UserDefined with no format entries defined. + if (m_xLbFormat->get_selected_index() == -1) + pLb = m_xLbCategory.get(); // continue with the current category selected + else + pLb = m_xLbFormat.get(); // continue with the current format selected + } + + sal_Int32 nTmpCatPos; + + if(bOneAreaFlag) + { + nTmpCatPos=nFixedCategory; + } + else + { + nTmpCatPos=m_xLbCategory->get_selected_index(); + } + + if (nTmpCatPos==CAT_CURRENCY && pLb == m_xLbCurrency.get()) + pNumFmtShell->SetCurrencySymbol(get_active_currency()); + + // Format-ListBox ---------------------------------------------------- + if (pLb == m_xLbFormat.get()) + { + int nSelPos = m_xLbFormat->get_selected_index(); + short nFmtLbSelPos = static_cast<short>(nSelPos); + + OUString aFormat = pNumFmtShell->GetFormat4Entry(nFmtLbSelPos); + OUString aComment = pNumFmtShell->GetComment4Entry(nFmtLbSelPos); + + if(pNumFmtShell->GetUserDefined4Entry(nFmtLbSelPos)) + { + if(aComment.isEmpty()) + { + aComment = m_xLbCategory->get_text(1); + } + } + + if ( !aFormat.isEmpty() ) + { + if (!m_xEdFormat->has_focus()) + m_xEdFormat->set_text( aFormat ); + m_xFtComment->set_label(aComment); + ChangePreviewText( static_cast<sal_uInt16>(nSelPos) ); + } + + REMOVE_DONTKNOW() // possibly UI-Enable + + if ( pNumFmtShell->FindEntry( aFormat) ) + { + m_xIbAdd->set_sensitive(false ); + bool bIsUserDef=pNumFmtShell->IsUserDefined( aFormat ); + m_xIbRemove->set_sensitive(bIsUserDef); + m_xIbInfo->set_sensitive(bIsUserDef); + + } + else + { + m_xIbAdd->set_sensitive(true); + m_xIbInfo->set_sensitive(true); + m_xIbRemove->set_sensitive(false ); + m_xFtComment->set_label(m_xEdComment->get_text()); + + } + UpdateOptions_Impl( false ); + + return; + } + + + // category-ListBox ------------------------------------------------- + if (pLb == m_xLbCategory.get() || pLb == m_xLbCurrency.get()) + { + UpdateFormatListBox_Impl( true, true ); + EditHdl_Impl( nullptr ); + UpdateOptions_Impl( false ); + + return; + } + + + // language/country-ListBox ---------------------------------------------- + if (pLb == m_xLbLanguage->get_widget()) + { + UpdateFormatListBox_Impl( false, true ); + EditHdl_Impl(m_xEdFormat.get()); + + return; + } +} + + +/************************************************************************* +#* Method: ClickHdl_Impl, weld::Button& rIB +#*------------------------------------------------------------------------ +#* +#* Class: SvxNumberFormatTabPage +#* Function: Called when the add or delete button is pushed, +#* adjusts the number format list. +#* Input: Toolbox- Button +#* Output: --- +#* +#************************************************************************/ + +IMPL_LINK( SvxNumberFormatTabPage, ClickHdl_Impl, weld::Button&, rIB, void) +{ + Click_Impl(rIB); +} + +bool SvxNumberFormatTabPage::Click_Impl(const weld::Button& rIB) +{ + sal_uInt8 nReturn = 0; + constexpr sal_uInt8 nReturnChanged = 0x1; // THE boolean return value + constexpr sal_uInt8 nReturnAdded = 0x2; // temp: format added + constexpr sal_uInt8 nReturnOneArea = 0x4; // temp: one area but category changed => ignored + + if (&rIB == m_xIbAdd.get()) + { // Also called from FillItemSet() if a temporary currency format has + // to be added, not only if the Add button is enabled. + OUString aFormat = m_xEdFormat->get_text(); + std::vector<OUString> aEntryList; + std::vector<OUString> a2EntryList; + sal_uInt16 nCatLbSelPos = 0; + short nFmtLbSelPos = SELPOS_NONE; + sal_Int32 nErrPos=0; + + pNumFmtShell->SetCurCurrencyEntry(nullptr); + bool bAdded = pNumFmtShell->AddFormat( aFormat, nErrPos, + nCatLbSelPos, nFmtLbSelPos, + aEntryList); + if ( bAdded ) + nReturn |= nReturnChanged | nReturnAdded; + + if (m_xEdComment->get_visible()) + { + m_xEdFormat->grab_focus(); + m_xEdComment->hide(); + m_xFtComment->show(); + m_xFtComment->set_label(m_xEdComment->get_text()); + } + + if ( !nErrPos ) // Syntax ok? + { + // May be sorted under a different locale if LCID was parsed. + if (bAdded) + m_xLbLanguage->set_active_id(pNumFmtShell->GetCurLanguage()); + + if (nCatLbSelPos==CAT_CURRENCY) + set_active_currency(pNumFmtShell->GetCurrencySymbol()); + + if(bOneAreaFlag && (nFixedCategory!=nCatLbSelPos)) + { + if(bAdded) aEntryList.clear(); + pNumFmtShell->RemoveFormat( aFormat, + nCatLbSelPos, + nFmtLbSelPos, + a2EntryList); + a2EntryList.clear(); + m_xEdFormat->grab_focus(); + m_xEdFormat->select_region(0, -1); + nReturn |= nReturnOneArea; + } + else + { + if ( bAdded && (nFmtLbSelPos != SELPOS_NONE) ) + { + // everything all right + if(bOneAreaFlag) //@@ ??? + SetCategory(0); + else + SetCategory(nCatLbSelPos ); + + FillFormatListBox_Impl( aEntryList ); + if (m_xEdComment->get_text()!=m_xLbCategory->get_text(1)) + { + pNumFmtShell->SetComment4Entry(nFmtLbSelPos, + m_xEdComment->get_text()); + } + else + { + pNumFmtShell->SetComment4Entry(nFmtLbSelPos, + OUString()); + } + m_xLbFormat->select(static_cast<sal_uInt16>(nFmtLbSelPos)); + m_xEdFormat->set_text( aFormat ); + + m_xEdComment->set_text(m_xLbCategory->get_text(1)); // String for user defined + + ChangePreviewText( static_cast<sal_uInt16>(nFmtLbSelPos) ); + } + } + } + else // syntax error + { + m_xEdFormat->grab_focus(); + m_xEdFormat->select_region(nErrPos == -1 ? m_xEdFormat->get_text().getLength() : nErrPos, -1); + } + EditHdl_Impl(m_xEdFormat.get()); + nReturn = ((nReturn & nReturnOneArea) ? 0 : (nReturn & nReturnChanged)); + + aEntryList.clear(); + a2EntryList.clear(); + } + else if (&rIB == m_xIbRemove.get()) + { + OUString aFormat = m_xEdFormat->get_text(); + std::vector<OUString> aEntryList; + sal_uInt16 nCatLbSelPos = 0; + short nFmtLbSelPos = SELPOS_NONE; + + pNumFmtShell->RemoveFormat( aFormat, + nCatLbSelPos, + nFmtLbSelPos, + aEntryList ); + + m_xEdComment->set_text(m_xLbCategory->get_text(1)); + + if( nFmtLbSelPos>=0 && o3tl::make_unsigned(nFmtLbSelPos)<aEntryList.size() ) + { + aFormat = aEntryList[nFmtLbSelPos]; + } + + FillFormatListBox_Impl( aEntryList ); + + if ( nFmtLbSelPos != SELPOS_NONE ) + { + if(bOneAreaFlag) //@@ ??? + SetCategory(0); + else + SetCategory(nCatLbSelPos ); + + m_xLbFormat->select(static_cast<sal_uInt16>(nFmtLbSelPos)); + m_xEdFormat->set_text( aFormat ); + ChangePreviewText( static_cast<sal_uInt16>(nFmtLbSelPos) ); + } + else + { + // set to "all/standard" + SetCategory(0); + SelFormatHdl_Impl(m_xLbCategory.get()); + } + + EditHdl_Impl(m_xEdFormat.get()); + + aEntryList.clear(); + } + else if (&rIB == m_xIbInfo.get()) + { + if (!m_xEdComment->get_visible()) + { + if (!m_xIbAdd->get_sensitive()) + // Editing for existing format. + m_nLbFormatSelPosEdComment = m_xLbFormat->get_selected_index(); + + m_xEdComment->set_text(m_xFtComment->get_label()); + m_xEdComment->show(); + m_xFtComment->hide(); + m_xEdComment->grab_focus(); + } + else + { + m_xEdFormat->grab_focus(); + m_xFtComment->set_label( m_xEdComment->get_text()); + m_xEdComment->hide(); + m_xFtComment->show(); + } + } + + return nReturn; +} + + +/************************************************************************* +#* Method: EditHdl_Impl +#*------------------------------------------------------------------------ +#* +#* Class: SvxNumberFormatTabPage +#* Function: When the entry in the edit field is changed +#* the preview is updated and +#* Input: Pointer on Editbox +#* Output: --- +#* +#************************************************************************/ + +IMPL_LINK(SvxNumberFormatTabPage, EditModifyHdl_Impl, weld::Entry&, rEdit, void) +{ + EditHdl_Impl(&rEdit); +} + +void SvxNumberFormatTabPage::EditHdl_Impl(const weld::Entry* pEdFormat) +{ + sal_uInt32 nCurKey = NUMKEY_UNDEFINED; + + if ( m_xEdFormat->get_text().isEmpty() ) + { + m_xIbAdd->set_sensitive(false ); + m_xIbRemove->set_sensitive(false ); + m_xIbInfo->set_sensitive(false ); + m_xFtComment->set_label(OUString()); + } + else + { + OUString aFormat = m_xEdFormat->get_text(); + MakePreviewText( aFormat ); + + if ( pNumFmtShell->FindEntry( aFormat, &nCurKey ) ) + { + m_xIbAdd->set_sensitive(false ); + bool bUserDef=pNumFmtShell->IsUserDefined( aFormat ); + + m_xIbRemove->set_sensitive(bUserDef); + m_xIbInfo->set_sensitive(bUserDef); + + if(bUserDef) + { + sal_uInt16 nTmpCurPos=pNumFmtShell->FindCurrencyFormat(aFormat ); + if (nTmpCurPos != sal_uInt16(-1)) + set_active_currency(nTmpCurPos); + } + short nPosi=pNumFmtShell->GetListPos4Entry( nCurKey, aFormat); + if(nPosi>=0) + m_xLbFormat->select(static_cast<sal_uInt16>(nPosi)); + + } + else + { + + m_xIbAdd->set_sensitive(true); + m_xIbInfo->set_sensitive(true); + m_xIbRemove->set_sensitive(false ); + + m_xFtComment->set_label(m_xEdComment->get_text()); + + } + } + + if (pEdFormat) + { + pNumFmtShell->SetCurNumFmtKey( nCurKey ); + UpdateOptions_Impl( true ); + } +} + + +/************************************************************************* +#* Method: NotifyChange +#*------------------------------------------------------------------------ +#* +#* Class: SvxNumberFormatTabPage +#* Function: Does changes in the number attributes. +#* Input: Options- Controls +#* Output: --- +#* +#************************************************************************/ + +IMPL_LINK(SvxNumberFormatTabPage, OptClickHdl_Impl, weld::Toggleable&, rOptCtrl, void) +{ + OptHdl_Impl(&rOptCtrl); +} + +IMPL_LINK(SvxNumberFormatTabPage, OptEditHdl_Impl, weld::SpinButton&, rEdit, void) +{ + OptHdl_Impl(&rEdit); +} + +void SvxNumberFormatTabPage::OptHdl_Impl(const weld::Widget* pOptCtrl) +{ + if ( !(pOptCtrl == m_xEdLeadZeroes.get() + || pOptCtrl == m_xEdDecimals.get() + || pOptCtrl == m_xEdDenominator.get() + || pOptCtrl == m_xBtnNegRed.get() + || pOptCtrl == m_xBtnThousand.get() + || pOptCtrl == m_xBtnEngineering.get())) + return; + + OUString aFormat; + bool bThousand = ( m_xBtnThousand->get_visible() && m_xBtnThousand->get_sensitive() && m_xBtnThousand->get_active() ) + || ( m_xBtnEngineering->get_visible() && m_xBtnEngineering->get_sensitive() && m_xBtnEngineering->get_active() ); + bool bNegRed = m_xBtnNegRed->get_sensitive() && m_xBtnNegRed->get_active(); + sal_uInt16 nPrecision = (m_xEdDecimals->get_sensitive() && m_xEdDecimals->get_visible()) + ? static_cast<sal_uInt16>(m_xEdDecimals->get_value()) + : ( (m_xEdDenominator->get_sensitive() && m_xEdDenominator->get_visible()) + ? static_cast<sal_uInt16>(m_xEdDenominator->get_value()) + : sal_uInt16(0) ); + sal_uInt16 nLeadZeroes = (m_xEdLeadZeroes->get_sensitive()) + ? static_cast<sal_uInt16>(m_xEdLeadZeroes->get_value()) + : sal_uInt16(0); + if ( pNumFmtShell->GetStandardName() == m_xEdFormat->get_text() ) + { + m_xEdDecimals->set_value(nPrecision); + } + + pNumFmtShell->MakeFormat( aFormat, + bThousand, bNegRed, + nPrecision, nLeadZeroes, + static_cast<sal_uInt16>(m_xLbFormat->get_selected_index()) ); + + m_xEdFormat->set_text( aFormat ); + MakePreviewText( aFormat ); + + if ( pNumFmtShell->FindEntry( aFormat ) ) + { + m_xIbAdd->set_sensitive(false ); + bool bUserDef=pNumFmtShell->IsUserDefined( aFormat ); + m_xIbRemove->set_sensitive(bUserDef); + m_xIbInfo->set_sensitive(bUserDef); + EditHdl_Impl(m_xEdFormat.get()); + + } + else + { + EditHdl_Impl( nullptr ); + m_xLbFormat->select(-1); + } +} + +/************************************************************************* +#* Method: LostFocusHdl_Impl +#*------------------------------------------------------------------------ +#* +#* Class: SvxNumberFormatTabPage +#* Function: Does changes in the number attributes. +#* Input: Options- Controls +#* Output: --- +#* +#************************************************************************/ + +IMPL_LINK_NOARG(SvxNumberFormatTabPage, LostFocusHdl_Impl, weld::Widget&, void) +{ + if (!pNumFmtShell) + return; + + const bool bAddSensitive = m_xIbAdd->get_sensitive(); + if (bAddSensitive || m_nLbFormatSelPosEdComment != SELPOS_NONE) + // Comment editing was possible. + m_xFtComment->set_label(m_xEdComment->get_text()); + + m_xEdComment->hide(); + m_xFtComment->show(); + if (m_nLbFormatSelPosEdComment != SELPOS_NONE) + { + // Save edited comment of existing format. + pNumFmtShell->SetComment4Entry( m_nLbFormatSelPosEdComment, m_xEdComment->get_text()); + m_nLbFormatSelPosEdComment = SELPOS_NONE; + } + if (!bAddSensitive) + { + // String for user defined, if present + OUString sEntry = m_xLbCategory->n_children() > 1 ? m_xLbCategory->get_text(1) : OUString(); + m_xEdComment->set_text(sEntry); + } +} + +/************************************************************************* +#* Method: NotifyChange +#*------------------------------------------------------------------------ +#* +#* Class: SvxNumberFormatTabPage +#* Function: Does changes in the number attributes. +#* Input: Options- Controls +#* Output: --- +#* +#************************************************************************/ + +OUString SvxNumberFormatTabPage::GetExpColorString( + const Color*& rpPreviewColor, const OUString& rFormatStr, short nTmpCatPos) +{ + SvxNumValCategory i; + switch (nTmpCatPos) + { + case CAT_ALL: i=SvxNumValCategory::Standard; break; + + case CAT_NUMBER: i=SvxNumValCategory::Standard; break; + + case CAT_PERCENT: i=SvxNumValCategory::Percent; break; + + case CAT_CURRENCY: i=SvxNumValCategory::Currency; break; + + case CAT_DATE: i=SvxNumValCategory::Date; break; + + case CAT_TIME: i=SvxNumValCategory::Time; break; + + case CAT_SCIENTIFIC: i=SvxNumValCategory::Scientific; break; + + case CAT_FRACTION: i=SvxNumValCategory::Fraction; break; + + case CAT_BOOLEAN: i=SvxNumValCategory::Boolean; break; + + case CAT_USERDEFINED: i=SvxNumValCategory::Standard; break; + + case CAT_TEXT: + default: i=SvxNumValCategory::NoValue;break; + } + double fVal = fSvxNumValConst[i]; + + // use lower number for long NatNum12 transliteration + if ( ( CAT_CURRENCY == nTmpCatPos || CAT_NUMBER == nTmpCatPos ) && + rFormatStr.indexOf("NatNum12") >= 0 ) + { + if ( CAT_CURRENCY == nTmpCatPos ) + fVal = 1.2; + else + fVal = 100; // show also title case for English: One Hundred + } + + OUString aPreviewString; + pNumFmtShell->MakePrevStringFromVal( rFormatStr, aPreviewString, rpPreviewColor, fVal ); + return aPreviewString; +} + +void SvxNumberFormatTabPage::MakePreviewText( const OUString& rFormat ) +{ + OUString aPreviewString; + const Color* pPreviewColor = nullptr; + pNumFmtShell->MakePreviewString( rFormat, aPreviewString, pPreviewColor ); + m_aWndPreview.NotifyChange( aPreviewString, pPreviewColor ); +} + +void SvxNumberFormatTabPage::ChangePreviewText( sal_uInt16 nPos ) +{ + OUString aPreviewString; + const Color* pPreviewColor = nullptr; + pNumFmtShell->FormatChanged( nPos, aPreviewString, pPreviewColor ); + m_aWndPreview.NotifyChange( aPreviewString, pPreviewColor ); +} + +void SvxNumberFormatTabPage::FillCurrencyBox() +{ + std::vector<OUString> aList; + + sal_uInt16 nSelPos=0; + pNumFmtShell->GetCurrencySymbols(aList, &nSelPos); + + m_xLbCurrency->freeze(); + m_xLbCurrency->clear(); + bLegacyAutomaticCurrency = false; + for (std::vector<OUString>::iterator i = aList.begin() + 1;i != aList.end(); ++i) + m_xLbCurrency->append_text(*i); + m_xLbCurrency->thaw(); + + set_active_currency(nSelPos); +} + +void SvxNumberFormatTabPage::SetCategory(sal_uInt16 nPos) +{ + int nCurCategory = m_xLbCategory->get_selected_index(); + sal_uInt16 nTmpCatPos; + + if (bOneAreaFlag) + { + nTmpCatPos=nFixedCategory; + } + else + { + nTmpCatPos=nPos; + } + + if(m_xLbCategory->n_children()==1 || nCurCategory!=nPos) + { + if(nTmpCatPos!=CAT_CURRENCY) + m_xLbCurrency->hide(); + else + m_xLbCurrency->show(); + } + m_xLbCategory->select(nPos); +} + +/* to support Writer text field language handling an + additional entry needs to be inserted into the ListBox + which marks a certain language as automatically detected + Additionally the "Default" language is removed +*/ +void SvxNumberFormatTabPage::AddAutomaticLanguage_Impl(LanguageType eAutoLang, bool bSelect) +{ + m_xLbLanguage->remove_id(LANGUAGE_SYSTEM); + m_xLbLanguage->append(eAutoLang, sAutomaticLangEntry); + if (bSelect) + m_xLbLanguage->set_active_id(eAutoLang); +} + +void SvxNumberFormatTabPage::PageCreated(const SfxAllItemSet& aSet) +{ + const SvxNumberInfoItem* pNumberInfoItem = aSet.GetItem<SvxNumberInfoItem>(SID_ATTR_NUMBERFORMAT_INFO, false); + if (pNumberInfoItem && !pNumItem) + pNumItem.reset(pNumberInfoItem->Clone()); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |