diff options
Diffstat (limited to 'patches/vba/tool-menu-bar-improvements.diff')
-rw-r--r-- | patches/vba/tool-menu-bar-improvements.diff | 1014 |
1 files changed, 0 insertions, 1014 deletions
diff --git a/patches/vba/tool-menu-bar-improvements.diff b/patches/vba/tool-menu-bar-improvements.diff deleted file mode 100644 index 1da7cbb61..000000000 --- a/patches/vba/tool-menu-bar-improvements.diff +++ /dev/null @@ -1,1014 +0,0 @@ -diff --git framework/source/uielement/toolbarmanager.cxx framework/source/uielement/toolbarmanager.cxx -index a4de9c1..38d6324 100644 ---- framework/source/uielement/toolbarmanager.cxx -+++ framework/source/uielement/toolbarmanager.cxx -@@ -122,6 +122,7 @@ namespace framework - - static const char ITEM_DESCRIPTOR_COMMANDURL[] = "CommandURL"; - static const char ITEM_DESCRIPTOR_HELPURL[] = "HelpURL"; -+static const char ITEM_DESCRIPTOR_TOOLTIP[] = "Tooltip"; - static const char ITEM_DESCRIPTOR_CONTAINER[] = "ItemDescriptorContainer"; - static const char ITEM_DESCRIPTOR_LABEL[] = "Label"; - static const char ITEM_DESCRIPTOR_TYPE[] = "Type"; -@@ -131,6 +132,7 @@ static const char ITEM_DESCRIPTOR_STYLE[] = "Style"; - - static const sal_Int32 ITEM_DESCRIPTOR_COMMANDURL_LEN = 10; - static const sal_Int32 ITEM_DESCRIPTOR_HELPURL_LEN = 7; -+static const sal_Int32 ITEM_DESCRIPTOR_TOOLTIP_LEN = 7; - static const sal_Int32 ITEM_DESCRIPTOR_CONTAINER_LEN = 23; - static const sal_Int32 ITEM_DESCRIPTOR_LABEL_LEN = 5; - static const sal_Int32 ITEM_DESCRIPTOR_TYPE_LEN = 4; -@@ -1250,6 +1252,7 @@ void ToolBarManager::FillToolbar( const Reference< XIndexAccess >& rItemContaine - rtl::OUString aCommandURL; - rtl::OUString aLabel; - rtl::OUString aHelpURL; -+ rtl::OUString aTooltip; - sal_uInt16 nType( ::com::sun::star::ui::ItemType::DEFAULT ); - sal_uInt16 nWidth( 0 ); - sal_Bool bIsVisible( sal_True ); -@@ -1265,6 +1268,8 @@ void ToolBarManager::FillToolbar( const Reference< XIndexAccess >& rItemContaine - aProp[i].Value >>= aCommandURL; - else if ( aProp[i].Name.equalsAsciiL( ITEM_DESCRIPTOR_HELPURL, ITEM_DESCRIPTOR_HELPURL_LEN )) - aProp[i].Value >>= aHelpURL; -+ else if ( aProp[i].Name.equalsAsciiL( ITEM_DESCRIPTOR_TOOLTIP, ITEM_DESCRIPTOR_TOOLTIP_LEN )) -+ aProp[i].Value >>= aTooltip; - else if ( aProp[i].Name.equalsAsciiL( ITEM_DESCRIPTOR_LABEL, ITEM_DESCRIPTOR_LABEL_LEN )) - aProp[i].Value >>= aLabel; - else if ( aProp[i].Name.equalsAsciiL( ITEM_DESCRIPTOR_TYPE, ITEM_DESCRIPTOR_TYPE_LEN )) -@@ -1282,9 +1287,13 @@ 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 ); - m_pToolBar->InsertItem( nId, aString, nItemBits ); - m_pToolBar->SetItemCommand( nId, aCommandURL ); -- m_pToolBar->SetQuickHelpText( nId, aString ); -+ if ( aTooltip.getLength() ) -+ m_pToolBar->SetQuickHelpText( nId, aTooltip ); -+ else -+ m_pToolBar->SetQuickHelpText( nId, aString ); - if ( aLabel.getLength() > 0 ) - m_pToolBar->SetItemText( nId, aLabel ); - else -diff --git sc/source/filter/excel/excimp8.cxx sc/source/filter/excel/excimp8.cxx -index 07394d8..e5eb48a 100644 ---- sc/source/filter/excel/excimp8.cxx -+++ sc/source/filter/excel/excimp8.cxx -@@ -109,7 +109,7 @@ - - #include <com/sun/star/container/XNameContainer.hpp> - #include <sfx2/app.hxx> -- -+#include "xltoolbar.hxx" - using namespace com::sun::star; - - -@@ -306,6 +306,21 @@ void ImportExcel8::ReadBasic( void ) - uno::Any aModel = uno::makeAny( pShell->GetModel() ); - pAppMgr->SetGlobalUNOConstant( "ThisExcelDoc", aModel ); - } -+#if 0 -+ // 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() ) -+ { -+ CTBWrapper wrapper; -+ if ( wrapper.Read( xXCB ) ) -+ { -+#if DEBUG -+ wrapper.Print( stderr ); -+#endif -+ wrapper.ImportCustomToolBar( *pShell ); -+ } -+ } -+#endif - - } - } -diff --git sc/source/filter/excel/makefile.mk sc/source/filter/excel/makefile.mk -index 6ecc0ef..385b552 100644 ---- sc/source/filter/excel/makefile.mk -+++ sc/source/filter/excel/makefile.mk -@@ -106,7 +106,8 @@ SLOFILES = \ - $(SLO)$/xlstyle.obj \ - $(SLO)$/xltools.obj \ - $(SLO)$/xltracer.obj \ -- $(SLO)$/xlview.obj -+ $(SLO)$/xlview.obj \ -+ $(SLO)$/xltoolbar.obj \ - - .IF "$(OS)$(COM)$(CPUNAME)"=="LINUXGCCSPARC" - NOOPTFILES = \ -@@ -153,7 +154,8 @@ EXCEPTIONSFILES = \ - $(SLO)$/xlformula.obj \ - $(SLO)$/xlpivot.obj \ - $(SLO)$/xlstyle.obj \ -- $(SLO)$/xlview.obj -+ $(SLO)$/xlview.obj \ -+ $(SLO)$/xltoolbar.obj \ - - # --- Targets ------------------------------------------------------- - -diff --git sc/source/filter/excel/xltoolbar.cxx sc/source/filter/excel/xltoolbar.cxx -new file mode 100644 -index 0000000..6591539 ---- /dev/null -+++ sc/source/filter/excel/xltoolbar.cxx -@@ -0,0 +1,365 @@ -+#include "xltoolbar.hxx" -+#include <rtl/ustrbuf.hxx> -+#include <stdarg.h> -+#include <com/sun/star/ui/XUIConfigurationPersistence.hpp> -+#include <com/sun/star/ui/XUIConfigurationPersistence.hpp> -+#include <com/sun/star/ui/XModuleUIConfigurationManagerSupplier.hpp> -+#include <com/sun/star/lang/XMultiServiceFactory.hpp> -+#include <com/sun/star/lang/XSingleComponentFactory.hpp> -+#include <com/sun/star/lang/XMultiComponentFactory.hpp> -+#include <com/sun/star/ui/XImageManager.hpp> -+#include <com/sun/star/ui/ItemType.hpp> -+#include <fstream> -+#include <comphelper/processfactory.hxx> -+#include <vcl/graph.hxx> -+#include <map> -+using namespace com::sun::star; -+ -+typedef std::map< sal_Int16, rtl::OUString > IdToString; -+ -+class MSOExcelCommandConvertor : public MSOCommandConvertor -+{ -+ IdToString msoToOOcmd; -+ IdToString tcidToOOcmd; -+public: -+ MSOExcelCommandConvertor(); -+ virtual rtl::OUString MSOCommandToOOCommand( sal_Int16 msoCmd ); -+ virtual rtl::OUString MSOTCIDToOOCommand( sal_Int16 key ); -+}; -+ -+MSOExcelCommandConvertor::MSOExcelCommandConvertor() -+{ -+/* -+ // mso command id to ooo command string -+ // #FIXME and *HUNDREDS* of id's to added here -+ msoToOOcmd[ 0x20b ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(".uno:CloseDoc") ); -+ msoToOOcmd[ 0x50 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(".uno:Open") ); -+ -+ // mso tcid to ooo command string -+ // #FIXME and *HUNDREDS* of id's to added here -+ tcidToOOcmd[ 0x9d9 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(".uno:Print") ); -+*/ -+} -+ -+rtl::OUString MSOExcelCommandConvertor::MSOCommandToOOCommand( sal_Int16 key ) -+{ -+ rtl::OUString sResult; -+ IdToString::iterator it = msoToOOcmd.find( key ); -+ if ( it != msoToOOcmd.end() ) -+ sResult = it->second; -+ return sResult; -+} -+ -+rtl::OUString MSOExcelCommandConvertor::MSOTCIDToOOCommand( sal_Int16 key ) -+{ -+ rtl::OUString sResult; -+ IdToString::iterator it = tcidToOOcmd.find( key ); -+ if ( it != tcidToOOcmd.end() ) -+ sResult = it->second; -+ return sResult; -+} -+ -+ -+ -+CTBS::CTBS() : bSignature(0), bVersion(0), reserved1(0), reserved2(0), reserved3(0), ctb(0), ctbViews(0), ictbView(0) -+{ -+} -+ -+CTB::CTB() : nViews( 0 ), ectbid(0) -+{ -+} -+ -+CTB::CTB(sal_uInt16 nNum ) : nViews( nNum ), ectbid(0) -+{ -+} -+ -+bool CTB::Read( SvStream *pS ) -+{ -+ OSL_TRACE("CTB::Read() stream pos 0x%x", pS->Tell() ); -+ nOffSet = pS->Tell(); -+ tb.Read( pS ); -+ for ( sal_uInt16 index = 0; index < nViews; ++index ) -+ { -+ TBVisualData aVisData; -+ aVisData.Read( pS ); -+ rVisualData.push_back( aVisData ); -+ } -+ *pS >> ectbid; -+ -+ for ( sal_Int16 index = 0; index < tb.getcCL(); ++index ) -+ { -+ TBC aTBC; -+ aTBC.Read( pS ); -+ rTBC.push_back( aTBC ); -+ } -+ return true; -+} -+ -+void CTB::Print( FILE* fp ) -+{ -+ Indent a; -+ indent_printf( fp, "[ 0x%x ] CTB -- dump\n", nOffSet ); -+ indent_printf( fp, " nViews 0x%x\n", nViews); -+ tb.Print( fp ); -+ -+ std::vector<TBVisualData>::iterator visData_end = rVisualData.end(); -+ sal_Int32 counter = 0; -+ for ( std::vector<TBVisualData>::iterator it = rVisualData.begin(); it != visData_end; ++it ) -+ { -+ -+ indent_printf( fp, " TBVisualData [%d]\n", counter++ ); -+ Indent b; -+ it->Print( fp ); -+ } -+ indent_printf( fp, " ectbid 0x%x\n", ectbid); -+ std::vector<TBC>::iterator it_end = rTBC.end(); -+ counter = 0; -+ for ( std::vector<TBC>::iterator it = rTBC.begin(); it != it_end; ++it ) -+ { -+ indent_printf( fp, " TBC [%d]\n", counter++); -+ Indent c; -+ it->Print( fp ); -+ } -+} -+ -+bool CTB::ImportCustomToolBar( 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 ); -+ uno::Reference< beans::XPropertySet > xProps( xIndexContainer, uno::UNO_QUERY_THROW ); -+ WString& name = tb.getName(); -+ // set UI name for toolbar -+ xProps->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("UIName") ), uno::makeAny( name.getString() ) ); -+ -+ 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 ) ) -+ return false; -+ } -+ -+ OSL_TRACE("Name of toolbar :-/ %s", rtl::OUStringToOString( sToolBarName, RTL_TEXTENCODING_UTF8 ).getStr() ); -+ -+ helper.getCfgManager()->insertSettings( sToolBarName, xIndexAccess ); -+ helper.applyIcons(); -+ -+ uno::Reference< ui::XUIConfigurationPersistence > xPersistence( helper.getCfgManager()->getImageManager(), uno::UNO_QUERY_THROW ); -+ xPersistence->store(); -+ -+ xPersistence.set( helper.getCfgManager(), uno::UNO_QUERY_THROW ); -+ xPersistence->store(); -+ -+ bRes = true; -+ } -+ catch( uno::Exception& ) -+ { -+ bRes = false; -+ } -+ return bRes; -+} -+bool CTBS::Read( SvStream *pS ) -+{ -+ OSL_TRACE("CTBS::Read() stream pos 0x%x", pS->Tell() ); -+ nOffSet = pS->Tell(); -+ *pS >> bSignature >> bVersion >> reserved1 >> reserved2 >> reserved3 >> ctb >> ctbViews >> ictbView; -+ return true; -+} -+ -+void CTBS::Print( FILE* fp ) -+{ -+ Indent a; -+ indent_printf( fp, "[ 0x%x ] CTBS -- dump\n", nOffSet ); -+ -+ indent_printf( fp, " bSignature 0x%x\n", bSignature); -+ indent_printf( fp, " bVersion 0x%x\n", bVersion); -+ -+ indent_printf( fp, " reserved1 0x%x\n", reserved1 ); -+ indent_printf( fp, " reserved2 0x%x\n", reserved2 ); -+ indent_printf( fp, " reserved3 0x%x\n", reserved3 ); -+ -+ indent_printf( fp, " ctb 0x%x\n", ctb ); -+ indent_printf( fp, " ctbViews 0x%x\n", ctbViews ); -+ indent_printf( fp, " ictbView 0x%x\n", ictbView ); -+} -+ -+TBC::TBC() -+{ -+} -+ -+bool -+TBC::Read(SvStream *pS) -+{ -+ OSL_TRACE("TBC::Read() stream pos 0x%x", pS->Tell() ); -+ nOffSet = pS->Tell(); -+ if ( !tbch.Read( pS ) ) -+ return false; -+ sal_uInt16 tcid = tbch.getTcID(); -+ sal_uInt8 tct = tbch.getTct(); -+ if ( ( tcid != 0x0001 && tcid != 0x06CC && tcid != 0x03D8 && tcid != 0x03EC && tcid != 0x1051 ) && ( ( tct > 0 && tct < 0x0B ) || ( ( tct > 0x0B && tct < 0x10 ) || tct == 0x15 ) ) ) -+ { -+ tbcCmd.reset( new TBCCmd ); -+ if ( ! tbcCmd->Read( pS ) ) -+ return false; -+ } -+ if ( tct != 0x16 ) -+ { -+ tbcd.reset( new TBCData( tbch ) ); -+ if ( !tbcd->Read( pS ) ) -+ return false; -+ } -+ return true; -+} -+ -+ -+void -+TBC::Print(FILE* fp) -+{ -+ Indent a; -+ indent_printf( fp, "[ 0x%x ] TBC -- dump\n", nOffSet ); -+ tbch.Print( fp ); -+ if ( tbcCmd.get() ) -+ tbcCmd->Print( fp ); -+ if ( tbcd.get() ) -+ tbcd->Print( fp ); -+} -+ -+bool TBC::ImportToolBarControl( const css::uno::Reference< css::container::XIndexContainer >& toolbarcontainer, CustomToolBarImportHelper& helper ) -+{ -+ // how to identify built-in-command ? -+// bool bBuiltin = false; -+ if ( tbcd.get() ) -+ { -+ std::vector< css::beans::PropertyValue > props; -+/* -+ if ( bBuiltin ) -+ { -+ rtl::OUString sCommand = helper.MSOCommandToOOCommand( cmdId ); -+ if ( sCommand.getLength() > 0 ) -+ { -+ beans::PropertyValue aProp; -+ -+ aProp.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("CommandURL") ); -+ aProp.Value <<= sCommand; -+ props.push_back( aProp ); -+ } -+ -+ } -+*/ -+ bool bBeginGroup = false; -+ if ( ! tbcd->ImportToolBarControl( toolbarcontainer, helper, props, bBeginGroup ) ) -+ return false; -+ -+ if ( bBeginGroup ) -+ { -+ // insert spacer -+ uno::Sequence< beans::PropertyValue > sProps( 1 ); -+ sProps[ 0 ].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Type") ); -+ sProps[ 0 ].Value = uno::makeAny( ui::ItemType::SEPARATOR_LINE ); -+ toolbarcontainer->insertByIndex( toolbarcontainer->getCount(), uno::makeAny( sProps ) ); -+ } -+ uno::Sequence< beans::PropertyValue > sProps( props.size() ); -+ beans::PropertyValue* pProp = sProps.getArray(); -+ -+ for ( std::vector< css::beans::PropertyValue >::iterator it = props.begin(); it != props.end(); ++it, ++pProp ) -+ *pProp = *it; -+ -+ toolbarcontainer->insertByIndex( toolbarcontainer->getCount(), uno::makeAny( sProps ) ); -+ } -+ return true; -+} -+ -+void -+TBCCmd::Print(FILE* fp) -+{ -+ Indent a; -+ indent_printf( fp, " TBCCmd -- dump\n" ); -+ indent_printf( fp, " cmdID 0x%x\n", cmdID ); -+ indent_printf( fp, " A ( fHideDrawing ) %s\n", A ? "true" : "false" ); -+ indent_printf( fp, " B ( reserved - ignored ) %s\n", A ? "true" : "false" ); -+ indent_printf( fp, " cmdType 0x%x\n", cmdType ); -+ indent_printf( fp, " C ( reserved - ignored ) %s\n", A ? "true" : "false" ); -+ indent_printf( fp, " reserved3 0x%x\n", reserved3 ); -+} -+ -+bool TBCCmd::Read( SvStream *pS ) -+{ -+ OSL_TRACE("TBCCmd::Read() stream pos 0x%x", pS->Tell() ); -+ nOffSet = pS->Tell(); -+ *pS >> cmdID; -+ sal_uInt16 temp; -+ *pS >> temp; -+ OSL_TRACE("TBCmd temp = 0x%x", temp ); -+ A = (temp & 0x8000 ) == 0x8000; -+ B = (temp & 0x4000) == 0x4000; -+ cmdType = ( temp & 0x3E00 ) >> 9; -+ C = ( temp & 0x100 ) == 0x100; -+ reserved3 = ( temp & 0xFF ); -+ return true; -+} -+ -+CTBWrapper::CTBWrapper() -+{ -+} -+ -+CTBWrapper::~CTBWrapper() -+{ -+} -+ -+bool -+CTBWrapper::Read( SvStream *pS) -+{ -+ OSL_TRACE("CTBWrapper::Read() stream pos 0x%x", pS->Tell() ); -+ nOffSet = pS->Tell(); -+ if ( !ctbSet.Read( pS ) ) -+ return false; -+ for ( sal_uInt16 index = 0; index < ctbSet.ctb; ++index ) -+ { -+ CTB aCTB( ctbSet.ctbViews ); -+ if ( !aCTB.Read( pS ) ) -+ return false; -+ rCTB.push_back( aCTB ); -+ } -+ return true; -+} -+ -+void -+CTBWrapper::Print( FILE* fp ) -+{ -+ Indent a; -+ indent_printf( fp, "[ 0x%x ] CTBWrapper -- dump\n", nOffSet ); -+ ctbSet.Print( fp ); -+ std::vector<CTB>::iterator it_end = rCTB.end(); -+ for ( std::vector<CTB>::iterator it = rCTB.begin(); it != it_end; ++it ) -+ { -+ Indent b; -+ it->Print( fp ); -+ } -+} -+ -+bool CTBWrapper::ImportCustomToolBar( SfxObjectShell& rDocSh ) -+{ -+ std::vector<CTB>::iterator it_end = rCTB.end(); -+ for ( std::vector<CTB>::iterator it = rCTB.begin(); it != it_end; ++it ) -+ { -+ // for each customtoolbar -+ 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.sheet.SpreadsheetDocument" ) ) ) ); -+ helper.setMSOCommandMap( new MSOExcelCommandConvertor() ); -+ if ( !(*it).ImportCustomToolBar( helper ) ) -+ return false; -+ } -+ return true; -+} -+ -+ -diff --git sc/source/filter/excel/xltoolbar.hxx sc/source/filter/excel/xltoolbar.hxx -new file mode 100644 -index 0000000..af986c7 ---- /dev/null -+++ sc/source/filter/excel/xltoolbar.hxx -@@ -0,0 +1,87 @@ -+#ifndef _XLTOOLBAR_HXX -+#define _XLTOOLBAR_HXX -+ -+#include <svx/mstoolbar.hxx> -+ -+namespace css = ::com::sun::star; -+ -+// hmm I don't normally use these packed structures -+// but.. hey always good to do something different -+class TBCCmd : public TBBase -+{ -+public: -+ TBCCmd() : cmdID(0), A(0), B(0), cmdType(0), C(0), reserved3(0) {} -+ sal_uInt16 cmdID; -+ sal_uInt16 A:1; -+ sal_uInt16 B:1; -+ sal_uInt16 cmdType:5; -+ sal_uInt16 C:1; -+ sal_uInt16 reserved3:8; -+ bool Read( SvStream* pS ); -+ void Print(FILE* fp); -+}; -+ -+class TBC : public TBBase -+{ -+ TBCHeader tbch; -+ boost::shared_ptr<TBCCmd> tbcCmd; // optional -+ boost::shared_ptr<TBCData> tbcd; -+public: -+ TBC(); -+ ~TBC(){} -+ void Print( FILE* ); -+ bool Read(SvStream *pS); -+ bool ImportToolBarControl( const com::sun::star::uno::Reference< com::sun::star::container::XIndexContainer >& toolbarcontainer, CustomToolBarImportHelper& helper ); -+}; -+ -+class CTB : public TBBase -+{ -+ sal_uInt16 nViews; -+ TB tb; -+ std::vector<TBVisualData> rVisualData; -+ sal_uInt32 ectbid; -+ std::vector< TBC > rTBC; -+public: -+ CTB(); -+ CTB(sal_uInt16); -+ ~CTB(){} -+ void Print( FILE* ); -+ bool Read(SvStream *pS); -+ bool ImportCustomToolBar( CustomToolBarImportHelper& ); -+}; -+ -+class CTBS : public TBBase -+{ -+public: -+ sal_uInt8 bSignature; -+ sal_uInt8 bVersion; -+ sal_uInt16 reserved1; -+ sal_uInt16 reserved2; -+ sal_uInt16 reserved3; -+ sal_uInt16 ctb; -+ sal_uInt16 ctbViews; -+ sal_uInt16 ictbView; -+ CTBS(const CTBS&); -+ CTBS& operator = ( const CTBS&); -+ CTBS(); -+ ~CTBS(){} -+ void Print( FILE* ); -+ bool Read(SvStream *pS); -+}; -+ -+class CTBWrapper : public TBBase -+{ -+ CTBS ctbSet; -+ -+ std::vector< CTB > rCTB; -+ -+public: -+ CTBWrapper(); -+ ~CTBWrapper(); -+ bool Read(SvStream *pS); -+ void Print( FILE* ); -+ bool ImportCustomToolBar( SfxObjectShell& rDocSh ); -+}; -+ -+ -+#endif //_XLTOOLBAR_HXX -diff --git svx/inc/svx/mstoolbar.hxx svx/inc/svx/mstoolbar.hxx -index 5d76eaf..c102ade 100644 ---- svx/inc/svx/mstoolbar.hxx -+++ svx/inc/svx/mstoolbar.hxx -@@ -250,6 +250,7 @@ public: - sal_uInt8 getTct() const { return tct; } - sal_uInt16 getTcID() const { return tcid; } - bool isVisible() { return !( bFlagsTCR & 0x1 ); } -+ bool isBeginGroup() { return ( bFlagsTCR & 0x2 ); } - bool Read(SvStream *pS); - void Print( FILE* ); - sal_uInt32 getTbct() { return tbct; }; -@@ -267,8 +268,57 @@ 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 ImportToolBarControl( const css::uno::Reference< css::container::XIndexContainer >&, CustomToolBarImportHelper&, std::vector< css::beans::PropertyValue >&, bool& bBeginGroup ); - TBCGeneralInfo& getGeneralInfo() { return controlGeneralInfo; } - }; - -+class SVX_DLLPUBLIC TB : public TBBase -+{ -+ sal_uInt8 bSignature;// Signed integer that specifies the toolbar signature number. MUST be 0x02. -+ sal_uInt8 bVersion; // Signed integer that specifies the toolbar version number. MUST be 0x01. -+ sal_Int16 cCL; // Signed integer that SHOULD specify the number of toolbar controls contained in this toolbar. -+ sal_Int32 ltbid;// Signed integer that specifies the toolbar ID. MUST be 0x0001 (custom toolbar ID). -+ sal_uInt32 ltbtr;// Unsigned integer of type TBTRFlags that specifies the toolbar type and toolbar restrictions. -+ sal_uInt16 cRowsDefault;// Unsigned integer that specifies the number of preferred rows for the toolbar when the toolbar is not docked. MUST be less than or equal to 255. -+ sal_uInt16 bFlags; //Unsigned integer of type TBFlags. -+ WString name; //Structure of type WString that specifies the toolbar name -+public: -+ TB(); -+ ~TB(){} -+ bool Read(SvStream *pS); -+ void Print( FILE* ); -+ sal_Int16 getcCL(){ return cCL; } -+ WString& getName(){ return name; } -+ bool IsEnabled(); -+ bool NeedsPositioning(); -+}; -+ -+class SVX_DLLPUBLIC SRECT : public TBBase -+{ -+public: -+ SRECT() : left(0), top(0), right(0), bottom(0) {} -+ sal_Int16 left; -+ sal_Int16 top; -+ sal_Int16 right; -+ sal_Int16 bottom; -+ bool Read( SvStream* pS ) { *pS >> left >> top >> right >> bottom; return true; } -+ void Print( FILE* fo ); -+}; -+ -+class SVX_DLLPUBLIC TBVisualData : public TBBase -+{ -+ sal_Int8 tbds; -+ sal_Int8 tbv; -+ sal_Int8 tbdsDock; -+ sal_Int8 iRow; -+ -+ SRECT rcDock; -+ SRECT rcFloat; -+ -+public: -+ TBVisualData(); -+ ~TBVisualData(){} -+ bool Read(SvStream *pS); -+ void Print( FILE* ); -+}; - #endif -diff --git svx/source/msfilter/mstoolbar.cxx svx/source/msfilter/mstoolbar.cxx -index fa66fe5..1d5c801 100644 ---- svx/source/msfilter/mstoolbar.cxx -+++ svx/source/msfilter/mstoolbar.cxx -@@ -25,7 +25,7 @@ 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 ) -@@ -144,7 +144,7 @@ void TBCHeader::Print( FILE* fp ) - { - Indent a; - indent_printf(fp,"[ 0x%x ] TBCHeader -- dump\n", nOffSet ); -- indent_printf(fp," bSignature 0x%xn", bSignature ); -+ indent_printf(fp," bSignature 0x%x\n", bSignature ); - indent_printf(fp," bVersion 0x%x\n", bVersion ); - indent_printf(fp," bFlagsTCR 0x%x\n", bFlagsTCR ); - indent_printf(fp," tct 0x%x\n", tct ); -@@ -192,14 +192,13 @@ bool TBCData::Read(SvStream *pS) - } - if ( controlSpecificInfo.get() ) - return controlSpecificInfo->Read( pS ); -+ //#FIXME I need to be able to handle different controlSpecificInfo types. - return true; -- -- OSL_TRACE("#FIXME I need to be able to handle different controlSpecificInfo types."); -- return false; - } - --bool TBCData::ImportToolBarControl( const css::uno::Reference< css::container::XIndexContainer >& /*toolbarcontainer*/, CustomToolBarImportHelper& helper, std::vector< css::beans::PropertyValue >& props ) -+bool TBCData::ImportToolBarControl( const css::uno::Reference< css::container::XIndexContainer >& /*toolbarcontainer*/, CustomToolBarImportHelper& helper, std::vector< css::beans::PropertyValue >& props, bool& bBeginGroup ) - { -+ bBeginGroup = rHeader.isBeginGroup(); - controlGeneralInfo.ImportToolBarControlData( helper, props ); - beans::PropertyValue aProp; - aProp.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Visible") ) ; -@@ -222,16 +221,19 @@ bool TBCData::ImportToolBarControl( const css::uno::Reference< css::container::X - } - if ( TBCBitMap* pIcon = pSpecificInfo->getIcon() ) - { -- -- BitmapEx aBitEx( pIcon->getBitMap() ); -- if ( pSpecificInfo->getIconMask() ) -- // according to the spec: -- // "the iconMask is white in all the areas in which the icon is -- // displayed as transparent and is black in all other areas." -- aBitEx = BitmapEx( aBitEx.GetBitmap(), pSpecificInfo->getIconMask()->getBitMap().CreateMask( Color( COL_WHITE ) ) ); -- -- Graphic aGraphic( aBitEx ); -- helper.addIcon( aGraphic.GetXGraphic(), sCommand ); -+ // Without a command openoffice won't display the icon -+ if ( sCommand.getLength() ) -+ { -+ BitmapEx aBitEx( pIcon->getBitMap() ); -+ if ( pSpecificInfo->getIconMask() ) -+ // according to the spec: -+ // "the iconMask is white in all the areas in which the icon is -+ // displayed as transparent and is black in all other areas." -+ aBitEx = BitmapEx( aBitEx.GetBitmap(), pSpecificInfo->getIconMask()->getBitMap().CreateMask( Color( COL_WHITE ) ) ); -+ -+ Graphic aGraphic( aBitEx ); -+ helper.addIcon( aGraphic.GetXGraphic(), sCommand ); -+ } - } - else if ( pSpecificInfo->getBtnFace() ) - { -@@ -373,6 +375,8 @@ TBCGeneralInfo::ImportToolBarControlData( CustomToolBarImportHelper& helper, std - ooo::vba::VBAMacroResolvedInfo aMacroInf = ooo::vba::resolveVBAMacro( &helper.GetDocShell(), extraInfo.getOnAction(), true ); - if ( aMacroInf.IsResolved() ) - aProp.Value = helper.createCommandFromMacro( aMacroInf.ResolvedMacro() ); -+ else -+ aProp.Value <<= rtl::OUString::createFromAscii("UnResolvedMacro[").concat( extraInfo.getOnAction() ).concat( rtl::OUString::createFromAscii("]") ); - sControlData.push_back( aProp ); - } - -@@ -384,7 +388,7 @@ TBCGeneralInfo::ImportToolBarControlData( CustomToolBarImportHelper& helper, std - aProp.Value = uno::makeAny( ui::ItemType::DEFAULT ); - sControlData.push_back( aProp ); - -- aProp.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("HelpURL") ); -+ aProp.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Tooltip") ); - aProp.Value = uno::makeAny( tooltip.getString() ); - sControlData.push_back( aProp ); - -@@ -429,7 +433,7 @@ TBCMenuSpecific::Print( FILE* fp ) - indent_printf( fp, "[ 0x%x ] TBCMenuSpecific -- dump\n", nOffSet ); - indent_printf( fp, " tbid 0x%x\n", static_cast< unsigned int >( tbid ) ); - if ( tbid == 1 ) -- indent_printf( fp, " name %s", rtl::OUStringToOString( name->getString(), RTL_TEXTENCODING_UTF8 ).getStr() ); -+ indent_printf( fp, " name %s\n", rtl::OUStringToOString( name->getString(), RTL_TEXTENCODING_UTF8 ).getStr() ); - - } - -@@ -611,3 +615,83 @@ void TBCBitMap::Print( FILE* fp ) - indent_printf(fp, "[ 0x%x ] TBCBitMap -- dump\n", nOffSet ); - indent_printf(fp, " TBCBitMap size of bitmap data 0x%x\n", static_cast< unsigned int > ( cbDIB ) ); - } -+ -+TB::TB() : bSignature(0x2), -+bVersion(0x1), -+cCL(0), -+ltbid( 0x1 ), -+ltbtr(0), -+cRowsDefault( 0 ), -+bFlags( 0 ) -+{ -+} -+ -+bool TB::Read(SvStream *pS) -+{ -+ OSL_TRACE("TB::Read() stream pos 0x%x", pS->Tell() ); -+ nOffSet = pS->Tell(); -+ *pS >> bSignature >> bVersion >> cCL >> ltbid >> ltbtr >> cRowsDefault >> bFlags; -+ name.Read( pS ); -+ return true; -+ -+} -+ -+bool TB::IsEnabled() -+{ -+ return ( bFlags & 0x01 ) != 0x01; -+} -+ -+bool TB::NeedsPositioning() -+{ -+ return ( bFlags & 0x10 ) == 0x10; -+} -+ -+void TB::Print( FILE* fp ) -+{ -+ Indent a; -+ indent_printf(fp,"[ 0x%x ] TB -- dump\n", nOffSet ); -+ indent_printf(fp," bSignature 0x%x\n", bSignature ); -+ indent_printf(fp," bVersion 0x%x\n", bVersion ); -+ indent_printf(fp," cCL 0x%x\n", cCL ); -+ indent_printf(fp," ltbid 0x%x\n", ltbid ); -+ indent_printf(fp," ltbtr 0x%x\n", ltbtr ); -+ indent_printf(fp," cRowsDefault 0x%x\n", cRowsDefault ); -+ indent_printf(fp," bFlags 0x%x\n", bFlags ); -+ indent_printf(fp, " name %s\n", rtl::OUStringToOString( name.getString(), RTL_TEXTENCODING_UTF8 ).getStr() ); -+} -+ -+TBVisualData::TBVisualData() : tbds(0), tbv(0), tbdsDock(0), iRow(0) -+{ -+} -+ -+bool TBVisualData::Read( SvStream* pS ) -+{ -+ OSL_TRACE("TBVisualData::Read() stream pos 0x%x", pS->Tell() ); -+ nOffSet = pS->Tell(); -+ *pS >> tbds >> tbv >> tbdsDock >> iRow; -+ rcDock.Read( pS ); -+ rcFloat.Read( pS ); -+ return true; -+} -+ -+void SRECT::Print( FILE* fp ) -+{ -+ Indent a; -+ indent_printf( fp, " left 0x%x\n", left); -+ indent_printf( fp, " top 0x%x\n", top); -+ indent_printf( fp, " right 0x%x\n", right); -+ indent_printf( fp, " bottom 0x%x\n", bottom); -+} -+ -+void TBVisualData::Print( FILE* fp ) -+{ -+ Indent a; -+ indent_printf( fp, "[ 0x%x ] TBVisualData -- dump\n", nOffSet ); -+ indent_printf( fp, " tbds 0x%x\n", tbds); -+ indent_printf( fp, " tbv 0x%x\n", tbv); -+ indent_printf( fp, " tbdsDoc 0x%x\n", tbdsDock); -+ indent_printf( fp, " iRow 0x%x\n", iRow); -+ rcDock.Print( fp ); -+ rcFloat.Print( fp ); -+} -+ -diff --git sw/source/filter/ww8/ww8par.cxx sw/source/filter/ww8/ww8par.cxx -index 21a8014..a8a1348 100644 ---- sw/source/filter/ww8/ww8par.cxx -+++ sw/source/filter/ww8/ww8par.cxx -@@ -3890,7 +3890,7 @@ bool WW8Customizations::Import( SwDocShell* pShell ) - if (!aTCG.Read( mpTableStream ) ) - OSL_TRACE("** Read of Customization data failed!!!! "); - mpTableStream->Seek( nCur ); // return to previous position, is that necessary? --#if 1 -+#if DEBUG - aTCG.Print( stderr ); - #endif - return aTCG.ImportCustomToolBar( *pShell ); -diff --git sw/source/filter/ww8/ww8toolbar.cxx sw/source/filter/ww8/ww8toolbar.cxx -index bb3fc2e..22581ea 100644 ---- sw/source/filter/ww8/ww8toolbar.cxx -+++ sw/source/filter/ww8/ww8toolbar.cxx -@@ -482,36 +482,49 @@ CTB::Print( FILE* fp ) - bool CTB::ImportCustomToolBar( CustomToolBarImportHelper& helper ) - { - static rtl::OUString sToolbarPrefix( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/custom_" ) ); -- 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 ); -- uno::Reference< beans::XPropertySet > xProps( xIndexContainer, uno::UNO_QUERY_THROW ); -- -- // set UI name for toolbar -- xProps->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("UIName") ), uno::makeAny( name.getString() ) ); -- -- rtl::OUString sToolBarName = sToolbarPrefix.concat( name.getString() ); -- for ( std::vector< TBC >::iterator it = rTBC.begin(); it != rTBC.end(); ++it ) -+ bool bRes = false; -+ try - { -- // createToolBar item for control -- if ( !it->ImportToolBarControl( xIndexContainer, helper ) ) -- return false; -- } -- -- OSL_TRACE("Name of toolbar :-/ %s", rtl::OUStringToOString( sToolBarName, RTL_TEXTENCODING_UTF8 ).getStr() ); -- -- helper.getCfgManager()->insertSettings( sToolBarName, xIndexAccess ); -- helper.applyIcons(); -- -- uno::Reference< ui::XUIConfigurationPersistence > xPersistence( helper.getCfgManager()->getImageManager(), uno::UNO_QUERY_THROW ); -- xPersistence->store(); -- -- xPersistence.set( helper.getCfgManager(), uno::UNO_QUERY_THROW ); -- xPersistence->store(); -+ // #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() ) -+ 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 ); -+ uno::Reference< beans::XPropertySet > xProps( xIndexContainer, uno::UNO_QUERY_THROW ); -+ -+ // set UI name for toolbar -+ xProps->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("UIName") ), uno::makeAny( name.getString() ) ); - -- return true; -+ 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 ) ) -+ return false; -+ } -+ -+ OSL_TRACE("Name of toolbar :-/ %s", rtl::OUStringToOString( sToolBarName, RTL_TEXTENCODING_UTF8 ).getStr() ); -+ -+ helper.getCfgManager()->insertSettings( sToolBarName, xIndexAccess ); -+ helper.applyIcons(); -+ -+ uno::Reference< ui::XUIConfigurationPersistence > xPersistence( helper.getCfgManager()->getImageManager(), uno::UNO_QUERY_THROW ); -+ xPersistence->store(); -+ -+ xPersistence.set( helper.getCfgManager(), uno::UNO_QUERY_THROW ); -+ xPersistence->store(); -+ bRes = true; -+ } -+ catch( uno::Exception& ) -+ { -+ bRes = false; -+ } -+ return bRes; - } - - bool CTB::ImportMenu( const css::uno::Reference< css::container::XIndexContainer >& xIndexContainer, CustomToolBarImportHelper& rHelper ) -@@ -525,38 +538,6 @@ bool CTB::ImportMenu( const css::uno::Reference< css::container::XIndexContainer - return true; - } - --TB::TB() : bSignature( 0 ) --,bVersion( 0 ) --,cCL( 0 ) --,ltbid( 0 ) --,ltbtr( 0 ) --,cRowsDefault( 0 ) --,bFlags( 0 ) --{ --} -- --bool TB::Read( SvStream* pS ) --{ -- OSL_TRACE("TB::Read() stream pos 0x%x", pS->Tell() ); -- nOffSet = pS->Tell(); -- *pS >> bSignature >> bVersion >> cCL >> ltbid >> ltbtr >> cRowsDefault >> bFlags; -- return name.Read( pS ); --} -- --bool TB::IsEnabled() --{ -- return ( bFlags & 0x10 ) != 0x10; --} -- --void TB::Print( FILE* fp ) --{ -- Indent a; -- indent_printf( fp, "[ 0x%x ] TB -- dump\n", nOffSet ); -- indent_printf( fp, " bSignature (0x%x), bVersion(0x%x), cCL(0x%x), ltbid(0x%x), cRowsDefault (0x%x), ltbtr(0x%x), bFlags(0x%x)\n", bSignature, bVersion, cCL, static_cast< unsigned int >( ltbid ), static_cast< unsigned int >( ltbtr ), cRowsDefault, bFlags ); -- indent_printf( fp, " name %s state - %s\n", rtl::OUStringToOString( name.getString(), RTL_TEXTENCODING_UTF8 ).getStr(), IsEnabled() ? "true" : "false" ); -- --} -- - TBC::TBC() - { - } -@@ -655,10 +636,19 @@ TBC::ImportToolBarControl( const css::uno::Reference< css::container::XIndexCont - } - - } -- if ( ! tbcd->ImportToolBarControl( toolbarcontainer, helper, props ) ) -+ bool bBeginGroup = false; -+ if ( ! tbcd->ImportToolBarControl( toolbarcontainer, helper, props, bBeginGroup ) ) - return false; - -- -+ if ( bBeginGroup ) -+ { -+ // insert spacer -+ uno::Sequence< beans::PropertyValue > sProps( 1 ); -+ sProps[ 0 ].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Type") ); -+ sProps[ 0 ].Value = uno::makeAny( ui::ItemType::SEPARATOR_LINE ); -+ toolbarcontainer->insertByIndex( toolbarcontainer->getCount(), uno::makeAny( sProps ) ); -+ } -+ - uno::Sequence< beans::PropertyValue > sProps( props.size() ); - beans::PropertyValue* pProp = sProps.getArray(); - -diff --git sw/source/filter/ww8/ww8toolbar.hxx sw/source/filter/ww8/ww8toolbar.hxx -index ae23835..b533cbf 100644 ---- sw/source/filter/ww8/ww8toolbar.hxx -+++ sw/source/filter/ww8/ww8toolbar.hxx -@@ -29,26 +29,6 @@ public: - rtl::OUString GetCustomText(); - }; - --class TB : public TBBase --{ -- sal_Int8 bSignature; //Signed integer that specifies the toolbar signature number. MUST be 0x02. -- sal_Int8 bVersion; //Signed integer that specifies the toolbar version number. MUST be 0x01. -- sal_Int16 cCL; //Signed integer that SHOULD specify the number of toolbar controls contained in this toolbar. -- sal_Int32 ltbid; //Signed integer that specifies the toolbar ID. MUST be 0x0001 (custom toolbar ID). -- sal_uInt32 ltbtr; //Unsigned integer of type TBTRFlags that specifies the toolbar type and toolbar restrictions. -- sal_uInt16 cRowsDefault; //Unsigned integer that specifies the number of preferred rows for the toolbar when the toolbar is not docked. MUST be less than or equal to 255. -- sal_uInt16 bFlags; //Unsigned integer of type TBFlags. -- WString name; //Structure of type WString that specifies the toolbar name. -- TB(const TB&); -- TB& operator = ( const TB&); --public: -- TB(); -- ~TB(){} -- bool Read(SvStream *pS); -- void Print( FILE* ); -- bool IsEnabled(); --}; -- - class CTB : public TBBase - { - Xst name; |