[Libreoffice-commits] core.git: svx/source svx/uiconfig

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Thu Jan 9 09:18:10 UTC 2020


 svx/source/tbxctrls/tbcontrl.cxx  |  159 +++++++++-----------------------------
 svx/uiconfig/ui/currencywindow.ui |    2 
 2 files changed, 42 insertions(+), 119 deletions(-)

New commits:
commit bb362ca226a0089a1b036366e9ffc45ab5c90d8d
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Wed Jan 8 13:15:29 2020 +0000
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Thu Jan 9 10:17:34 2020 +0100

    use welded CurrencyList dropdown in all toolbars
    
    Change-Id: Ia6d285947ce8cbae50700ee95bba861884c7e030
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86434
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/svx/source/tbxctrls/tbcontrl.cxx b/svx/source/tbxctrls/tbcontrl.cxx
index 93f589a7d03b..322bf970b54e 100644
--- a/svx/source/tbxctrls/tbcontrl.cxx
+++ b/svx/source/tbxctrls/tbcontrl.cxx
@@ -631,27 +631,6 @@ public:
     virtual void dispose() override { m_aLineStyleLb.disposeAndClear(); ToolbarPopup::dispose(); }
 };
 
-class SvxCurrencyList_Impl : public svtools::ToolbarPopup
-{
-private:
-    VclPtr<ListBox> m_pCurrencyLb;
-    rtl::Reference<SvxCurrencyToolBoxControl> m_xControl;
-    OUString&       m_rSelectedFormat;
-    LanguageType&   m_eSelectedLanguage;
-
-    std::vector<OUString> m_aFormatEntries;
-    LanguageType          m_eFormatLanguage;
-    DECL_LINK( SelectHdl, ListBox&, void );
-
-public:
-    SvxCurrencyList_Impl( SvxCurrencyToolBoxControl* pControl,
-                          vcl::Window* pParentWindow,
-                          OUString&     rSelectFormat,
-                          LanguageType& eSelectLanguage );
-    virtual ~SvxCurrencyList_Impl() override { disposeOnce(); }
-    virtual void dispose() override;
-};
-
 }
 
 class SvxStyleToolBoxControl;
@@ -2647,68 +2626,6 @@ static Color lcl_mediumColor( Color aMain, Color /*aDefault*/ )
     return SvxBorderLine::threeDMediumColor( aMain );
 }
 
-SvxCurrencyList_Impl::SvxCurrencyList_Impl(
-    SvxCurrencyToolBoxControl* pControl,
-    vcl::Window* pParentWindow,
-    OUString& rSelectedFormat,
-    LanguageType& eSelectedLanguage ) :
-    ToolbarPopup( pControl->getFrameInterface(), pParentWindow, WB_STDPOPUP | WB_MOVEABLE | WB_CLOSEABLE ),
-    m_pCurrencyLb( VclPtr<ListBox>::Create(this) ),
-    m_xControl( pControl ),
-    m_rSelectedFormat( rSelectedFormat ),
-    m_eSelectedLanguage( eSelectedLanguage )
-{
-    m_pCurrencyLb->setPosSizePixel( 2, 2, 300, 140 );
-    SetOutputSizePixel( Size( 304, 144 ) );
-
-    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_pCurrencyLb->InsertEntry( 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;
-    }
-    m_pCurrencyLb->SetSelectHdl( LINK( this, SvxCurrencyList_Impl, SelectHdl ) );
-    SetText( SvxResId( RID_SVXSTR_TBLAFMT_CURRENCY ) );
-    if ( nSelectedPos >= 0 )
-        m_pCurrencyLb->SelectEntryPos( nSelectedPos );
-    m_pCurrencyLb->Show();
-}
-
-void SvxCurrencyList_Impl::dispose()
-{
-    m_xControl.clear();
-    m_pCurrencyLb.disposeAndClear();
-    ToolbarPopup::dispose();
-}
-
 SvxLineWindow_Impl::SvxLineWindow_Impl( svt::ToolboxController& rController, vcl::Window* pParentWindow ) :
     ToolbarPopup( rController.getFrameInterface(), pParentWindow, WB_STDPOPUP | WB_MOVEABLE | WB_CLOSEABLE ),
     m_aLineStyleLb( VclPtr<LineListBox>::Create(this) ),
