diff options
Diffstat (limited to 'oox/source/ole/axcontrol.cxx')
-rw-r--r-- | oox/source/ole/axcontrol.cxx | 1122 |
1 files changed, 773 insertions, 349 deletions
diff --git a/oox/source/ole/axcontrol.cxx b/oox/source/ole/axcontrol.cxx index 96baaab4bb36..95d5c7dc67b7 100644 --- a/oox/source/ole/axcontrol.cxx +++ b/oox/source/ole/axcontrol.cxx @@ -27,20 +27,24 @@ #include "oox/ole/axcontrol.hxx" #include <rtl/tencinfo.h> -#include <com/sun/star/lang/XMultiServiceFactory.hpp> -#include <com/sun/star/container/XIndexContainer.hpp> #include <com/sun/star/awt/FontSlant.hpp> #include <com/sun/star/awt/FontStrikeout.hpp> #include <com/sun/star/awt/FontUnderline.hpp> #include <com/sun/star/awt/FontWeight.hpp> #include <com/sun/star/awt/ImagePosition.hpp> #include <com/sun/star/awt/ImageScaleMode.hpp> +#include <com/sun/star/awt/Point.hpp> #include <com/sun/star/awt/ScrollBarOrientation.hpp> +#include <com/sun/star/awt/Size.hpp> #include <com/sun/star/awt/TextAlign.hpp> #include <com/sun/star/awt/VisualEffect.hpp> #include <com/sun/star/awt/XControlModel.hpp> -#include <com/sun/star/style/VerticalAlignment.hpp> +#include <com/sun/star/container/XIndexContainer.hpp> +#include <com/sun/star/form/XForm.hpp> #include <com/sun/star/form/XFormComponent.hpp> +#include <com/sun/star/form/XFormsSupplier.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/style/VerticalAlignment.hpp> #include "properties.hxx" #include "tokens.hxx" #include "oox/helper/attributelist.hxx" @@ -48,20 +52,23 @@ #include "oox/helper/graphichelper.hxx" #include "oox/helper/propertymap.hxx" #include "oox/helper/propertyset.hxx" -#include "oox/core/filterbase.hxx" -#include "oox/ole/axbinaryreader.hxx" -#include "oox/ole/axcontrolhelper.hxx" -#include "oox/ole/olehelper.hxx" using ::rtl::OUString; +using ::com::sun::star::awt::Point; +using ::com::sun::star::awt::Size; +using ::com::sun::star::awt::XControlModel; +using ::com::sun::star::container::XIndexContainer; +using ::com::sun::star::container::XNameContainer; +using ::com::sun::star::drawing::XDrawPage; +using ::com::sun::star::form::XForm; +using ::com::sun::star::form::XFormComponent; +using ::com::sun::star::lang::XMultiServiceFactory; using ::com::sun::star::uno::Any; using ::com::sun::star::uno::Exception; using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::UNO_QUERY; using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::container::XIndexContainer; -using ::com::sun::star::awt::XControlModel; -using ::com::sun::star::form::XFormComponent; -using ::oox::core::FilterBase; +using ::com::sun::star::uno::UNO_SET_THROW; namespace oox { namespace ole { @@ -70,6 +77,29 @@ namespace ole { namespace { +const sal_uInt32 COMCTL_ID_SIZE = 0x12344321; + +const sal_uInt32 COMCTL_ID_COMMONDATA = 0xABCDEF01; +const sal_uInt32 COMCTL_COMMON_FLATBORDER = 0x00000001; +const sal_uInt32 COMCTL_COMMON_ENABLED = 0x00000002; +const sal_uInt32 COMCTL_COMMON_3DBORDER = 0x00000004; +const sal_uInt32 COMCTL_COMMON_OLEDROPMAN = 0x00002000; + +const sal_uInt32 COMCTL_ID_COMPLEXDATA = 0xBDECDE1F; +const sal_uInt32 COMCTL_COMPLEX_FONT = 0x00000001; +const sal_uInt32 COMCTL_COMPLEX_MOUSEICON = 0x00000002; + +const sal_uInt32 COMCTL_ID_SCROLLBAR_60 = 0x99470A83; +const sal_uInt32 COMCTL_SCROLLBAR_HOR = 0x00000010; +const sal_Int32 COMCTL_SCROLLBAR_3D = 0; +const sal_Int32 COMCTL_SCROLLBAR_FLAT = 1; +const sal_Int32 COMCTL_SCROLLBAR_TRACK3D = 2; + +const sal_uInt32 COMCTL_ID_PROGRESSBAR_50 = 0xE6E17E84; +const sal_uInt32 COMCTL_ID_PROGRESSBAR_60 = 0x97AB8A01; + +// ---------------------------------------------------------------------------- + const sal_uInt32 AX_FLAGS_ENABLED = 0x00000002; const sal_uInt32 AX_FLAGS_LOCKED = 0x00000004; const sal_uInt32 AX_FLAGS_OPAQUE = 0x00000008; @@ -99,26 +129,6 @@ const sal_uInt32 AX_MORPHDATA_DEFFLAGS = 0x2C80081B; const sal_uInt32 AX_SPINBUTTON_DEFFLAGS = 0x0000001B; const sal_uInt32 AX_SCROLLBAR_DEFFLAGS = 0x0000001B; -const sal_uInt32 AX_FONT_BOLD = 0x00000001; -const sal_uInt32 AX_FONT_ITALIC = 0x00000002; -const sal_uInt32 AX_FONT_UNDERLINE = 0x00000004; -const sal_uInt32 AX_FONT_STRIKEOUT = 0x00000008; -const sal_uInt32 AX_FONT_DISABLED = 0x00002000; -const sal_uInt32 AX_FONT_AUTOCOLOR = 0x40000000; - -const sal_Int32 AX_FONTALIGN_LEFT = 1; -const sal_Int32 AX_FONTALIGN_RIGHT = 2; -const sal_Int32 AX_FONTALIGN_CENTER = 3; - -const sal_Int32 AX_BORDERSTYLE_NONE = 0; -const sal_Int32 AX_BORDERSTYLE_SINGLE = 1; - -const sal_Int32 AX_SPECIALEFFECT_FLAT = 0; -const sal_Int32 AX_SPECIALEFFECT_RAISED = 1; -const sal_Int32 AX_SPECIALEFFECT_SUNKEN = 2; -const sal_Int32 AX_SPECIALEFFECT_ETCHED = 3; -const sal_Int32 AX_SPECIALEFFECT_BUMPED = 6; - const sal_uInt16 AX_POS_TOPLEFT = 0; const sal_uInt16 AX_POS_TOP = 1; const sal_uInt16 AX_POS_TOPRIGHT = 2; @@ -129,31 +139,21 @@ const sal_uInt16 AX_POS_BOTTOMLEFT = 6; const sal_uInt16 AX_POS_BOTTOM = 7; const sal_uInt16 AX_POS_BOTTOMRIGHT = 8; -#define AX_PICPOS( label, image ) ((AX_POS_##label << 16) | AX_POS_##image) -const sal_uInt32 AX_PICPOS_LEFTTOP = AX_PICPOS( TOPRIGHT, TOPLEFT ); -const sal_uInt32 AX_PICPOS_LEFTCENTER = AX_PICPOS( RIGHT, LEFT ); -const sal_uInt32 AX_PICPOS_LEFTBOTTOM = AX_PICPOS( BOTTOMRIGHT, BOTTOMLEFT ); -const sal_uInt32 AX_PICPOS_RIGHTTOP = AX_PICPOS( TOPLEFT, TOPRIGHT ); -const sal_uInt32 AX_PICPOS_RIGHTCENTER = AX_PICPOS( LEFT, RIGHT ); -const sal_uInt32 AX_PICPOS_RIGHTBOTTOM = AX_PICPOS( BOTTOMLEFT, BOTTOMRIGHT ); -const sal_uInt32 AX_PICPOS_ABOVELEFT = AX_PICPOS( BOTTOMLEFT, TOPLEFT ); -const sal_uInt32 AX_PICPOS_ABOVECENTER = AX_PICPOS( BOTTOM, TOP ); -const sal_uInt32 AX_PICPOS_ABOVERIGHT = AX_PICPOS( BOTTOMRIGHT, TOPRIGHT ); -const sal_uInt32 AX_PICPOS_BELOWLEFT = AX_PICPOS( TOPLEFT, BOTTOMLEFT ); -const sal_uInt32 AX_PICPOS_BELOWCENTER = AX_PICPOS( TOP, BOTTOM ); -const sal_uInt32 AX_PICPOS_BELOWRIGHT = AX_PICPOS( TOPRIGHT, BOTTOMRIGHT ); -const sal_uInt32 AX_PICPOS_CENTER = AX_PICPOS( CENTER, CENTER ); -#undef AX_PICPOS - -const sal_Int32 AX_PICSIZE_CLIP = 0; -const sal_Int32 AX_PICSIZE_STRETCH = 1; -const sal_Int32 AX_PICSIZE_ZOOM = 3; - -const sal_Int32 AX_PICALIGN_TOPLEFT = 0; -const sal_Int32 AX_PICALIGN_TOPRIGHT = 1; -const sal_Int32 AX_PICALIGN_CENTER = 2; -const sal_Int32 AX_PICALIGN_BOTTOMLEFT = 3; -const sal_Int32 AX_PICALIGN_BOTTOMRIGHT = 4; +#define AX_PICPOS_IMPL( label, image ) ((AX_POS_##label << 16) | AX_POS_##image) +const sal_uInt32 AX_PICPOS_LEFTTOP = AX_PICPOS_IMPL( TOPRIGHT, TOPLEFT ); +const sal_uInt32 AX_PICPOS_LEFTCENTER = AX_PICPOS_IMPL( RIGHT, LEFT ); +const sal_uInt32 AX_PICPOS_LEFTBOTTOM = AX_PICPOS_IMPL( BOTTOMRIGHT, BOTTOMLEFT ); +const sal_uInt32 AX_PICPOS_RIGHTTOP = AX_PICPOS_IMPL( TOPLEFT, TOPRIGHT ); +const sal_uInt32 AX_PICPOS_RIGHTCENTER = AX_PICPOS_IMPL( LEFT, RIGHT ); +const sal_uInt32 AX_PICPOS_RIGHTBOTTOM = AX_PICPOS_IMPL( BOTTOMLEFT, BOTTOMRIGHT ); +const sal_uInt32 AX_PICPOS_ABOVELEFT = AX_PICPOS_IMPL( BOTTOMLEFT, TOPLEFT ); +const sal_uInt32 AX_PICPOS_ABOVECENTER = AX_PICPOS_IMPL( BOTTOM, TOP ); +const sal_uInt32 AX_PICPOS_ABOVERIGHT = AX_PICPOS_IMPL( BOTTOMRIGHT, TOPRIGHT ); +const sal_uInt32 AX_PICPOS_BELOWLEFT = AX_PICPOS_IMPL( TOPLEFT, BOTTOMLEFT ); +const sal_uInt32 AX_PICPOS_BELOWCENTER = AX_PICPOS_IMPL( TOP, BOTTOM ); +const sal_uInt32 AX_PICPOS_BELOWRIGHT = AX_PICPOS_IMPL( TOPRIGHT, BOTTOMRIGHT ); +const sal_uInt32 AX_PICPOS_CENTER = AX_PICPOS_IMPL( CENTER, CENTER ); +#undef AX_PICPOS_IMPL const sal_Int32 AX_DISPLAYSTYLE_TEXT = 1; const sal_Int32 AX_DISPLAYSTYLE_LISTBOX = 2; @@ -186,6 +186,25 @@ const sal_Int32 AX_ORIENTATION_HORIZONTAL = 1; const sal_Int32 AX_PROPTHUMB_ON = -1; const sal_Int32 AX_PROPTHUMB_OFF = 0; +const sal_uInt32 AX_CONTAINER_ENABLED = 0x00000004; +const sal_uInt32 AX_CONTAINER_HASDESIGNEXT = 0x00004000; +const sal_uInt32 AX_CONTAINER_NOCLASSTABLE = 0x00008000; + +const sal_uInt32 AX_CONTAINER_DEFFLAGS = 0x00000004; + +const sal_Int32 AX_CONTAINER_DEFWIDTH = 4000; +const sal_Int32 AX_CONTAINER_DEFHEIGHT = 3000; + +const sal_Int32 AX_CONTAINER_CYCLEALL = 0; +const sal_Int32 AX_CONTAINER_CYCLECURRENT = 2; + +const sal_Int32 AX_CONTAINER_SCR_NONE = 0x00; +const sal_Int32 AX_CONTAINER_SCR_HOR = 0x01; +const sal_Int32 AX_CONTAINER_SCR_VER = 0x02; +const sal_Int32 AX_CONTAINER_SCR_KEEP_HOR = 0x04; +const sal_Int32 AX_CONTAINER_SCR_KEEP_VER = 0x08; +const sal_Int32 AX_CONTAINER_SCR_SHOW_LEFT = 0x10; + // ---------------------------------------------------------------------------- const sal_Int16 API_BORDER_NONE = 0; @@ -196,37 +215,82 @@ const sal_Int16 API_STATE_UNCHECKED = 0; const sal_Int16 API_STATE_CHECKED = 1; const sal_Int16 API_STATE_DONTKNOW = 2; -// ---------------------------------------------------------------------------- +} // namespace + +// ============================================================================ -/** Specifies how a form control supports transparent background. */ -enum ApiTransparencyMode +ControlConverter::ControlConverter( const GraphicHelper& rGraphicHelper, bool bDefaultColorBgr ) : + mrGraphicHelper( rGraphicHelper ), + mbDefaultColorBgr( bDefaultColorBgr ) { - API_TRANSPARENCY_NOTSUPPORTED, /// Control does not support transparency. - API_TRANSPARENCY_VOID, /// Transparency is enabled by missing fill color. - API_TRANSPARENCY_PAINTTRANSPARENT /// Transparency is enabled by the 'PaintTransparent' property. -}; +} -// ---------------------------------------------------------------------------- +ControlConverter::~ControlConverter() +{ +} -/** Specifies how a form control supports the DefaultState property. */ -enum ApiDefaultStateMode +// Generic conversion --------------------------------------------------------- + +void ControlConverter::convertSize( PropertyMap& rPropMap, const AxPairData& rSize ) const { - API_DEFAULTSTATE_BOOLEAN, /// Control does not support tri-state, state is given as boolean. - API_DEFAULTSTATE_SHORT, /// Control does not support tri-state, state is given as short. - API_DEFAULTSTATE_TRISTATE /// Control supports tri-state, state is given as short. -}; + // size is given in 1/100 mm, UNO needs AppFont units + Size aAppFontSize = mrGraphicHelper.convertHmmToAppFont( Size( rSize.first, rSize.second ) ); + rPropMap.setProperty( PROP_Width, aAppFontSize.Width ); + rPropMap.setProperty( PROP_Height, aAppFontSize.Height ); +} -// ---------------------------------------------------------------------------- +void ControlConverter::convertPosition( PropertyMap& rPropMap, const AxPairData& rPos ) const +{ + // position is given in 1/100 mm, UNO needs AppFont units + Point aAppFontPos = mrGraphicHelper.convertHmmToAppFont( Point( rPos.first, rPos.second ) ); + rPropMap.setProperty( PROP_PositionX, aAppFontPos.X ); + rPropMap.setProperty( PROP_PositionY, aAppFontPos.Y ); +} + +void ControlConverter::convertColor( PropertyMap& rPropMap, sal_Int32 nPropId, sal_uInt32 nOleColor ) const +{ + rPropMap.setProperty( nPropId, OleHelper::decodeOleColor( mrGraphicHelper, nOleColor, mbDefaultColorBgr ) ); +} + +void ControlConverter::convertPicture( PropertyMap& rPropMap, const StreamDataSequence& rPicData ) const +{ + if( rPicData.hasElements() ) + { + OUString aGraphicUrl = mrGraphicHelper.importGraphicObject( rPicData ); + if( aGraphicUrl.getLength() > 0 ) + rPropMap.setProperty( PROP_ImageURL, aGraphicUrl ); + } +} + +void ControlConverter::convertOrientation( PropertyMap& rPropMap, bool bHorizontal ) const +{ + namespace AwtScrollBarOrient = ::com::sun::star::awt::ScrollBarOrientation; + sal_Int32 nScrollOrient = bHorizontal ? AwtScrollBarOrient::HORIZONTAL : AwtScrollBarOrient::VERTICAL; + rPropMap.setProperty( PROP_Orientation, nScrollOrient ); +} -/** Converts the AX background formatting to UNO properties. */ -void lclConvertBackground( AxControlHelper& rHelper, PropertyMap& rPropMap, sal_uInt32 nBackColor, sal_uInt32 nFlags, ApiTransparencyMode eTranspMode ) +void ControlConverter::convertScrollBar( PropertyMap& rPropMap, + sal_Int32 nMin, sal_Int32 nMax, sal_Int32 nPosition, + sal_Int32 nSmallChange, sal_Int32 nLargeChange, bool bAwtModel ) const +{ + rPropMap.setProperty( PROP_ScrollValueMin, ::std::min( nMin, nMax ) ); + rPropMap.setProperty( PROP_ScrollValueMax, ::std::max( nMin, nMax ) ); + rPropMap.setProperty( PROP_LineIncrement, nSmallChange ); + rPropMap.setProperty( PROP_BlockIncrement, nLargeChange ); + rPropMap.setProperty( bAwtModel ? PROP_ScrollValue : PROP_DefaultScrollValue, nPosition ); +} + +// ActiveX (Forms 2.0) specific conversion ------------------------------------ + +void ControlConverter::convertAxBackground( PropertyMap& rPropMap, + sal_uInt32 nBackColor, sal_uInt32 nFlags, ApiTransparencyMode eTranspMode ) const { bool bOpaque = getFlag( nFlags, AX_FLAGS_OPAQUE ); switch( eTranspMode ) { case API_TRANSPARENCY_NOTSUPPORTED: // fake transparency by using system window background if needed - rPropMap.setProperty( PROP_BackgroundColor, rHelper.convertColor( bOpaque ? nBackColor : AX_SYSCOLOR_WINDOWBACK ) ); + convertColor( rPropMap, PROP_BackgroundColor, bOpaque ? nBackColor : AX_SYSCOLOR_WINDOWBACK ); break; case API_TRANSPARENCY_PAINTTRANSPARENT: rPropMap.setProperty( PROP_PaintTransparent, !bOpaque ); @@ -234,52 +298,31 @@ void lclConvertBackground( AxControlHelper& rHelper, PropertyMap& rPropMap, sal_ case API_TRANSPARENCY_VOID: // keep transparency by leaving the (void) default property value if( bOpaque ) - rPropMap.setProperty( PROP_BackgroundColor, rHelper.convertColor( nBackColor ) ); + convertColor( rPropMap, PROP_BackgroundColor, nBackColor ); break; } } -// ---------------------------------------------------------------------------- - -/** Converts the AX border formatting to UNO properties. */ -void lclConvertBorder( AxControlHelper& rHelper, PropertyMap& rPropMap, sal_uInt32 nBorderColor, sal_Int32 nBorderStyle, sal_Int32 nSpecialEffect ) +void ControlConverter::convertAxBorder( PropertyMap& rPropMap, + sal_uInt32 nBorderColor, sal_Int32 nBorderStyle, sal_Int32 nSpecialEffect ) const { sal_Int16 nBorder = (nBorderStyle == AX_BORDERSTYLE_SINGLE) ? API_BORDER_FLAT : ((nSpecialEffect == AX_SPECIALEFFECT_FLAT) ? API_BORDER_NONE : API_BORDER_SUNKEN); rPropMap.setProperty( PROP_Border, nBorder ); - rPropMap.setProperty( PROP_BorderColor, rHelper.convertColor( nBorderColor ) ); + convertColor( rPropMap, PROP_BorderColor, nBorderColor ); } -// ---------------------------------------------------------------------------- - -/** Converts the AX special effect to UNO properties. */ -void lclConvertVisualEffect( AxControlHelper& /*rHelper*/, PropertyMap& rPropMap, sal_Int32 nSpecialEffect ) +void ControlConverter::convertAxVisualEffect( PropertyMap& rPropMap, sal_Int32 nSpecialEffect ) const { namespace AwtVisualEffect = ::com::sun::star::awt::VisualEffect; sal_Int16 nVisualEffect = (nSpecialEffect == AX_SPECIALEFFECT_FLAT) ? AwtVisualEffect::FLAT : AwtVisualEffect::LOOK3D; rPropMap.setProperty( PROP_VisualEffect, nVisualEffect ); } -// ---------------------------------------------------------------------------- - -/** Converts the passed picture stream to UNO properties. */ -void lclConvertPicture( AxControlHelper& rHelper, PropertyMap& rPropMap, const StreamDataSequence& rPicData ) -{ - if( rPicData.hasElements() ) - { - OUString aGraphicUrl = rHelper.getFilter().getGraphicHelper().importGraphicObject( rPicData ); - if( aGraphicUrl.getLength() > 0 ) - rPropMap.setProperty( PROP_ImageURL, aGraphicUrl ); - } -} - -// ---------------------------------------------------------------------------- - -/** Converts the passed picture stream and position to UNO properties. */ -void lclConvertPicture( AxControlHelper& rHelper, PropertyMap& rPropMap, const StreamDataSequence& rPicData, sal_uInt32 nPicPos ) +void ControlConverter::convertAxPicture( PropertyMap& rPropMap, const StreamDataSequence& rPicData, sal_uInt32 nPicPos ) const { // the picture - lclConvertPicture( rHelper, rPropMap, rPicData ); + convertPicture( rPropMap, rPicData ); // picture position namespace AwtImagePos = ::com::sun::star::awt::ImagePosition; @@ -299,18 +342,16 @@ void lclConvertPicture( AxControlHelper& rHelper, PropertyMap& rPropMap, const S case AX_PICPOS_BELOWCENTER: nImagePos = AwtImagePos::BelowCenter; break; case AX_PICPOS_BELOWRIGHT: nImagePos = AwtImagePos::BelowRight; break; case AX_PICPOS_CENTER: nImagePos = AwtImagePos::Centered; break; - default: OSL_ENSURE( false, "lclConvertPicture - unknown picture position" ); + default: OSL_ENSURE( false, "ControlConverter::convertAxPicture - unknown picture position" ); } rPropMap.setProperty( PROP_ImagePosition, nImagePos ); } -// ---------------------------------------------------------------------------- - -/** Converts the passed picture stream and position to UNO properties. */ -void lclConvertPicture( AxControlHelper& rHelper, PropertyMap& rPropMap, const StreamDataSequence& rPicData, sal_Int32 nPicSizeMode, sal_Int32 /*nPicAlign*/, bool /*bPicTiling*/ ) +void ControlConverter::convertAxPicture( PropertyMap& rPropMap, const StreamDataSequence& rPicData, + sal_Int32 nPicSizeMode, sal_Int32 /*nPicAlign*/, bool /*bPicTiling*/ ) const { // the picture - lclConvertPicture( rHelper, rPropMap, rPicData ); + convertPicture( rPropMap, rPicData ); // picture scale mode namespace AwtScaleMode = ::com::sun::star::awt::ImageScaleMode; @@ -320,15 +361,13 @@ void lclConvertPicture( AxControlHelper& rHelper, PropertyMap& rPropMap, const S case AX_PICSIZE_CLIP: nScaleMode = AwtScaleMode::None; break; case AX_PICSIZE_STRETCH: nScaleMode = AwtScaleMode::Anisotropic; break; case AX_PICSIZE_ZOOM: nScaleMode = AwtScaleMode::Isotropic; break; - default: OSL_ENSURE( false, "lclConvertPicture - unknown picture size mode" ); + default: OSL_ENSURE( false, "ControlConverter::convertAxPicture - unknown picture size mode" ); } rPropMap.setProperty( PROP_ScaleMode, nScaleMode ); } -// ---------------------------------------------------------------------------- - -/** Converts the AX value for checked/unchecked/dontknow to UNO properties. */ -void lclConvertState( AxControlHelper& /*rHelper*/, PropertyMap& rPropMap, const OUString& rValue, sal_Int32 nMultiSelect, ApiDefaultStateMode eDefStateMode ) +void ControlConverter::convertAxState( PropertyMap& rPropMap, + const OUString& rValue, sal_Int32 nMultiSelect, ApiDefaultStateMode eDefStateMode, bool bAwtModel ) const { bool bBooleanState = eDefStateMode == API_DEFAULTSTATE_BOOLEAN; bool bSupportsTriState = eDefStateMode == API_DEFAULTSTATE_TRISTATE; @@ -341,44 +380,280 @@ void lclConvertState( AxControlHelper& /*rHelper*/, PropertyMap& rPropMap, const case '1': nState = API_STATE_CHECKED; break; // any other string (also empty) means 'dontknow' } + sal_Int32 nPropId = bAwtModel ? PROP_State : PROP_DefaultState; if( bBooleanState ) - rPropMap.setProperty( PROP_DefaultState, nState != API_STATE_UNCHECKED ); + rPropMap.setProperty( nPropId, nState != API_STATE_UNCHECKED ); else - rPropMap.setProperty( PROP_DefaultState, nState ); + rPropMap.setProperty( nPropId, nState ); // tristate if( bSupportsTriState ) rPropMap.setProperty( PROP_TriState, nMultiSelect == AX_SELCTION_MULTI ); } -// ---------------------------------------------------------------------------- - -/** Converts the AX control orientation to UNO properties. */ -void lclConvertOrientation( AxControlHelper& /*rHelper*/, PropertyMap& rPropMap, sal_Int32 nOrientation, sal_Int32 nWidth, sal_Int32 nHeight ) +void ControlConverter::convertAxOrientation( PropertyMap& rPropMap, + const AxPairData& rSize, sal_Int32 nOrientation ) const { - namespace AwtScrollBarOrient = ::com::sun::star::awt::ScrollBarOrientation; - sal_Int32 nScrollOrient = AwtScrollBarOrient::HORIZONTAL; + bool bHorizontal = true; switch( nOrientation ) { - case AX_ORIENTATION_AUTO: if( nWidth <= nHeight) nScrollOrient = AwtScrollBarOrient::VERTICAL; break; - case AX_ORIENTATION_VERTICAL: nScrollOrient = AwtScrollBarOrient::VERTICAL; break; - case AX_ORIENTATION_HORIZONTAL: nScrollOrient = AwtScrollBarOrient::HORIZONTAL; break; - default: OSL_ENSURE( false, "lclConvertOrientation - unknown orientation" ); + case AX_ORIENTATION_AUTO: bHorizontal = rSize.first > rSize.second; break; + case AX_ORIENTATION_VERTICAL: bHorizontal = false; break; + case AX_ORIENTATION_HORIZONTAL: bHorizontal = true; break; + default: OSL_ENSURE( false, "ControlConverter::convertAxOrientation - unknown orientation" ); } - rPropMap.setProperty( PROP_Orientation, nScrollOrient ); + convertOrientation( rPropMap, bHorizontal ); } -} // namespace +// ============================================================================ + +ControlModelBase::ControlModelBase() : + maSize( 0, 0 ), + mbAwtModel( false ) +{ +} + +ControlModelBase::~ControlModelBase() +{ +} + +OUString ControlModelBase::getServiceName() const +{ + ApiControlType eCtrlType = getControlType(); + if( mbAwtModel ) switch( eCtrlType ) + { + case API_CONTROL_BUTTON: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlButtonModel" ); + case API_CONTROL_FIXEDTEXT: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlFixedTextModel" ); + case API_CONTROL_IMAGE: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlImageControlModel" ); + case API_CONTROL_CHECKBOX: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlCheckBoxModel" ); + case API_CONTROL_RADIOBUTTON: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlRadioButtonModel" ); + case API_CONTROL_EDIT: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlEditModel" ); + case API_CONTROL_LISTBOX: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlListBoxModel" ); + case API_CONTROL_COMBOBOX: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlComboBoxModel" ); + case API_CONTROL_SPINBUTTON: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlSpinButtonModel" ); + case API_CONTROL_SCROLLBAR: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlScrollBarModel" ); + case API_CONTROL_PROGRESSBAR: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlProgressBarModel" ); + case API_CONTROL_GROUPBOX: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlGroupBoxModel" ); + case API_CONTROL_DIALOG: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlDialogModel" ); + default: OSL_ENSURE( false, "ControlModelBase::getServiceName - no AWT model service supported" ); + } + else switch( eCtrlType ) + { + case API_CONTROL_BUTTON: return CREATE_OUSTRING( "com.sun.star.form.component.CommandButton" ); + case API_CONTROL_FIXEDTEXT: return CREATE_OUSTRING( "com.sun.star.form.component.FixedText" ); + case API_CONTROL_IMAGE: return CREATE_OUSTRING( "com.sun.star.form.component.DatabaseImageControl" ); + case API_CONTROL_CHECKBOX: return CREATE_OUSTRING( "com.sun.star.form.component.CheckBox" ); + case API_CONTROL_RADIOBUTTON: return CREATE_OUSTRING( "com.sun.star.form.component.RadioButton" ); + case API_CONTROL_EDIT: return CREATE_OUSTRING( "com.sun.star.form.component.TextField" ); + case API_CONTROL_LISTBOX: return CREATE_OUSTRING( "com.sun.star.form.component.ListBox" ); + case API_CONTROL_COMBOBOX: return CREATE_OUSTRING( "com.sun.star.form.component.ComboBox" ); + case API_CONTROL_SPINBUTTON: return CREATE_OUSTRING( "com.sun.star.form.component.SpinButton" ); + case API_CONTROL_SCROLLBAR: return CREATE_OUSTRING( "com.sun.star.form.component.ScrollBar" ); + case API_CONTROL_GROUPBOX: return CREATE_OUSTRING( "com.sun.star.form.component.GroupBox" ); + default: OSL_ENSURE( false, "ControlModelBase::getServiceName - no form component service supported" ); + } + return OUString(); +} + +void ControlModelBase::importProperty( sal_Int32 /*nPropId*/, const OUString& /*rValue*/ ) +{ +} + +void ControlModelBase::importPictureData( sal_Int32 /*nPropId*/, BinaryInputStream& /*rInStrm*/ ) +{ +} + +void ControlModelBase::convertProperties( PropertyMap& /*rPropMap*/, const ControlConverter& /*rConv*/ ) const +{ +} + +void ControlModelBase::convertSize( PropertyMap& rPropMap, const ControlConverter& rConv ) const +{ + rConv.convertSize( rPropMap, maSize ); +} + +// ============================================================================ + +ComCtlModelBase::ComCtlModelBase( sal_uInt32 nDataPartId5, sal_uInt32 nDataPartId6, + sal_uInt16 nVersion, bool bCommonPart, bool bComplexPart ) : + maFontData( CREATE_OUSTRING( "Tahoma" ), 82500 ), + mnFlags( 0 ), + mnVersion( nVersion ), + mnDataPartId5( nDataPartId5 ), + mnDataPartId6( nDataPartId6 ), + mbCommonPart( bCommonPart ), + mbComplexPart( bComplexPart ) +{ +} + +bool ComCtlModelBase::importBinaryModel( BinaryInputStream& rInStrm ) +{ + // read initial size part and header of the control data part + if( importSizePart( rInStrm ) && readPartHeader( rInStrm, getDataPartId(), mnVersion ) ) + { + // if flags part exists, the first int32 of the data part contains its size + sal_uInt32 nCommonPartSize = mbCommonPart ? rInStrm.readuInt32() : 0; + // implementations must read the exact amount of data, stream must point to its end afterwards + importControlData( rInStrm ); + // read following parts + if( !rInStrm.isEof() && + (!mbCommonPart || importCommonPart( rInStrm, nCommonPartSize )) && + (!mbComplexPart || importComplexPart( rInStrm )) ) + { + return !rInStrm.isEof(); + } + } + return false; +} + +void ComCtlModelBase::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const +{ + if( mbCommonPart ) + rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, COMCTL_COMMON_ENABLED ) ); + ControlModelBase::convertProperties( rPropMap, rConv ); +} + +void ComCtlModelBase::importCommonExtraData( BinaryInputStream& /*rInStrm*/ ) +{ +} + +void ComCtlModelBase::importCommonTrailingData( BinaryInputStream& /*rInStrm*/ ) +{ +} + +sal_uInt32 ComCtlModelBase::getDataPartId() const +{ + switch( mnVersion ) + { + case 5: return mnDataPartId5; + case 6: return mnDataPartId6; + } + OSL_ENSURE( false, "ComCtlObjectBase::getDataPartId - unxpected version" ); + return SAL_MAX_UINT32; +} + +bool ComCtlModelBase::readPartHeader( BinaryInputStream& rInStrm, sal_uInt32 nExpPartId, sal_uInt16 nExpMajor, sal_uInt16 nExpMinor ) +{ + // no idea if all this is correct... + sal_uInt32 nPartId; + sal_uInt16 nMajor, nMinor; + rInStrm >> nPartId >> nMinor >> nMajor; + bool bPartId = nPartId == nExpPartId; + OSL_ENSURE( bPartId, "ComCtlObjectBase::readPartHeader - unexpected part identifier" ); + bool bVersion = ((nExpMajor == SAL_MAX_UINT16) || (nExpMajor == nMajor)) && ((nExpMinor == SAL_MAX_UINT16) || (nExpMinor == nMinor)); + OSL_ENSURE( bVersion, "ComCtlObjectBase::readPartHeader - unexpected part version" ); + return !rInStrm.isEof() && bPartId && bVersion; +} + +bool ComCtlModelBase::importSizePart( BinaryInputStream& rInStrm ) +{ + if( readPartHeader( rInStrm, COMCTL_ID_SIZE, 0, 8 ) ) + { + rInStrm >> maSize.first >> maSize.second; + return !rInStrm.isEof(); + } + return false; +} + +bool ComCtlModelBase::importCommonPart( BinaryInputStream& rInStrm, sal_uInt32 nPartSize ) +{ + sal_Int64 nEndPos = rInStrm.tell() + nPartSize; + if( (nPartSize >= 16) && readPartHeader( rInStrm, COMCTL_ID_COMMONDATA, 5, 0 ) ) + { + rInStrm.skip( 4 ); + rInStrm >> mnFlags; + // implementations may read less than the exact amount of data + importCommonExtraData( rInStrm ); + rInStrm.seek( nEndPos ); + // implementations must read the exact amount of data, stream must point to its end afterwards + importCommonTrailingData( rInStrm ); + return !rInStrm.isEof(); + } + return false; +} + +bool ComCtlModelBase::importComplexPart( BinaryInputStream& rInStrm ) +{ + if( readPartHeader( rInStrm, COMCTL_ID_COMPLEXDATA, 5, 1 ) ) + { + sal_uInt32 nContFlags; + rInStrm >> nContFlags; + bool bReadOk = + (!getFlag( nContFlags, COMCTL_COMPLEX_FONT ) || OleHelper::importStdFont( maFontData, rInStrm, true )) && + (!getFlag( nContFlags, COMCTL_COMPLEX_MOUSEICON ) || OleHelper::importStdPic( maMouseIcon, rInStrm, true )); + return bReadOk && !rInStrm.isEof(); + } + return false; +} + +// ============================================================================ + +ComCtlScrollBarModel::ComCtlScrollBarModel( sal_uInt16 nVersion ) : + ComCtlModelBase( SAL_MAX_UINT32, COMCTL_ID_SCROLLBAR_60, nVersion, true, true ), + mnScrollBarFlags( 0x00000011 ), + mnLargeChange( 1 ), + mnSmallChange( 1 ), + mnMin( 0 ), + mnMax( 32767 ), + mnPosition( 0 ) +{ +} + +ApiControlType ComCtlScrollBarModel::getControlType() const +{ + return API_CONTROL_SCROLLBAR; +} + +void ComCtlScrollBarModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const +{ + rPropMap.setProperty( PROP_Border, API_BORDER_NONE ); + rConv.convertOrientation( rPropMap, getFlag( mnScrollBarFlags, COMCTL_SCROLLBAR_HOR ) ); + rConv.convertScrollBar( rPropMap, mnMin, mnMax, mnPosition, mnSmallChange, mnLargeChange, mbAwtModel ); + ComCtlModelBase::convertProperties( rPropMap, rConv ); +} + +void ComCtlScrollBarModel::importControlData( BinaryInputStream& rInStrm ) +{ + rInStrm >> mnScrollBarFlags >> mnLargeChange >> mnSmallChange >> mnMin >> mnMax >> mnPosition; +} // ============================================================================ -AxControlModelBase::AxControlModelBase() : - mnWidth( 0 ), - mnHeight( 0 ) +ComCtlProgressBarModel::ComCtlProgressBarModel( sal_uInt16 nVersion ) : + ComCtlModelBase( COMCTL_ID_PROGRESSBAR_50, COMCTL_ID_PROGRESSBAR_60, nVersion, true, true ), + mfMin( 0.0 ), + mfMax( 100.0 ), + mnVertical( 0 ), + mnSmooth( 0 ) { } -AxControlModelBase::~AxControlModelBase() +ApiControlType ComCtlProgressBarModel::getControlType() const +{ + return API_CONTROL_PROGRESSBAR; +} + +void ComCtlProgressBarModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const +{ + sal_uInt16 nBorder = getFlag( mnFlags, COMCTL_COMMON_3DBORDER ) ? API_BORDER_SUNKEN : + (getFlag( mnFlags, COMCTL_COMMON_FLATBORDER ) ? API_BORDER_FLAT : API_BORDER_NONE); + rPropMap.setProperty( PROP_Border, nBorder ); + rPropMap.setProperty( PROP_ProgressValueMin, getLimitedValue< sal_Int32, double >( ::std::min( mfMin, mfMax ), 0.0, SAL_MAX_INT32 ) ); + rPropMap.setProperty( PROP_ProgressValueMax, getLimitedValue< sal_Int32, double >( ::std::max( mfMin, mfMax ), 0.0, SAL_MAX_INT32 ) ); + // ComCtl model does not provide current value? + ComCtlModelBase::convertProperties( rPropMap, rConv ); +} + +void ComCtlProgressBarModel::importControlData( BinaryInputStream& rInStrm ) +{ + rInStrm >> mfMin >> mfMax; + if( mnVersion == 6 ) + rInStrm >> mnVertical >> mnSmooth; +} + +// ============================================================================ + +AxControlModelBase::AxControlModelBase() { } @@ -393,33 +668,18 @@ void AxControlModelBase::importProperty( sal_Int32 nPropId, const OUString& rVal OSL_ENSURE( nSepPos >= 0, "AxControlModelBase::importProperty - missing separator in 'Size' property" ); if( nSepPos >= 0 ) { - mnWidth = rValue.copy( 0, nSepPos ).toInt32(); - mnHeight = rValue.copy( nSepPos + 1 ).toInt32(); + maSize.first = rValue.copy( 0, nSepPos ).toInt32(); + maSize.second = rValue.copy( nSepPos + 1 ).toInt32(); } } break; } } -void AxControlModelBase::importBinaryModel( BinaryInputStream& /*rInStrm*/ ) -{ -} - -void AxControlModelBase::importPictureData( sal_Int32 /*nPropId*/, BinaryInputStream& /*rInStrm*/ ) -{ -} - -void AxControlModelBase::convertProperties( AxControlHelper& /*rHelper*/, PropertyMap& /*rPropMap*/ ) const -{ -} - // ============================================================================ -AxFontDataModel::AxFontDataModel() : - mnFontEffects( 0 ), - mnFontHeight( 160 ), - mnFontCharSet( 1 ), - mnHorAlign( AX_FONTALIGN_LEFT ) +AxFontDataModel::AxFontDataModel( bool bSupportsAlign ) : + mbSupportsAlign( bSupportsAlign ) { } @@ -427,70 +687,59 @@ void AxFontDataModel::importProperty( sal_Int32 nPropId, const OUString& rValue { switch( nPropId ) { - case XML_FontName: maFontName = rValue; break; - case XML_FontEffects: mnFontEffects = AttributeList::decodeUnsigned( rValue ); break; - case XML_FontHeight: mnFontHeight = AttributeList::decodeInteger( rValue ); break; - case XML_FontCharSet: mnFontCharSet = AttributeList::decodeInteger( rValue ); break; - case XML_ParagraphAlign: mnHorAlign = AttributeList::decodeInteger( rValue ); break; + case XML_FontName: maFontData.maFontName = rValue; break; + case XML_FontEffects: maFontData.mnFontEffects = AttributeList::decodeUnsigned( rValue ); break; + case XML_FontHeight: maFontData.mnFontHeight = AttributeList::decodeInteger( rValue ); break; + case XML_FontCharSet: maFontData.mnFontCharSet = AttributeList::decodeInteger( rValue ); break; + case XML_ParagraphAlign: maFontData.mnHorAlign = AttributeList::decodeInteger( rValue ); break; default: AxControlModelBase::importProperty( nPropId, rValue ); } } -void AxFontDataModel::importBinaryModel( BinaryInputStream& rInStrm ) +bool AxFontDataModel::importBinaryModel( BinaryInputStream& rInStrm ) { - AxBinaryPropertyReader aReader( rInStrm ); - aReader.readStringProperty( maFontName ); - aReader.readIntProperty< sal_uInt32 >( mnFontEffects ); - aReader.readIntProperty< sal_Int32 >( mnFontHeight ); - aReader.skipIntProperty< sal_Int32 >(); // font offset - aReader.readIntProperty< sal_uInt8 >( mnFontCharSet ); - aReader.skipIntProperty< sal_uInt8 >(); // font pitch/family - aReader.readIntProperty< sal_uInt8 >( mnHorAlign ); - aReader.skipIntProperty< sal_uInt16 >(); // font weight - aReader.finalizeImport(); + return maFontData.importBinaryModel( rInStrm ); } -void AxFontDataModel::convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const +void AxFontDataModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const { namespace cssa = ::com::sun::star::awt; // font name - if( maFontName.getLength() > 0 ) - rPropMap.setProperty( PROP_FontName, maFontName ); + if( maFontData.maFontName.getLength() > 0 ) + rPropMap.setProperty( PROP_FontName, maFontData.maFontName ); // font effects - rPropMap.setProperty( PROP_FontWeight, getFlagValue( mnFontEffects, AX_FONT_BOLD, cssa::FontWeight::BOLD, cssa::FontWeight::NORMAL ) ); - rPropMap.setProperty( PROP_FontSlant, getFlagValue< sal_Int16 >( mnFontEffects, AX_FONT_ITALIC, cssa::FontSlant_ITALIC, cssa::FontSlant_NONE ) ); - rPropMap.setProperty( PROP_FontUnderline, getFlagValue( mnFontEffects, AX_FONT_UNDERLINE, cssa::FontUnderline::SINGLE, cssa::FontUnderline::NONE ) ); - rPropMap.setProperty( PROP_FontStrikeout, getFlagValue( mnFontEffects, AX_FONT_STRIKEOUT, cssa::FontStrikeout::SINGLE, cssa::FontStrikeout::NONE ) ); - - /* font height in points. MSO uses weird font sizes: - 1pt->30, 2pt->45, 3pt->60, 4pt->75, 5pt->105, 6pt->120, 7pt->135, - 8pt->165, 9pt->180, 10pt->195, 11pt->225, ... */ - sal_Int16 nHeight = getLimitedValue< sal_Int16, sal_Int32 >( (mnFontHeight + 10) / 20, 1, SAL_MAX_INT16 ); - rPropMap.setProperty( PROP_FontHeight, nHeight ); + rPropMap.setProperty( PROP_FontWeight, getFlagValue( maFontData.mnFontEffects, AX_FONTDATA_BOLD, cssa::FontWeight::BOLD, cssa::FontWeight::NORMAL ) ); + rPropMap.setProperty( PROP_FontSlant, getFlagValue< sal_Int16 >( maFontData.mnFontEffects, AX_FONTDATA_ITALIC, cssa::FontSlant_ITALIC, cssa::FontSlant_NONE ) ); + rPropMap.setProperty( PROP_FontUnderline, getFlagValue( maFontData.mnFontEffects, AX_FONTDATA_UNDERLINE, cssa::FontUnderline::SINGLE, cssa::FontUnderline::NONE ) ); + rPropMap.setProperty( PROP_FontStrikeout, getFlagValue( maFontData.mnFontEffects, AX_FONTDATA_STRIKEOUT, cssa::FontStrikeout::SINGLE, cssa::FontStrikeout::NONE ) ); + rPropMap.setProperty( PROP_FontHeight, maFontData.getHeightPoints() ); // font character set rtl_TextEncoding eFontEnc = RTL_TEXTENCODING_DONTKNOW; - if( (0 <= mnFontCharSet) && (mnFontCharSet <= SAL_MAX_UINT8) ) - eFontEnc = rtl_getTextEncodingFromWindowsCharset( static_cast< sal_uInt8 >( mnFontCharSet ) ); + if( (0 <= maFontData.mnFontCharSet) && (maFontData.mnFontCharSet <= SAL_MAX_UINT8) ) + eFontEnc = rtl_getTextEncodingFromWindowsCharset( static_cast< sal_uInt8 >( maFontData.mnFontCharSet ) ); if( eFontEnc != RTL_TEXTENCODING_DONTKNOW ) rPropMap.setProperty( PROP_FontCharset, static_cast< sal_Int16 >( eFontEnc ) ); // text alignment - sal_Int32 nAlign = cssa::TextAlign::LEFT; - switch( mnHorAlign ) + if( mbSupportsAlign ) { - case AX_FONTALIGN_LEFT: nAlign = cssa::TextAlign::LEFT; break; - case AX_FONTALIGN_RIGHT: nAlign = cssa::TextAlign::RIGHT; break; - case AX_FONTALIGN_CENTER: nAlign = cssa::TextAlign::CENTER; break; - default: OSL_ENSURE( false, "AxFontDataModel::convertProperties - unknown text alignment" ); + sal_Int32 nAlign = cssa::TextAlign::LEFT; + switch( maFontData.mnHorAlign ) + { + case AX_FONTDATA_LEFT: nAlign = cssa::TextAlign::LEFT; break; + case AX_FONTDATA_RIGHT: nAlign = cssa::TextAlign::RIGHT; break; + case AX_FONTDATA_CENTER: nAlign = cssa::TextAlign::CENTER; break; + default: OSL_ENSURE( false, "AxFontDataModel::convertProperties - unknown text alignment" ); + } + // form controls expect short value + rPropMap.setProperty( PROP_Align, static_cast< sal_Int16 >( nAlign ) ); } - // form controls expect short value - rPropMap.setProperty( PROP_Align, static_cast< sal_Int16 >( nAlign ) ); // process base class properties - AxControlModelBase::convertProperties( rHelper, rPropMap ); + AxControlModelBase::convertProperties( rPropMap, rConv ); } // ============================================================================ @@ -527,7 +776,7 @@ void AxCommandButtonModel::importPictureData( sal_Int32 nPropId, BinaryInputStre } } -void AxCommandButtonModel::importBinaryModel( BinaryInputStream& rInStrm ) +bool AxCommandButtonModel::importBinaryModel( BinaryInputStream& rInStrm ) { AxBinaryPropertyReader aReader( rInStrm ); aReader.readIntProperty< sal_uInt32 >( mnTextColor ); @@ -535,32 +784,31 @@ void AxCommandButtonModel::importBinaryModel( BinaryInputStream& rInStrm ) aReader.readIntProperty< sal_uInt32 >( mnFlags ); aReader.readStringProperty( maCaption ); aReader.readIntProperty< sal_uInt32 >( mnPicturePos ); - aReader.readPairProperty( mnWidth, mnHeight ); + aReader.readPairProperty( maSize ); aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer aReader.readPictureProperty( maPictureData ); aReader.skipIntProperty< sal_uInt16 >(); // accelerator aReader.readBoolProperty( mbFocusOnClick, true ); // binary flag means "do not take focus" aReader.skipPictureProperty(); // mouse icon - if( aReader.finalizeImport() ) - AxFontDataModel::importBinaryModel( rInStrm ); + return aReader.finalizeImport() && AxFontDataModel::importBinaryModel( rInStrm ); } -OUString AxCommandButtonModel::getServiceName() const +ApiControlType AxCommandButtonModel::getControlType() const { - return CREATE_OUSTRING( "com.sun.star.form.component.CommandButton" ); + return API_CONTROL_BUTTON; } -void AxCommandButtonModel::convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const +void AxCommandButtonModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const { rPropMap.setProperty( PROP_Label, maCaption ); - rPropMap.setProperty( PROP_TextColor, rHelper.convertColor( mnTextColor ) ); rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_FLAGS_ENABLED ) ); rPropMap.setProperty( PROP_MultiLine, getFlag( mnFlags, AX_FLAGS_WORDWRAP ) ); rPropMap.setProperty( PROP_FocusOnClick, mbFocusOnClick ); rPropMap.setProperty( PROP_VerticalAlign, ::com::sun::star::style::VerticalAlignment_MIDDLE ); - lclConvertBackground( rHelper, rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_NOTSUPPORTED ); - lclConvertPicture( rHelper, rPropMap, maPictureData, mnPicturePos ); - AxFontDataModel::convertProperties( rHelper, rPropMap ); + rConv.convertColor( rPropMap, PROP_TextColor, mnTextColor ); + rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_NOTSUPPORTED ); + rConv.convertAxPicture( rPropMap, maPictureData, mnPicturePos ); + AxFontDataModel::convertProperties( rPropMap, rConv ); } // ============================================================================ @@ -590,7 +838,7 @@ void AxLabelModel::importProperty( sal_Int32 nPropId, const OUString& rValue ) } } -void AxLabelModel::importBinaryModel( BinaryInputStream& rInStrm ) +bool AxLabelModel::importBinaryModel( BinaryInputStream& rInStrm ) { AxBinaryPropertyReader aReader( rInStrm ); aReader.readIntProperty< sal_uInt32 >( mnTextColor ); @@ -598,7 +846,7 @@ void AxLabelModel::importBinaryModel( BinaryInputStream& rInStrm ) aReader.readIntProperty< sal_uInt32 >( mnFlags ); aReader.readStringProperty( maCaption ); aReader.skipIntProperty< sal_uInt32 >(); // picture position - aReader.readPairProperty( mnWidth, mnHeight ); + aReader.readPairProperty( maSize ); aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer aReader.readIntProperty< sal_uInt32 >( mnBorderColor ); aReader.readIntProperty< sal_uInt16 >( mnBorderStyle ); @@ -606,25 +854,24 @@ void AxLabelModel::importBinaryModel( BinaryInputStream& rInStrm ) aReader.skipPictureProperty(); // picture aReader.skipIntProperty< sal_uInt16 >(); // accelerator aReader.skipPictureProperty(); // mouse icon - if( aReader.finalizeImport() ) - AxFontDataModel::importBinaryModel( rInStrm ); + return aReader.finalizeImport() && AxFontDataModel::importBinaryModel( rInStrm ); } -OUString AxLabelModel::getServiceName() const +ApiControlType AxLabelModel::getControlType() const { - return CREATE_OUSTRING( "com.sun.star.form.component.FixedText" ); + return API_CONTROL_FIXEDTEXT; } -void AxLabelModel::convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const +void AxLabelModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const { rPropMap.setProperty( PROP_Label, maCaption ); - rPropMap.setProperty( PROP_TextColor, rHelper.convertColor( mnTextColor ) ); rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_FLAGS_ENABLED ) ); rPropMap.setProperty( PROP_MultiLine, getFlag( mnFlags, AX_FLAGS_WORDWRAP ) ); rPropMap.setProperty( PROP_VerticalAlign, ::com::sun::star::style::VerticalAlignment_TOP ); - lclConvertBackground( rHelper, rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID ); - lclConvertBorder( rHelper, rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect ); - AxFontDataModel::convertProperties( rHelper, rPropMap ); + rConv.convertColor( rPropMap, PROP_TextColor, mnTextColor ); + rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID ); + rConv.convertAxBorder( rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect ); + AxFontDataModel::convertProperties( rPropMap, rConv ); } // ============================================================================ @@ -666,7 +913,7 @@ void AxImageModel::importPictureData( sal_Int32 nPropId, BinaryInputStream& rInS } } -void AxImageModel::importBinaryModel( BinaryInputStream& rInStrm ) +bool AxImageModel::importBinaryModel( BinaryInputStream& rInStrm ) { AxBinaryPropertyReader aReader( rInStrm ); aReader.skipUndefinedProperty(); @@ -678,32 +925,32 @@ void AxImageModel::importBinaryModel( BinaryInputStream& rInStrm ) aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer aReader.readIntProperty< sal_uInt8 >( mnPicSizeMode ); aReader.readIntProperty< sal_uInt8 >( mnSpecialEffect ); - aReader.readPairProperty( mnWidth, mnHeight ); + aReader.readPairProperty( maSize ); aReader.readPictureProperty( maPictureData ); aReader.readIntProperty< sal_uInt8 >( mnPicAlign ); aReader.readBoolProperty( mbPicTiling ); aReader.readIntProperty< sal_uInt32 >( mnFlags ); aReader.skipPictureProperty(); // mouse icon - aReader.finalizeImport(); + return aReader.finalizeImport(); } -OUString AxImageModel::getServiceName() const +ApiControlType AxImageModel::getControlType() const { - return CREATE_OUSTRING( "com.sun.star.form.component.DatabaseImageControl" ); + return API_CONTROL_IMAGE; } -void AxImageModel::convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const +void AxImageModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const { rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_FLAGS_ENABLED ) ); - lclConvertBackground( rHelper, rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID ); - lclConvertBorder( rHelper, rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect ); - lclConvertPicture( rHelper, rPropMap, maPictureData, mnPicSizeMode, mnPicAlign, mbPicTiling ); - AxControlModelBase::convertProperties( rHelper, rPropMap ); + rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID ); + rConv.convertAxBorder( rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect ); + rConv.convertAxPicture( rPropMap, maPictureData, mnPicSizeMode, mnPicAlign, mbPicTiling ); + AxControlModelBase::convertProperties( rPropMap, rConv ); } // ============================================================================ -AxMorphDataModel::AxMorphDataModel() : +AxMorphDataModelBase::AxMorphDataModelBase() : mnTextColor( AX_SYSCOLOR_WINDOWTEXT ), mnBackColor( AX_SYSCOLOR_WINDOWBACK ), mnFlags( AX_MORPHDATA_DEFFLAGS ), @@ -722,7 +969,7 @@ AxMorphDataModel::AxMorphDataModel() : { } -void AxMorphDataModel::importProperty( sal_Int32 nPropId, const OUString& rValue ) +void AxMorphDataModelBase::importProperty( sal_Int32 nPropId, const OUString& rValue ) { switch( nPropId ) { @@ -748,7 +995,7 @@ void AxMorphDataModel::importProperty( sal_Int32 nPropId, const OUString& rValue } } -void AxMorphDataModel::importPictureData( sal_Int32 nPropId, BinaryInputStream& rInStrm ) +void AxMorphDataModelBase::importPictureData( sal_Int32 nPropId, BinaryInputStream& rInStrm ) { switch( nPropId ) { @@ -757,7 +1004,7 @@ void AxMorphDataModel::importPictureData( sal_Int32 nPropId, BinaryInputStream& } } -void AxMorphDataModel::importBinaryModel( BinaryInputStream& rInStrm ) +bool AxMorphDataModelBase::importBinaryModel( BinaryInputStream& rInStrm ) { AxBinaryPropertyReader aReader( rInStrm, true ); aReader.readIntProperty< sal_uInt32 >( mnFlags ); @@ -768,7 +1015,7 @@ void AxMorphDataModel::importBinaryModel( BinaryInputStream& rInStrm ) aReader.readIntProperty< sal_uInt8 >( mnScrollBars ); aReader.readIntProperty< sal_uInt8 >( mnDisplayStyle ); aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer - aReader.readPairProperty( mnWidth, mnHeight ); + aReader.readPairProperty( maSize ); aReader.readIntProperty< sal_uInt16 >( mnPasswordChar ); aReader.skipIntProperty< sal_uInt32 >(); // list width aReader.skipIntProperty< sal_uInt16 >(); // bound column @@ -793,15 +1040,14 @@ void AxMorphDataModel::importBinaryModel( BinaryInputStream& rInStrm ) aReader.skipUndefinedProperty(); aReader.skipBoolProperty(); aReader.readStringProperty( maGroupName ); - if( aReader.finalizeImport() ) - AxFontDataModel::importBinaryModel( rInStrm ); + return aReader.finalizeImport() && AxFontDataModel::importBinaryModel( rInStrm ); } -void AxMorphDataModel::convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const +void AxMorphDataModelBase::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const { - rPropMap.setProperty( PROP_TextColor, rHelper.convertColor( mnTextColor ) ); rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_FLAGS_ENABLED ) ); - AxFontDataModel::convertProperties( rHelper, rPropMap ); + rConv.convertColor( rPropMap, PROP_TextColor, mnTextColor ); + AxFontDataModel::convertProperties( rPropMap, rConv ); } // ============================================================================ @@ -810,22 +1056,22 @@ AxToggleButtonModel::AxToggleButtonModel() { } -OUString AxToggleButtonModel::getServiceName() const +ApiControlType AxToggleButtonModel::getControlType() const { - OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_TOGGLE, "AxToggleButtonModel::getServiceName - invalid control type" ); - return CREATE_OUSTRING( "com.sun.star.form.component.CommandButton" ); + OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_TOGGLE, "AxToggleButtonModel::getControlType - invalid control type" ); + return API_CONTROL_BUTTON; } -void AxToggleButtonModel::convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const +void AxToggleButtonModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const { rPropMap.setProperty( PROP_Label, maCaption ); rPropMap.setProperty( PROP_MultiLine, getFlag( mnFlags, AX_FLAGS_WORDWRAP ) ); rPropMap.setProperty( PROP_VerticalAlign, ::com::sun::star::style::VerticalAlignment_MIDDLE ); rPropMap.setProperty( PROP_Toggle, true ); - lclConvertBackground( rHelper, rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_NOTSUPPORTED ); - lclConvertPicture( rHelper, rPropMap, maPictureData, mnPicturePos ); - lclConvertState( rHelper, rPropMap, maValue, mnMultiSelect, API_DEFAULTSTATE_BOOLEAN ); - AxMorphDataModel::convertProperties( rHelper, rPropMap ); + rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_NOTSUPPORTED ); + rConv.convertAxPicture( rPropMap, maPictureData, mnPicturePos ); + rConv.convertAxState( rPropMap, maValue, mnMultiSelect, API_DEFAULTSTATE_BOOLEAN, mbAwtModel ); + AxMorphDataModelBase::convertProperties( rPropMap, rConv ); } // ============================================================================ @@ -834,22 +1080,22 @@ AxCheckBoxModel::AxCheckBoxModel() { } -OUString AxCheckBoxModel::getServiceName() const +ApiControlType AxCheckBoxModel::getControlType() const { - OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_CHECKBOX, "AxCheckBoxModel::getServiceName - invalid control type" ); - return CREATE_OUSTRING( "com.sun.star.form.component.CheckBox" ); + OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_CHECKBOX, "AxCheckBoxModel::getControlType - invalid control type" ); + return API_CONTROL_CHECKBOX; } -void AxCheckBoxModel::convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const +void AxCheckBoxModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const { rPropMap.setProperty( PROP_Label, maCaption ); rPropMap.setProperty( PROP_MultiLine, getFlag( mnFlags, AX_FLAGS_WORDWRAP ) ); rPropMap.setProperty( PROP_VerticalAlign, ::com::sun::star::style::VerticalAlignment_MIDDLE ); - lclConvertBackground( rHelper, rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID ); - lclConvertVisualEffect( rHelper, rPropMap, mnSpecialEffect ); - lclConvertPicture( rHelper, rPropMap, maPictureData, mnPicturePos ); - lclConvertState( rHelper, rPropMap, maValue, mnMultiSelect, API_DEFAULTSTATE_TRISTATE ); - AxMorphDataModel::convertProperties( rHelper, rPropMap ); + rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID ); + rConv.convertAxVisualEffect( rPropMap, mnSpecialEffect ); + rConv.convertAxPicture( rPropMap, maPictureData, mnPicturePos ); + rConv.convertAxState( rPropMap, maValue, mnMultiSelect, API_DEFAULTSTATE_TRISTATE, mbAwtModel ); + AxMorphDataModelBase::convertProperties( rPropMap, rConv ); } // ============================================================================ @@ -858,22 +1104,22 @@ AxOptionButtonModel::AxOptionButtonModel() { } -OUString AxOptionButtonModel::getServiceName() const +ApiControlType AxOptionButtonModel::getControlType() const { - OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_OPTBUTTON, "AxOptionButtonModel::getServiceName - invalid control type" ); - return CREATE_OUSTRING( "com.sun.star.form.component.RadioButton" ); + OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_OPTBUTTON, "AxOptionButtonModel::getControlType - invalid control type" ); + return API_CONTROL_RADIOBUTTON; } -void AxOptionButtonModel::convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const +void AxOptionButtonModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const { rPropMap.setProperty( PROP_Label, maCaption ); rPropMap.setProperty( PROP_MultiLine, getFlag( mnFlags, AX_FLAGS_WORDWRAP ) ); rPropMap.setProperty( PROP_VerticalAlign, ::com::sun::star::style::VerticalAlignment_MIDDLE ); - lclConvertBackground( rHelper, rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID ); - lclConvertVisualEffect( rHelper, rPropMap, mnSpecialEffect ); - lclConvertPicture( rHelper, rPropMap, maPictureData, mnPicturePos ); - lclConvertState( rHelper, rPropMap, maValue, mnMultiSelect, API_DEFAULTSTATE_SHORT ); - AxMorphDataModel::convertProperties( rHelper, rPropMap ); + rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID ); + rConv.convertAxVisualEffect( rPropMap, mnSpecialEffect ); + rConv.convertAxPicture( rPropMap, maPictureData, mnPicturePos ); + rConv.convertAxState( rPropMap, maValue, mnMultiSelect, API_DEFAULTSTATE_SHORT, mbAwtModel ); + AxMorphDataModelBase::convertProperties( rPropMap, rConv ); } // ============================================================================ @@ -882,25 +1128,25 @@ AxTextBoxModel::AxTextBoxModel() { } -OUString AxTextBoxModel::getServiceName() const +ApiControlType AxTextBoxModel::getControlType() const { - OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_TEXT, "AxTextBoxModel::getServiceName - invalid control type" ); - return CREATE_OUSTRING( "com.sun.star.form.component.TextField" ); + OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_TEXT, "AxTextBoxModel::getControlType - invalid control type" ); + return API_CONTROL_EDIT; } -void AxTextBoxModel::convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const +void AxTextBoxModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const { rPropMap.setProperty( PROP_MultiLine, getFlag( mnFlags, AX_FLAGS_MULTILINE ) ); rPropMap.setProperty( PROP_HideInactiveSelection, getFlag( mnFlags, AX_FLAGS_HIDESELECTION ) ); - rPropMap.setProperty( PROP_DefaultText, maValue ); + rPropMap.setProperty( mbAwtModel ? PROP_Text : PROP_DefaultText, maValue ); rPropMap.setProperty( PROP_MaxTextLen, getLimitedValue< sal_Int16, sal_Int32 >( mnMaxLength, 0, SAL_MAX_INT16 ) ); if( (0 < mnPasswordChar) && (mnPasswordChar <= SAL_MAX_INT16) ) rPropMap.setProperty( PROP_EchoChar, static_cast< sal_Int16 >( mnPasswordChar ) ); rPropMap.setProperty( PROP_HScroll, getFlag( mnScrollBars, AX_SCROLLBAR_HORIZONTAL ) ); rPropMap.setProperty( PROP_VScroll, getFlag( mnScrollBars, AX_SCROLLBAR_VERTICAL ) ); - lclConvertBackground( rHelper, rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID ); - lclConvertBorder( rHelper, rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect ); - AxMorphDataModel::convertProperties( rHelper, rPropMap ); + rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID ); + rConv.convertAxBorder( rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect ); + AxMorphDataModelBase::convertProperties( rPropMap, rConv ); } // ============================================================================ @@ -909,20 +1155,20 @@ AxListBoxModel::AxListBoxModel() { } -OUString AxListBoxModel::getServiceName() const +ApiControlType AxListBoxModel::getControlType() const { - OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_LISTBOX, "AxListBoxModel::getServiceName - invalid control type" ); - return CREATE_OUSTRING( "com.sun.star.form.component.ListBox" ); + OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_LISTBOX, "AxListBoxModel::getControlType - invalid control type" ); + return API_CONTROL_LISTBOX; } -void AxListBoxModel::convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const +void AxListBoxModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const { bool bMultiSelect = (mnMultiSelect == AX_SELCTION_MULTI) || (mnMultiSelect == AX_SELCTION_EXTENDED); rPropMap.setProperty( PROP_MultiSelection, bMultiSelect ); rPropMap.setProperty( PROP_Dropdown, false ); - lclConvertBackground( rHelper, rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID ); - lclConvertBorder( rHelper, rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect ); - AxMorphDataModel::convertProperties( rHelper, rPropMap ); + rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID ); + rConv.convertAxBorder( rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect ); + AxMorphDataModelBase::convertProperties( rPropMap, rConv ); } // ============================================================================ @@ -931,18 +1177,18 @@ AxComboBoxModel::AxComboBoxModel() { } -OUString AxComboBoxModel::getServiceName() const +ApiControlType AxComboBoxModel::getControlType() const { - OSL_ENSURE( (mnDisplayStyle == AX_DISPLAYSTYLE_COMBOBOX) || (mnDisplayStyle == AX_DISPLAYSTYLE_DROPDOWN), "AxComboBoxModel::getServiceName - invalid control type" ); - return (mnDisplayStyle == AX_DISPLAYSTYLE_DROPDOWN) ? CREATE_OUSTRING( "com.sun.star.form.component.ListBox" ) : CREATE_OUSTRING( "com.sun.star.form.component.ComboBox" ); + OSL_ENSURE( (mnDisplayStyle == AX_DISPLAYSTYLE_COMBOBOX) || (mnDisplayStyle == AX_DISPLAYSTYLE_DROPDOWN), "AxComboBoxModel::getControlType - invalid control type" ); + return (mnDisplayStyle == AX_DISPLAYSTYLE_DROPDOWN) ? API_CONTROL_LISTBOX : API_CONTROL_COMBOBOX; } -void AxComboBoxModel::convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const +void AxComboBoxModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const { if( mnDisplayStyle != AX_DISPLAYSTYLE_DROPDOWN ) { rPropMap.setProperty( PROP_HideInactiveSelection, getFlag( mnFlags, AX_FLAGS_HIDESELECTION ) ); - rPropMap.setProperty( PROP_DefaultText, maValue ); + rPropMap.setProperty( mbAwtModel ? PROP_Text : PROP_DefaultText, maValue ); rPropMap.setProperty( PROP_MaxTextLen, getLimitedValue< sal_Int16, sal_Int32 >( mnMaxLength, 0, SAL_MAX_INT16 ) ); bool bAutoComplete = (mnMatchEntry == AX_MATCHENTRY_FIRSTLETTER) || (mnMatchEntry == AX_MATCHENTRY_COMPLETE); rPropMap.setProperty( PROP_Autocomplete, bAutoComplete ); @@ -950,9 +1196,9 @@ void AxComboBoxModel::convertProperties( AxControlHelper& rHelper, PropertyMap& bool bShowDropdown = (mnShowDropButton == AX_SHOWDROPBUTTON_FOCUS) || (mnShowDropButton == AX_SHOWDROPBUTTON_ALWAYS); rPropMap.setProperty( PROP_Dropdown, bShowDropdown ); rPropMap.setProperty( PROP_LineCount, getLimitedValue< sal_Int16, sal_Int32 >( mnListRows, 1, SAL_MAX_INT16 ) ); - lclConvertBackground( rHelper, rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID ); - lclConvertBorder( rHelper, rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect ); - AxMorphDataModel::convertProperties( rHelper, rPropMap ); + rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID ); + rConv.convertAxBorder( rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect ); + AxMorphDataModelBase::convertProperties( rPropMap, rConv ); } // ============================================================================ @@ -970,9 +1216,9 @@ AxSpinButtonModel::AxSpinButtonModel() : { } -OUString AxSpinButtonModel::getServiceName() const +ApiControlType AxSpinButtonModel::getControlType() const { - return CREATE_OUSTRING( "com.sun.star.form.component.SpinButton" ); + return API_CONTROL_SPINBUTTON; } void AxSpinButtonModel::importProperty( sal_Int32 nPropId, const OUString& rValue ) @@ -992,13 +1238,13 @@ void AxSpinButtonModel::importProperty( sal_Int32 nPropId, const OUString& rValu } } -void AxSpinButtonModel::importBinaryModel( BinaryInputStream& rInStrm ) +bool AxSpinButtonModel::importBinaryModel( BinaryInputStream& rInStrm ) { AxBinaryPropertyReader aReader( rInStrm ); aReader.readIntProperty< sal_uInt32 >( mnArrowColor ); aReader.readIntProperty< sal_uInt32 >( mnBackColor ); aReader.readIntProperty< sal_uInt32 >( mnFlags ); - aReader.readPairProperty( mnWidth, mnHeight ); + aReader.readPairProperty( maSize ); aReader.skipIntProperty< sal_uInt32 >(); // unused aReader.readIntProperty< sal_Int32 >( mnMin ); aReader.readIntProperty< sal_Int32 >( mnMax ); @@ -1010,25 +1256,25 @@ void AxSpinButtonModel::importBinaryModel( BinaryInputStream& rInStrm ) aReader.readIntProperty< sal_Int32 >( mnDelay ); aReader.skipPictureProperty(); // mouse icon aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer - aReader.finalizeImport(); + return aReader.finalizeImport(); } -void AxSpinButtonModel::convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const +void AxSpinButtonModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const { sal_Int32 nMin = ::std::min( mnMin, mnMax ); sal_Int32 nMax = ::std::max( mnMin, mnMax ); - rPropMap.setProperty( PROP_SymbolColor, rHelper.convertColor( mnArrowColor ) ); rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_FLAGS_ENABLED ) ); rPropMap.setProperty( PROP_SpinValueMin, nMin ); rPropMap.setProperty( PROP_SpinValueMax, nMax ); rPropMap.setProperty( PROP_SpinIncrement, mnSmallChange ); - rPropMap.setProperty( PROP_DefaultSpinValue, mnPosition ); + rPropMap.setProperty( mbAwtModel ? PROP_SpinValue : PROP_DefaultSpinValue, mnPosition ); rPropMap.setProperty( PROP_Repeat, true ); rPropMap.setProperty( PROP_RepeatDelay, mnDelay ); rPropMap.setProperty( PROP_Border, API_BORDER_NONE ); - lclConvertBackground( rHelper, rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_NOTSUPPORTED ); - lclConvertOrientation( rHelper, rPropMap, mnOrientation, mnWidth, mnHeight ); - AxControlModelBase::convertProperties( rHelper, rPropMap ); + rConv.convertColor( rPropMap, PROP_SymbolColor, mnArrowColor ); + rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_NOTSUPPORTED ); + rConv.convertAxOrientation( rPropMap, maSize, mnOrientation ); + AxControlModelBase::convertProperties( rPropMap, rConv ); } // ============================================================================ @@ -1048,9 +1294,9 @@ AxScrollBarModel::AxScrollBarModel() : { } -OUString AxScrollBarModel::getServiceName() const +ApiControlType AxScrollBarModel::getControlType() const { - return CREATE_OUSTRING( "com.sun.star.form.component.ScrollBar" ); + return API_CONTROL_SCROLLBAR; } void AxScrollBarModel::importProperty( sal_Int32 nPropId, const OUString& rValue ) @@ -1072,13 +1318,13 @@ void AxScrollBarModel::importProperty( sal_Int32 nPropId, const OUString& rValue } } -void AxScrollBarModel::importBinaryModel( BinaryInputStream& rInStrm ) +bool AxScrollBarModel::importBinaryModel( BinaryInputStream& rInStrm ) { AxBinaryPropertyReader aReader( rInStrm ); aReader.readIntProperty< sal_uInt32 >( mnArrowColor ); aReader.readIntProperty< sal_uInt32 >( mnBackColor ); aReader.readIntProperty< sal_uInt32 >( mnFlags ); - aReader.readPairProperty( mnWidth, mnHeight ); + aReader.readPairProperty( maSize ); aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer aReader.readIntProperty< sal_Int32 >( mnMin ); aReader.readIntProperty< sal_Int32 >( mnMax ); @@ -1092,114 +1338,292 @@ void AxScrollBarModel::importBinaryModel( BinaryInputStream& rInStrm ) aReader.readIntProperty< sal_Int16 >( mnPropThumb ); aReader.readIntProperty< sal_Int32 >( mnDelay ); aReader.skipPictureProperty(); // mouse icon - aReader.finalizeImport(); + return aReader.finalizeImport(); } -void AxScrollBarModel::convertProperties( AxControlHelper& rHelper, PropertyMap& rPropMap ) const +void AxScrollBarModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const { - sal_Int32 nMin = ::std::min( mnMin, mnMax ); - sal_Int32 nMax = ::std::max( mnMin, mnMax ); - rPropMap.setProperty( PROP_SymbolColor, rHelper.convertColor( mnArrowColor ) ); rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_FLAGS_ENABLED ) ); - rPropMap.setProperty( PROP_ScrollValueMin, nMin ); - rPropMap.setProperty( PROP_ScrollValueMax, nMax ); - rPropMap.setProperty( PROP_LineIncrement, mnSmallChange ); - rPropMap.setProperty( PROP_BlockIncrement, mnLargeChange ); - rPropMap.setProperty( PROP_DefaultScrollValue, mnPosition ); rPropMap.setProperty( PROP_RepeatDelay, mnDelay ); rPropMap.setProperty( PROP_Border, API_BORDER_NONE ); - if( (mnPropThumb == AX_PROPTHUMB_ON) && (nMin < nMax) && (mnLargeChange > 0) ) + if( (mnPropThumb == AX_PROPTHUMB_ON) && (mnMin != mnMax) && (mnLargeChange > 0) ) { - double fInterval = nMax - nMin; // prevent integer overflow (fInterval+mnLargeChange may become 0 when int is used) + // use double to prevent integer overflow in division (fInterval+mnLargeChange may become 0 when performed as int) + double fInterval = fabs( static_cast< double >( mnMax - mnMin ) ); sal_Int32 nThumbLen = getLimitedValue< sal_Int32, double >( (fInterval * mnLargeChange) / (fInterval + mnLargeChange), 1, SAL_MAX_INT32 ); rPropMap.setProperty( PROP_VisibleSize, nThumbLen ); } - lclConvertBackground( rHelper, rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_NOTSUPPORTED ); - lclConvertOrientation( rHelper, rPropMap, mnOrientation, mnWidth, mnHeight ); - AxControlModelBase::convertProperties( rHelper, rPropMap ); + rConv.convertColor( rPropMap, PROP_SymbolColor, mnArrowColor ); + rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_NOTSUPPORTED ); + rConv.convertAxOrientation( rPropMap, maSize, mnOrientation ); + rConv.convertScrollBar( rPropMap, mnMin, mnMax, mnPosition, mnSmallChange, mnLargeChange, mbAwtModel ); + AxControlModelBase::convertProperties( rPropMap, rConv ); +} + +// ============================================================================ + +AxContainerModelBase::AxContainerModelBase() : + AxFontDataModel( false ), // no support for Align property + maLogicalSize( AX_CONTAINER_DEFWIDTH, AX_CONTAINER_DEFHEIGHT ), + maScrollPos( 0, 0 ), + mnBackColor( AX_SYSCOLOR_BUTTONFACE ), + mnTextColor( AX_SYSCOLOR_BUTTONTEXT ), + mnFlags( AX_CONTAINER_DEFFLAGS ), + mnBorderColor( AX_SYSCOLOR_BUTTONTEXT ), + mnBorderStyle( AX_BORDERSTYLE_NONE ), + mnScrollBars( AX_CONTAINER_SCR_NONE ), + mnCycleType( AX_CONTAINER_CYCLEALL ), + mnSpecialEffect( AX_SPECIALEFFECT_FLAT ), + mnPicAlign( AX_PICALIGN_CENTER ), + mnPicSizeMode( AX_PICSIZE_CLIP ), + mbPicTiling( false ) +{ + setAwtModelMode(); + // different default size for frame + maSize = AxPairData( AX_CONTAINER_DEFWIDTH, AX_CONTAINER_DEFHEIGHT ); +} + +void AxContainerModelBase::importProperty( sal_Int32 nPropId, const OUString& rValue ) +{ + if( nPropId == XML_Caption ) + maCaption = rValue; +} + +bool AxContainerModelBase::importBinaryModel( BinaryInputStream& rInStrm ) +{ + AxBinaryPropertyReader aReader( rInStrm ); + aReader.skipUndefinedProperty(); + aReader.readIntProperty< sal_uInt32 >( mnBackColor ); + aReader.readIntProperty< sal_uInt32 >( mnTextColor ); + aReader.skipIntProperty< sal_uInt32 >(); // next availbale control ID + aReader.skipUndefinedProperty(); + aReader.skipUndefinedProperty(); + aReader.readIntProperty< sal_uInt32 >( mnFlags ); + aReader.readIntProperty< sal_uInt8 >( mnBorderStyle ); + aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer + aReader.readIntProperty< sal_uInt8 >( mnScrollBars ); + aReader.readPairProperty( maSize ); + aReader.readPairProperty( maLogicalSize ); + aReader.readPairProperty( maScrollPos ); + aReader.skipIntProperty< sal_uInt32 >(); // number of control groups + aReader.skipUndefinedProperty(); + aReader.skipPictureProperty(); // mouse icon + aReader.readIntProperty< sal_uInt8 >( mnCycleType ); + aReader.readIntProperty< sal_uInt8 >( mnSpecialEffect ); + aReader.readIntProperty< sal_uInt32 >( mnBorderColor ); + aReader.readStringProperty( maCaption ); + aReader.readFontProperty( maFontData ); + aReader.readPictureProperty( maPictureData ); + aReader.skipIntProperty< sal_Int32 >(); // zoom + aReader.readIntProperty< sal_uInt8 >( mnPicAlign ); + aReader.readBoolProperty( mbPicTiling ); + aReader.readIntProperty< sal_uInt8 >( mnPicSizeMode ); + aReader.skipIntProperty< sal_uInt32 >(); // shape cookie + aReader.skipIntProperty< sal_uInt32 >(); // draw buffer size + return aReader.finalizeImport(); +} + +bool AxContainerModelBase::importClassTable( BinaryInputStream& rInStrm, AxClassTable& orClassTable ) +{ + bool bValid = true; + orClassTable.clear(); + if( !getFlag( mnFlags, AX_CONTAINER_NOCLASSTABLE ) ) + { + sal_uInt16 nCount = rInStrm.readuInt16(); + for( sal_uInt16 nIndex = 0; bValid && (nIndex < nCount); ++nIndex ) + { + orClassTable.push_back( OUString() ); + AxBinaryPropertyReader aReader( rInStrm ); + aReader.readGuidProperty( orClassTable.back() ); + aReader.skipGuidProperty(); // source interface GUID + aReader.skipUndefinedProperty(); + aReader.skipGuidProperty(); // default interface GUID + aReader.skipIntProperty< sal_uInt32 >(); // class table and var flags + aReader.skipIntProperty< sal_uInt32 >(); // method count + aReader.skipIntProperty< sal_Int32 >(); // IDispatch identifier for linked cell access + aReader.skipIntProperty< sal_uInt16 >(); // get function index for linked cell access + aReader.skipIntProperty< sal_uInt16 >(); // put function index for linked cell access + aReader.skipIntProperty< sal_uInt16 >(); // linked cell access property type + aReader.skipIntProperty< sal_uInt16 >(); // get function index of value + aReader.skipIntProperty< sal_uInt16 >(); // put function index of value + aReader.skipIntProperty< sal_uInt16 >(); // value type + aReader.skipIntProperty< sal_Int32 >(); // IDispatch identifier for source range access + aReader.skipIntProperty< sal_uInt16 >(); // get function index for source range access + bValid = aReader.finalizeImport(); + } + } + return bValid; } // ============================================================================ -AxControl::AxControl( const OUString& rName ) : +AxFrameModel::AxFrameModel() +{ +} + +ApiControlType AxFrameModel::getControlType() const +{ + return API_CONTROL_GROUPBOX; +} + +void AxFrameModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const +{ + rPropMap.setProperty( PROP_Label, maCaption ); + rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_CONTAINER_ENABLED ) ); + AxContainerModelBase::convertProperties( rPropMap, rConv ); +} + +// ============================================================================ + +AxUserFormModel::AxUserFormModel() +{ +} + +ApiControlType AxUserFormModel::getControlType() const +{ + return API_CONTROL_DIALOG; +} + +void AxUserFormModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const +{ + rPropMap.setProperty( PROP_Title, maCaption ); + rConv.convertColor( rPropMap, PROP_BackgroundColor, mnBackColor ); + AxContainerModelBase::convertProperties( rPropMap, rConv ); +} + +// ============================================================================ + +EmbeddedControl::EmbeddedControl( const OUString& rName ) : maName( rName ) { } -AxControl::~AxControl() +EmbeddedControl::~EmbeddedControl() { } -AxControlModelBase* AxControl::createModel( const OUString& rClassId ) +ControlModelRef EmbeddedControl::createModel( const OUString& rClassId ) { - // TODO: move into a factory - maClassId = rClassId.toAsciiUpperCase(); - if( maClassId.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "{D7053240-CE69-11CD-A777-00DD01143C57}" ) ) ) // Forms.CommandButton.1 + OUString aClassId = rClassId.toAsciiUpperCase(); + if( aClassId.equalsAscii( AX_GUID_COMMANDBUTTON ) ) mxModel.reset( new AxCommandButtonModel ); - else if( maClassId.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "{978C9E23-D4B0-11CE-BF2D-00AA003F40D0}" ) ) ) // Forms.Label.1 + else if( aClassId.equalsAscii( AX_GUID_LABEL ) ) mxModel.reset( new AxLabelModel ); - else if( maClassId.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "{4C599241-6926-101B-9992-00000B65C6F9}" ) ) ) // Forms.Image.1 + else if( aClassId.equalsAscii( AX_GUID_IMAGE ) ) mxModel.reset( new AxImageModel ); - else if( maClassId.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "{8BD21D60-EC42-11CE-9E0D-00AA006002F3}" ) ) ) // Forms.ToggleButton.1 + else if( aClassId.equalsAscii( AX_GUID_TOGGLEBUTTON ) ) mxModel.reset( new AxToggleButtonModel ); - else if( maClassId.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "{8BD21D40-EC42-11CE-9E0D-00AA006002F3}" ) ) ) // Forms.CheckBox.1 + else if( aClassId.equalsAscii( AX_GUID_CHECKBOX ) ) mxModel.reset( new AxCheckBoxModel ); - else if( maClassId.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "{8BD21D50-EC42-11CE-9E0D-00AA006002F3}" ) ) ) // Forms.OptionButton.1 + else if( aClassId.equalsAscii( AX_GUID_OPTIONBUTTON ) ) mxModel.reset( new AxOptionButtonModel ); - else if( maClassId.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "{8BD21D10-EC42-11CE-9E0D-00AA006002F3}" ) ) ) // Forms.TextBox.1 + else if( aClassId.equalsAscii( AX_GUID_TEXTBOX ) ) mxModel.reset( new AxTextBoxModel ); - else if( maClassId.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "{8BD21D20-EC42-11CE-9E0D-00AA006002F3}" ) ) ) // Forms.ListBox.1 + else if( aClassId.equalsAscii( AX_GUID_LISTBOX ) ) mxModel.reset( new AxListBoxModel ); - else if( maClassId.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "{8BD21D30-EC42-11CE-9E0D-00AA006002F3}" ) ) ) // Forms.ComboBox.1 + else if( aClassId.equalsAscii( AX_GUID_COMBOBOX ) ) mxModel.reset( new AxComboBoxModel ); - else if( maClassId.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "{79176FB0-B7F2-11CE-97EF-00AA006D2776}" ) ) ) // Forms.SpinButton.1 + else if( aClassId.equalsAscii( AX_GUID_SPINBUTTON ) ) mxModel.reset( new AxSpinButtonModel ); - else if( maClassId.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "{DFD181E0-5E2F-11CE-A449-00AA004A803D}" ) ) ) // Forms.ScrollBar.1 + else if( aClassId.equalsAscii( AX_GUID_SCROLLBAR ) ) mxModel.reset( new AxScrollBarModel ); + else if( aClassId.equalsAscii( AX_GUID_FRAME ) ) + mxModel.reset( new AxFrameModel ); + else if( aClassId.equalsAscii( COMCTL_GUID_SCROLLBAR_60 ) ) + mxModel.reset( new ComCtlScrollBarModel( 6 ) ); else mxModel.reset(); - return mxModel.get(); + // embedded controls are form component instances + if( mxModel.get() ) + mxModel->setFormComponentMode(); + + return mxModel; } -void AxControl::importBinaryModel( BinaryInputStream& rInStrm ) +OUString EmbeddedControl::getServiceName() const { - if( AxControlModelBase* pModel = createModel( OleHelper::importGuid( rInStrm ) ) ) - pModel->importBinaryModel( rInStrm ); + return mxModel.get() ? mxModel->getServiceName() : OUString(); } -Reference< XControlModel > AxControl::convertAndInsert( AxControlHelper& rHelper ) const +bool EmbeddedControl::convertProperties( const Reference< XControlModel >& rxCtrlModel, const ControlConverter& rConv ) const { - Reference< XControlModel > xCtrlModel; - if( mxModel.get() ) try + if( mxModel.get() && rxCtrlModel.is() && (maName.getLength() > 0) ) { - Reference< XIndexContainer > xFormIC( rHelper.getControlForm(), UNO_QUERY_THROW ); + PropertyMap aPropMap; + aPropMap.setProperty( PROP_Name, maName ); + mxModel->convertProperties( aPropMap, rConv ); + PropertySet aPropSet( rxCtrlModel ); + aPropSet.setProperties( aPropMap ); + return true; + } + return false; +} - // document model creates the form control model - xCtrlModel.set( rHelper.getFilter().getModelFactory()->createInstance( mxModel->getServiceName() ), UNO_QUERY_THROW ); - Reference< XFormComponent > xFormComp( xCtrlModel, UNO_QUERY_THROW ); +// ============================================================================ + +EmbeddedForm::EmbeddedForm( const Reference< XMultiServiceFactory >& rxModelFactory, + const Reference< XDrawPage >& rxDrawPage, const GraphicHelper& rGraphicHelper, bool bDefaultColorBgr ) : + ControlConverter( rGraphicHelper, bDefaultColorBgr ), + mxModelFactory( rxModelFactory ), + mxFormsSupp( rxDrawPage, UNO_QUERY ) +{ + OSL_ENSURE( mxModelFactory.is(), "EmbeddedForm::EmbeddedForm - missing service factory" ); +} + +Reference< XControlModel > EmbeddedForm::convertAndInsert( const EmbeddedControl& rControl ) +{ + if( mxModelFactory.is() && rControl.hasModel() ) try + { + // create the UNO control model + OUString aServiceName = rControl.getServiceName(); + Reference< XFormComponent > xFormComp( mxModelFactory->createInstance( aServiceName ), UNO_QUERY_THROW ); + Reference< XControlModel > xCtrlModel( xFormComp, UNO_QUERY_THROW ); - // insert control model into the passed form + // insert the control into the form + Reference< XIndexContainer > xFormIC( createForm(), UNO_SET_THROW ); sal_Int32 nNewIndex = xFormIC->getCount(); xFormIC->insertByIndex( nNewIndex, Any( xFormComp ) ); - // convert all control properties - PropertyMap aPropMap; - aPropMap.setProperty( PROP_Name, maName ); - mxModel->convertProperties( rHelper, aPropMap ); - - PropertySet aPropSet( xCtrlModel ); - aPropSet.setProperties( aPropMap ); + // convert the control properties + if( rControl.convertProperties( xCtrlModel, *this ) ) + return xCtrlModel; } catch( Exception& ) { - xCtrlModel.clear(); // on error: forget the created form control model } - return xCtrlModel; + return Reference< XControlModel >(); +} + +Reference< XIndexContainer > EmbeddedForm::createForm() +{ + if( mxFormsSupp.is() ) + { + try + { + Reference< XNameContainer > xFormsNC( mxFormsSupp->getForms(), UNO_SET_THROW ); + OUString aFormName = CREATE_OUSTRING( "Standard" ); + if( xFormsNC->hasByName( aFormName ) ) + { + mxFormIC.set( xFormsNC->getByName( aFormName ), UNO_QUERY_THROW ); + } + else if( mxModelFactory.is() ) + { + Reference< XForm > xForm( mxModelFactory->createInstance( CREATE_OUSTRING( "com.sun.star.form.component.Form" ) ), UNO_QUERY_THROW ); + xFormsNC->insertByName( aFormName, Any( xForm ) ); + mxFormIC.set( xForm, UNO_QUERY_THROW ); + } + } + catch( Exception& ) + { + } + // always clear the forms supplier to not try to create the form again + mxFormsSupp.clear(); + } + return mxFormIC; } // ============================================================================ } // namespace ole } // namespace oox - |