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

Generated by: LCOV version 1.10