cui/source/customize/SvxMenuConfigPage.cxx    |    6 +
 cui/source/customize/SvxToolbarConfigPage.cxx |   50 +++++++++++++
 cui/source/customize/cfg.cxx                  |   94 ++++++++++++++++++++++++++
 cui/source/inc/cfg.hxx                        |    6 +
 cui/uiconfig/ui/menuassignpage.ui             |   32 ++++++++
 5 files changed, 184 insertions(+), 4 deletions(-)

New commits:
commit 3ba75bf050336bef3738a92a7a942622b9326498
Author: Muhammet Kara <muhammet.k...@pardus.org.tr>
Date:   Thu Apr 12 10:17:31 2018 +0300

    tdf#114260: Allow setting toolbar style in the gear menu
    
    of the Customize dialog.
    
    Change-Id: I69e39175a235446dd75fe59324298b9c59ee2d81
    Reviewed-on: https://gerrit.libreoffice.org/52774
    Reviewed-by: Heiko Tietze <tietze.he...@gmail.com>
    Tested-by: Heiko Tietze <tietze.he...@gmail.com>
    Tested-by: Jenkins <c...@libreoffice.org>

diff --git a/cui/source/customize/SvxMenuConfigPage.cxx 
b/cui/source/customize/SvxMenuConfigPage.cxx
index efaadbe11a0b..cfa7996563fd 100644
--- a/cui/source/customize/SvxMenuConfigPage.cxx
+++ b/cui/source/customize/SvxMenuConfigPage.cxx
@@ -143,6 +143,12 @@ SvxMenuConfigPage::SvxMenuConfigPage(vcl::Window *pParent, 
const SfxItemSet& rSe
     pPopup->EnableItem( pPopup->GetItemId("restoreItem"), false );
     pPopup->RemoveDisabledEntries();
 
+    PopupMenu* pGearMenu = m_pGearBtn->GetPopupMenu();
+    pGearMenu->EnableItem( pGearMenu->GetItemId("gear_iconAndText"), false );
+    pGearMenu->EnableItem( pGearMenu->GetItemId("gear_iconOnly"), false );
+    pGearMenu->EnableItem( pGearMenu->GetItemId("gear_textOnly"), false );
+    pGearMenu->RemoveDisabledEntries();
+
     if ( !bIsMenuBar )
     {
         //TODO: Remove this when the gear button is implemented for context 
menus
diff --git a/cui/source/customize/SvxToolbarConfigPage.cxx 
b/cui/source/customize/SvxToolbarConfigPage.cxx
index c09d354cb9e5..f3b64a304e08 100644
--- a/cui/source/customize/SvxToolbarConfigPage.cxx
+++ b/cui/source/customize/SvxToolbarConfigPage.cxx
@@ -339,6 +339,7 @@ IMPL_LINK_NOARG( SvxToolbarConfigPage, SelectToolbarEntry, 
SvTreeListBox *, void
 IMPL_LINK( SvxToolbarConfigPage, GearHdl, MenuButton *, pButton, void )
 {
     OString sIdent = pButton->GetCurItemIdent();
+    SvxConfigEntry* pCurrentToolbar = GetTopLevelSelection();
 
     if (sIdent == "gear_add")
     {
@@ -402,9 +403,7 @@ IMPL_LINK( SvxToolbarConfigPage, GearHdl, MenuButton *, 
pButton, void )
     }
     else if (sIdent == "gear_delete")
     {
-        SvxConfigEntry* pToolbar = GetTopLevelSelection();
-
-        if ( pToolbar && pToolbar->IsDeletable() )
+        if ( pCurrentToolbar && pCurrentToolbar->IsDeletable() )
         {
             DeleteSelectedTopLevel();
             UpdateButtonStates();
@@ -443,6 +442,29 @@ IMPL_LINK( SvxToolbarConfigPage, GearHdl, MenuButton *, 
pButton, void )
             m_pTopLevelListBox->SelectEntryPos( nSelectionPos );
         }
     }
+    else if (sIdent == "gear_iconOnly" || sIdent == "gear_textOnly" || sIdent 
== "gear_iconAndText")
+    {
+        ToolbarSaveInData* pSaveInData = static_cast<ToolbarSaveInData*>( 
GetSaveInData() );
+
+        if (pCurrentToolbar == nullptr || pSaveInData == nullptr)
+        {
+            SAL_WARN("cui.customize", "NULL toolbar or savein data");
+            return;
+        }
+
+        sal_Int32 nStyle = 0;
+        if (sIdent == "gear_iconOnly")
+            nStyle = 0;
+        else if (sIdent == "gear_textOnly")
+            nStyle = 1;
+        else if (sIdent == "gear_iconAndText")
+            nStyle = 2;
+
+        pCurrentToolbar->SetStyle( nStyle );
+        pSaveInData->SetSystemStyle( m_xFrame, pCurrentToolbar->GetCommand(), 
nStyle );
+
+        m_pTopLevelListBox->GetSelectHdl().Call( *m_pTopLevelListBox );
+    }
     else
     {
         //This block should never be reached
@@ -788,6 +810,7 @@ IMPL_LINK_NOARG( SvxToolbarConfigPage, SelectToolbar, 
ListBox&, void )
         //TODO: Disable related buttons
         m_pInsertBtn->Enable( false );
         m_pResetBtn->Enable( false );
+        m_pGearBtn->Enable( false );
 
         return;
     }
@@ -795,6 +818,27 @@ IMPL_LINK_NOARG( SvxToolbarConfigPage, SelectToolbar, 
ListBox&, void )
     {
         m_pInsertBtn->Enable();
         m_pResetBtn->Enable();
+        m_pGearBtn->Enable();
+    }
+
+    PopupMenu* pGearMenu = m_pGearBtn->GetPopupMenu();
+    switch( pToolbar->GetStyle() )
+    {
+        case 0:
+        {
+            pGearMenu->CheckItem( pGearMenu->GetItemId("gear_iconOnly") );
+            break;
+        }
+        case 1:
+        {
+            pGearMenu->CheckItem( pGearMenu->GetItemId("gear_textOnly") );
+            break;
+        }
+        case 2:
+        {
+            pGearMenu->CheckItem( pGearMenu->GetItemId("gear_iconAndText") );
+            break;
+        }
     }
 
     SvxEntries* pEntries = pToolbar->GetEntries();
diff --git a/cui/source/customize/cfg.cxx b/cui/source/customize/cfg.cxx
index 02c4d5c834f0..f8a2aa420835 100644
--- a/cui/source/customize/cfg.cxx
+++ b/cui/source/customize/cfg.cxx
@@ -50,6 +50,7 @@
 #include <svtools/treelistentry.hxx>
 #include <svtools/viewdataentry.hxx>
 #include <tools/diagnose_ex.h>
+#include <toolkit/helper/vclunohelper.hxx>
 
 #include <algorithm>
 #include <strings.hrc>
@@ -2169,6 +2170,99 @@ sal_Int32 ToolbarSaveInData::GetSystemStyle( const 
OUString& rResourceURL )
     return result;
 }
 
+void ToolbarSaveInData::SetSystemStyle(
+    const uno::Reference< frame::XFrame >& xFrame,
+    const OUString& rResourceURL,
+    sal_Int32 nStyle )
+{
+    // change the style using the API
+    SetSystemStyle( rResourceURL, nStyle );
+
+    // this code is a temporary hack as the UI is not updating after
+    // changing the toolbar style via the API
+    uno::Reference< css::frame::XLayoutManager > xLayoutManager;
+    vcl::Window *window = nullptr;
+
+    uno::Reference< beans::XPropertySet > xPropSet( xFrame, uno::UNO_QUERY );
+    if ( xPropSet.is() )
+    {
+        uno::Any a = xPropSet->getPropertyValue( "LayoutManager" );
+        a >>= xLayoutManager;
+    }
+
+    if ( xLayoutManager.is() )
+    {
+        uno::Reference< css::ui::XUIElement > xUIElement =
+            xLayoutManager->getElement( rResourceURL );
+
+        // check reference before we call getRealInterface. The layout manager
+        // can only provide references for elements that have been created
+        // before. It's possible that the current element is not available.
+        uno::Reference< css::awt::XWindow > xWindow;
+        if ( xUIElement.is() )
+            xWindow.set( xUIElement->getRealInterface(), uno::UNO_QUERY );
+
+        window = VCLUnoHelper::GetWindow( xWindow ).get();
+    }
+
+    if ( window != nullptr && window->GetType() == WindowType::TOOLBOX )
+    {
+        ToolBox* toolbox = static_cast<ToolBox*>(window);
+
+        if ( nStyle == 0 )
+        {
+            toolbox->SetButtonType( ButtonType::SYMBOLONLY );
+        }
+        else if ( nStyle == 1 )
+        {
+            toolbox->SetButtonType( ButtonType::TEXT );
+        }
+        if ( nStyle == 2 )
+        {
+            toolbox->SetButtonType( ButtonType::SYMBOLTEXT );
+        }
+    }
+}
+
+void ToolbarSaveInData::SetSystemStyle(
+    const OUString& rResourceURL,
+    sal_Int32 nStyle )
+{
+    if ( rResourceURL.startsWith( "private" ) &&
+         m_xPersistentWindowState.is() &&
+         m_xPersistentWindowState->hasByName( rResourceURL ) )
+    {
+        try
+        {
+            uno::Sequence< beans::PropertyValue > aProps;
+
+            uno::Any a( m_xPersistentWindowState->getByName( rResourceURL ) );
+
+            if ( a >>= aProps )
+            {
+                for ( sal_Int32 i = 0; i < aProps.getLength(); ++i )
+                {
+                    if ( aProps[ i ].Name == ITEM_DESCRIPTOR_STYLE )
+                    {
+                        aProps[ i ].Value <<= nStyle;
+                        break;
+                    }
+                }
+            }
+
+            uno::Reference< container::XNameReplace >
+                xNameReplace( m_xPersistentWindowState, uno::UNO_QUERY );
+
+            xNameReplace->replaceByName( rResourceURL, uno::Any( aProps ) );
+        }
+        catch ( uno::Exception& )
+        {
+            // do nothing, a default value is returned
+            SAL_WARN("cui.customize", "Exception setting toolbar style");
+        }
+    }
+}
+
 OUString ToolbarSaveInData::GetSystemUIName( const OUString& rResourceURL )
 {
     OUString result;
diff --git a/cui/source/inc/cfg.hxx b/cui/source/inc/cfg.hxx
index 69f42cae7aee..bb8ce1b24f60 100644
--- a/cui/source/inc/cfg.hxx
+++ b/cui/source/inc/cfg.hxx
@@ -559,6 +559,12 @@ public:
 
     sal_Int32       GetSystemStyle( const OUString& rResourceURL );
 
+    void            SetSystemStyle( const OUString& rResourceURL, sal_Int32 
nStyle );
+
+    void            SetSystemStyle(
+                        const css::uno::Reference< css::frame::XFrame >& 
xFrame,
+                        const OUString& rResourceURL, sal_Int32 nStyle );
+
     SvxEntries*     GetEntries() override;
     void            SetEntries( std::unique_ptr<SvxEntries> ) override;
     bool            HasSettings() override;
diff --git a/cui/uiconfig/ui/menuassignpage.ui 
b/cui/uiconfig/ui/menuassignpage.ui
index fcaaf20f71d7..556043cb2274 100644
--- a/cui/uiconfig/ui/menuassignpage.ui
+++ b/cui/uiconfig/ui/menuassignpage.ui
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.20.0 -->
+<!-- Generated with glade 3.22.0 -->
 <interface domain="cui">
   <requires lib="gtk+" version="3.18"/>
   <requires lib="LibreOffice" version="1.0"/>
@@ -38,6 +38,36 @@
         <property name="use_underline">True</property>
       </object>
     </child>
+    <child>
+      <object class="GtkSeparatorMenuItem" id="gear_separator">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+      </object>
+    </child>
+    <child>
+      <object class="GtkRadioMenuItem" id="gear_iconAndText">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes" 
context="menuassignpage|gear_iconAndText">Icon _and text</property>
+        <property name="use_underline">True</property>
+      </object>
+    </child>
+    <child>
+      <object class="GtkRadioMenuItem" id="gear_iconOnly">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes" 
context="menuassignpage|gear_iconOnly">_Icon only</property>
+        <property name="use_underline">True</property>
+      </object>
+    </child>
+    <child>
+      <object class="GtkRadioMenuItem" id="gear_textOnly">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes" 
context="menuassignpage|gear_textOnly">_Text only</property>
+        <property name="use_underline">True</property>
+      </object>
+    </child>
   </object>
   <object class="GtkImage" id="image1">
     <property name="visible">True</property>
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to