summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/svx/tbcontrl.hxx8
-rw-r--r--sc/source/ui/sidebar/NumberFormatPropertyPanel.cxx194
-rw-r--r--sc/source/ui/sidebar/NumberFormatPropertyPanel.hxx35
-rw-r--r--sc/uiconfig/scalc/ui/sidebarnumberformat.ui59
-rw-r--r--svx/UIConfig_svx.mk1
-rw-r--r--svx/source/tbxctrls/tbcontrl.cxx154
-rw-r--r--svx/uiconfig/ui/currencywindow.ui95
-rw-r--r--vcl/unx/gtk3/gtk3gtkinst.cxx54
8 files changed, 447 insertions, 153 deletions
diff --git a/include/svx/tbcontrl.hxx b/include/svx/tbcontrl.hxx
index 9e6c387d2dda..315fd9e1c57e 100644
--- a/include/svx/tbcontrl.hxx
+++ b/include/svx/tbcontrl.hxx
@@ -264,6 +264,9 @@ private:
OUString m_aFormatString;
LanguageType m_eLanguage;
sal_uInt32 m_nFormatKey;
+
+ weld::Toolbar* m_pToolbar;
+ std::unique_ptr<svtools::ToolbarPopupBase> m_xPopover;
public:
static void GetCurrencySymbols( std::vector<OUString>& rList, bool bFlag,
std::vector<sal_uInt16>& rCurrencyList );
@@ -274,9 +277,14 @@ public:
// XToolbarController
virtual void SAL_CALL execute( sal_Int16 nSelectModifier ) override;
+ // XComponent
+ virtual void SAL_CALL dispose() override;
+
using svt::ToolboxController::createPopupWindow;
virtual VclPtr<vcl::Window> createPopupWindow( vcl::Window* pParent ) override;
+ void EndPopupMode();
+
// XServiceInfo
virtual OUString SAL_CALL getImplementationName() override;
virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
diff --git a/sc/source/ui/sidebar/NumberFormatPropertyPanel.cxx b/sc/source/ui/sidebar/NumberFormatPropertyPanel.cxx
index 7d8a8401ac84..a1d3c4eb7461 100644
--- a/sc/source/ui/sidebar/NumberFormatPropertyPanel.cxx
+++ b/sc/source/ui/sidebar/NumberFormatPropertyPanel.cxx
@@ -38,26 +38,25 @@ NumberFormatPropertyPanel::NumberFormatPropertyPanel(
vcl::Window* pParent,
const css::uno::Reference<css::frame::XFrame>& rxFrame,
SfxBindings* pBindings)
- : PanelLayout(pParent,"NumberFormatPropertyPanel", "modules/scalc/ui/sidebarnumberformat.ui", rxFrame),
- maNumFormatControl(SID_NUMBER_TYPE_FORMAT, *pBindings, *this),
- maFormatControl(SID_NUMBER_FORMAT, *pBindings, *this),
-
- mnCategorySelected(0),
- maContext(),
- mpBindings(pBindings)
+ : PanelLayout(pParent,"NumberFormatPropertyPanel", "modules/scalc/ui/sidebarnumberformat.ui", rxFrame, true)
+ , mxLbCategory(m_xBuilder->weld_combo_box("category"))
+ , mxTBCategory(m_xBuilder->weld_toolbar("numberformat"))
+ , mxCatagoryDispatch(new ToolbarUnoDispatcher(*mxTBCategory, rxFrame))
+ , mxFtDecimals(m_xBuilder->weld_label("decimalplaceslabel"))
+ , mxEdDecimals(m_xBuilder->weld_spin_button("decimalplaces"))
+ , mxFtDenominator(m_xBuilder->weld_label("denominatorplaceslabel"))
+ , mxEdDenominator(m_xBuilder->weld_spin_button("denominatorplaces"))
+ , mxFtLeadZeroes(m_xBuilder->weld_label("leadingzeroeslabel"))
+ , mxEdLeadZeroes(m_xBuilder->weld_spin_button("leadingzeroes"))
+ , mxBtnNegRed(m_xBuilder->weld_check_button("negativenumbersred"))
+ , mxBtnThousand(m_xBuilder->weld_check_button("thousandseparator"))
+ , mxBtnEngineering(m_xBuilder->weld_check_button("engineeringnotation"))
+ , maNumFormatControl(SID_NUMBER_TYPE_FORMAT, *pBindings, *this)
+ , maFormatControl(SID_NUMBER_FORMAT, *pBindings, *this)
+ , mnCategorySelected(0)
+ , maContext()
+ , mpBindings(pBindings)
{
- get(mpLbCategory, "category");
- get(mpTBCategory, "numberformat");
- get(mpFtDecimals, "decimalplaceslabel");
- get(mpEdDecimals, "decimalplaces");
- get(mpFtDenominator, "denominatorplaceslabel");
- get(mpEdDenominator, "denominatorplaces");
- get(mpFtLeadZeroes, "leadingzeroeslabel");
- get(mpEdLeadZeroes, "leadingzeroes");
- get(mpBtnNegRed, "negativenumbersred");
- get(mpBtnThousand, "thousandseparator");
- get(mpBtnEngineering, "engineeringnotation");
-
Initialize();
}
@@ -68,17 +67,18 @@ NumberFormatPropertyPanel::~NumberFormatPropertyPanel()
void NumberFormatPropertyPanel::dispose()
{
- mpLbCategory.clear();
- mpTBCategory.clear();
- mpFtDecimals.clear();
- mpEdDecimals.clear();
- mpFtDenominator.clear();
- mpEdDenominator.clear();
- mpFtLeadZeroes.clear();
- mpEdLeadZeroes.clear();
- mpBtnNegRed.clear();
- mpBtnThousand.clear();
- mpBtnEngineering.clear();
+ mxLbCategory.reset();
+ mxCatagoryDispatch.reset();
+ mxTBCategory.reset();
+ mxFtDecimals.reset();
+ mxEdDecimals.reset();
+ mxFtDenominator.reset();
+ mxEdDenominator.reset();
+ mxFtLeadZeroes.reset();
+ mxEdLeadZeroes.reset();
+ mxBtnNegRed.reset();
+ mxBtnThousand.reset();
+ mxBtnEngineering.reset();
maNumFormatControl.dispose();
maFormatControl.dispose();
@@ -88,24 +88,23 @@ void NumberFormatPropertyPanel::dispose()
void NumberFormatPropertyPanel::Initialize()
{
- mpLbCategory->SetSelectHdl ( LINK(this, NumberFormatPropertyPanel, NumFormatSelectHdl) );
- mpLbCategory->SelectEntryPos(0);
- mpLbCategory->SetDropDownLineCount(mpLbCategory->GetEntryCount());
+ mxLbCategory->connect_changed( LINK(this, NumberFormatPropertyPanel, NumFormatSelectHdl) );
+ mxLbCategory->set_active(0);
- Link<Edit&,void> aLink = LINK(this, NumberFormatPropertyPanel, NumFormatValueHdl);
+ Link<weld::SpinButton&,void> aLink = LINK(this, NumberFormatPropertyPanel, NumFormatValueHdl);
- mpEdDecimals->SetModifyHdl( aLink );
- mpEdDenominator->SetModifyHdl( aLink );
- mpEdLeadZeroes->SetModifyHdl( aLink );
+ mxEdDecimals->connect_value_changed( aLink );
+ mxEdDenominator->connect_value_changed( aLink );
+ mxEdLeadZeroes->connect_value_changed( aLink );
- mpBtnNegRed->SetClickHdl( LINK(this, NumberFormatPropertyPanel, NumFormatValueClickHdl) );
- mpBtnThousand->SetClickHdl( LINK(this, NumberFormatPropertyPanel, NumFormatValueClickHdl) );
- mpBtnEngineering->SetClickHdl( LINK(this, NumberFormatPropertyPanel, NumFormatValueClickHdl) );
+ mxBtnNegRed->connect_toggled( LINK(this, NumberFormatPropertyPanel, NumFormatValueClickHdl) );
+ mxBtnThousand->connect_toggled( LINK(this, NumberFormatPropertyPanel, NumFormatValueClickHdl) );
+ mxBtnEngineering->connect_toggled( LINK(this, NumberFormatPropertyPanel, NumFormatValueClickHdl) );
}
-IMPL_LINK( NumberFormatPropertyPanel, NumFormatSelectHdl, ListBox&, rBox, void )
+IMPL_LINK( NumberFormatPropertyPanel, NumFormatSelectHdl, weld::ComboBox&, rBox, void )
{
- const sal_Int32 nVal = rBox.GetSelectedEntryPos();
+ const sal_Int32 nVal = rBox.get_active();
if( nVal != mnCategorySelected )
{
SfxUInt16Item aItem( SID_NUMBER_TYPE_FORMAT, nVal );
@@ -115,24 +114,25 @@ IMPL_LINK( NumberFormatPropertyPanel, NumFormatSelectHdl, ListBox&, rBox, void )
}
}
-IMPL_LINK_NOARG( NumberFormatPropertyPanel, NumFormatValueClickHdl, Button*, void )
+IMPL_LINK_NOARG( NumberFormatPropertyPanel, NumFormatValueClickHdl, weld::ToggleButton&, void )
{
- NumFormatValueHdl(*mpEdDecimals);
+ NumFormatValueHdl(*mxEdDecimals);
}
-IMPL_LINK_NOARG( NumberFormatPropertyPanel, NumFormatValueHdl, Edit&, void )
+
+IMPL_LINK_NOARG( NumberFormatPropertyPanel, NumFormatValueHdl, weld::SpinButton&, void )
{
OUString aFormat;
OUString sBreak = ",";
- bool bThousand = ( mpBtnThousand->IsVisible() && mpBtnThousand->IsEnabled() && mpBtnThousand->IsChecked() )
- || ( mpBtnEngineering->IsVisible() && mpBtnEngineering->IsEnabled() && mpBtnEngineering->IsChecked() );
- bool bNegRed = mpBtnNegRed->IsEnabled() && mpBtnNegRed->IsChecked();
- sal_uInt16 nPrecision = (mpEdDecimals->IsEnabled() && mpEdDecimals->IsVisible())
- ? static_cast<sal_uInt16>(mpEdDecimals->GetValue())
- : (mpEdDenominator->IsEnabled() && mpEdDenominator->IsVisible())
- ? static_cast<sal_uInt16>(mpEdDenominator->GetValue())
+ bool bThousand = ( mxBtnThousand->get_visible() && mxBtnThousand->get_sensitive() && mxBtnThousand->get_active() )
+ || ( mxBtnEngineering->get_visible() && mxBtnEngineering->get_sensitive() && mxBtnEngineering->get_active() );
+ bool bNegRed = mxBtnNegRed->get_sensitive() && mxBtnNegRed->get_active();
+ sal_uInt16 nPrecision = (mxEdDecimals->get_sensitive() && mxEdDecimals->get_visible())
+ ? static_cast<sal_uInt16>(mxEdDecimals->get_value())
+ : (mxEdDenominator->get_sensitive() && mxEdDenominator->get_visible())
+ ? static_cast<sal_uInt16>(mxEdDenominator->get_value())
: sal_uInt16(0);
- sal_uInt16 nLeadZeroes = (mpEdLeadZeroes->IsEnabled())
- ? static_cast<sal_uInt16>(mpEdLeadZeroes->GetValue())
+ sal_uInt16 nLeadZeroes = (mxEdLeadZeroes->get_sensitive())
+ ? static_cast<sal_uInt16>(mxEdLeadZeroes->get_value())
: sal_uInt16(0);
OUString sThousand = OUString::number(static_cast<sal_Int32>(bThousand));
@@ -200,30 +200,30 @@ void NumberFormatPropertyPanel::NotifyItemUpdate(
const SfxInt16Item* pItem = static_cast<const SfxInt16Item*>(pState);
sal_uInt16 nVal = pItem->GetValue();
mnCategorySelected = nVal;
- mpLbCategory->SelectEntryPos(nVal);
+ mxLbCategory->set_active(nVal);
if( nVal < 4 || // General, Number, Percent and Currency
nVal == 6 || // scientific also
nVal == 7 ) // fraction
{
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
- mpBtnThousand->Show(!bIsScientific);
- mpBtnThousand->Enable(!bIsScientific);
- mpBtnThousand->Check(false);
- mpBtnEngineering->Show(bIsScientific);
- mpBtnEngineering->Enable(bIsScientific);
- mpBtnEngineering->Check(false);
- mpBtnNegRed->Enable();
- mpFtDenominator->Show(bIsFraction);
- mpEdDenominator->Show(bIsFraction);
- mpFtDenominator->Enable(bIsFraction);
- mpEdDenominator->Enable(bIsFraction);
- mpFtDecimals->Show(!bIsFraction);
- mpEdDecimals->Show(!bIsFraction);
- mpFtDecimals->Enable(!bIsFraction);
- mpEdDecimals->Enable(!bIsFraction);
- mpFtLeadZeroes->Enable();
- mpEdLeadZeroes->Enable();
+ mxBtnThousand->set_visible(!bIsScientific);
+ mxBtnThousand->set_sensitive(!bIsScientific);
+ mxBtnThousand->set_active(false);
+ mxBtnEngineering->set_visible(bIsScientific);
+ mxBtnEngineering->set_sensitive(bIsScientific);
+ mxBtnEngineering->set_active(false);
+ mxBtnNegRed->set_sensitive(true);
+ mxFtDenominator->set_visible(bIsFraction);
+ mxEdDenominator->set_visible(bIsFraction);
+ mxFtDenominator->set_sensitive(bIsFraction);
+ mxEdDenominator->set_sensitive(bIsFraction);
+ mxFtDecimals->set_visible(!bIsFraction);
+ mxEdDecimals->set_visible(!bIsFraction);
+ mxFtDecimals->set_sensitive(!bIsFraction);
+ mxEdDecimals->set_sensitive(!bIsFraction);
+ mxFtLeadZeroes->set_sensitive(true);
+ mxEdLeadZeroes->set_sensitive(true);
}
else
DisableControls();
@@ -231,7 +231,7 @@ void NumberFormatPropertyPanel::NotifyItemUpdate(
else
{
DisableControls();
- mpLbCategory->SetNoSelection();
+ mxLbCategory->set_active(-1);
mnCategorySelected = 0;
}
}
@@ -266,18 +266,18 @@ void NumberFormatPropertyPanel::NotifyItemUpdate(
nPrecision = 0;
nLeadZeroes = 1;
}
- if ( mpBtnThousand->IsVisible() )
- mpBtnThousand->Check(bThousand);
- else if ( mpBtnEngineering->IsVisible() )
- mpBtnEngineering->Check(bThousand);
- mpBtnNegRed->Check(bNegRed);
- if ( mpLbCategory->GetSelectedEntryPos() == 0 )
- mpEdDecimals->SetText(""); // tdf#44399
- else if ( mpEdDecimals->IsVisible() )
- mpEdDecimals->SetValue(nPrecision);
- else if ( mpEdDenominator->IsVisible() )
- mpEdDenominator->SetValue(nPrecision);
- mpEdLeadZeroes->SetValue(nLeadZeroes);
+ if ( mxBtnThousand->get_visible() )
+ mxBtnThousand->set_active(bThousand);
+ else if ( mxBtnEngineering->get_visible() )
+ mxBtnEngineering->set_active(bThousand);
+ mxBtnNegRed->set_active(bNegRed);
+ if ( mxLbCategory->get_active() == 0 )
+ mxEdDecimals->set_text(""); // tdf#44399
+ else if ( mxEdDecimals->get_visible() )
+ mxEdDecimals->set_value(nPrecision);
+ else if ( mxEdDenominator->get_visible() )
+ mxEdDenominator->set_value(nPrecision);
+ mxEdLeadZeroes->set_value(nLeadZeroes);
}
break;
default:
@@ -287,18 +287,18 @@ void NumberFormatPropertyPanel::NotifyItemUpdate(
void NumberFormatPropertyPanel::DisableControls()
{
- mpBtnEngineering->Hide();
- mpBtnThousand->Show();
- mpBtnThousand->Disable();
- mpBtnNegRed->Disable();
- mpFtDenominator->Hide();
- mpEdDenominator->Hide();
- mpFtDecimals->Show();
- mpEdDecimals->Show();
- mpFtDecimals->Disable();
- mpEdDecimals->Disable();
- mpFtLeadZeroes->Disable();
- mpEdLeadZeroes->Disable();
+ mxBtnEngineering->hide();
+ mxBtnThousand->show();
+ mxBtnThousand->set_sensitive(false);
+ mxBtnNegRed->set_sensitive(false);
+ mxFtDenominator->hide();
+ mxEdDenominator->hide();
+ mxFtDecimals->show();
+ mxEdDecimals->show();
+ mxFtDecimals->set_sensitive(false);
+ mxEdDecimals->set_sensitive(false);
+ mxFtLeadZeroes->set_sensitive(false);
+ mxEdLeadZeroes->set_sensitive(false);
}
}} // end of namespace ::sc::sidebar
diff --git a/sc/source/ui/sidebar/NumberFormatPropertyPanel.hxx b/sc/source/ui/sidebar/NumberFormatPropertyPanel.hxx
index 0406f3384381..74eaa1f37a86 100644
--- a/sc/source/ui/sidebar/NumberFormatPropertyPanel.hxx
+++ b/sc/source/ui/sidebar/NumberFormatPropertyPanel.hxx
@@ -21,12 +21,8 @@
#include <sfx2/sidebar/ControllerItem.hxx>
#include <sfx2/sidebar/IContextChangeReceiver.hxx>
+#include <sfx2/weldutils.hxx>
#include <svx/sidebar/PanelLayout.hxx>
-#include <vcl/fixed.hxx>
-#include <vcl/lstbox.hxx>
-#include <vcl/field.hxx>
-#include <vcl/button.hxx>
-#include <vcl/toolbox.hxx>
class Edit;
@@ -66,17 +62,18 @@ public:
virtual void dispose() override;
private:
//ui controls
- VclPtr<ListBox> mpLbCategory;
- VclPtr<ToolBox> mpTBCategory;
- VclPtr<FixedText> mpFtDecimals;
- VclPtr<NumericField> mpEdDecimals;
- VclPtr<FixedText> mpFtDenominator;
- VclPtr<NumericField> mpEdDenominator;
- VclPtr<FixedText> mpFtLeadZeroes;
- VclPtr<NumericField> mpEdLeadZeroes;
- VclPtr<CheckBox> mpBtnNegRed;
- VclPtr<CheckBox> mpBtnThousand;
- VclPtr<CheckBox> mpBtnEngineering;
+ std::unique_ptr<weld::ComboBox> mxLbCategory;
+ std::unique_ptr<weld::Toolbar> mxTBCategory;
+ std::unique_ptr<ToolbarUnoDispatcher> mxCatagoryDispatch;
+ std::unique_ptr<weld::Label> mxFtDecimals;
+ std::unique_ptr<weld::SpinButton> mxEdDecimals;
+ std::unique_ptr<weld::Label> mxFtDenominator;
+ std::unique_ptr<weld::SpinButton> mxEdDenominator;
+ std::unique_ptr<weld::Label> mxFtLeadZeroes;
+ std::unique_ptr<weld::SpinButton> mxEdLeadZeroes;
+ std::unique_ptr<weld::CheckButton> mxBtnNegRed;
+ std::unique_ptr<weld::CheckButton> mxBtnThousand;
+ std::unique_ptr<weld::CheckButton> mxBtnEngineering;
::sfx2::sidebar::ControllerItem maNumFormatControl;
::sfx2::sidebar::ControllerItem maFormatControl;
@@ -86,9 +83,9 @@ private:
vcl::EnumContext maContext;
SfxBindings* const mpBindings;
- DECL_LINK(NumFormatSelectHdl, ListBox&, void);
- DECL_LINK(NumFormatValueHdl, Edit&, void);
- DECL_LINK(NumFormatValueClickHdl, Button*, void);
+ DECL_LINK(NumFormatSelectHdl, weld::ComboBox&, void);
+ DECL_LINK(NumFormatValueHdl, weld::SpinButton&, void);
+ DECL_LINK(NumFormatValueClickHdl, weld::ToggleButton&, void);
void Initialize();
void DisableControls();
diff --git a/sc/uiconfig/scalc/ui/sidebarnumberformat.ui b/sc/uiconfig/scalc/ui/sidebarnumberformat.ui
index 21857e404bf1..291d5b6f4c5c 100644
--- a/sc/uiconfig/scalc/ui/sidebarnumberformat.ui
+++ b/sc/uiconfig/scalc/ui/sidebarnumberformat.ui
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.20.0 -->
+<!-- Generated with glade 3.22.1 -->
<interface domain="sc">
<requires lib="gtk+" version="3.18"/>
- <requires lib="LibreOffice" version="1.0"/>
<object class="GtkAdjustment" id="adjustment1">
<property name="upper">20</property>
<property name="step_increment">1</property>
@@ -13,6 +12,11 @@
<property name="step_increment">1</property>
<property name="page_increment">1</property>
</object>
+ <object class="GtkAdjustment" id="adjustment3">
+ <property name="upper">20</property>
+ <property name="step_increment">1</property>
+ <property name="page_increment">10</property>
+ </object>
<object class="GtkGrid" id="NumberFormatPropertyPanel">
<property name="visible">True</property>
<property name="can_focus">False</property>
@@ -36,6 +40,7 @@
<property name="can_focus">True</property>
<property name="has_tooltip">True</property>
<property name="tooltip_text" translatable="yes" context="sidebarnumberformat|category|tooltip_text">Select a category of contents.</property>
+ <property name="valign">center</property>
<property name="hexpand">True</property>
<items>
<item translatable="yes" context="sidebarnumberformat|category">General</item>
@@ -61,44 +66,43 @@
</packing>
</child>
<child>
- <object class="sfxlo-SidebarToolBox" id="numberformat">
+ <object class="GtkToolbar" id="numberformat">
<property name="visible">True</property>
<property name="can_focus">True</property>
+ <property name="toolbar_style">icons</property>
<property name="show_arrow">False</property>
+ <property name="icon_size">2</property>
<child>
- <object class="GtkToolButton" id="currency">
+ <object class="GtkMenuToolButton" id=".uno:NumberFormatCurrency">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="action_name">.uno:NumberFormatCurrency</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
- <property name="homogeneous">True</property>
+ <property name="homogeneous">False</property>
</packing>
</child>
<child>
- <object class="GtkToolButton" id="percent">
+ <object class="GtkToggleToolButton" id=".uno:NumberFormatPercent">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="action_name">.uno:NumberFormatPercent</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
- <property name="homogeneous">True</property>
+ <property name="homogeneous">False</property>
</packing>
</child>
<child>
- <object class="GtkToolButton" id="numericfield">
+ <object class="GtkToggleToolButton" id=".uno:NumberFormatDecimal">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="action_name">.uno:NumberFormatDecimal</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">False</property>
- <property name="homogeneous">True</property>
+ <property name="homogeneous">False</property>
</packing>
</child>
</object>
@@ -126,6 +130,19 @@
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
+ <object class="GtkLabel" id="denominatorplaceslabel">
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes" context="sidebarnumberformat|denominatorplaceslabel">Den_ominator places:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">denominatorplaces</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
<object class="GtkLabel" id="decimalplaceslabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
@@ -145,7 +162,7 @@
<property name="can_focus">True</property>
<property name="has_tooltip">True</property>
<property name="tooltip_text" translatable="yes" context="sidebarnumberformat|decimalplaces|tooltip_text">Enter the number of decimal places that you want to display.</property>
- <property name="adjustment">adjustment1</property>
+ <property name="adjustment">adjustment3</property>
<child internal-child="accessible">
<object class="AtkObject" id="decimalplaces-atkobject">
<property name="AtkObject::accessible-name" translatable="yes" context="sidebarnumberformat|decimalplaces-atkobject">Decimal Places</property>
@@ -159,22 +176,7 @@
</packing>
</child>
<child>
- <object class="GtkLabel" id="denominatorplaceslabel">
- <property name="visible">False</property>
- <property name="can_focus">False</property>
- <property name="label" translatable="yes" context="sidebarnumberformat|denominatorplaceslabel">Den_ominator places:</property>
- <property name="use_underline">True</property>
- <property name="mnemonic_widget">denominatorplaces</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
<object class="GtkSpinButton" id="denominatorplaces">
- <property name="visible">False</property>
<property name="can_focus">True</property>
<property name="has_tooltip">True</property>
<property name="tooltip_text" translatable="yes" context="sidebarnumberformat|denominatorplaces|tooltip_text">Enter the number of places for the denominator that you want to display.</property>
@@ -292,7 +294,6 @@
<child>
<object class="GtkCheckButton" id="engineeringnotation">
<property name="label" translatable="yes" context="sidebarnumberformat|engineeringnotation">_Engineering notation</property>
- <property name="visible">False</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="has_tooltip">True</property>
diff --git a/svx/UIConfig_svx.mk b/svx/UIConfig_svx.mk
index 6193d0c52475..689e59fa9ec1 100644
--- a/svx/UIConfig_svx.mk
+++ b/svx/UIConfig_svx.mk
@@ -26,6 +26,7 @@ $(eval $(call gb_UIConfig_add_uifiles,svx,\
svx/uiconfig/ui/chinesedictionary \
svx/uiconfig/ui/classificationdialog \
svx/uiconfig/ui/colorwindow \
+ svx/uiconfig/ui/currencywindow \
svx/uiconfig/ui/colsmenu \
svx/uiconfig/ui/compressgraphicdialog \
svx/uiconfig/ui/convertmenu \
diff --git a/svx/source/tbxctrls/tbcontrl.cxx b/svx/source/tbxctrls/tbcontrl.cxx
index 50eaa75212d1..b4c7ca5e4e9f 100644
--- a/svx/source/tbxctrls/tbcontrl.cxx
+++ b/svx/source/tbxctrls/tbcontrl.cxx
@@ -32,6 +32,7 @@
#include <vcl/bitmapaccess.hxx>
#include <vcl/menubtn.hxx>
#include <vcl/vclptr.hxx>
+#include <vcl/weldutils.hxx>
#include <svtools/valueset.hxx>
#include <svtools/ctrlbox.hxx>
#include <svl/style.hxx>
@@ -3740,16 +3741,167 @@ void SvxSimpleUndoRedoController::StateChanged( sal_uInt16, SfxItemState eState,
SvxCurrencyToolBoxControl::SvxCurrencyToolBoxControl( const css::uno::Reference<css::uno::XComponentContext>& rContext ) :
PopupWindowController( rContext, nullptr, OUString() ),
m_eLanguage( Application::GetSettings().GetLanguageTag().getLanguageType() ),
- m_nFormatKey( NUMBERFORMAT_ENTRY_NOT_FOUND )
+ m_nFormatKey( NUMBERFORMAT_ENTRY_NOT_FOUND ),
+ m_pToolbar(nullptr)
{
}
SvxCurrencyToolBoxControl::~SvxCurrencyToolBoxControl() {}
+namespace
+{
+
+ class ToolbarPopup : public svtools::ToolbarPopupBase
+ {
+ protected:
+ std::unique_ptr<weld::Builder> m_xBuilder;
+ std::unique_ptr<weld::Container> m_xTopLevel;
+ public:
+ ToolbarPopup(const css::uno::Reference<css::frame::XFrame>& rFrame, weld::Widget* pParent, const OUString& rUIFile, const OString& rId)
+ : ToolbarPopupBase(rFrame)
+ , m_xBuilder(Application::CreateBuilder(pParent, rUIFile))
+ , m_xTopLevel(m_xBuilder->weld_container(rId))
+ {
+ }
+ weld::Container* getTopLevel()
+ {
+ return m_xTopLevel.get();
+ }
+ };
+
+ class CurrencyList_Impl : public ToolbarPopup
+ {
+ private:
+ rtl::Reference<SvxCurrencyToolBoxControl> m_xControl;
+ std::unique_ptr<weld::Label> m_xLabel;
+ std::unique_ptr<weld::TreeView> m_xCurrencyLb;
+ std::unique_ptr<weld::Button> m_xOkBtn;
+ OUString& m_rSelectedFormat;
+ LanguageType& m_eSelectedLanguage;
+
+ std::vector<OUString> m_aFormatEntries;
+ LanguageType m_eFormatLanguage;
+ DECL_LINK(RowActivatedHdl, weld::TreeView&, bool);
+ DECL_LINK(FocusHdl, weld::Widget&, void);
+ DECL_LINK(OKHdl, weld::Button&, void);
+
+ public:
+ CurrencyList_Impl(SvxCurrencyToolBoxControl* pControl, weld::Widget* pParent, OUString& rSelectedFormat, LanguageType& eSelectedLanguage)
+ : ToolbarPopup(pControl->getFrameInterface(), pParent, "svx/ui/currencywindow.ui", "CurrencyWindow")
+ , m_xControl(pControl)
+ , m_xLabel(m_xBuilder->weld_label("label"))
+ , m_xCurrencyLb(m_xBuilder->weld_tree_view("currency"))
+ , m_xOkBtn(m_xBuilder->weld_button("ok"))
+ , m_rSelectedFormat(rSelectedFormat)
+ , m_eSelectedLanguage(eSelectedLanguage)
+ {
+ m_xTopLevel->connect_focus_in(LINK(this, CurrencyList_Impl, FocusHdl));
+
+ m_xCurrencyLb->set_size_request(-1, m_xCurrencyLb->get_height_rows(12));
+
+ std::vector< OUString > aList;
+ std::vector< sal_uInt16 > aCurrencyList;
+ const NfCurrencyTable& rCurrencyTable = SvNumberFormatter::GetTheCurrencyTable();
+ sal_uInt16 nLen = rCurrencyTable.size();
+
+ SvNumberFormatter aFormatter( m_xControl->getContext(), LANGUAGE_SYSTEM );
+ m_eFormatLanguage = aFormatter.GetLanguage();
+
+ SvxCurrencyToolBoxControl::GetCurrencySymbols( aList, true, aCurrencyList );
+
+ sal_uInt16 nPos = 0, nCount = 0;
+ sal_Int32 nSelectedPos = -1;
+ bool bIsSymbol;
+ NfWSStringsDtor aStringsDtor;
+
+ for( const auto& rItem : aList )
+ {
+ sal_uInt16& rCurrencyIndex = aCurrencyList[ nCount ];
+ if ( rCurrencyIndex < nLen )
+ {
+ m_xCurrencyLb->append_text(rItem);
+ const NfCurrencyEntry& aCurrencyEntry = rCurrencyTable[ rCurrencyIndex ];
+
+ bIsSymbol = nPos >= nLen;
+
+ sal_uInt16 nDefaultFormat = aFormatter.GetCurrencyFormatStrings( aStringsDtor, aCurrencyEntry, bIsSymbol );
+ const OUString& rFormatStr = aStringsDtor[ nDefaultFormat ];
+ m_aFormatEntries.push_back( rFormatStr );
+ if( rFormatStr == m_rSelectedFormat )
+ nSelectedPos = nPos;
+ ++nPos;
+ }
+ ++nCount;
+ }
+ // enable multiple selection enabled so we can start with nothing selected
+ m_xCurrencyLb->set_selection_mode(SelectionMode::Multiple);
+ m_xCurrencyLb->connect_row_activated( LINK( this, CurrencyList_Impl, RowActivatedHdl ) );
+ m_xLabel->set_label(SvxResId(RID_SVXSTR_TBLAFMT_CURRENCY));
+ m_xCurrencyLb->select( nSelectedPos );
+ m_xOkBtn->connect_clicked(LINK(this, CurrencyList_Impl, OKHdl));
+ }
+
+ };
+
+ IMPL_LINK_NOARG(CurrencyList_Impl, FocusHdl, weld::Widget&, void)
+ {
+ m_xCurrencyLb->grab_focus();
+ }
+
+ IMPL_LINK_NOARG(CurrencyList_Impl, OKHdl, weld::Button&, void)
+ {
+ RowActivatedHdl(*m_xCurrencyLb);
+ }
+
+ IMPL_LINK_NOARG(CurrencyList_Impl, RowActivatedHdl, weld::TreeView&, bool)
+ {
+ if (!m_xControl.is())
+ return true;
+
+ // multiple selection enabled so we can start with nothing selected,
+ // so force single selection after something is picked
+ int nSelected = m_xCurrencyLb->get_selected_index();
+ if (nSelected == -1)
+ return true;
+
+ m_xCurrencyLb->set_selection_mode(SelectionMode::Single);
+
+ m_rSelectedFormat = m_aFormatEntries[nSelected];
+ m_eSelectedLanguage = m_eFormatLanguage;
+
+ m_xControl->execute(nSelected + 1);
+
+ m_xControl->EndPopupMode();
+
+ return true;
+ }
+}
+
+void SvxCurrencyToolBoxControl::EndPopupMode()
+{
+ m_pToolbar->set_menu_item_active(m_aCommandURL.toUtf8(), false);
+}
+
+void SvxCurrencyToolBoxControl::dispose()
+{
+ m_xPopover.reset();
+ svt::PopupWindowController::dispose();
+}
+
void SvxCurrencyToolBoxControl::initialize( const css::uno::Sequence< css::uno::Any >& rArguments )
{
PopupWindowController::initialize(rArguments);
+ if (weld::TransportAsXWindow* pTunnel = dynamic_cast<weld::TransportAsXWindow*>(getParent().get()))
+ {
+ m_pToolbar = dynamic_cast<weld::Toolbar*>(pTunnel->getWidget());
+ assert(m_pToolbar && "must be a toolbar");
+ auto xPopover = std::make_unique<CurrencyList_Impl>(this, m_pToolbar, m_aFormatString, m_eLanguage);
+ m_pToolbar->set_item_popover(m_aCommandURL.toUtf8(), xPopover->getTopLevel());
+ m_xPopover = std::move(xPopover);
+ return;
+ }
+
ToolBox* pToolBox = nullptr;
sal_uInt16 nId = 0;
if (getToolboxId(nId, &pToolBox) && pToolBox->GetItemCommand(nId) == m_aCommandURL)
diff --git a/svx/uiconfig/ui/currencywindow.ui b/svx/uiconfig/ui/currencywindow.ui
new file mode 100644
index 000000000000..982536c65c7e
--- /dev/null
+++ b/svx/uiconfig/ui/currencywindow.ui
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface domain="svx">
+ <requires lib="gtk+" version="3.18"/>
+ <object class="GtkTreeStore" id="liststore1">
+ <columns>
+ <!-- column-name text -->
+ <column type="gchararray"/>
+ <!-- column-name id -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkPopover" id="CurrencyWindow">
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="border_width">4</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">currency</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="currency">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="model">liststore1</property>
+ <property name="headers_visible">False</property>
+ <property name="headers_clickable">False</property>
+ <property name="search_column">0</property>
+ <property name="show_expanders">False</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="selection"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="treeviewcolumn1">
+ <child>
+ <object class="GtkCellRendererText" id="cellrenderertext1"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="ok">
+ <property name="label">gtk-ok</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index 1addc51082d2..6630ee15f2fc 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -7052,6 +7052,17 @@ private:
gtk_container_forall(GTK_CONTAINER(pWidget), find_menu_button, user_data);
}
+ static void find_menupeer_button(GtkWidget *pWidget, gpointer user_data)
+ {
+ if (g_strcmp0(gtk_widget_get_name(pWidget), "GtkButton") == 0)
+ {
+ GtkWidget **ppButton = static_cast<GtkWidget**>(user_data);
+ *ppButton = pWidget;
+ }
+ else if (GTK_IS_CONTAINER(pWidget))
+ gtk_container_forall(GTK_CONTAINER(pWidget), find_menupeer_button, user_data);
+ }
+
static void collect(GtkWidget* pItem, gpointer widget)
{
if (GTK_IS_TOOL_BUTTON(pItem))
@@ -7139,8 +7150,24 @@ public:
disable_item_notify_events();
GtkToolButton* pToolButton = m_aMap.find(rIdent)->second;
- assert(GTK_IS_TOGGLE_TOOL_BUTTON(pToolButton) || !bActive);
- if (GTK_IS_TOGGLE_TOOL_BUTTON(pToolButton))
+
+ assert(GTK_IS_TOGGLE_TOOL_BUTTON(pToolButton) || GTK_IS_MENU_TOOL_BUTTON(pToolButton) || !bActive);
+ if (GTK_IS_MENU_TOOL_BUTTON(pToolButton))
+ {
+ GtkButton* pButton = nullptr;
+ // there is no GtkMenuToggleToolButton so abuse the CHECKED state of the GtkMenuToolButton button
+ // to emulate one
+ find_menupeer_button(GTK_WIDGET(pToolButton), &pButton);
+ if (pButton)
+ {
+ GtkStyleContext *pWidgetContext = gtk_widget_get_style_context(GTK_WIDGET(pButton));
+ auto eState = gtk_style_context_get_state(pWidgetContext) & ~GTK_STATE_FLAG_CHECKED;
+ if (bActive)
+ eState |= GTK_STATE_FLAG_CHECKED;
+ gtk_style_context_set_state(pWidgetContext, static_cast<GtkStateFlags>(eState));
+ }
+ }
+ else if (GTK_IS_TOGGLE_TOOL_BUTTON(pToolButton))
gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(pToolButton), bActive);
enable_item_notify_events();
@@ -7148,12 +7175,25 @@ public:
virtual bool get_item_active(const OString& rIdent) const override
{
- auto aFind = m_aMenuButtonMap.find(rIdent);
- if (aFind != m_aMenuButtonMap.end())
- return aFind->second->get_active();
-
GtkToolButton* pToolButton = m_aMap.find(rIdent)->second;
- return gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(pToolButton));
+
+ assert(GTK_IS_TOGGLE_TOOL_BUTTON(pToolButton) || GTK_IS_MENU_TOOL_BUTTON(pToolButton));
+ if (GTK_IS_MENU_TOOL_BUTTON(pToolButton))
+ {
+ GtkButton* pButton = nullptr;
+ // there is no GtkMenuToggleToolButton so abuse the CHECKED state of the GtkMenuToolButton button
+ // to emulate one
+ find_menupeer_button(GTK_WIDGET(pToolButton), &pButton);
+ if (pButton)
+ {
+ GtkStyleContext *pWidgetContext = gtk_widget_get_style_context(GTK_WIDGET(pButton));
+ return gtk_style_context_get_state(pWidgetContext) & GTK_STATE_FLAG_CHECKED;
+ }
+ }
+ else if (GTK_IS_TOGGLE_TOOL_BUTTON(pToolButton))
+ return gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(pToolButton));
+
+ return false;
}
virtual void set_menu_item_active(const OString& rIdent, bool bActive) override