diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:06:44 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:06:44 +0000 |
commit | ed5640d8b587fbcfed7dd7967f3de04b37a76f26 (patch) | |
tree | 7a5f7c6c9d02226d7471cb3cc8fbbf631b415303 /include/filter/msfilter/mstoolbar.hxx | |
parent | Initial commit. (diff) | |
download | libreoffice-ed5640d8b587fbcfed7dd7967f3de04b37a76f26.tar.xz libreoffice-ed5640d8b587fbcfed7dd7967f3de04b37a76f26.zip |
Adding upstream version 4:7.4.7.upstream/4%7.4.7upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'include/filter/msfilter/mstoolbar.hxx')
-rw-r--r-- | include/filter/msfilter/mstoolbar.hxx | 355 |
1 files changed, 355 insertions, 0 deletions
diff --git a/include/filter/msfilter/mstoolbar.hxx b/include/filter/msfilter/mstoolbar.hxx new file mode 100644 index 000000000..46966d648 --- /dev/null +++ b/include/filter/msfilter/mstoolbar.hxx @@ -0,0 +1,355 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#ifndef INCLUDED_FILTER_MSFILTER_MSTOOLBAR_HXX +#define INCLUDED_FILTER_MSFILTER_MSTOOLBAR_HXX + +#include <memory> +#include <string_view> +#include <vector> + +#include <com/sun/star/uno/Any.hxx> +#include <com/sun/star/uno/Reference.hxx> +#include <filter/msfilter/msfilterdllapi.h> +#include <rtl/ustring.hxx> +#include <sal/types.h> +#include <tools/stream.hxx> +#include <vcl/bitmapex.hxx> + +namespace com::sun::star { + namespace beans { struct PropertyValue; } + namespace container { class XIndexAccess; } + namespace graphic { class XGraphic; } + namespace ui { class XUIConfigurationManager; } + namespace ui { class XUIConfigurationManagerSupplier; } +} + +class TBCHeader; + +class MSOCommandConvertor +{ +public: + virtual ~MSOCommandConvertor() {} + virtual OUString MSOCommandToOOCommand( sal_Int16 msoCmd ) = 0; + virtual OUString MSOTCIDToOOCommand( sal_Int16 msoTCID ) = 0; +}; + +class SfxObjectShell; + +class MSFILTER_DLLPUBLIC CustomToolBarImportHelper +{ + struct iconcontrolitem + { + OUString sCommand; + css::uno::Reference< css::graphic::XGraphic > image; + }; + std::vector< iconcontrolitem > iconcommands; + std::unique_ptr< MSOCommandConvertor > pMSOCmdConvertor; + css::uno::Reference< css::ui::XUIConfigurationManagerSupplier > m_xCfgSupp; + css::uno::Reference< css::ui::XUIConfigurationManager > m_xAppCfgMgr; + SfxObjectShell& mrDocSh; + static void ScaleImage( css::uno::Reference< css::graphic::XGraphic >& xGraphic, tools::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(); + const css::uno::Reference< css::ui::XUIConfigurationManager >& getAppCfgManager() const { return m_xAppCfgMgr;} + + + static css::uno::Any createCommandFromMacro( std::u16string_view sCmd ); + + void addIcon( const css::uno::Reference< css::graphic::XGraphic >& xImage, const OUString& sString ); + void applyIcons(); + OUString MSOCommandToOOCommand( sal_Int16 msoCmd ); + OUString MSOTCIDToOOCommand( sal_Int16 msoTCID ); + SfxObjectShell& GetDocShell() { return mrDocSh; } + bool createMenu( const OUString& rName, const css::uno::Reference< css::container::XIndexAccess >& xMenuDesc ); +}; + +class MSFILTER_DLLPUBLIC TBBase +{ +friend class Indent; + static int nIndent; // num spaces to indent before printing +protected: +#ifdef DEBUG_FILTER_MSTOOLBAR + static void indent_printf(FILE* fp, const char* format, ... ); +#endif + sal_uInt32 nOffSet; // usually for debug we can store the offset in the stream to this record +public: + TBBase() : nOffSet( 0 ) {} + virtual ~TBBase(){} + + TBBase(TBBase const &) = default; + TBBase(TBBase &&) = default; + TBBase & operator =(TBBase const &) = default; + TBBase & operator =(TBBase &&) = default; + + virtual bool Read(SvStream &rS) = 0; +#ifdef DEBUG_FILTER_MSTOOLBAR + virtual void Print( FILE* ) {} // #FIXME remove this an implement the debug routines in all the classes below to enable some sort of readable output +#endif + sal_uInt32 GetOffset() const { return nOffSet; } +}; + +class Indent +{ +public: + Indent( bool binit ) + { + if ( binit ) + TBBase::nIndent = 0; + else + TBBase::nIndent = TBBase::nIndent + 2; + } + ~Indent() { TBBase::nIndent = TBBase::nIndent - 2; } +}; + + +class MSFILTER_DLLPUBLIC WString final : public TBBase +{ + OUString sString; + +public: + WString(){}; + bool Read(SvStream &rS) override; + const OUString& getString() const { return sString; } +}; + +class MSFILTER_DLLPUBLIC TBCExtraInfo final : public TBBase +{ + WString wstrHelpFile; + sal_Int32 idHelpContext; + WString wstrTag; + WString wstrOnAction; + WString wstrParam; + sal_Int8 tbcu; + sal_Int8 tbmg; + + TBCExtraInfo(const TBCExtraInfo&) = delete; + TBCExtraInfo& operator = ( const TBCExtraInfo&) = delete; +public: + TBCExtraInfo(); + bool Read(SvStream &rS) override; +#ifdef DEBUG_FILTER_MSTOOLBAR + virtual void Print( FILE* ) override; +#endif + OUString const & getOnAction() const; +}; + +class MSFILTER_DLLPUBLIC TBCGeneralInfo final : public TBBase +{ + sal_uInt8 bFlags; + WString customText; + WString descriptionText; + WString tooltip; + TBCExtraInfo extraInfo; + +public: + TBCGeneralInfo(); + bool Read(SvStream &rS) override; + void ImportToolBarControlData( CustomToolBarImportHelper&, std::vector< css::beans::PropertyValue >& ); + OUString const & CustomText() { return customText.getString(); } +}; + +class TBCBitMap final : public TBBase +{ +friend class TBCBSpecific; // #FIXME hacky access, need to fix + sal_Int32 cbDIB; + BitmapEx mBitMap; +public: + TBCBitMap(); + virtual ~TBCBitMap() override; + bool Read(SvStream &rS) override; +#ifdef DEBUG_FILTER_MSTOOLBAR + virtual void Print( FILE* ) override; +#endif + // #FIXME Const-ness + BitmapEx& getBitMap() { return mBitMap;} +}; + +class MSFILTER_DLLPUBLIC TBCMenuSpecific final : public TBBase +{ + sal_Int32 tbid; + std::shared_ptr< WString > name; //exist only if tbid equals 0x00000001 +public: + TBCMenuSpecific(); + bool Read(SvStream &rS) override; + OUString Name(); +}; + +class TBCCDData final : 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(); + virtual ~TBCCDData() override; + bool Read(SvStream &rS) override; +}; + +class TBCComboDropdownSpecific final : public TBBase +{ + std::shared_ptr< TBCCDData > data; +public: + TBCComboDropdownSpecific( const TBCHeader& header ); + bool Read(SvStream &rS) override; +}; + +class TBCBSpecific final : public TBBase +{ + sal_uInt8 bFlags; + std::shared_ptr< TBCBitMap > icon; // optional + std::shared_ptr< TBCBitMap > iconMask; // optional + std::shared_ptr< sal_uInt16 > iBtnFace; // optional + std::shared_ptr< WString > wstrAcc; // optional + +public: + TBCBSpecific(); + bool Read(SvStream &rS) override; + // #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 final : public TBBase +{ + sal_Int8 bSignature; + sal_Int8 bVersion; + sal_uInt8 bFlagsTCR; + sal_uInt8 tct; + sal_uInt16 tcid; + sal_uInt32 tbct; + sal_uInt8 bPriority; + std::shared_ptr< sal_uInt16 > width; //optional + std::shared_ptr< sal_uInt16 > height; //optional + +public: + TBCHeader(); + virtual ~TBCHeader() override; + + TBCHeader(TBCHeader const &) = default; + TBCHeader(TBCHeader &&) = default; + TBCHeader & operator =(TBCHeader const &) = default; + TBCHeader & operator =(TBCHeader &&) = default; + + sal_uInt8 getTct() const { return tct; } + sal_uInt16 getTcID() const { return tcid; } + bool isVisible() const { return !( bFlagsTCR & 0x1 ); } + bool isBeginGroup() const { return ( bFlagsTCR & 0x2 ) != 0; } + bool Read(SvStream &rS) override; +#ifdef DEBUG_FILTER_MSTOOLBAR + virtual void Print( FILE* ) override; +#endif + sal_uInt32 getTbct() const { return tbct; }; +}; + +class MSFILTER_DLLPUBLIC TBCData final : public TBBase +{ + TBCHeader rHeader; + TBCGeneralInfo controlGeneralInfo; + std::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&) = delete; + TBCData& operator = ( const TBCData&) = delete; +public: + TBCData( TBCHeader Header ); + bool Read(SvStream &rS) override; +#ifdef DEBUG_FILTER_MSTOOLBAR + virtual void Print( FILE* ) override; +#endif + void ImportToolBarControl( CustomToolBarImportHelper&, std::vector< css::beans::PropertyValue >&, bool& bBeginGroup, bool bIsMenuBar ); + TBCGeneralInfo& getGeneralInfo() { return controlGeneralInfo; } + TBCMenuSpecific* getMenuSpecific(); +}; + +class MSFILTER_DLLPUBLIC TB final : 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(); + bool Read(SvStream &rS) override; +#ifdef DEBUG_FILTER_MSTOOLBAR + virtual void Print( FILE* ) override; +#endif + sal_Int16 getcCL() const { return cCL; } + WString& getName(){ return name; } + bool IsEnabled() const; + bool IsMenuToolbar() const { return ( ( ltbtr & 0x2000000 ) == 0x2000000 ); } +}; + +class MSFILTER_DLLPUBLIC SRECT final : 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 &rS ) override { rS.ReadInt16( left ).ReadInt16( top ).ReadInt16( right ).ReadInt16( bottom ); return true; } +#ifdef DEBUG_FILTER_MSTOOLBAR + virtual void Print( FILE* fo ) override; +#endif +}; + + +class MSFILTER_DLLPUBLIC TBVisualData final : public TBBase +{ + sal_Int8 tbds; + sal_Int8 tbv; + sal_Int8 tbdsDock; + sal_Int8 iRow; + + SRECT rcDock; + SRECT rcFloat; + +public: + TBVisualData(); + bool Read(SvStream &rS) override; +#ifdef DEBUG_FILTER_MSTOOLBAR + virtual void Print( FILE* ) override; +#endif +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |