summaryrefslogtreecommitdiff
path: root/patches/vba/tool-menu-bar-improvements.diff
diff options
context:
space:
mode:
Diffstat (limited to 'patches/vba/tool-menu-bar-improvements.diff')
-rw-r--r--patches/vba/tool-menu-bar-improvements.diff1014
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;