[ooo-build-commit] patches/dev300 patches/vba

Noel Power noelp at kemper.freedesktop.org
Fri Sep 11 06:03:52 PDT 2009


 patches/dev300/apply                      |   10 
 patches/vba/vba-toolbar-menu-support.diff | 1450 ++++++++++++++++++++++++++++++
 2 files changed, 1455 insertions(+), 5 deletions(-)

New commits:
commit 7dafd0cf39eb7382311801c2f0e8f7b265afc0f1
Author: Noel Power <noel.power at novell.com>
Date:   Fri Sep 11 14:02:27 2009 +0100

    enabled disabled patches and add ( and enable ) new menu on toolbar support
    
    * patches/dev300/apply:
    * patches/vba/vba-toolbar-menu-support.diff:

diff --git a/patches/dev300/apply b/patches/dev300/apply
index b5aeb8a..a35fa9c 100644
--- a/patches/dev300/apply
+++ b/patches/dev300/apply
@@ -1870,13 +1870,13 @@ vba-typename-fix.diff, n#525649
 # associated with vba-automation-set-fix.diff above, this patch
 # allows the automation bridge to tell the basic runtime about
 # default member of automation objects
-#vba-automation-defaultmember.diff, n#507501
+vba-automation-defaultmember.diff, n#507501
 # disable untill master is updated
 # misc fixed from ibm
-#ibm-misc-fixes-1.diff,i#104203, i#103653
-#vba-automation-fix-named-paramaters.diff, n#535087
-#vba-automation-put-get-property-improvements.diff, n#535086, n#535088, n#535089
-
+ibm-misc-fixes-1.diff,i#104203, i#103653
+vba-automation-fix-named-paramaters.diff, n#535087
+vba-automation-put-get-property-improvements.diff, n#535086, n#535088, n#535089
+vba-toolbar-menu-support.diff
 [VBAUntested]
 SectionOwner => noelpwer
 # doesn't work