@@ -2764,22 +2681,6 @@ SvxLineWindow_Impl::SvxLineWindow_Impl( svt::ToolboxController& rController, vcl
     m_aLineStyleLb->Show();
 }
 
-IMPL_LINK_NOARG(SvxCurrencyList_Impl, SelectHdl, ListBox&, void)
-{
-    VclPtr<SvxCurrencyList_Impl> xThis(this);
-
-    if ( IsInPopupMode() )
-        EndPopupMode();
-
-    if (!m_xControl.is())
-        return;
-
-    m_rSelectedFormat = m_aFormatEntries[ m_pCurrencyLb->GetSelectedEntryPos() ];
-    m_eSelectedLanguage = m_eFormatLanguage;
-
-    m_xControl->execute( m_pCurrencyLb->GetSelectedEntryPos() + 1 );
-}
-
 IMPL_LINK_NOARG(SvxLineWindow_Impl, SelectHdl, ListBox&, void)
 {
     VclPtr<SvxLineWindow_Impl> xThis(this);
@@ -3796,7 +3697,7 @@ SvxCurrencyToolBoxControl::~SvxCurrencyToolBoxControl() {}
 
 namespace
 {
-    class CurrencyList_Impl : public WeldToolbarPopup
+    class SvxCurrencyList_Impl : public WeldToolbarPopup
     {
     private:
         rtl::Reference<SvxCurrencyToolBoxControl> m_xControl;
@@ -3814,7 +3715,7 @@ namespace
         virtual void GrabFocus() override;
 
     public:
-        CurrencyList_Impl(SvxCurrencyToolBoxControl* pControl, weld::Widget* pParent, OUString& rSelectedFormat, LanguageType& eSelectedLanguage)
+        SvxCurrencyList_Impl(SvxCurrencyToolBoxControl* pControl, weld::Widget* pParent, OUString& rSelectedFormat, LanguageType& eSelectedLanguage)
             : WeldToolbarPopup(pControl->getFrameInterface(), pParent, "svx/ui/currencywindow.ui", "CurrencyWindow")
             , m_xControl(pControl)
             , m_xLabel(m_xBuilder->weld_label("label"))
@@ -3823,8 +3724,6 @@ namespace
             , m_rSelectedFormat(rSelectedFormat)
             , m_eSelectedLanguage(eSelectedLanguage)
         {
-            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();
@@ -3840,12 +3739,19 @@ namespace
             bool bIsSymbol;
             NfWSStringsDtor aStringsDtor;
 
+            OUString sLongestString;
+
+            m_xCurrencyLb->freeze();
             for( const auto& rItem : aList )
             {
                 sal_uInt16& rCurrencyIndex = aCurrencyList[ nCount ];
                 if ( rCurrencyIndex < nLen )
                 {
                     m_xCurrencyLb->append_text(rItem);
+
+                    if (rItem.getLength() > sLongestString.getLength())
+                        sLongestString = rItem;
+
                     const NfCurrencyEntry& aCurrencyEntry = rCurrencyTable[ rCurrencyIndex ];
 
                     bIsSymbol = nPos >= nLen;
@@ -3859,26 +3765,33 @@ namespace
                 }
                 ++nCount;
             }
+            m_xCurrencyLb->thaw();
             // 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_xCurrencyLb->connect_row_activated( LINK( this, SvxCurrencyList_Impl, RowActivatedHdl ) );
             m_xLabel->set_label(SvxResId(RID_SVXSTR_TBLAFMT_CURRENCY));
             m_xCurrencyLb->select( nSelectedPos );
-            m_xOkBtn->connect_clicked(LINK(this, CurrencyList_Impl, OKHdl));
+            m_xOkBtn->connect_clicked(LINK(this, SvxCurrencyList_Impl, OKHdl));
+
+            // gtk will initially make a best guess depending on the first few entries, so copy the probable
+            // longest entry to the start temporarily and force in the width at this point
+            m_xCurrencyLb->insert_text(0, sLongestString);
+            m_xCurrencyLb->set_size_request(m_xCurrencyLb->get_preferred_size().Width(), m_xCurrencyLb->get_height_rows(12));
+            m_xCurrencyLb->remove(0);
         }
     };
 
-    void CurrencyList_Impl::GrabFocus()
+    void SvxCurrencyList_Impl::GrabFocus()
     {
         m_xCurrencyLb->grab_focus();
     }
 
-    IMPL_LINK_NOARG(CurrencyList_Impl, OKHdl, weld::Button&, void)
+    IMPL_LINK_NOARG(SvxCurrencyList_Impl, OKHdl, weld::Button&, void)
     {
         RowActivatedHdl(*m_xCurrencyLb);
     }
 
-    IMPL_LINK_NOARG(CurrencyList_Impl, RowActivatedHdl, weld::TreeView&, bool)
+    IMPL_LINK_NOARG(SvxCurrencyList_Impl, RowActivatedHdl, weld::TreeView&, bool)
     {
         if (!m_xControl.is())
             return true;
@@ -3906,23 +3819,33 @@ void SvxCurrencyToolBoxControl::initialize( const css::uno::Sequence< css::uno::
 {
     PopupWindowController::initialize(rArguments);
 
-    if (m_pToolbar)
-    {
-        auto xPopover = std::make_unique<CurrencyList_Impl>(this, m_pToolbar, m_aFormatString, m_eLanguage);
-        m_pToolbar->set_item_popover(m_aCommandURL.toUtf8(), xPopover->getTopLevel());
-        mxPopover = std::move(xPopover);
-        return;
-    }
-
     ToolBox* pToolBox = nullptr;
     sal_uInt16 nId = 0;
-    if (getToolboxId(nId, &pToolBox) && pToolBox->GetItemCommand(nId) == m_aCommandURL)
+    bool bVcl = getToolboxId(nId, &pToolBox);
+
+    weld::Widget* pParent;
+    if (pToolBox)
+        pParent = pToolBox->GetFrameWeld();
+    else
+        pParent = m_pToolbar;
+    mxPopover = std::make_unique<SvxCurrencyList_Impl>(this, pParent, m_aFormatString, m_eLanguage);
+
+    if (bVcl && pToolBox->GetItemCommand(nId) == m_aCommandURL)
         pToolBox->SetItemBits(nId, ToolBoxItemBits::DROPDOWN | pToolBox->GetItemBits(nId));
+    else if (m_pToolbar)
+    {
+        const OString aId(m_aCommandURL.toUtf8());
+        m_pToolbar->set_item_popover(aId, mxPopover->getTopLevel());
+    }
 }
 
 VclPtr<vcl::Window> SvxCurrencyToolBoxControl::createPopupWindow( vcl::Window* pParent )
 {
-    return VclPtr<SvxCurrencyList_Impl>::Create(this, pParent, m_aFormatString, m_eLanguage);
+    mxInterimPopover = VclPtr<InterimToolbarPopup>::Create(getFrameInterface(), pParent, mxPopover.get());
+
+    mxInterimPopover->Show();
+
+    return mxInterimPopover;
 }
 
 void SvxCurrencyToolBoxControl::execute( sal_Int16 nSelectModifier )
diff --git a/svx/uiconfig/ui/currencywindow.ui b/svx/uiconfig/ui/currencywindow.ui
index 982536c65c7e..e63d492498fa 100644
--- a/svx/uiconfig/ui/currencywindow.ui
+++ b/svx/uiconfig/ui/currencywindow.ui
@@ -15,7 +15,7 @@
     <property name="no_show_all">True</property>
     <property name="border_width">4</property>
     <child>
-      <object class="GtkBox">
+      <object class="GtkBox" id="container">
         <property name="visible">True</property>
         <property name="can_focus">False</property>
         <property name="orientation">vertical</property>


More information about the Libreoffice-commits mailing list