diff options
author | Noel Power <noel.power@novell.com> | 2010-10-06 10:32:11 +0100 |
---|---|---|
committer | Noel Power <noel.power@novell.com> | 2010-10-13 12:56:43 +0100 |
commit | 155bc8bc5b2c2ca0d36ab01c9f6c141a5a824cc0 (patch) | |
tree | 4efe68f8011caabefcb85033c3ba63da52b57728 | |
parent | e3a527e00289598fea5cc6d1562903abbfa1838d (diff) |
initial commit for vba blob ( not including container_control stuff )
-rw-r--r-- | filter/inc/filter/msfilter/mstoolbar.hxx | 334 | ||||
-rw-r--r-- | filter/source/msfilter/mstoolbar.cxx | 817 |
2 files changed, 1151 insertions, 0 deletions
diff --git a/filter/inc/filter/msfilter/mstoolbar.hxx b/filter/inc/filter/msfilter/mstoolbar.hxx new file mode 100644 index 000000000000..9336db1e3d57 --- /dev/null +++ b/filter/inc/filter/msfilter/mstoolbar.hxx @@ -0,0 +1,334 @@ +#ifndef _MSTOOLBAR_HXX +#define _MSTOOLBAR_HXX +#include "filter/msfilter/msfilterdllapi.h" +#include <tools/string.hxx> +#include <sot/storage.hxx> +#include <ostream> +#include <memory> +#include <vector> +#include <boost/shared_ptr.hpp> +#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; + +class TBCHeader; + + +class MSOCommandConvertor +{ +public: + virtual ~MSOCommandConvertor() {} + virtual rtl::OUString MSOCommandToOOCommand( sal_Int16 msoCmd ) = 0; + virtual rtl::OUString MSOTCIDToOOCommand( sal_Int16 msoTCID ) = 0; +}; + +class SfxObjectShell; + +class MSFILTER_DLLPUBLIC CustomToolBarImportHelper +{ + struct iconcontrolitem + { + rtl::OUString sCommand; + css::uno::Reference< css::graphic::XGraphic > image; + }; + std::vector< iconcontrolitem > iconcommands; + std::auto_ptr< MSOCommandConvertor > pMSOCmdConvertor; + 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 ); + + void setMSOCommandMap( MSOCommandConvertor* pCnvtr ) { pMSOCmdConvertor.reset( pCnvtr ); } + css::uno::Reference< css::ui::XUIConfigurationManager > getCfgManager(); + css::uno::Reference< css::ui::XUIConfigurationManager > getAppCfgManager(); + + + css::uno::Any createCommandFromMacro( const rtl::OUString& sCmd ); + + void addIcon( const css::uno::Reference< css::graphic::XGraphic >& xImage, const rtl::OUString& sString ); + void applyIcons(); + rtl::OUString MSOCommandToOOCommand( sal_Int16 msoCmd ); + rtl::OUString MSOTCIDToOOCommand( sal_Int16 msoTCID ); + SfxObjectShell& GetDocShell() { return mrDocSh; } + void showToolbar( const rtl::OUString& rName ); + bool createMenu( const rtl::OUString& rName, const css::uno::Reference< css::container::XIndexAccess >& xMenuDesc, bool bPersist ); +}; + +class MSFILTER_DLLPUBLIC TBBase +{ +friend class Indent; + static int nIndent; // num spaces to indent before printing +protected: + void indent_printf(FILE* fp, const char* format, ... ); + sal_uInt32 nOffSet; // usually for debug we can store the offset in the stream to this record +public: + TBBase() : nOffSet( 0 ) {} + virtual ~TBBase(){} + rtl::OUString readUnicodeString( SvStream* pS, sal_Int32 nChars ); + + virtual bool Read(SvStream *pS) = 0; + virtual void Print( FILE* ) {} // #FIXME remove this an implement the debug routines in all the classes below to enable some sort of readable output + sal_uInt32 GetOffset() { return nOffSet; } +}; + +class Indent +{ +public: + Indent( bool binit = false ) + { + if ( binit ) + init(); + else + TBBase::nIndent = TBBase::nIndent + 2; + } + ~Indent() { TBBase::nIndent = TBBase::nIndent - 2; } + void init() { TBBase::nIndent = 0; } +}; + + +class MSFILTER_DLLPUBLIC WString : public TBBase +{ + rtl::OUString sString; + +public: + WString(){}; + ~WString(){}; + bool Read(SvStream *pS); + rtl::OUString getString(){ return sString; } +}; + +class MSFILTER_DLLPUBLIC TBCExtraInfo : public TBBase +{ + WString wstrHelpFile; + sal_Int32 idHelpContext; + WString wstrTag; + WString wstrOnAction; + WString wstrParam; + sal_Int8 tbcu; + sal_Int8 tbmg; + + TBCExtraInfo(const TBCExtraInfo&); + TBCExtraInfo& operator = ( const TBCExtraInfo&); +public: + TBCExtraInfo(); + ~TBCExtraInfo(){} + bool Read(SvStream *pS); + void Print( FILE* ); + rtl::OUString getOnAction(); +}; + +class MSFILTER_DLLPUBLIC TBCGeneralInfo : public TBBase +{ + sal_uInt8 bFlags; + WString customText; + WString descriptionText; + WString tooltip; + TBCExtraInfo extraInfo; + +public: + TBCGeneralInfo(); + ~TBCGeneralInfo() {} + bool Read(SvStream *pS); + void Print( FILE* ); + bool ImportToolBarControlData( CustomToolBarImportHelper&, std::vector< css::beans::PropertyValue >& ); + rtl::OUString CustomText() { return customText.getString(); } + rtl::OUString DescriptionText() { return descriptionText.getString(); } + rtl::OUString Tooltip() { return tooltip.getString(); } +}; + +class MSFILTER_DLLPUBLIC TBCBitMap : public TBBase +{ +friend class TBCBSpecific; // #FIXME hacky access, need to fix + sal_Int32 cbDIB; + Bitmap mBitMap; + int size; +public: + TBCBitMap(); + ~TBCBitMap(); + bool Read(SvStream *pS); + void Print( FILE* ); + Bitmap& getBitMap(); +}; + +class MSFILTER_DLLPUBLIC TBCMenuSpecific : public TBBase +{ + sal_Int32 tbid; + boost::shared_ptr< WString > name; //exist only if tbid equals 0x00000001 +public: + TBCMenuSpecific(); + ~TBCMenuSpecific(){} + bool Read(SvStream *pS); + void Print( FILE* ); + rtl::OUString Name(); +}; + +class MSFILTER_DLLPUBLIC TBCCDData : public TBBase +{ + sal_Int16 cwstrItems; //Signed integer that specifies the number of items in wstrList. MUST be positive. + std::vector< WString > wstrList; // Zero-based index array of WString structures. Number of elements MUST be equal to cwstrItems. + sal_Int16 cwstrMRU; // Signed integer that specifies the number of most recently used string + sal_Int16 iSel ; // Signed integer that specifies the zero-based index of the selected item in the wstrList field. MUST be equal to 0xFFFF (-1) or greater than or equal to 0x0000. + sal_Int16 cLines; // Signed integer that specifies the suggested number of lines that the toolbar control will display at any time when displaying the elements of wstrList of available items. + sal_Int16 dxWidth; // Signed integer that specifies the width in pixels that the interior of the dropdown has. This excludes the width of the toolbar control border and scroll bar. + WString wstrEdit; //Structure of type WString. Editable text for editable area of the ComboBox toolbar control. + +public: + TBCCDData(); + ~TBCCDData(); + bool Read(SvStream *pS); + void Print( FILE* ); +}; + +class TBCComboDropdownSpecific : public TBBase +{ + boost::shared_ptr< TBCCDData > data; +public: + TBCComboDropdownSpecific( const TBCHeader& header ); + TBCComboDropdownSpecific(){} + bool Read(SvStream *pS); + void Print( FILE* ); +}; + +class TBCBSpecific : public TBBase +{ + sal_uInt8 bFlags; + boost::shared_ptr< TBCBitMap > icon; // optional + boost::shared_ptr< TBCBitMap > iconMask; // optional + boost::shared_ptr< sal_uInt16 > iBtnFace; // optional + boost::shared_ptr< WString > wstrAcc; // optional + +public: + TBCBSpecific(); + ~TBCBSpecific(){} + bool Read(SvStream *pS); + void Print( FILE* ); + // #TODO just add a getGraphic member here + TBCBitMap* getIcon(); + TBCBitMap* getIconMask(); + sal_uInt16* getBtnFace() { return iBtnFace.get(); } +}; + +/* TBCHeader.tct controlSpecificInfo type + +0x01 (Button control) TBCBSpecific +0x10 (ExpandingGrid control) TBCBSpecific +0x0A (Popup control) TBCMenuSpecific +0x0C (ButtonPopup control) TBCMenuSpecific +0x0D (SplitButtonPopup control) TBCMenuSpecific +0x0E (SplitButtonMRUPopup control) TBCMenuSpecific +0x02 (Edit control) TBCComboDropdow nSpecific +0x04 (ComboBox control) TBCComboDropdow nSpecific +0x14 (GraphicCombo control) TBCComboDropdow nSpecific +0x03 (DropDown control) TBCComboDropdow nSpecific +0x06 (SplitDropDown control) TBCComboDropdow nSpecific +0x09 (GraphicDropDown control) TBCComboDropdow nSpecific +0x07 (OCXDropDown control) controlSpecificInfo MUST NOT exist +0x0F (Label control) controlSpecificInfo MUST NOT exist +0x12 (Grid control) controlSpecificInfo MUST NOT exist +0x13 (Gauge control) controlSpecificInfo MUST NOT exist +0x16 (ActiveX control) controlSpecificInfo MUST NOT exist + +*/ +class MSFILTER_DLLPUBLIC TBCHeader : public TBBase +{ + sal_Int8 bSignature; + sal_Int8 bVersion; + sal_uInt8 bFlagsTCR; + sal_uInt8 tct; + sal_uInt16 tcid; + sal_uInt32 tbct; + sal_uInt8 bPriority; + boost::shared_ptr< sal_uInt16 > width; //optional + boost::shared_ptr< sal_uInt16 > height; //optional + +public: + TBCHeader(); + ~TBCHeader(); + 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; }; +}; + +class MSFILTER_DLLPUBLIC TBCData : public TBBase +{ + TBCHeader rHeader; + TBCGeneralInfo controlGeneralInfo; + boost::shared_ptr< TBBase > controlSpecificInfo; // can be one of TBCBSpecific, TBCMenuSpecific or TBCComboDropdow nSpecific depending on the control type specified by TBCHeader.tct + TBCData(const TBCData&); + TBCData& operator = ( const TBCData&); +public: + TBCData( const TBCHeader& Header ); + ~TBCData(){} + bool Read(SvStream *pS); + void Print( FILE* ); + bool ImportToolBarControl( CustomToolBarImportHelper&, std::vector< css::beans::PropertyValue >&, bool& bBeginGroup, bool bIsMenuBar ); + TBCGeneralInfo& getGeneralInfo() { return controlGeneralInfo; } + TBCMenuSpecific* getMenuSpecific(); +}; + +class MSFILTER_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 IsMenuToolbar(){ return ( ( ltbtr & 0x2000000 ) == 0x2000000 ); } + bool NeedsPositioning(); +}; + +class MSFILTER_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 ); +}; + +typedef cppu::WeakImplHelper1< css::container::XIndexContainer > PropertyValueIndexContainer_BASE; + +class MSFILTER_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 a/filter/source/msfilter/mstoolbar.cxx b/filter/source/msfilter/mstoolbar.cxx new file mode 100644 index 000000000000..f6e4155363ad --- /dev/null +++ b/filter/source/msfilter/mstoolbar.cxx @@ -0,0 +1,817 @@ +#include <filter/msfilter/mstoolbar.hxx> +#include <rtl/ustrbuf.hxx> +#include <stdarg.h> +#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 <filter/msfilter/msvbahelper.hxx> +#include <svtools/miscopt.hxx> +#include <vcl/svapp.hxx> +#include <vcl/window.hxx> + +using namespace com::sun::star; + +int TBBase::nIndent = 0; + +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 ) + { + uno::Sequence< rtl::OUString > commands(1); + 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 ); + 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 ); + } +} + +void CustomToolBarImportHelper::addIcon( const uno::Reference< graphic::XGraphic >& xImage, const rtl::OUString& sString ) +{ + iconcontrolitem item; + item.sCommand = sString; + item.image = xImage; + iconcommands.push_back( item ); +} + +CustomToolBarImportHelper::CustomToolBarImportHelper( SfxObjectShell& rDocShell, const css::uno::Reference< css::ui::XUIConfigurationManager>& rxAppCfgMgr ) : mrDocSh( rDocShell ) +{ + m_xCfgSupp.set( mrDocSh.GetModel(), uno::UNO_QUERY_THROW ); + m_xAppCfgMgr.set( rxAppCfgMgr, uno::UNO_QUERY_THROW ); +} + +uno::Reference< ui::XUIConfigurationManager > +CustomToolBarImportHelper::getCfgManager() +{ + return m_xCfgSupp->getUIConfigurationManager(); +} + +uno::Reference< ui::XUIConfigurationManager > +CustomToolBarImportHelper::getAppCfgManager() +{ + return m_xAppCfgMgr; +} + +uno::Any +CustomToolBarImportHelper::createCommandFromMacro( const rtl::OUString& sCmd ) +{ +//"vnd.sun.star.script:Standard.Module1.Main?language=Basic&location=document" + static rtl::OUString scheme = rtl::OUString::createFromAscii( "vnd.sun.star.script:"); + static rtl::OUString part2 = rtl::OUString::createFromAscii("?language=Basic&location=document"); + // create script url + rtl::OUString scriptURL = scheme + sCmd + part2; + return uno::makeAny( scriptURL ); +} + +rtl::OUString CustomToolBarImportHelper::MSOCommandToOOCommand( sal_Int16 msoCmd ) +{ + rtl::OUString result; + if ( pMSOCmdConvertor.get() ) + result = pMSOCmdConvertor->MSOCommandToOOCommand( msoCmd ); + return result; +} + +rtl::OUString CustomToolBarImportHelper::MSOTCIDToOOCommand( sal_Int16 msoTCID ) +{ + rtl::OUString result; + if ( pMSOCmdConvertor.get() ) + result = pMSOCmdConvertor->MSOTCIDToOOCommand( msoTCID ); + return result; +} + +bool +CustomToolBarImportHelper::createMenu( const rtl::OUString& rName, const uno::Reference< container::XIndexAccess >& xMenuDesc, bool bPersist ) +{ + bool bRes = true; + try + { + uno::Reference< ui::XUIConfigurationManager > xCfgManager( getCfgManager() ); + rtl::OUString sMenuBar( RTL_CONSTASCII_USTRINGPARAM("private:resource/menubar/") ); + sMenuBar += rName; + uno::Reference< container::XIndexContainer > xPopup( xCfgManager->createSettings(), uno::UNO_QUERY_THROW ); + uno::Reference< beans::XPropertySet > xProps( xPopup, uno::UNO_QUERY_THROW ); + // set name for menubar + xProps->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("UIName") ), uno::makeAny( rName ) ); + if ( xPopup.is() ) + { + uno::Sequence< beans::PropertyValue > aPopupMenu( 4 ); + aPopupMenu[0].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("CommandURL") ); + aPopupMenu[0].Value = uno::makeAny( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("vnd.openoffice.org:") ) + rName ); + aPopupMenu[1].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Label") ); + aPopupMenu[1].Value <<= rName; + aPopupMenu[2].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ItemDescriptorContainer") ); + aPopupMenu[2].Value = uno::makeAny( xMenuDesc ); + aPopupMenu[3].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Type" ) ); + aPopupMenu[3].Value <<= sal_Int32( 0 ); + + xPopup->insertByIndex( xPopup->getCount(), uno::makeAny( aPopupMenu ) ); + if ( bPersist ) + { + xCfgManager->insertSettings( sMenuBar, uno::Reference< container::XIndexAccess >( xPopup, uno::UNO_QUERY ) ); + uno::Reference< ui::XUIConfigurationPersistence > xPersistence( xCfgManager, uno::UNO_QUERY_THROW ); + xPersistence->store(); + } + } + } + catch( uno::Exception& ) + { + bRes = false; + } + return bRes; +} + +void +TBBase::indent_printf( FILE* fp, const char* format, ... ) +{ + va_list ap; + va_start ( ap, format ); + + // indent nIndent spaces + for ( int i=0; i<nIndent; ++i) + fprintf(fp," "); + // append the rest of the message + vfprintf( fp, format, ap ); + va_end( ap ); +} + +rtl::OUString TBBase::readUnicodeString( SvStream* pS, sal_Int32 nChars ) +{ + sal_Int32 nBufSize = nChars * 2; + boost::scoped_array< sal_uInt8 > pArray( new sal_uInt8[ nBufSize ] ); + pS->Read( pArray.get(), nBufSize ); + return svt::BinFilterUtils::CreateOUStringFromUniStringArray( reinterpret_cast< const char* >( pArray.get() ), nBufSize ); +} + +TBCHeader::TBCHeader() : bSignature( 0x3 ) +,bVersion( 0x01 ) +,bFlagsTCR( 0 ) +,tct(0x1) // default to Button +,tcid(0) +,tbct(0) +{ +} + + +TBCHeader::~TBCHeader() +{ +} + +bool TBCHeader::Read( SvStream* pS ) +{ + OSL_TRACE("TBCHeader::Read() stream pos 0x%x", pS->Tell() ); + nOffSet = pS->Tell(); + *pS >> bSignature >> bVersion >> bFlagsTCR >> tct >> tcid >> tbct >> bPriority; + // bit 4 ( from lsb ) + if ( bFlagsTCR & 0x10 ) + { + width.reset( new sal_uInt16 ); + height.reset( new sal_uInt16 ); + *pS >> *width >> *height; + } + return true; +} + +void TBCHeader::Print( FILE* fp ) +{ + Indent a; + indent_printf(fp,"[ 0x%x ] TBCHeader -- dump\n", nOffSet ); + 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 ); + indent_printf(fp," tcid 0x%x\n", tcid ); + indent_printf(fp," tbct 0x%x\n", static_cast< unsigned int >( tbct )); + indent_printf(fp," bPriority 0x%x\n", bPriority ); + if ( width.get() ) + indent_printf(fp," width 0x%d(0x%x)\n", *width, *width); + if ( height.get() ) + indent_printf(fp," height 0x%d(0x%x)\n", *height, *height); +} + +TBCData::TBCData( const TBCHeader& Header ) : rHeader( Header ) +{ +} + +bool TBCData::Read(SvStream *pS) +{ + OSL_TRACE("TBCData::Read() stream pos 0x%x", pS->Tell() ); + nOffSet = pS->Tell(); + if ( !controlGeneralInfo.Read(pS) /*|| !controlSpecificInfo.Read(pS)*/ ) + return false; + switch ( rHeader.getTct() ) + { + case 0x01: // (Button control) + case 0x10: // (ExpandingGrid control) + controlSpecificInfo.reset( new TBCBSpecific() ); + break; + case 0x0A: // (Popup control) + case 0x0C: // (ButtonPopup control) + case 0x0D: // (SplitButtonPopup control) + case 0x0E: // (SplitButtonMRUPopup control) + controlSpecificInfo.reset( new TBCMenuSpecific() ); + break; + case 0x02: // (Edit control) + case 0x04: // (ComboBox control) + case 0x14: // (GraphicCombo control) + case 0x03: // (DropDown control) + case 0x06: // (SplitDropDown control) + case 0x09: // (GraphicDropDown control) + controlSpecificInfo.reset( new TBCComboDropdownSpecific( rHeader ) ); + break; + default: + break; + } + if ( controlSpecificInfo.get() ) + return controlSpecificInfo->Read( pS ); + //#FIXME I need to be able to handle different controlSpecificInfo types. + return true; +} + +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 + rtl::OUString sCommand; + for ( std::vector< css::beans::PropertyValue >::iterator it = props.begin(); it != props.end(); ++it ) + { + if ( it->Name.equals( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("CommandURL") ) ) ) + it->Value >>= sCommand; + } + if ( TBCBitMap* pIcon = pSpecificInfo->getIcon() ) + { + // 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() ) + { + + rtl::OUString sBuiltInCmd = helper.MSOTCIDToOOCommand( *pSpecificInfo->getBtnFace() ); + if ( sBuiltInCmd.getLength() ) + { + uno::Sequence< rtl::OUString> sCmds(1); + sCmds[ 0 ] = sBuiltInCmd; + uno::Reference< ui::XImageManager > xImageManager( helper.getAppCfgManager()->getImageManager(), uno::UNO_QUERY_THROW ); + // 0 = default image size + uno::Sequence< uno::Reference< graphic::XGraphic > > sImages = xImageManager->getImages( 0, sCmds ); + if ( sImages.getLength() && sImages[0].is() ) + helper.addIcon( sImages[0], sCommand ); + } + } + } + } + else if ( rHeader.getTct() == 0x0a ) + { + aProp.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("CommandURL") ) ; + rtl::OUString sMenuBar( RTL_CONSTASCII_USTRINGPARAM("private:resource/menubar/") ); + + TBCMenuSpecific* pMenu = getMenuSpecific(); + if ( pMenu ) + aProp.Value = uno::makeAny( sMenuBar += pMenu->Name() ); // name of popup + 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 +} + +void TBCData::Print( FILE* fp ) +{ + Indent a; + indent_printf(fp,"[ 0x%x ] TBCData -- dump\n", nOffSet ); + indent_printf(fp," dumping controlGeneralInfo( TBCGeneralInfo )\n"); + controlGeneralInfo.Print( fp ); + //if ( rHeader.getTct() == 1 ) + if ( controlSpecificInfo.get() ) + { + indent_printf(fp," dumping controlSpecificInfo( TBCBSpecificInfo )\n"); + controlSpecificInfo->Print( fp ); + } +} + +bool +WString::Read( SvStream *pS ) +{ + OSL_TRACE("WString::Read() stream pos 0x%x", pS->Tell() ); + nOffSet = pS->Tell(); + sal_Int8 nChars = 0; + *pS >> nChars; + sString = readUnicodeString( pS, static_cast< sal_Int32 >( nChars ) ); + return true; +} + +TBCExtraInfo::TBCExtraInfo() : idHelpContext( 0 ) +{ +} + +bool +TBCExtraInfo::Read( SvStream *pS ) +{ + OSL_TRACE("TBCExtraInfo::Read() stream pos 0x%x", pS->Tell() ); + nOffSet = pS->Tell(); + if( !wstrHelpFile.Read( pS ) ) + return false; + + *pS >> idHelpContext; + + if ( !wstrTag.Read( pS ) || !wstrOnAction.Read( pS ) || !wstrParam.Read( pS ) ) + return false; + + *pS >> tbcu >> tbmg; + return true; +} + +void +TBCExtraInfo::Print( FILE* fp ) +{ + Indent a; + indent_printf( fp, "[ 0x%x ] TBCExtraInfo -- dump\n", nOffSet ); + indent_printf( fp, " wstrHelpFile %s\n", + rtl::OUStringToOString( wstrHelpFile.getString(), RTL_TEXTENCODING_UTF8 ).getStr() ); + indent_printf( fp, " idHelpContext 0x%x\n", static_cast< unsigned int >( idHelpContext ) ); + indent_printf( fp, " wstrTag %s\n", + rtl::OUStringToOString( wstrTag.getString(), RTL_TEXTENCODING_UTF8 ).getStr() ); + indent_printf( fp, " wstrOnAction %s\n", + rtl::OUStringToOString( wstrOnAction.getString(), RTL_TEXTENCODING_UTF8 ).getStr() ); + indent_printf( fp, " wstrParam %s\n", + rtl::OUStringToOString( wstrParam.getString(), RTL_TEXTENCODING_UTF8 ).getStr() ); + indent_printf( fp, " tbcu 0x%x\n", tbcu ); + indent_printf( fp, " tbmg 0x%x\n", tbmg ); + +} + +rtl::OUString +TBCExtraInfo::getOnAction() +{ + return wstrOnAction.getString(); +} + +TBCGeneralInfo::TBCGeneralInfo() : bFlags( 0 ) +{ +} + +bool TBCGeneralInfo::Read( SvStream *pS ) +{ + OSL_TRACE("TBCGeneralInfo::Read() stream pos 0x%x", pS->Tell() ); + nOffSet = pS->Tell(); + *pS >> bFlags; + + if ( ( bFlags & 0x1 ) && !customText.Read( pS ) ) + return false; + if ( ( bFlags & 0x2 ) && ( !descriptionText.Read( pS ) || !tooltip.Read( pS ) ) ) + return false; + if ( ( bFlags & 0x4 ) && !extraInfo.Read( pS ) ) + return false; + return true; +} + +void +TBCGeneralInfo::Print( FILE* fp ) +{ + Indent a; + indent_printf( fp, "[ 0x%x ] TBCGeneralInfo -- dump\n", nOffSet ); + indent_printf( fp, " bFlags 0x%x\n", bFlags ); + indent_printf( fp, " customText %s\n", + rtl::OUStringToOString( customText.getString(), RTL_TEXTENCODING_UTF8 ).getStr() ); + indent_printf( fp, " description %s\n", + rtl::OUStringToOString( descriptionText.getString(), RTL_TEXTENCODING_UTF8 ).getStr() ); + indent_printf( fp, " tooltip %s\n", + rtl::OUStringToOString( tooltip.getString(), RTL_TEXTENCODING_UTF8 ).getStr() ); + if ( bFlags & 0x4 ) + extraInfo.Print( fp ); +} + +bool +TBCGeneralInfo::ImportToolBarControlData( CustomToolBarImportHelper& helper, std::vector< beans::PropertyValue >& sControlData ) +{ + if ( ( bFlags & 0x5 ) ) + { + beans::PropertyValue aProp; + // probably access to the header would be a better test than seeing if there is an action, e.g. + // if ( rHeader.getTct() == 0x01 && rHeader.getTcID() == 0x01 ) // not defined, probably this is a command + if ( extraInfo.getOnAction().getLength() ) + { + aProp.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("CommandURL") ); + 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 ); + } + + aProp.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Label") ); + aProp.Value = uno::makeAny( customText.getString().replace('&','~') ); + sControlData.push_back( aProp ); + + aProp.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Type") ); + aProp.Value = uno::makeAny( ui::ItemType::DEFAULT ); + sControlData.push_back( aProp ); + + aProp.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Tooltip") ); + aProp.Value = uno::makeAny( tooltip.getString() ); + sControlData.push_back( aProp ); +/* +aToolbarItem(0).Name = "CommandURL" wstrOnAction +aToolbarItem(0).Value = Command +aToolbarItem(1).Name = "Label" customText +aToolbarItem(1).Value = Label +aToolbarItem(2).Name = "Type" +aToolbarItem(2).Value = 0 +aToolbarItem(3).Name = "Visible" +aToolbarItem(3).Value = true +*/ + } + return true; +} + +TBCMenuSpecific::TBCMenuSpecific() : tbid( 0 ) +{ +} + +bool +TBCMenuSpecific::Read( SvStream *pS) +{ + OSL_TRACE("TBCMenuSpecific::Read() stream pos 0x%x", pS->Tell() ); + nOffSet = pS->Tell(); + *pS >> tbid; + if ( tbid == 1 ) + { + name.reset( new WString() ); + return name->Read( pS ); + } + return true; +} + +void +TBCMenuSpecific::Print( FILE* fp ) +{ + Indent a; + 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\n", rtl::OUStringToOString( name->getString(), RTL_TEXTENCODING_UTF8 ).getStr() ); + +} + +rtl::OUString TBCMenuSpecific::Name() +{ + rtl::OUString aName; + if ( name.get() ) + aName = name->getString(); + return aName; +} +TBCBSpecific::TBCBSpecific() : bFlags( 0 ) +{ +} + +bool TBCBSpecific::Read( SvStream *pS) +{ + OSL_TRACE("TBCBSpecific::Read() stream pos 0x%x", pS->Tell() ); + nOffSet = pS->Tell(); + *pS >> bFlags; + + // bFlags determines what we read next + + // bFlags.fCustomBitmap = 1 ( 0x8 ) set + if ( bFlags & 0x8 ) + { + icon.reset( new TBCBitMap() ); + iconMask.reset( new TBCBitMap() ); + if ( !icon->Read( pS ) || !iconMask->Read( pS ) ) + return false; + } + // if bFlags.fCustomBtnFace = 1 ( 0x10 ) + if ( bFlags & 0x10 ) + { + iBtnFace.reset( new sal_uInt16 ); + *pS >> *iBtnFace.get(); + } + // if bFlags.fAccelerator equals 1 ( 0x04 ) + if ( bFlags & 0x04 ) + { + wstrAcc.reset( new WString() ); + return wstrAcc->Read( pS ); + } + return true; +} + + +void TBCBSpecific::Print( FILE* fp ) +{ + Indent a; + indent_printf( fp, "[ 0x%x ] TBCBSpecific -- dump\n", nOffSet ); + indent_printf( fp, " bFlags 0x%x\n", bFlags ); + bool bResult = ( icon.get() != NULL ); + indent_printf( fp, " icon present? %s\n", bResult ? "true" : "false" ); + if ( bResult ) + { + Indent b; + indent_printf( fp, " icon: \n"); + icon->Print( fp ); // will dump size + } + bResult = ( iconMask.get() != NULL ); + indent_printf( fp, " icon mask present? %s\n", bResult ? "true" : "false" ); + if ( bResult ) + { + Indent c; + indent_printf( fp, " icon mask: \n"); + iconMask->Print( fp ); // will dump size + } + if ( iBtnFace.get() ) + { + indent_printf( fp, " iBtnFace 0x%x\n", *(iBtnFace.get()) ); + } + bResult = ( wstrAcc.get() != NULL ); + indent_printf( fp, " option string present? %s ->%s<-\n", bResult ? "true" : "false", bResult ? rtl::OUStringToOString( wstrAcc->getString(), RTL_TEXTENCODING_UTF8 ).getStr() : "N/A" ); +} + +TBCBitMap* +TBCBSpecific::getIcon() +{ + return icon.get(); +} + +TBCBitMap* +TBCBSpecific::getIconMask() +{ + return iconMask.get(); +} + +TBCComboDropdownSpecific::TBCComboDropdownSpecific(const TBCHeader& header ) +{ + if ( header.getTcID() == 0x01 ) + data.reset( new TBCCDData() ); +} + +bool TBCComboDropdownSpecific::Read( SvStream *pS) +{ + nOffSet = pS->Tell(); + if ( data.get() ) + return data->Read( pS ); + return true; +} + +void TBCComboDropdownSpecific::Print( FILE* fp) +{ + Indent a; + indent_printf(fp,"[ 0x%x ] TBCComboDropdownSpecific -- dump\n", nOffSet ); + if ( data.get() ) + data->Print( fp ); + else + indent_printf(fp," no data " ); +} + +TBCCDData::TBCCDData() : cwstrItems( 0 ) +,iSel( 0 ) +,cLines( 0 ) +,dxWidth( 0 ) +{ +} + +TBCCDData::~TBCCDData() +{ +} + +bool TBCCDData::Read( SvStream *pS) +{ + nOffSet = pS->Tell(); + *pS >> cwstrItems; + if ( cwstrItems ) + { + for( sal_Int32 index=0; index < cwstrItems; ++index ) + { + WString aString; + if ( !aString.Read( pS ) ) + return false; + wstrList.push_back( aString ); + } + } + *pS >> cwstrMRU >> iSel >> cLines >> dxWidth; + + return wstrEdit.Read( pS ); +} + +void TBCCDData::Print( FILE* fp) +{ + Indent a; + indent_printf(fp,"[ 0x%x ] TBCCDData -- dump\n", nOffSet ); + indent_printf(fp," cwstrItems items in wstrList 0x%d\n", cwstrItems); + for ( sal_Int32 index=0; index < cwstrItems; ++index ) + { + Indent b; + indent_printf(fp, " wstrList[%d] %s", static_cast< int >( index ), rtl::OUStringToOString( wstrList[index].getString(), RTL_TEXTENCODING_UTF8 ).getStr() ); + } + indent_printf(fp," cwstrMRU num most recently used string 0x%d item\n", cwstrMRU); + indent_printf(fp," iSel index of selected item 0x%d item\n", iSel); + indent_printf(fp," cLines num of suggested lines to display 0x%d", cLines); + indent_printf(fp," dxWidth width in pixels 0x%d", dxWidth); + indent_printf(fp," wstrEdit %s", rtl::OUStringToOString( wstrEdit.getString(), RTL_TEXTENCODING_UTF8 ).getStr() ); +} + +TBCBitMap::TBCBitMap() : cbDIB( 0 ), size( 0 ) +{ +} + +TBCBitMap::~TBCBitMap() +{ +} + +// #FIXME Const-ness +Bitmap& +TBCBitMap::getBitMap() +{ + return mBitMap; +} + +bool TBCBitMap::Read( SvStream* pS) +{ + OSL_TRACE("TBCBitMap::Read() stream pos 0x%x", pS->Tell() ); + nOffSet = pS->Tell(); + *pS >> cbDIB; + // cbDIB = sizeOf(biHeader) + sizeOf(colors) + sizeOf(bitmapData) + 10 + return mBitMap.Read( *pS, FALSE, TRUE ); +} + +void TBCBitMap::Print( FILE* fp ) +{ + Indent a; + 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 ); +} + |