diff --git a/patches/vba/vba-toolbar-menu-support.diff b/patches/vba/vba-toolbar-menu-support.diff
new file mode 100644
index 0000000..5bd4c17
--- /dev/null
+++ b/patches/vba/vba-toolbar-menu-support.diff
@@ -0,0 +1,1450 @@
+diff --git framework/inc/classes/menuconfiguration.hxx framework/inc/classes/menuconfiguration.hxx
+index 4dc2504..f2a9b24 100644
+--- framework/inc/classes/menuconfiguration.hxx
++++ framework/inc/classes/menuconfiguration.hxx
+@@ -83,6 +83,7 @@ class MenuConfiguration
+ 			::rtl::OUString aTargetFrame;
+ 			::rtl::OUString	aImageId;
+             ::com::sun::star::uno::WeakReference< ::com::sun::star::frame::XDispatchProvider > xDispatchProvider;
++                        sal_Int16 nStyle;
+ 		};
+ 						
+ 		MenuConfiguration(
+diff --git framework/inc/uielement/generictoolbarcontroller.hxx framework/inc/uielement/generictoolbarcontroller.hxx
+index d242da2..8b4cd59 100644
+--- framework/inc/uielement/generictoolbarcontroller.hxx
++++ framework/inc/uielement/generictoolbarcontroller.hxx
+@@ -37,6 +37,9 @@
+ 
+ #include <svtools/toolboxcontroller.hxx>
+ #include <vcl/toolbox.hxx>
++#include <memory>
++
++class PopupMenu;
+ 
+ namespace framework
+ {
+@@ -64,7 +67,7 @@ class GenericToolbarController : public svt::ToolboxController
+ 
+          DECL_STATIC_LINK( GenericToolbarController, ExecuteHdl_Impl, ExecuteInfo* ); 
+     
+-    private:
++    protected:
+         ToolBox*        m_pToolbar;
+         sal_uInt16      m_nID;
+         sal_Bool        m_bEnumCommand : 1,
+@@ -72,6 +75,28 @@ class GenericToolbarController : public svt::ToolboxController
+         rtl::OUString   m_aEnumCommand;
+ };
+ 
++class MenuToolbarController : public GenericToolbarController
++{
++    com::sun::star::uno::Reference< com::sun::star::container::XIndexAccess > m_xMenuDesc;
++    PopupMenu* pMenu;
++    com::sun::star::uno::Reference< com::sun::star::lang::XComponent > m_xMenuManager;
++    rtl::OUString m_aModuleIdentifier;
++    public:
++        MenuToolbarController( const com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory >& rServiceManager, 
++                                  const com::sun::star::uno::Reference< com::sun::star::frame::XFrame >& rFrame,
++                                  ToolBox* pToolBar,
++                                  USHORT   nID,
++                                  const rtl::OUString& aCommand, 
++                                  const rtl::OUString& aModuleIdentifier, 
++                                  const com::sun::star::uno::Reference< com::sun::star::container::XIndexAccess >& xMenuDesc );
++
++    ~MenuToolbarController();
++    // XToolbarController
++    virtual SAL_CALL void click() throw ( ::com::sun::star::uno::RuntimeException );
++    virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > SAL_CALL createPopupWindow() throw (::com::sun::star::uno::RuntimeException);
++
++};
++
+ }
+ 
+ #endif // __FRAMEWORK_UIELEMENT_GENERICTOOLBARCONTROLLER_HXX_
+diff --git framework/inc/uielement/toolbarmanager.hxx framework/inc/uielement/toolbarmanager.hxx
+index eb47a06..20ac055 100644
+--- framework/inc/uielement/toolbarmanager.hxx
++++ framework/inc/uielement/toolbarmanager.hxx
+@@ -57,7 +57,7 @@
+ #include <com/sun/star/frame/XStatusListener.hpp>
+ #include <com/sun/star/frame/XSubToolbarController.hpp>
+ #include <com/sun/star/ui/ItemStyle.hpp>
+-
++#include <com/sun/star/container/XIndexContainer.hpp>
+ //_________________________________________________________________________________________________________________
+ //	other includes
+ //_________________________________________________________________________________________________________________
+@@ -195,6 +195,7 @@ class ToolBarManager : public ::com::sun::star::frame::XFrameActionListener
+         typedef ::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::frame::XSubToolbarController > > SubToolBarControllerVector;
+         typedef BaseHash< SubToolBarControllerVector >                                                              SubToolBarToSubToolBarControllerMap;
+ 
++        typedef ::std::hash_map< sal_uInt16, ::com::sun::star::uno::Reference< com::sun::star::container::XIndexAccess > > MenuDescriptionMap;
+         sal_Bool                                                                               m_bDisposed : 1,
+                                                                                                m_bIsHiContrast : 1,
+                                                                                                m_bSmallSymbols : 1,
+@@ -223,6 +224,7 @@ class ToolBarManager : public ::com::sun::star::frame::XFrameActionListener
+         SubToolBarToSubToolBarControllerMap                                                    m_aSubToolBarControllerMap;
+         Timer				                                                                   m_aAsyncUpdateControllersTimer;
+         sal_Int16                                                                              m_nSymbolsStyle;
++        MenuDescriptionMap m_aMenuMap;
+ };
+     
+ }
+diff --git framework/source/uielement/generictoolbarcontroller.cxx framework/source/uielement/generictoolbarcontroller.cxx
+index 2abe1e5..d44ed6d 100644
+--- framework/source/uielement/generictoolbarcontroller.cxx
++++ framework/source/uielement/generictoolbarcontroller.cxx
+@@ -68,6 +68,9 @@
+ #include <classes/fwkresid.hxx>
+ #include <dispatch/uieventloghelper.hxx>
+ 
++#include <framework/menuconfiguration.hxx>
++#include <uielement/menubarmanager.hxx>
++
+ using namespace ::com::sun::star::awt;
+ using namespace ::com::sun::star::uno;
+ using namespace ::com::sun::star::beans;
+@@ -75,6 +78,7 @@ using namespace ::com::sun::star::lang;
+ using namespace ::com::sun::star::frame;
+ using namespace ::com::sun::star::frame::status;
+ using namespace ::com::sun::star::util;
++using namespace ::com::sun::star::container;
+ 
+ namespace framework
+ {
+@@ -326,5 +330,66 @@ IMPL_STATIC_LINK_NOINSTANCE( GenericToolbarController, ExecuteHdl_Impl, ExecuteI
+    return 0;
+ }
+ 
++MenuToolbarController::MenuToolbarController( const Reference< XMultiServiceFactory >& rServiceManager, const Reference< XFrame >& rFrame, ToolBox* pToolBar, USHORT   nID, const rtl::OUString& aCommand, const rtl::OUString& aModuleIdentifier, const Reference< XIndexAccess >& xMenuDesc ) : GenericToolbarController( rServiceManager, rFrame, pToolBar, nID, aCommand ), m_xMenuDesc( xMenuDesc ), pMenu( NULL ), m_aModuleIdentifier( aModuleIdentifier )
++{
++}
++
++MenuToolbarController::~MenuToolbarController()
++{
++    try
++    {
++        if ( m_xMenuManager.is() )
++            m_xMenuManager->dispose();
++    }
++    catch( Exception& ) {}
++    if ( pMenu )
++    {
++        delete pMenu;
++        pMenu = NULL;
++    }
++ 
++}
++
++class Toolbarmenu : public PopupMenu
++{
++    public:
++    Toolbarmenu();
++    ~Toolbarmenu();
++};
++
++Toolbarmenu::Toolbarmenu()
++{
++    OSL_TRACE("**** contstructing Toolbarmenu 0x%x", this );
++}
++
++Toolbarmenu::~Toolbarmenu()
++{
++    OSL_TRACE("**** destructing Toolbarmenu 0x%x", this );
++}
++
++void SAL_CALL MenuToolbarController::click() throw (RuntimeException)
++{
++    createPopupWindow();
++}
++
++Reference< XWindow > SAL_CALL 
++MenuToolbarController::createPopupWindow() throw (::com::sun::star::uno::RuntimeException)
++{
++    if ( !pMenu ) 
++    {
++        Reference< XDispatchProvider > xDispatch;
++        pMenu = new Toolbarmenu();
++        m_xMenuManager.set( new MenuBarManager( m_xServiceManager, m_xFrame, xDispatch, m_aModuleIdentifier, pMenu, sal_True, sal_True ) );
++        if ( m_xMenuManager.is() )
++        {
++            MenuBarManager* pMgr = dynamic_cast< MenuBarManager* >( m_xMenuManager.get() );
++            pMgr->SetItemContainer( m_xMenuDesc );
++        }
++    }
++
++    ::Rectangle aRect( m_pToolbar->GetItemRect( m_nID ) );
++    pMenu->Execute( m_pToolbar, aRect, POPUPMENU_EXECUTE_DOWN );
++    return NULL; 
++}
+ } // namespace
+ 
+diff --git framework/source/uielement/menubarmanager.cxx framework/source/uielement/menubarmanager.cxx
+index c3a2678..699ed7c 100644
+--- framework/source/uielement/menubarmanager.cxx
++++ framework/source/uielement/menubarmanager.cxx
+@@ -72,6 +72,7 @@
+ #include <com/sun/star/frame/XModuleManager.hpp>
+ #include <com/sun/star/ui/XModuleUIConfigurationManagerSupplier.hpp>
+ #include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp>
++#include <com/sun/star/ui/ItemStyle.hpp>
+ #include <com/sun/star/frame/status/Visibility.hpp>
+ 
+ //_________________________________________________________________________________________________________________
+@@ -124,6 +125,7 @@ static const char ITEM_DESCRIPTOR_LABEL[]             = "Label";
+ static const char ITEM_DESCRIPTOR_TYPE[]              = "Type";
+ static const char ITEM_DESCRIPTOR_MODULEIDENTIFIER[]  = "ModuleIdentifier";
+ static const char ITEM_DESCRIPTOR_DISPATCHPROVIDER[]  = "DispatchProvider";
++static const char   ITEM_DESCRIPTOR_STYLE[]         = "Style";
+ 
+ const sal_Int32   LEN_DESCRIPTOR_COMMANDURL           = 10;
+ const sal_Int32   LEN_DESCRIPTOR_HELPURL              = 7;
+@@ -132,6 +134,7 @@ const sal_Int32   LEN_DESCRIPTOR_LABEL                = 5;
+ const sal_Int32   LEN_DESCRIPTOR_TYPE                 = 4;
+ const sal_Int32   LEN_DESCRIPTOR_MODULEIDENTIFIER     = 16;
+ const sal_Int32   LEN_DESCRIPTOR_DISPATCHPROVIDER     = 16;
++static const sal_Int32 ITEM_DESCRIPTOR_STYLE_LEN       = 5;
+ 
+ const sal_uInt16 ADDONMENU_MERGE_ITEMID_START = 1500;
+ 
+@@ -1093,7 +1096,11 @@ IMPL_LINK( MenuBarManager, Activate, Menu *, pMenu )
+ 				USHORT nId = pMenu->GetItemId( nPos );
+ 				if ( pMenu->GetItemType( nPos ) != MENUITEM_SEPARATOR )
+ 				{
+-					if ( bShowMenuImages )
++                    bool bItemShowMenuImages = bShowMenuImages;
++                    MenuItemBits nBits =  pMenu->GetItemBits( nId );
++                    if ( nBits )
++                        bItemShowMenuImages = ( ( nBits & MIB_ICON ) == MIB_ICON );
++					if ( bItemShowMenuImages )
+ 					{
+ 						sal_Bool		bImageSet = sal_False;
+ 						::rtl::OUString aImageId;
+@@ -1617,8 +1624,12 @@ void MenuBarManager::FillMenuManager( Menu* pMenu, const Reference< XFrame >& rF
+     sal_Bool    bAccessibilityEnabled( Application::GetSettings().GetMiscSettings().GetEnableATToolSupport() );
+     USHORT nItemCount = pMenu->GetItemCount();
+ 	for ( USHORT i = 0; i < nItemCount; i++ )
+-	{
++ 	{
+ 		USHORT nItemId = pMenu->GetItemId( i );
++        bool bShowMenuImages = m_bShowMenuImages;
++        MenuItemBits nBits =  pMenu->GetItemBits( nItemId );
++        if ( nBits )
++            bShowMenuImages = ( ( nBits & MIB_ICON ) == MIB_ICON );
+ 
+ 		::rtl::OUString aItemCommand = pMenu->GetItemCommand( nItemId );
+ 		if ( !aItemCommand.getLength() )
+@@ -1758,7 +1769,7 @@ void MenuBarManager::FillMenuManager( Menu* pMenu, const Reference< XFrame >& rF
+ 			            m_aMenuItemHandlerVector.push_back( pMenuItemHandler );
+ 
+ 			            // Set image for the addon popup menu item
+-			            if ( m_bShowMenuImages && !pPopup->GetItemImage( ITEMID_ADDONLIST ))
++			            if ( bShowMenuImages && !pPopup->GetItemImage( ITEMID_ADDONLIST ))
+ 			            {
+                             Reference< XFrame > xTemp( rFrame );
+                             Image aImage = GetImageFromURL( xTemp, aItemCommand, FALSE, m_bWasHiContrast );
+@@ -1788,7 +1799,7 @@ void MenuBarManager::FillMenuManager( Menu* pMenu, const Reference< XFrame >& rF
+ 		}
+         else if ( pMenu->GetItemType( i ) != MENUITEM_SEPARATOR )
+ 		{
+-			if ( m_bShowMenuImages )
++			if ( bShowMenuImages )
+ 			{
+ 			    if ( AddonMenuManager::IsAddonMenuId( nItemId ))
+ 			    {
+@@ -2097,7 +2108,7 @@ void MenuBarManager::FillMenu(
+         sal_uInt16                      nType = 0;
+         Reference< XIndexAccess >       xIndexContainer;
+         Reference< XDispatchProvider >  xDispatchProvider( rDispatchProvider );
+-
++        sal_Int16 nStyle = 0;
+         try
+         {
+             if ( rItemContainer->getByIndex( n ) >>= aProp )
+@@ -2126,6 +2137,8 @@ void MenuBarManager::FillMenu(
+                     else if ( aPropName.equalsAsciiL( ITEM_DESCRIPTOR_DISPATCHPROVIDER,
+                                                       LEN_DESCRIPTOR_DISPATCHPROVIDER ))
+                         aProp[i].Value >>= xDispatchProvider;
++                   else if ( aProp[i].Name.equalsAsciiL( ITEM_DESCRIPTOR_STYLE, ITEM_DESCRIPTOR_STYLE_LEN ))
++                        aProp[i].Value >>= nStyle;
+                 }
+ 
+                 if ( nType == ::com::sun::star::ui::ItemType::DEFAULT )
+@@ -2136,7 +2149,15 @@ void MenuBarManager::FillMenu(
+                     sal_Int32 nHelpId = aHelpURL.toInt32();
+                     if ( nHelpId > 0 )
+                         pMenu->SetHelpId( nId, (USHORT)nHelpId );
+-
++                    if ( nStyle )
++                    {
++                        MenuItemBits nBits = pMenu->GetItemBits( nId );
++                        if ( nStyle & ::com::sun::star::ui::ItemStyle::ICON )
++                           nBits |= MIB_ICON;
++                        if ( nStyle & ::com::sun::star::ui::ItemStyle::TEXT )
++                           nBits |= MIB_TEXT;
++                        pMenu->SetItemBits( nId, nBits );
++                    } 
+                     if ( xIndexContainer.is() )
+                     {
+                         PopupMenu* pNewPopupMenu = new PopupMenu;
+diff --git framework/source/uielement/toolbarmanager.cxx framework/source/uielement/toolbarmanager.cxx
+index 38d6324..dd83117 100644
+--- framework/source/uielement/toolbarmanager.cxx
++++ framework/source/uielement/toolbarmanager.cxx
+@@ -72,7 +72,6 @@
+ #include <com/sun/star/lang/XMultiComponentFactory.hpp>
+ #include <com/sun/star/frame/XModuleManager.hpp>
+ #include <com/sun/star/ui/XUIElementSettings.hpp>
+-#include <com/sun/star/container/XIndexContainer.hpp>
+ #include <com/sun/star/ui/XUIConfigurationPersistence.hpp>
+ #include <com/sun/star/ui/XModuleUIConfigurationManagerSupplier.hpp>
+ #include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp>
+@@ -1047,8 +1046,13 @@ void ToolBarManager::CreateControllers()
+                 }
+                 else
+                 {
+-                    xController = Reference< XStatusListener >(
+-                        new GenericToolbarController( m_xServiceManager, m_xFrame, m_pToolBar, nId, aCommandURL ));
++                    MenuDescriptionMap::iterator it = m_aMenuMap.find( nId );
++                    if ( it == m_aMenuMap.end() )
++                        xController = Reference< XStatusListener >(
++                            new GenericToolbarController( m_xServiceManager, m_xFrame, m_pToolBar, nId, aCommandURL ));
++                    else
++                        xController = Reference< XStatusListener >(
++                            new MenuToolbarController( m_xServiceManager, m_xFrame, m_pToolBar, nId, aCommandURL, m_aModuleIdentifier, m_aMenuMap[ nId ] ));
+                 }
+             }
+             else if ( pController )
+@@ -1180,6 +1184,10 @@ sal_uInt16 ToolBarManager::ConvertStyleToToolboxItemBits( sal_Int32 nStyle )
+         nItemBits |= TIB_REPEAT;
+     if ( nStyle & ::com::sun::star::ui::ItemStyle::DROPDOWN_ONLY )
+         nItemBits |= TIB_DROPDOWNONLY;
++    if ( nStyle & ::com::sun::star::ui::ItemStyle::TEXT )
++        nItemBits |= TIB_TEXT_ONLY;
++    if ( nStyle & ::com::sun::star::ui::ItemStyle::ICON )
++        nItemBits |= TIB_ICON_ONLY;
+ 
+     return nItemBits;
+ }
+@@ -1245,6 +1253,8 @@ void ToolBarManager::FillToolbar( const Reference< XIndexAccess >& rItemContaine
+     m_aControllerMap.clear();
+     m_aCommandMap.clear();
+ 
++    m_aMenuMap.clear();
++
+     CommandInfo aCmdInfo;
+     for ( sal_Int32 n = 0; n < rItemContainer->getCount(); n++ )
+     {
+@@ -1258,6 +1268,7 @@ void ToolBarManager::FillToolbar( const Reference< XIndexAccess >& rItemContaine
+         sal_Bool                    bIsVisible( sal_True );
+         sal_uInt32                  nStyle( 0 );
+ 
++        Reference< XIndexAccess >   aMenuDesc;
+         try
+         {
+             if ( rItemContainer->getByIndex( n ) >>= aProp )
+@@ -1280,6 +1291,8 @@ void ToolBarManager::FillToolbar( const Reference< XIndexAccess >& rItemContaine
+                         aProp[i].Value >>= nWidth;
+                     else if ( aProp[i].Name.equalsAsciiL( ITEM_DESCRIPTOR_STYLE, ITEM_DESCRIPTOR_STYLE_LEN ))
+                         aProp[i].Value >>= nStyle;
++                    else if ( aProp[i].Name.equalsAsciiL( ITEM_DESCRIPTOR_CONTAINER, ITEM_DESCRIPTOR_CONTAINER_LEN ))
++                        aProp[i].Value >>= aMenuDesc;
+                 }
+ 
+                 if (( nType == ::com::sun::star::ui::ItemType::DEFAULT ) && ( aCommandURL.getLength() > 0 ))
+@@ -1287,7 +1300,8 @@ void ToolBarManager::FillToolbar( const Reference< XIndexAccess >& rItemContaine
+                     ::rtl::OUString aString( RetrieveLabelFromCommand( aCommandURL ));
+ 
+                     sal_uInt16 nItemBits = ConvertStyleToToolboxItemBits( nStyle );
+-                    OSL_TRACE("** style for command url %s is 0x%x", rtl::OUStringToOString( aCommandURL, RTL_TEXTENCODING_UTF8  ).getStr(), nItemBits );
++                    if ( aMenuDesc.is() )
++                        m_aMenuMap[ nId ] = aMenuDesc;
+                     m_pToolBar->InsertItem( nId, aString, nItemBits );
+                     m_pToolBar->SetItemCommand( nId, aCommandURL );
+                     if ( aTooltip.getLength() )
+diff --git offapi/com/sun/star/ui/ItemStyle.idl offapi/com/sun/star/ui/ItemStyle.idl
+index 1243c67..5728b4a 100644
+--- offapi/com/sun/star/ui/ItemStyle.idl
++++ offapi/com/sun/star/ui/ItemStyle.idl
+@@ -149,6 +149,7 @@ constants ItemStyle
+         <p>This style is only valid if the item describes a toolbar item.</p>
+     */
+     const short DROPDOWN_ONLY = 1024;
++    const short TEXT = 2048;
+ };
+ 
+ }; }; }; };
+diff --git sc/source/filter/excel/excimp8.cxx sc/source/filter/excel/excimp8.cxx
+index 6a15a48..0b4d4ff 100644
+--- sc/source/filter/excel/excimp8.cxx
++++ sc/source/filter/excel/excimp8.cxx
+@@ -306,7 +306,7 @@ void ImportExcel8::ReadBasic( void )
+                     uno::Any aModel = uno::makeAny( pShell->GetModel() );
+                     pAppMgr->SetGlobalUNOConstant( "ThisExcelDoc", aModel );
+                 }
+-#if 0
++#if 1
+                 // see if we have the XCB stream
+                 SvStorageStreamRef xXCB = xRootStrg->OpenSotStream( String( RTL_CONSTASCII_USTRINGPARAM( "XCB" ) ), STREAM_STD_READ | STREAM_NOCREATE  );
+                 if ( xXCB.Is()|| SVSTREAM_OK == xXCB->GetError() )
+diff --git sc/source/filter/excel/xltoolbar.cxx sc/source/filter/excel/xltoolbar.cxx
+index 6591539..b7eacb1 100644
+--- sc/source/filter/excel/xltoolbar.cxx
++++ sc/source/filter/excel/xltoolbar.cxx
+@@ -122,16 +122,32 @@ void CTB::Print( FILE* fp )
+     }
+ }
+ 
+-bool CTB::ImportCustomToolBar( CustomToolBarImportHelper& helper )
++bool CTB::IsMenuToolbar()
+ {
++    return tb.IsMenuToolbar();
++}
++
++bool CTB::ImportMenuTB( CTBWrapper& rWrapper, const css::uno::Reference< css::container::XIndexContainer >& xMenuDesc, CustomToolBarImportHelper& helper )
++{
++    sal_Int32 index = 0;
++    for ( std::vector< TBC >::iterator it =  rTBC.begin(); it != rTBC.end(); ++it, ++index )
++    {
++        if ( !it->ImportToolBarControl( rWrapper, xMenuDesc, helper, IsMenuToolbar() ) )
++            return false;
++    }
++    return true;
++}
++
++bool CTB::ImportCustomToolBar( CTBWrapper& rWrapper, CustomToolBarImportHelper& helper )
++{
++
+     static rtl::OUString sToolbarPrefix( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/custom_" ) );
+     bool bRes = false;
+     try
+     {
+-        // #Fixme same issue here as in word, some deleted data
+-        // seems to still exist
+         if ( !tb.IsEnabled() )
+             return true;  // didn't fail, just ignoring
++
+         // Create default setting
+         uno::Reference< container::XIndexContainer > xIndexContainer( helper.getCfgManager()->createSettings(), uno::UNO_QUERY_THROW );
+         uno::Reference< container::XIndexAccess > xIndexAccess( xIndexContainer, uno::UNO_QUERY_THROW );
+@@ -143,8 +159,7 @@ bool CTB::ImportCustomToolBar( CustomToolBarImportHelper& helper )
+         rtl::OUString sToolBarName = sToolbarPrefix.concat( name.getString() );
+         for ( std::vector< TBC >::iterator it =  rTBC.begin(); it != rTBC.end(); ++it )
+         {
+-            // createToolBar item for control
+-            if ( !it->ImportToolBarControl( xIndexContainer, helper ) )
++            if ( !it->ImportToolBarControl( rWrapper, xIndexContainer, helper, IsMenuToolbar() ) )
+                 return false;
+         }
+ 
+@@ -152,12 +167,13 @@ bool CTB::ImportCustomToolBar( CustomToolBarImportHelper& helper )
+ 
+         helper.getCfgManager()->insertSettings( sToolBarName, xIndexAccess );
+         helper.applyIcons();
+-
++#if 0
+         uno::Reference< ui::XUIConfigurationPersistence > xPersistence( helper.getCfgManager()->getImageManager(), uno::UNO_QUERY_THROW );
+         xPersistence->store();
+ 
+         xPersistence.set( helper.getCfgManager(), uno::UNO_QUERY_THROW );
+         xPersistence->store();
++#endif 
+     
+         bRes = true;
+     }
+@@ -233,7 +249,7 @@ TBC::Print(FILE* fp)
+         tbcd->Print( fp );    
+ }
+ 
+-bool TBC::ImportToolBarControl( const css::uno::Reference< css::container::XIndexContainer >& toolbarcontainer, CustomToolBarImportHelper& helper )
++bool TBC::ImportToolBarControl( CTBWrapper& rWrapper, const css::uno::Reference< css::container::XIndexContainer >& toolbarcontainer, CustomToolBarImportHelper& helper, bool bIsMenuToolbar )
+ {
+     // how to identify built-in-command ?
+ //    bool bBuiltin = false;
+@@ -256,8 +272,31 @@ bool TBC::ImportToolBarControl( const css::uno::Reference< css::container::XInde
+         }
+ */
+         bool bBeginGroup = false;
+-        if ( ! tbcd->ImportToolBarControl( toolbarcontainer, helper, props, bBeginGroup ) )
++        if ( ! tbcd->ImportToolBarControl( helper, props, bBeginGroup, bIsMenuToolbar ) )
+             return false;
++        TBCMenuSpecific* pMenu = tbcd->getMenuSpecific();
++        if ( pMenu )
++        {
++            // search for CTB with the appropriate name ( it contains the
++            // menu items, although we cannot import ( or create ) a menu on
++            // a custom toolbar we can import the menu items in a separate 
++            // toolbar ( better than nothing )
++            CTB* pCustTB = rWrapper.GetCustomizationData( pMenu->Name() );
++            if ( pCustTB )
++            {
++                 uno::Reference< container::XIndexContainer > xMenuDesc;
++                 uno::Reference< lang::XMultiServiceFactory > xMSF( ::comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW );
++                 xMenuDesc.set( xMSF->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.document.IndexedPropertyValues" ) ) ), uno::UNO_QUERY_THROW );
++                if ( !pCustTB->ImportMenuTB( rWrapper, xMenuDesc, helper ) )
++                    return false;     
++                OSL_TRACE("*** Read menu, no. items is %d", xMenuDesc->getCount() );
++                beans::PropertyValue aProp;
++		
++                aProp.Name =  rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ItemDescriptorContainer") );
++                aProp.Value <<= xMenuDesc;
++                props.push_back( aProp );
++            } 
++        }
+ 
+         if ( bBeginGroup )
+         {
+@@ -346,6 +385,20 @@ CTBWrapper::Print( FILE* fp )
+     } 
+ }
+ 
++CTB* CTBWrapper::GetCustomizationData( const rtl::OUString& sTBName )
++{
++    CTB* pCTB = NULL;
++    for ( std::vector< CTB >::iterator it = rCTB.begin(); it != rCTB.end(); ++it )
++    {
++        if ( it->GetName().equals( sTBName ) )
++        {
++            pCTB = &(*it);
++            break;
++        }
++    }
++    return pCTB;
++}
++
+ bool CTBWrapper::ImportCustomToolBar( SfxObjectShell& rDocSh )
+ {
+     std::vector<CTB>::iterator it_end = rCTB.end();
+@@ -356,8 +409,17 @@ bool CTBWrapper::ImportCustomToolBar( SfxObjectShell& rDocSh )
+         uno::Reference< ui::XModuleUIConfigurationManagerSupplier > xAppCfgSupp( xMSF->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ui.ModuleUIConfigurationManagerSupplier" ) ) ), uno::UNO_QUERY_THROW ); 
+         CustomToolBarImportHelper helper( rDocSh, xAppCfgSupp->getUIConfigurationManager( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.SpreadsheetDocument" ) ) ) );
+         helper.setMSOCommandMap( new  MSOExcelCommandConvertor() );
+-        if ( !(*it).ImportCustomToolBar( helper ) )
+-            return false;
++        // Ignore menu toolbars, excel doesn't ( afaics ) store
++        // menu customizations ( but you can have menus in a customtoolbar
++        // such menus will be dealt with when they are encountered 
++        // as part of importing the appropriate MenuSpecific toolbar control )
++
++
++        if ( !(*it).IsMenuToolbar() ) 
++        {
++            if ( !(*it).ImportCustomToolBar( *this, helper ) )
++                return false;
++        }
+     } 
+     return true;
+ }
+diff --git sc/source/filter/excel/xltoolbar.hxx sc/source/filter/excel/xltoolbar.hxx
+index af986c7..deef46c 100644
+--- sc/source/filter/excel/xltoolbar.hxx
++++ sc/source/filter/excel/xltoolbar.hxx
+@@ -5,6 +5,7 @@
+ 
+ namespace css = ::com::sun::star;
+ 
++class CTBWrapper;
+ // hmm I don't normally use these packed structures
+ // but.. hey always good to do something different
+ class TBCCmd : public TBBase
+@@ -31,7 +32,7 @@ public:
+     ~TBC(){}
+     void Print( FILE* );
+     bool Read(SvStream *pS);
+-    bool ImportToolBarControl( const com::sun::star::uno::Reference< com::sun::star::container::XIndexContainer >& toolbarcontainer, CustomToolBarImportHelper& helper );
++    bool ImportToolBarControl( CTBWrapper&, const com::sun::star::uno::Reference< com::sun::star::container::XIndexContainer >& toolbarcontainer, CustomToolBarImportHelper& helper, bool bIsMenuBar );
+ };
+  
+ class CTB : public TBBase
+@@ -41,13 +42,19 @@ class CTB : public TBBase
+     std::vector<TBVisualData> rVisualData;
+     sal_uInt32 ectbid;
+     std::vector< TBC > rTBC;
++    bool ImportCustomToolBar_Impl( CTBWrapper&, CustomToolBarImportHelper& );
+ public:
+     CTB();
+     CTB(sal_uInt16);
+     ~CTB(){}
+     void Print( FILE* );
+     bool Read(SvStream *pS);
+-    bool ImportCustomToolBar( CustomToolBarImportHelper& );
++    bool IsMenuToolbar();
++    bool ImportCustomToolBar( CTBWrapper&, CustomToolBarImportHelper& );
++    bool ImportMenuTB( CTBWrapper&, const css::uno::Reference< css::container::XIndexContainer >&, CustomToolBarImportHelper& );
++    rtl::OUString GetName() { return tb.getName().getString(); }
++
++
+ };
+ 
+ class CTBS : public TBBase
+@@ -81,6 +88,7 @@ public:
+     bool Read(SvStream *pS);
+     void Print( FILE* );
+     bool ImportCustomToolBar( SfxObjectShell& rDocSh );
++    CTB* GetCustomizationData( const rtl::OUString& name );
+ };
+ 
+ 
+diff --git svx/inc/svx/mstoolbar.hxx svx/inc/svx/mstoolbar.hxx
+index c102ade..01ef608 100644
+--- svx/inc/svx/mstoolbar.hxx
++++ svx/inc/svx/mstoolbar.hxx
+@@ -10,9 +10,11 @@
+ #include <com/sun/star/frame/XModel.hpp>
+ #include <com/sun/star/container/XIndexContainer.hpp>
+ #include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp>
++#include <com/sun/star/ui/ImageType.hpp>
+ #include <com/sun/star/graphic/XGraphic.hpp>
+ #include <com/sun/star/beans/XPropertySet.hpp>
+ #include <vcl/bitmap.hxx>
++#include <cppuhelper/implbase1.hxx>
+ 
+ namespace css = ::com::sun::star;
+ 
+@@ -41,6 +43,7 @@ class SVX_DLLPUBLIC CustomToolBarImportHelper
+     css::uno::Reference< css::ui::XUIConfigurationManagerSupplier > m_xCfgSupp;
+     css::uno::Reference< css::ui::XUIConfigurationManager > m_xAppCfgMgr;
+     SfxObjectShell& mrDocSh;
++    void ScaleImage( css::uno::Reference< css::graphic::XGraphic >& xGraphic, long nNewSize );
+ public:
+     CustomToolBarImportHelper( SfxObjectShell& rDocSh, const css::uno::Reference< css::ui::XUIConfigurationManager >& rxAppCfgMgr );
+ 
+@@ -56,6 +59,7 @@ public:
+     rtl::OUString MSOCommandToOOCommand( sal_Int16 msoCmd );
+     rtl::OUString MSOTCIDToOOCommand( sal_Int16 msoTCID );
+     SfxObjectShell& GetDocShell() { return mrDocSh; }
++    void showToolbar( const rtl::OUString& rName );
+ };
+ 
+ class SVX_DLLPUBLIC TBBase
+@@ -163,6 +167,7 @@ public:
+     ~TBCMenuSpecific(){}
+     bool Read(SvStream *pS);
+     void Print( FILE* );
++    rtl::OUString Name();
+ };
+ 
+ class SVX_DLLPUBLIC TBCCDData : public TBBase
+@@ -268,8 +273,9 @@ public:
+     ~TBCData(){}
+     bool Read(SvStream *pS);
+     void Print( FILE* );
+-    bool ImportToolBarControl(  const css::uno::Reference< css::container::XIndexContainer >&, CustomToolBarImportHelper&, std::vector< css::beans::PropertyValue >&, bool& bBeginGroup );
++    bool ImportToolBarControl( CustomToolBarImportHelper&, std::vector< css::beans::PropertyValue >&, bool& bBeginGroup, bool bIsMenuBar );
+     TBCGeneralInfo& getGeneralInfo() { return controlGeneralInfo; }
++    TBCMenuSpecific* getMenuSpecific();
+ };
+ 
+ class SVX_DLLPUBLIC TB : public TBBase
+@@ -290,6 +296,7 @@ public:
+     sal_Int16 getcCL(){ return cCL; }
+     WString& getName(){ return name; }
+     bool IsEnabled();
++    bool IsMenuToolbar(){ return ( ( ltbtr & 0x2000000 ) == 0x2000000 ); }
+     bool NeedsPositioning();
+ };
+ 
+@@ -305,6 +312,8 @@ public:
+     void Print( FILE* fo );
+ };
+ 
++typedef cppu::WeakImplHelper1< css::container::XIndexContainer > PropertyValueIndexContainer_BASE;
++
+ class SVX_DLLPUBLIC TBVisualData : public TBBase
+ {
+     sal_Int8 tbds;
+diff --git svx/source/dialog/cfg.cxx svx/source/dialog/cfg.cxx
+index bbf1b0a..243a940 100644
+--- svx/source/cui/cfg.cxx
++++ svx/source/cui/cfg.cxx
+@@ -5752,7 +5752,7 @@ bool SvxIconSelectorDialog::ReplaceGraphicItem(
+ 				if ( bOK && ((aSize.Width != m_nExpectedSize) || (aSize.Height != m_nExpectedSize)) )
+ 				{
+ 					BitmapEx aBitmap = aImage.GetBitmapEx();
+-					BitmapEx aBitmapex = AutoScaleBitmap(aBitmap, m_nExpectedSize);
++                    BitmapEx aBitmapex = BitmapEx::AutoScaleBitmap(aBitmap, m_nExpectedSize);
+ 					aImage = Image( aBitmapex);
+ 				}
+ 				aTbSymbol.InsertItem( nId,aImage, aURL, 0, 0 ); //modify
+@@ -5916,7 +5916,7 @@ bool SvxIconSelectorDialog::ImportGraphic( const OUString& aURL )
+                 if ( bOK && ((aSize.Width != m_nExpectedSize) || (aSize.Height != m_nExpectedSize)) )
+ 				{
+ 					BitmapEx aBitmap = aImage.GetBitmapEx();
+-					BitmapEx aBitmapex = AutoScaleBitmap(aBitmap, m_nExpectedSize);
++                    BitmapEx aBitmapex = BitmapEx::AutoScaleBitmap(aBitmap, m_nExpectedSize);
+ 					aImage = Image( aBitmapex);
+ 				}
+ 				if ( bOK && !!aImage )
+@@ -6029,59 +6029,3 @@ SvxIconChangeDialog::SvxIconChangeDialog(
+ 	aLineEditDescription.EnableCursor( FALSE );
+ 	aLineEditDescription.SetText(aMessage);
+ }
+-
+-BitmapEx SvxIconSelectorDialog::AutoScaleBitmap(BitmapEx & aBitmap, const long aStandardSize)
+-{
+-	Point aEmptyPoint(0,0);
+-	sal_Int32 imgNewWidth = 0;
+-	sal_Int32 imgNewHeight = 0;
+-	double imgposX = 0;
+-	double imgposY = 0;
+-    BitmapEx  aRet = aBitmap;
+-	double imgOldWidth = aRet.GetSizePixel().Width();
+-	double imgOldHeight =aRet.GetSizePixel().Height();
+-
+-    Size aScaledSize;
+-    if (imgOldWidth >= aStandardSize || imgOldHeight >= aStandardSize)
+-	{
+-		if (imgOldWidth >= imgOldHeight)
+-		{
+-			imgNewWidth = aStandardSize;
+-			imgNewHeight = sal_Int32(imgOldHeight / (imgOldWidth / aStandardSize) + 0.5);
+-			imgposX = 0;
+-			imgposY = (aStandardSize - (imgOldHeight / (imgOldWidth / aStandardSize) + 0.5)) / 2 + 0.5;
+-		}
+-		else
+-		{
+-			imgNewHeight = aStandardSize;
+-			imgNewWidth = sal_Int32(imgOldWidth / (imgOldHeight / aStandardSize) + 0.5);
+-			imgposY = 0;
+-			imgposX = (aStandardSize - (imgOldWidth / (imgOldHeight / aStandardSize) + 0.5)) / 2 + 0.5;
+-		}
+-
+-		aScaledSize = Size( imgNewWidth, imgNewHeight );
+-        aRet.Scale( aScaledSize, BMP_SCALE_INTERPOLATE );
+-	}
+-	else
+-	{
+-		imgposX = (aStandardSize - imgOldWidth) / 2 + 0.5;
+-		imgposY = (aStandardSize - imgOldHeight) / 2 + 0.5;
+-	}
+-
+-    Size aBmpSize = aRet.GetSizePixel();
+-    Size aStdSize( aStandardSize, aStandardSize );
+-    Rectangle aRect(aEmptyPoint, aStdSize );
+-
+-    VirtualDevice aVirDevice( *Application::GetDefaultDevice(), 0, 1 );
+-	aVirDevice.SetOutputSizePixel( aStdSize );
+-	aVirDevice.SetFillColor( COL_TRANSPARENT );
+-    aVirDevice.SetLineColor( COL_TRANSPARENT );
+-
+-    //draw a rect into virDevice
+-	aVirDevice.DrawRect( aRect );
+-	Point aPointPixel( (long)imgposX, (long)imgposY );
+-	aVirDevice.DrawBitmapEx( aPointPixel, aRet );
+-	aRet = aVirDevice.GetBitmapEx( aEmptyPoint, aStdSize );
+-
+-	return aRet;
+-}
+diff --git svx/source/msfilter/mstoolbar.cxx svx/source/msfilter/mstoolbar.cxx
+index 1d5c801..0d45af7 100644
+--- svx/source/msfilter/mstoolbar.cxx
++++ svx/source/msfilter/mstoolbar.cxx
+@@ -4,19 +4,55 @@
+ #include <com/sun/star/ui/XUIConfigurationPersistence.hpp>
+ #include <com/sun/star/ui/XImageManager.hpp>
+ #include <com/sun/star/ui/ItemType.hpp>
++#include <com/sun/star/ui/ItemStyle.hpp>
++#include <com/sun/star/frame/XLayoutManager.hpp>
+ #include <fstream>
+ #include <vcl/graph.hxx>
+ #include <vcl/bitmapex.hxx>
++#include <vcl/image.hxx>
+ #include <map>
+ #include <sfx2/objsh.hxx>
+ #include <basic/basmgr.hxx>
+ #include <svtools/filterutils.hxx>
+ #include <boost/scoped_array.hpp>
+ #include <svx/msvbahelper.hxx>
++#include <svtools/miscopt.hxx>
++#include <vcl/svapp.hxx>
++#include <vcl/window.hxx>
++
++using namespace com::sun::star;
+ 
+ int TBBase::nIndent = 0;
+ 
+-using namespace com::sun::star;
++void CustomToolBarImportHelper::showToolbar( const rtl::OUString& rName )
++{
++    try
++    {
++        uno::Reference< frame::XController > xCntrller( mrDocSh.GetModel()->getCurrentController(), uno::UNO_QUERY_THROW );
++        uno::Reference< beans::XPropertySet > xProps( xCntrller->getFrame(), uno::UNO_QUERY_THROW );
++        uno::Reference< frame::XLayoutManager > xLayoutMgr( xProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("LayoutManager") ) ), uno::UNO_QUERY_THROW );
++        xLayoutMgr->showElement( rName );
++    }
++    catch( uno::Exception& ) {}
++}
++
++void CustomToolBarImportHelper::ScaleImage( uno::Reference< graphic::XGraphic >& xGraphic, long nNewSize )
++{
++    Graphic aGraphic( xGraphic );
++    Size aSize = aGraphic.GetSizePixel();
++    if ( aSize.Height() && ( aSize.Height() == aSize.Width() ) )
++    {
++        Image aImage( xGraphic );
++        if ( aSize.Height() != nNewSize )
++        {
++            BitmapEx aBitmap = aImage.GetBitmapEx();
++            BitmapEx aBitmapex = BitmapEx::AutoScaleBitmap(aBitmap, nNewSize );
++            aImage = Image( aBitmapex);
++            xGraphic = aImage.GetXGraphic();
++        }
++    } 
++}
++
+ void CustomToolBarImportHelper::applyIcons()
+ {
+     for ( std::vector< iconcontrolitem >::iterator it = iconcommands.begin(); it != iconcommands.end(); ++it )
+@@ -25,14 +61,19 @@ void CustomToolBarImportHelper::applyIcons()
+         commands[ 0 ] = it->sCommand;
+         uno::Sequence< uno::Reference< graphic::XGraphic > > images(1);
+         images[ 0 ] = it->image;
++       
+         OSL_TRACE("About to applyIcons for command %s, have image ? %s", rtl::OUStringToOString( commands[ 0 ], RTL_TEXTENCODING_UTF8 ).getStr(), images[ 0 ].is() ? "yes" : "no" );
+         uno::Reference< ui::XImageManager > xImageManager( getCfgManager()->getImageManager(), uno::UNO_QUERY_THROW );
+-        // 1 seems to work best for MSO images, otherwise they don't get displayed ( I guess the default size
+-        // in ooo is different )
+-        //xImageManager->insertImages( 1,  commands, images ); // #FIXME and scale images based on default icon size
+-        xImageManager->replaceImages( 1,  commands, images );
+-        xImageManager->replaceImages( 2,  commands, images );
+-        xImageManager->replaceImages( 3,  commands, images );
++        sal_uInt16 nColor = ui::ImageType::COLOR_NORMAL; 
++
++        Window* topwin = Application::GetActiveTopWindow();
++	if ( topwin != NULL && topwin->GetDisplayBackground().GetColor().IsDark() )
++            nColor = css::ui::ImageType::COLOR_HIGHCONTRAST;
++
++        ScaleImage( images[ 0 ], 16 );
++        xImageManager->replaceImages( ui::ImageType::SIZE_DEFAULT | nColor,  commands, images );
++        ScaleImage( images[ 0 ], 26 );
++        xImageManager->replaceImages( ui::ImageType::SIZE_LARGE | nColor,  commands, images );
+     }
+ }
+ 
+@@ -196,23 +237,27 @@ bool TBCData::Read(SvStream *pS)
+     return true;
+ }
+ 
+-bool TBCData::ImportToolBarControl( const css::uno::Reference< css::container::XIndexContainer >& /*toolbarcontainer*/, CustomToolBarImportHelper& helper, std::vector< css::beans::PropertyValue >& props, bool& bBeginGroup )
++TBCMenuSpecific* TBCData::getMenuSpecific()
++{
++    TBCMenuSpecific* pMenu = dynamic_cast< TBCMenuSpecific* >( controlSpecificInfo.get() );
++    return pMenu;
++}
++bool TBCData::ImportToolBarControl( CustomToolBarImportHelper& helper, std::vector< css::beans::PropertyValue >& props, bool& bBeginGroup, bool bIsMenuBar )
+ {
++    sal_uInt16  nStyle = 0;
+     bBeginGroup = rHeader.isBeginGroup();
+     controlGeneralInfo.ImportToolBarControlData( helper, props );
+     beans::PropertyValue aProp;
+     aProp.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Visible") ) ;
+     aProp.Value = uno::makeAny( rHeader.isVisible() ); // where is the visible attribute stored
+-
++    props.push_back( aProp );
+     if ( rHeader.getTct() == 0x01
+     || rHeader.getTct() == 0x10 )
+     {
+         TBCBSpecific* pSpecificInfo = dynamic_cast< TBCBSpecific* >( controlSpecificInfo.get() );
+         if ( pSpecificInfo )
+         {
+-            // if we have a icon then lets  set it for the command ( but I
+-            // have a nasty suspicion the toolbar actually needs to be set
+-            // up ( and added ) before you can asssign an image :-/
++            // if we have a icon then lets  set it for the command 
+             rtl::OUString sCommand;
+             for ( std::vector< css::beans::PropertyValue >::iterator it = props.begin(); it != props.end(); ++it )
+             {
+@@ -252,6 +297,32 @@ bool TBCData::ImportToolBarControl( const css::uno::Reference< css::container::X
+             }
+         }
+     }
++    else if ( rHeader.getTct() == 0x0a )
++    {
++        aProp.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("CommandURL") ) ;
++        aProp.Value = uno::makeAny( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("private:" ) ) ); // dummy command
++        nStyle |= ui::ItemStyle::DROP_DOWN;
++        props.push_back( aProp );
++    }
++
++    short icontext =  ( rHeader.getTbct() & 0x03 );
++    aProp.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Style") ) ;
++    if ( bIsMenuBar )
++    {
++        nStyle |= ui::ItemStyle::TEXT;
++        if ( !icontext || icontext == 0x3 )
++            // Text And image
++            nStyle |= ui::ItemStyle::ICON;
++    }
++    else 
++    {
++        if ( ( icontext & 0x02 ) == 0x02 )
++            nStyle |= ui::ItemStyle::TEXT;
++        if ( !icontext || ( icontext & 0x03 ) == 0x03 )
++            nStyle |= ui::ItemStyle::ICON;
++    }
++    aProp.Value <<= nStyle;
++    props.push_back( aProp );
+     return true; // just ignore
+ }
+ 
+@@ -391,9 +462,6 @@ TBCGeneralInfo::ImportToolBarControlData( CustomToolBarImportHelper& helper, std
+         aProp.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Tooltip") );
+         aProp.Value = uno::makeAny( tooltip.getString() ); 
+         sControlData.push_back( aProp );
+-
+-        // #TODO find out what is the property for tooltip?
+-        sControlData.push_back( aProp );
+ /*
+ aToolbarItem(0).Name = "CommandURL" wstrOnAction
+ aToolbarItem(0).Value = Command
+@@ -437,6 +505,13 @@ TBCMenuSpecific::Print( FILE* fp )
+ 
+ }
+ 
++rtl::OUString TBCMenuSpecific::Name()
++{
++    rtl::OUString aName;
++    if ( name.get() )
++        aName = name->getString();
++    return aName;
++}
+ TBCBSpecific::TBCBSpecific() : bFlags( 0 )
+ {
+ }
+diff --git sw/source/filter/ww8/ww8toolbar.cxx sw/source/filter/ww8/ww8toolbar.cxx
+index 22581ea..e6b047a 100644
+--- sw/source/filter/ww8/ww8toolbar.cxx
++++ sw/source/filter/ww8/ww8toolbar.cxx
+@@ -15,6 +15,9 @@
+ #include <map>
+ using namespace com::sun::star;
+ 
++// no. of visual data elements in a CTB ( fixed ) 
++const short nVisualData = 5;
++
+ typedef std::map< sal_Int16, rtl::OUString > IdToString;
+ 
+ class MSOWordCommandConvertor : public MSOCommandConvertor
+@@ -81,6 +84,20 @@ Customization* CTBWrapper::GetCustomizaton( sal_Int16 index )
+     return &rCustomizations[ index ]; 
+ }
+ 
++CTB* CTBWrapper::GetCustomizationData( const rtl::OUString& sTBName )
++{
++    CTB* pCTB = NULL;
++    for ( std::vector< Customization >::iterator it = rCustomizations.begin(); it != rCustomizations.end(); ++it )
++    {
++        if ( it->GetCustomizationData() && it->GetCustomizationData()->GetName().equals( sTBName ) )
++        {
++            pCTB = it->GetCustomizationData();
++            break;
++        }
++    }
++    return pCTB;
++}
++
+ bool CTBWrapper::Read( SvStream* pS )
+ {
+     OSL_TRACE("CTBWrapper::Read() stream pos 0x%x", pS->Tell() );
+@@ -178,14 +195,14 @@ void CTBWrapper::Print( FILE* fp )
+ 
+ bool CTBWrapper::ImportCustomToolBar( SfxObjectShell& rDocSh )
+ {
+-    
+     for ( std::vector< Customization >::iterator it = rCustomizations.begin(); it != rCustomizations.end(); ++it )
+     {
+         uno::Reference< lang::XMultiServiceFactory > xMSF( ::comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW );
+         uno::Reference< ui::XModuleUIConfigurationManagerSupplier > xAppCfgSupp( xMSF->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ui.ModuleUIConfigurationManagerSupplier" ) ) ), uno::UNO_QUERY_THROW ); 
+         CustomToolBarImportHelper helper( rDocSh, xAppCfgSupp->getUIConfigurationManager( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.TextDocument" ) ) ) );
+-        helper.setMSOCommandMap( new  MSOWordCommandConvertor() );
+-        if ( !(*it).ImportCustomToolBar( helper ) )
++        helper.setMSOCommandMap( new MSOWordCommandConvertor() );
++
++        if ( !(*it).ImportCustomToolBar( *this, helper ) )
+             return false;
+     }
+     return false;
+@@ -263,17 +280,8 @@ void Customization::Print( FILE* fp )
+     
+ }
+ 
+-bool Customization::ImportMenu( const uno::Reference< container::XIndexContainer >& xIndexContainer, CustomToolBarImportHelper& helper )
++bool Customization::ImportMenu( CTBWrapper& rWrapper, CustomToolBarImportHelper& helper )
+ {
+-    if ( !customizationDataCTB.get() )
+-        return false;
+-    return customizationDataCTB->ImportMenu( xIndexContainer, helper );
+-}
+-
+-bool Customization::ImportCustomToolBar( CustomToolBarImportHelper& helper )
+-{
+-    if ( bIsDroppedMenuTB )
+-        return true; // ignore ( will be processed by the ImportMenu )
+     if ( tbidForTBD == 0x25 )  // we can handle in a limited way additions the built-in menu bar
+     {
+         for ( std::vector< TBDelta >::iterator it = customizationDataTBDelta.begin(); it != customizationDataTBDelta.end(); ++it )
+@@ -287,8 +295,6 @@ bool Customization::ImportCustomToolBar( CustomToolBarImportHelper& helper )
+                 {
+                     // currently only support built-in menu
+                     rtl::OUString sMenuBar( RTL_CONSTASCII_USTRINGPARAM("private:resource/menubar/") );
+-                    if ( tbidForTBD != 0x25 )
+-                        return false;
+ 
+                     sMenuBar = sMenuBar.concat( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("menubar") ) );
+                     // Get menu name
+@@ -329,7 +335,7 @@ bool Customization::ImportCustomToolBar( CustomToolBarImportHelper& helper )
+                     aPopupMenu[3].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ItemDescriptorContainer") );
+                     uno::Reference< container::XIndexContainer > xMenuContainer( xSCF->createInstanceWithContext( xContext ), uno::UNO_QUERY_THROW );
+                     aPopupMenu[3].Value <<= xMenuContainer;
+-                    if ( !pCust->ImportMenu( xMenuContainer, helper ) )
++                    if ( pCust->customizationDataCTB.get() && !pCust->customizationDataCTB->ImportMenuTB( rWrapper, xMenuContainer, helper ) )
+                         return false;
+                     OSL_TRACE("** there are %d menu items on the bar, inserting after that", xIndexContainer->getCount() );
+                     xIndexContainer->insertByIndex( xIndexContainer->getCount(), uno::makeAny( aPopupMenu ) );
+@@ -338,14 +344,28 @@ bool Customization::ImportCustomToolBar( CustomToolBarImportHelper& helper )
+                         helper.getCfgManager()->replaceSettings( sMenuBar, uno::Reference< container::XIndexAccess >( xIndexContainer, uno::UNO_QUERY_THROW ) );
+                     else
+                         helper.getCfgManager()->insertSettings( sMenuBar, uno::Reference< container::XIndexAccess >( xIndexContainer, uno::UNO_QUERY_THROW ) );
++        uno::Reference< ui::XUIConfigurationPersistence > xPersistence( helper.getCfgManager(), uno::UNO_QUERY_THROW );
++        xPersistence->store();
+                 }
+             }
+         }
+         return true;
+     }
++    return true;
++}
++
++bool Customization::ImportCustomToolBar( CTBWrapper& rWrapper, CustomToolBarImportHelper& helper )
++{
++    if ( GetTBIDForTB() == 0x25 )
++        return ImportMenu( rWrapper, helper );
+     if ( !customizationDataCTB.get() )
+         return false;
+-    return customizationDataCTB->ImportCustomToolBar( helper );
++    if ( !customizationDataCTB->IsMenuToolbar() )
++    {
++        if ( !customizationDataCTB->ImportCustomToolBar( rWrapper, helper ) )
++            return false;
++    }
++    return true;
+ }
+ 
+ TBDelta::TBDelta() : doprfatendFlags(0)
+@@ -431,6 +451,12 @@ CTB::~CTB()
+ {
+ }
+ 
++bool CTB::IsMenuToolbar()
++{
++    return tb.IsMenuToolbar();
++}
++
++
+ bool CTB::Read( SvStream *pS)
+ {
+     OSL_TRACE("CTB::Read() stream pos 0x%x", pS->Tell() );
+@@ -438,10 +464,14 @@ bool CTB::Read( SvStream *pS)
+     if ( !name.Read( pS ) )
+         return false;
+     *pS >> cbTBData;
+-    // sal_Int32 nTBSize = cbTBData - sizeof(rVisualData) - 12;
+     if ( !tb.Read( pS ) )
+         return false;
+-    pS->Read( &rVisualData, sizeof( rVisualData ) );
++    for ( short index = 0; index < nVisualData; ++index )
++    {
++        TBVisualData aVisData;
++        aVisData.Read( pS );
++        rVisualData.push_back( aVisData );
++    }
+ 
+     *pS >> iWCTBl >> reserved >> unused >> cCtls;
+     
+@@ -467,6 +497,12 @@ CTB::Print( FILE* fp )
+     indent_printf(fp, "  cbTBData size, in bytes, of this structure excluding the name, cCtls, and rTBC fields.  %x\n", static_cast< unsigned int >( cbTBData ) );
+     
+     tb.Print(fp);
++    for ( short counter = 0; counter < nVisualData; ++counter )
++    {
++        indent_printf( fp, "  TBVisualData [%d]\n", counter);
++        Indent b;
++        rVisualData[ counter ].Print( fp );
++    } 
+     indent_printf(fp, "  iWCTBl 0x%x reserved 0x%x unused 0x%x cCtls( toolbar controls ) 0x%x \n", static_cast< unsigned int >( iWCTBl ), reserved, unused, static_cast< unsigned int >( cCtls ) );
+     if ( cCtls )
+     {
+@@ -479,18 +515,13 @@ CTB::Print( FILE* fp )
+     }
+ }
+ 
+-bool CTB::ImportCustomToolBar( CustomToolBarImportHelper& helper )
++bool CTB::ImportCustomToolBar( CTBWrapper& rWrapper, CustomToolBarImportHelper& helper )
+ {
+     static rtl::OUString sToolbarPrefix( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/custom_" ) );
+     bool bRes = false;
+     try
+     {
+-        // #FIXME this is a bogus check ( but is seems to work )
+-        // the fNeedsPositioning seems always to be set for toolbars that
+-        // have been deleted ( sofar I fail to find something else to indicate
+-        // not to read them ) - e.g. We can have CTB records which relate to
+-        // deleted items ( usually associated with popups )
+-        if ( !tb.IsEnabled() || tb.NeedsPositioning() )
++        if ( !tb.IsEnabled() )
+             return true;  // didn't fail, just ignoring
+         // Create default setting
+         uno::Reference< container::XIndexContainer > xIndexContainer( helper.getCfgManager()->createSettings(), uno::UNO_QUERY_THROW );
+@@ -504,7 +535,7 @@ bool CTB::ImportCustomToolBar( CustomToolBarImportHelper& helper )
+         for ( std::vector< TBC >::iterator it =  rTBC.begin(); it != rTBC.end(); ++it )
+         {
+             // createToolBar item for control
+-            if ( !it->ImportToolBarControl( xIndexContainer, helper ) )
++            if ( !it->ImportToolBarControl( rWrapper, xIndexContainer, helper, IsMenuToolbar() ) )
+                 return false;
+         }
+     
+@@ -512,27 +543,29 @@ bool CTB::ImportCustomToolBar( CustomToolBarImportHelper& helper )
+     
+         helper.getCfgManager()->insertSettings( sToolBarName, xIndexAccess );
+         helper.applyIcons();
+-    
++#if 1 // don't think this is necessary
+         uno::Reference< ui::XUIConfigurationPersistence > xPersistence( helper.getCfgManager()->getImageManager(), uno::UNO_QUERY_THROW );
+         xPersistence->store();
+-    
++
+         xPersistence.set( helper.getCfgManager(), uno::UNO_QUERY_THROW );
+         xPersistence->store();
++#endif
+         bRes = true;
+     }
+-    catch( uno::Exception& )
++    catch( uno::Exception& e )
+     {
++        OSL_TRACE("***** For some reason we have an exception %s", rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 ).getStr() );
+         bRes = false;
+     }
+     return bRes;
+ }
+ 
+-bool CTB::ImportMenu( const css::uno::Reference< css::container::XIndexContainer >& xIndexContainer, CustomToolBarImportHelper& rHelper )
++bool CTB::ImportMenuTB( CTBWrapper& rWrapper, const css::uno::Reference< css::container::XIndexContainer >& xIndexContainer, CustomToolBarImportHelper& rHelper )
+ {
+     for ( std::vector< TBC >::iterator it =  rTBC.begin(); it != rTBC.end(); ++it )
+     {
+         // createToolBar item for control
+-        if ( !it->ImportToolBarControl( xIndexContainer, rHelper ) )
++        if ( !it->ImportToolBarControl( rWrapper, xIndexContainer, rHelper, true ) )
+             return false;
+     }
+     return true;
+@@ -583,7 +616,7 @@ void TBC::Print( FILE* fp )
+ }
+ 
+ bool
+-TBC::ImportToolBarControl( const css::uno::Reference< css::container::XIndexContainer >& toolbarcontainer, CustomToolBarImportHelper& helper )
++TBC::ImportToolBarControl( CTBWrapper& rWrapper, const css::uno::Reference< css::container::XIndexContainer >& toolbarcontainer, CustomToolBarImportHelper& helper, bool bIsMenuBar )
+ {
+     // cmtFci       0x1 Command based on a built-in command. See CidFci.
+     // cmtMacro     0x2 Macro command. See CidMacro.
+@@ -634,12 +667,35 @@ TBC::ImportToolBarControl( const css::uno::Reference< css::container::XIndexCont
+                 aProp.Value <<= sCommand;
+                 props.push_back( aProp ); 
+             }
+-         
+         }
+         bool bBeginGroup = false;
+-        if ( ! tbcd->ImportToolBarControl( toolbarcontainer, helper, props, bBeginGroup ) )
++        if ( ! tbcd->ImportToolBarControl( helper, props, bBeginGroup, bIsMenuBar ) )
+             return false;
+ 
++        TBCMenuSpecific* pMenu = tbcd->getMenuSpecific();
++        if ( pMenu )
++        {
++            OSL_TRACE("** control has a menu, name of toolbar with menu items is %s", rtl::OUStringToOString( pMenu->Name(), RTL_TEXTENCODING_UTF8 ).getStr() );
++            // search for CTB with the appropriate name ( it contains the
++            // menu items, although we cannot import ( or create ) a menu on
++            // a custom toolbar we can import the menu items in a separate 
++            // toolbar ( better than nothing )
++            CTB* pCustTB = rWrapper.GetCustomizationData( pMenu->Name() );
++            if ( pCustTB )
++            {
++                 uno::Reference< container::XIndexContainer > xMenuDesc;
++                 uno::Reference< lang::XMultiServiceFactory > xMSF( ::comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW );
++                 xMenuDesc.set( xMSF->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.document.IndexedPropertyValues" ) ) ), uno::UNO_QUERY_THROW );
++                if ( !pCustTB->ImportMenuTB( rWrapper,xMenuDesc, helper ) )
++                    return false;     
++                beans::PropertyValue aProp;
++		
++                aProp.Name =  rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ItemDescriptorContainer") );
++                aProp.Value <<= xMenuDesc;
++                props.push_back( aProp );
++            } 
++        }
++
+         if ( bBeginGroup )
+         {
+             // insert spacer
+diff --git sw/source/filter/ww8/ww8toolbar.hxx sw/source/filter/ww8/ww8toolbar.hxx
+index b533cbf..3dcf2de 100644
+--- sw/source/filter/ww8/ww8toolbar.hxx
++++ sw/source/filter/ww8/ww8toolbar.hxx
+@@ -15,6 +15,7 @@ public:
+     void Print( FILE* fp );
+ };
+ 
++class CTBWrapper;
+ class TBC : public TBBase
+ {
+     TBCHeader tbch;
+@@ -25,7 +26,7 @@ public:
+     ~TBC();
+     bool Read(SvStream *pS);
+     void Print( FILE* );
+-    bool ImportToolBarControl( const css::uno::Reference< css::container::XIndexContainer >&, CustomToolBarImportHelper& );
++    bool ImportToolBarControl( CTBWrapper&, const css::uno::Reference< css::container::XIndexContainer >&, CustomToolBarImportHelper&, bool );
+     rtl::OUString GetCustomText();
+ };
+ 
+@@ -34,7 +35,7 @@ class CTB : public TBBase
+     Xst name;
+     sal_Int32 cbTBData;
+     TB tb;
+-    sal_uInt8 rVisualData[ 100 ];
++    std::vector<TBVisualData> rVisualData;
+     sal_Int32 iWCTBl;
+     sal_uInt16 reserved;
+     sal_uInt16 unused;
+@@ -48,8 +49,10 @@ public:
+     ~CTB();
+     bool Read(SvStream *pS);
+     void Print( FILE* fp );
+-    bool ImportCustomToolBar( CustomToolBarImportHelper& );
+-    bool ImportMenu( const css::uno::Reference< css::container::XIndexContainer >&, CustomToolBarImportHelper& );
++    bool IsMenuToolbar();
++    bool ImportCustomToolBar( CTBWrapper&, CustomToolBarImportHelper& );
++    bool ImportMenuTB( CTBWrapper&, const css::uno::Reference< css::container::XIndexContainer >&, CustomToolBarImportHelper& );
++    rtl::OUString GetName() { return tb.getName().getString(); }
+ };
+ 
+ class TBDelta : public TBBase
+@@ -102,13 +105,16 @@ friend class CTBWrapper;
+     boost::shared_ptr< CTB > customizationDataCTB;
+     std::vector< TBDelta > customizationDataTBDelta; 
+     bool bIsDroppedMenuTB; 
++    bool ImportMenu( CTBWrapper&, const css::uno::Reference< css::container::XIndexContainer >&, CustomToolBarImportHelper& );
+ public:    
+     Customization( CTBWrapper* rapper );
+     ~Customization();
+     bool Read(SvStream *pS);
+-    bool ImportCustomToolBar( CustomToolBarImportHelper& );
+-    bool ImportMenu( const css::uno::Reference< css::container::XIndexContainer >&, CustomToolBarImportHelper& );
++    bool ImportCustomToolBar( CTBWrapper&, CustomToolBarImportHelper& );
++    bool ImportMenu( CTBWrapper&, CustomToolBarImportHelper& );
+     void Print( FILE* );
++    sal_Int32 GetTBIDForTB(){ return tbidForTBD; }
++    CTB*  GetCustomizationData() { return customizationDataCTB.get(); };
+ };
+ 
+ class SfxObjectShell; 
+@@ -138,7 +144,9 @@ public:
+     TBC* GetTBCAtOffset( sal_uInt32 nStreamOffset );
+     bool Read(SvStream *pS);
+     bool ImportCustomToolBar( SfxObjectShell& rDocSh );
++
+     Customization* GetCustomizaton( sal_Int16 index );
++    CTB* GetCustomizationData( const rtl::OUString& name );
+     void Print( FILE* );
+ };
+ 
+diff --git vcl/inc/vcl/bitmapex.hxx vcl/inc/vcl/bitmapex.hxx
+index 946b07c..ae0f373 100644
+--- vcl/inc/vcl/bitmapex.hxx
++++ vcl/inc/vcl/bitmapex.hxx
+@@ -385,6 +385,7 @@ public:
+ 
+ 	friend VCL_DLLPUBLIC SvStream&	operator<<( SvStream& rOStm, const BitmapEx& rBitmapEx );
+ 	friend VCL_DLLPUBLIC SvStream&	operator>>( SvStream& rIStm, BitmapEx& rBitmapEx );
++	static VCL_DLLPUBLIC BitmapEx AutoScaleBitmap(BitmapEx & aBitmap, const long aStandardSize);
+ };
+ 
+ #endif // _SV_BITMAPEX_HXX
+diff --git vcl/inc/vcl/menu.hxx vcl/inc/vcl/menu.hxx
+index 2975bf4..d833083 100644
+--- vcl/inc/vcl/menu.hxx
++++ vcl/inc/vcl/menu.hxx
+@@ -93,6 +93,8 @@ typedef USHORT MenuItemBits;
+ #define MIB_POPUPSELECT 		((MenuItemBits)0x0020)
+ // not in rsc/vclsrc.hxx because only a prelimitary solution
+ #define MIB_NOSELECT 		    ((MenuItemBits)0x0040)
++#define MIB_ICON 		    ((MenuItemBits)0x0080)
++#define MIB_TEXT 		    ((MenuItemBits)0x0100)
+ 
+ #define MENU_FLAG_NOAUTOMNEMONICS		0x0001
+ #define MENU_FLAG_HIDEDISABLEDENTRIES	0x0002
+diff --git vcl/inc/vcl/toolbox.hxx vcl/inc/vcl/toolbox.hxx
+index 90a35ee..803364b 100644
+--- vcl/inc/vcl/toolbox.hxx
++++ vcl/inc/vcl/toolbox.hxx
+@@ -119,6 +119,9 @@ typedef USHORT ToolBoxItemBits;
+ #define TIB_DROPDOWN            ((ToolBoxItemBits)0x0020)
+ #define TIB_REPEAT              ((ToolBoxItemBits)0x0040)
+ #define TIB_DROPDOWNONLY        ((ToolBoxItemBits)0x0080 | TIB_DROPDOWN)    // this button has only drop down functionality
++#define TIB_TEXT_ONLY           ((ToolBoxItemBits)0x0100)
++#define TIB_ICON_ONLY           ((ToolBoxItemBits)0x0200)
++#define TIB_TEXTICON            ((ToolBoxItemBits) TIB_TEXT_ONLY | TIB_ICON_ONLY )
+ 
+ // -----------------
+ // - ToolBox-Types -
+diff --git vcl/source/gdi/bitmapex.cxx vcl/source/gdi/bitmapex.cxx
+index 1e20b42..5a485ab 100644
+--- vcl/source/gdi/bitmapex.cxx
++++ vcl/source/gdi/bitmapex.cxx
+@@ -47,6 +47,7 @@
+ #include <tools/rc.h>
+ #endif
+ #include <vcl/svapp.hxx>
++#include <vcl/virdev.hxx>
+ 
+ // ------------
+ // - BitmapEx -
+@@ -759,6 +760,61 @@ void BitmapEx::Draw( OutputDevice* pOutDev,
+ 	pOutDev->DrawBitmapEx( rDestPt, rDestSize, rSrcPtPixel, rSrcSizePixel, *this );
+ }
+ 
++BitmapEx BitmapEx:: AutoScaleBitmap(BitmapEx & aBitmap, const long aStandardSize)
++{
++	Point aEmptyPoint(0,0);
++	sal_Int32 imgNewWidth = 0;
++	sal_Int32 imgNewHeight = 0;
++	double imgposX = 0;
++	double imgposY = 0;
++    BitmapEx  aRet = aBitmap;
++	double imgOldWidth = aRet.GetSizePixel().Width();
++	double imgOldHeight =aRet.GetSizePixel().Height();
++
++    Size aScaledSize;
++    if (imgOldWidth >= aStandardSize || imgOldHeight >= aStandardSize)
++	{
++		if (imgOldWidth >= imgOldHeight)
++		{
++			imgNewWidth = aStandardSize;
++			imgNewHeight = sal_Int32(imgOldHeight / (imgOldWidth / aStandardSize) + 0.5);
++			imgposX = 0;
++			imgposY = (aStandardSize - (imgOldHeight / (imgOldWidth / aStandardSize) + 0.5)) / 2 + 0.5;
++		}
++		else
++		{
++			imgNewHeight = aStandardSize;
++			imgNewWidth = sal_Int32(imgOldWidth / (imgOldHeight / aStandardSize) + 0.5);
++			imgposY = 0;
++			imgposX = (aStandardSize - (imgOldWidth / (imgOldHeight / aStandardSize) + 0.5)) / 2 + 0.5;
++		}
++
++		aScaledSize = Size( imgNewWidth, imgNewHeight );
++        aRet.Scale( aScaledSize, BMP_SCALE_INTERPOLATE );
++	}
++	else
++	{
++		imgposX = (aStandardSize - imgOldWidth) / 2 + 0.5;
++		imgposY = (aStandardSize - imgOldHeight) / 2 + 0.5;
++	}
++
++    Size aBmpSize = aRet.GetSizePixel();
++    Size aStdSize( aStandardSize, aStandardSize );
++    Rectangle aRect(aEmptyPoint, aStdSize );
++
++    VirtualDevice aVirDevice( *Application::GetDefaultDevice(), 0, 1 );
++	aVirDevice.SetOutputSizePixel( aStdSize );
++	aVirDevice.SetFillColor( COL_TRANSPARENT );
++    aVirDevice.SetLineColor( COL_TRANSPARENT );
++
++    //draw a rect into virDevice
++	aVirDevice.DrawRect( aRect );
++	Point aPointPixel( (long)imgposX, (long)imgposY );
++	aVirDevice.DrawBitmapEx( aPointPixel, aRet );
++	aRet = aVirDevice.GetBitmapEx( aEmptyPoint, aStdSize );
++
++	return aRet;
++}
+ // ------------------------------------------------------------------
+ 
+ SvStream& operator<<( SvStream& rOStm, const BitmapEx& rBitmapEx )
+diff --git vcl/source/window/toolbox.cxx vcl/source/window/toolbox.cxx
+index a650220..c6be2ee 100644
+--- vcl/source/window/toolbox.cxx
++++ vcl/source/window/toolbox.cxx
+@@ -229,6 +229,22 @@ int ToolBox::ImplGetDragWidth( ToolBox* pThis )
+     }
+     return width;
+ }
++
++ButtonType determineButtonType( ImplToolItem* pItem, ButtonType defaultType )
++{
++    ButtonType tmpButtonType = defaultType;
++    ToolBoxItemBits nBits( pItem->mnBits & 0x300 );
++    if ( nBits & TIB_TEXTICON ) // item has custom setting
++    {
++        tmpButtonType = BUTTON_SYMBOLTEXT; 
++        if ( nBits == TIB_TEXT_ONLY )
++            tmpButtonType = BUTTON_TEXT; 
++        else if ( nBits == TIB_ICON_ONLY )
++            tmpButtonType = BUTTON_SYMBOL; 
++    }
++    return tmpButtonType;
++}
++
+ // -----------------------------------------------------------------------
+ 
+ void ToolBox::ImplUpdateDragArea( ToolBox *pThis )
+@@ -1949,12 +1965,13 @@ BOOL ToolBox::ImplCalcItem()
+                     bText = FALSE;
+                 else
+                     bText = TRUE;
+-
++                ButtonType tmpButtonType = determineButtonType( &(*it), meButtonType ); // default to toolbox setting 
+                 if ( bImage || bText )
+                 {
++
+                     it->mbEmptyBtn = FALSE;
+ 
+-                    if ( meButtonType == BUTTON_SYMBOL )
++                    if ( tmpButtonType == BUTTON_SYMBOL )
+                     {
+                         // we're drawing images only
+                         if ( bImage || !bText )
+@@ -1968,7 +1985,7 @@ BOOL ToolBox::ImplCalcItem()
+                             it->mbVisibleText = TRUE;
+                         }
+                     }
+-                    else if ( meButtonType == BUTTON_TEXT )
++                    else if ( tmpButtonType == BUTTON_TEXT )
+                     {
+                         // we're drawing text only
+                         if ( bText || !bImage )
+@@ -3582,7 +3599,8 @@ void ToolBox::ImplDrawItem( USHORT nPos, BOOL bHighlight, BOOL bPaint, BOOL bLay
+     // determine what has to be drawn on the button: image, text or both
+     BOOL bImage;
+     BOOL bText;
+-    pItem->DetermineButtonDrawStyle( meButtonType, bImage, bText );
++    ButtonType tmpButtonType = determineButtonType( pItem, meButtonType ); // default to toolbox setting 
++    pItem->DetermineButtonDrawStyle( tmpButtonType, bImage, bText );
+ 
+     // compute output values
+     long    nBtnWidth = aBtnSize.Width()-SMALLBUTTON_HSIZE;
+diff --git vcl/source/window/toolbox2.cxx vcl/source/window/toolbox2.cxx
+index 1544eff..d57cec7 100644
+--- vcl/source/window/toolbox2.cxx
++++ vcl/source/window/toolbox2.cxx
+@@ -56,6 +56,8 @@ using namespace rtl;
+ 
+ #define TB_SEP_SIZE 			8
+ 
++ButtonType determineButtonType( ImplToolItem* pItem, ButtonType defaultType );
++
+ // -----------------------------------------------------------------------
+ 
+ ImplToolBoxPrivateData::ImplToolBoxPrivateData() : m_pLayoutData( NULL )


More information about the ooo-build-commit mailing list