LCOV - code coverage report
Current view: top level - cui/source/customize - cfg.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 0 2389 0.0 %
Date: 2015-06-13 12:38:46 Functions: 0 207 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include "sal/config.h"
      21             : 
      22             : #include <cassert>
      23             : #include <stdlib.h>
      24             : #include <time.h>
      25             : 
      26             : #include <vcl/help.hxx>
      27             : #include <vcl/layout.hxx>
      28             : #include <vcl/msgbox.hxx>
      29             : #include <vcl/decoview.hxx>
      30             : #include <vcl/toolbox.hxx>
      31             : #include <vcl/scrbar.hxx>
      32             : #include <vcl/virdev.hxx>
      33             : #include <vcl/settings.hxx>
      34             : 
      35             : #include <sfx2/app.hxx>
      36             : #include <sfx2/sfxdlg.hxx>
      37             : #include <sfx2/viewfrm.hxx>
      38             : #include <sfx2/viewsh.hxx>
      39             : #include <sfx2/msg.hxx>
      40             : #include <sfx2/msgpool.hxx>
      41             : #include <sfx2/mnumgr.hxx>
      42             : #include <sfx2/minfitem.hxx>
      43             : #include <sfx2/objsh.hxx>
      44             : #include <sfx2/request.hxx>
      45             : #include <sfx2/filedlghelper.hxx>
      46             : #include <svl/stritem.hxx>
      47             : #include <svtools/miscopt.hxx>
      48             : #include <svtools/svlbitm.hxx>
      49             : #include "svtools/treelistentry.hxx"
      50             : #include "svtools/viewdataentry.hxx"
      51             : #include <tools/diagnose_ex.h>
      52             : #include <toolkit/helper/vclunohelper.hxx>
      53             : 
      54             : #include <algorithm>
      55             : #include <cuires.hrc>
      56             : #include "cfg.hrc"
      57             : #include "helpid.hrc"
      58             : 
      59             : #include "acccfg.hxx"
      60             : #include "cfg.hxx"
      61             : #include "eventdlg.hxx"
      62             : #include <dialmgr.hxx>
      63             : 
      64             : #include <comphelper/documentinfo.hxx>
      65             : #include <comphelper/processfactory.hxx>
      66             : #include <comphelper/random.hxx>
      67             : #include <unotools/configmgr.hxx>
      68             : #include <com/sun/star/embed/ElementModes.hpp>
      69             : #include <com/sun/star/embed/FileSystemStorageFactory.hpp>
      70             : #include <com/sun/star/frame/XFramesSupplier.hpp>
      71             : #include <com/sun/star/frame/XFrames.hpp>
      72             : #include <com/sun/star/frame/XLayoutManager.hpp>
      73             : #include <com/sun/star/frame/FrameSearchFlag.hpp>
      74             : #include <com/sun/star/frame/ModuleManager.hpp>
      75             : #include <com/sun/star/frame/XController.hpp>
      76             : #include <com/sun/star/frame/Desktop.hpp>
      77             : #include <com/sun/star/frame/theUICommandDescription.hpp>
      78             : #include <com/sun/star/graphic/GraphicProvider.hpp>
      79             : #include <com/sun/star/ui/ItemType.hpp>
      80             : #include <com/sun/star/ui/ItemStyle.hpp>
      81             : #include <com/sun/star/ui/ImageManager.hpp>
      82             : #include <com/sun/star/ui/theModuleUIConfigurationManagerSupplier.hpp>
      83             : #include <com/sun/star/ui/XUIConfiguration.hpp>
      84             : #include <com/sun/star/ui/XUIConfigurationListener.hpp>
      85             : #include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp>
      86             : #include <com/sun/star/ui/XUIConfigurationPersistence.hpp>
      87             : #include <com/sun/star/ui/XUIConfigurationStorage.hpp>
      88             : #include <com/sun/star/ui/XModuleUIConfigurationManager.hpp>
      89             : #include <com/sun/star/ui/XUIElement.hpp>
      90             : #include <com/sun/star/ui/UIElementType.hpp>
      91             : #include <com/sun/star/ui/ImageType.hpp>
      92             : #include <com/sun/star/ui/theWindowStateConfiguration.hpp>
      93             : #include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
      94             : #include "com/sun/star/ui/dialogs/TemplateDescription.hpp"
      95             : #include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp>
      96             : #include <com/sun/star/util/thePathSettings.hpp>
      97             : 
      98             : #include "dlgname.hxx"
      99             : #include <boost/scoped_ptr.hpp>
     100             : 
     101             : #define PRTSTR(x) OUStringToOString(x, RTL_TEXTENCODING_ASCII_US).pData->buffer
     102             : 
     103             : #define ENTRY_HEIGHT 16
     104             : 
     105             : static const char ITEM_DESCRIPTOR_COMMANDURL[]  = "CommandURL";
     106             : static const char ITEM_DESCRIPTOR_CONTAINER[]   = "ItemDescriptorContainer";
     107             : static const char ITEM_DESCRIPTOR_LABEL[]       = "Label";
     108             : static const char ITEM_DESCRIPTOR_TYPE[]        = "Type";
     109             : static const char ITEM_DESCRIPTOR_STYLE[]       = "Style";
     110             : static const char ITEM_DESCRIPTOR_ISVISIBLE[]   = "IsVisible";
     111             : static const char ITEM_DESCRIPTOR_RESOURCEURL[] = "ResourceURL";
     112             : static const char ITEM_DESCRIPTOR_UINAME[]      = "UIName";
     113             : 
     114             : static const char ITEM_MENUBAR_URL[] = "private:resource/menubar/menubar";
     115             : static const char ITEM_TOOLBAR_URL[] = "private:resource/toolbar/";
     116             : 
     117             : static const char CUSTOM_TOOLBAR_STR[] = "custom_toolbar_";
     118             : static const char CUSTOM_MENU_STR[] = "vnd.openoffice.org:CustomMenu";
     119             : 
     120             : static const char aSeparatorStr[] = "----------------------------------";
     121             : static const char aMenuSeparatorStr[] = " | ";
     122             : 
     123             : namespace uno = com::sun::star::uno;
     124             : namespace frame = com::sun::star::frame;
     125             : namespace lang = com::sun::star::lang;
     126             : namespace container = com::sun::star::container;
     127             : namespace beans = com::sun::star::beans;
     128             : namespace graphic = com::sun::star::graphic;
     129             : 
     130             : #if OSL_DEBUG_LEVEL > 1
     131             : 
     132             : void printPropertySet(
     133             :     const OUString& prefix,
     134             :     const uno::Reference< beans::XPropertySet >& xPropSet )
     135             : {
     136             :     uno::Reference< beans::XPropertySetInfo > xPropSetInfo =
     137             :         xPropSet->getPropertySetInfo();
     138             : 
     139             :     uno::Sequence< beans::Property > aPropDetails =
     140             :         xPropSetInfo->getProperties();
     141             : 
     142             :     OSL_TRACE("printPropertySet: %d properties", aPropDetails.getLength());
     143             : 
     144             :     for ( sal_Int32 i = 0; i < aPropDetails.getLength(); ++i )
     145             :     {
     146             :         OUString tmp;
     147             :         sal_Int32 ival;
     148             : 
     149             :         uno::Any a = xPropSet->getPropertyValue( aPropDetails[i].Name );
     150             : 
     151             :         if ( a >>= tmp )
     152             :         {
     153             :             OSL_TRACE("%s: Got property: %s = %s",
     154             :                 PRTSTR(prefix), PRTSTR(aPropDetails[i].Name), PRTSTR(tmp));
     155             :         }
     156             :         else if ( ( a >>= ival ) )
     157             :         {
     158             :             OSL_TRACE("%s: Got property: %s = %d",
     159             :                 PRTSTR(prefix), PRTSTR(aPropDetails[i].Name), ival);
     160             :         }
     161             :         else
     162             :         {
     163             :             OSL_TRACE("%s: Got property: %s of type %s",
     164             :                 PRTSTR(prefix), PRTSTR(aPropDetails[i].Name), PRTSTR(a.getValueTypeName()));
     165             :         }
     166             :     }
     167             : }
     168             : 
     169             : void printProperties(
     170             :     const OUString& prefix,
     171             :     const uno::Sequence< beans::PropertyValue >& aProp )
     172             : {
     173             :     for ( sal_Int32 i = 0; i < aProp.getLength(); ++i )
     174             :     {
     175             :         OUString tmp;
     176             : 
     177             :         aProp[i].Value >>= tmp;
     178             : 
     179             :         OSL_TRACE("%s: Got property: %s = %s",
     180             :             PRTSTR(prefix), PRTSTR(aProp[i].Name), PRTSTR(tmp));
     181             :     }
     182             : }
     183             : 
     184             : void printEntries(SvxEntries* entries)
     185             : {
     186             :     SvxEntries::const_iterator iter = entries->begin();
     187             : 
     188             :     for ( ; iter != entries->end(); ++iter )
     189             :     {
     190             :         SvxConfigEntry* entry = *iter;
     191             : 
     192             :         OSL_TRACE("printEntries: %s", PRTSTR(entry->GetName()));
     193             :     }
     194             : }
     195             : 
     196             : #endif
     197             : 
     198             : OUString
     199           0 : stripHotKey( const OUString& str )
     200             : {
     201           0 :     sal_Int32 index = str.indexOf( '~' );
     202           0 :     if ( index == -1 )
     203             :     {
     204           0 :         return str;
     205             :     }
     206             :     else
     207             :     {
     208           0 :         return str.replaceAt( index, 1, OUString() );
     209             :     }
     210             : }
     211             : 
     212           0 : OUString replaceSaveInName(
     213             :     const OUString& rMessage,
     214             :     const OUString& rSaveInName )
     215             : {
     216           0 :     OUString name;
     217           0 :     OUString placeholder("%SAVE IN SELECTION%" );
     218             : 
     219           0 :     sal_Int32 pos = rMessage.indexOf( placeholder );
     220             : 
     221           0 :     if ( pos != -1 )
     222             :     {
     223           0 :         name = rMessage.replaceAt(
     224           0 :             pos, placeholder.getLength(), rSaveInName );
     225             :     }
     226             : 
     227           0 :     return name;
     228             : }
     229             : 
     230             : OUString
     231           0 : replaceSixteen( const OUString& str, sal_Int32 nReplacement )
     232             : {
     233           0 :     OUString result( str );
     234           0 :     OUString sixteen = OUString::number( 16 );
     235           0 :     OUString expected = OUString::number( nReplacement );
     236             : 
     237           0 :     sal_Int32 len = sixteen.getLength();
     238           0 :     sal_Int32 index = result.indexOf( sixteen );
     239             : 
     240           0 :     while ( index != -1 )
     241             :     {
     242           0 :         result = result.replaceAt( index, len, expected );
     243           0 :         index = result.indexOf( sixteen, index );
     244             :     }
     245             : 
     246           0 :     return result;
     247             : }
     248             : 
     249             : OUString
     250           0 : generateCustomName(
     251             :     const OUString& prefix,
     252             :     SvxEntries* entries,
     253             :     sal_Int32 suffix = 1 )
     254             : {
     255             :     // find and replace the %n placeholder in the prefix string
     256           0 :     OUString name;
     257           0 :     OUString placeholder("%n" );
     258             : 
     259           0 :     sal_Int32 pos = prefix.indexOf( placeholder );
     260             : 
     261           0 :     if ( pos != -1 )
     262             :     {
     263           0 :         name = prefix.replaceAt(
     264           0 :             pos, placeholder.getLength(), OUString::number( suffix ) );
     265             :     }
     266             :     else
     267             :     {
     268             :         // no placeholder found so just append the suffix
     269           0 :         name = prefix + OUString::number( suffix );
     270             :     }
     271             : 
     272           0 :     if (!entries)
     273           0 :         return name;
     274             : 
     275             :     // now check is there is an already existing entry with this name
     276           0 :     SvxEntries::const_iterator iter = entries->begin();
     277             : 
     278           0 :     while ( iter != entries->end() )
     279             :     {
     280           0 :         SvxConfigEntry* pEntry = *iter;
     281             : 
     282           0 :         if ( name.equals( pEntry->GetName() ) )
     283             :         {
     284           0 :             break;
     285             :         }
     286           0 :         ++iter;
     287             :     }
     288             : 
     289           0 :     if ( iter != entries->end() )
     290             :     {
     291             :         // name already exists so try the next number up
     292           0 :         return generateCustomName( prefix, entries, ++suffix );
     293             :     }
     294             : 
     295           0 :     return name;
     296             : }
     297             : 
     298           0 : sal_uInt32 generateRandomValue()
     299             : {
     300           0 :     return comphelper::rng::uniform_uint_distribution(0, std::numeric_limits<unsigned int>::max());
     301             : }
     302             : 
     303             : OUString
     304           0 : generateCustomURL(
     305             :     SvxEntries* entries )
     306             : {
     307           0 :     OUString url = OUString(ITEM_TOOLBAR_URL );
     308           0 :     url += OUString(CUSTOM_TOOLBAR_STR );
     309             : 
     310             :     // use a random number to minimize possible clash with existing custom toolbars
     311           0 :     url += OUString::number( generateRandomValue(), 16 );
     312             : 
     313             :     // now check is there is an already existing entry with this url
     314           0 :     SvxEntries::const_iterator iter = entries->begin();
     315             : 
     316           0 :     while ( iter != entries->end() )
     317             :     {
     318           0 :         SvxConfigEntry* pEntry = *iter;
     319             : 
     320           0 :         if ( url.equals( pEntry->GetCommand() ) )
     321             :         {
     322           0 :             break;
     323             :         }
     324           0 :         ++iter;
     325             :     }
     326             : 
     327           0 :     if ( iter != entries->end() )
     328             :     {
     329             :         // url already exists so try the next number up
     330           0 :         return generateCustomURL( entries );
     331             :     }
     332             : 
     333           0 :     return url;
     334             : }
     335             : 
     336             : OUString
     337           0 : generateCustomMenuURL(
     338             :     SvxEntries* entries,
     339             :     sal_Int32 suffix = 1 )
     340             : {
     341           0 :     OUString url(CUSTOM_MENU_STR );
     342           0 :     url += OUString::number( suffix );
     343             : 
     344           0 :     if (!entries)
     345           0 :         return url;
     346             : 
     347             :     // now check is there is an already existing entry with this url
     348           0 :     SvxEntries::const_iterator iter = entries->begin();
     349             : 
     350           0 :     while ( iter != entries->end() )
     351             :     {
     352           0 :         SvxConfigEntry* pEntry = *iter;
     353             : 
     354           0 :         if ( url.equals( pEntry->GetCommand() ) )
     355             :         {
     356           0 :             break;
     357             :         }
     358           0 :         ++iter;
     359             :     }
     360             : 
     361           0 :     if ( iter != entries->end() )
     362             :     {
     363             :         // url already exists so try the next number up
     364           0 :         return generateCustomMenuURL( entries, ++suffix );
     365             :     }
     366             : 
     367           0 :     return url;
     368             : }
     369             : 
     370             : static sal_Int16 theImageType =
     371             :     css::ui::ImageType::COLOR_NORMAL |
     372             :     css::ui::ImageType::SIZE_DEFAULT;
     373             : 
     374           0 : void InitImageType()
     375             : {
     376             :     theImageType =
     377             :         css::ui::ImageType::COLOR_NORMAL |
     378           0 :         css::ui::ImageType::SIZE_DEFAULT;
     379             : 
     380           0 :     if ( SvtMiscOptions().AreCurrentSymbolsLarge() )
     381             :     {
     382           0 :         theImageType |= css::ui::ImageType::SIZE_LARGE;
     383             :     }
     384           0 : }
     385             : 
     386           0 : sal_Int16 GetImageType()
     387             : {
     388           0 :     return theImageType;
     389             : }
     390             : 
     391           0 : void RemoveEntry( SvxEntries* pEntries, SvxConfigEntry* pChildEntry )
     392             : {
     393           0 :     SvxEntries::iterator iter = pEntries->begin();
     394             : 
     395           0 :     while ( iter != pEntries->end() )
     396             :     {
     397           0 :         if ( pChildEntry == *iter )
     398             :         {
     399           0 :             pEntries->erase( iter );
     400           0 :             break;
     401             :         }
     402           0 :         ++iter;
     403             :     }
     404           0 : }
     405             : 
     406             : bool
     407           0 : SvxConfigPage::CanConfig( const OUString& aModuleId )
     408             : {
     409             :     OSL_TRACE("SupportsDocumentConfig: %s", PRTSTR(aModuleId));
     410             : 
     411           0 :     if  ( aModuleId == "com.sun.star.script.BasicIDE" || aModuleId == "com.sun.star.frame.Bibliography" )
     412             :     {
     413           0 :         return false;
     414             :     }
     415           0 :     return true;
     416             : }
     417             : 
     418           0 : OUString GetModuleName( const OUString& aModuleId )
     419             : {
     420           0 :     if ( aModuleId == "com.sun.star.text.TextDocument" ||
     421           0 :          aModuleId == "com.sun.star.text.GlobalDocument" )
     422           0 :         return OUString("Writer");
     423           0 :     else if ( aModuleId == "com.sun.star.text.WebDocument" )
     424           0 :         return OUString("Writer/Web");
     425           0 :     else if ( aModuleId == "com.sun.star.drawing.DrawingDocument" )
     426           0 :         return OUString("Draw");
     427           0 :     else if ( aModuleId == "com.sun.star.presentation.PresentationDocument" )
     428           0 :         return OUString("Impress");
     429           0 :     else if ( aModuleId == "com.sun.star.sheet.SpreadsheetDocument" )
     430           0 :         return OUString("Calc");
     431           0 :     else if ( aModuleId == "com.sun.star.script.BasicIDE" )
     432           0 :         return OUString("Basic");
     433           0 :     else if ( aModuleId == "com.sun.star.formula.FormulaProperties" )
     434           0 :         return OUString("Math");
     435           0 :     else if ( aModuleId == "com.sun.star.sdb.RelationDesign" )
     436           0 :         return OUString("Relation Design");
     437           0 :     else if ( aModuleId == "com.sun.star.sdb.QueryDesign" )
     438           0 :         return OUString("Query Design");
     439           0 :     else if ( aModuleId == "com.sun.star.sdb.TableDesign" )
     440           0 :         return OUString("Table Design");
     441           0 :     else if ( aModuleId == "com.sun.star.sdb.DataSourceBrowser" )
     442           0 :         return OUString("Data Source Browser" );
     443           0 :     else if ( aModuleId == "com.sun.star.sdb.DatabaseDocument" )
     444           0 :         return OUString("Database" );
     445             : 
     446           0 :     return OUString();
     447             : }
     448             : 
     449           0 : OUString GetUIModuleName( const OUString& aModuleId, const uno::Reference< css::frame::XModuleManager2 >& rModuleManager )
     450             : {
     451             :     assert(rModuleManager.is());
     452             : 
     453           0 :     OUString aModuleUIName;
     454             : 
     455             :     try
     456             :     {
     457           0 :         uno::Any a = rModuleManager->getByName( aModuleId );
     458           0 :         uno::Sequence< beans::PropertyValue > aSeq;
     459             : 
     460           0 :         if ( a >>= aSeq )
     461             :         {
     462           0 :             for ( sal_Int32 i = 0; i < aSeq.getLength(); ++i )
     463             :             {
     464           0 :                 if ( aSeq[i].Name == "ooSetupFactoryUIName" )
     465             :                 {
     466           0 :                     aSeq[i].Value >>= aModuleUIName;
     467           0 :                     break;
     468             :                 }
     469             :             }
     470           0 :         }
     471             :     }
     472           0 :     catch ( uno::RuntimeException& )
     473             :     {
     474           0 :         throw;
     475             :     }
     476           0 :     catch ( uno::Exception& )
     477             :     {
     478             :     }
     479             : 
     480           0 :     if ( aModuleUIName.isEmpty() )
     481           0 :         aModuleUIName = GetModuleName( aModuleId );
     482             : 
     483           0 :     return aModuleUIName;
     484             : }
     485             : 
     486           0 : bool GetMenuItemData(
     487             :     const uno::Reference< container::XIndexAccess >& rItemContainer,
     488             :     sal_Int32 nIndex,
     489             :     OUString& rCommandURL,
     490             :     OUString& rLabel,
     491             :     sal_uInt16& rType,
     492             :     uno::Reference< container::XIndexAccess >& rSubMenu )
     493             : {
     494             :     try
     495             :     {
     496           0 :         uno::Sequence< beans::PropertyValue > aProp;
     497           0 :         if ( rItemContainer->getByIndex( nIndex ) >>= aProp )
     498             :         {
     499           0 :             for ( sal_Int32 i = 0; i < aProp.getLength(); ++i )
     500             :             {
     501           0 :                 if ( aProp[i].Name == ITEM_DESCRIPTOR_COMMANDURL )
     502             :                 {
     503           0 :                     aProp[i].Value >>= rCommandURL;
     504             :                 }
     505           0 :                 else if ( aProp[i].Name == ITEM_DESCRIPTOR_CONTAINER )
     506             :                 {
     507           0 :                     aProp[i].Value >>= rSubMenu;
     508             :                 }
     509           0 :                 else if ( aProp[i].Name == ITEM_DESCRIPTOR_LABEL )
     510             :                 {
     511           0 :                     aProp[i].Value >>= rLabel;
     512             :                 }
     513           0 :                 else if ( aProp[i].Name == ITEM_DESCRIPTOR_TYPE )
     514             :                 {
     515           0 :                     aProp[i].Value >>= rType;
     516             :                 }
     517             :             }
     518             : 
     519           0 :             return true;
     520           0 :         }
     521             :     }
     522           0 :     catch ( ::com::sun::star::lang::IndexOutOfBoundsException& )
     523             :     {
     524             :     }
     525             : 
     526           0 :     return false;
     527             : }
     528             : 
     529           0 : bool GetToolbarItemData(
     530             :     const uno::Reference< container::XIndexAccess >& rItemContainer,
     531             :     sal_Int32 nIndex,
     532             :     OUString& rCommandURL,
     533             :     OUString& rLabel,
     534             :     sal_uInt16& rType,
     535             :     bool& rIsVisible,
     536             :     sal_Int32& rStyle,
     537             :     uno::Reference< container::XIndexAccess >& rSubMenu )
     538             : {
     539             :     try
     540             :     {
     541           0 :         uno::Sequence< beans::PropertyValue > aProp;
     542           0 :         if ( rItemContainer->getByIndex( nIndex ) >>= aProp )
     543             :         {
     544           0 :             for ( sal_Int32 i = 0; i < aProp.getLength(); ++i )
     545             :             {
     546           0 :                 if ( aProp[i].Name == ITEM_DESCRIPTOR_COMMANDURL )
     547             :                 {
     548           0 :                     aProp[i].Value >>= rCommandURL;
     549             :                 }
     550           0 :                 else if ( aProp[i].Name == ITEM_DESCRIPTOR_STYLE )
     551             :                 {
     552           0 :                     aProp[i].Value >>= rStyle;
     553             :                 }
     554           0 :                 else if ( aProp[i].Name == ITEM_DESCRIPTOR_CONTAINER )
     555             :                 {
     556           0 :                     aProp[i].Value >>= rSubMenu;
     557             :                 }
     558           0 :                 else if ( aProp[i].Name == ITEM_DESCRIPTOR_LABEL )
     559             :                 {
     560           0 :                     aProp[i].Value >>= rLabel;
     561             :                 }
     562           0 :                 else if ( aProp[i].Name == ITEM_DESCRIPTOR_TYPE )
     563             :                 {
     564           0 :                     aProp[i].Value >>= rType;
     565             :                 }
     566           0 :                 else if ( aProp[i].Name == ITEM_DESCRIPTOR_ISVISIBLE )
     567             :                 {
     568           0 :                     aProp[i].Value >>= rIsVisible;
     569             :                 }
     570             :             }
     571             : 
     572           0 :             return true;
     573           0 :         }
     574             :     }
     575           0 :     catch ( ::com::sun::star::lang::IndexOutOfBoundsException& )
     576             :     {
     577             :     }
     578             : 
     579           0 :     return false;
     580             : }
     581             : 
     582             : uno::Sequence< beans::PropertyValue >
     583           0 : ConvertSvxConfigEntry(
     584             :     const uno::Reference< container::XNameAccess >& xCommandToLabelMap,
     585             :     const SvxConfigEntry* pEntry )
     586             : {
     587             :     static const OUString aDescriptorCommandURL (
     588           0 :         ITEM_DESCRIPTOR_COMMANDURL  );
     589             : 
     590             :     static const OUString aDescriptorType(
     591           0 :             ITEM_DESCRIPTOR_TYPE  );
     592             : 
     593             :     static const OUString aDescriptorLabel(
     594           0 :             ITEM_DESCRIPTOR_LABEL  );
     595             : 
     596           0 :     uno::Sequence< beans::PropertyValue > aPropSeq( 3 );
     597             : 
     598           0 :     aPropSeq[0].Name = aDescriptorCommandURL;
     599           0 :     aPropSeq[0].Value <<= OUString( pEntry->GetCommand() );
     600             : 
     601           0 :     aPropSeq[1].Name = aDescriptorType;
     602           0 :     aPropSeq[1].Value <<= css::ui::ItemType::DEFAULT;
     603             : 
     604             :     // If the name has not been changed and the name is the same as
     605             :     // in the default command to label map then the label can be stored
     606             :     // as an empty string.
     607             :     // It will be initialised again later using the command to label map.
     608           0 :     aPropSeq[2].Name = aDescriptorLabel;
     609           0 :     if ( !pEntry->HasChangedName() && !pEntry->GetCommand().isEmpty() )
     610             :     {
     611           0 :         bool isDefaultName = false;
     612             :         try
     613             :         {
     614           0 :             uno::Any a( xCommandToLabelMap->getByName( pEntry->GetCommand() ) );
     615           0 :             uno::Sequence< beans::PropertyValue > tmpPropSeq;
     616           0 :             if ( a >>= tmpPropSeq )
     617             :             {
     618           0 :                 for ( sal_Int32 i = 0; i < tmpPropSeq.getLength(); ++i )
     619             :                 {
     620           0 :                     if ( tmpPropSeq[i].Name.equals( aDescriptorLabel ) )
     621             :                     {
     622           0 :                         OUString tmpLabel;
     623           0 :                         tmpPropSeq[i].Value >>= tmpLabel;
     624             : 
     625           0 :                         if ( tmpLabel.equals( pEntry->GetName() ) )
     626             :                         {
     627           0 :                             isDefaultName = true;
     628             :                         }
     629             : 
     630           0 :                         break;
     631             :                     }
     632             :                 }
     633           0 :             }
     634             :         }
     635           0 :         catch ( container::NoSuchElementException& )
     636             :         {
     637             :             // isDefaultName is left as FALSE
     638             :         }
     639             : 
     640           0 :         if ( isDefaultName )
     641             :         {
     642           0 :             aPropSeq[2].Value <<= OUString();
     643             :         }
     644             :         else
     645             :         {
     646           0 :             aPropSeq[2].Value <<= OUString( pEntry->GetName() );
     647             :         }
     648             :     }
     649             :     else
     650             :     {
     651           0 :         aPropSeq[2].Value <<= OUString( pEntry->GetName() );
     652             :     }
     653             : 
     654           0 :     return aPropSeq;
     655             : }
     656             : 
     657             : uno::Sequence< beans::PropertyValue >
     658           0 : ConvertToolbarEntry(
     659             :     const uno::Reference< container::XNameAccess >& xCommandToLabelMap,
     660             :     const SvxConfigEntry* pEntry )
     661             : {
     662             :     static const OUString aDescriptorCommandURL (
     663           0 :         ITEM_DESCRIPTOR_COMMANDURL  );
     664             : 
     665             :     static const OUString aDescriptorType(
     666           0 :             ITEM_DESCRIPTOR_TYPE  );
     667             : 
     668             :     static const OUString aDescriptorLabel(
     669           0 :             ITEM_DESCRIPTOR_LABEL  );
     670             : 
     671             :     static const OUString aIsVisible(
     672           0 :             ITEM_DESCRIPTOR_ISVISIBLE  );
     673             : 
     674           0 :     uno::Sequence< beans::PropertyValue > aPropSeq( 4 );
     675             : 
     676           0 :     aPropSeq[0].Name = aDescriptorCommandURL;
     677           0 :     aPropSeq[0].Value <<= OUString( pEntry->GetCommand() );
     678             : 
     679           0 :     aPropSeq[1].Name = aDescriptorType;
     680           0 :     aPropSeq[1].Value <<= css::ui::ItemType::DEFAULT;
     681             : 
     682             :     // If the name has not been changed and the name is the same as
     683             :     // in the default command to label map then the label can be stored
     684             :     // as an empty string.
     685             :     // It will be initialised again later using the command to label map.
     686           0 :     aPropSeq[2].Name = aDescriptorLabel;
     687           0 :     if ( !pEntry->HasChangedName() && !pEntry->GetCommand().isEmpty() )
     688             :     {
     689           0 :         bool isDefaultName = false;
     690             :         try
     691             :         {
     692           0 :             uno::Any a( xCommandToLabelMap->getByName( pEntry->GetCommand() ) );
     693           0 :             uno::Sequence< beans::PropertyValue > tmpPropSeq;
     694           0 :             if ( a >>= tmpPropSeq )
     695             :             {
     696           0 :                 for ( sal_Int32 i = 0; i < tmpPropSeq.getLength(); ++i )
     697             :                 {
     698           0 :                     if ( tmpPropSeq[i].Name.equals( aDescriptorLabel ) )
     699             :                     {
     700           0 :                         OUString tmpLabel;
     701           0 :                         tmpPropSeq[i].Value >>= tmpLabel;
     702             : 
     703           0 :                         if ( tmpLabel.equals( pEntry->GetName() ) )
     704             :                         {
     705           0 :                             isDefaultName = true;
     706             :                         }
     707             : 
     708           0 :                         break;
     709             :                     }
     710             :                 }
     711           0 :             }
     712             :         }
     713           0 :         catch ( container::NoSuchElementException& )
     714             :         {
     715             :             // isDefaultName is left as FALSE
     716             :         }
     717             : 
     718           0 :         if ( isDefaultName )
     719             :         {
     720           0 :             aPropSeq[2].Value <<= OUString();
     721             :         }
     722             :         else
     723             :         {
     724           0 :             aPropSeq[2].Value <<= OUString( pEntry->GetName() );
     725             :         }
     726             :     }
     727             :     else
     728             :     {
     729           0 :         aPropSeq[2].Value <<= OUString( pEntry->GetName() );
     730             :     }
     731             : 
     732           0 :     aPropSeq[3].Name = aIsVisible;
     733           0 :     aPropSeq[3].Value <<= pEntry->IsVisible();
     734             : 
     735           0 :     return aPropSeq;
     736             : }
     737             : 
     738           0 : VclPtr<SfxTabPage> CreateSvxMenuConfigPage( vcl::Window *pParent, const SfxItemSet* rSet )
     739             : {
     740           0 :     return VclPtr<SvxMenuConfigPage>::Create( pParent, *rSet );
     741             : }
     742             : 
     743           0 : VclPtr<SfxTabPage> CreateKeyboardConfigPage( vcl::Window *pParent, const SfxItemSet* rSet )
     744             : {
     745           0 :        return VclPtr<SfxAcceleratorConfigPage>::Create( pParent, *rSet );
     746             : }
     747             : 
     748           0 : VclPtr<SfxTabPage> CreateSvxToolbarConfigPage( vcl::Window *pParent, const SfxItemSet* rSet )
     749             : {
     750           0 :     return VclPtr<SvxToolbarConfigPage>::Create( pParent, *rSet );
     751             : }
     752             : 
     753           0 : VclPtr<SfxTabPage> CreateSvxEventConfigPage( vcl::Window *pParent, const SfxItemSet* rSet )
     754             : {
     755           0 :     return VclPtr<SvxEventConfigPage>::Create( pParent, *rSet, SvxEventConfigPage::EarlyInit() );
     756             : }
     757             : 
     758             : namespace {
     759             : 
     760           0 : bool showKeyConfigTabPage( const css::uno::Reference< css::frame::XFrame >& xFrame )
     761             : {
     762           0 :     if (!xFrame.is())
     763             :     {
     764           0 :         return false;
     765             :     }
     766             :     OUString sModuleId(
     767             :         css::frame::ModuleManager::create(
     768             :             comphelper::getProcessComponentContext())
     769           0 :         ->identify(xFrame));
     770           0 :     return !sModuleId.isEmpty()
     771           0 :         && sModuleId != "com.sun.star.frame.StartModule";
     772             : }
     773             : 
     774             : }
     775             : 
     776             : /******************************************************************************
     777             :  *
     778             :  * SvxConfigDialog is the configuration dialog which is brought up from the
     779             :  * Tools menu. It includes tabs for customizing menus, toolbars, events and
     780             :  * key bindings.
     781             :  *
     782             :  *****************************************************************************/
     783           0 : SvxConfigDialog::SvxConfigDialog(vcl::Window * pParent, const SfxItemSet* pInSet)
     784             :     : SfxTabDialog(pParent, "CustomizeDialog",
     785             :         "cui/ui/customizedialog.ui", pInSet)
     786             :     , m_nMenusPageId(0)
     787             :     , m_nKeyboardPageId(0)
     788             :     , m_nToolbarsPageId(0)
     789           0 :     , m_nEventsPageId(0)
     790             : {
     791           0 :     InitImageType();
     792             : 
     793           0 :     m_nMenusPageId = AddTabPage("menus", CreateSvxMenuConfigPage, NULL);
     794           0 :     m_nKeyboardPageId = AddTabPage("keyboard", CreateKeyboardConfigPage, NULL);
     795           0 :     m_nToolbarsPageId = AddTabPage("toolbars", CreateSvxToolbarConfigPage, NULL);
     796           0 :     m_nEventsPageId = AddTabPage("events", CreateSvxEventConfigPage, NULL);
     797             : 
     798             :     const SfxPoolItem* pItem =
     799           0 :         pInSet->GetItem( pInSet->GetPool()->GetWhich( SID_CONFIG ) );
     800             : 
     801           0 :     if ( pItem )
     802             :     {
     803           0 :         OUString text = static_cast<const SfxStringItem*>(pItem)->GetValue();
     804             : 
     805           0 :         if (text.startsWith( ITEM_TOOLBAR_URL ) )
     806             :         {
     807           0 :             SetCurPageId(m_nToolbarsPageId);
     808           0 :         }
     809             :     }
     810           0 : }
     811             : 
     812           0 : void SvxConfigDialog::SetFrame(const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& xFrame)
     813             : {
     814           0 :     m_xFrame = xFrame;
     815             : 
     816           0 :     if (!showKeyConfigTabPage( xFrame ))
     817           0 :         RemoveTabPage(m_nKeyboardPageId);
     818           0 : }
     819             : 
     820           0 : void SvxConfigDialog::PageCreated( sal_uInt16 nId, SfxTabPage& rPage )
     821             : {
     822           0 :     if (nId == m_nMenusPageId || nId == m_nKeyboardPageId ||
     823           0 :         nId == m_nToolbarsPageId)
     824             :     {
     825           0 :         rPage.SetFrame(m_xFrame);
     826             :     }
     827           0 :     else if (nId == m_nEventsPageId)
     828             :     {
     829           0 :         dynamic_cast< SvxEventConfigPage& >( rPage ).LateInit( m_xFrame );
     830             :     }
     831           0 : }
     832             : 
     833             : /******************************************************************************
     834             :  *
     835             :  * The SaveInData class is used to hold data for entries in the Save In
     836             :  * ListBox controls in the menu and toolbar tabs
     837             :  *
     838             :  ******************************************************************************/
     839             : 
     840             : // Initialize static variable which holds default XImageManager
     841             : uno::Reference< css::ui::XImageManager>* SaveInData::xDefaultImgMgr = NULL;
     842             : 
     843           0 : SaveInData::SaveInData(
     844             :     const uno::Reference< css::ui::XUIConfigurationManager >& xCfgMgr,
     845             :     const uno::Reference< css::ui::XUIConfigurationManager >& xParentCfgMgr,
     846             :     const OUString& aModuleId,
     847             :     bool isDocConfig )
     848             :         :
     849             :             bModified( false ),
     850             :             bDocConfig( isDocConfig ),
     851             :             bReadOnly( false ),
     852             :             m_xCfgMgr( xCfgMgr ),
     853           0 :             m_xParentCfgMgr( xParentCfgMgr )
     854             : {
     855           0 :     m_aSeparatorSeq.realloc( 1 );
     856           0 :     m_aSeparatorSeq[0].Name  = ITEM_DESCRIPTOR_TYPE;
     857           0 :     m_aSeparatorSeq[0].Value <<= css::ui::ItemType::SEPARATOR_LINE;
     858             : 
     859           0 :     if ( bDocConfig )
     860             :     {
     861             :         uno::Reference< css::ui::XUIConfigurationPersistence >
     862           0 :             xDocPersistence( GetConfigManager(), uno::UNO_QUERY );
     863             : 
     864           0 :         bReadOnly = xDocPersistence->isReadOnly();
     865             :     }
     866             : 
     867           0 :     uno::Reference<uno::XComponentContext> xContext = ::comphelper::getProcessComponentContext();
     868             : 
     869             :     uno::Reference< container::XNameAccess > xNameAccess(
     870           0 :         css::frame::theUICommandDescription::get(xContext) );
     871             : 
     872           0 :     xNameAccess->getByName( aModuleId ) >>= m_xCommandToLabelMap;
     873             : 
     874           0 :     if ( !m_xImgMgr.is() )
     875             :     {
     876           0 :         m_xImgMgr = uno::Reference< css::ui::XImageManager >(
     877           0 :             GetConfigManager()->getImageManager(), uno::UNO_QUERY );
     878             :     }
     879             : 
     880           0 :     if ( !IsDocConfig() )
     881             :     {
     882             :         // If this is not a document configuration then it is the settings
     883             :         // for the module (writer, calc, impress etc.) Use this as the default
     884             :         // XImageManager instance
     885           0 :         xDefaultImgMgr = &m_xImgMgr;
     886             :     }
     887             :     else
     888             :     {
     889             :         // If this is a document configuration then use the module image manager
     890             :         // as default.
     891           0 :         if ( m_xParentCfgMgr.is() )
     892             :         {
     893           0 :             m_xParentImgMgr = uno::Reference< css::ui::XImageManager >(
     894           0 :                 m_xParentCfgMgr->getImageManager(), uno::UNO_QUERY );
     895           0 :             xDefaultImgMgr = &m_xParentImgMgr;
     896             :         }
     897           0 :     }
     898           0 : }
     899             : 
     900           0 : uno::Reference< graphic::XGraphic > GetGraphic(
     901             :     const uno::Reference< css::ui::XImageManager >& xImageManager,
     902             :     const OUString& rCommandURL )
     903             : {
     904           0 :     uno::Reference< graphic::XGraphic > result;
     905             : 
     906           0 :     if ( xImageManager.is() )
     907             :     {
     908             :         // TODO handle large graphics
     909           0 :         uno::Sequence< uno::Reference< graphic::XGraphic > > aGraphicSeq;
     910             : 
     911           0 :         uno::Sequence< OUString > aImageCmdSeq( 1 );
     912           0 :         aImageCmdSeq[0] = rCommandURL;
     913             : 
     914             :         try
     915             :         {
     916           0 :             aGraphicSeq =
     917           0 :                 xImageManager->getImages( GetImageType(), aImageCmdSeq );
     918             : 
     919           0 :             if ( aGraphicSeq.getLength() > 0 )
     920             :             {
     921           0 :                 result =  aGraphicSeq[0];
     922             :             }
     923             :         }
     924           0 :         catch ( uno::Exception& )
     925             :         {
     926             :             // will return empty XGraphic
     927           0 :         }
     928             :     }
     929             : 
     930           0 :     return result;
     931             : }
     932             : 
     933           0 : Image SaveInData::GetImage( const OUString& rCommandURL )
     934             : {
     935           0 :     Image aImage;
     936             : 
     937             :     uno::Reference< graphic::XGraphic > xGraphic =
     938           0 :         GetGraphic( m_xImgMgr, rCommandURL );
     939             : 
     940           0 :     if ( xGraphic.is() )
     941             :     {
     942           0 :         aImage = Image( xGraphic );
     943             :     }
     944           0 :     else if ( xDefaultImgMgr != NULL && (*xDefaultImgMgr).is() )
     945             :     {
     946           0 :         xGraphic = GetGraphic( (*xDefaultImgMgr), rCommandURL );
     947             : 
     948           0 :         if ( xGraphic.is() )
     949             :         {
     950           0 :             aImage = Image( xGraphic );
     951             :         }
     952             :     }
     953             : 
     954           0 :     return aImage;
     955             : }
     956             : 
     957           0 : bool SaveInData::PersistChanges(
     958             :     const uno::Reference< uno::XInterface >& xManager )
     959             : {
     960           0 :     bool result = true;
     961             : 
     962             :     try
     963             :     {
     964           0 :         if ( xManager.is() && !IsReadOnly() )
     965             :         {
     966             :             uno::Reference< css::ui::XUIConfigurationPersistence >
     967           0 :                 xConfigPersistence( xManager, uno::UNO_QUERY );
     968             : 
     969           0 :             if ( xConfigPersistence->isModified() )
     970             :             {
     971           0 :                 xConfigPersistence->store();
     972           0 :             }
     973             :         }
     974             :     }
     975           0 :     catch ( com::sun::star::io::IOException& )
     976             :     {
     977           0 :         result = false;
     978             :     }
     979             : 
     980           0 :     return result;
     981             : }
     982             : 
     983             : /******************************************************************************
     984             :  *
     985             :  * The MenuSaveInData class extends SaveInData and provides menu specific
     986             :  * load and store functionality.
     987             :  *
     988             :  ******************************************************************************/
     989             : 
     990             : // Initialize static variable which holds default Menu data
     991             : MenuSaveInData* MenuSaveInData::pDefaultData = NULL;
     992             : 
     993           0 : MenuSaveInData::MenuSaveInData(
     994             :     const uno::Reference< css::ui::XUIConfigurationManager >& cfgmgr,
     995             :     const uno::Reference< css::ui::XUIConfigurationManager >& xParentCfgMgr,
     996             :     const OUString& aModuleId,
     997             :     bool isDocConfig )
     998             :     :
     999             :         SaveInData( cfgmgr, xParentCfgMgr, aModuleId, isDocConfig ),
    1000             :         m_aMenuResourceURL(
    1001             :             ITEM_MENUBAR_URL  ),
    1002             :         m_aDescriptorContainer(
    1003             :             ITEM_DESCRIPTOR_CONTAINER  ),
    1004           0 :         pRootEntry( 0 )
    1005             : {
    1006             :     try
    1007             :     {
    1008           0 :         OUString url( ITEM_MENUBAR_URL  );
    1009           0 :         m_xMenuSettings = GetConfigManager()->getSettings( url, sal_False );
    1010             :     }
    1011           0 :     catch ( container::NoSuchElementException& )
    1012             :     {
    1013             :         // will use menu settings for the module
    1014             :     }
    1015             : 
    1016             :     // If this is not a document configuration then it is the settings
    1017             :     // for the module (writer, calc, impress etc.). These settings should
    1018             :     // be set as the default to be used for SaveIn locations that do not
    1019             :     // have custom settings
    1020           0 :     if ( !IsDocConfig() )
    1021             :     {
    1022           0 :         SetDefaultData( this );
    1023             :     }
    1024           0 : }
    1025             : 
    1026           0 : MenuSaveInData::~MenuSaveInData()
    1027             : {
    1028           0 :     if ( pRootEntry != NULL )
    1029             :     {
    1030           0 :         delete pRootEntry;
    1031             :     }
    1032           0 : }
    1033             : 
    1034             : SvxEntries*
    1035           0 : MenuSaveInData::GetEntries()
    1036             : {
    1037           0 :     if ( pRootEntry == NULL )
    1038             :     {
    1039             :         pRootEntry = new SvxConfigEntry(
    1040             :             OUString("MainMenus"),
    1041           0 :             OUString(), true);
    1042             : 
    1043           0 :         if ( m_xMenuSettings.is() )
    1044             :         {
    1045           0 :             LoadSubMenus( m_xMenuSettings, OUString(), pRootEntry );
    1046             :         }
    1047           0 :         else if ( GetDefaultData() != NULL )
    1048             :         {
    1049             :             // If the doc has no config settings use module config settings
    1050           0 :             LoadSubMenus( GetDefaultData()->m_xMenuSettings, OUString(), pRootEntry );
    1051             :         }
    1052             :     }
    1053             : 
    1054           0 :     return pRootEntry->GetEntries();
    1055             : }
    1056             : 
    1057             : void
    1058           0 : MenuSaveInData::SetEntries( SvxEntries* pNewEntries )
    1059             : {
    1060             :     // delete old menu hierarchy first
    1061           0 :     delete pRootEntry->GetEntries();
    1062             : 
    1063             :     // now set new menu hierarchy
    1064           0 :     pRootEntry->SetEntries( pNewEntries );
    1065           0 : }
    1066             : 
    1067           0 : bool MenuSaveInData::LoadSubMenus(
    1068             :     const uno::Reference< container::XIndexAccess >& xMenuSettings,
    1069             :     const OUString& rBaseTitle,
    1070             :     SvxConfigEntry* pParentData )
    1071             : {
    1072           0 :     SvxEntries* pEntries = pParentData->GetEntries();
    1073             : 
    1074             :     // Don't access non existing menu configuration!
    1075           0 :     if ( !xMenuSettings.is() )
    1076           0 :         return true;
    1077             : 
    1078           0 :     for ( sal_Int32 nIndex = 0; nIndex < xMenuSettings->getCount(); ++nIndex )
    1079             :     {
    1080           0 :         uno::Reference< container::XIndexAccess >   xSubMenu;
    1081           0 :         OUString                aCommandURL;
    1082           0 :         OUString                aLabel;
    1083             : 
    1084           0 :         sal_uInt16 nType( css::ui::ItemType::DEFAULT );
    1085             : 
    1086             :         bool bItem = GetMenuItemData( xMenuSettings, nIndex,
    1087           0 :             aCommandURL, aLabel, nType, xSubMenu );
    1088             : 
    1089           0 :         if ( bItem )
    1090             :         {
    1091           0 :             bool bIsUserDefined = true;
    1092           0 :             if ( nType == css::ui::ItemType::DEFAULT )
    1093             :             {
    1094           0 :                 uno::Any a;
    1095             :                 try
    1096             :                 {
    1097           0 :                     a = m_xCommandToLabelMap->getByName( aCommandURL );
    1098           0 :                     bIsUserDefined = false;
    1099             :                 }
    1100           0 :                 catch ( container::NoSuchElementException& )
    1101             :                 {
    1102           0 :                     bIsUserDefined = true;
    1103             :                 }
    1104             : 
    1105             :                 // If custom label not set retrieve it from the command
    1106             :                 // to info service
    1107           0 :                 if ( aLabel.equals( OUString() ) )
    1108             :                 {
    1109           0 :                     uno::Sequence< beans::PropertyValue > aPropSeq;
    1110           0 :                     if ( a >>= aPropSeq )
    1111             :                     {
    1112           0 :                         for ( sal_Int32 i = 0; i < aPropSeq.getLength(); ++i )
    1113             :                         {
    1114           0 :                             if ( aPropSeq[i].Name == ITEM_DESCRIPTOR_LABEL )
    1115             :                             {
    1116           0 :                                 aPropSeq[i].Value >>= aLabel;
    1117           0 :                                 break;
    1118             :                             }
    1119             :                         }
    1120           0 :                     }
    1121             :                 }
    1122             : 
    1123           0 :                 if ( xSubMenu.is() )
    1124             :                 {
    1125             :                     // popup menu
    1126             :                     SvxConfigEntry* pEntry = new SvxConfigEntry(
    1127           0 :                         aLabel, aCommandURL, true );
    1128             : 
    1129           0 :                     pEntry->SetUserDefined( bIsUserDefined );
    1130             : 
    1131           0 :                     pEntries->push_back( pEntry );
    1132             : 
    1133           0 :                     OUString subMenuTitle( rBaseTitle );
    1134             : 
    1135           0 :                     if ( !subMenuTitle.isEmpty() )
    1136             :                     {
    1137           0 :                         subMenuTitle += OUString( aMenuSeparatorStr);
    1138             :                     }
    1139             :                     else
    1140             :                     {
    1141           0 :                         pEntry->SetMain( true );
    1142             :                     }
    1143             : 
    1144           0 :                     subMenuTitle += stripHotKey( aLabel );
    1145             : 
    1146           0 :                     LoadSubMenus( xSubMenu, subMenuTitle, pEntry );
    1147             :                 }
    1148             :                 else
    1149             :                 {
    1150             :                     SvxConfigEntry* pEntry = new SvxConfigEntry(
    1151           0 :                         aLabel, aCommandURL, false );
    1152           0 :                     pEntry->SetUserDefined( bIsUserDefined );
    1153           0 :                     pEntries->push_back( pEntry );
    1154           0 :                 }
    1155             :             }
    1156             :             else
    1157             :             {
    1158           0 :                 SvxConfigEntry* pEntry = new SvxConfigEntry;
    1159           0 :                 pEntry->SetUserDefined( bIsUserDefined );
    1160           0 :                 pEntries->push_back( pEntry );
    1161             :             }
    1162             :         }
    1163           0 :     }
    1164           0 :     return true;
    1165             : }
    1166             : 
    1167           0 : bool MenuSaveInData::Apply()
    1168             : {
    1169           0 :     bool result = false;
    1170             : 
    1171           0 :     if ( IsModified() )
    1172             :     {
    1173             :         // Apply new menu bar structure to our settings container
    1174           0 :         m_xMenuSettings = uno::Reference< container::XIndexAccess >(
    1175           0 :             GetConfigManager()->createSettings(), uno::UNO_QUERY );
    1176             : 
    1177             :         uno::Reference< container::XIndexContainer > xIndexContainer (
    1178           0 :             m_xMenuSettings, uno::UNO_QUERY );
    1179             : 
    1180             :         uno::Reference< lang::XSingleComponentFactory > xFactory (
    1181           0 :             m_xMenuSettings, uno::UNO_QUERY );
    1182             : 
    1183           0 :         Apply( pRootEntry, xIndexContainer, xFactory, NULL );
    1184             : 
    1185             :         try
    1186             :         {
    1187           0 :             if ( GetConfigManager()->hasSettings( m_aMenuResourceURL ) )
    1188             :             {
    1189           0 :                 GetConfigManager()->replaceSettings(
    1190           0 :                     m_aMenuResourceURL, m_xMenuSettings );
    1191             :             }
    1192             :             else
    1193             :             {
    1194           0 :                 GetConfigManager()->insertSettings(
    1195           0 :                     m_aMenuResourceURL, m_xMenuSettings );
    1196             :             }
    1197             :         }
    1198           0 :         catch ( container::NoSuchElementException& )
    1199             :         {
    1200             :             OSL_TRACE("caught container::NoSuchElementException saving settings");
    1201             :         }
    1202           0 :         catch ( com::sun::star::io::IOException& )
    1203             :         {
    1204             :             OSL_TRACE("caught IOException saving settings");
    1205             :         }
    1206           0 :         catch ( com::sun::star::uno::Exception& )
    1207             :         {
    1208             :             OSL_TRACE("caught some other exception saving settings");
    1209             :         }
    1210             : 
    1211           0 :         SetModified( false );
    1212             : 
    1213           0 :         result = PersistChanges( GetConfigManager() );
    1214             :     }
    1215             : 
    1216           0 :     return result;
    1217             : }
    1218             : 
    1219           0 : void MenuSaveInData::Apply(
    1220             :     SvxConfigEntry* pRootEntry_,
    1221             :     uno::Reference< container::XIndexContainer >& rMenuBar,
    1222             :     uno::Reference< lang::XSingleComponentFactory >& rFactory,
    1223             :     SvTreeListEntry *pParentEntry )
    1224             : {
    1225             :     (void)pRootEntry_;
    1226             :     (void)pParentEntry;
    1227             : 
    1228           0 :     SvxEntries::const_iterator iter = GetEntries()->begin();
    1229           0 :     SvxEntries::const_iterator end = GetEntries()->end();
    1230             : 
    1231           0 :     uno::Reference<uno::XComponentContext> xContext = ::comphelper::getProcessComponentContext();
    1232             : 
    1233           0 :     for ( ; iter != end; ++iter )
    1234             :     {
    1235           0 :         SvxConfigEntry* pEntryData = *iter;
    1236             : 
    1237             :         uno::Sequence< beans::PropertyValue > aPropValueSeq =
    1238           0 :             ConvertSvxConfigEntry( m_xCommandToLabelMap, pEntryData );
    1239             : 
    1240             :         uno::Reference< container::XIndexContainer > xSubMenuBar(
    1241           0 :             rFactory->createInstanceWithContext( xContext ),
    1242           0 :             uno::UNO_QUERY );
    1243             : 
    1244           0 :         sal_Int32 nIndex = aPropValueSeq.getLength();
    1245           0 :         aPropValueSeq.realloc( nIndex + 1 );
    1246           0 :         aPropValueSeq[nIndex].Name = m_aDescriptorContainer;
    1247           0 :         aPropValueSeq[nIndex].Value <<= xSubMenuBar;
    1248           0 :         rMenuBar->insertByIndex(
    1249           0 :             rMenuBar->getCount(), uno::makeAny( aPropValueSeq ));
    1250           0 :         ApplyMenu( xSubMenuBar, rFactory, pEntryData );
    1251           0 :     }
    1252           0 : }
    1253             : 
    1254           0 : void MenuSaveInData::ApplyMenu(
    1255             :     uno::Reference< container::XIndexContainer >& rMenuBar,
    1256             :     uno::Reference< lang::XSingleComponentFactory >& rFactory,
    1257             :     SvxConfigEntry* pMenuData )
    1258             : {
    1259           0 :     uno::Reference<uno::XComponentContext> xContext = ::comphelper::getProcessComponentContext();
    1260             : 
    1261           0 :     SvxEntries::const_iterator iter = pMenuData->GetEntries()->begin();
    1262           0 :     SvxEntries::const_iterator end = pMenuData->GetEntries()->end();
    1263             : 
    1264           0 :     for ( ; iter != end; ++iter )
    1265             :     {
    1266           0 :         SvxConfigEntry* pEntry = *iter;
    1267             : 
    1268           0 :         if ( pEntry->IsPopup() )
    1269             :         {
    1270             :             uno::Sequence< beans::PropertyValue > aPropValueSeq =
    1271           0 :                 ConvertSvxConfigEntry( m_xCommandToLabelMap, pEntry );
    1272             : 
    1273             :             uno::Reference< container::XIndexContainer > xSubMenuBar(
    1274           0 :                 rFactory->createInstanceWithContext( xContext ),
    1275           0 :                     uno::UNO_QUERY );
    1276             : 
    1277           0 :             sal_Int32 nIndex = aPropValueSeq.getLength();
    1278           0 :             aPropValueSeq.realloc( nIndex + 1 );
    1279           0 :             aPropValueSeq[nIndex].Name = m_aDescriptorContainer;
    1280           0 :             aPropValueSeq[nIndex].Value <<= xSubMenuBar;
    1281             : 
    1282           0 :             rMenuBar->insertByIndex(
    1283           0 :                 rMenuBar->getCount(), uno::makeAny( aPropValueSeq ));
    1284             : 
    1285           0 :             ApplyMenu( xSubMenuBar, rFactory, pEntry );
    1286             :         }
    1287           0 :         else if ( pEntry->IsSeparator() )
    1288             :         {
    1289           0 :             rMenuBar->insertByIndex(
    1290           0 :                 rMenuBar->getCount(), uno::makeAny( m_aSeparatorSeq ));
    1291             :         }
    1292             :         else
    1293             :         {
    1294             :             uno::Sequence< beans::PropertyValue > aPropValueSeq =
    1295           0 :                 ConvertSvxConfigEntry( m_xCommandToLabelMap, pEntry );
    1296           0 :             rMenuBar->insertByIndex(
    1297           0 :                 rMenuBar->getCount(), uno::makeAny( aPropValueSeq ));
    1298             :         }
    1299           0 :     }
    1300           0 : }
    1301             : 
    1302             : void
    1303           0 : MenuSaveInData::Reset()
    1304             : {
    1305           0 :     GetConfigManager()->reset();
    1306             : 
    1307           0 :     delete pRootEntry;
    1308           0 :     pRootEntry = NULL;
    1309             : 
    1310             :     try
    1311             :     {
    1312           0 :         m_xMenuSettings = GetConfigManager()->getSettings(
    1313           0 :             m_aMenuResourceURL, sal_False );
    1314             :     }
    1315           0 :     catch ( container::NoSuchElementException& )
    1316             :     {
    1317             :         // will use default settings
    1318             :     }
    1319           0 : }
    1320             : 
    1321             : class PopupPainter : public SvLBoxString
    1322             : {
    1323             : public:
    1324           0 :     PopupPainter( SvTreeListEntry* pEntry, const OUString& rStr )
    1325           0 :         : SvLBoxString( pEntry, 0, rStr )
    1326           0 :     { }
    1327             : 
    1328           0 :     virtual ~PopupPainter() { }
    1329             : 
    1330           0 :     virtual void Paint(const Point& rPos, SvTreeListBox& rOutDev, vcl::RenderContext& rRenderContext,
    1331             :                        const SvViewDataEntry* pView, const SvTreeListEntry& rEntry) SAL_OVERRIDE
    1332             :     {
    1333           0 :         SvLBoxString::Paint(rPos, rOutDev, rRenderContext, pView, rEntry);
    1334             : 
    1335           0 :         rRenderContext.Push(PushFlags::FILLCOLOR);
    1336             : 
    1337           0 :         SvTreeListBox* pTreeBox = static_cast< SvTreeListBox* >(&rOutDev);
    1338           0 :         long nX = pTreeBox->GetSizePixel().Width();
    1339             : 
    1340           0 :         ScrollBar* pVScroll = pTreeBox->GetVScroll();
    1341           0 :         if (pVScroll->IsVisible())
    1342             :         {
    1343           0 :             nX -= pVScroll->GetSizePixel().Width();
    1344             :         }
    1345             : 
    1346           0 :         const SvViewDataItem* pItem = rOutDev.GetViewDataItem( &rEntry, this );
    1347           0 :         nX -= pItem->maSize.Height();
    1348             : 
    1349           0 :         long nSize = pItem->maSize.Height() / 2;
    1350           0 :         long nHalfSize = nSize / 2;
    1351           0 :         long nY = rPos.Y() + nHalfSize;
    1352             : 
    1353           0 :         if (rRenderContext.GetFillColor() == COL_WHITE)
    1354             :         {
    1355           0 :             rRenderContext.SetFillColor(Color(COL_BLACK));
    1356             :         }
    1357             :         else
    1358             :         {
    1359           0 :             rRenderContext.SetFillColor(Color(COL_WHITE));
    1360             :         }
    1361             : 
    1362           0 :         long n = 0;
    1363           0 :         while (n <= nHalfSize)
    1364             :         {
    1365           0 :             rRenderContext.DrawRect(Rectangle(nX + n, nY + n, nX + n, nY + nSize - n));
    1366           0 :             ++n;
    1367             :         }
    1368             : 
    1369           0 :         rRenderContext.Pop();
    1370           0 :     }
    1371             : };
    1372             : 
    1373             : /******************************************************************************
    1374             :  *
    1375             :  * SvxMenuEntriesListBox is the listbox in which the menu items for a
    1376             :  * particular menu are shown. We have a custom listbox because we need
    1377             :  * to add drag'n'drop support from the Macro Selector and within the
    1378             :  * listbox
    1379             :  *
    1380             :  *****************************************************************************/
    1381           0 : SvxMenuEntriesListBox::SvxMenuEntriesListBox(vcl::Window* pParent, SvxConfigPage* pPg)
    1382             :     : SvTreeListBox(pParent, WB_TABSTOP|WB_CLIPCHILDREN|WB_HIDESELECTION|WB_BORDER)
    1383             :     , pPage(pPg)
    1384           0 :     , m_bIsInternalDrag( false )
    1385             : {
    1386           0 :     SetSpaceBetweenEntries( 3 );
    1387           0 :     SetEntryHeight( ENTRY_HEIGHT );
    1388             : 
    1389           0 :     SetHighlightRange();
    1390           0 :     SetSelectionMode(SINGLE_SELECTION);
    1391             : 
    1392             :     SetDragDropMode( DragDropMode::CTRL_MOVE  |
    1393             :                      DragDropMode::APP_COPY   |
    1394           0 :                      DragDropMode::ENABLE_TOP |
    1395           0 :                      DragDropMode::APP_DROP);
    1396           0 : }
    1397             : 
    1398           0 : SvxMenuEntriesListBox::~SvxMenuEntriesListBox()
    1399             : {
    1400           0 :     disposeOnce();
    1401           0 : }
    1402             : 
    1403           0 : void SvxMenuEntriesListBox::dispose()
    1404             : {
    1405           0 :     pPage.clear();
    1406           0 :     SvTreeListBox::dispose();
    1407           0 : }
    1408             : 
    1409             : // drag and drop support
    1410           0 : DragDropMode SvxMenuEntriesListBox::NotifyStartDrag(
    1411             :     TransferDataContainer& aTransferDataContainer, SvTreeListEntry* pEntry )
    1412             : {
    1413             :     (void)aTransferDataContainer;
    1414             :     (void)pEntry;
    1415             : 
    1416           0 :     m_bIsInternalDrag = true;
    1417           0 :     return GetDragDropMode();
    1418             : }
    1419             : 
    1420           0 : void SvxMenuEntriesListBox::DragFinished( sal_Int8 nDropAction )
    1421             : {
    1422             :     (void)nDropAction;
    1423           0 :     m_bIsInternalDrag = false;
    1424           0 : }
    1425             : 
    1426           0 : sal_Int8 SvxMenuEntriesListBox::AcceptDrop( const AcceptDropEvent& rEvt )
    1427             : {
    1428           0 :     if ( m_bIsInternalDrag )
    1429             :     {
    1430             :         // internal copy isn't allowed!
    1431           0 :         if ( rEvt.mnAction == DND_ACTION_COPY )
    1432           0 :             return DND_ACTION_NONE;
    1433             :         else
    1434           0 :             return SvTreeListBox::AcceptDrop( rEvt );
    1435             :     }
    1436             : 
    1437             :     // Always do COPY instead of MOVE if D&D comes from outside!
    1438           0 :     AcceptDropEvent aNewAcceptDropEvent( rEvt );
    1439           0 :     aNewAcceptDropEvent.mnAction = DND_ACTION_COPY;
    1440           0 :     return SvTreeListBox::AcceptDrop( aNewAcceptDropEvent );
    1441             : }
    1442             : 
    1443           0 : bool SvxMenuEntriesListBox::NotifyAcceptDrop( SvTreeListEntry* )
    1444             : {
    1445           0 :     return true;
    1446             : }
    1447             : 
    1448           0 : TriState SvxMenuEntriesListBox::NotifyMoving(
    1449             :     SvTreeListEntry* pTarget, SvTreeListEntry* pSource,
    1450             :     SvTreeListEntry*& rpNewParent, sal_uLong& rNewChildPos)
    1451             : {
    1452             :     // only try to do a move if we are dragging within the list box
    1453           0 :     if ( m_bIsInternalDrag )
    1454             :     {
    1455           0 :         if ( pPage->MoveEntryData( pSource, pTarget ) )
    1456             :         {
    1457             :             SvTreeListBox::NotifyMoving(
    1458           0 :                 pTarget, pSource, rpNewParent, rNewChildPos );
    1459           0 :             return TRISTATE_TRUE;
    1460             :         }
    1461             :         else
    1462             :         {
    1463           0 :             return TRISTATE_FALSE;
    1464             :         }
    1465             :     }
    1466             :     else
    1467             :     {
    1468           0 :         return NotifyCopying( pTarget, pSource, rpNewParent, rNewChildPos );
    1469             :     }
    1470             : }
    1471             : 
    1472           0 : TriState SvxMenuEntriesListBox::NotifyCopying(
    1473             :     SvTreeListEntry* pTarget, SvTreeListEntry* pSource,
    1474             :     SvTreeListEntry*& rpNewParent, sal_uLong& rNewChildPos)
    1475             : {
    1476             :     (void)pSource;
    1477             :     (void)rpNewParent;
    1478             :     (void)rNewChildPos;
    1479             : 
    1480           0 :     if ( !m_bIsInternalDrag )
    1481             :     {
    1482             :         // if the target is NULL then add function to the start of the list
    1483           0 :         pPage->AddFunction( pTarget, pTarget == NULL );
    1484             : 
    1485             :         // AddFunction already adds the listbox entry so return TRISTATE_FALSE
    1486             :         // to stop another listbox entry being added
    1487           0 :         return TRISTATE_FALSE;
    1488             :     }
    1489             : 
    1490             :     // Copying is only allowed from external controls, not within the listbox
    1491           0 :     return TRISTATE_FALSE;
    1492             : }
    1493             : 
    1494           0 : void SvxMenuEntriesListBox::KeyInput( const KeyEvent& rKeyEvent )
    1495             : {
    1496           0 :     vcl::KeyCode keycode = rKeyEvent.GetKeyCode();
    1497             : 
    1498             :     // support DELETE for removing the current entry
    1499           0 :     if ( keycode == KEY_DELETE )
    1500             :     {
    1501           0 :         pPage->DeleteSelectedContent();
    1502             :     }
    1503             :     // support CTRL+UP and CTRL+DOWN for moving selected entries
    1504           0 :     else if ( keycode.GetCode() == KEY_UP && keycode.IsMod1() )
    1505             :     {
    1506           0 :         pPage->MoveEntry( true );
    1507             :     }
    1508           0 :     else if ( keycode.GetCode() == KEY_DOWN && keycode.IsMod1() )
    1509             :     {
    1510           0 :         pPage->MoveEntry( false );
    1511             :     }
    1512             :     else
    1513             :     {
    1514             :         // pass on to superclass
    1515           0 :         SvTreeListBox::KeyInput( rKeyEvent );
    1516             :     }
    1517           0 : }
    1518             : 
    1519             : /******************************************************************************
    1520             :  *
    1521             :  * SvxConfigPage is the abstract base class on which the Menu and Toolbar
    1522             :  * configuration tabpages are based. It includes methods which are common to
    1523             :  * both tabpages to add, delete, move and rename items etc.
    1524             :  *
    1525             :  *****************************************************************************/
    1526           0 : SvxConfigPage::SvxConfigPage(vcl::Window *pParent, const SfxItemSet& rSet)
    1527             :     : SfxTabPage(pParent, "MenuAssignPage", "cui/ui/menuassignpage.ui", &rSet)
    1528             :     , bInitialised(false)
    1529             :     , pCurrentSaveInData(0)
    1530             :     , m_pContentsListBox(0)
    1531           0 :     , m_pSelectorDlg(0)
    1532             : {
    1533           0 :     get(m_pTopLevel, "toplevel");
    1534           0 :     get(m_pTopLevelLabel, "toplevelft");
    1535           0 :     get(m_pTopLevelListBox, "toplevellist");
    1536           0 :     get(m_pNewTopLevelButton, "toplevelbutton");
    1537           0 :     get(m_pModifyTopLevelButton, "menuedit");
    1538           0 :     get(m_pContents, "contents");
    1539           0 :     get(m_pContentsLabel, "contentslabel");
    1540           0 :     get(m_pAddCommandsButton, "add");
    1541           0 :     get(m_pModifyCommandButton, "modify");
    1542           0 :     get(m_pMoveUpButton, "up");
    1543           0 :     get(m_pMoveDownButton, "down");
    1544           0 :     get(m_pSaveInListBox, "savein");
    1545           0 :     get(m_pDescriptionField, "desc");
    1546           0 :     m_pDescriptionField->set_height_request(m_pDescriptionField->GetTextHeight()*4);
    1547           0 :     get(m_pEntries, "entries");
    1548           0 :     Size aSize(LogicToPixel(Size(108, 115), MAP_APPFONT));
    1549           0 :     m_pEntries->set_height_request(aSize.Height());
    1550           0 :     m_pEntries->set_width_request(aSize.Width());
    1551             : 
    1552           0 :     m_pDescriptionField->SetControlBackground( GetSettings().GetStyleSettings().GetDialogColor() );
    1553           0 :     m_pDescriptionField->EnableCursor( false );
    1554           0 : }
    1555             : 
    1556           0 : SvxConfigPage::~SvxConfigPage()
    1557             : {
    1558           0 :     disposeOnce();
    1559           0 : }
    1560             : 
    1561           0 : void SvxConfigPage::dispose()
    1562             : {
    1563           0 :     m_pTopLevel.clear();
    1564           0 :     m_pTopLevelLabel.clear();
    1565           0 :     m_pTopLevelListBox.clear();
    1566           0 :     m_pNewTopLevelButton.clear();
    1567           0 :     m_pModifyTopLevelButton.clear();
    1568           0 :     m_pContents.clear();
    1569           0 :     m_pContentsLabel.clear();
    1570           0 :     m_pEntries.clear();
    1571           0 :     m_pAddCommandsButton.clear();
    1572           0 :     m_pModifyCommandButton.clear();
    1573           0 :     m_pMoveUpButton.clear();
    1574           0 :     m_pMoveDownButton.clear();
    1575           0 :     m_pSaveInListBox.clear();
    1576           0 :     m_pDescriptionField.clear();
    1577             : 
    1578           0 :     m_pSelectorDlg.disposeAndClear();
    1579           0 :     m_pContentsListBox.disposeAndClear();
    1580           0 :     SfxTabPage::dispose();
    1581           0 : }
    1582             : 
    1583           0 : void SvxConfigPage::Reset( const SfxItemSet* )
    1584             : {
    1585             :     // If we haven't initialised our XMultiServiceFactory reference
    1586             :     // then Reset is being called at the opening of the dialog.
    1587             : 
    1588             :     // Load menu configuration data for the module of the currently
    1589             :     // selected document, for the currently selected document, and for
    1590             :     // all other open documents of the same module type
    1591           0 :     if ( !bInitialised )
    1592             :     {
    1593           0 :         sal_uInt16 nPos = 0;
    1594           0 :         uno::Reference < css::ui::XUIConfigurationManager > xCfgMgr;
    1595           0 :         uno::Reference < css::ui::XUIConfigurationManager > xDocCfgMgr;
    1596             : 
    1597             :         uno::Reference< uno::XComponentContext > xContext(
    1598           0 :             ::comphelper::getProcessComponentContext(), uno::UNO_QUERY_THROW );
    1599             : 
    1600           0 :         m_xFrame = GetFrame();
    1601           0 :         OUString aModuleId = GetFrameWithDefaultAndIdentify( m_xFrame );
    1602             : 
    1603             :         // replace %MODULENAME in the label with the correct module name
    1604             :         uno::Reference< css::frame::XModuleManager2 > xModuleManager(
    1605           0 :             css::frame::ModuleManager::create( xContext ));
    1606           0 :         OUString aModuleName = GetUIModuleName( aModuleId, xModuleManager );
    1607             : 
    1608           0 :         OUString title = m_pTopLevel->get_label();
    1609           0 :         OUString aSearchString("%MODULENAME" );
    1610           0 :         sal_Int32 index = title.indexOf( aSearchString );
    1611             : 
    1612           0 :         if ( index != -1 )
    1613             :         {
    1614           0 :             title = title.replaceAt(
    1615           0 :                 index, aSearchString.getLength(), aModuleName );
    1616           0 :             m_pTopLevel->set_label(title);
    1617             :         }
    1618             : 
    1619             :         uno::Reference< css::ui::XModuleUIConfigurationManagerSupplier >
    1620           0 :             xModuleCfgSupplier( css::ui::theModuleUIConfigurationManagerSupplier::get(xContext) );
    1621             : 
    1622             :         // Set up data for module specific menus
    1623           0 :         SaveInData* pModuleData = NULL;
    1624             : 
    1625             :         try
    1626             :         {
    1627           0 :             xCfgMgr =
    1628           0 :                 xModuleCfgSupplier->getUIConfigurationManager( aModuleId );
    1629             : 
    1630             :             pModuleData = CreateSaveInData( xCfgMgr,
    1631             :                                             uno::Reference< css::ui::XUIConfigurationManager >(),
    1632             :                                             aModuleId,
    1633           0 :                                             false );
    1634             :         }
    1635           0 :         catch ( container::NoSuchElementException& )
    1636             :         {
    1637             :         }
    1638             : 
    1639           0 :         if ( pModuleData != NULL )
    1640             :         {
    1641             :             nPos = m_pSaveInListBox->InsertEntry(
    1642           0 :                 utl::ConfigManager::getProductName() + " " + aModuleName );
    1643           0 :             m_pSaveInListBox->SetEntryData( nPos, pModuleData );
    1644             :         }
    1645             : 
    1646             :         // try to retrieve the document based ui configuration manager
    1647           0 :         OUString aTitle;
    1648             :         uno::Reference< frame::XController > xController =
    1649           0 :             m_xFrame->getController();
    1650           0 :         if ( CanConfig( aModuleId ) && xController.is() )
    1651             :         {
    1652           0 :             uno::Reference< frame::XModel > xModel( xController->getModel() );
    1653           0 :             if ( xModel.is() )
    1654             :             {
    1655             :                 uno::Reference< css::ui::XUIConfigurationManagerSupplier >
    1656           0 :                     xCfgSupplier( xModel, uno::UNO_QUERY );
    1657             : 
    1658           0 :                 if ( xCfgSupplier.is() )
    1659             :                 {
    1660           0 :                     xDocCfgMgr = xCfgSupplier->getUIConfigurationManager();
    1661             :                 }
    1662           0 :                 aTitle = ::comphelper::DocumentInfo::getDocumentTitle( xModel );
    1663           0 :             }
    1664             :         }
    1665             : 
    1666           0 :         SaveInData* pDocData = NULL;
    1667           0 :         if ( xDocCfgMgr.is() )
    1668             :         {
    1669           0 :             pDocData = CreateSaveInData( xDocCfgMgr, xCfgMgr, aModuleId, true );
    1670             : 
    1671           0 :             if ( !pDocData->IsReadOnly() )
    1672             :             {
    1673           0 :                 nPos = m_pSaveInListBox->InsertEntry( aTitle );
    1674           0 :                 m_pSaveInListBox->SetEntryData( nPos, pDocData );
    1675             :             }
    1676             :         }
    1677             : 
    1678             :         // if an item to select has been passed in (eg. the ResourceURL for a
    1679             :         // toolbar) then try to select the SaveInData entry that has that item
    1680           0 :         bool bURLToSelectFound = false;
    1681           0 :         if ( !m_aURLToSelect.isEmpty() )
    1682             :         {
    1683           0 :             if ( pDocData && pDocData->HasURL( m_aURLToSelect ) )
    1684             :             {
    1685           0 :                 m_pSaveInListBox->SelectEntryPos( nPos, true );
    1686           0 :                 pCurrentSaveInData = pDocData;
    1687           0 :                 bURLToSelectFound = true;
    1688             :             }
    1689           0 :             else if ( pModuleData && pModuleData->HasURL( m_aURLToSelect ) )
    1690             :             {
    1691           0 :                 m_pSaveInListBox->SelectEntryPos( 0, true );
    1692           0 :                 pCurrentSaveInData = pModuleData;
    1693           0 :                 bURLToSelectFound = true;
    1694             :             }
    1695             :         }
    1696             : 
    1697           0 :         if ( !bURLToSelectFound )
    1698             :         {
    1699             :             // if the document has menu configuration settings select it
    1700             :             // it the SaveIn listbox, otherwise select the module data
    1701           0 :             if ( pDocData != NULL && pDocData->HasSettings() )
    1702             :             {
    1703           0 :                 m_pSaveInListBox->SelectEntryPos( nPos, true );
    1704           0 :                 pCurrentSaveInData = pDocData;
    1705             :             }
    1706             :             else
    1707             :             {
    1708           0 :                 m_pSaveInListBox->SelectEntryPos( 0, true );
    1709           0 :                 pCurrentSaveInData = pModuleData;
    1710             :             }
    1711             :         }
    1712             : 
    1713             : #ifdef DBG_UTIL
    1714             :         DBG_ASSERT( pCurrentSaveInData, "SvxConfigPage::Reset(): no SaveInData" );
    1715             : #endif
    1716             : 
    1717           0 :         if ( CanConfig( aModuleId ) )
    1718             :         {
    1719             :             // Load configuration for other open documents which have
    1720             :             // same module type
    1721           0 :             uno::Sequence< uno::Reference< frame::XFrame > > aFrameList;
    1722             :             try
    1723             :             {
    1724             :                 uno::Reference< frame::XDesktop2 > xFramesSupplier = frame::Desktop::create(
    1725           0 :                     xContext );
    1726             : 
    1727             :                 uno::Reference< frame::XFrames > xFrames =
    1728           0 :                     xFramesSupplier->getFrames();
    1729             : 
    1730           0 :                 aFrameList = xFrames->queryFrames(
    1731           0 :                     frame::FrameSearchFlag::ALL & ~frame::FrameSearchFlag::SELF );
    1732             : 
    1733             :             }
    1734           0 :             catch( const uno::Exception& )
    1735             :             {
    1736             :                 DBG_UNHANDLED_EXCEPTION();
    1737             :             }
    1738             : 
    1739           0 :             for ( sal_Int32 i = 0; i < aFrameList.getLength(); ++i )
    1740             :             {
    1741           0 :                 uno::Reference < frame::XFrame > xf = aFrameList[i];
    1742             : 
    1743           0 :                 if ( xf.is() && xf != m_xFrame )
    1744             :                 {
    1745           0 :                     OUString aCheckId;
    1746             :                     try{
    1747           0 :                         aCheckId = xModuleManager->identify( xf );
    1748           0 :                     } catch(const uno::Exception&)
    1749           0 :                         { aCheckId.clear(); }
    1750             : 
    1751           0 :                     if ( aModuleId.equals( aCheckId ) )
    1752             :                     {
    1753             :                         // try to get the document based ui configuration manager
    1754           0 :                         OUString aTitle2;
    1755             :                         uno::Reference< frame::XController > xController_ =
    1756           0 :                             xf->getController();
    1757             : 
    1758           0 :                         if ( xController_.is() )
    1759             :                         {
    1760             :                             uno::Reference< frame::XModel > xModel(
    1761           0 :                                 xController_->getModel() );
    1762             : 
    1763           0 :                             if ( xModel.is() )
    1764             :                             {
    1765             :                                 uno::Reference<
    1766             :                                     css::ui::XUIConfigurationManagerSupplier >
    1767           0 :                                         xCfgSupplier( xModel, uno::UNO_QUERY );
    1768             : 
    1769           0 :                                 if ( xCfgSupplier.is() )
    1770             :                                 {
    1771           0 :                                     xDocCfgMgr =
    1772           0 :                                         xCfgSupplier->getUIConfigurationManager();
    1773             :                                 }
    1774           0 :                                 aTitle2 = ::comphelper::DocumentInfo::getDocumentTitle( xModel );
    1775           0 :                             }
    1776             :                         }
    1777             : 
    1778           0 :                         if ( xDocCfgMgr.is() )
    1779             :                         {
    1780           0 :                             SaveInData* pData = CreateSaveInData( xDocCfgMgr, xCfgMgr, aModuleId, true );
    1781             : 
    1782           0 :                             if ( pData && !pData->IsReadOnly() )
    1783             :                             {
    1784           0 :                                 nPos = m_pSaveInListBox->InsertEntry( aTitle2 );
    1785           0 :                                 m_pSaveInListBox->SetEntryData( nPos, pData );
    1786             :                             }
    1787           0 :                         }
    1788           0 :                     }
    1789             :                 }
    1790           0 :             }
    1791             :         }
    1792             : 
    1793             :         m_pSaveInListBox->SetSelectHdl(
    1794           0 :             LINK( this, SvxConfigPage, SelectSaveInLocation ) );
    1795             : 
    1796           0 :         bInitialised = true;
    1797             : 
    1798           0 :         Init();
    1799             :     }
    1800             :     else
    1801             :     {
    1802           0 :         if ( QueryReset() == RET_YES )
    1803             :         {
    1804             :             // Reset menu configuration for currently selected SaveInData
    1805           0 :             GetSaveInData()->Reset();
    1806             : 
    1807           0 :             Init();
    1808             :         }
    1809             :     }
    1810           0 : }
    1811             : 
    1812           0 : OUString SvxConfigPage::GetFrameWithDefaultAndIdentify( uno::Reference< frame::XFrame >& _inout_rxFrame )
    1813             : {
    1814           0 :     OUString sModuleID;
    1815             :     try
    1816             :     {
    1817             :         uno::Reference< uno::XComponentContext > xContext(
    1818           0 :             ::comphelper::getProcessComponentContext() );
    1819             : 
    1820             :         uno::Reference< frame::XDesktop2 > xDesktop = frame::Desktop::create(
    1821           0 :             xContext );
    1822             : 
    1823           0 :         if ( !_inout_rxFrame.is() )
    1824           0 :             _inout_rxFrame = xDesktop->getActiveFrame();
    1825             : 
    1826           0 :         if ( !_inout_rxFrame.is() )
    1827             :         {
    1828           0 :             _inout_rxFrame = xDesktop->getCurrentFrame();
    1829             :         }
    1830             : 
    1831           0 :         if ( !_inout_rxFrame.is() && SfxViewFrame::Current() )
    1832           0 :             _inout_rxFrame = SfxViewFrame::Current()->GetFrame().GetFrameInterface();
    1833             : 
    1834           0 :         if ( !_inout_rxFrame.is() )
    1835             :         {
    1836             :             SAL_WARN( "cui.customize", "SvxConfigPage::GetFrameWithDefaultAndIdentify(): no frame found!" );
    1837           0 :             return sModuleID;
    1838             :         }
    1839             : 
    1840             :         uno::Reference< css::frame::XModuleManager2 > xModuleManager(
    1841           0 :                 css::frame::ModuleManager::create( xContext ) );
    1842             : 
    1843             :         try
    1844             :         {
    1845           0 :             sModuleID = xModuleManager->identify( _inout_rxFrame );
    1846             :         }
    1847           0 :         catch ( const frame::UnknownModuleException& )
    1848             :         {
    1849           0 :         }
    1850             : 
    1851             :     }
    1852           0 :     catch( const uno::Exception& )
    1853             :     {
    1854             :         DBG_UNHANDLED_EXCEPTION();
    1855             :     }
    1856             : 
    1857           0 :     return sModuleID;
    1858             : }
    1859             : 
    1860           0 : bool SvxConfigPage::FillItemSet( SfxItemSet* )
    1861             : {
    1862           0 :     bool result = false;
    1863             : 
    1864           0 :     for ( sal_Int32 i = 0 ; i < m_pSaveInListBox->GetEntryCount(); ++i )
    1865             :     {
    1866             :         SaveInData* pData =
    1867           0 :             static_cast<SaveInData*>(m_pSaveInListBox->GetEntryData( i ));
    1868             : 
    1869           0 :         result = pData->Apply();
    1870             :     }
    1871           0 :     return result;
    1872             : }
    1873             : 
    1874           0 : IMPL_LINK( SvxConfigPage, SelectSaveInLocation, ListBox *, pBox )
    1875             : {
    1876             :     (void)pBox;
    1877             : 
    1878             :     pCurrentSaveInData = static_cast<SaveInData*>(m_pSaveInListBox->GetEntryData(
    1879           0 :             m_pSaveInListBox->GetSelectEntryPos()));
    1880             : 
    1881           0 :     Init();
    1882           0 :     return 1;
    1883             : }
    1884             : 
    1885           0 : void SvxConfigPage::ReloadTopLevelListBox( SvxConfigEntry* pToSelect )
    1886             : {
    1887           0 :     sal_uInt16 nSelectionPos = m_pTopLevelListBox->GetSelectEntryPos();
    1888           0 :     m_pTopLevelListBox->Clear();
    1889             : 
    1890           0 :     if ( GetSaveInData() && GetSaveInData()->GetEntries() )
    1891             :     {
    1892           0 :         SvxEntries::const_iterator iter = GetSaveInData()->GetEntries()->begin();
    1893           0 :         SvxEntries::const_iterator end = GetSaveInData()->GetEntries()->end();
    1894             : 
    1895           0 :         for ( ; iter != end; ++iter )
    1896             :         {
    1897           0 :             SvxConfigEntry* pEntryData = *iter;
    1898           0 :             sal_uInt16 nPos = m_pTopLevelListBox->InsertEntry( stripHotKey( pEntryData->GetName() ) );
    1899           0 :             m_pTopLevelListBox->SetEntryData( nPos, pEntryData );
    1900             : 
    1901           0 :             if ( pEntryData == pToSelect )
    1902           0 :                 nSelectionPos = nPos;
    1903             : 
    1904           0 :             AddSubMenusToUI( stripHotKey( pEntryData->GetName() ), pEntryData );
    1905             :         }
    1906             :     }
    1907             : #ifdef DBG_UTIL
    1908             :     else
    1909             :     {
    1910             :         DBG_ASSERT( GetSaveInData(), "SvxConfigPage::ReloadTopLevelListBox(): no SaveInData" );
    1911             :         DBG_ASSERT( GetSaveInData()->GetEntries() ,
    1912             :             "SvxConfigPage::ReloadTopLevelListBox(): no SaveInData entries" );
    1913             :     }
    1914             : #endif
    1915             : 
    1916           0 :     nSelectionPos = nSelectionPos < m_pTopLevelListBox->GetEntryCount() ?
    1917           0 :         nSelectionPos : m_pTopLevelListBox->GetEntryCount() - 1;
    1918             : 
    1919           0 :     m_pTopLevelListBox->SelectEntryPos( nSelectionPos, true );
    1920           0 :     m_pTopLevelListBox->GetSelectHdl().Call( this );
    1921           0 : }
    1922             : 
    1923           0 : void SvxConfigPage::AddSubMenusToUI(
    1924             :     const OUString& rBaseTitle, SvxConfigEntry* pParentData )
    1925             : {
    1926           0 :     SvxEntries::const_iterator iter = pParentData->GetEntries()->begin();
    1927           0 :     SvxEntries::const_iterator end = pParentData->GetEntries()->end();
    1928             : 
    1929           0 :     for ( ; iter != end; ++iter )
    1930             :     {
    1931           0 :         SvxConfigEntry* pEntryData = *iter;
    1932             : 
    1933           0 :         if ( pEntryData->IsPopup() )
    1934             :         {
    1935           0 :             OUString subMenuTitle( rBaseTitle );
    1936           0 :             subMenuTitle += OUString(aMenuSeparatorStr);
    1937           0 :             subMenuTitle += stripHotKey( pEntryData->GetName() );
    1938             : 
    1939           0 :             sal_uInt16 nPos = m_pTopLevelListBox->InsertEntry( subMenuTitle );
    1940           0 :             m_pTopLevelListBox->SetEntryData( nPos, pEntryData );
    1941             : 
    1942           0 :             AddSubMenusToUI( subMenuTitle, pEntryData );
    1943             :         }
    1944             :     }
    1945           0 : }
    1946             : 
    1947           0 : SvxEntries* SvxConfigPage::FindParentForChild(
    1948             :     SvxEntries* pRootEntries, SvxConfigEntry* pChildData )
    1949             : {
    1950           0 :     SvxEntries::const_iterator iter = pRootEntries->begin();
    1951           0 :     SvxEntries::const_iterator end = pRootEntries->end();
    1952             : 
    1953           0 :     for ( ; iter != end; ++iter )
    1954             :     {
    1955           0 :         SvxConfigEntry* pEntryData = *iter;
    1956             : 
    1957           0 :         if ( pEntryData == pChildData )
    1958             :         {
    1959           0 :             return pRootEntries;
    1960             :         }
    1961           0 :         else if ( pEntryData->IsPopup() )
    1962             :         {
    1963             :             SvxEntries* result =
    1964           0 :                 FindParentForChild( pEntryData->GetEntries(), pChildData );
    1965             : 
    1966           0 :             if ( result != NULL )
    1967             :             {
    1968           0 :                 return result;
    1969             :             }
    1970             :         }
    1971             :     }
    1972           0 :     return NULL;
    1973             : }
    1974             : 
    1975           0 : SvTreeListEntry* SvxConfigPage::AddFunction(
    1976             :     SvTreeListEntry* pTarget, bool bFront, bool bAllowDuplicates )
    1977             : {
    1978           0 :     OUString aDisplayName = m_pSelectorDlg->GetSelectedDisplayName();
    1979           0 :     OUString aURL = m_pSelectorDlg->GetScriptURL();
    1980             : 
    1981           0 :     if ( aURL.isEmpty() )
    1982             :     {
    1983           0 :         return NULL;
    1984             :     }
    1985             : 
    1986             :     SvxConfigEntry* pNewEntryData =
    1987           0 :         new SvxConfigEntry( aDisplayName, aURL, false );
    1988           0 :     pNewEntryData->SetUserDefined( true );
    1989             : 
    1990             :     // check that this function is not already in the menu
    1991           0 :     SvxConfigEntry* pParent = GetTopLevelSelection();
    1992             : 
    1993           0 :     if ( !bAllowDuplicates )
    1994             :     {
    1995           0 :         for (SvxEntries::const_iterator iter(pParent->GetEntries()->begin()), end(pParent->GetEntries()->end());
    1996             :              iter != end ; ++iter)
    1997             :         {
    1998           0 :             SvxConfigEntry *pCurEntry = *iter;
    1999             : 
    2000           0 :             if ( pCurEntry->GetCommand() == pNewEntryData->GetCommand() )
    2001             :             {
    2002             :                 // asynchronous error message, because of MsgBoxes
    2003             :                 PostUserEvent(
    2004           0 :                     LINK( this, SvxConfigPage, AsyncInfoMsg ), NULL, true );
    2005           0 :                 delete pNewEntryData;
    2006           0 :                 return NULL;
    2007             :             }
    2008             :         }
    2009             :     }
    2010             : 
    2011           0 :     return InsertEntry( pNewEntryData, pTarget, bFront );
    2012             : }
    2013             : 
    2014           0 : SvTreeListEntry* SvxConfigPage::InsertEntry(
    2015             :     SvxConfigEntry* pNewEntryData,
    2016             :     SvTreeListEntry* pTarget,
    2017             :     bool bFront )
    2018             : {
    2019             :     // Grab the entries list for the currently selected menu
    2020           0 :     SvxEntries* pEntries = GetTopLevelSelection()->GetEntries();
    2021             : 
    2022           0 :     SvTreeListEntry* pNewEntry = NULL;
    2023             :     SvTreeListEntry* pCurEntry =
    2024           0 :         pTarget != NULL ? pTarget : m_pContentsListBox->GetCurEntry();
    2025             : 
    2026           0 :     if ( bFront )
    2027             :     {
    2028           0 :         pEntries->insert( pEntries->begin(), pNewEntryData );
    2029           0 :         pNewEntry = InsertEntryIntoUI( pNewEntryData, 0 );
    2030             :     }
    2031           0 :     else if ( pCurEntry == NULL || pCurEntry == m_pContentsListBox->Last() )
    2032             :     {
    2033           0 :         pEntries->push_back( pNewEntryData );
    2034           0 :         pNewEntry = InsertEntryIntoUI( pNewEntryData );
    2035             :     }
    2036             :     else
    2037             :     {
    2038             :         SvxConfigEntry* pEntryData =
    2039           0 :             static_cast<SvxConfigEntry*>(pCurEntry->GetUserData());
    2040             : 
    2041           0 :         SvxEntries::iterator iter = pEntries->begin();
    2042           0 :         SvxEntries::const_iterator end = pEntries->end();
    2043             : 
    2044             :         // Advance the iterator to the data for currently selected entry
    2045           0 :         sal_uInt16 nPos = 0;
    2046           0 :         while (*iter != pEntryData && ++iter != end)
    2047             :         {
    2048           0 :             ++nPos;
    2049             :         }
    2050             : 
    2051             :         // Now step past it to the entry after the currently selected one
    2052           0 :         ++iter;
    2053           0 :         ++nPos;
    2054             : 
    2055             :         // Now add the new entry to the UI and to the parent's list
    2056           0 :         if ( iter != end )
    2057             :         {
    2058           0 :             pEntries->insert( iter, pNewEntryData );
    2059           0 :             pNewEntry = InsertEntryIntoUI( pNewEntryData, nPos );
    2060             :         }
    2061             :     }
    2062             : 
    2063           0 :     if ( pNewEntry != NULL )
    2064             :     {
    2065           0 :         m_pContentsListBox->Select( pNewEntry );
    2066           0 :         m_pContentsListBox->MakeVisible( pNewEntry );
    2067             : 
    2068           0 :         GetSaveInData()->SetModified( true );
    2069             :     }
    2070             : 
    2071           0 :     return pNewEntry;
    2072             : }
    2073             : 
    2074           0 : SvTreeListEntry* SvxConfigPage::InsertEntryIntoUI(
    2075             :     SvxConfigEntry* pNewEntryData, sal_uLong nPos )
    2076             : {
    2077           0 :     SvTreeListEntry* pNewEntry = NULL;
    2078             : 
    2079           0 :     if (pNewEntryData->IsSeparator())
    2080             :     {
    2081           0 :         pNewEntry = m_pContentsListBox->InsertEntry(
    2082             :             OUString(aSeparatorStr),
    2083           0 :             0, false, nPos, pNewEntryData);
    2084             :     }
    2085             :     else
    2086             :     {
    2087           0 :         OUString aName = stripHotKey( pNewEntryData->GetName() );
    2088             : 
    2089             :         Image aImage = GetSaveInData()->GetImage(
    2090           0 :             pNewEntryData->GetCommand());
    2091             : 
    2092           0 :         if ( !!aImage )
    2093             :         {
    2094           0 :             pNewEntry = m_pContentsListBox->InsertEntry(
    2095           0 :                 aName, aImage, aImage, 0, false, nPos, pNewEntryData );
    2096             :         }
    2097             :         else
    2098             :         {
    2099           0 :             pNewEntry = m_pContentsListBox->InsertEntry(
    2100           0 :                 aName, 0, false, nPos, pNewEntryData );
    2101             :         }
    2102             : 
    2103           0 :         if ( pNewEntryData->IsPopup() ||
    2104           0 :              pNewEntryData->GetStyle() & css::ui::ItemStyle::DROP_DOWN )
    2105             :         {
    2106             :             // add new popup painter, it gets destructed by the entry
    2107             :             pNewEntry->ReplaceItem(
    2108           0 :                 new PopupPainter( pNewEntry, aName ),
    2109           0 :                 pNewEntry->ItemCount() - 1 );
    2110           0 :         }
    2111             :     }
    2112             : 
    2113           0 :     return pNewEntry;
    2114             : }
    2115             : 
    2116           0 : IMPL_LINK( SvxConfigPage, AsyncInfoMsg, OUString*, pMsg )
    2117             : {
    2118             :     (void)pMsg;
    2119             : 
    2120             :     // Asynchronous msg because of D&D
    2121             :     ScopedVclPtr<MessageDialog>::Create( this,
    2122           0 :         CUI_RES( RID_SVXSTR_MNUCFG_ALREADY_INCLUDED ),
    2123           0 :         VCL_MESSAGE_INFO )->Execute();
    2124             : 
    2125           0 :     return 0;
    2126             : }
    2127             : 
    2128           0 : IMPL_LINK( SvxConfigPage, MoveHdl, Button *, pButton )
    2129             : {
    2130           0 :     MoveEntry(pButton == m_pMoveUpButton);
    2131           0 :     return 0;
    2132             : }
    2133             : 
    2134           0 : void SvxConfigPage::MoveEntry( bool bMoveUp )
    2135             : {
    2136           0 :     SvTreeListEntry *pSourceEntry = m_pContentsListBox->FirstSelected();
    2137           0 :     SvTreeListEntry *pTargetEntry = NULL;
    2138           0 :     SvTreeListEntry *pToSelect = NULL;
    2139             : 
    2140           0 :     if ( !pSourceEntry )
    2141             :     {
    2142           0 :         return;
    2143             :     }
    2144             : 
    2145           0 :     if ( bMoveUp )
    2146             :     {
    2147             :         // Move Up is just a Move Down with the source and target reversed
    2148           0 :         pTargetEntry = pSourceEntry;
    2149           0 :         pSourceEntry = SvTreeListBox::PrevSibling( pTargetEntry );
    2150           0 :         pToSelect = pTargetEntry;
    2151             :     }
    2152             :     else
    2153             :     {
    2154           0 :         pTargetEntry = SvTreeListBox::NextSibling( pSourceEntry );
    2155           0 :         pToSelect = pSourceEntry;
    2156             :     }
    2157             : 
    2158           0 :     if ( MoveEntryData( pSourceEntry, pTargetEntry ) )
    2159             :     {
    2160           0 :         m_pContentsListBox->GetModel()->Move( pSourceEntry, pTargetEntry );
    2161           0 :         m_pContentsListBox->Select( pToSelect );
    2162           0 :         m_pContentsListBox->MakeVisible( pToSelect );
    2163             : 
    2164           0 :         UpdateButtonStates();
    2165             :     }
    2166             : }
    2167             : 
    2168           0 : bool SvxConfigPage::MoveEntryData(
    2169             :     SvTreeListEntry* pSourceEntry, SvTreeListEntry* pTargetEntry )
    2170             : {
    2171             :     //#i53677#
    2172           0 :     if (NULL == pSourceEntry || NULL == pTargetEntry)
    2173             :     {
    2174           0 :         return false;
    2175             :     }
    2176             : 
    2177             :     // Grab the entries list for the currently selected menu
    2178           0 :     SvxEntries* pEntries = GetTopLevelSelection()->GetEntries();
    2179             : 
    2180             :     SvxConfigEntry* pSourceData =
    2181           0 :         static_cast<SvxConfigEntry*>(pSourceEntry->GetUserData());
    2182             : 
    2183             :     SvxConfigEntry* pTargetData =
    2184           0 :         static_cast<SvxConfigEntry*>(pTargetEntry->GetUserData());
    2185             : 
    2186           0 :     if ( pSourceData != NULL && pTargetData != NULL )
    2187             :     {
    2188             :         // remove the source entry from our list
    2189           0 :         RemoveEntry( pEntries, pSourceData );
    2190             : 
    2191           0 :         SvxEntries::iterator iter = pEntries->begin();
    2192           0 :         SvxEntries::const_iterator end = pEntries->end();
    2193             : 
    2194             :         // advance the iterator to the position of the target entry
    2195           0 :         while (*iter != pTargetData && ++iter != end) ;
    2196             : 
    2197             :         // insert the source entry at the position after the target
    2198           0 :         pEntries->insert( ++iter, pSourceData );
    2199             : 
    2200           0 :         GetSaveInData()->SetModified( true );
    2201             : 
    2202           0 :         return true;
    2203             :     }
    2204             : 
    2205           0 :     return false;
    2206             : }
    2207             : 
    2208           0 : SvxMenuConfigPage::SvxMenuConfigPage(vcl::Window *pParent, const SfxItemSet& rSet)
    2209           0 :     : SvxConfigPage(pParent, rSet)
    2210             : {
    2211           0 :     m_pContentsListBox = VclPtr<SvxMenuEntriesListBox>::Create(m_pEntries, this);
    2212           0 :     m_pContentsListBox->set_grid_left_attach(0);
    2213           0 :     m_pContentsListBox->set_grid_top_attach(0);
    2214           0 :     m_pContentsListBox->set_hexpand(true);
    2215           0 :     m_pContentsListBox->set_vexpand(true);
    2216           0 :     m_pContentsListBox->Show();
    2217             : 
    2218             :     m_pTopLevelListBox->SetSelectHdl(
    2219           0 :         LINK( this, SvxMenuConfigPage, SelectMenu ) );
    2220             : 
    2221             :     m_pContentsListBox->SetSelectHdl(
    2222           0 :         LINK( this, SvxMenuConfigPage, SelectMenuEntry ) );
    2223             : 
    2224           0 :     m_pMoveUpButton->SetClickHdl ( LINK( this, SvxConfigPage, MoveHdl) );
    2225           0 :     m_pMoveDownButton->SetClickHdl ( LINK( this, SvxConfigPage, MoveHdl) );
    2226             : 
    2227           0 :     m_pNewTopLevelButton->SetClickHdl  (
    2228           0 :         LINK( this, SvxMenuConfigPage, NewMenuHdl ) );
    2229             : 
    2230           0 :     m_pAddCommandsButton->SetClickHdl  (
    2231           0 :         LINK( this, SvxMenuConfigPage, AddCommandsHdl ) );
    2232             : 
    2233           0 :     PopupMenu* pMenu = m_pModifyTopLevelButton->GetPopupMenu();
    2234             :     pMenu->SetMenuFlags(
    2235           0 :         pMenu->GetMenuFlags() | MenuFlags::AlwaysShowDisabledEntries );
    2236             : 
    2237             :     m_pModifyTopLevelButton->SetSelectHdl(
    2238           0 :         LINK( this, SvxMenuConfigPage, MenuSelectHdl ) );
    2239             : 
    2240           0 :     PopupMenu* pEntry = m_pModifyCommandButton->GetPopupMenu();
    2241             :     pEntry->SetMenuFlags(
    2242           0 :         pEntry->GetMenuFlags() | MenuFlags::AlwaysShowDisabledEntries );
    2243             : 
    2244             :     m_pModifyCommandButton->SetSelectHdl(
    2245           0 :         LINK( this, SvxMenuConfigPage, EntrySelectHdl ) );
    2246           0 : }
    2247             : 
    2248           0 : SvxMenuConfigPage::~SvxMenuConfigPage()
    2249             : {
    2250           0 :     disposeOnce();
    2251           0 : }
    2252             : 
    2253             : // Populates the Menu combo box
    2254           0 : void SvxMenuConfigPage::Init()
    2255             : {
    2256             :     // ensure that the UI is cleared before populating it
    2257           0 :     m_pTopLevelListBox->Clear();
    2258           0 :     m_pContentsListBox->Clear();
    2259             : 
    2260           0 :     ReloadTopLevelListBox();
    2261             : 
    2262           0 :     m_pTopLevelListBox->SelectEntryPos(0, true);
    2263           0 :     m_pTopLevelListBox->GetSelectHdl().Call(this);
    2264           0 : }
    2265             : 
    2266           0 : void SvxMenuConfigPage::dispose()
    2267             : {
    2268           0 :     for ( sal_Int32 i = 0 ; i < m_pSaveInListBox->GetEntryCount(); ++i )
    2269             :     {
    2270             :         MenuSaveInData* pData =
    2271           0 :             static_cast<MenuSaveInData*>(m_pSaveInListBox->GetEntryData( i ));
    2272             : 
    2273           0 :         delete pData;
    2274             :     }
    2275           0 :     m_pSaveInListBox->Clear();
    2276             : 
    2277           0 :     SvxConfigPage::dispose();
    2278           0 : }
    2279             : 
    2280           0 : IMPL_LINK( SvxMenuConfigPage, SelectMenuEntry, Control *, pBox )
    2281             : {
    2282             :     (void)pBox;
    2283             : 
    2284           0 :     UpdateButtonStates();
    2285             : 
    2286           0 :     return 1;
    2287             : }
    2288             : 
    2289           0 : void SvxMenuConfigPage::UpdateButtonStates()
    2290             : {
    2291           0 :     PopupMenu* pPopup = m_pModifyCommandButton->GetPopupMenu();
    2292             : 
    2293             :     // Disable Up and Down buttons depending on current selection
    2294           0 :     SvTreeListEntry* selection = m_pContentsListBox->GetCurEntry();
    2295             : 
    2296           0 :     if ( m_pContentsListBox->GetEntryCount() == 0 || selection == NULL )
    2297             :     {
    2298           0 :         m_pMoveUpButton->Enable( false );
    2299           0 :         m_pMoveDownButton->Enable( false );
    2300             : 
    2301           0 :         pPopup->EnableItem( ID_BEGIN_GROUP, true );
    2302           0 :         pPopup->EnableItem( ID_RENAME, false );
    2303           0 :         pPopup->EnableItem( ID_DELETE, false );
    2304             : 
    2305           0 :         m_pDescriptionField->SetText("");
    2306             : 
    2307           0 :         return;
    2308             :     }
    2309             : 
    2310           0 :     SvTreeListEntry* first = m_pContentsListBox->First();
    2311           0 :     SvTreeListEntry* last = m_pContentsListBox->Last();
    2312             : 
    2313           0 :     m_pMoveUpButton->Enable( selection != first );
    2314           0 :     m_pMoveDownButton->Enable( selection != last );
    2315             : 
    2316             :     SvxConfigEntry* pEntryData =
    2317           0 :         static_cast<SvxConfigEntry*>(selection->GetUserData());
    2318             : 
    2319           0 :     if ( pEntryData->IsSeparator() )
    2320             :     {
    2321           0 :         pPopup->EnableItem( ID_DELETE, true );
    2322           0 :         pPopup->EnableItem( ID_BEGIN_GROUP, false );
    2323           0 :         pPopup->EnableItem( ID_RENAME, false );
    2324             : 
    2325           0 :         m_pDescriptionField->SetText("");
    2326             :     }
    2327             :     else
    2328             :     {
    2329           0 :         pPopup->EnableItem( ID_BEGIN_GROUP, true );
    2330           0 :         pPopup->EnableItem( ID_DELETE, true );
    2331           0 :         pPopup->EnableItem( ID_RENAME, true );
    2332             : 
    2333           0 :         m_pDescriptionField->SetText(pEntryData->GetHelpText());
    2334             :     }
    2335             : }
    2336             : 
    2337           0 : void SvxMenuConfigPage::DeleteSelectedTopLevel()
    2338             : {
    2339           0 :     SvxConfigEntry* pMenuData = GetTopLevelSelection();
    2340             : 
    2341             :     SvxEntries* pParentEntries =
    2342           0 :         FindParentForChild( GetSaveInData()->GetEntries(), pMenuData );
    2343             : 
    2344           0 :     RemoveEntry( pParentEntries, pMenuData );
    2345           0 :     delete pMenuData;
    2346             : 
    2347           0 :     ReloadTopLevelListBox();
    2348             : 
    2349           0 :     GetSaveInData()->SetModified( true );
    2350           0 : }
    2351             : 
    2352           0 : bool SvxMenuConfigPage::DeleteSelectedContent()
    2353             : {
    2354           0 :     SvTreeListEntry *pActEntry = m_pContentsListBox->FirstSelected();
    2355             : 
    2356           0 :     if ( pActEntry != NULL )
    2357             :     {
    2358             :         // get currently selected menu entry
    2359             :         SvxConfigEntry* pMenuEntry =
    2360           0 :             static_cast<SvxConfigEntry*>(pActEntry->GetUserData());
    2361             : 
    2362             :         // get currently selected menu
    2363           0 :         SvxConfigEntry* pMenu = GetTopLevelSelection();
    2364             : 
    2365             :         // remove menu entry from the list for this menu
    2366           0 :         RemoveEntry( pMenu->GetEntries(), pMenuEntry );
    2367             : 
    2368             :         // remove menu entry from UI
    2369           0 :         m_pContentsListBox->GetModel()->Remove( pActEntry );
    2370             : 
    2371             :         // if this is a submenu entry, redraw the menus list box
    2372           0 :         if ( pMenuEntry->IsPopup() )
    2373             :         {
    2374           0 :             ReloadTopLevelListBox();
    2375             :         }
    2376             : 
    2377             :         // delete data for menu entry
    2378           0 :         delete pMenuEntry;
    2379             : 
    2380           0 :         GetSaveInData()->SetModified( true );
    2381             : 
    2382           0 :         return true;
    2383             :     }
    2384           0 :     return false;
    2385             : }
    2386             : 
    2387           0 : short SvxMenuConfigPage::QueryReset()
    2388             : {
    2389           0 :     OUString msg = CUI_RES( RID_SVXSTR_CONFIRM_MENU_RESET );
    2390             : 
    2391             :     OUString saveInName = m_pSaveInListBox->GetEntry(
    2392           0 :         m_pSaveInListBox->GetSelectEntryPos() );
    2393             : 
    2394           0 :     OUString label = replaceSaveInName( msg, saveInName );
    2395             : 
    2396           0 :     ScopedVclPtrInstance<QueryBox> qbox( this, WB_YES_NO, label );
    2397             : 
    2398           0 :     return qbox->Execute();
    2399             : }
    2400             : 
    2401           0 : IMPL_LINK( SvxMenuConfigPage, SelectMenu, ListBox *, pBox )
    2402             : {
    2403             :     (void)pBox;
    2404             : 
    2405           0 :     m_pContentsListBox->Clear();
    2406             : 
    2407           0 :     SvxConfigEntry* pMenuData = GetTopLevelSelection();
    2408             : 
    2409           0 :     PopupMenu* pPopup = m_pModifyTopLevelButton->GetPopupMenu();
    2410           0 :     if ( pMenuData )
    2411             :     {
    2412           0 :         pPopup->EnableItem( ID_DELETE, pMenuData->IsDeletable() );
    2413           0 :         pPopup->EnableItem( ID_RENAME, pMenuData->IsRenamable() );
    2414           0 :         pPopup->EnableItem( ID_MOVE, pMenuData->IsMovable() );
    2415             : 
    2416           0 :         SvxEntries* pEntries = pMenuData->GetEntries();
    2417           0 :         SvxEntries::const_iterator iter = pEntries->begin();
    2418             : 
    2419           0 :         for ( ; iter != pEntries->end(); ++iter )
    2420             :         {
    2421           0 :             SvxConfigEntry* pEntry = *iter;
    2422           0 :             InsertEntryIntoUI( pEntry );
    2423             :         }
    2424             :     }
    2425             : 
    2426           0 :     UpdateButtonStates();
    2427             : 
    2428           0 :     return 0;
    2429             : }
    2430             : 
    2431           0 : IMPL_LINK_TYPED( SvxMenuConfigPage, MenuSelectHdl, MenuButton *, pButton, void )
    2432             : {
    2433           0 :     OString sIdent = pButton->GetCurItemIdent();
    2434             : 
    2435           0 :     if (sIdent == "delete")
    2436             :     {
    2437           0 :         DeleteSelectedTopLevel();
    2438             :     }
    2439           0 :     else if (sIdent == "rename")
    2440             :     {
    2441           0 :         SvxConfigEntry* pMenuData = GetTopLevelSelection();
    2442             : 
    2443           0 :         OUString aNewName( stripHotKey( pMenuData->GetName() ) );
    2444           0 :         OUString aDesc = CUI_RESSTR( RID_SVXSTR_LABEL_NEW_NAME );
    2445             : 
    2446           0 :         VclPtrInstance< SvxNameDialog > pNameDialog( this, aNewName, aDesc );
    2447           0 :         pNameDialog->SetHelpId( HID_SVX_CONFIG_RENAME_MENU );
    2448           0 :         pNameDialog->SetText( CUI_RESSTR( RID_SVXSTR_RENAME_MENU ) );
    2449             : 
    2450           0 :         if ( pNameDialog->Execute() == RET_OK ) {
    2451           0 :             pNameDialog->GetName( aNewName );
    2452           0 :             pMenuData->SetName( aNewName );
    2453             : 
    2454           0 :             ReloadTopLevelListBox();
    2455             : 
    2456           0 :             GetSaveInData()->SetModified( true );
    2457           0 :         }
    2458             :     }
    2459           0 :     else if (sIdent == "move")
    2460             :     {
    2461           0 :         SvxConfigEntry* pMenuData = GetTopLevelSelection();
    2462             : 
    2463             :         VclPtr<SvxMainMenuOrganizerDialog> pDialog(
    2464             :             VclPtr<SvxMainMenuOrganizerDialog>::Create( this,
    2465           0 :                 GetSaveInData()->GetEntries(), pMenuData ));
    2466             : 
    2467           0 :         if ( pDialog->Execute() == RET_OK )
    2468             :         {
    2469           0 :             GetSaveInData()->SetEntries( pDialog->GetEntries() );
    2470             : 
    2471           0 :             ReloadTopLevelListBox( pDialog->GetSelectedEntry() );
    2472             : 
    2473           0 :             GetSaveInData()->SetModified( true );
    2474           0 :         }
    2475           0 :     }
    2476           0 : }
    2477             : 
    2478           0 : IMPL_LINK_TYPED( SvxMenuConfigPage, EntrySelectHdl, MenuButton *, pButton, void )
    2479             : {
    2480           0 :     OString sIdent = pButton->GetCurItemIdent();
    2481           0 :     if (sIdent == "addsubmenu")
    2482             :     {
    2483           0 :         OUString aNewName;
    2484           0 :         OUString aDesc = CUI_RESSTR( RID_SVXSTR_SUBMENU_NAME );
    2485             : 
    2486           0 :         VclPtrInstance< SvxNameDialog > pNameDialog( this, aNewName, aDesc );
    2487           0 :         pNameDialog->SetHelpId( HID_SVX_CONFIG_NAME_SUBMENU );
    2488           0 :         pNameDialog->SetText( CUI_RESSTR( RID_SVXSTR_ADD_SUBMENU ) );
    2489             : 
    2490           0 :         if ( pNameDialog->Execute() == RET_OK ) {
    2491           0 :             pNameDialog->GetName(aNewName);
    2492             : 
    2493             :             SvxConfigEntry* pNewEntryData =
    2494           0 :                 new SvxConfigEntry( aNewName, aNewName, true );
    2495           0 :             pNewEntryData->SetUserDefined( true );
    2496             : 
    2497           0 :             InsertEntry( pNewEntryData );
    2498             : 
    2499           0 :             ReloadTopLevelListBox();
    2500             : 
    2501           0 :             GetSaveInData()->SetModified( true );
    2502           0 :         }
    2503             :     }
    2504           0 :     else if (sIdent == "addseparator")
    2505             :     {
    2506           0 :         SvxConfigEntry* pNewEntryData = new SvxConfigEntry;
    2507           0 :         pNewEntryData->SetUserDefined( true );
    2508           0 :         InsertEntry( pNewEntryData );
    2509             :     }
    2510           0 :     else if (sIdent == "moddelete")
    2511             :     {
    2512           0 :         DeleteSelectedContent();
    2513             :     }
    2514           0 :     else if (sIdent == "modrename")
    2515             :     {
    2516           0 :         SvTreeListEntry* pActEntry = m_pContentsListBox->GetCurEntry();
    2517             :         SvxConfigEntry* pEntry =
    2518           0 :             static_cast<SvxConfigEntry*>(pActEntry->GetUserData());
    2519             : 
    2520           0 :         OUString aNewName( stripHotKey( pEntry->GetName() ) );
    2521           0 :         OUString aDesc = CUI_RESSTR( RID_SVXSTR_LABEL_NEW_NAME );
    2522             : 
    2523           0 :         VclPtrInstance< SvxNameDialog > pNameDialog( this, aNewName, aDesc );
    2524           0 :         pNameDialog->SetHelpId( HID_SVX_CONFIG_RENAME_MENU_ITEM );
    2525           0 :         pNameDialog->SetText( CUI_RESSTR( RID_SVXSTR_RENAME_MENU ) );
    2526             : 
    2527           0 :         if ( pNameDialog->Execute() == RET_OK ) {
    2528           0 :             pNameDialog->GetName(aNewName);
    2529             : 
    2530           0 :             pEntry->SetName( aNewName );
    2531           0 :             m_pContentsListBox->SetEntryText( pActEntry, aNewName );
    2532             : 
    2533           0 :             GetSaveInData()->SetModified( true );
    2534           0 :         }
    2535             :     }
    2536             :     else
    2537             :     {
    2538           0 :         return;
    2539             :     }
    2540             : 
    2541           0 :     if ( GetSaveInData()->IsModified() )
    2542             :     {
    2543           0 :         UpdateButtonStates();
    2544           0 :     }
    2545             : }
    2546             : 
    2547           0 : IMPL_LINK( SvxMenuConfigPage, AddFunctionHdl,
    2548             :     SvxScriptSelectorDialog *, pDialog )
    2549             : {
    2550             :     (void)pDialog;
    2551             : 
    2552           0 :     AddFunction();
    2553             : 
    2554           0 :     return 0;
    2555             : }
    2556             : 
    2557           0 : IMPL_LINK( SvxMenuConfigPage, NewMenuHdl, Button *, pButton )
    2558             : {
    2559             :     (void)pButton;
    2560             : 
    2561             :     VclPtrInstance<SvxMainMenuOrganizerDialog> pDialog(
    2562           0 :         nullptr, GetSaveInData()->GetEntries(), nullptr, true );
    2563             : 
    2564           0 :     if ( pDialog->Execute() == RET_OK )
    2565             :     {
    2566           0 :         GetSaveInData()->SetEntries( pDialog->GetEntries() );
    2567           0 :         ReloadTopLevelListBox( pDialog->GetSelectedEntry() );
    2568           0 :         GetSaveInData()->SetModified( true );
    2569             :     }
    2570             : 
    2571           0 :     return 0;
    2572             : }
    2573             : 
    2574           0 : IMPL_LINK( SvxMenuConfigPage, AddCommandsHdl, Button *, pButton )
    2575             : {
    2576             :     (void)pButton;
    2577             : 
    2578           0 :     if ( m_pSelectorDlg == nullptr )
    2579             :     {
    2580             :         // Create Script Selector which also shows builtin commands
    2581           0 :         m_pSelectorDlg = VclPtr<SvxScriptSelectorDialog>::Create( this, true, m_xFrame );
    2582             : 
    2583             :         m_pSelectorDlg->SetAddHdl(
    2584           0 :             LINK( this, SvxMenuConfigPage, AddFunctionHdl ) );
    2585             : 
    2586           0 :         m_pSelectorDlg->SetDialogDescription( CUI_RES( RID_SVXSTR_MENU_ADDCOMMANDS_DESCRIPTION ) );
    2587             :     }
    2588             : 
    2589             :     // Position the Script Selector over the Add button so it is
    2590             :     // beside the menu contents list and does not obscure it
    2591           0 :     m_pSelectorDlg->SetPosPixel( m_pAddCommandsButton->GetPosPixel() );
    2592             : 
    2593           0 :     m_pSelectorDlg->SetImageProvider( GetSaveInData() );
    2594             : 
    2595           0 :     m_pSelectorDlg->Show();
    2596           0 :     return 1;
    2597             : }
    2598             : 
    2599           0 : SaveInData* SvxMenuConfigPage::CreateSaveInData(
    2600             :     const uno::Reference< css::ui::XUIConfigurationManager >& xCfgMgr,
    2601             :     const uno::Reference< css::ui::XUIConfigurationManager >& xParentCfgMgr,
    2602             :     const OUString& aModuleId,
    2603             :     bool bDocConfig )
    2604             : {
    2605             :     return static_cast< SaveInData* >(
    2606           0 :         new MenuSaveInData( xCfgMgr, xParentCfgMgr, aModuleId, bDocConfig ));
    2607             : }
    2608             : 
    2609           0 : SvxMainMenuOrganizerDialog::SvxMainMenuOrganizerDialog(
    2610             :     vcl::Window* pParent, SvxEntries* entries,
    2611             :     SvxConfigEntry* selection, bool bCreateMenu )
    2612             :     : ModalDialog(pParent, "MoveMenuDialog", "cui/ui/movemenu.ui")
    2613             :     , mpEntries(0)
    2614           0 :     , bModified(false)
    2615             : {
    2616           0 :     get(m_pMenuBox, "namebox");
    2617           0 :     get(m_pMenuNameEdit, "menuname");
    2618           0 :     get(m_pMoveUpButton, "up");
    2619           0 :     get(m_pMoveDownButton, "down");
    2620           0 :     get(m_pMenuListBox, "menulist");
    2621           0 :     m_pMenuListBox->set_height_request(m_pMenuListBox->GetTextHeight() * 12);
    2622             : 
    2623             :     // Copy the entries list passed in
    2624           0 :     if ( entries != NULL )
    2625             :     {
    2626           0 :         mpEntries = new SvxEntries();
    2627           0 :         SvxEntries::const_iterator iter = entries->begin();
    2628             : 
    2629           0 :         while ( iter != entries->end() )
    2630             :         {
    2631           0 :             SvxConfigEntry* pEntry = *iter;
    2632             :             SvTreeListEntry* pLBEntry =
    2633           0 :                 m_pMenuListBox->InsertEntry( stripHotKey( pEntry->GetName() ) );
    2634           0 :             pLBEntry->SetUserData( pEntry );
    2635           0 :             mpEntries->push_back( pEntry );
    2636             : 
    2637           0 :             if ( pEntry == selection )
    2638             :             {
    2639           0 :                 m_pMenuListBox->Select( pLBEntry );
    2640             :             }
    2641           0 :             ++iter;
    2642             :         }
    2643             :     }
    2644             : 
    2645           0 :     if ( bCreateMenu )
    2646             :     {
    2647             :         // Generate custom name for new menu
    2648           0 :         OUString prefix = CUI_RES( RID_SVXSTR_NEW_MENU );
    2649             : 
    2650           0 :         OUString newname = generateCustomName( prefix, entries );
    2651           0 :         OUString newurl = generateCustomMenuURL( mpEntries );
    2652             : 
    2653             :         SvxConfigEntry* pNewEntryData =
    2654           0 :             new SvxConfigEntry( newname, newurl, true );
    2655           0 :         pNewEntryData->SetUserDefined( true );
    2656           0 :         pNewEntryData->SetMain( true );
    2657             : 
    2658             :         pNewMenuEntry =
    2659           0 :             m_pMenuListBox->InsertEntry( stripHotKey( pNewEntryData->GetName() ) );
    2660           0 :         m_pMenuListBox->Select( pNewMenuEntry );
    2661             : 
    2662           0 :         pNewMenuEntry->SetUserData( pNewEntryData );
    2663             : 
    2664           0 :         if (mpEntries)
    2665           0 :             mpEntries->push_back(pNewEntryData);
    2666             : 
    2667           0 :         m_pMenuNameEdit->SetText( newname );
    2668           0 :         m_pMenuNameEdit->SetModifyHdl(
    2669           0 :             LINK( this, SvxMainMenuOrganizerDialog, ModifyHdl ) );
    2670             :     }
    2671             :     else
    2672             :     {
    2673           0 :         pNewMenuEntry = NULL;
    2674             : 
    2675             :         // hide name label and textfield
    2676           0 :         m_pMenuBox->Hide();
    2677             :         // change the title
    2678           0 :         SetText( CUI_RES( RID_SVXSTR_MOVE_MENU ) );
    2679             :     }
    2680             : 
    2681             :     m_pMenuListBox->SetSelectHdl(
    2682           0 :         LINK( this, SvxMainMenuOrganizerDialog, SelectHdl ) );
    2683             : 
    2684           0 :     m_pMoveUpButton->SetClickHdl (
    2685           0 :         LINK( this, SvxMainMenuOrganizerDialog, MoveHdl) );
    2686           0 :     m_pMoveDownButton->SetClickHdl (
    2687           0 :         LINK( this, SvxMainMenuOrganizerDialog, MoveHdl) );
    2688           0 : }
    2689             : 
    2690           0 : SvxMainMenuOrganizerDialog::~SvxMainMenuOrganizerDialog()
    2691             : {
    2692           0 :     disposeOnce();
    2693           0 : }
    2694             : 
    2695           0 : void SvxMainMenuOrganizerDialog::dispose()
    2696             : {
    2697           0 :     m_pMenuBox.clear();
    2698           0 :     m_pMenuNameEdit.clear();
    2699           0 :     m_pMenuListBox.clear();
    2700           0 :     m_pMoveUpButton.clear();
    2701           0 :     m_pMoveDownButton.clear();
    2702           0 :     ModalDialog::dispose();
    2703           0 : }
    2704             : 
    2705           0 : IMPL_LINK(SvxMainMenuOrganizerDialog, ModifyHdl, Edit*, pEdit)
    2706             : {
    2707             :     (void)pEdit;
    2708             : 
    2709             :     // if the Edit control is empty do not change the name
    2710           0 :     if (m_pMenuNameEdit->GetText().isEmpty())
    2711             :     {
    2712           0 :         return 0;
    2713             :     }
    2714             : 
    2715             :     SvxConfigEntry* pNewEntryData =
    2716           0 :         static_cast<SvxConfigEntry*>(pNewMenuEntry->GetUserData());
    2717             : 
    2718           0 :     pNewEntryData->SetName(m_pMenuNameEdit->GetText());
    2719             : 
    2720           0 :     m_pMenuListBox->SetEntryText( pNewMenuEntry, pNewEntryData->GetName() );
    2721             : 
    2722           0 :     return 0;
    2723             : }
    2724             : 
    2725           0 : IMPL_LINK( SvxMainMenuOrganizerDialog, SelectHdl, Control*, pCtrl )
    2726             : {
    2727             :     (void)pCtrl;
    2728           0 :     UpdateButtonStates();
    2729           0 :     return 1;
    2730             : }
    2731             : 
    2732           0 : void SvxMainMenuOrganizerDialog::UpdateButtonStates()
    2733             : {
    2734             :     // Disable Up and Down buttons depending on current selection
    2735           0 :     SvTreeListEntry* selection = m_pMenuListBox->GetCurEntry();
    2736           0 :     SvTreeListEntry* first = m_pMenuListBox->First();
    2737           0 :     SvTreeListEntry* last = m_pMenuListBox->Last();
    2738             : 
    2739           0 :     m_pMoveUpButton->Enable( selection != first );
    2740           0 :     m_pMoveDownButton->Enable( selection != last );
    2741           0 : }
    2742             : 
    2743           0 : IMPL_LINK( SvxMainMenuOrganizerDialog, MoveHdl, Button *, pButton )
    2744             : {
    2745           0 :     SvTreeListEntry *pSourceEntry = m_pMenuListBox->FirstSelected();
    2746           0 :     SvTreeListEntry *pTargetEntry = NULL;
    2747             : 
    2748           0 :     if ( !pSourceEntry )
    2749             :     {
    2750           0 :         return 0;
    2751             :     }
    2752             : 
    2753           0 :     if (pButton == m_pMoveDownButton)
    2754             :     {
    2755           0 :         pTargetEntry = SvTreeListBox::NextSibling( pSourceEntry );
    2756             :     }
    2757           0 :     else if (pButton == m_pMoveUpButton)
    2758             :     {
    2759             :         // Move Up is just a Move Down with the source and target reversed
    2760           0 :         pTargetEntry = pSourceEntry;
    2761           0 :         pSourceEntry = SvTreeListBox::PrevSibling( pTargetEntry );
    2762             :     }
    2763             : 
    2764           0 :     if ( pSourceEntry != NULL && pTargetEntry != NULL )
    2765             :     {
    2766             :         SvxConfigEntry* pSourceData =
    2767           0 :             static_cast<SvxConfigEntry*>(pSourceEntry->GetUserData());
    2768             :         SvxConfigEntry* pTargetData =
    2769           0 :             static_cast<SvxConfigEntry*>(pTargetEntry->GetUserData());
    2770             : 
    2771           0 :         SvxEntries::iterator iter1 = GetEntries()->begin();
    2772           0 :         SvxEntries::iterator iter2 = GetEntries()->begin();
    2773           0 :         SvxEntries::const_iterator end = GetEntries()->end();
    2774             : 
    2775             :         // Advance the iterators to the positions of the source and target
    2776           0 :         while (*iter1 != pSourceData && ++iter1 != end) ;
    2777           0 :         while (*iter2 != pTargetData && ++iter2 != end) ;
    2778             : 
    2779             :         // Now swap the entries in the menu list and in the UI
    2780           0 :         if ( iter1 != end && iter2 != end )
    2781             :         {
    2782           0 :             std::swap( *iter1, *iter2 );
    2783           0 :             m_pMenuListBox->GetModel()->Move( pSourceEntry, pTargetEntry );
    2784           0 :             m_pMenuListBox->MakeVisible( pSourceEntry );
    2785             : 
    2786           0 :             bModified = true;
    2787             :         }
    2788             :     }
    2789             : 
    2790           0 :     if ( bModified )
    2791             :     {
    2792           0 :         UpdateButtonStates();
    2793             :     }
    2794             : 
    2795           0 :     return 0;
    2796             : }
    2797             : 
    2798             : 
    2799           0 : SvxConfigEntry* SvxMainMenuOrganizerDialog::GetSelectedEntry()
    2800             : {
    2801           0 :     return static_cast<SvxConfigEntry*>(m_pMenuListBox->FirstSelected()->GetUserData());
    2802             : }
    2803             : 
    2804             : const OUString&
    2805           0 : SvxConfigEntry::GetHelpText()
    2806             : {
    2807           0 :     if ( aHelpText.isEmpty() )
    2808             :     {
    2809           0 :         if ( !aCommand.isEmpty() )
    2810             :         {
    2811           0 :             aHelpText = Application::GetHelp()->GetHelpText( aCommand, NULL );
    2812             :         }
    2813             :     }
    2814             : 
    2815           0 :     return aHelpText;
    2816             : }
    2817             : 
    2818           0 : SvxConfigEntry::SvxConfigEntry( const OUString& rDisplayName,
    2819             :                                 const OUString& rCommandURL, bool bPopup, bool bParentData )
    2820             :     : nId( 1 )
    2821             :     , aLabel(rDisplayName)
    2822             :     , aCommand(rCommandURL)
    2823             :     , bPopUp(bPopup)
    2824             :     , bStrEdited( false )
    2825             :     , bIsUserDefined( false )
    2826             :     , bIsMain( false )
    2827             :     , bIsParentData( bParentData )
    2828             :     , bIsVisible( true )
    2829             :     , nStyle( 0 )
    2830           0 :     , mpEntries( 0 )
    2831             : {
    2832           0 :     if (bPopUp)
    2833             :     {
    2834           0 :         mpEntries = new SvxEntries();
    2835             :     }
    2836           0 : }
    2837             : 
    2838           0 : SvxConfigEntry::~SvxConfigEntry()
    2839             : {
    2840           0 :     if ( mpEntries != NULL )
    2841             :     {
    2842           0 :         SvxEntries::const_iterator iter = mpEntries->begin();
    2843             : 
    2844           0 :         for ( ; iter != mpEntries->end(); ++iter )
    2845             :         {
    2846           0 :             delete *iter;
    2847             :         }
    2848           0 :         delete mpEntries;
    2849             :     }
    2850           0 : }
    2851             : 
    2852           0 : bool SvxConfigEntry::IsMovable()
    2853             : {
    2854           0 :     if ( IsPopup() && !IsMain() )
    2855             :     {
    2856           0 :         return false;
    2857             :     }
    2858           0 :     return true;
    2859             : }
    2860             : 
    2861           0 : bool SvxConfigEntry::IsDeletable()
    2862             : {
    2863           0 :     if ( IsMain() && !IsUserDefined() )
    2864             :     {
    2865           0 :         return false;
    2866             :     }
    2867           0 :     return true;
    2868             : }
    2869             : 
    2870           0 : bool SvxConfigEntry::IsRenamable()
    2871             : {
    2872           0 :     if ( IsMain() && !IsUserDefined() )
    2873             :     {
    2874           0 :         return false;
    2875             :     }
    2876           0 :     return true;
    2877             : }
    2878             : 
    2879           0 : SvxToolbarConfigPage::SvxToolbarConfigPage(vcl::Window *pParent, const SfxItemSet& rSet)
    2880           0 :     : SvxConfigPage(pParent, rSet)
    2881             : {
    2882           0 :     SetHelpId( HID_SVX_CONFIG_TOOLBAR );
    2883             : 
    2884           0 :     m_pContentsListBox = VclPtr<SvxToolbarEntriesListBox>::Create(m_pEntries, this);
    2885           0 :     m_pContentsListBox->set_grid_left_attach(0);
    2886           0 :     m_pContentsListBox->set_grid_top_attach(0);
    2887           0 :     m_pContentsListBox->set_hexpand(true);
    2888           0 :     m_pContentsListBox->set_vexpand(true);
    2889           0 :     m_pContentsListBox->Show();
    2890             : 
    2891           0 :     m_pContentsListBox->SetHelpId( HID_SVX_CONFIG_TOOLBAR_CONTENTS );
    2892           0 :     m_pNewTopLevelButton->SetHelpId( HID_SVX_NEW_TOOLBAR );
    2893           0 :     m_pModifyTopLevelButton->SetHelpId( HID_SVX_MODIFY_TOOLBAR );
    2894           0 :     m_pAddCommandsButton->SetHelpId( HID_SVX_NEW_TOOLBAR_ITEM );
    2895           0 :     m_pModifyCommandButton->SetHelpId( HID_SVX_MODIFY_TOOLBAR_ITEM );
    2896           0 :     m_pSaveInListBox->SetHelpId( HID_SVX_SAVE_IN );
    2897           0 :     m_pMoveUpButton->SetHelpId( HID_SVX_UP_TOOLBAR_ITEM );
    2898           0 :     m_pMoveDownButton->SetHelpId( HID_SVX_DOWN_TOOLBAR_ITEM );
    2899             : 
    2900           0 :     m_pTopLevel->set_label(CUI_RES(RID_SVXSTR_PRODUCTNAME_TOOLBARS));
    2901             : 
    2902           0 :     m_pTopLevelLabel->SetText( CUI_RES( RID_SVXSTR_TOOLBAR ) );
    2903           0 :     m_pModifyTopLevelButton->SetText( CUI_RES( RID_SVXSTR_TOOLBAR ) );
    2904           0 :     m_pContents->set_label(CUI_RES(RID_SVXSTR_TOOLBAR_CONTENT));
    2905           0 :     m_pContentsLabel->SetText( CUI_RES( RID_SVXSTR_COMMANDS ) );
    2906             : 
    2907             :     m_pTopLevelListBox->SetSelectHdl(
    2908           0 :         LINK( this, SvxToolbarConfigPage, SelectToolbar ) );
    2909             :     m_pContentsListBox->SetSelectHdl(
    2910           0 :         LINK( this, SvxToolbarConfigPage, SelectToolbarEntry ) );
    2911             : 
    2912           0 :     m_pNewTopLevelButton->SetClickHdl  (
    2913           0 :         LINK( this, SvxToolbarConfigPage, NewToolbarHdl ) );
    2914             : 
    2915           0 :     m_pAddCommandsButton->SetClickHdl  (
    2916           0 :         LINK( this, SvxToolbarConfigPage, AddCommandsHdl ) );
    2917             : 
    2918           0 :     m_pMoveUpButton->SetClickHdl ( LINK( this, SvxToolbarConfigPage, MoveHdl) );
    2919           0 :     m_pMoveDownButton->SetClickHdl ( LINK( this, SvxToolbarConfigPage, MoveHdl) );
    2920             :     // Always enable Up and Down buttons
    2921             :     // added for issue i53677 by shizhoubo
    2922           0 :     m_pMoveDownButton->Enable( true );
    2923           0 :     m_pMoveUpButton->Enable( true );
    2924             : 
    2925           0 :     PopupMenu* pMenu = new PopupMenu( CUI_RES( MODIFY_TOOLBAR ) );
    2926             :     pMenu->SetMenuFlags(
    2927           0 :         pMenu->GetMenuFlags() | MenuFlags::AlwaysShowDisabledEntries );
    2928             : 
    2929           0 :     m_pModifyTopLevelButton->SetPopupMenu( pMenu );
    2930             :     m_pModifyTopLevelButton->SetSelectHdl(
    2931           0 :         LINK( this, SvxToolbarConfigPage, ToolbarSelectHdl ) );
    2932             : 
    2933             :     PopupMenu* pEntry = new PopupMenu(
    2934           0 :         CUI_RES( MODIFY_TOOLBAR_CONTENT ) );
    2935             :     pEntry->SetMenuFlags(
    2936           0 :         pEntry->GetMenuFlags() | MenuFlags::AlwaysShowDisabledEntries );
    2937             : 
    2938           0 :     m_pModifyCommandButton->SetPopupMenu( pEntry );
    2939             :     m_pModifyCommandButton->SetSelectHdl(
    2940           0 :         LINK( this, SvxToolbarConfigPage, EntrySelectHdl ) );
    2941             : 
    2942             :     // default toolbar to select is standardbar unless a different one
    2943             :     // has been passed in
    2944           0 :     m_aURLToSelect = ITEM_TOOLBAR_URL;
    2945           0 :     m_aURLToSelect += "standardbar";
    2946             : 
    2947             :     const SfxPoolItem* pItem =
    2948           0 :         rSet.GetItem( rSet.GetPool()->GetWhich( SID_CONFIG ) );
    2949             : 
    2950           0 :     if ( pItem )
    2951             :     {
    2952           0 :         OUString text = static_cast<const SfxStringItem*>(pItem)->GetValue();
    2953           0 :         if (text.startsWith( ITEM_TOOLBAR_URL ))
    2954             :         {
    2955           0 :             m_aURLToSelect = text.copy( 0 );
    2956           0 :         }
    2957             :     }
    2958           0 : }
    2959             : 
    2960           0 : SvxToolbarConfigPage::~SvxToolbarConfigPage()
    2961             : {
    2962           0 :     disposeOnce();
    2963           0 : }
    2964             : 
    2965           0 : void SvxToolbarConfigPage::dispose()
    2966             : {
    2967           0 :     for ( sal_Int32 i = 0 ; i < m_pSaveInListBox->GetEntryCount(); ++i )
    2968             :     {
    2969             :         ToolbarSaveInData* pData =
    2970           0 :             static_cast<ToolbarSaveInData*>(m_pSaveInListBox->GetEntryData( i ));
    2971             : 
    2972           0 :         delete pData;
    2973             :     }
    2974           0 :     m_pSaveInListBox->Clear();
    2975             : 
    2976           0 :     SvxConfigPage::dispose();
    2977           0 : }
    2978             : 
    2979           0 : void SvxToolbarConfigPage::DeleteSelectedTopLevel()
    2980             : {
    2981           0 :     sal_uInt16 nSelectionPos = m_pTopLevelListBox->GetSelectEntryPos();
    2982           0 :     ToolbarSaveInData* pSaveInData = static_cast<ToolbarSaveInData*>( GetSaveInData() );
    2983           0 :     pSaveInData->RemoveToolbar( GetTopLevelSelection() );
    2984             : 
    2985           0 :     if ( m_pTopLevelListBox->GetEntryCount() > 1 )
    2986             :     {
    2987             :         // select next entry after the one being deleted
    2988             :         // selection position is indexed from 0 so need to
    2989             :         // subtract one from the entry count
    2990           0 :         if ( nSelectionPos != m_pTopLevelListBox->GetEntryCount() - 1 )
    2991             :         {
    2992           0 :             m_pTopLevelListBox->SelectEntryPos( nSelectionPos + 1, true );
    2993             :         }
    2994             :         else
    2995             :         {
    2996           0 :             m_pTopLevelListBox->SelectEntryPos( nSelectionPos - 1, true );
    2997             :         }
    2998           0 :         m_pTopLevelListBox->GetSelectHdl().Call( this );
    2999             : 
    3000             :         // and now remove the entry
    3001           0 :         m_pTopLevelListBox->RemoveEntry( nSelectionPos );
    3002             :     }
    3003             :     else
    3004             :     {
    3005           0 :         ReloadTopLevelListBox();
    3006             :     }
    3007           0 : }
    3008             : 
    3009           0 : bool SvxToolbarConfigPage::DeleteSelectedContent()
    3010             : {
    3011           0 :     SvTreeListEntry *pActEntry = m_pContentsListBox->FirstSelected();
    3012             : 
    3013           0 :     if ( pActEntry != NULL )
    3014             :     {
    3015             :         // get currently selected entry
    3016             :         SvxConfigEntry* pEntry =
    3017           0 :             static_cast<SvxConfigEntry*>(pActEntry->GetUserData());
    3018             : 
    3019           0 :         SvxConfigEntry* pToolbar = GetTopLevelSelection();
    3020             : 
    3021             :         // remove entry from the list for this toolbar
    3022           0 :         RemoveEntry( pToolbar->GetEntries(), pEntry );
    3023             : 
    3024             :         // remove toolbar entry from UI
    3025           0 :         m_pContentsListBox->GetModel()->Remove( pActEntry );
    3026             : 
    3027             :         // delete data for toolbar entry
    3028           0 :         delete pEntry;
    3029             : 
    3030           0 :         static_cast<ToolbarSaveInData*>(GetSaveInData())->ApplyToolbar( pToolbar );
    3031           0 :         UpdateButtonStates();
    3032             : 
    3033             :         // if this is the last entry in the toolbar and it is a user
    3034             :         // defined toolbar pop up a dialog asking the user if they
    3035             :         // want to delete the toolbar
    3036           0 :         if ( m_pContentsListBox->GetEntryCount() == 0 &&
    3037           0 :              GetTopLevelSelection()->IsDeletable() )
    3038             :         {
    3039             :             ScopedVclPtrInstance<MessageDialog> qbox(this,
    3040           0 :                 CUI_RES(RID_SXVSTR_CONFIRM_DELETE_TOOLBAR), VCL_MESSAGE_QUESTION, VCL_BUTTONS_YES_NO);
    3041             : 
    3042           0 :             if ( qbox->Execute() == RET_YES )
    3043             :             {
    3044           0 :                 DeleteSelectedTopLevel();
    3045           0 :             }
    3046             :         }
    3047             : 
    3048           0 :         return true;
    3049             :     }
    3050             : 
    3051           0 :     return false;
    3052             : }
    3053             : 
    3054           0 : IMPL_LINK( SvxToolbarConfigPage, MoveHdl, Button *, pButton )
    3055             : {
    3056           0 :     MoveEntry(pButton == m_pMoveUpButton);
    3057           0 :     return 0;
    3058             : }
    3059             : 
    3060           0 : void SvxToolbarConfigPage::MoveEntry( bool bMoveUp )
    3061             : {
    3062           0 :     SvxConfigPage::MoveEntry( bMoveUp );
    3063             : 
    3064             :     // Apply change to currently selected toolbar
    3065           0 :     SvxConfigEntry* pToolbar = GetTopLevelSelection();
    3066           0 :     if ( pToolbar )
    3067           0 :         static_cast<ToolbarSaveInData*>(GetSaveInData())->ApplyToolbar( pToolbar );
    3068             :     else
    3069             :     {
    3070             :         SAL_WARN( "cui.customize", "SvxToolbarConfigPage::MoveEntry(): no entry" );
    3071           0 :         UpdateButtonStates();
    3072             :     }
    3073           0 : }
    3074             : 
    3075           0 : IMPL_LINK_TYPED( SvxToolbarConfigPage, ToolbarSelectHdl, MenuButton *, pButton, void )
    3076             : {
    3077           0 :     sal_uInt16 nSelectionPos = m_pTopLevelListBox->GetSelectEntryPos();
    3078             : 
    3079             :     SvxConfigEntry* pToolbar =
    3080           0 :         static_cast<SvxConfigEntry*>(m_pTopLevelListBox->GetEntryData( nSelectionPos ));
    3081             : 
    3082           0 :     ToolbarSaveInData* pSaveInData = static_cast<ToolbarSaveInData*>( GetSaveInData() );
    3083             : 
    3084           0 :     switch( pButton->GetCurItemId() )
    3085             :     {
    3086             :         case ID_DELETE:
    3087             :         {
    3088           0 :             DeleteSelectedTopLevel();
    3089           0 :             UpdateButtonStates();
    3090           0 :             break;
    3091             :         }
    3092             :         case ID_RENAME:
    3093             :         {
    3094           0 :             OUString aNewName( stripHotKey( pToolbar->GetName() ) );
    3095           0 :             OUString aDesc = CUI_RESSTR( RID_SVXSTR_LABEL_NEW_NAME );
    3096             : 
    3097           0 :             VclPtrInstance< SvxNameDialog > pNameDialog( this, aNewName, aDesc );
    3098           0 :             pNameDialog->SetHelpId( HID_SVX_CONFIG_RENAME_TOOLBAR );
    3099           0 :             pNameDialog->SetText( CUI_RESSTR( RID_SVXSTR_RENAME_TOOLBAR ) );
    3100             : 
    3101           0 :             if ( pNameDialog->Execute() == RET_OK )
    3102             :             {
    3103           0 :                 pNameDialog->GetName(aNewName);
    3104             : 
    3105           0 :                 pToolbar->SetName( aNewName );
    3106           0 :                 pSaveInData->ApplyToolbar( pToolbar );
    3107             : 
    3108             :                 // have to use remove and insert to change the name
    3109           0 :                 m_pTopLevelListBox->RemoveEntry( nSelectionPos );
    3110             :                 nSelectionPos =
    3111           0 :                     m_pTopLevelListBox->InsertEntry( aNewName, nSelectionPos );
    3112           0 :                 m_pTopLevelListBox->SetEntryData( nSelectionPos, pToolbar );
    3113           0 :                 m_pTopLevelListBox->SelectEntryPos( nSelectionPos );
    3114             :             }
    3115           0 :             break;
    3116             :         }
    3117             :         case ID_DEFAULT_STYLE:
    3118             :         {
    3119             :             ScopedVclPtrInstance<MessageDialog> qbox(this,
    3120           0 :                 CUI_RES(RID_SVXSTR_CONFIRM_RESTORE_DEFAULT), VCL_MESSAGE_QUESTION, VCL_BUTTONS_YES_NO);
    3121             : 
    3122           0 :             if ( qbox->Execute() == RET_YES )
    3123             :             {
    3124             :                 ToolbarSaveInData* pSaveInData_ =
    3125           0 :                     static_cast<ToolbarSaveInData*>(GetSaveInData());
    3126             : 
    3127           0 :                 pSaveInData_->RestoreToolbar( pToolbar );
    3128             : 
    3129           0 :                 m_pTopLevelListBox->GetSelectHdl().Call( this );
    3130             :             }
    3131             : 
    3132           0 :             break;
    3133             :         }
    3134             :         case ID_ICONS_ONLY:
    3135             :         {
    3136           0 :             pToolbar->SetStyle( 0 );
    3137           0 :             pSaveInData->SetSystemStyle( m_xFrame, pToolbar->GetCommand(), 0 );
    3138             : 
    3139           0 :             m_pTopLevelListBox->GetSelectHdl().Call( this );
    3140             : 
    3141           0 :             break;
    3142             :         }
    3143             :         case ID_TEXT_ONLY:
    3144             :         {
    3145           0 :             pToolbar->SetStyle( 1 );
    3146           0 :             pSaveInData->SetSystemStyle( m_xFrame, pToolbar->GetCommand(), 1 );
    3147             : 
    3148           0 :             m_pTopLevelListBox->GetSelectHdl().Call( this );
    3149             : 
    3150           0 :             break;
    3151             :         }
    3152             :         case ID_ICONS_AND_TEXT:
    3153             :         {
    3154           0 :             pToolbar->SetStyle( 2 );
    3155           0 :             pSaveInData->SetSystemStyle( m_xFrame, pToolbar->GetCommand(), 2 );
    3156             : 
    3157           0 :             m_pTopLevelListBox->GetSelectHdl().Call( this );
    3158             : 
    3159           0 :             break;
    3160             :         }
    3161             :     }
    3162           0 : }
    3163             : 
    3164           0 : IMPL_LINK_TYPED( SvxToolbarConfigPage, EntrySelectHdl, MenuButton *, pButton, void )
    3165             : {
    3166           0 :     bool bNeedsApply = false;
    3167             : 
    3168             :     // get currently selected toolbar
    3169           0 :     SvxConfigEntry* pToolbar = GetTopLevelSelection();
    3170             : 
    3171           0 :     switch( pButton->GetCurItemId() )
    3172             :     {
    3173             :         case ID_RENAME:
    3174             :         {
    3175           0 :             SvTreeListEntry* pActEntry = m_pContentsListBox->GetCurEntry();
    3176             :             SvxConfigEntry* pEntry =
    3177           0 :                 static_cast<SvxConfigEntry*>(pActEntry->GetUserData());
    3178             : 
    3179           0 :             OUString aNewName( stripHotKey( pEntry->GetName() ) );
    3180           0 :             OUString aDesc = CUI_RESSTR( RID_SVXSTR_LABEL_NEW_NAME );
    3181             : 
    3182           0 :             VclPtrInstance< SvxNameDialog > pNameDialog( this, aNewName, aDesc );
    3183           0 :             pNameDialog->SetHelpId( HID_SVX_CONFIG_RENAME_TOOLBAR_ITEM );
    3184           0 :             pNameDialog->SetText( CUI_RESSTR( RID_SVXSTR_RENAME_TOOLBAR ) );
    3185             : 
    3186           0 :             if ( pNameDialog->Execute() == RET_OK ) {
    3187           0 :                 pNameDialog->GetName(aNewName);
    3188             : 
    3189           0 :                 pEntry->SetName( aNewName );
    3190           0 :                 m_pContentsListBox->SetEntryText( pActEntry, aNewName );
    3191             : 
    3192           0 :                 bNeedsApply = true;
    3193             :             }
    3194           0 :             break;
    3195             :         }
    3196             :         case ID_DEFAULT_COMMAND:
    3197             :         {
    3198           0 :             SvTreeListEntry* pActEntry = m_pContentsListBox->GetCurEntry();
    3199             :             SvxConfigEntry* pEntry =
    3200           0 :                 static_cast<SvxConfigEntry*>(pActEntry->GetUserData());
    3201             : 
    3202           0 :             sal_uInt16 nSelectionPos = 0;
    3203             : 
    3204             :             // find position of entry within the list
    3205           0 :             for ( sal_uLong i = 0; i < m_pContentsListBox->GetEntryCount(); ++i )
    3206             :             {
    3207           0 :                 if ( m_pContentsListBox->GetEntry( 0, i ) == pActEntry )
    3208             :                 {
    3209           0 :                     nSelectionPos = i;
    3210           0 :                     break;
    3211             :                 }
    3212             :             }
    3213             : 
    3214             :             ToolbarSaveInData* pSaveInData =
    3215           0 :                 static_cast<ToolbarSaveInData*>( GetSaveInData() );
    3216             : 
    3217             :             OUString aSystemName =
    3218           0 :                 pSaveInData->GetSystemUIName( pEntry->GetCommand() );
    3219             : 
    3220           0 :             if ( !pEntry->GetName().equals( aSystemName ) )
    3221             :             {
    3222           0 :                 pEntry->SetName( aSystemName );
    3223             :                 m_pContentsListBox->SetEntryText(
    3224           0 :                     pActEntry, stripHotKey( aSystemName ) );
    3225           0 :                 bNeedsApply = true;
    3226             :             }
    3227             : 
    3228           0 :             uno::Sequence< OUString > aURLSeq( 1 );
    3229           0 :             aURLSeq[ 0 ] = pEntry->GetCommand();
    3230             : 
    3231             :             try
    3232             :             {
    3233           0 :                 GetSaveInData()->GetImageManager()->removeImages(
    3234           0 :                     GetImageType(), aURLSeq );
    3235             : 
    3236             :                 // reset backup in entry
    3237             :                 pEntry->SetBackupGraphic(
    3238           0 :                     uno::Reference< graphic::XGraphic >() );
    3239             : 
    3240             :                 GetSaveInData()->PersistChanges(
    3241           0 :                     GetSaveInData()->GetImageManager() );
    3242             : 
    3243           0 :                 m_pContentsListBox->GetModel()->Remove( pActEntry );
    3244             : 
    3245             :                 SvTreeListEntry* pNewLBEntry =
    3246           0 :                     InsertEntryIntoUI( pEntry, nSelectionPos );
    3247             : 
    3248             :                 m_pContentsListBox->SetCheckButtonState( pNewLBEntry,
    3249           0 :                     pEntry->IsVisible() ?
    3250           0 :                         SV_BUTTON_CHECKED : SV_BUTTON_UNCHECKED );
    3251             : 
    3252           0 :                 m_pContentsListBox->Select( pNewLBEntry );
    3253           0 :                 m_pContentsListBox->MakeVisible( pNewLBEntry );
    3254             : 
    3255           0 :                 bNeedsApply = true;
    3256             :             }
    3257           0 :                catch ( uno::Exception& )
    3258             :                {
    3259             :                 OSL_TRACE("Error restoring image");
    3260             :                }
    3261           0 :             break;
    3262             :         }
    3263             :         case ID_BEGIN_GROUP:
    3264             :         {
    3265           0 :             SvxConfigEntry* pNewEntryData = new SvxConfigEntry;
    3266           0 :             pNewEntryData->SetUserDefined( true );
    3267             : 
    3268           0 :             SvTreeListEntry* pNewLBEntry = InsertEntry( pNewEntryData );
    3269             : 
    3270           0 :             m_pContentsListBox->SetCheckButtonInvisible( pNewLBEntry );
    3271             :             m_pContentsListBox->SetCheckButtonState(
    3272           0 :                 pNewLBEntry, SV_BUTTON_TRISTATE );
    3273             : 
    3274           0 :             bNeedsApply = true;
    3275           0 :             break;
    3276             :         }
    3277             :         case ID_DELETE:
    3278             :         {
    3279           0 :             DeleteSelectedContent();
    3280           0 :             break;
    3281             :         }
    3282             :         case ID_ICON_ONLY:
    3283             :         {
    3284           0 :             break;
    3285             :         }
    3286             :         case ID_TEXT_ONLY:
    3287             :         {
    3288           0 :             break;
    3289             :         }
    3290             :         case ID_ICON_AND_TEXT:
    3291             :         {
    3292           0 :             break;
    3293             :         }
    3294             :         case ID_CHANGE_SYMBOL:
    3295             :         {
    3296           0 :             SvTreeListEntry* pActEntry = m_pContentsListBox->GetCurEntry();
    3297             :             SvxConfigEntry* pEntry =
    3298           0 :                 static_cast<SvxConfigEntry*>(pActEntry->GetUserData());
    3299             : 
    3300           0 :             sal_uInt16 nSelectionPos = 0;
    3301             : 
    3302             :             // find position of entry within the list
    3303           0 :             for ( sal_uLong i = 0; i < m_pContentsListBox->GetEntryCount(); ++i )
    3304             :             {
    3305           0 :                 if ( m_pContentsListBox->GetEntry( 0, i ) == pActEntry )
    3306             :                 {
    3307           0 :                     nSelectionPos = i;
    3308           0 :                     break;
    3309             :                 }
    3310             :             }
    3311             : 
    3312             :             VclPtr<SvxIconSelectorDialog> pIconDialog(
    3313             :                 VclPtr<SvxIconSelectorDialog>::Create( nullptr,
    3314             :                     GetSaveInData()->GetImageManager(),
    3315           0 :                     GetSaveInData()->GetParentImageManager() ));
    3316             : 
    3317           0 :             if ( pIconDialog->Execute() == RET_OK )
    3318             :             {
    3319             :                 uno::Reference< graphic::XGraphic > newgraphic =
    3320           0 :                     pIconDialog->GetSelectedIcon();
    3321             : 
    3322           0 :                 if ( newgraphic.is() )
    3323             :                 {
    3324             :                     uno::Sequence< uno::Reference< graphic::XGraphic > >
    3325           0 :                         aGraphicSeq( 1 );
    3326             : 
    3327           0 :                     uno::Sequence< OUString > aURLSeq( 1 );
    3328           0 :                     aURLSeq[ 0 ] = pEntry->GetCommand();
    3329             : 
    3330           0 :                     if ( !pEntry->GetBackupGraphic().is() )
    3331             :                     {
    3332           0 :                         uno::Reference< graphic::XGraphic > backup;
    3333           0 :                         backup = GetGraphic(
    3334           0 :                             GetSaveInData()->GetImageManager(), aURLSeq[ 0 ] );
    3335             : 
    3336           0 :                         if ( backup.is() )
    3337             :                         {
    3338           0 :                             pEntry->SetBackupGraphic( backup );
    3339           0 :                         }
    3340             :                     }
    3341             : 
    3342           0 :                     aGraphicSeq[ 0 ] = newgraphic;
    3343             :                     try
    3344             :                     {
    3345           0 :                         GetSaveInData()->GetImageManager()->replaceImages(
    3346           0 :                             GetImageType(), aURLSeq, aGraphicSeq );
    3347             : 
    3348           0 :                         Image aImage( newgraphic );
    3349             : 
    3350           0 :                         m_pContentsListBox->GetModel()->Remove( pActEntry );
    3351             :                         SvTreeListEntry* pNewLBEntry =
    3352           0 :                             InsertEntryIntoUI( pEntry, nSelectionPos );
    3353             : 
    3354             :                         m_pContentsListBox->SetCheckButtonState( pNewLBEntry,
    3355           0 :                             pEntry->IsVisible() ?
    3356           0 :                                 SV_BUTTON_CHECKED : SV_BUTTON_UNCHECKED );
    3357             : 
    3358           0 :                         m_pContentsListBox->Select( pNewLBEntry );
    3359           0 :                         m_pContentsListBox->MakeVisible( pNewLBEntry );
    3360             : 
    3361             :                         GetSaveInData()->PersistChanges(
    3362           0 :                             GetSaveInData()->GetImageManager() );
    3363             :                     }
    3364           0 :                     catch ( uno::Exception& )
    3365             :                     {
    3366             :                         OSL_TRACE("Error replacing image");
    3367           0 :                     }
    3368           0 :                 }
    3369             :             }
    3370           0 :             break;
    3371             :         }
    3372             :         case ID_RESET_SYMBOL:
    3373             :         {
    3374           0 :             SvTreeListEntry* pActEntry = m_pContentsListBox->GetCurEntry();
    3375             :             SvxConfigEntry* pEntry =
    3376           0 :                 static_cast<SvxConfigEntry*>(pActEntry->GetUserData());
    3377             : 
    3378           0 :             sal_uInt16 nSelectionPos = 0;
    3379             : 
    3380             :             // find position of entry within the list
    3381           0 :             for ( sal_uLong i = 0; i < m_pContentsListBox->GetEntryCount(); ++i )
    3382             :             {
    3383           0 :                 if ( m_pContentsListBox->GetEntry( 0, i ) == pActEntry )
    3384             :                 {
    3385           0 :                     nSelectionPos = i;
    3386           0 :                     break;
    3387             :                 }
    3388             :             }
    3389             : 
    3390             :             uno::Reference< graphic::XGraphic > backup =
    3391           0 :                 pEntry->GetBackupGraphic();
    3392             : 
    3393             :             uno::Sequence< uno::Reference< graphic::XGraphic > >
    3394           0 :                 aGraphicSeq( 1 );
    3395           0 :             aGraphicSeq[ 0 ] = backup;
    3396             : 
    3397           0 :             uno::Sequence< OUString > aURLSeq( 1 );
    3398           0 :             aURLSeq[ 0 ] = pEntry->GetCommand();
    3399             : 
    3400             :             try
    3401             :             {
    3402           0 :                 GetSaveInData()->GetImageManager()->replaceImages(
    3403           0 :                     GetImageType(), aURLSeq, aGraphicSeq );
    3404             : 
    3405           0 :                 Image aImage( backup );
    3406           0 :                 m_pContentsListBox->GetModel()->Remove( pActEntry );
    3407             : 
    3408             :                 SvTreeListEntry* pNewLBEntry =
    3409           0 :                     InsertEntryIntoUI( pEntry, nSelectionPos );
    3410             : 
    3411             :                 m_pContentsListBox->SetCheckButtonState( pNewLBEntry,
    3412           0 :                     pEntry->IsVisible() ?
    3413           0 :                         SV_BUTTON_CHECKED : SV_BUTTON_UNCHECKED );
    3414             : 
    3415           0 :                 m_pContentsListBox->Select( pNewLBEntry );
    3416           0 :                 m_pContentsListBox->MakeVisible( pNewLBEntry );
    3417             : 
    3418             :                 // reset backup in entry
    3419             :                 pEntry->SetBackupGraphic(
    3420           0 :                     uno::Reference< graphic::XGraphic >() );
    3421             : 
    3422             :                 GetSaveInData()->PersistChanges(
    3423           0 :                     GetSaveInData()->GetImageManager() );
    3424             :             }
    3425           0 :             catch ( uno::Exception& )
    3426             :             {
    3427             :                 OSL_TRACE("Error resetting image");
    3428             :             }
    3429           0 :             break;
    3430             :         }
    3431             :     }
    3432             : 
    3433           0 :     if ( bNeedsApply )
    3434             :     {
    3435           0 :         static_cast<ToolbarSaveInData*>( GetSaveInData())->ApplyToolbar( pToolbar );
    3436           0 :         UpdateButtonStates();
    3437             :     }
    3438           0 : }
    3439             : 
    3440           0 : void SvxToolbarConfigPage::Init()
    3441             : {
    3442             :     // ensure that the UI is cleared before populating it
    3443           0 :     m_pTopLevelListBox->Clear();
    3444           0 :     m_pContentsListBox->Clear();
    3445             : 
    3446           0 :     ReloadTopLevelListBox();
    3447             : 
    3448           0 :     sal_uInt16 nPos = 0;
    3449           0 :     if ( !m_aURLToSelect.isEmpty() )
    3450             :     {
    3451           0 :         for ( sal_Int32 i = 0 ; i < m_pTopLevelListBox->GetEntryCount(); ++i )
    3452             :         {
    3453             :             SvxConfigEntry* pData =
    3454           0 :                 static_cast<SvxConfigEntry*>(m_pTopLevelListBox->GetEntryData( i ));
    3455             : 
    3456           0 :             if ( pData->GetCommand().equals( m_aURLToSelect ) )
    3457             :             {
    3458           0 :                 nPos = i;
    3459           0 :                 break;
    3460             :             }
    3461             :         }
    3462             : 
    3463             :         // in future select the default toolbar: Standard
    3464           0 :         m_aURLToSelect = ITEM_TOOLBAR_URL;
    3465           0 :         m_aURLToSelect += "standardbar";
    3466             :     }
    3467             : 
    3468           0 :     m_pTopLevelListBox->SelectEntryPos(nPos, true);
    3469           0 :     m_pTopLevelListBox->GetSelectHdl().Call(this);
    3470           0 : }
    3471             : 
    3472           0 : SaveInData* SvxToolbarConfigPage::CreateSaveInData(
    3473             :     const uno::Reference< css::ui::XUIConfigurationManager >& xCfgMgr,
    3474             :     const uno::Reference< css::ui::XUIConfigurationManager >& xParentCfgMgr,
    3475             :     const OUString& aModuleId,
    3476             :     bool bDocConfig )
    3477             : {
    3478             :     return static_cast< SaveInData* >(
    3479           0 :         new ToolbarSaveInData( xCfgMgr, xParentCfgMgr, aModuleId, bDocConfig ));
    3480             : }
    3481             : 
    3482           0 : ToolbarSaveInData::ToolbarSaveInData(
    3483             :     const uno::Reference < css::ui::XUIConfigurationManager >& xCfgMgr,
    3484             :     const uno::Reference < css::ui::XUIConfigurationManager >& xParentCfgMgr,
    3485             :     const OUString& aModuleId,
    3486             :     bool docConfig ) :
    3487             : 
    3488             :     SaveInData              ( xCfgMgr, xParentCfgMgr, aModuleId, docConfig ),
    3489             :     pRootEntry              ( NULL ),
    3490           0 :     m_aDescriptorContainer  ( ITEM_DESCRIPTOR_CONTAINER  )
    3491             : 
    3492             : {
    3493           0 :     uno::Reference<uno::XComponentContext> xContext = ::comphelper::getProcessComponentContext();
    3494             :     // Initialize the m_xPersistentWindowState variable which is used
    3495             :     // to get the default properties of system toolbars such as name
    3496           0 :     uno::Reference< container::XNameAccess > xPWSS = css::ui::theWindowStateConfiguration::get( xContext );
    3497             : 
    3498           0 :     xPWSS->getByName( aModuleId ) >>= m_xPersistentWindowState;
    3499           0 : }
    3500             : 
    3501           0 : ToolbarSaveInData::~ToolbarSaveInData()
    3502             : {
    3503           0 :     delete pRootEntry;
    3504           0 : }
    3505             : 
    3506           0 : void ToolbarSaveInData::SetSystemStyle(
    3507             :     uno::Reference< frame::XFrame > xFrame,
    3508             :     const OUString& rResourceURL,
    3509             :     sal_Int32 nStyle )
    3510             : {
    3511             :     // change the style using the API
    3512           0 :     SetSystemStyle( rResourceURL, nStyle );
    3513             : 
    3514             :     // this code is a temporary hack as the UI is not updating after
    3515             :     // changing the toolbar style via the API
    3516           0 :     uno::Reference< css::frame::XLayoutManager > xLayoutManager;
    3517           0 :     vcl::Window *window = NULL;
    3518             : 
    3519           0 :     uno::Reference< beans::XPropertySet > xPropSet( xFrame, uno::UNO_QUERY );
    3520           0 :     if ( xPropSet.is() )
    3521             :     {
    3522           0 :         uno::Any a = xPropSet->getPropertyValue(
    3523           0 :             OUString( "LayoutManager"  ) );
    3524           0 :         a >>= xLayoutManager;
    3525             :     }
    3526             : 
    3527           0 :     if ( xLayoutManager.is() )
    3528             :     {
    3529             :         uno::Reference< css::ui::XUIElement > xUIElement =
    3530           0 :             xLayoutManager->getElement( rResourceURL );
    3531             : 
    3532             :         // check reference before we call getRealInterface. The layout manager
    3533             :         // can only provide references for elements that have been created
    3534             :         // before. It's possible that the current element is not available.
    3535           0 :         uno::Reference< com::sun::star::awt::XWindow > xWindow;
    3536           0 :         if ( xUIElement.is() )
    3537           0 :             xWindow = uno::Reference< com::sun::star::awt::XWindow >(
    3538           0 :                         xUIElement->getRealInterface(), uno::UNO_QUERY );
    3539             : 
    3540           0 :         window = VCLUnoHelper::GetWindow( xWindow );
    3541             :     }
    3542             : 
    3543           0 :     if ( window != NULL && window->GetType() == WINDOW_TOOLBOX )
    3544             :     {
    3545           0 :         ToolBox* toolbox = static_cast<ToolBox*>(window);
    3546             : 
    3547           0 :         if ( nStyle == 0 )
    3548             :         {
    3549           0 :             toolbox->SetButtonType( ButtonType::SYMBOLONLY );
    3550             :         }
    3551           0 :         else if ( nStyle == 1 )
    3552             :         {
    3553           0 :             toolbox->SetButtonType( ButtonType::TEXT );
    3554             :         }
    3555           0 :         if ( nStyle == 2 )
    3556             :         {
    3557           0 :             toolbox->SetButtonType( ButtonType::SYMBOLTEXT );
    3558             :         }
    3559           0 :     }
    3560           0 : }
    3561             : 
    3562           0 : void ToolbarSaveInData::SetSystemStyle(
    3563             :     const OUString& rResourceURL,
    3564             :     sal_Int32 nStyle )
    3565             : {
    3566           0 :     if ( rResourceURL.startsWith( "private" ) &&
    3567           0 :          m_xPersistentWindowState.is() &&
    3568           0 :          m_xPersistentWindowState->hasByName( rResourceURL ) )
    3569             :     {
    3570             :         try
    3571             :         {
    3572           0 :             uno::Sequence< beans::PropertyValue > aProps;
    3573             : 
    3574           0 :             uno::Any a( m_xPersistentWindowState->getByName( rResourceURL ) );
    3575             : 
    3576           0 :             if ( a >>= aProps )
    3577             :             {
    3578           0 :                 for ( sal_Int32 i = 0; i < aProps.getLength(); ++i )
    3579             :                 {
    3580           0 :                     if ( aProps[ i ].Name == ITEM_DESCRIPTOR_STYLE )
    3581             :                     {
    3582           0 :                         aProps[ i ].Value = uno::makeAny( nStyle );
    3583           0 :                         break;
    3584             :                     }
    3585             :                 }
    3586             :             }
    3587             : 
    3588             :             uno::Reference< container::XNameReplace >
    3589           0 :                 xNameReplace( m_xPersistentWindowState, uno::UNO_QUERY );
    3590             : 
    3591           0 :             xNameReplace->replaceByName( rResourceURL, uno::makeAny( aProps ) );
    3592             :         }
    3593           0 :         catch ( uno::Exception& )
    3594             :         {
    3595             :             // do nothing, a default value is returned
    3596             :             OSL_TRACE("Exception setting toolbar style");
    3597             :         }
    3598             :     }
    3599           0 : }
    3600             : 
    3601           0 : sal_Int32 ToolbarSaveInData::GetSystemStyle( const OUString& rResourceURL )
    3602             : {
    3603           0 :     sal_Int32 result = 0;
    3604             : 
    3605           0 :     if ( rResourceURL.startsWith( "private" ) &&
    3606           0 :          m_xPersistentWindowState.is() &&
    3607           0 :          m_xPersistentWindowState->hasByName( rResourceURL ) )
    3608             :     {
    3609             :         try
    3610             :         {
    3611           0 :             uno::Sequence< beans::PropertyValue > aProps;
    3612           0 :             uno::Any a( m_xPersistentWindowState->getByName( rResourceURL ) );
    3613             : 
    3614           0 :             if ( a >>= aProps )
    3615             :             {
    3616           0 :                 for ( sal_Int32 i = 0; i < aProps.getLength(); ++i )
    3617             :                 {
    3618           0 :                     if ( aProps[ i ].Name == ITEM_DESCRIPTOR_STYLE )
    3619             :                     {
    3620           0 :                         aProps[i].Value >>= result;
    3621           0 :                         break;
    3622             :                     }
    3623             :                 }
    3624           0 :             }
    3625             :         }
    3626           0 :         catch ( uno::Exception& )
    3627             :         {
    3628             :             // do nothing, a default value is returned
    3629             :         }
    3630             :     }
    3631             : 
    3632           0 :     return result;
    3633             : }
    3634             : 
    3635           0 : OUString ToolbarSaveInData::GetSystemUIName( const OUString& rResourceURL )
    3636             : {
    3637           0 :     OUString result;
    3638             : 
    3639           0 :     if ( rResourceURL.startsWith( "private" ) &&
    3640           0 :          m_xPersistentWindowState.is() &&
    3641           0 :          m_xPersistentWindowState->hasByName( rResourceURL ) )
    3642             :     {
    3643             :         try
    3644             :         {
    3645           0 :             uno::Sequence< beans::PropertyValue > aProps;
    3646           0 :             uno::Any a( m_xPersistentWindowState->getByName( rResourceURL ) );
    3647             : 
    3648           0 :             if ( a >>= aProps )
    3649             :             {
    3650           0 :                 for ( sal_Int32 i = 0; i < aProps.getLength(); ++i )
    3651             :                 {
    3652           0 :                     if ( aProps[ i ].Name == ITEM_DESCRIPTOR_UINAME )
    3653             :                     {
    3654           0 :                         aProps[ i ].Value >>= result;
    3655             :                     }
    3656             :                 }
    3657           0 :             }
    3658             :         }
    3659           0 :         catch ( uno::Exception& )
    3660             :         {
    3661             :             // do nothing, an empty UIName will be returned
    3662             :         }
    3663             :     }
    3664             : 
    3665           0 :     if ( rResourceURL.startsWith( ".uno" ) &&
    3666           0 :          m_xCommandToLabelMap.is() &&
    3667           0 :          m_xCommandToLabelMap->hasByName( rResourceURL ) )
    3668             :     {
    3669           0 :         uno::Any a;
    3670             :         try
    3671             :         {
    3672           0 :             a = m_xCommandToLabelMap->getByName( rResourceURL );
    3673             : 
    3674           0 :             uno::Sequence< beans::PropertyValue > aPropSeq;
    3675           0 :             if ( a >>= aPropSeq )
    3676             :             {
    3677           0 :                 for ( sal_Int32 i = 0; i < aPropSeq.getLength(); ++i )
    3678             :                 {
    3679           0 :                     if ( aPropSeq[i].Name == ITEM_DESCRIPTOR_LABEL )
    3680             :                     {
    3681           0 :                         aPropSeq[i].Value >>= result;
    3682             :                     }
    3683             :                 }
    3684           0 :             }
    3685             :         }
    3686           0 :         catch ( uno::Exception& )
    3687             :         {
    3688             :             // not a system command name
    3689           0 :         }
    3690             :     }
    3691             : 
    3692           0 :     return result;
    3693             : }
    3694             : 
    3695           0 : bool EntrySort( SvxConfigEntry* a, SvxConfigEntry* b )
    3696             : {
    3697           0 :     return a->GetName().compareTo( b->GetName() ) < 0;
    3698             : }
    3699             : 
    3700           0 : SvxEntries* ToolbarSaveInData::GetEntries()
    3701             : {
    3702             :     typedef std::unordered_map<OUString, bool,
    3703             :                                OUStringHash, std::equal_to< OUString > > ToolbarInfo;
    3704             : 
    3705           0 :     ToolbarInfo aToolbarInfo;
    3706             : 
    3707           0 :     if ( pRootEntry == NULL )
    3708             :     {
    3709             : 
    3710             :         pRootEntry = new SvxConfigEntry(
    3711             :             OUString("MainToolbars"),
    3712           0 :             OUString(), true);
    3713             : 
    3714             :         uno::Sequence< uno::Sequence < beans::PropertyValue > > info =
    3715           0 :             GetConfigManager()->getUIElementsInfo(
    3716           0 :                 css::ui::UIElementType::TOOLBAR );
    3717             : 
    3718           0 :         for ( sal_Int32 i = 0; i < info.getLength(); ++i )
    3719             :         {
    3720           0 :             uno::Sequence< beans::PropertyValue > props = info[ i ];
    3721             : 
    3722           0 :             OUString url;
    3723           0 :             OUString systemname;
    3724           0 :             OUString uiname;
    3725             : 
    3726           0 :             for ( sal_Int32 j = 0; j < props.getLength(); ++j )
    3727             :             {
    3728           0 :                 if ( props[ j ].Name == ITEM_DESCRIPTOR_RESOURCEURL )
    3729             :                 {
    3730           0 :                     props[ j ].Value >>= url;
    3731           0 :                     systemname = url.copy( url.lastIndexOf( '/' ) + 1 );
    3732             :                 }
    3733           0 :                 else if ( props[ j ].Name == ITEM_DESCRIPTOR_UINAME )
    3734             :                 {
    3735           0 :                     props[ j ].Value >>= uiname;
    3736             :                 }
    3737             :             }
    3738             : 
    3739             :             try
    3740             :             {
    3741             :                 uno::Reference< container::XIndexAccess > xToolbarSettings =
    3742           0 :                     GetConfigManager()->getSettings( url, sal_False );
    3743             : 
    3744           0 :                 if ( uiname.isEmpty() )
    3745             :                 {
    3746             :                     // try to get the name from m_xPersistentWindowState
    3747           0 :                     uiname = GetSystemUIName( url );
    3748             : 
    3749           0 :                     if ( uiname.isEmpty() )
    3750             :                     {
    3751           0 :                         uiname = systemname;
    3752             :                     }
    3753             :                 }
    3754             : 
    3755             :                 SvxConfigEntry* pEntry = new SvxConfigEntry(
    3756           0 :                     uiname, url, true );
    3757             : 
    3758           0 :                 pEntry->SetMain( true );
    3759           0 :                 pEntry->SetStyle( GetSystemStyle( url ) );
    3760             : 
    3761             : 
    3762             :                 // insert into std::unordered_map to filter duplicates from the parent
    3763           0 :                 aToolbarInfo.insert( ToolbarInfo::value_type( systemname, true ));
    3764             : 
    3765           0 :                 OUString custom(CUSTOM_TOOLBAR_STR);
    3766           0 :                 if ( systemname.startsWith( custom ) )
    3767             :                 {
    3768           0 :                     pEntry->SetUserDefined( true );
    3769             :                 }
    3770             :                 else
    3771             :                 {
    3772           0 :                     pEntry->SetUserDefined( false );
    3773             :                 }
    3774             : 
    3775           0 :                 pRootEntry->GetEntries()->push_back( pEntry );
    3776             : 
    3777           0 :                 LoadToolbar( xToolbarSettings, pEntry );
    3778             :             }
    3779           0 :             catch ( container::NoSuchElementException& )
    3780             :             {
    3781             :                 // TODO, handle resourceURL with no settings
    3782             :             }
    3783           0 :         }
    3784             : 
    3785           0 :         uno::Reference< css::ui::XUIConfigurationManager > xParentCfgMgr = GetParentConfigManager();
    3786           0 :         if ( xParentCfgMgr.is() )
    3787             :         {
    3788             :             // Retrieve also the parent toolbars to make it possible
    3789             :             // to configure module toolbars and save them into the document
    3790             :             // config manager.
    3791             :             uno::Sequence< uno::Sequence < beans::PropertyValue > > info_ =
    3792           0 :                 xParentCfgMgr->getUIElementsInfo(
    3793           0 :                     css::ui::UIElementType::TOOLBAR );
    3794             : 
    3795           0 :             for ( sal_Int32 i = 0; i < info_.getLength(); ++i )
    3796             :             {
    3797           0 :                 uno::Sequence< beans::PropertyValue > props = info_[ i ];
    3798             : 
    3799           0 :                 OUString url;
    3800           0 :                 OUString systemname;
    3801           0 :                 OUString uiname;
    3802             : 
    3803           0 :                 for ( sal_Int32 j = 0; j < props.getLength(); ++j )
    3804             :                 {
    3805           0 :                     if ( props[ j ].Name == ITEM_DESCRIPTOR_RESOURCEURL )
    3806             :                     {
    3807           0 :                         props[ j ].Value >>= url;
    3808           0 :                         systemname = url.copy( url.lastIndexOf( '/' ) + 1 );
    3809             :                     }
    3810           0 :                     else if ( props[ j ].Name == ITEM_DESCRIPTOR_UINAME )
    3811             :                     {
    3812           0 :                         props[ j ].Value >>= uiname;
    3813             :                     }
    3814             :                 }
    3815             : 
    3816             :                 // custom toolbars of the parent are not visible in the document layer
    3817           0 :                 OUString custom(CUSTOM_TOOLBAR_STR);
    3818           0 :                 if ( systemname.startsWith( custom ) )
    3819           0 :                     continue;
    3820             : 
    3821             :                 // check if toolbar is already in the document layer
    3822           0 :                 ToolbarInfo::const_iterator pIter = aToolbarInfo.find( systemname );
    3823           0 :                 if ( pIter == aToolbarInfo.end() )
    3824             :                 {
    3825           0 :                     aToolbarInfo.insert( ToolbarInfo::value_type( systemname, true ));
    3826             : 
    3827             :                     try
    3828             :                     {
    3829             :                         uno::Reference< container::XIndexAccess > xToolbarSettings =
    3830           0 :                             xParentCfgMgr->getSettings( url, sal_False );
    3831             : 
    3832           0 :                         if ( uiname.isEmpty() )
    3833             :                         {
    3834             :                             // try to get the name from m_xPersistentWindowState
    3835           0 :                             uiname = GetSystemUIName( url );
    3836             : 
    3837           0 :                             if ( uiname.isEmpty() )
    3838             :                             {
    3839           0 :                                 uiname = systemname;
    3840             :                             }
    3841             :                         }
    3842             : 
    3843             :                         SvxConfigEntry* pEntry = new SvxConfigEntry(
    3844           0 :                             uiname, url, true, true );
    3845             : 
    3846           0 :                         pEntry->SetMain( true );
    3847           0 :                         pEntry->SetStyle( GetSystemStyle( url ) );
    3848             : 
    3849           0 :                         if ( systemname.startsWith( custom ) )
    3850             :                         {
    3851           0 :                             pEntry->SetUserDefined( true );
    3852             :                         }
    3853             :                         else
    3854             :                         {
    3855           0 :                             pEntry->SetUserDefined( false );
    3856             :                         }
    3857             : 
    3858           0 :                         pRootEntry->GetEntries()->push_back( pEntry );
    3859             : 
    3860           0 :                         LoadToolbar( xToolbarSettings, pEntry );
    3861             :                     }
    3862           0 :                     catch ( container::NoSuchElementException& )
    3863             :                     {
    3864             :                         // TODO, handle resourceURL with no settings
    3865             :                     }
    3866             :                 }
    3867           0 :             }
    3868             :         }
    3869             : 
    3870           0 :         std::sort( GetEntries()->begin(), GetEntries()->end(), EntrySort );
    3871             :     }
    3872             : 
    3873           0 :     return pRootEntry->GetEntries();
    3874             : }
    3875             : 
    3876             : void
    3877           0 : ToolbarSaveInData::SetEntries( SvxEntries* pNewEntries )
    3878             : {
    3879             :     // delete old menu hierarchy first
    3880           0 :     delete pRootEntry->GetEntries();
    3881             : 
    3882             :     // now set new menu hierarchy
    3883           0 :     pRootEntry->SetEntries( pNewEntries );
    3884           0 : }
    3885             : 
    3886             : bool
    3887           0 : ToolbarSaveInData::HasURL( const OUString& rURL )
    3888             : {
    3889           0 :     SvxEntries::const_iterator iter = GetEntries()->begin();
    3890           0 :     SvxEntries::const_iterator end = GetEntries()->end();
    3891             : 
    3892           0 :     while ( iter != end )
    3893             :     {
    3894           0 :         SvxConfigEntry* pEntry = *iter;
    3895             : 
    3896           0 :         if ( pEntry->GetCommand().equals( rURL ) )
    3897             :         {
    3898           0 :             if ( pEntry->IsParentData() )
    3899           0 :                 return false;
    3900             :             else
    3901           0 :                 return true;
    3902             :         }
    3903             : 
    3904           0 :         ++iter;
    3905             :     }
    3906           0 :     return false;
    3907             : }
    3908             : 
    3909           0 : bool ToolbarSaveInData::HasSettings()
    3910             : {
    3911             :     // return true if there is at least one toolbar entry
    3912           0 :     if ( GetEntries()->size() > 0 )
    3913             :     {
    3914           0 :         return true;
    3915             :     }
    3916           0 :     return false;
    3917             : }
    3918             : 
    3919           0 : void ToolbarSaveInData::Reset()
    3920             : {
    3921           0 :     SvxEntries::const_iterator toolbars = GetEntries()->begin();
    3922           0 :     SvxEntries::const_iterator end = GetEntries()->end();
    3923             : 
    3924             :     // reset each toolbar by calling removeSettings for its toolbar URL
    3925           0 :     for ( ; toolbars != end; ++toolbars )
    3926             :     {
    3927           0 :         SvxConfigEntry* pToolbar = *toolbars;
    3928             : 
    3929             :         try
    3930             :         {
    3931           0 :             OUString url = pToolbar->GetCommand();
    3932           0 :             GetConfigManager()->removeSettings( url );
    3933             :         }
    3934           0 :         catch ( uno::Exception& )
    3935             :         {
    3936             :             // error occurred removing the settings
    3937             :             // TODO - add error dialog in future?
    3938             :         }
    3939             :     }
    3940             : 
    3941             :     // persist changes to toolbar storage
    3942           0 :     PersistChanges( GetConfigManager() );
    3943             : 
    3944             :     // now delete the root SvxConfigEntry the next call to GetEntries()
    3945             :     // causes it to be reinitialised
    3946           0 :     delete pRootEntry;
    3947           0 :     pRootEntry = NULL;
    3948             : 
    3949             :     // reset all icons to default
    3950             :     try
    3951             :     {
    3952           0 :         GetImageManager()->reset();
    3953           0 :         PersistChanges( GetImageManager() );
    3954             :     }
    3955           0 :     catch ( uno::Exception& )
    3956             :     {
    3957             :         OSL_TRACE("Error resetting all icons when resetting toolbars");
    3958             :     }
    3959           0 : }
    3960             : 
    3961           0 : bool ToolbarSaveInData::Apply()
    3962             : {
    3963             :     // toolbar changes are instantly applied
    3964           0 :     return false;
    3965             : }
    3966             : 
    3967           0 : void ToolbarSaveInData::ApplyToolbar(
    3968             :     uno::Reference< container::XIndexContainer >& rToolbarBar,
    3969             :     uno::Reference< lang::XSingleComponentFactory >& rFactory,
    3970             :     SvxConfigEntry* pToolbarData )
    3971             : {
    3972           0 :     uno::Reference<uno::XComponentContext> xContext = ::comphelper::getProcessComponentContext();
    3973             : 
    3974           0 :     SvxEntries::const_iterator iter = pToolbarData->GetEntries()->begin();
    3975           0 :     SvxEntries::const_iterator end = pToolbarData->GetEntries()->end();
    3976             : 
    3977           0 :     for ( ; iter != end; ++iter )
    3978             :     {
    3979           0 :         SvxConfigEntry* pEntry = *iter;
    3980             : 
    3981           0 :         if ( pEntry->IsPopup() )
    3982             :         {
    3983             :             uno::Sequence< beans::PropertyValue > aPropValueSeq =
    3984           0 :                 ConvertToolbarEntry( m_xCommandToLabelMap, pEntry );
    3985             : 
    3986             :             uno::Reference< container::XIndexContainer > xSubMenuBar(
    3987           0 :                 rFactory->createInstanceWithContext( xContext ),
    3988           0 :                     uno::UNO_QUERY );
    3989             : 
    3990           0 :             sal_Int32 nIndex = aPropValueSeq.getLength();
    3991           0 :             aPropValueSeq.realloc( nIndex + 1 );
    3992           0 :             aPropValueSeq[nIndex].Name = m_aDescriptorContainer;
    3993           0 :             aPropValueSeq[nIndex].Value <<= xSubMenuBar;
    3994           0 :             rToolbarBar->insertByIndex(
    3995           0 :                 rToolbarBar->getCount(), uno::makeAny( aPropValueSeq ));
    3996             : 
    3997           0 :             ApplyToolbar( xSubMenuBar, rFactory, pEntry );
    3998             :         }
    3999           0 :         else if ( pEntry->IsSeparator() )
    4000             :         {
    4001           0 :             rToolbarBar->insertByIndex(
    4002           0 :                 rToolbarBar->getCount(), uno::makeAny( m_aSeparatorSeq ));
    4003             :         }
    4004             :         else
    4005             :         {
    4006             :             uno::Sequence< beans::PropertyValue > aPropValueSeq =
    4007           0 :                 ConvertToolbarEntry( m_xCommandToLabelMap, pEntry );
    4008             : 
    4009           0 :             rToolbarBar->insertByIndex(
    4010           0 :                 rToolbarBar->getCount(), uno::makeAny( aPropValueSeq ));
    4011             :         }
    4012           0 :     }
    4013           0 : }
    4014             : 
    4015           0 : void ToolbarSaveInData::ApplyToolbar( SvxConfigEntry* pToolbar )
    4016             : {
    4017             :     // Apply new toolbar structure to our settings container
    4018             :     uno::Reference< container::XIndexAccess > xSettings(
    4019           0 :         GetConfigManager()->createSettings(), uno::UNO_QUERY );
    4020             : 
    4021             :     uno::Reference< container::XIndexContainer > xIndexContainer (
    4022           0 :         xSettings, uno::UNO_QUERY );
    4023             : 
    4024             :     uno::Reference< lang::XSingleComponentFactory > xFactory (
    4025           0 :         xSettings, uno::UNO_QUERY );
    4026             : 
    4027           0 :     ApplyToolbar( xIndexContainer, xFactory, pToolbar );
    4028             : 
    4029             :     uno::Reference< beans::XPropertySet > xProps(
    4030           0 :         xSettings, uno::UNO_QUERY );
    4031             : 
    4032           0 :     if ( pToolbar->IsUserDefined() )
    4033             :     {
    4034           0 :         xProps->setPropertyValue(
    4035             :             OUString(ITEM_DESCRIPTOR_UINAME ),
    4036           0 :             uno::makeAny( OUString( pToolbar->GetName() ) ) );
    4037             :     }
    4038             : 
    4039             :     try
    4040             :     {
    4041           0 :         if ( GetConfigManager()->hasSettings( pToolbar->GetCommand() ) )
    4042             :         {
    4043           0 :             GetConfigManager()->replaceSettings(
    4044           0 :                 pToolbar->GetCommand(), xSettings );
    4045             :         }
    4046             :         else
    4047             :         {
    4048           0 :             GetConfigManager()->insertSettings(
    4049           0 :                 pToolbar->GetCommand(), xSettings );
    4050           0 :             if ( pToolbar->IsParentData() )
    4051           0 :                 pToolbar->SetParentData( false );
    4052             :         }
    4053             :     }
    4054           0 :     catch ( container::NoSuchElementException& )
    4055             :     {
    4056             :         OSL_TRACE("caught container::NoSuchElementException saving settings");
    4057             :     }
    4058           0 :     catch ( com::sun::star::io::IOException& )
    4059             :     {
    4060             :         OSL_TRACE("caught IOException saving settings");
    4061             :     }
    4062           0 :     catch ( com::sun::star::uno::Exception& )
    4063             :     {
    4064             :         OSL_TRACE("caught some other exception saving settings");
    4065             :     }
    4066             : 
    4067           0 :     PersistChanges( GetConfigManager() );
    4068           0 : }
    4069             : 
    4070           0 : void ToolbarSaveInData::CreateToolbar( SvxConfigEntry* pToolbar )
    4071             : {
    4072             :     // show the new toolbar in the UI also
    4073             :     uno::Reference< container::XIndexAccess >
    4074           0 :         xSettings( GetConfigManager()->createSettings(), uno::UNO_QUERY );
    4075             : 
    4076             :     uno::Reference< container::XIndexContainer >
    4077           0 :         xIndexContainer ( xSettings, uno::UNO_QUERY );
    4078             : 
    4079             :     uno::Reference< beans::XPropertySet >
    4080           0 :         xPropertySet( xSettings, uno::UNO_QUERY );
    4081             : 
    4082           0 :     xPropertySet->setPropertyValue(
    4083             :         OUString(ITEM_DESCRIPTOR_UINAME ),
    4084           0 :             uno::makeAny( pToolbar->GetName() ) );
    4085             : 
    4086             :     try
    4087             :     {
    4088           0 :         GetConfigManager()->insertSettings( pToolbar->GetCommand(), xSettings );
    4089             :     }
    4090           0 :     catch ( container::ElementExistException& )
    4091             :     {
    4092             :         OSL_TRACE("caught ElementExistsException saving settings");
    4093             :     }
    4094           0 :     catch ( com::sun::star::lang::IllegalArgumentException& )
    4095             :     {
    4096             :         OSL_TRACE("caught IOException saving settings");
    4097             :     }
    4098           0 :     catch ( com::sun::star::lang::IllegalAccessException& )
    4099             :     {
    4100             :         OSL_TRACE("caught IOException saving settings");
    4101             :     }
    4102           0 :     catch ( com::sun::star::uno::Exception& )
    4103             :     {
    4104             :         OSL_TRACE("caught some other exception saving settings");
    4105             :     }
    4106             : 
    4107           0 :     GetEntries()->push_back( pToolbar );
    4108             : 
    4109           0 :     PersistChanges( GetConfigManager() );
    4110           0 : }
    4111             : 
    4112           0 : void ToolbarSaveInData::RemoveToolbar( SvxConfigEntry* pToolbar )
    4113             : {
    4114             :     try
    4115             :     {
    4116           0 :         OUString url = pToolbar->GetCommand();
    4117           0 :         GetConfigManager()->removeSettings( url );
    4118           0 :         RemoveEntry( GetEntries(), pToolbar );
    4119           0 :         delete pToolbar;
    4120             : 
    4121           0 :         PersistChanges( GetConfigManager() );
    4122             : 
    4123             :         // remove the persistent window state data
    4124             :         css::uno::Reference< css::container::XNameContainer > xNameContainer(
    4125           0 :             m_xPersistentWindowState, css::uno::UNO_QUERY_THROW );
    4126             : 
    4127           0 :         xNameContainer->removeByName( url );
    4128             :     }
    4129           0 :     catch ( uno::Exception& )
    4130             :     {
    4131             :         // error occurred removing the settings
    4132             :     }
    4133           0 : }
    4134             : 
    4135           0 : void ToolbarSaveInData::RestoreToolbar( SvxConfigEntry* pToolbar )
    4136             : {
    4137           0 :     OUString url = pToolbar->GetCommand();
    4138             : 
    4139             :     // Restore of toolbar is done by removing it from
    4140             :     // it's configuration manager and then getting it again
    4141           0 :     bool bParentToolbar = pToolbar->IsParentData();
    4142             : 
    4143             :     // Cannot restore parent toolbar
    4144           0 :     if ( bParentToolbar )
    4145           0 :         return;
    4146             : 
    4147             :     try
    4148             :     {
    4149           0 :         GetConfigManager()->removeSettings( url );
    4150           0 :         pToolbar->GetEntries()->clear();
    4151           0 :         PersistChanges( GetConfigManager() );
    4152             :     }
    4153           0 :     catch ( uno::Exception& )
    4154             :     {
    4155             :         // if an error occurs removing the settings then just return
    4156           0 :         return;
    4157             :     }
    4158             : 
    4159             :     // Now reload the toolbar settings
    4160             :     try
    4161             :     {
    4162           0 :         uno::Reference< container::XIndexAccess > xToolbarSettings;
    4163           0 :         if ( IsDocConfig() )
    4164             :         {
    4165           0 :             xToolbarSettings = GetParentConfigManager()->getSettings( url, sal_False );
    4166           0 :             pToolbar->SetParentData( true );
    4167             :         }
    4168             :         else
    4169           0 :             xToolbarSettings = GetConfigManager()->getSettings( url, sal_False );
    4170             : 
    4171           0 :         LoadToolbar( xToolbarSettings, pToolbar );
    4172             : 
    4173             :         // After reloading, ensure that the icon is reset of each entry
    4174             :         // in the toolbar
    4175           0 :         SvxEntries::const_iterator iter = pToolbar->GetEntries()->begin();
    4176           0 :         uno::Sequence< OUString > aURLSeq( 1 );
    4177           0 :         for ( ; iter != pToolbar->GetEntries()->end(); ++iter )
    4178             :         {
    4179           0 :             SvxConfigEntry* pEntry = *iter;
    4180           0 :             aURLSeq[ 0 ] = pEntry->GetCommand();
    4181             : 
    4182             :             try
    4183             :             {
    4184           0 :                 GetImageManager()->removeImages( GetImageType(), aURLSeq );
    4185             :             }
    4186           0 :                catch ( uno::Exception& )
    4187             :                {
    4188             :                 OSL_TRACE("Error restoring icon when resetting toolbar");
    4189             :                }
    4190             :         }
    4191           0 :         PersistChanges( GetImageManager() );
    4192             :     }
    4193           0 :     catch ( container::NoSuchElementException& )
    4194             :     {
    4195             :         // cannot find the resource URL after removing it
    4196             :         // so no entry will appear in the toolbar list
    4197           0 :     }
    4198             : }
    4199             : 
    4200           0 : bool ToolbarSaveInData::LoadToolbar(
    4201             :     const uno::Reference< container::XIndexAccess >& xToolbarSettings,
    4202             :     SvxConfigEntry* pParentData )
    4203             : {
    4204           0 :     SvxEntries*         pEntries            = pParentData->GetEntries();
    4205             : 
    4206           0 :     for ( sal_Int32 nIndex = 0; nIndex < xToolbarSettings->getCount(); ++nIndex )
    4207             :     {
    4208           0 :         uno::Reference< container::XIndexAccess >   xSubMenu;
    4209           0 :         OUString                aCommandURL;
    4210           0 :         OUString                aLabel;
    4211             :         bool                bIsVisible;
    4212             :         sal_Int32               nStyle;
    4213             : 
    4214           0 :         sal_uInt16 nType( css::ui::ItemType::DEFAULT );
    4215             : 
    4216             :         bool bItem = GetToolbarItemData( xToolbarSettings, nIndex, aCommandURL,
    4217           0 :             aLabel, nType, bIsVisible, nStyle, xSubMenu );
    4218             : 
    4219           0 :         if ( bItem )
    4220             :         {
    4221           0 :             bool bIsUserDefined = true;
    4222           0 :             if ( nType == css::ui::ItemType::DEFAULT )
    4223             :             {
    4224           0 :                 uno::Any a;
    4225             :                 try
    4226             :                 {
    4227           0 :                     a = m_xCommandToLabelMap->getByName( aCommandURL );
    4228           0 :                     bIsUserDefined = false;
    4229             :                 }
    4230           0 :                 catch ( container::NoSuchElementException& )
    4231             :                 {
    4232           0 :                     bIsUserDefined = true;
    4233             :                 }
    4234             : 
    4235             :                 // If custom label not set retrieve it from the command
    4236             :                 // to info service
    4237           0 :                 if ( aLabel.equals( OUString() ) )
    4238             :                 {
    4239           0 :                     uno::Sequence< beans::PropertyValue > aPropSeq;
    4240           0 :                     if ( a >>= aPropSeq )
    4241             :                     {
    4242           0 :                         for ( sal_Int32 i = 0; i < aPropSeq.getLength(); ++i )
    4243             :                         {
    4244           0 :                             if ( aPropSeq[i].Name == ITEM_DESCRIPTOR_LABEL )
    4245             :                             {
    4246           0 :                                 aPropSeq[i].Value >>= aLabel;
    4247           0 :                                 break;
    4248             :                             }
    4249             :                         }
    4250           0 :                     }
    4251             :                 }
    4252             : 
    4253           0 :                 if ( xSubMenu.is() )
    4254             :                 {
    4255             :                     SvxConfigEntry* pEntry = new SvxConfigEntry(
    4256           0 :                         aLabel, aCommandURL, true );
    4257             : 
    4258           0 :                     pEntry->SetUserDefined( bIsUserDefined );
    4259           0 :                     pEntry->SetVisible( bIsVisible );
    4260             : 
    4261           0 :                     pEntries->push_back( pEntry );
    4262             : 
    4263           0 :                     LoadToolbar( xSubMenu, pEntry );
    4264             :                 }
    4265             :                 else
    4266             :                 {
    4267             :                     SvxConfigEntry* pEntry = new SvxConfigEntry(
    4268           0 :                         aLabel, aCommandURL, false );
    4269           0 :                     pEntry->SetUserDefined( bIsUserDefined );
    4270           0 :                     pEntry->SetVisible( bIsVisible );
    4271           0 :                     pEntry->SetStyle( nStyle );
    4272           0 :                     pEntries->push_back( pEntry );
    4273           0 :                 }
    4274             :             }
    4275             :             else
    4276             :             {
    4277           0 :                 SvxConfigEntry* pEntry = new SvxConfigEntry;
    4278           0 :                 pEntry->SetUserDefined( bIsUserDefined );
    4279           0 :                 pEntries->push_back( pEntry );
    4280             :             }
    4281             :         }
    4282           0 :     }
    4283             : 
    4284           0 :     return true;
    4285             : }
    4286             : 
    4287           0 : IMPL_LINK( SvxToolbarConfigPage, SelectToolbarEntry, Control *, pBox )
    4288             : {
    4289             :     (void)pBox;
    4290           0 :     UpdateButtonStates();
    4291           0 :     return 1;
    4292             : }
    4293             : 
    4294           0 : void SvxToolbarConfigPage::UpdateButtonStates()
    4295             : {
    4296           0 :     PopupMenu* pPopup = m_pModifyCommandButton->GetPopupMenu();
    4297           0 :     pPopup->EnableItem( ID_RENAME, false );
    4298           0 :     pPopup->EnableItem( ID_DELETE, false );
    4299           0 :     pPopup->EnableItem( ID_BEGIN_GROUP, false );
    4300           0 :     pPopup->EnableItem( ID_DEFAULT_COMMAND, false );
    4301           0 :     pPopup->EnableItem( ID_ICON_ONLY, false );
    4302           0 :     pPopup->EnableItem( ID_ICON_AND_TEXT, false );
    4303           0 :     pPopup->EnableItem( ID_TEXT_ONLY, false );
    4304           0 :     pPopup->EnableItem( ID_CHANGE_SYMBOL, false );
    4305           0 :     pPopup->EnableItem( ID_RESET_SYMBOL, false );
    4306             : 
    4307           0 :     m_pDescriptionField->SetText("");
    4308             : 
    4309           0 :     SvTreeListEntry* selection = m_pContentsListBox->GetCurEntry();
    4310           0 :     if ( m_pContentsListBox->GetEntryCount() == 0 || selection == NULL )
    4311             :     {
    4312           0 :         return;
    4313             :     }
    4314             : 
    4315           0 :     SvxConfigEntry* pEntryData = static_cast<SvxConfigEntry*>(selection->GetUserData());
    4316           0 :     if ( pEntryData->IsSeparator() )
    4317           0 :         pPopup->EnableItem( ID_DELETE, true );
    4318             :     else
    4319             :     {
    4320           0 :         pPopup->EnableItem( ID_BEGIN_GROUP, true );
    4321           0 :         pPopup->EnableItem( ID_DELETE, true );
    4322           0 :         pPopup->EnableItem( ID_RENAME, true );
    4323           0 :         pPopup->EnableItem( ID_ICON_ONLY, true );
    4324           0 :         pPopup->EnableItem( ID_ICON_AND_TEXT, true );
    4325           0 :         pPopup->EnableItem( ID_TEXT_ONLY, true );
    4326           0 :         pPopup->EnableItem( ID_CHANGE_SYMBOL, true );
    4327             : 
    4328           0 :         if ( !pEntryData->IsUserDefined() )
    4329           0 :             pPopup->EnableItem( ID_DEFAULT_COMMAND, true );
    4330             : 
    4331           0 :         if ( pEntryData->IsIconModified() )
    4332           0 :             pPopup->EnableItem( ID_RESET_SYMBOL, true );
    4333             : 
    4334           0 :         m_pDescriptionField->SetText(pEntryData->GetHelpText());
    4335             :     }
    4336             : }
    4337             : 
    4338           0 : short SvxToolbarConfigPage::QueryReset()
    4339             : {
    4340           0 :     OUString msg = CUI_RES( RID_SVXSTR_CONFIRM_TOOLBAR_RESET );
    4341             : 
    4342             :     OUString saveInName = m_pSaveInListBox->GetEntry(
    4343           0 :         m_pSaveInListBox->GetSelectEntryPos() );
    4344             : 
    4345           0 :     OUString label = replaceSaveInName( msg, saveInName );
    4346             : 
    4347           0 :     ScopedVclPtrInstance< QueryBox > qbox( this, WB_YES_NO, label );
    4348             : 
    4349           0 :     return qbox->Execute();
    4350             : }
    4351             : 
    4352           0 : IMPL_LINK( SvxToolbarConfigPage, SelectToolbar, ListBox *, pBox )
    4353             : {
    4354             :     (void)pBox;
    4355             : 
    4356           0 :     m_pContentsListBox->Clear();
    4357             : 
    4358           0 :     SvxConfigEntry* pToolbar = GetTopLevelSelection();
    4359           0 :     if ( pToolbar == NULL )
    4360             :     {
    4361           0 :         m_pModifyTopLevelButton->Enable( false );
    4362           0 :         m_pModifyCommandButton->Enable( false );
    4363           0 :         m_pAddCommandsButton->Enable( false );
    4364             : 
    4365           0 :         return 0;
    4366             :     }
    4367             : 
    4368           0 :     m_pModifyTopLevelButton->Enable( true );
    4369           0 :     m_pModifyCommandButton->Enable( true );
    4370           0 :     m_pAddCommandsButton->Enable( true );
    4371             : 
    4372           0 :     PopupMenu* pPopup = m_pModifyTopLevelButton->GetPopupMenu();
    4373             : 
    4374           0 :     pPopup->EnableItem( ID_DELETE, pToolbar->IsDeletable() );
    4375           0 :     pPopup->EnableItem( ID_RENAME, pToolbar->IsRenamable() );
    4376           0 :     pPopup->EnableItem( ID_DEFAULT_STYLE, !pToolbar->IsRenamable() );
    4377             : 
    4378           0 :     switch( pToolbar->GetStyle() )
    4379             :     {
    4380             :         case 0:
    4381             :         {
    4382           0 :             pPopup->CheckItem( ID_ICONS_ONLY );
    4383           0 :             break;
    4384             :         }
    4385             :         case 1:
    4386             :         {
    4387           0 :             pPopup->CheckItem( ID_TEXT_ONLY );
    4388           0 :             break;
    4389             :         }
    4390             :         case 2:
    4391             :         {
    4392           0 :             pPopup->CheckItem( ID_ICONS_AND_TEXT );
    4393           0 :             break;
    4394             :         }
    4395             :     }
    4396             : 
    4397           0 :     SvxEntries* pEntries = pToolbar->GetEntries();
    4398           0 :     SvxEntries::const_iterator iter = pEntries->begin();
    4399             : 
    4400           0 :     for ( ; iter != pEntries->end(); ++iter )
    4401             :     {
    4402           0 :         SvxConfigEntry* pEntry = *iter;
    4403             : 
    4404           0 :         SvTreeListEntry* pNewLBEntry = InsertEntryIntoUI( pEntry );
    4405             : 
    4406           0 :         if(pEntry->IsSeparator())
    4407           0 :             m_pContentsListBox->SetCheckButtonInvisible( pNewLBEntry );
    4408             : 
    4409           0 :         if (pEntry->IsBinding())
    4410             :         {
    4411             :             m_pContentsListBox->SetCheckButtonState( pNewLBEntry,
    4412           0 :                 pEntry->IsVisible() ? SV_BUTTON_CHECKED : SV_BUTTON_UNCHECKED );
    4413             :         }
    4414             :         else
    4415             :         {
    4416             :             m_pContentsListBox->SetCheckButtonState(
    4417           0 :                 pNewLBEntry, SV_BUTTON_TRISTATE );
    4418             :         }
    4419             :     }
    4420             : 
    4421           0 :     UpdateButtonStates();
    4422             : 
    4423           0 :     return 0;
    4424             : }
    4425             : 
    4426           0 : IMPL_LINK( SvxToolbarConfigPage, NewToolbarHdl, Button *, pButton )
    4427             : {
    4428             :     (void)pButton;
    4429             : 
    4430           0 :     OUString prefix = CUI_RES( RID_SVXSTR_NEW_TOOLBAR );
    4431             : 
    4432             :     OUString aNewName =
    4433           0 :         generateCustomName( prefix, GetSaveInData()->GetEntries() );
    4434             : 
    4435             :     OUString aNewURL =
    4436           0 :         generateCustomURL( GetSaveInData()->GetEntries() );
    4437             : 
    4438           0 :     VclPtrInstance< SvxNewToolbarDialog > pNameDialog( nullptr, aNewName );
    4439             : 
    4440             :     sal_uInt16 nInsertPos;
    4441           0 :     for ( sal_Int32 i = 0 ; i < m_pSaveInListBox->GetEntryCount(); ++i )
    4442             :     {
    4443             :         SaveInData* pData =
    4444           0 :             static_cast<SaveInData*>(m_pSaveInListBox->GetEntryData( i ));
    4445             : 
    4446           0 :         nInsertPos = pNameDialog->m_pSaveInListBox->InsertEntry(
    4447           0 :             m_pSaveInListBox->GetEntry( i ) );
    4448             : 
    4449           0 :         pNameDialog->m_pSaveInListBox->SetEntryData( nInsertPos, pData );
    4450             :     }
    4451             : 
    4452           0 :     pNameDialog->m_pSaveInListBox->SelectEntryPos(
    4453           0 :         m_pSaveInListBox->GetSelectEntryPos(), true );
    4454             : 
    4455           0 :     if ( pNameDialog->Execute() == RET_OK )
    4456             :     {
    4457           0 :         aNewName = pNameDialog->GetName();
    4458             : 
    4459           0 :         nInsertPos = pNameDialog->m_pSaveInListBox->GetSelectEntryPos();
    4460             : 
    4461             :         ToolbarSaveInData* pData = static_cast<ToolbarSaveInData*>(
    4462           0 :             pNameDialog->m_pSaveInListBox->GetEntryData( nInsertPos ));
    4463             : 
    4464           0 :         if ( GetSaveInData() != pData )
    4465             :         {
    4466           0 :             m_pSaveInListBox->SelectEntryPos( nInsertPos, true );
    4467           0 :             m_pSaveInListBox->GetSelectHdl().Call(this);
    4468             :         }
    4469             : 
    4470             :         SvxConfigEntry* pToolbar =
    4471           0 :             new SvxConfigEntry( aNewName, aNewURL, true );
    4472             : 
    4473           0 :         pToolbar->SetUserDefined( true );
    4474           0 :         pToolbar->SetMain( true );
    4475             : 
    4476           0 :         pData->CreateToolbar( pToolbar );
    4477             : 
    4478           0 :         nInsertPos = m_pTopLevelListBox->InsertEntry( pToolbar->GetName() );
    4479           0 :         m_pTopLevelListBox->SetEntryData( nInsertPos, pToolbar );
    4480           0 :         m_pTopLevelListBox->SelectEntryPos( nInsertPos, true );
    4481           0 :         m_pTopLevelListBox->GetSelectHdl().Call(this);
    4482             : 
    4483           0 :         pData->SetModified( true );
    4484             :     }
    4485             : 
    4486           0 :     return 0;
    4487             : }
    4488             : 
    4489           0 : IMPL_LINK( SvxToolbarConfigPage, AddCommandsHdl, Button *, pButton )
    4490             : {
    4491             :     (void)pButton;
    4492             : 
    4493           0 :     if ( m_pSelectorDlg == nullptr )
    4494             :     {
    4495             :         // Create Script Selector which shows slot commands
    4496           0 :         m_pSelectorDlg = VclPtr<SvxScriptSelectorDialog>::Create( this, true, m_xFrame );
    4497             : 
    4498             :         // Position the Script Selector over the Add button so it is
    4499             :         // beside the menu contents list and does not obscure it
    4500           0 :         m_pSelectorDlg->SetPosPixel( m_pAddCommandsButton->GetPosPixel() );
    4501             : 
    4502             :         m_pSelectorDlg->SetAddHdl(
    4503           0 :             LINK( this, SvxToolbarConfigPage, AddFunctionHdl ) );
    4504             :     }
    4505             : 
    4506           0 :     m_pSelectorDlg->SetImageProvider( GetSaveInData() );
    4507             : 
    4508           0 :     m_pSelectorDlg->Show();
    4509           0 :     return 1;
    4510             : }
    4511             : 
    4512           0 : IMPL_LINK( SvxToolbarConfigPage, AddFunctionHdl,
    4513             :     SvxScriptSelectorDialog *, pDialog )
    4514             : {
    4515             :     (void)pDialog;
    4516             : 
    4517           0 :     AddFunction();
    4518             : 
    4519           0 :     return 0;
    4520             : }
    4521             : 
    4522           0 : SvTreeListEntry* SvxToolbarConfigPage::AddFunction(
    4523             :     SvTreeListEntry* pTarget, bool bFront, bool bAllowDuplicates )
    4524             : {
    4525             :     SvTreeListEntry* pNewLBEntry =
    4526           0 :         SvxConfigPage::AddFunction( pTarget, bFront, bAllowDuplicates );
    4527             : 
    4528           0 :     SvxConfigEntry* pEntry = static_cast<SvxConfigEntry*>(pNewLBEntry->GetUserData());
    4529             : 
    4530           0 :     if ( pEntry->IsBinding() )
    4531             :     {
    4532           0 :         pEntry->SetVisible( true );
    4533             :         m_pContentsListBox->SetCheckButtonState(
    4534           0 :             pNewLBEntry, SV_BUTTON_CHECKED );
    4535             :     }
    4536             :     else
    4537             :     {
    4538             :         m_pContentsListBox->SetCheckButtonState(
    4539           0 :             pNewLBEntry, SV_BUTTON_TRISTATE );
    4540             :     }
    4541             : 
    4542             :     // get currently selected toolbar and apply change
    4543           0 :     SvxConfigEntry* pToolbar = GetTopLevelSelection();
    4544             : 
    4545           0 :     if ( pToolbar != NULL )
    4546             :     {
    4547           0 :         static_cast<ToolbarSaveInData*>( GetSaveInData() )->ApplyToolbar( pToolbar );
    4548             :     }
    4549             : 
    4550           0 :     return pNewLBEntry;
    4551             : }
    4552             : 
    4553           0 : SvxToolbarEntriesListBox::SvxToolbarEntriesListBox(vcl::Window* pParent, SvxToolbarConfigPage* pPg)
    4554             :     : SvxMenuEntriesListBox(pParent, pPg)
    4555           0 :     , pPage(pPg)
    4556             : {
    4557           0 :     m_pButtonData = new SvLBoxButtonData( this );
    4558           0 :     BuildCheckBoxButtonImages( m_pButtonData );
    4559           0 :     EnableCheckButton( m_pButtonData );
    4560           0 : }
    4561             : 
    4562           0 : SvxToolbarEntriesListBox::~SvxToolbarEntriesListBox()
    4563             : {
    4564           0 :     disposeOnce();
    4565           0 : }
    4566             : 
    4567           0 : void SvxToolbarEntriesListBox::dispose()
    4568             : {
    4569           0 :     delete m_pButtonData;
    4570           0 :     m_pButtonData = NULL;
    4571             : 
    4572           0 :     pPage.clear();
    4573           0 :     SvxMenuEntriesListBox::dispose();
    4574           0 : }
    4575             : 
    4576           0 : void SvxToolbarEntriesListBox::BuildCheckBoxButtonImages( SvLBoxButtonData* pData )
    4577             : {
    4578             :     // Build checkbox images according to the current application
    4579             :     // settings. This is necessary to be able to have correct colors
    4580             :     // in all color modes, like high contrast.
    4581           0 :     const AllSettings& rSettings = Application::GetSettings();
    4582             : 
    4583           0 :     ScopedVclPtrInstance< VirtualDevice > pVDev;
    4584           0 :     Size            aSize( 26, 20 );
    4585             : 
    4586           0 :     pVDev->SetOutputSizePixel( aSize );
    4587             : 
    4588           0 :     Image aImage = GetSizedImage( *pVDev.get(), aSize,
    4589           0 :         CheckBox::GetCheckImage( rSettings, DrawButtonFlags::Default ));
    4590             : 
    4591             :     // Fill button data struct with new images
    4592           0 :     pData->SetImage(SvBmp::UNCHECKED,     aImage);
    4593           0 :     pData->SetImage(SvBmp::CHECKED,       GetSizedImage( *pVDev.get(), aSize, CheckBox::GetCheckImage( rSettings, DrawButtonFlags::Checked )) );
    4594           0 :     pData->SetImage(SvBmp::HICHECKED,     GetSizedImage( *pVDev.get(), aSize, CheckBox::GetCheckImage( rSettings, DrawButtonFlags::Checked | DrawButtonFlags::Pressed )) );
    4595           0 :     pData->SetImage(SvBmp::HIUNCHECKED,   GetSizedImage( *pVDev.get(), aSize, CheckBox::GetCheckImage( rSettings, DrawButtonFlags::Default | DrawButtonFlags::Pressed)) );
    4596           0 :     pData->SetImage(SvBmp::TRISTATE,      GetSizedImage( *pVDev.get(), aSize, Image() ) ); // Use tristate bitmaps to have no checkbox for separator entries
    4597           0 :     pData->SetImage(SvBmp::HITRISTATE,    GetSizedImage( *pVDev.get(), aSize, Image() ) );
    4598             : 
    4599             :     // Get image size
    4600           0 :     m_aCheckBoxImageSizePixel = aImage.GetSizePixel();
    4601           0 : }
    4602             : 
    4603           0 : Image SvxToolbarEntriesListBox::GetSizedImage(
    4604             :     VirtualDevice& rVDev, const Size& aNewSize, const Image& aImage )
    4605             : {
    4606             :     // Create new checkbox images for treelistbox. They must have a
    4607             :     // decent width to have a clear column for the visibility checkbox.
    4608             : 
    4609             :     // Standard transparent color is light magenta as is won't be
    4610             :     // used for other things
    4611           0 :     Color   aFillColor( COL_LIGHTMAGENTA );
    4612             : 
    4613             :     // Position image at the center of (width-2),(height) rectangle.
    4614             :     // We need 2 pixels to have a bigger border to the next button image
    4615           0 :     sal_uInt16  nPosX = std::max( (sal_uInt16) (((( aNewSize.Width() - 2 ) - aImage.GetSizePixel().Width() ) / 2 ) - 1), (sal_uInt16) 0 );
    4616           0 :     sal_uInt16  nPosY = std::max( (sal_uInt16) (((( aNewSize.Height() - 2 ) - aImage.GetSizePixel().Height() ) / 2 ) + 1), (sal_uInt16) 0 );
    4617           0 :     Point   aPos( nPosX > 0 ? nPosX : 0, nPosY > 0 ? nPosY : 0 );
    4618           0 :     rVDev.SetFillColor( aFillColor );
    4619           0 :     rVDev.SetLineColor( aFillColor );
    4620           0 :     rVDev.DrawRect( Rectangle( Point(), aNewSize ));
    4621           0 :     rVDev.DrawImage( aPos, aImage );
    4622             : 
    4623             :     // Draw separator line 2 pixels left from the right border
    4624           0 :     Color aLineColor = GetDisplayBackground().GetColor().IsDark() ? Color( COL_WHITE ) : Color( COL_BLACK );
    4625           0 :     rVDev.SetLineColor( aLineColor );
    4626           0 :     rVDev.DrawLine( Point( aNewSize.Width()-3, 0 ), Point( aNewSize.Width()-3, aNewSize.Height()-1 ));
    4627             : 
    4628             :     // Create new image that uses the fillcolor as transparent
    4629           0 :     return Image( rVDev.GetBitmap( Point(), aNewSize ), aFillColor );
    4630             : }
    4631             : 
    4632           0 : void SvxToolbarEntriesListBox::DataChanged( const DataChangedEvent& rDCEvt )
    4633             : {
    4634           0 :     SvTreeListBox::DataChanged( rDCEvt );
    4635             : 
    4636           0 :     if (( rDCEvt.GetType() == DataChangedEventType::SETTINGS ) &&
    4637           0 :         ( rDCEvt.GetFlags() & AllSettingsFlags::STYLE ))
    4638             :     {
    4639           0 :         BuildCheckBoxButtonImages( m_pButtonData );
    4640           0 :         Invalidate();
    4641             :     }
    4642           0 : }
    4643             : 
    4644             : 
    4645             : 
    4646           0 : void SvxToolbarEntriesListBox::ChangeVisibility( SvTreeListEntry* pEntry )
    4647             : {
    4648           0 :     if ( pEntry != NULL )
    4649             :     {
    4650             :         SvxConfigEntry* pEntryData =
    4651           0 :             static_cast<SvxConfigEntry*>(pEntry->GetUserData());
    4652             : 
    4653           0 :         if ( pEntryData->IsBinding() )
    4654             :         {
    4655           0 :             pEntryData->SetVisible( !pEntryData->IsVisible() );
    4656             : 
    4657           0 :             SvxConfigEntry* pToolbar = pPage->GetTopLevelSelection();
    4658             : 
    4659             :             ToolbarSaveInData* pToolbarSaveInData = static_cast<ToolbarSaveInData*>(
    4660           0 :                 pPage->GetSaveInData() );
    4661             : 
    4662           0 :                pToolbarSaveInData->ApplyToolbar( pToolbar );
    4663             : 
    4664           0 :             SetCheckButtonState( pEntry, pEntryData->IsVisible() ?
    4665           0 :                 SV_BUTTON_CHECKED : SV_BUTTON_UNCHECKED );
    4666             :         }
    4667             :     }
    4668           0 : }
    4669             : 
    4670           0 : void SvxToolbarEntriesListBox::CheckButtonHdl()
    4671             : {
    4672           0 :     ChangeVisibility( GetHdlEntry() );
    4673           0 : }
    4674             : 
    4675           0 : void SvxToolbarEntriesListBox::KeyInput( const KeyEvent& rKeyEvent )
    4676             : {
    4677             :     // space key will change visibility of toolbar items
    4678           0 :     if ( rKeyEvent.GetKeyCode() == KEY_SPACE )
    4679             :     {
    4680           0 :         ChangeVisibility( GetCurEntry() );
    4681             :     }
    4682             :     else
    4683             :     {
    4684             :         // pass on to superclass
    4685           0 :         SvxMenuEntriesListBox::KeyInput( rKeyEvent );
    4686             :     }
    4687           0 : }
    4688             : 
    4689           0 : TriState SvxToolbarEntriesListBox::NotifyMoving(
    4690             :     SvTreeListEntry* pTarget, SvTreeListEntry* pSource,
    4691             :     SvTreeListEntry*& rpNewParent, sal_uLong& rNewChildPos)
    4692             : {
    4693             :     TriState result = SvxMenuEntriesListBox::NotifyMoving(
    4694           0 :         pTarget, pSource, rpNewParent, rNewChildPos );
    4695             : 
    4696           0 :     if ( result )
    4697             :     {
    4698             :         // Instant Apply changes to UI
    4699           0 :         SvxConfigEntry* pToolbar = pPage->GetTopLevelSelection();
    4700           0 :         if ( pToolbar != NULL )
    4701             :         {
    4702             :             ToolbarSaveInData* pSaveInData =
    4703           0 :                 static_cast<ToolbarSaveInData*>( pPage->GetSaveInData() );
    4704           0 :             pSaveInData->ApplyToolbar( pToolbar );
    4705             :         }
    4706             :     }
    4707             : 
    4708           0 :     return result;
    4709             : }
    4710             : 
    4711           0 : TriState SvxToolbarEntriesListBox::NotifyCopying(
    4712             :     SvTreeListEntry*  pTarget,
    4713             :     SvTreeListEntry*  pSource,
    4714             :     SvTreeListEntry*& rpNewParent,
    4715             :     sal_uLong&      rNewChildPos)
    4716             : {
    4717             :     (void)pSource;
    4718             :     (void)rpNewParent;
    4719             :     (void)rNewChildPos;
    4720             : 
    4721           0 :     if ( !m_bIsInternalDrag )
    4722             :     {
    4723             :         // if the target is NULL then add function to the start of the list
    4724           0 :         static_cast<SvxToolbarConfigPage*>(pPage.get())->AddFunction( pTarget, pTarget == NULL );
    4725             : 
    4726             :         // Instant Apply changes to UI
    4727           0 :         SvxConfigEntry* pToolbar = pPage->GetTopLevelSelection();
    4728           0 :         if ( pToolbar != NULL )
    4729             :         {
    4730             :             ToolbarSaveInData* pSaveInData =
    4731           0 :                 static_cast<ToolbarSaveInData*>( pPage->GetSaveInData() );
    4732           0 :             pSaveInData->ApplyToolbar( pToolbar );
    4733             :         }
    4734             : 
    4735             :         // AddFunction already adds the listbox entry so return TRISTATE_FALSE
    4736             :         // to stop another listbox entry being added
    4737           0 :         return TRISTATE_FALSE;
    4738             :     }
    4739             : 
    4740             :     // Copying is only allowed from external controls, not within the listbox
    4741           0 :     return TRISTATE_FALSE;
    4742             : }
    4743             : 
    4744           0 : SvxNewToolbarDialog::SvxNewToolbarDialog(vcl::Window* pWindow, const OUString& rName)
    4745           0 :     : ModalDialog(pWindow, "NewToolbarDialog", "cui/ui/newtoolbardialog.ui")
    4746             : {
    4747           0 :     get(m_pEdtName, "edit");
    4748           0 :     get(m_pBtnOK, "ok");
    4749           0 :     get(m_pSaveInListBox, "savein");
    4750           0 :     m_pEdtName->SetText( rName );
    4751           0 :     m_pEdtName->SetSelection(Selection(SELECTION_MIN, SELECTION_MAX));
    4752           0 :     ModifyHdl(m_pEdtName);
    4753           0 :     m_pEdtName->SetModifyHdl(LINK(this, SvxNewToolbarDialog, ModifyHdl));
    4754           0 : }
    4755             : 
    4756           0 : SvxNewToolbarDialog::~SvxNewToolbarDialog()
    4757             : {
    4758           0 :     disposeOnce();
    4759           0 : }
    4760             : 
    4761           0 : void SvxNewToolbarDialog::dispose()
    4762             : {
    4763           0 :     m_pEdtName.clear();
    4764           0 :     m_pBtnOK.clear();
    4765           0 :     m_pSaveInListBox.clear();
    4766           0 :     ModalDialog::dispose();
    4767           0 : }
    4768             : 
    4769             : 
    4770           0 : IMPL_LINK(SvxNewToolbarDialog, ModifyHdl, Edit*, pEdit)
    4771             : {
    4772             :     (void)pEdit;
    4773             : 
    4774           0 :     if(aCheckNameHdl.IsSet())
    4775           0 :         m_pBtnOK->Enable(aCheckNameHdl.Call(this) > 0);
    4776             : 
    4777           0 :     return 0;
    4778             : }
    4779             : 
    4780             : /*******************************************************************************
    4781             : *
    4782             : * The SvxIconSelectorDialog class
    4783             : *
    4784             : *******************************************************************************/
    4785           0 : SvxIconSelectorDialog::SvxIconSelectorDialog( vcl::Window *pWindow,
    4786             :     const uno::Reference< css::ui::XImageManager >& rXImageManager,
    4787             :     const uno::Reference< css::ui::XImageManager >& rXParentImageManager )
    4788             :     :
    4789             :     ModalDialog          ( pWindow, "IconSelector", "cui/ui/iconselectordialog.ui" ),
    4790             :     m_nNextId            ( 0 ),
    4791             :     m_xImageManager      ( rXImageManager ),
    4792           0 :     m_xParentImageManager( rXParentImageManager )
    4793             : {
    4794           0 :     get(pTbSymbol, "symbolsToolbar");
    4795           0 :     get(pFtNote, "noteLabel");
    4796           0 :     get(pBtnImport, "importButton");
    4797           0 :     get(pBtnDelete, "deleteButton");
    4798             : 
    4799           0 :     aTbSize = pTbSymbol->LogicToPixel(Size(160, 80), MapMode(MAP_APPFONT));
    4800           0 :     pTbSymbol->set_width_request(aTbSize.Width());
    4801           0 :     pTbSymbol->set_height_request(aTbSize.Height());
    4802           0 :     pTbSymbol->SetStyle(pTbSymbol->GetStyle() | WB_SCROLL | WB_LINESPACING);
    4803             : 
    4804             :     typedef std::unordered_map< OUString, bool,
    4805             :                                 OUStringHash, std::equal_to< OUString > > ImageInfo;
    4806             : 
    4807           0 :     pTbSymbol->SetPageScroll( true );
    4808             : 
    4809           0 :     bool bLargeIcons = GetImageType() & css::ui::ImageType::SIZE_LARGE;
    4810           0 :     m_nExpectedSize = bLargeIcons ? 26 : 16;
    4811             : 
    4812           0 :     if ( m_nExpectedSize != 16 )
    4813             :     {
    4814           0 :         pFtNote->SetText( replaceSixteen( pFtNote->GetText(), m_nExpectedSize ) );
    4815             :     }
    4816             : 
    4817             :     uno::Reference< uno::XComponentContext > xComponentContext =
    4818           0 :         ::comphelper::getProcessComponentContext();
    4819             : 
    4820           0 :     m_xGraphProvider = uno::Reference< graphic::XGraphicProvider >(
    4821           0 :         graphic::GraphicProvider::create( xComponentContext ) );
    4822             : 
    4823             :     uno::Reference< css::util::XPathSettings > xPathSettings =
    4824           0 :         css::util::thePathSettings::get( xComponentContext );
    4825             : 
    4826             : 
    4827           0 :     OUString aDirectory = xPathSettings->getUserConfig();
    4828             : 
    4829           0 :     sal_Int32 aCount = aDirectory.getLength();
    4830             : 
    4831           0 :     if ( aCount > 0 )
    4832             :     {
    4833           0 :         sal_Unicode aChar = aDirectory[ aCount-1 ];
    4834           0 :         if ( aChar != '/')
    4835             :         {
    4836           0 :             aDirectory += "/";
    4837             :         }
    4838             :     }
    4839             :     else
    4840             :     {
    4841           0 :         pBtnImport->Enable( false );
    4842             :     }
    4843             : 
    4844           0 :     aDirectory += "soffice.cfg/import";
    4845             : 
    4846             :     uno::Reference< lang::XSingleServiceFactory > xStorageFactory(
    4847           0 :           ::com::sun::star::embed::FileSystemStorageFactory::create( xComponentContext ) );
    4848             : 
    4849           0 :     uno::Sequence< uno::Any > aArgs( 2 );
    4850           0 :     aArgs[ 0 ] <<= aDirectory;
    4851           0 :     aArgs[ 1 ] <<= com::sun::star::embed::ElementModes::READWRITE;
    4852             : 
    4853             :     uno::Reference< com::sun::star::embed::XStorage > xStorage(
    4854           0 :         xStorageFactory->createInstanceWithArguments( aArgs ), uno::UNO_QUERY );
    4855             : 
    4856           0 :     uno::Sequence< uno::Any > aProp( 2 );
    4857           0 :     beans::PropertyValue aPropValue;
    4858             : 
    4859           0 :     aPropValue.Name = "UserConfigStorage";
    4860           0 :     aPropValue.Value <<= xStorage;
    4861           0 :     aProp[ 0 ] <<= aPropValue;
    4862             : 
    4863           0 :     aPropValue.Name = "OpenMode";
    4864           0 :     aPropValue.Value <<= com::sun::star::embed::ElementModes::READWRITE;
    4865           0 :     aProp[ 1 ] <<= aPropValue;
    4866             : 
    4867           0 :     m_xImportedImageManager = css::ui::ImageManager::create( xComponentContext );
    4868           0 :     m_xImportedImageManager->initialize(aProp);
    4869             : 
    4870           0 :     ImageInfo mImageInfo;
    4871           0 :     uno::Sequence< OUString > names;
    4872           0 :     if ( m_xImportedImageManager.is() )
    4873             :     {
    4874           0 :         names = m_xImportedImageManager->getAllImageNames( GetImageType() );
    4875           0 :         for ( sal_Int32 n = 0; n < names.getLength(); ++n )
    4876           0 :             mImageInfo.insert( ImageInfo::value_type( names[n], false ));
    4877             :     }
    4878           0 :     sal_uInt16 nId = 1;
    4879           0 :     ImageInfo::const_iterator pConstIter = mImageInfo.begin();
    4880           0 :     uno::Sequence< OUString > name( 1 );
    4881           0 :     while ( pConstIter != mImageInfo.end() )
    4882             :     {
    4883           0 :         name[ 0 ] = pConstIter->first;
    4884           0 :         uno::Sequence< uno::Reference< graphic::XGraphic> > graphics = m_xImportedImageManager->getImages( GetImageType(), name );
    4885           0 :         if ( graphics.getLength() > 0 )
    4886             :         {
    4887           0 :             Image img = Image( graphics[ 0 ] );
    4888           0 :             pTbSymbol->InsertItem( nId, img, pConstIter->first );
    4889             : 
    4890           0 :             graphics[ 0 ]->acquire();
    4891             : 
    4892             :             pTbSymbol->SetItemData(
    4893           0 :                 nId, static_cast< void * > ( graphics[ 0 ].get() ) );
    4894             : 
    4895           0 :             ++nId;
    4896             :         }
    4897           0 :         ++pConstIter;
    4898           0 :     }
    4899             : 
    4900           0 :     ImageInfo                 aImageInfo;
    4901             : 
    4902           0 :     if ( m_xParentImageManager.is() )
    4903             :     {
    4904           0 :         names = m_xParentImageManager->getAllImageNames( GetImageType() );
    4905           0 :         for ( sal_Int32 n = 0; n < names.getLength(); ++n )
    4906           0 :             aImageInfo.insert( ImageInfo::value_type( names[n], false ));
    4907             :     }
    4908             : 
    4909           0 :     names = m_xImageManager->getAllImageNames( GetImageType() );
    4910           0 :     for ( sal_Int32 n = 0; n < names.getLength(); ++n )
    4911             :     {
    4912           0 :         ImageInfo::iterator pIter = aImageInfo.find( names[n] );
    4913           0 :         if ( pIter != aImageInfo.end() )
    4914           0 :             pIter->second = true;
    4915             :         else
    4916           0 :             aImageInfo.insert( ImageInfo::value_type( names[n], true ));
    4917             :     }
    4918             : 
    4919             :     // large growth factor, expecting many entries
    4920           0 :     pConstIter = aImageInfo.begin();
    4921           0 :     while ( pConstIter != aImageInfo.end() )
    4922             :     {
    4923           0 :         name[ 0 ] = pConstIter->first;
    4924             : 
    4925           0 :         uno::Sequence< uno::Reference< graphic::XGraphic> > graphics;
    4926             :         try
    4927             :         {
    4928           0 :             if ( pConstIter->second )
    4929           0 :                 graphics = m_xImageManager->getImages( GetImageType(), name );
    4930             :             else
    4931           0 :                 graphics = m_xParentImageManager->getImages( GetImageType(), name );
    4932             :         }
    4933           0 :         catch ( uno::Exception& )
    4934             :         {
    4935             :             // can't get sequence for this name so it will not be
    4936             :             // added to the list
    4937             :         }
    4938             : 
    4939           0 :         if ( graphics.getLength() > 0 )
    4940             :         {
    4941           0 :             Image img = Image( graphics[ 0 ] );
    4942           0 :             if ( !img.GetBitmapEx().IsEmpty() )
    4943             :             {
    4944           0 :                 pTbSymbol->InsertItem( nId, img, pConstIter->first );
    4945             : 
    4946           0 :                 uno::Reference< graphic::XGraphic > xGraphic = graphics[ 0 ];
    4947             : 
    4948           0 :                 if ( xGraphic.is() )
    4949           0 :                     xGraphic->acquire();
    4950             : 
    4951             :                 pTbSymbol->SetItemData(
    4952           0 :                     nId, static_cast< void * > ( xGraphic.get() ) );
    4953             : 
    4954           0 :                 ++nId;
    4955           0 :             }
    4956             :         }
    4957             : 
    4958           0 :         ++pConstIter;
    4959           0 :     }
    4960             : 
    4961           0 :     pBtnDelete->Enable( false );
    4962           0 :     pTbSymbol->SetSelectHdl( LINK(this, SvxIconSelectorDialog, SelectHdl) );
    4963           0 :     pBtnImport->SetClickHdl( LINK(this, SvxIconSelectorDialog, ImportHdl) );
    4964           0 :     pBtnDelete->SetClickHdl( LINK(this, SvxIconSelectorDialog, DeleteHdl) );
    4965             : 
    4966           0 :     m_nNextId = pTbSymbol->GetItemCount()+1;
    4967           0 : }
    4968             : 
    4969           0 : SvxIconSelectorDialog::~SvxIconSelectorDialog()
    4970             : {
    4971           0 :     disposeOnce();
    4972           0 : }
    4973             : 
    4974           0 : void SvxIconSelectorDialog::dispose()
    4975             : {
    4976           0 :     if (pTbSymbol)
    4977             :     {
    4978           0 :         sal_uInt16 nCount = pTbSymbol->GetItemCount();
    4979             : 
    4980           0 :         for (sal_uInt16 n = 0; n < nCount; ++n )
    4981             :         {
    4982           0 :             sal_uInt16 nId = pTbSymbol->GetItemId(n);
    4983             : 
    4984             :             uno::XInterface* xi = static_cast< uno::XInterface* >(
    4985           0 :                 pTbSymbol->GetItemData( nId ) );
    4986             : 
    4987           0 :             if ( xi != NULL )
    4988           0 :             xi->release();
    4989             :         }
    4990             :     }
    4991             : 
    4992           0 :     pTbSymbol.clear();
    4993           0 :     pFtNote.clear();
    4994           0 :     pBtnImport.clear();
    4995           0 :     pBtnDelete.clear();
    4996           0 :     ModalDialog::dispose();
    4997           0 : }
    4998             : 
    4999           0 : uno::Reference< graphic::XGraphic> SvxIconSelectorDialog::GetSelectedIcon()
    5000             : {
    5001           0 :     uno::Reference< graphic::XGraphic > result;
    5002             : 
    5003             :     sal_uInt16 nId;
    5004           0 :     for ( sal_uInt16 n = 0; n < pTbSymbol->GetItemCount(); ++n )
    5005             :     {
    5006           0 :         nId = pTbSymbol->GetItemId( n );
    5007           0 :         if ( pTbSymbol->IsItemChecked( nId ) )
    5008             :         {
    5009           0 :             result = uno::Reference< graphic::XGraphic >(
    5010             :                 static_cast< graphic::XGraphic* >(
    5011           0 :                     pTbSymbol->GetItemData( nId ) ) );
    5012             :         }
    5013             :     }
    5014             : 
    5015           0 :     return result;
    5016             : }
    5017             : 
    5018           0 : IMPL_LINK_TYPED( SvxIconSelectorDialog, SelectHdl, ToolBox *, pToolBox, void )
    5019             : {
    5020             :     (void)pToolBox;
    5021             : 
    5022           0 :     sal_uInt16 nCount = pTbSymbol->GetItemCount();
    5023             : 
    5024           0 :     for (sal_uInt16 n = 0; n < nCount; ++n )
    5025             :     {
    5026           0 :         sal_uInt16 nId = pTbSymbol->GetItemId( n );
    5027             : 
    5028           0 :         if ( pTbSymbol->IsItemChecked( nId ) )
    5029             :         {
    5030           0 :             pTbSymbol->CheckItem( nId, false );
    5031             :         }
    5032             :     }
    5033             : 
    5034           0 :     sal_uInt16 nId = pTbSymbol->GetCurItemId();
    5035           0 :     pTbSymbol->CheckItem( nId );
    5036             : 
    5037           0 :     OUString aSelImageText = pTbSymbol->GetItemText( nId );
    5038           0 :     if ( m_xImportedImageManager->hasImage( GetImageType(), aSelImageText ) )
    5039             :     {
    5040           0 :         pBtnDelete->Enable( true );
    5041             :     }
    5042             :     else
    5043             :     {
    5044           0 :         pBtnDelete->Enable( false );
    5045           0 :     }
    5046           0 : }
    5047             : 
    5048           0 : IMPL_LINK( SvxIconSelectorDialog, ImportHdl, PushButton *, pButton )
    5049             : {
    5050             :     (void)pButton;
    5051             : 
    5052             :     sfx2::FileDialogHelper aImportDialog(
    5053             :         css::ui::dialogs::TemplateDescription::FILEOPEN_LINK_PREVIEW,
    5054           0 :         SFXWB_GRAPHIC | SFXWB_MULTISELECTION );
    5055             : 
    5056             :     // disable the link checkbox in the dialog
    5057             :     uno::Reference< css::ui::dialogs::XFilePickerControlAccess >
    5058           0 :         xController( aImportDialog.GetFilePicker(), uno::UNO_QUERY);
    5059           0 :     if ( xController.is() )
    5060             :     {
    5061           0 :         xController->enableControl(
    5062             :             css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_LINK,
    5063           0 :             sal_False);
    5064             :     }
    5065             : 
    5066             :     aImportDialog.SetCurrentFilter(
    5067           0 :         OUString("PNG - Portable Network Graphic"));
    5068             : 
    5069           0 :     if ( ERRCODE_NONE == aImportDialog.Execute() )
    5070             :     {
    5071           0 :         uno::Sequence< OUString > paths = aImportDialog.GetMPath();
    5072           0 :         ImportGraphics ( paths );
    5073             :     }
    5074             : 
    5075           0 :     return 0;
    5076             : }
    5077             : 
    5078           0 : IMPL_LINK( SvxIconSelectorDialog, DeleteHdl, PushButton *, pButton )
    5079             : {
    5080             :     (void)pButton;
    5081             : 
    5082           0 :     OUString message = CUI_RES( RID_SVXSTR_DELETE_ICON_CONFIRM );
    5083           0 :     if ( ScopedVclPtr<WarningBox>::Create( this, WinBits(WB_OK_CANCEL), message )->Execute() == RET_OK )
    5084             :     {
    5085           0 :         sal_uInt16 nCount = pTbSymbol->GetItemCount();
    5086             : 
    5087           0 :         for (sal_uInt16 n = 0; n < nCount; ++n )
    5088             :         {
    5089           0 :             sal_uInt16 nId = pTbSymbol->GetItemId( n );
    5090             : 
    5091           0 :             if ( pTbSymbol->IsItemChecked( nId ) )
    5092             :             {
    5093           0 :                 OUString aSelImageText = pTbSymbol->GetItemText( nId );
    5094           0 :                 uno::Sequence< OUString > URLs(1);
    5095           0 :                 URLs[0] = aSelImageText;
    5096           0 :                 pTbSymbol->RemoveItem( pTbSymbol->GetItemPos( nId ) );
    5097           0 :                 m_xImportedImageManager->removeImages( GetImageType(), URLs );
    5098             :                 uno::Reference< css::ui::XUIConfigurationPersistence >
    5099           0 :                     xConfigPersistence( m_xImportedImageManager, uno::UNO_QUERY );
    5100           0 :                 if ( xConfigPersistence.is() && xConfigPersistence->isModified() )
    5101             :                 {
    5102           0 :                     xConfigPersistence->store();
    5103             :                 }
    5104           0 :                 break;
    5105             :             }
    5106             :         }
    5107             :     }
    5108           0 :     return 0;
    5109             : }
    5110             : 
    5111           0 : bool SvxIconSelectorDialog::ReplaceGraphicItem(
    5112             :     const OUString& aURL )
    5113             : {
    5114           0 :     uno::Sequence< OUString > URLs(1);
    5115           0 :     uno::Sequence< uno::Reference<graphic::XGraphic > > aImportGraph( 1 );
    5116             :     uno::Reference< css::ui::XUIConfigurationPersistence >
    5117           0 :         xConfigPer( m_xImportedImageManager, uno::UNO_QUERY );
    5118             : 
    5119           0 :     uno::Reference< graphic::XGraphic > xGraphic;
    5120           0 :     uno::Sequence< beans::PropertyValue > aMediaProps( 1 );
    5121           0 :     aMediaProps[0].Name = "URL";
    5122           0 :     aMediaProps[0].Value <<= aURL;
    5123             : 
    5124           0 :     com::sun::star::awt::Size aSize;
    5125           0 :     bool bOK = false;
    5126             :     try
    5127             :     {
    5128           0 :         xGraphic = m_xGraphProvider->queryGraphic( aMediaProps );
    5129             : 
    5130             :         uno::Reference< beans::XPropertySet > props =
    5131           0 :             m_xGraphProvider->queryGraphicDescriptor( aMediaProps );
    5132           0 :         uno::Any a = props->getPropertyValue(
    5133           0 :             OUString("SizePixel") );
    5134           0 :         a >>= aSize;
    5135           0 :         if (0 == aSize.Width || 0 == aSize.Height)
    5136           0 :             return false;
    5137             :         else
    5138           0 :             bOK = true;
    5139             :     }
    5140           0 :     catch ( uno::Exception& )
    5141             :     {
    5142           0 :         return false;
    5143             :     }
    5144             : 
    5145           0 :     bool   bResult( false );
    5146           0 :     sal_uInt16 nCount = pTbSymbol->GetItemCount();
    5147           0 :     for (sal_uInt16 n = 0; n < nCount; ++n )
    5148             :     {
    5149           0 :         sal_uInt16 nId = pTbSymbol->GetItemId( n );
    5150             : 
    5151           0 :         if ( OUString( pTbSymbol->GetItemText( nId ) ) == aURL )
    5152             :         {
    5153             :             try
    5154             :             {
    5155             :                 // replace/insert image with provided URL
    5156           0 :                 pTbSymbol->RemoveItem( pTbSymbol->GetItemPos( nId ) );
    5157           0 :                 aMediaProps[0].Value <<= aURL;
    5158             : 
    5159           0 :                 Image aImage( xGraphic );
    5160           0 :                 if ( bOK && ((aSize.Width != m_nExpectedSize) || (aSize.Height != m_nExpectedSize)) )
    5161             :                 {
    5162           0 :                     BitmapEx aBitmap = aImage.GetBitmapEx();
    5163           0 :                     BitmapEx aBitmapex = BitmapEx::AutoScaleBitmap(aBitmap, m_nExpectedSize);
    5164           0 :                     aImage = Image( aBitmapex);
    5165             :                 }
    5166           0 :                 pTbSymbol->InsertItem( nId,aImage, aURL, ToolBoxItemBits::NONE, 0 ); //modify
    5167             : 
    5168           0 :                 xGraphic = aImage.GetXGraphic();
    5169             : 
    5170           0 :                 URLs[0] = aURL;
    5171           0 :                 aImportGraph[ 0 ] = xGraphic;
    5172           0 :                 m_xImportedImageManager->replaceImages( GetImageType(), URLs, aImportGraph );
    5173           0 :                 xConfigPer->store();
    5174             : 
    5175           0 :                 bResult = true;
    5176           0 :                 break;
    5177             :             }
    5178           0 :             catch ( ::com::sun::star::uno::Exception& )
    5179             :             {
    5180           0 :                 break;
    5181             :             }
    5182             :         }
    5183             :     }
    5184             : 
    5185           0 :     return bResult;
    5186             : }
    5187             : 
    5188           0 : void SvxIconSelectorDialog::ImportGraphics(
    5189             :     const uno::Sequence< OUString >& rPaths )
    5190             : {
    5191           0 :     uno::Sequence< OUString > rejected( rPaths.getLength() );
    5192           0 :     sal_Int32 rejectedCount = 0;
    5193             : 
    5194           0 :     sal_uInt16 ret = 0;
    5195             :     sal_Int32 aIndex;
    5196           0 :     OUString aIconName;
    5197           0 :     uno::Sequence< beans::PropertyValue > aMediaProps( 1 );
    5198           0 :     aMediaProps[0].Name = "URL";
    5199             :     uno::Reference< css::ui::XUIConfigurationPersistence >
    5200           0 :         xConfigPer( m_xImportedImageManager, uno::UNO_QUERY );
    5201             : 
    5202           0 :     if ( rPaths.getLength() == 1 )
    5203             :     {
    5204           0 :         if ( m_xImportedImageManager->hasImage( GetImageType(), rPaths[0] ) )
    5205             :         {
    5206           0 :             aIndex = rPaths[0].lastIndexOf( '/' );
    5207           0 :             aIconName = rPaths[0].copy( aIndex+1 );
    5208           0 :             ret = ScopedVclPtr<SvxIconReplacementDialog>::Create( this, aIconName )->ShowDialog();
    5209           0 :             if ( ret == 2 )
    5210             :             {
    5211           0 :                 ReplaceGraphicItem( rPaths[0] );
    5212             :             }
    5213             :         }
    5214             :         else
    5215             :         {
    5216           0 :             if ( !ImportGraphic( rPaths[0] ) )
    5217             :             {
    5218           0 :                 rejected[0] = rPaths[0];
    5219           0 :                 rejectedCount = 1;
    5220             :             }
    5221             :         }
    5222             :     }
    5223             :     else
    5224             :     {
    5225           0 :         OUString aSourcePath( rPaths[0] );
    5226           0 :         if ( rPaths[0].lastIndexOf( '/' ) != rPaths[0].getLength() -1 )
    5227           0 :             aSourcePath = rPaths[0] + "/";
    5228             : 
    5229           0 :         for ( sal_Int32 i = 1; i < rPaths.getLength(); ++i )
    5230             :         {
    5231           0 :             OUString aPath = aSourcePath + rPaths[i];
    5232           0 :             if ( m_xImportedImageManager->hasImage( GetImageType(), aPath ) )
    5233             :             {
    5234           0 :                 aIndex = rPaths[i].lastIndexOf( '/' );
    5235           0 :                 aIconName = rPaths[i].copy( aIndex+1 );
    5236           0 :                 ret = ScopedVclPtr<SvxIconReplacementDialog>::Create( this, aIconName, true )->ShowDialog();
    5237           0 :                 if ( ret == 2 )
    5238             :                 {
    5239           0 :                     ReplaceGraphicItem( aPath );
    5240             :                 }
    5241           0 :                 else if ( ret == 5 )
    5242             :                 {
    5243           0 :                     for ( sal_Int32 k = i; k < rPaths.getLength(); ++k )
    5244             :                     {
    5245           0 :                         aPath = aSourcePath + rPaths[k];
    5246           0 :                         bool bHasReplaced = ReplaceGraphicItem( aPath );
    5247             : 
    5248           0 :                         if ( !bHasReplaced )
    5249             :                         {
    5250           0 :                             bool result = ImportGraphic( aPath );
    5251           0 :                             if ( !result )
    5252             :                             {
    5253           0 :                                 rejected[ rejectedCount ] = rPaths[i];
    5254           0 :                                 ++rejectedCount;
    5255             :                             }
    5256             :                         }
    5257             :                     }
    5258           0 :                     break;
    5259             :                 }
    5260             :             }
    5261             :             else
    5262             :             {
    5263           0 :                 bool result = ImportGraphic( aSourcePath + rPaths[i] );
    5264           0 :                 if ( !result )
    5265             :                 {
    5266           0 :                     rejected[ rejectedCount ] = rPaths[i];
    5267           0 :                     ++rejectedCount;
    5268             :                 }
    5269             :             }
    5270           0 :         }
    5271             :     }
    5272             : 
    5273           0 :     if ( rejectedCount != 0 )
    5274             :     {
    5275           0 :         OUString message;
    5276           0 :         OUString newLine("\n");
    5277           0 :         OUString fPath;
    5278           0 :         if (rejectedCount > 1)
    5279           0 :               fPath = rPaths[0].copy(8) + "/";
    5280           0 :         for ( sal_Int32 i = 0; i < rejectedCount; ++i )
    5281             :         {
    5282           0 :             message += fPath + rejected[i];
    5283           0 :             message += newLine;
    5284             :         }
    5285             : 
    5286           0 :         ScopedVclPtrInstance< SvxIconChangeDialog > aDialog(this, message);
    5287           0 :         aDialog->Execute();
    5288           0 :     }
    5289           0 : }
    5290             : 
    5291           0 : bool SvxIconSelectorDialog::ImportGraphic( const OUString& aURL )
    5292             : {
    5293           0 :     bool result = false;
    5294             : 
    5295           0 :     sal_uInt16 nId = m_nNextId;
    5296           0 :     ++m_nNextId;
    5297             : 
    5298           0 :     uno::Sequence< beans::PropertyValue > aMediaProps( 1 );
    5299           0 :     aMediaProps[0].Name = "URL";
    5300             : 
    5301           0 :     uno::Reference< graphic::XGraphic > xGraphic;
    5302           0 :     com::sun::star::awt::Size aSize;
    5303           0 :     aMediaProps[0].Value <<= aURL;
    5304             :     try
    5305             :     {
    5306             :         uno::Reference< beans::XPropertySet > props =
    5307           0 :             m_xGraphProvider->queryGraphicDescriptor( aMediaProps );
    5308             : 
    5309           0 :         uno::Any a = props->getPropertyValue(
    5310           0 :             OUString("SizePixel") );
    5311             : 
    5312           0 :             xGraphic = m_xGraphProvider->queryGraphic( aMediaProps );
    5313           0 :             if ( xGraphic.is() )
    5314             :             {
    5315           0 :                 bool bOK = true;
    5316             : 
    5317           0 :                 a >>= aSize;
    5318           0 :                 if ( 0 == aSize.Width || 0 == aSize.Height )
    5319           0 :                     bOK = false;
    5320             : 
    5321           0 :                 Image aImage( xGraphic );
    5322             : 
    5323           0 :                 if ( bOK && ((aSize.Width != m_nExpectedSize) || (aSize.Height != m_nExpectedSize)) )
    5324             :                 {
    5325           0 :                     BitmapEx aBitmap = aImage.GetBitmapEx();
    5326           0 :                     BitmapEx aBitmapex = BitmapEx::AutoScaleBitmap(aBitmap, m_nExpectedSize);
    5327           0 :                     aImage = Image( aBitmapex);
    5328             :                 }
    5329           0 :                 if ( bOK && !!aImage )
    5330             :                 {
    5331           0 :                     pTbSymbol->InsertItem( nId, aImage, aURL, ToolBoxItemBits::NONE, 0 );
    5332             : 
    5333           0 :                     xGraphic = aImage.GetXGraphic();
    5334           0 :                     xGraphic->acquire();
    5335             : 
    5336             :                     pTbSymbol->SetItemData(
    5337           0 :                         nId, static_cast< void * > ( xGraphic.get() ) );
    5338           0 :                     uno::Sequence< OUString > aImportURL( 1 );
    5339           0 :                     aImportURL[ 0 ] = aURL;
    5340           0 :                     uno::Sequence< uno::Reference<graphic::XGraphic > > aImportGraph( 1 );
    5341           0 :                     aImportGraph[ 0 ] = xGraphic;
    5342           0 :                     m_xImportedImageManager->insertImages( GetImageType(), aImportURL, aImportGraph );
    5343             :                     uno::Reference< css::ui::XUIConfigurationPersistence >
    5344           0 :                     xConfigPersistence( m_xImportedImageManager, uno::UNO_QUERY );
    5345             : 
    5346           0 :                     if ( xConfigPersistence.is() && xConfigPersistence->isModified() )
    5347             :                     {
    5348           0 :                         xConfigPersistence->store();
    5349             :                     }
    5350             : 
    5351           0 :                     result = true;
    5352             :                 }
    5353             :                 else
    5354             :                 {
    5355             :                     OSL_TRACE("could not create Image from XGraphic");
    5356           0 :                 }
    5357             :             }
    5358             :             else
    5359             :             {
    5360             :                 OSL_TRACE("could not get query XGraphic");
    5361           0 :             }
    5362             :     }
    5363           0 :     catch( uno::Exception& e )
    5364             :     {
    5365             :         OSL_TRACE("Caught exception importing XGraphic: %s", PRTSTR(e.Message));
    5366             :     }
    5367           0 :     return result;
    5368             : }
    5369             : 
    5370             : /*******************************************************************************
    5371             : *
    5372             : * The SvxIconReplacementDialog class
    5373             : *
    5374             : *******************************************************************************/
    5375           0 : SvxIconReplacementDialog :: SvxIconReplacementDialog(
    5376             :     vcl::Window *pWindow, const OUString& aMessage, bool /*bYestoAll*/ )
    5377             :     :
    5378           0 : MessBox( pWindow, WB_DEF_YES, CUI_RES( RID_SVXSTR_REPLACE_ICON_CONFIRM ),  CUI_RES( RID_SVXSTR_REPLACE_ICON_WARNING ) )
    5379             : 
    5380             : {
    5381           0 :     SetImage( WarningBox::GetStandardImage() );
    5382           0 :     SetMessText( ReplaceIconName( aMessage ) );
    5383           0 :     RemoveButton( 1 );
    5384           0 :     AddButton( StandardButtonType::Yes, 2);
    5385           0 :     AddButton( CUI_RES( RID_SVXSTR_YESTOALL ), 5);
    5386           0 :     AddButton( StandardButtonType::No, 3);
    5387           0 :     AddButton( StandardButtonType::Cancel, 4);
    5388           0 : }
    5389             : 
    5390           0 : SvxIconReplacementDialog :: SvxIconReplacementDialog(
    5391             :     vcl::Window *pWindow, const OUString& aMessage )
    5392           0 :     : MessBox( pWindow, WB_YES_NO_CANCEL, CUI_RES( RID_SVXSTR_REPLACE_ICON_CONFIRM ),  CUI_RES( RID_SVXSTR_REPLACE_ICON_WARNING ) )
    5393             : {
    5394           0 :     SetImage( WarningBox::GetStandardImage() );
    5395           0 :     SetMessText( ReplaceIconName( aMessage ));
    5396           0 : }
    5397             : 
    5398           0 : OUString SvxIconReplacementDialog :: ReplaceIconName( const OUString& rMessage )
    5399             : {
    5400           0 :     OUString name;
    5401           0 :     OUString message = CUI_RES( RID_SVXSTR_REPLACE_ICON_WARNING );
    5402           0 :     OUString placeholder("%ICONNAME" );
    5403           0 :     sal_Int32 pos = message.indexOf( placeholder );
    5404           0 :     if ( pos != -1 )
    5405             :     {
    5406           0 :         name = message.replaceAt(
    5407           0 :             pos, placeholder.getLength(), rMessage );
    5408             :     }
    5409           0 :     return name;
    5410             : }
    5411             : 
    5412           0 : sal_uInt16 SvxIconReplacementDialog :: ShowDialog()
    5413             : {
    5414           0 :     this->Execute();
    5415           0 :     return ( this->GetCurButtonId() );
    5416             : }
    5417             : /*******************************************************************************
    5418             : *
    5419             : * The SvxIconChangeDialog class added for issue83555
    5420             : *
    5421             : *******************************************************************************/
    5422           0 : SvxIconChangeDialog::SvxIconChangeDialog(
    5423             :     vcl::Window *pWindow, const OUString& aMessage)
    5424           0 :     :ModalDialog(pWindow, "IconChange", "cui/ui/iconchangedialog.ui")
    5425             : {
    5426           0 :     get(pFImageInfo, "infoImage");
    5427           0 :     get(pLineEditDescription, "addrTextview");
    5428             : 
    5429           0 :     Size aSize(LogicToPixel(Size(140, 83), MapMode(MAP_APPFONT)));
    5430           0 :     pLineEditDescription->set_width_request(aSize.Width());
    5431           0 :     pLineEditDescription->set_height_request(aSize.Height());
    5432             : 
    5433           0 :     pFImageInfo->SetImage(InfoBox::GetStandardImage());
    5434           0 :     pLineEditDescription->SetControlBackground( GetSettings().GetStyleSettings().GetDialogColor() );
    5435           0 :     pLineEditDescription->SetText(aMessage);
    5436           0 : }
    5437             : 
    5438           0 : SvxIconChangeDialog::~SvxIconChangeDialog()
    5439             : {
    5440           0 :     disposeOnce();
    5441           0 : }
    5442             : 
    5443           0 : void SvxIconChangeDialog::dispose()
    5444             : {
    5445           0 :     pFImageInfo.clear();
    5446           0 :     pLineEditDescription.clear();
    5447           0 :     ModalDialog::dispose();
    5448           0 : }
    5449             : 
    5450             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11