1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 #include "oox/ole/axcontrol.hxx" 29 30 #include <com/sun/star/awt/FontSlant.hpp> 31 #include <com/sun/star/awt/FontStrikeout.hpp> 32 #include <com/sun/star/awt/FontUnderline.hpp> 33 #include <com/sun/star/awt/FontWeight.hpp> 34 #include <com/sun/star/awt/ImagePosition.hpp> 35 #include <com/sun/star/awt/ImageScaleMode.hpp> 36 #include <com/sun/star/awt/Point.hpp> 37 #include <com/sun/star/awt/ScrollBarOrientation.hpp> 38 #include <com/sun/star/awt/Size.hpp> 39 #include <com/sun/star/awt/TextAlign.hpp> 40 #include <com/sun/star/awt/VisualEffect.hpp> 41 #include <com/sun/star/awt/XControlModel.hpp> 42 #include <com/sun/star/beans/NamedValue.hpp> 43 #include <com/sun/star/container/XIndexContainer.hpp> 44 #include <com/sun/star/form/XForm.hpp> 45 #include <com/sun/star/form/XFormComponent.hpp> 46 #include <com/sun/star/form/XFormsSupplier.hpp> 47 #include <com/sun/star/form/binding/XBindableValue.hpp> 48 #include <com/sun/star/form/binding/XListEntrySink.hpp> 49 #include <com/sun/star/form/binding/XListEntrySource.hpp> 50 #include <com/sun/star/form/binding/XValueBinding.hpp> 51 #include <com/sun/star/lang/XMultiServiceFactory.hpp> 52 #include <com/sun/star/sheet/XCellRangeAddressable.hpp> 53 #include <com/sun/star/sheet/XCellRangeReferrer.hpp> 54 #include <com/sun/star/style/VerticalAlignment.hpp> 55 #include <com/sun/star/table/CellAddress.hpp> 56 #include <com/sun/star/table/CellRangeAddress.hpp> 57 #include <rtl/tencinfo.h> 58 #include "oox/helper/attributelist.hxx" 59 #include "oox/helper/binaryinputstream.hxx" 60 #include "oox/helper/containerhelper.hxx" 61 #include "oox/helper/graphichelper.hxx" 62 #include "oox/helper/propertymap.hxx" 63 64 namespace oox { 65 namespace ole { 66 67 // ============================================================================ 68 69 using namespace ::com::sun::star::awt; 70 using namespace ::com::sun::star::beans; 71 using namespace ::com::sun::star::container; 72 using namespace ::com::sun::star::drawing; 73 using namespace ::com::sun::star::form; 74 using namespace ::com::sun::star::form::binding; 75 using namespace ::com::sun::star::frame; 76 using namespace ::com::sun::star::lang; 77 using namespace ::com::sun::star::sheet; 78 using namespace ::com::sun::star::style; 79 using namespace ::com::sun::star::table; 80 using namespace ::com::sun::star::uno; 81 82 using ::rtl::OUString; 83 84 // ============================================================================ 85 86 namespace { 87 88 const sal_uInt32 COMCTL_ID_SIZE = 0x12344321; 89 90 const sal_uInt32 COMCTL_ID_COMMONDATA = 0xABCDEF01; 91 const sal_uInt32 COMCTL_COMMON_FLATBORDER = 0x00000001; 92 const sal_uInt32 COMCTL_COMMON_ENABLED = 0x00000002; 93 const sal_uInt32 COMCTL_COMMON_3DBORDER = 0x00000004; 94 const sal_uInt32 COMCTL_COMMON_OLEDROPMAN = 0x00002000; 95 96 const sal_uInt32 COMCTL_ID_COMPLEXDATA = 0xBDECDE1F; 97 const sal_uInt32 COMCTL_COMPLEX_FONT = 0x00000001; 98 const sal_uInt32 COMCTL_COMPLEX_MOUSEICON = 0x00000002; 99 100 const sal_uInt32 COMCTL_ID_SCROLLBAR_60 = 0x99470A83; 101 const sal_uInt32 COMCTL_SCROLLBAR_HOR = 0x00000010; 102 const sal_Int32 COMCTL_SCROLLBAR_3D = 0; 103 const sal_Int32 COMCTL_SCROLLBAR_FLAT = 1; 104 const sal_Int32 COMCTL_SCROLLBAR_TRACK3D = 2; 105 106 const sal_uInt32 COMCTL_ID_PROGRESSBAR_50 = 0xE6E17E84; 107 const sal_uInt32 COMCTL_ID_PROGRESSBAR_60 = 0x97AB8A01; 108 109 // ---------------------------------------------------------------------------- 110 111 const sal_uInt32 AX_CMDBUTTON_DEFFLAGS = 0x0000001B; 112 const sal_uInt32 AX_LABEL_DEFFLAGS = 0x0080001B; 113 const sal_uInt32 AX_IMAGE_DEFFLAGS = 0x0000001B; 114 const sal_uInt32 AX_MORPHDATA_DEFFLAGS = 0x2C80081B; 115 const sal_uInt32 AX_SPINBUTTON_DEFFLAGS = 0x0000001B; 116 const sal_uInt32 AX_SCROLLBAR_DEFFLAGS = 0x0000001B; 117 const sal_uInt32 AX_TABSTRIP_DEFFLAGS = 0x0000001B; 118 119 const sal_uInt16 AX_POS_TOPLEFT = 0; 120 const sal_uInt16 AX_POS_TOP = 1; 121 const sal_uInt16 AX_POS_TOPRIGHT = 2; 122 const sal_uInt16 AX_POS_LEFT = 3; 123 const sal_uInt16 AX_POS_CENTER = 4; 124 const sal_uInt16 AX_POS_RIGHT = 5; 125 const sal_uInt16 AX_POS_BOTTOMLEFT = 6; 126 const sal_uInt16 AX_POS_BOTTOM = 7; 127 const sal_uInt16 AX_POS_BOTTOMRIGHT = 8; 128 129 #define AX_PICPOS_IMPL( label, image ) ((AX_POS_##label << 16) | AX_POS_##image) 130 const sal_uInt32 AX_PICPOS_LEFTTOP = AX_PICPOS_IMPL( TOPRIGHT, TOPLEFT ); 131 const sal_uInt32 AX_PICPOS_LEFTCENTER = AX_PICPOS_IMPL( RIGHT, LEFT ); 132 const sal_uInt32 AX_PICPOS_LEFTBOTTOM = AX_PICPOS_IMPL( BOTTOMRIGHT, BOTTOMLEFT ); 133 const sal_uInt32 AX_PICPOS_RIGHTTOP = AX_PICPOS_IMPL( TOPLEFT, TOPRIGHT ); 134 const sal_uInt32 AX_PICPOS_RIGHTCENTER = AX_PICPOS_IMPL( LEFT, RIGHT ); 135 const sal_uInt32 AX_PICPOS_RIGHTBOTTOM = AX_PICPOS_IMPL( BOTTOMLEFT, BOTTOMRIGHT ); 136 const sal_uInt32 AX_PICPOS_ABOVELEFT = AX_PICPOS_IMPL( BOTTOMLEFT, TOPLEFT ); 137 const sal_uInt32 AX_PICPOS_ABOVECENTER = AX_PICPOS_IMPL( BOTTOM, TOP ); 138 const sal_uInt32 AX_PICPOS_ABOVERIGHT = AX_PICPOS_IMPL( BOTTOMRIGHT, TOPRIGHT ); 139 const sal_uInt32 AX_PICPOS_BELOWLEFT = AX_PICPOS_IMPL( TOPLEFT, BOTTOMLEFT ); 140 const sal_uInt32 AX_PICPOS_BELOWCENTER = AX_PICPOS_IMPL( TOP, BOTTOM ); 141 const sal_uInt32 AX_PICPOS_BELOWRIGHT = AX_PICPOS_IMPL( TOPRIGHT, BOTTOMRIGHT ); 142 const sal_uInt32 AX_PICPOS_CENTER = AX_PICPOS_IMPL( CENTER, CENTER ); 143 #undef AX_PICPOS_IMPL 144 145 const sal_Int32 AX_MATCHENTRY_FIRSTLETTER = 0; 146 const sal_Int32 AX_MATCHENTRY_COMPLETE = 1; 147 const sal_Int32 AX_MATCHENTRY_NONE = 2; 148 149 const sal_Int32 AX_ORIENTATION_AUTO = -1; 150 const sal_Int32 AX_ORIENTATION_VERTICAL = 0; 151 const sal_Int32 AX_ORIENTATION_HORIZONTAL = 1; 152 153 const sal_Int32 AX_PROPTHUMB_ON = -1; 154 const sal_Int32 AX_PROPTHUMB_OFF = 0; 155 156 const sal_uInt32 AX_TABSTRIP_TABS = 0; 157 const sal_uInt32 AX_TABSTRIP_BUTTONS = 1; 158 const sal_uInt32 AX_TABSTRIP_NONE = 2; 159 160 const sal_uInt32 AX_CONTAINER_ENABLED = 0x00000004; 161 const sal_uInt32 AX_CONTAINER_HASDESIGNEXT = 0x00004000; 162 const sal_uInt32 AX_CONTAINER_NOCLASSTABLE = 0x00008000; 163 164 const sal_uInt32 AX_CONTAINER_DEFFLAGS = 0x00000004; 165 166 const sal_Int32 AX_CONTAINER_DEFWIDTH = 4000; 167 const sal_Int32 AX_CONTAINER_DEFHEIGHT = 3000; 168 169 const sal_Int32 AX_CONTAINER_CYCLEALL = 0; 170 const sal_Int32 AX_CONTAINER_CYCLECURRENT = 2; 171 172 const sal_Int32 AX_CONTAINER_SCR_NONE = 0x00; 173 const sal_Int32 AX_CONTAINER_SCR_HOR = 0x01; 174 const sal_Int32 AX_CONTAINER_SCR_VER = 0x02; 175 const sal_Int32 AX_CONTAINER_SCR_KEEP_HOR = 0x04; 176 const sal_Int32 AX_CONTAINER_SCR_KEEP_VER = 0x08; 177 const sal_Int32 AX_CONTAINER_SCR_SHOW_LEFT = 0x10; 178 179 // ---------------------------------------------------------------------------- 180 181 const sal_Int16 API_BORDER_NONE = 0; 182 const sal_Int16 API_BORDER_SUNKEN = 1; 183 const sal_Int16 API_BORDER_FLAT = 2; 184 185 const sal_Int16 API_STATE_UNCHECKED = 0; 186 const sal_Int16 API_STATE_CHECKED = 1; 187 const sal_Int16 API_STATE_DONTKNOW = 2; 188 189 // ---------------------------------------------------------------------------- 190 191 /** Tries to extract a range address from a defined name. */ 192 bool lclExtractRangeFromName( CellRangeAddress& orRangeAddr, const Reference< XModel >& rxDocModel, const OUString& rAddressString ) 193 { 194 try 195 { 196 PropertySet aPropSet( rxDocModel ); 197 Reference< XNameAccess > xRangesNA( aPropSet.getAnyProperty( PROP_NamedRanges ), UNO_QUERY_THROW ); 198 Reference< XCellRangeReferrer > xReferrer( xRangesNA->getByName( rAddressString ), UNO_QUERY_THROW ); 199 Reference< XCellRangeAddressable > xAddressable( xReferrer->getReferredCells(), UNO_QUERY_THROW ); 200 orRangeAddr = xAddressable->getRangeAddress(); 201 return true; 202 } 203 catch( Exception& ) 204 { 205 } 206 return false; 207 } 208 209 bool lclExtractAddressFromName( CellAddress& orAddress, const Reference< XModel >& rxDocModel, const OUString& rAddressString ) 210 { 211 CellRangeAddress aRangeAddr; 212 if( lclExtractRangeFromName( aRangeAddr, rxDocModel, rAddressString ) && 213 (aRangeAddr.StartColumn == aRangeAddr.EndColumn) && 214 (aRangeAddr.StartRow == aRangeAddr.EndRow) ) 215 { 216 orAddress.Sheet = aRangeAddr.Sheet; 217 orAddress.Column = aRangeAddr.StartColumn; 218 orAddress.Row = aRangeAddr.StartRow; 219 return true; 220 } 221 return false; 222 } 223 224 void lclPrepareConverter( PropertySet& rConverter, const Reference< XModel >& rxDocModel, 225 const OUString& rAddressString, sal_Int32 nRefSheet, bool bRange ) 226 { 227 if( !rConverter.is() ) try 228 { 229 Reference< XMultiServiceFactory > xModelFactory( rxDocModel, UNO_QUERY_THROW ); 230 OUString aServiceName = bRange ? 231 CREATE_OUSTRING( "com.sun.star.table.CellRangeAddressConversion" ) : 232 CREATE_OUSTRING( "com.sun.star.table.CellAddressConversion" ); 233 rConverter.set( xModelFactory->createInstance( aServiceName ) ); 234 } 235 catch( Exception& ) 236 { 237 } 238 rConverter.setProperty( PROP_XLA1Representation, rAddressString ); 239 rConverter.setProperty( PROP_ReferenceSheet, nRefSheet ); 240 } 241 242 } // namespace 243 244 // ============================================================================ 245 246 ControlConverter::ControlConverter( const Reference< XModel >& rxDocModel, 247 const GraphicHelper& rGraphicHelper, bool bDefaultColorBgr ) : 248 mxDocModel( rxDocModel ), 249 mrGraphicHelper( rGraphicHelper ), 250 mbDefaultColorBgr( bDefaultColorBgr ) 251 { 252 OSL_ENSURE( mxDocModel.is(), "ControlConverter::ControlConverter - missing document model" ); 253 } 254 255 ControlConverter::~ControlConverter() 256 { 257 } 258 259 // Generic conversion --------------------------------------------------------- 260 261 void ControlConverter::convertPosition( PropertyMap& rPropMap, const AxPairData& rPos ) const 262 { 263 // position is given in 1/100 mm, UNO needs AppFont units 264 Point aAppFontPos = mrGraphicHelper.convertHmmToAppFont( Point( rPos.first, rPos.second ) ); 265 rPropMap.setProperty( PROP_PositionX, aAppFontPos.X ); 266 rPropMap.setProperty( PROP_PositionY, aAppFontPos.Y ); 267 } 268 269 void ControlConverter::convertSize( PropertyMap& rPropMap, const AxPairData& rSize ) const 270 { 271 // size is given in 1/100 mm, UNO needs AppFont units 272 Size aAppFontSize = mrGraphicHelper.convertHmmToAppFont( Size( rSize.first, rSize.second ) ); 273 rPropMap.setProperty( PROP_Width, aAppFontSize.Width ); 274 rPropMap.setProperty( PROP_Height, aAppFontSize.Height ); 275 } 276 277 void ControlConverter::convertColor( PropertyMap& rPropMap, sal_Int32 nPropId, sal_uInt32 nOleColor ) const 278 { 279 rPropMap.setProperty( nPropId, OleHelper::decodeOleColor( mrGraphicHelper, nOleColor, mbDefaultColorBgr ) ); 280 } 281 282 void ControlConverter::convertPicture( PropertyMap& rPropMap, const StreamDataSequence& rPicData ) const 283 { 284 if( rPicData.hasElements() ) 285 { 286 OUString aGraphicUrl = mrGraphicHelper.importGraphicObject( rPicData ); 287 if( aGraphicUrl.getLength() > 0 ) 288 rPropMap.setProperty( PROP_ImageURL, aGraphicUrl ); 289 } 290 } 291 292 void ControlConverter::convertOrientation( PropertyMap& rPropMap, bool bHorizontal ) const 293 { 294 sal_Int32 nScrollOrient = bHorizontal ? ScrollBarOrientation::HORIZONTAL : ScrollBarOrientation::VERTICAL; 295 rPropMap.setProperty( PROP_Orientation, nScrollOrient ); 296 } 297 298 void ControlConverter::convertVerticalAlign( PropertyMap& rPropMap, sal_Int32 nVerticalAlign ) const 299 { 300 VerticalAlignment eAlign = VerticalAlignment_TOP; 301 switch( nVerticalAlign ) 302 { 303 case XML_Top: eAlign = VerticalAlignment_TOP; break; 304 case XML_Center: eAlign = VerticalAlignment_MIDDLE; break; 305 case XML_Bottom: eAlign = VerticalAlignment_BOTTOM; break; 306 } 307 rPropMap.setProperty( PROP_VerticalAlign, eAlign ); 308 } 309 310 void ControlConverter::convertScrollBar( PropertyMap& rPropMap, 311 sal_Int32 nMin, sal_Int32 nMax, sal_Int32 nPosition, 312 sal_Int32 nSmallChange, sal_Int32 nLargeChange, bool bAwtModel ) const 313 { 314 rPropMap.setProperty( PROP_ScrollValueMin, ::std::min( nMin, nMax ) ); 315 rPropMap.setProperty( PROP_ScrollValueMax, ::std::max( nMin, nMax ) ); 316 rPropMap.setProperty( PROP_LineIncrement, nSmallChange ); 317 rPropMap.setProperty( PROP_BlockIncrement, nLargeChange ); 318 rPropMap.setProperty( bAwtModel ? PROP_ScrollValue : PROP_DefaultScrollValue, nPosition ); 319 } 320 321 void ControlConverter::bindToSources( const Reference< XControlModel >& rxCtrlModel, 322 const OUString& rCtrlSource, const OUString& rRowSource, sal_Int32 nRefSheet ) const 323 { 324 // value binding 325 if( rCtrlSource.getLength() > 0 ) try 326 { 327 // first check if the XBindableValue interface is supported 328 Reference< XBindableValue > xBindable( rxCtrlModel, UNO_QUERY_THROW ); 329 330 // convert address string to cell address struct 331 CellAddress aAddress; 332 if( !lclExtractAddressFromName( aAddress, mxDocModel, rCtrlSource ) ) 333 { 334 lclPrepareConverter( maAddressConverter, mxDocModel, rCtrlSource, nRefSheet, false ); 335 if( !maAddressConverter.getProperty( aAddress, PROP_Address ) ) 336 throw RuntimeException(); 337 } 338 339 // create argument sequence 340 NamedValue aValue; 341 aValue.Name = CREATE_OUSTRING( "BoundCell" ); 342 aValue.Value <<= aAddress; 343 Sequence< Any > aArgs( 1 ); 344 aArgs[ 0 ] <<= aValue; 345 346 // create the CellValueBinding instance and set at the control model 347 Reference< XMultiServiceFactory > xModelFactory( mxDocModel, UNO_QUERY_THROW ); 348 Reference< XValueBinding > xBinding( xModelFactory->createInstanceWithArguments( 349 CREATE_OUSTRING( "com.sun.star.table.CellValueBinding" ), aArgs ), UNO_QUERY_THROW ); 350 xBindable->setValueBinding( xBinding ); 351 } 352 catch( Exception& ) 353 { 354 } 355 356 // list entry source 357 if( rRowSource.getLength() > 0 ) try 358 { 359 // first check if the XListEntrySink interface is supported 360 Reference< XListEntrySink > xEntrySink( rxCtrlModel, UNO_QUERY_THROW ); 361 362 // convert address string to cell range address struct 363 CellRangeAddress aRangeAddr; 364 if( !lclExtractRangeFromName( aRangeAddr, mxDocModel, rRowSource ) ) 365 { 366 lclPrepareConverter( maRangeConverter, mxDocModel, rRowSource, nRefSheet, true ); 367 if( !maRangeConverter.getProperty( aRangeAddr, PROP_Address ) ) 368 throw RuntimeException(); 369 } 370 371 // create argument sequence 372 NamedValue aValue; 373 aValue.Name = CREATE_OUSTRING( "CellRange" ); 374 aValue.Value <<= aRangeAddr; 375 Sequence< Any > aArgs( 1 ); 376 aArgs[ 0 ] <<= aValue; 377 378 // create the EntrySource instance and set at the control model 379 Reference< XMultiServiceFactory > xModelFactory( mxDocModel, UNO_QUERY_THROW ); 380 Reference< XListEntrySource > xEntrySource( xModelFactory->createInstanceWithArguments( 381 CREATE_OUSTRING( "com.sun.star.table.CellRangeListSource" ), aArgs ), UNO_QUERY_THROW ); 382 xEntrySink->setListEntrySource( xEntrySource ); 383 } 384 catch( Exception& ) 385 { 386 } 387 } 388 389 // ActiveX (Forms 2.0) specific conversion ------------------------------------ 390 391 void ControlConverter::convertAxBackground( PropertyMap& rPropMap, 392 sal_uInt32 nBackColor, sal_uInt32 nFlags, ApiTransparencyMode eTranspMode ) const 393 { 394 bool bOpaque = getFlag( nFlags, AX_FLAGS_OPAQUE ); 395 switch( eTranspMode ) 396 { 397 case API_TRANSPARENCY_NOTSUPPORTED: 398 // fake transparency by using system window background if needed 399 convertColor( rPropMap, PROP_BackgroundColor, bOpaque ? nBackColor : AX_SYSCOLOR_WINDOWBACK ); 400 break; 401 case API_TRANSPARENCY_PAINTTRANSPARENT: 402 rPropMap.setProperty( PROP_PaintTransparent, !bOpaque ); 403 // run-through intended! 404 case API_TRANSPARENCY_VOID: 405 // keep transparency by leaving the (void) default property value 406 if( bOpaque ) 407 convertColor( rPropMap, PROP_BackgroundColor, nBackColor ); 408 break; 409 } 410 } 411 412 void ControlConverter::convertAxBorder( PropertyMap& rPropMap, 413 sal_uInt32 nBorderColor, sal_Int32 nBorderStyle, sal_Int32 nSpecialEffect ) const 414 { 415 sal_Int16 nBorder = (nBorderStyle == AX_BORDERSTYLE_SINGLE) ? API_BORDER_FLAT : 416 ((nSpecialEffect == AX_SPECIALEFFECT_FLAT) ? API_BORDER_NONE : API_BORDER_SUNKEN); 417 rPropMap.setProperty( PROP_Border, nBorder ); 418 convertColor( rPropMap, PROP_BorderColor, nBorderColor ); 419 } 420 421 void ControlConverter::convertAxVisualEffect( PropertyMap& rPropMap, sal_Int32 nSpecialEffect ) const 422 { 423 sal_Int16 nVisualEffect = (nSpecialEffect == AX_SPECIALEFFECT_FLAT) ? VisualEffect::FLAT : VisualEffect::LOOK3D; 424 rPropMap.setProperty( PROP_VisualEffect, nVisualEffect ); 425 } 426 427 void ControlConverter::convertAxPicture( PropertyMap& rPropMap, const StreamDataSequence& rPicData, sal_uInt32 nPicPos ) const 428 { 429 // the picture 430 convertPicture( rPropMap, rPicData ); 431 432 // picture position 433 sal_Int16 nImagePos = ImagePosition::LeftCenter; 434 switch( nPicPos ) 435 { 436 case AX_PICPOS_LEFTTOP: nImagePos = ImagePosition::LeftTop; break; 437 case AX_PICPOS_LEFTCENTER: nImagePos = ImagePosition::LeftCenter; break; 438 case AX_PICPOS_LEFTBOTTOM: nImagePos = ImagePosition::LeftBottom; break; 439 case AX_PICPOS_RIGHTTOP: nImagePos = ImagePosition::RightTop; break; 440 case AX_PICPOS_RIGHTCENTER: nImagePos = ImagePosition::RightCenter; break; 441 case AX_PICPOS_RIGHTBOTTOM: nImagePos = ImagePosition::RightBottom; break; 442 case AX_PICPOS_ABOVELEFT: nImagePos = ImagePosition::AboveLeft; break; 443 case AX_PICPOS_ABOVECENTER: nImagePos = ImagePosition::AboveCenter; break; 444 case AX_PICPOS_ABOVERIGHT: nImagePos = ImagePosition::AboveRight; break; 445 case AX_PICPOS_BELOWLEFT: nImagePos = ImagePosition::BelowLeft; break; 446 case AX_PICPOS_BELOWCENTER: nImagePos = ImagePosition::BelowCenter; break; 447 case AX_PICPOS_BELOWRIGHT: nImagePos = ImagePosition::BelowRight; break; 448 case AX_PICPOS_CENTER: nImagePos = ImagePosition::Centered; break; 449 default: OSL_ENSURE( false, "ControlConverter::convertAxPicture - unknown picture position" ); 450 } 451 rPropMap.setProperty( PROP_ImagePosition, nImagePos ); 452 } 453 454 void ControlConverter::convertAxPicture( PropertyMap& rPropMap, const StreamDataSequence& rPicData, 455 sal_Int32 nPicSizeMode, sal_Int32 /*nPicAlign*/, bool /*bPicTiling*/ ) const 456 { 457 // the picture 458 convertPicture( rPropMap, rPicData ); 459 460 // picture scale mode 461 sal_Int16 nScaleMode = ImageScaleMode::None; 462 switch( nPicSizeMode ) 463 { 464 case AX_PICSIZE_CLIP: nScaleMode = ImageScaleMode::None; break; 465 case AX_PICSIZE_STRETCH: nScaleMode = ImageScaleMode::Anisotropic; break; 466 case AX_PICSIZE_ZOOM: nScaleMode = ImageScaleMode::Isotropic; break; 467 default: OSL_ENSURE( false, "ControlConverter::convertAxPicture - unknown picture size mode" ); 468 } 469 rPropMap.setProperty( PROP_ScaleMode, nScaleMode ); 470 } 471 472 void ControlConverter::convertAxState( PropertyMap& rPropMap, 473 const OUString& rValue, sal_Int32 nMultiSelect, ApiDefaultStateMode eDefStateMode, bool bAwtModel ) const 474 { 475 bool bBooleanState = eDefStateMode == API_DEFAULTSTATE_BOOLEAN; 476 bool bSupportsTriState = eDefStateMode == API_DEFAULTSTATE_TRISTATE; 477 478 // state 479 sal_Int16 nState = bSupportsTriState ? API_STATE_DONTKNOW : API_STATE_UNCHECKED; 480 if( rValue.getLength() == 1 ) switch( rValue[ 0 ] ) 481 { 482 case '0': nState = API_STATE_UNCHECKED; break; 483 case '1': nState = API_STATE_CHECKED; break; 484 // any other string (also empty) means 'dontknow' 485 } 486 sal_Int32 nPropId = bAwtModel ? PROP_State : PROP_DefaultState; 487 if( bBooleanState ) 488 rPropMap.setProperty( nPropId, nState != API_STATE_UNCHECKED ); 489 else 490 rPropMap.setProperty( nPropId, nState ); 491 492 // tristate 493 if( bSupportsTriState ) 494 rPropMap.setProperty( PROP_TriState, nMultiSelect == AX_SELCTION_MULTI ); 495 } 496 497 void ControlConverter::convertAxOrientation( PropertyMap& rPropMap, 498 const AxPairData& rSize, sal_Int32 nOrientation ) const 499 { 500 bool bHorizontal = true; 501 switch( nOrientation ) 502 { 503 case AX_ORIENTATION_AUTO: bHorizontal = rSize.first > rSize.second; break; 504 case AX_ORIENTATION_VERTICAL: bHorizontal = false; break; 505 case AX_ORIENTATION_HORIZONTAL: bHorizontal = true; break; 506 default: OSL_ENSURE( false, "ControlConverter::convertAxOrientation - unknown orientation" ); 507 } 508 convertOrientation( rPropMap, bHorizontal ); 509 } 510 511 // ============================================================================ 512 513 ControlModelBase::ControlModelBase() : 514 maSize( 0, 0 ), 515 mbAwtModel( false ) 516 { 517 } 518 519 ControlModelBase::~ControlModelBase() 520 { 521 } 522 523 OUString ControlModelBase::getServiceName() const 524 { 525 ApiControlType eCtrlType = getControlType(); 526 if( mbAwtModel ) switch( eCtrlType ) 527 { 528 case API_CONTROL_BUTTON: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlButtonModel" ); 529 case API_CONTROL_FIXEDTEXT: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlFixedTextModel" ); 530 case API_CONTROL_IMAGE: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlImageControlModel" ); 531 case API_CONTROL_CHECKBOX: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlCheckBoxModel" ); 532 case API_CONTROL_RADIOBUTTON: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlRadioButtonModel" ); 533 case API_CONTROL_EDIT: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlEditModel" ); 534 case API_CONTROL_NUMERIC: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlNumericFieldModel" ); 535 case API_CONTROL_LISTBOX: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlListBoxModel" ); 536 case API_CONTROL_COMBOBOX: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlComboBoxModel" ); 537 case API_CONTROL_SPINBUTTON: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlSpinButtonModel" ); 538 case API_CONTROL_SCROLLBAR: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlScrollBarModel" ); 539 case API_CONTROL_PROGRESSBAR: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlProgressBarModel" ); 540 case API_CONTROL_GROUPBOX: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlGroupBoxModel" ); 541 case API_CONTROL_DIALOG: return CREATE_OUSTRING( "com.sun.star.awt.UnoControlDialogModel" ); 542 default: OSL_ENSURE( false, "ControlModelBase::getServiceName - no AWT model service supported" ); 543 } 544 else switch( eCtrlType ) 545 { 546 case API_CONTROL_BUTTON: return CREATE_OUSTRING( "com.sun.star.form.component.CommandButton" ); 547 case API_CONTROL_FIXEDTEXT: return CREATE_OUSTRING( "com.sun.star.form.component.FixedText" ); 548 case API_CONTROL_IMAGE: return CREATE_OUSTRING( "com.sun.star.form.component.DatabaseImageControl" ); 549 case API_CONTROL_CHECKBOX: return CREATE_OUSTRING( "com.sun.star.form.component.CheckBox" ); 550 case API_CONTROL_RADIOBUTTON: return CREATE_OUSTRING( "com.sun.star.form.component.RadioButton" ); 551 case API_CONTROL_EDIT: return CREATE_OUSTRING( "com.sun.star.form.component.TextField" ); 552 case API_CONTROL_NUMERIC: return CREATE_OUSTRING( "com.sun.star.form.component.NumericField" ); 553 case API_CONTROL_LISTBOX: return CREATE_OUSTRING( "com.sun.star.form.component.ListBox" ); 554 case API_CONTROL_COMBOBOX: return CREATE_OUSTRING( "com.sun.star.form.component.ComboBox" ); 555 case API_CONTROL_SPINBUTTON: return CREATE_OUSTRING( "com.sun.star.form.component.SpinButton" ); 556 case API_CONTROL_SCROLLBAR: return CREATE_OUSTRING( "com.sun.star.form.component.ScrollBar" ); 557 case API_CONTROL_GROUPBOX: return CREATE_OUSTRING( "com.sun.star.form.component.GroupBox" ); 558 default: OSL_ENSURE( false, "ControlModelBase::getServiceName - no form component service supported" ); 559 } 560 return OUString(); 561 } 562 563 void ControlModelBase::importProperty( sal_Int32 /*nPropId*/, const OUString& /*rValue*/ ) 564 { 565 } 566 567 void ControlModelBase::importPictureData( sal_Int32 /*nPropId*/, BinaryInputStream& /*rInStrm*/ ) 568 { 569 } 570 571 void ControlModelBase::convertProperties( PropertyMap& /*rPropMap*/, const ControlConverter& /*rConv*/ ) const 572 { 573 } 574 575 void ControlModelBase::convertSize( PropertyMap& rPropMap, const ControlConverter& rConv ) const 576 { 577 rConv.convertSize( rPropMap, maSize ); 578 } 579 580 // ============================================================================ 581 582 ComCtlModelBase::ComCtlModelBase( sal_uInt32 nDataPartId5, sal_uInt32 nDataPartId6, 583 sal_uInt16 nVersion, bool bCommonPart, bool bComplexPart ) : 584 maFontData( CREATE_OUSTRING( "Tahoma" ), 82500 ), 585 mnFlags( 0 ), 586 mnVersion( nVersion ), 587 mnDataPartId5( nDataPartId5 ), 588 mnDataPartId6( nDataPartId6 ), 589 mbCommonPart( bCommonPart ), 590 mbComplexPart( bComplexPart ) 591 { 592 } 593 594 bool ComCtlModelBase::importBinaryModel( BinaryInputStream& rInStrm ) 595 { 596 // read initial size part and header of the control data part 597 if( importSizePart( rInStrm ) && readPartHeader( rInStrm, getDataPartId(), mnVersion ) ) 598 { 599 // if flags part exists, the first int32 of the data part contains its size 600 sal_uInt32 nCommonPartSize = mbCommonPart ? rInStrm.readuInt32() : 0; 601 // implementations must read the exact amount of data, stream must point to its end afterwards 602 importControlData( rInStrm ); 603 // read following parts 604 if( !rInStrm.isEof() && 605 (!mbCommonPart || importCommonPart( rInStrm, nCommonPartSize )) && 606 (!mbComplexPart || importComplexPart( rInStrm )) ) 607 { 608 return !rInStrm.isEof(); 609 } 610 } 611 return false; 612 } 613 614 void ComCtlModelBase::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const 615 { 616 if( mbCommonPart ) 617 rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, COMCTL_COMMON_ENABLED ) ); 618 ControlModelBase::convertProperties( rPropMap, rConv ); 619 } 620 621 void ComCtlModelBase::importCommonExtraData( BinaryInputStream& /*rInStrm*/ ) 622 { 623 } 624 625 void ComCtlModelBase::importCommonTrailingData( BinaryInputStream& /*rInStrm*/ ) 626 { 627 } 628 629 sal_uInt32 ComCtlModelBase::getDataPartId() const 630 { 631 switch( mnVersion ) 632 { 633 case COMCTL_VERSION_50: return mnDataPartId5; 634 case COMCTL_VERSION_60: return mnDataPartId6; 635 } 636 OSL_ENSURE( false, "ComCtlObjectBase::getDataPartId - unxpected version" ); 637 return SAL_MAX_UINT32; 638 } 639 640 bool ComCtlModelBase::readPartHeader( BinaryInputStream& rInStrm, sal_uInt32 nExpPartId, sal_uInt16 nExpMajor, sal_uInt16 nExpMinor ) 641 { 642 // no idea if all this is correct... 643 sal_uInt32 nPartId; 644 sal_uInt16 nMajor, nMinor; 645 rInStrm >> nPartId >> nMinor >> nMajor; 646 bool bPartId = nPartId == nExpPartId; 647 OSL_ENSURE( bPartId, "ComCtlObjectBase::readPartHeader - unexpected part identifier" ); 648 bool bVersion = ((nExpMajor == SAL_MAX_UINT16) || (nExpMajor == nMajor)) && ((nExpMinor == SAL_MAX_UINT16) || (nExpMinor == nMinor)); 649 OSL_ENSURE( bVersion, "ComCtlObjectBase::readPartHeader - unexpected part version" ); 650 return !rInStrm.isEof() && bPartId && bVersion; 651 } 652 653 bool ComCtlModelBase::importSizePart( BinaryInputStream& rInStrm ) 654 { 655 if( readPartHeader( rInStrm, COMCTL_ID_SIZE, 0, 8 ) ) 656 { 657 rInStrm >> maSize.first >> maSize.second; 658 return !rInStrm.isEof(); 659 } 660 return false; 661 } 662 663 bool ComCtlModelBase::importCommonPart( BinaryInputStream& rInStrm, sal_uInt32 nPartSize ) 664 { 665 sal_Int64 nEndPos = rInStrm.tell() + nPartSize; 666 if( (nPartSize >= 16) && readPartHeader( rInStrm, COMCTL_ID_COMMONDATA, 5, 0 ) ) 667 { 668 rInStrm.skip( 4 ); 669 rInStrm >> mnFlags; 670 // implementations may read less than the exact amount of data 671 importCommonExtraData( rInStrm ); 672 rInStrm.seek( nEndPos ); 673 // implementations must read the exact amount of data, stream must point to its end afterwards 674 importCommonTrailingData( rInStrm ); 675 return !rInStrm.isEof(); 676 } 677 return false; 678 } 679 680 bool ComCtlModelBase::importComplexPart( BinaryInputStream& rInStrm ) 681 { 682 if( readPartHeader( rInStrm, COMCTL_ID_COMPLEXDATA, 5, 1 ) ) 683 { 684 sal_uInt32 nContFlags; 685 rInStrm >> nContFlags; 686 bool bReadOk = 687 (!getFlag( nContFlags, COMCTL_COMPLEX_FONT ) || OleHelper::importStdFont( maFontData, rInStrm, true )) && 688 (!getFlag( nContFlags, COMCTL_COMPLEX_MOUSEICON ) || OleHelper::importStdPic( maMouseIcon, rInStrm, true )); 689 return bReadOk && !rInStrm.isEof(); 690 } 691 return false; 692 } 693 694 // ============================================================================ 695 696 ComCtlScrollBarModel::ComCtlScrollBarModel( sal_uInt16 nVersion ) : 697 ComCtlModelBase( SAL_MAX_UINT32, COMCTL_ID_SCROLLBAR_60, nVersion, true, true ), 698 mnScrollBarFlags( 0x00000011 ), 699 mnLargeChange( 1 ), 700 mnSmallChange( 1 ), 701 mnMin( 0 ), 702 mnMax( 32767 ), 703 mnPosition( 0 ) 704 { 705 } 706 707 ApiControlType ComCtlScrollBarModel::getControlType() const 708 { 709 return API_CONTROL_SCROLLBAR; 710 } 711 712 void ComCtlScrollBarModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const 713 { 714 rPropMap.setProperty( PROP_Border, API_BORDER_NONE ); 715 rConv.convertOrientation( rPropMap, getFlag( mnScrollBarFlags, COMCTL_SCROLLBAR_HOR ) ); 716 rConv.convertScrollBar( rPropMap, mnMin, mnMax, mnPosition, mnSmallChange, mnLargeChange, mbAwtModel ); 717 ComCtlModelBase::convertProperties( rPropMap, rConv ); 718 } 719 720 void ComCtlScrollBarModel::importControlData( BinaryInputStream& rInStrm ) 721 { 722 rInStrm >> mnScrollBarFlags >> mnLargeChange >> mnSmallChange >> mnMin >> mnMax >> mnPosition; 723 } 724 725 // ============================================================================ 726 727 ComCtlProgressBarModel::ComCtlProgressBarModel( sal_uInt16 nVersion ) : 728 ComCtlModelBase( COMCTL_ID_PROGRESSBAR_50, COMCTL_ID_PROGRESSBAR_60, nVersion, true, true ), 729 mfMin( 0.0 ), 730 mfMax( 100.0 ), 731 mnVertical( 0 ), 732 mnSmooth( 0 ) 733 { 734 } 735 736 ApiControlType ComCtlProgressBarModel::getControlType() const 737 { 738 return API_CONTROL_PROGRESSBAR; 739 } 740 741 void ComCtlProgressBarModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const 742 { 743 sal_uInt16 nBorder = getFlag( mnFlags, COMCTL_COMMON_3DBORDER ) ? API_BORDER_SUNKEN : 744 (getFlag( mnFlags, COMCTL_COMMON_FLATBORDER ) ? API_BORDER_FLAT : API_BORDER_NONE); 745 rPropMap.setProperty( PROP_Border, nBorder ); 746 rPropMap.setProperty( PROP_ProgressValueMin, getLimitedValue< sal_Int32, double >( ::std::min( mfMin, mfMax ), 0.0, SAL_MAX_INT32 ) ); 747 rPropMap.setProperty( PROP_ProgressValueMax, getLimitedValue< sal_Int32, double >( ::std::max( mfMin, mfMax ), 0.0, SAL_MAX_INT32 ) ); 748 // ComCtl model does not provide current value? 749 ComCtlModelBase::convertProperties( rPropMap, rConv ); 750 } 751 752 void ComCtlProgressBarModel::importControlData( BinaryInputStream& rInStrm ) 753 { 754 rInStrm >> mfMin >> mfMax; 755 if( mnVersion == COMCTL_VERSION_60 ) 756 rInStrm >> mnVertical >> mnSmooth; 757 } 758 759 // ============================================================================ 760 761 AxControlModelBase::AxControlModelBase() 762 { 763 } 764 765 void AxControlModelBase::importProperty( sal_Int32 nPropId, const OUString& rValue ) 766 { 767 switch( nPropId ) 768 { 769 // size of the control shape: format is "width;height" 770 case XML_Size: 771 { 772 sal_Int32 nSepPos = rValue.indexOf( ';' ); 773 OSL_ENSURE( nSepPos >= 0, "AxControlModelBase::importProperty - missing separator in 'Size' property" ); 774 if( nSepPos >= 0 ) 775 { 776 maSize.first = rValue.copy( 0, nSepPos ).toInt32(); 777 maSize.second = rValue.copy( nSepPos + 1 ).toInt32(); 778 } 779 } 780 break; 781 } 782 } 783 784 // ============================================================================ 785 786 AxFontDataModel::AxFontDataModel( bool bSupportsAlign ) : 787 mbSupportsAlign( bSupportsAlign ) 788 { 789 } 790 791 void AxFontDataModel::importProperty( sal_Int32 nPropId, const OUString& rValue ) 792 { 793 switch( nPropId ) 794 { 795 case XML_FontName: maFontData.maFontName = rValue; break; 796 case XML_FontEffects: maFontData.mnFontEffects = AttributeConversion::decodeUnsigned( rValue ); break; 797 case XML_FontHeight: maFontData.mnFontHeight = AttributeConversion::decodeInteger( rValue ); break; 798 case XML_FontCharSet: maFontData.mnFontCharSet = AttributeConversion::decodeInteger( rValue ); break; 799 case XML_ParagraphAlign: maFontData.mnHorAlign = AttributeConversion::decodeInteger( rValue ); break; 800 default: AxControlModelBase::importProperty( nPropId, rValue ); 801 } 802 } 803 804 bool AxFontDataModel::importBinaryModel( BinaryInputStream& rInStrm ) 805 { 806 return maFontData.importBinaryModel( rInStrm ); 807 } 808 809 void AxFontDataModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const 810 { 811 // font name 812 if( maFontData.maFontName.getLength() > 0 ) 813 rPropMap.setProperty( PROP_FontName, maFontData.maFontName ); 814 815 // font effects 816 rPropMap.setProperty( PROP_FontWeight, getFlagValue( maFontData.mnFontEffects, AX_FONTDATA_BOLD, FontWeight::BOLD, FontWeight::NORMAL ) ); 817 rPropMap.setProperty( PROP_FontSlant, getFlagValue< sal_Int16 >( maFontData.mnFontEffects, AX_FONTDATA_ITALIC, FontSlant_ITALIC, FontSlant_NONE ) ); 818 rPropMap.setProperty( PROP_FontUnderline, getFlagValue( maFontData.mnFontEffects, AX_FONTDATA_UNDERLINE, maFontData.mbDblUnderline ? FontUnderline::DOUBLE : FontUnderline::SINGLE, FontUnderline::NONE ) ); 819 rPropMap.setProperty( PROP_FontStrikeout, getFlagValue( maFontData.mnFontEffects, AX_FONTDATA_STRIKEOUT, FontStrikeout::SINGLE, FontStrikeout::NONE ) ); 820 rPropMap.setProperty( PROP_FontHeight, maFontData.getHeightPoints() ); 821 822 // font character set 823 rtl_TextEncoding eFontEnc = RTL_TEXTENCODING_DONTKNOW; 824 if( (0 <= maFontData.mnFontCharSet) && (maFontData.mnFontCharSet <= SAL_MAX_UINT8) ) 825 eFontEnc = rtl_getTextEncodingFromWindowsCharset( static_cast< sal_uInt8 >( maFontData.mnFontCharSet ) ); 826 if( eFontEnc != RTL_TEXTENCODING_DONTKNOW ) 827 rPropMap.setProperty( PROP_FontCharset, static_cast< sal_Int16 >( eFontEnc ) ); 828 829 // text alignment 830 if( mbSupportsAlign ) 831 { 832 sal_Int32 nAlign = TextAlign::LEFT; 833 switch( maFontData.mnHorAlign ) 834 { 835 case AX_FONTDATA_LEFT: nAlign = TextAlign::LEFT; break; 836 case AX_FONTDATA_RIGHT: nAlign = TextAlign::RIGHT; break; 837 case AX_FONTDATA_CENTER: nAlign = TextAlign::CENTER; break; 838 default: OSL_ENSURE( false, "AxFontDataModel::convertProperties - unknown text alignment" ); 839 } 840 // form controls expect short value 841 rPropMap.setProperty( PROP_Align, static_cast< sal_Int16 >( nAlign ) ); 842 } 843 844 // process base class properties 845 AxControlModelBase::convertProperties( rPropMap, rConv ); 846 } 847 848 // ============================================================================ 849 850 AxCommandButtonModel::AxCommandButtonModel() : 851 mnTextColor( AX_SYSCOLOR_BUTTONTEXT ), 852 mnBackColor( AX_SYSCOLOR_BUTTONFACE ), 853 mnFlags( AX_CMDBUTTON_DEFFLAGS ), 854 mnPicturePos( AX_PICPOS_ABOVECENTER ), 855 mnVerticalAlign( XML_Center ), 856 mbFocusOnClick( true ) 857 { 858 } 859 860 void AxCommandButtonModel::importProperty( sal_Int32 nPropId, const OUString& rValue ) 861 { 862 switch( nPropId ) 863 { 864 case XML_Caption: maCaption = rValue; break; 865 case XML_ForeColor: mnTextColor = AttributeConversion::decodeUnsigned( rValue ); break; 866 case XML_BackColor: mnBackColor = AttributeConversion::decodeUnsigned( rValue ); break; 867 case XML_VariousPropertyBits: mnFlags = AttributeConversion::decodeUnsigned( rValue ); break; 868 case XML_PicturePosition: mnPicturePos = AttributeConversion::decodeUnsigned( rValue ); break; 869 case XML_TakeFocusOnClick: mbFocusOnClick = AttributeConversion::decodeInteger( rValue ) != 0; break; 870 default: AxFontDataModel::importProperty( nPropId, rValue ); 871 } 872 } 873 874 void AxCommandButtonModel::importPictureData( sal_Int32 nPropId, BinaryInputStream& rInStrm ) 875 { 876 switch( nPropId ) 877 { 878 case XML_Picture: OleHelper::importStdPic( maPictureData, rInStrm, true ); break; 879 default: AxFontDataModel::importPictureData( nPropId, rInStrm ); 880 } 881 } 882 883 bool AxCommandButtonModel::importBinaryModel( BinaryInputStream& rInStrm ) 884 { 885 AxBinaryPropertyReader aReader( rInStrm ); 886 aReader.readIntProperty< sal_uInt32 >( mnTextColor ); 887 aReader.readIntProperty< sal_uInt32 >( mnBackColor ); 888 aReader.readIntProperty< sal_uInt32 >( mnFlags ); 889 aReader.readStringProperty( maCaption ); 890 aReader.readIntProperty< sal_uInt32 >( mnPicturePos ); 891 aReader.readPairProperty( maSize ); 892 aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer 893 aReader.readPictureProperty( maPictureData ); 894 aReader.skipIntProperty< sal_uInt16 >(); // accelerator 895 aReader.readBoolProperty( mbFocusOnClick, true ); // binary flag means "do not take focus" 896 aReader.skipPictureProperty(); // mouse icon 897 return aReader.finalizeImport() && AxFontDataModel::importBinaryModel( rInStrm ); 898 } 899 900 ApiControlType AxCommandButtonModel::getControlType() const 901 { 902 return API_CONTROL_BUTTON; 903 } 904 905 void AxCommandButtonModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const 906 { 907 rPropMap.setProperty( PROP_Label, maCaption ); 908 rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_FLAGS_ENABLED ) ); 909 rPropMap.setProperty( PROP_MultiLine, getFlag( mnFlags, AX_FLAGS_WORDWRAP ) ); 910 rPropMap.setProperty( PROP_FocusOnClick, mbFocusOnClick ); 911 rConv.convertColor( rPropMap, PROP_TextColor, mnTextColor ); 912 rConv.convertVerticalAlign( rPropMap, mnVerticalAlign ); 913 rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_NOTSUPPORTED ); 914 rConv.convertAxPicture( rPropMap, maPictureData, mnPicturePos ); 915 AxFontDataModel::convertProperties( rPropMap, rConv ); 916 } 917 918 // ============================================================================ 919 920 AxLabelModel::AxLabelModel() : 921 mnTextColor( AX_SYSCOLOR_BUTTONTEXT ), 922 mnBackColor( AX_SYSCOLOR_BUTTONFACE ), 923 mnFlags( AX_LABEL_DEFFLAGS ), 924 mnBorderColor( AX_SYSCOLOR_WINDOWFRAME ), 925 mnBorderStyle( AX_BORDERSTYLE_NONE ), 926 mnSpecialEffect( AX_SPECIALEFFECT_FLAT ), 927 mnVerticalAlign( XML_Top ) 928 { 929 } 930 931 void AxLabelModel::importProperty( sal_Int32 nPropId, const OUString& rValue ) 932 { 933 switch( nPropId ) 934 { 935 case XML_Caption: maCaption = rValue; break; 936 case XML_ForeColor: mnTextColor = AttributeConversion::decodeUnsigned( rValue ); break; 937 case XML_BackColor: mnBackColor = AttributeConversion::decodeUnsigned( rValue ); break; 938 case XML_VariousPropertyBits: mnFlags = AttributeConversion::decodeUnsigned( rValue ); break; 939 case XML_BorderColor: mnBorderColor = AttributeConversion::decodeUnsigned( rValue ); break; 940 case XML_BorderStyle: mnBorderStyle = AttributeConversion::decodeInteger( rValue ); break; 941 case XML_SpecialEffect: mnSpecialEffect = AttributeConversion::decodeInteger( rValue ); break; 942 default: AxFontDataModel::importProperty( nPropId, rValue ); 943 } 944 } 945 946 bool AxLabelModel::importBinaryModel( BinaryInputStream& rInStrm ) 947 { 948 AxBinaryPropertyReader aReader( rInStrm ); 949 aReader.readIntProperty< sal_uInt32 >( mnTextColor ); 950 aReader.readIntProperty< sal_uInt32 >( mnBackColor ); 951 aReader.readIntProperty< sal_uInt32 >( mnFlags ); 952 aReader.readStringProperty( maCaption ); 953 aReader.skipIntProperty< sal_uInt32 >(); // picture position 954 aReader.readPairProperty( maSize ); 955 aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer 956 aReader.readIntProperty< sal_uInt32 >( mnBorderColor ); 957 aReader.readIntProperty< sal_uInt16 >( mnBorderStyle ); 958 aReader.readIntProperty< sal_uInt16 >( mnSpecialEffect ); 959 aReader.skipPictureProperty(); // picture 960 aReader.skipIntProperty< sal_uInt16 >(); // accelerator 961 aReader.skipPictureProperty(); // mouse icon 962 return aReader.finalizeImport() && AxFontDataModel::importBinaryModel( rInStrm ); 963 } 964 965 ApiControlType AxLabelModel::getControlType() const 966 { 967 return API_CONTROL_FIXEDTEXT; 968 } 969 970 void AxLabelModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const 971 { 972 rPropMap.setProperty( PROP_Label, maCaption ); 973 rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_FLAGS_ENABLED ) ); 974 rPropMap.setProperty( PROP_MultiLine, getFlag( mnFlags, AX_FLAGS_WORDWRAP ) ); 975 rConv.convertColor( rPropMap, PROP_TextColor, mnTextColor ); 976 rConv.convertVerticalAlign( rPropMap, mnVerticalAlign ); 977 rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID ); 978 rConv.convertAxBorder( rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect ); 979 AxFontDataModel::convertProperties( rPropMap, rConv ); 980 } 981 982 // ============================================================================ 983 984 AxImageModel::AxImageModel() : 985 mnBackColor( AX_SYSCOLOR_BUTTONFACE ), 986 mnFlags( AX_IMAGE_DEFFLAGS ), 987 mnBorderColor( AX_SYSCOLOR_WINDOWFRAME ), 988 mnBorderStyle( AX_BORDERSTYLE_SINGLE ), 989 mnSpecialEffect( AX_SPECIALEFFECT_FLAT ), 990 mnPicSizeMode( AX_PICSIZE_CLIP ), 991 mnPicAlign( AX_PICALIGN_CENTER ), 992 mbPicTiling( false ) 993 { 994 } 995 996 void AxImageModel::importProperty( sal_Int32 nPropId, const OUString& rValue ) 997 { 998 switch( nPropId ) 999 { 1000 case XML_BackColor: mnBackColor = AttributeConversion::decodeUnsigned( rValue ); break; 1001 case XML_VariousPropertyBits: mnFlags = AttributeConversion::decodeUnsigned( rValue ); break; 1002 case XML_BorderColor: mnBorderColor = AttributeConversion::decodeUnsigned( rValue ); break; 1003 case XML_BorderStyle: mnBorderStyle = AttributeConversion::decodeInteger( rValue ); break; 1004 case XML_SpecialEffect: mnSpecialEffect = AttributeConversion::decodeInteger( rValue ); break; 1005 case XML_SizeMode: mnPicSizeMode = AttributeConversion::decodeInteger( rValue ); break; 1006 case XML_PictureAlignment: mnPicAlign = AttributeConversion::decodeInteger( rValue ); break; 1007 case XML_PictureTiling: mbPicTiling = AttributeConversion::decodeInteger( rValue ) != 0; break; 1008 default: AxControlModelBase::importProperty( nPropId, rValue ); 1009 } 1010 } 1011 1012 void AxImageModel::importPictureData( sal_Int32 nPropId, BinaryInputStream& rInStrm ) 1013 { 1014 switch( nPropId ) 1015 { 1016 case XML_Picture: OleHelper::importStdPic( maPictureData, rInStrm, true ); break; 1017 default: AxControlModelBase::importPictureData( nPropId, rInStrm ); 1018 } 1019 } 1020 1021 bool AxImageModel::importBinaryModel( BinaryInputStream& rInStrm ) 1022 { 1023 AxBinaryPropertyReader aReader( rInStrm ); 1024 aReader.skipUndefinedProperty(); 1025 aReader.skipUndefinedProperty(); 1026 aReader.skipBoolProperty(); // auto-size 1027 aReader.readIntProperty< sal_uInt32 >( mnBorderColor ); 1028 aReader.readIntProperty< sal_uInt32 >( mnBackColor ); 1029 aReader.readIntProperty< sal_uInt8 >( mnBorderStyle ); 1030 aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer 1031 aReader.readIntProperty< sal_uInt8 >( mnPicSizeMode ); 1032 aReader.readIntProperty< sal_uInt8 >( mnSpecialEffect ); 1033 aReader.readPairProperty( maSize ); 1034 aReader.readPictureProperty( maPictureData ); 1035 aReader.readIntProperty< sal_uInt8 >( mnPicAlign ); 1036 aReader.readBoolProperty( mbPicTiling ); 1037 aReader.readIntProperty< sal_uInt32 >( mnFlags ); 1038 aReader.skipPictureProperty(); // mouse icon 1039 return aReader.finalizeImport(); 1040 } 1041 1042 ApiControlType AxImageModel::getControlType() const 1043 { 1044 return API_CONTROL_IMAGE; 1045 } 1046 1047 void AxImageModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const 1048 { 1049 rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_FLAGS_ENABLED ) ); 1050 rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID ); 1051 rConv.convertAxBorder( rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect ); 1052 rConv.convertAxPicture( rPropMap, maPictureData, mnPicSizeMode, mnPicAlign, mbPicTiling ); 1053 AxControlModelBase::convertProperties( rPropMap, rConv ); 1054 } 1055 1056 // ============================================================================ 1057 1058 AxMorphDataModelBase::AxMorphDataModelBase() : 1059 mnTextColor( AX_SYSCOLOR_WINDOWTEXT ), 1060 mnBackColor( AX_SYSCOLOR_WINDOWBACK ), 1061 mnFlags( AX_MORPHDATA_DEFFLAGS ), 1062 mnPicturePos( AX_PICPOS_ABOVECENTER ), 1063 mnBorderColor( AX_SYSCOLOR_WINDOWFRAME ), 1064 mnBorderStyle( AX_BORDERSTYLE_NONE ), 1065 mnSpecialEffect( AX_SPECIALEFFECT_SUNKEN ), 1066 mnDisplayStyle( AX_DISPLAYSTYLE_TEXT ), 1067 mnMultiSelect( AX_SELCTION_SINGLE ), 1068 mnScrollBars( AX_SCROLLBAR_NONE ), 1069 mnMatchEntry( AX_MATCHENTRY_NONE ), 1070 mnShowDropButton( AX_SHOWDROPBUTTON_NEVER ), 1071 mnMaxLength( 0 ), 1072 mnPasswordChar( 0 ), 1073 mnListRows( 8 ), 1074 mnVerticalAlign( XML_Center ) 1075 { 1076 } 1077 1078 void AxMorphDataModelBase::importProperty( sal_Int32 nPropId, const OUString& rValue ) 1079 { 1080 switch( nPropId ) 1081 { 1082 case XML_Caption: maCaption = rValue; break; 1083 case XML_Value: maValue = rValue; break; 1084 case XML_GroupName: maGroupName = rValue; break; 1085 case XML_ForeColor: mnTextColor = AttributeConversion::decodeUnsigned( rValue ); break; 1086 case XML_BackColor: mnBackColor = AttributeConversion::decodeUnsigned( rValue ); break; 1087 case XML_VariousPropertyBits: mnFlags = AttributeConversion::decodeUnsigned( rValue ); break; 1088 case XML_PicturePosition: mnPicturePos = AttributeConversion::decodeUnsigned( rValue ); break; 1089 case XML_BorderColor: mnBorderColor = AttributeConversion::decodeUnsigned( rValue ); break; 1090 case XML_BorderStyle: mnBorderStyle = AttributeConversion::decodeInteger( rValue ); break; 1091 case XML_SpecialEffect: mnSpecialEffect = AttributeConversion::decodeInteger( rValue ); break; 1092 case XML_DisplayStyle: mnDisplayStyle = AttributeConversion::decodeInteger( rValue ); break; 1093 case XML_MultiSelect: mnMultiSelect = AttributeConversion::decodeInteger( rValue ); break; 1094 case XML_ScrollBars: mnScrollBars = AttributeConversion::decodeInteger( rValue ); break; 1095 case XML_MatchEntry: mnMatchEntry = AttributeConversion::decodeInteger( rValue ); break; 1096 case XML_ShowDropButtonWhen: mnShowDropButton = AttributeConversion::decodeInteger( rValue );break; 1097 case XML_MaxLength: mnMaxLength = AttributeConversion::decodeInteger( rValue ); break; 1098 case XML_PasswordChar: mnPasswordChar = AttributeConversion::decodeInteger( rValue ); break; 1099 case XML_ListRows: mnListRows = AttributeConversion::decodeInteger( rValue ); break; 1100 default: AxFontDataModel::importProperty( nPropId, rValue ); 1101 } 1102 } 1103 1104 void AxMorphDataModelBase::importPictureData( sal_Int32 nPropId, BinaryInputStream& rInStrm ) 1105 { 1106 switch( nPropId ) 1107 { 1108 case XML_Picture: OleHelper::importStdPic( maPictureData, rInStrm, true ); break; 1109 default: AxFontDataModel::importPictureData( nPropId, rInStrm ); 1110 } 1111 } 1112 1113 bool AxMorphDataModelBase::importBinaryModel( BinaryInputStream& rInStrm ) 1114 { 1115 AxBinaryPropertyReader aReader( rInStrm, true ); 1116 aReader.readIntProperty< sal_uInt32 >( mnFlags ); 1117 aReader.readIntProperty< sal_uInt32 >( mnBackColor ); 1118 aReader.readIntProperty< sal_uInt32 >( mnTextColor ); 1119 aReader.readIntProperty< sal_Int32 >( mnMaxLength ); 1120 aReader.readIntProperty< sal_uInt8 >( mnBorderStyle ); 1121 aReader.readIntProperty< sal_uInt8 >( mnScrollBars ); 1122 aReader.readIntProperty< sal_uInt8 >( mnDisplayStyle ); 1123 aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer 1124 aReader.readPairProperty( maSize ); 1125 aReader.readIntProperty< sal_uInt16 >( mnPasswordChar ); 1126 aReader.skipIntProperty< sal_uInt32 >(); // list width 1127 aReader.skipIntProperty< sal_uInt16 >(); // bound column 1128 aReader.skipIntProperty< sal_Int16 >(); // text column 1129 aReader.skipIntProperty< sal_Int16 >(); // column count 1130 aReader.readIntProperty< sal_uInt16 >( mnListRows ); 1131 aReader.skipIntProperty< sal_uInt16 >(); // column info count 1132 aReader.readIntProperty< sal_uInt8 >( mnMatchEntry ); 1133 aReader.skipIntProperty< sal_uInt8 >(); // list style 1134 aReader.readIntProperty< sal_uInt8 >( mnShowDropButton ); 1135 aReader.skipUndefinedProperty(); 1136 aReader.skipIntProperty< sal_uInt8 >(); // drop down style 1137 aReader.readIntProperty< sal_uInt8 >( mnMultiSelect ); 1138 aReader.readStringProperty( maValue ); 1139 aReader.readStringProperty( maCaption ); 1140 aReader.readIntProperty< sal_uInt32 >( mnPicturePos ); 1141 aReader.readIntProperty< sal_uInt32 >( mnBorderColor ); 1142 aReader.readIntProperty< sal_uInt32 >( mnSpecialEffect ); 1143 aReader.skipPictureProperty(); // mouse icon 1144 aReader.readPictureProperty( maPictureData ); 1145 aReader.skipIntProperty< sal_uInt16 >(); // accelerator 1146 aReader.skipUndefinedProperty(); 1147 aReader.skipBoolProperty(); 1148 aReader.readStringProperty( maGroupName ); 1149 return aReader.finalizeImport() && AxFontDataModel::importBinaryModel( rInStrm ); 1150 } 1151 1152 void AxMorphDataModelBase::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const 1153 { 1154 rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_FLAGS_ENABLED ) ); 1155 rConv.convertColor( rPropMap, PROP_TextColor, mnTextColor ); 1156 AxFontDataModel::convertProperties( rPropMap, rConv ); 1157 } 1158 1159 // ============================================================================ 1160 1161 AxToggleButtonModel::AxToggleButtonModel() 1162 { 1163 mnDisplayStyle = AX_DISPLAYSTYLE_TOGGLE; 1164 } 1165 1166 ApiControlType AxToggleButtonModel::getControlType() const 1167 { 1168 OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_TOGGLE, "AxToggleButtonModel::getControlType - invalid control type" ); 1169 return API_CONTROL_BUTTON; 1170 } 1171 1172 void AxToggleButtonModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const 1173 { 1174 rPropMap.setProperty( PROP_Label, maCaption ); 1175 rPropMap.setProperty( PROP_MultiLine, getFlag( mnFlags, AX_FLAGS_WORDWRAP ) ); 1176 rPropMap.setProperty( PROP_Toggle, true ); 1177 rConv.convertVerticalAlign( rPropMap, mnVerticalAlign ); 1178 rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_NOTSUPPORTED ); 1179 rConv.convertAxPicture( rPropMap, maPictureData, mnPicturePos ); 1180 rConv.convertAxState( rPropMap, maValue, mnMultiSelect, API_DEFAULTSTATE_BOOLEAN, mbAwtModel ); 1181 AxMorphDataModelBase::convertProperties( rPropMap, rConv ); 1182 } 1183 1184 // ============================================================================ 1185 1186 AxCheckBoxModel::AxCheckBoxModel() 1187 { 1188 mnDisplayStyle = AX_DISPLAYSTYLE_CHECKBOX; 1189 } 1190 1191 ApiControlType AxCheckBoxModel::getControlType() const 1192 { 1193 OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_CHECKBOX, "AxCheckBoxModel::getControlType - invalid control type" ); 1194 return API_CONTROL_CHECKBOX; 1195 } 1196 1197 void AxCheckBoxModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const 1198 { 1199 rPropMap.setProperty( PROP_Label, maCaption ); 1200 rPropMap.setProperty( PROP_MultiLine, getFlag( mnFlags, AX_FLAGS_WORDWRAP ) ); 1201 rConv.convertVerticalAlign( rPropMap, mnVerticalAlign ); 1202 rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID ); 1203 rConv.convertAxVisualEffect( rPropMap, mnSpecialEffect ); 1204 rConv.convertAxPicture( rPropMap, maPictureData, mnPicturePos ); 1205 rConv.convertAxState( rPropMap, maValue, mnMultiSelect, API_DEFAULTSTATE_TRISTATE, mbAwtModel ); 1206 AxMorphDataModelBase::convertProperties( rPropMap, rConv ); 1207 } 1208 1209 // ============================================================================ 1210 1211 AxOptionButtonModel::AxOptionButtonModel() 1212 { 1213 mnDisplayStyle = AX_DISPLAYSTYLE_OPTBUTTON; 1214 } 1215 1216 ApiControlType AxOptionButtonModel::getControlType() const 1217 { 1218 OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_OPTBUTTON, "AxOptionButtonModel::getControlType - invalid control type" ); 1219 return API_CONTROL_RADIOBUTTON; 1220 } 1221 1222 void AxOptionButtonModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const 1223 { 1224 rPropMap.setProperty( PROP_Label, maCaption ); 1225 rPropMap.setProperty( PROP_MultiLine, getFlag( mnFlags, AX_FLAGS_WORDWRAP ) ); 1226 rConv.convertVerticalAlign( rPropMap, mnVerticalAlign ); 1227 rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID ); 1228 rConv.convertAxVisualEffect( rPropMap, mnSpecialEffect ); 1229 rConv.convertAxPicture( rPropMap, maPictureData, mnPicturePos ); 1230 rConv.convertAxState( rPropMap, maValue, mnMultiSelect, API_DEFAULTSTATE_SHORT, mbAwtModel ); 1231 AxMorphDataModelBase::convertProperties( rPropMap, rConv ); 1232 } 1233 1234 // ============================================================================ 1235 1236 AxTextBoxModel::AxTextBoxModel() 1237 { 1238 mnDisplayStyle = AX_DISPLAYSTYLE_TEXT; 1239 } 1240 1241 ApiControlType AxTextBoxModel::getControlType() const 1242 { 1243 OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_TEXT, "AxTextBoxModel::getControlType - invalid control type" ); 1244 return API_CONTROL_EDIT; 1245 } 1246 1247 void AxTextBoxModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const 1248 { 1249 rPropMap.setProperty( PROP_MultiLine, getFlag( mnFlags, AX_FLAGS_MULTILINE ) ); 1250 rPropMap.setProperty( PROP_HideInactiveSelection, getFlag( mnFlags, AX_FLAGS_HIDESELECTION ) ); 1251 rPropMap.setProperty( mbAwtModel ? PROP_Text : PROP_DefaultText, maValue ); 1252 rPropMap.setProperty( PROP_MaxTextLen, getLimitedValue< sal_Int16, sal_Int32 >( mnMaxLength, 0, SAL_MAX_INT16 ) ); 1253 if( (0 < mnPasswordChar) && (mnPasswordChar <= SAL_MAX_INT16) ) 1254 rPropMap.setProperty( PROP_EchoChar, static_cast< sal_Int16 >( mnPasswordChar ) ); 1255 rPropMap.setProperty( PROP_HScroll, getFlag( mnScrollBars, AX_SCROLLBAR_HORIZONTAL ) ); 1256 rPropMap.setProperty( PROP_VScroll, getFlag( mnScrollBars, AX_SCROLLBAR_VERTICAL ) ); 1257 rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID ); 1258 rConv.convertAxBorder( rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect ); 1259 AxMorphDataModelBase::convertProperties( rPropMap, rConv ); 1260 } 1261 1262 // ============================================================================ 1263 1264 AxNumericFieldModel::AxNumericFieldModel() 1265 { 1266 mnDisplayStyle = AX_DISPLAYSTYLE_TEXT; 1267 } 1268 1269 ApiControlType AxNumericFieldModel::getControlType() const 1270 { 1271 OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_TEXT, "AxNumericFieldModel::getControlType - invalid control type" ); 1272 return API_CONTROL_NUMERIC; 1273 } 1274 1275 void AxNumericFieldModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const 1276 { 1277 rPropMap.setProperty( PROP_HideInactiveSelection, getFlag( mnFlags, AX_FLAGS_HIDESELECTION ) ); 1278 // TODO: OUString::toDouble() does not handle local decimal separator 1279 rPropMap.setProperty( mbAwtModel ? PROP_Value : PROP_DefaultValue, maValue.toDouble() ); 1280 rPropMap.setProperty( PROP_Spin, getFlag( mnScrollBars, AX_SCROLLBAR_VERTICAL ) ); 1281 rPropMap.setProperty( PROP_Repeat, true ); 1282 rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID ); 1283 rConv.convertAxBorder( rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect ); 1284 AxMorphDataModelBase::convertProperties( rPropMap, rConv ); 1285 } 1286 1287 // ============================================================================ 1288 1289 AxListBoxModel::AxListBoxModel() 1290 { 1291 mnDisplayStyle = AX_DISPLAYSTYLE_LISTBOX; 1292 } 1293 1294 ApiControlType AxListBoxModel::getControlType() const 1295 { 1296 OSL_ENSURE( mnDisplayStyle == AX_DISPLAYSTYLE_LISTBOX, "AxListBoxModel::getControlType - invalid control type" ); 1297 return API_CONTROL_LISTBOX; 1298 } 1299 1300 void AxListBoxModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const 1301 { 1302 bool bMultiSelect = (mnMultiSelect == AX_SELCTION_MULTI) || (mnMultiSelect == AX_SELCTION_EXTENDED); 1303 rPropMap.setProperty( PROP_MultiSelection, bMultiSelect ); 1304 rPropMap.setProperty( PROP_Dropdown, false ); 1305 rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID ); 1306 rConv.convertAxBorder( rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect ); 1307 AxMorphDataModelBase::convertProperties( rPropMap, rConv ); 1308 } 1309 1310 // ============================================================================ 1311 1312 AxComboBoxModel::AxComboBoxModel() 1313 { 1314 mnDisplayStyle = AX_DISPLAYSTYLE_COMBOBOX; 1315 } 1316 1317 ApiControlType AxComboBoxModel::getControlType() const 1318 { 1319 OSL_ENSURE( (mnDisplayStyle == AX_DISPLAYSTYLE_COMBOBOX) || (mnDisplayStyle == AX_DISPLAYSTYLE_DROPDOWN), "AxComboBoxModel::getControlType - invalid control type" ); 1320 return (mnDisplayStyle == AX_DISPLAYSTYLE_DROPDOWN) ? API_CONTROL_LISTBOX : API_CONTROL_COMBOBOX; 1321 } 1322 1323 void AxComboBoxModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const 1324 { 1325 if( mnDisplayStyle != AX_DISPLAYSTYLE_DROPDOWN ) 1326 { 1327 rPropMap.setProperty( PROP_HideInactiveSelection, getFlag( mnFlags, AX_FLAGS_HIDESELECTION ) ); 1328 rPropMap.setProperty( mbAwtModel ? PROP_Text : PROP_DefaultText, maValue ); 1329 rPropMap.setProperty( PROP_MaxTextLen, getLimitedValue< sal_Int16, sal_Int32 >( mnMaxLength, 0, SAL_MAX_INT16 ) ); 1330 bool bAutoComplete = (mnMatchEntry == AX_MATCHENTRY_FIRSTLETTER) || (mnMatchEntry == AX_MATCHENTRY_COMPLETE); 1331 rPropMap.setProperty( PROP_Autocomplete, bAutoComplete ); 1332 } 1333 bool bShowDropdown = (mnShowDropButton == AX_SHOWDROPBUTTON_FOCUS) || (mnShowDropButton == AX_SHOWDROPBUTTON_ALWAYS); 1334 rPropMap.setProperty( PROP_Dropdown, bShowDropdown ); 1335 rPropMap.setProperty( PROP_LineCount, getLimitedValue< sal_Int16, sal_Int32 >( mnListRows, 1, SAL_MAX_INT16 ) ); 1336 rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_VOID ); 1337 rConv.convertAxBorder( rPropMap, mnBorderColor, mnBorderStyle, mnSpecialEffect ); 1338 AxMorphDataModelBase::convertProperties( rPropMap, rConv ); 1339 } 1340 1341 // ============================================================================ 1342 1343 AxSpinButtonModel::AxSpinButtonModel() : 1344 mnArrowColor( AX_SYSCOLOR_BUTTONTEXT ), 1345 mnBackColor( AX_SYSCOLOR_BUTTONFACE ), 1346 mnFlags( AX_SPINBUTTON_DEFFLAGS ), 1347 mnOrientation( AX_ORIENTATION_AUTO ), 1348 mnMin( 0 ), 1349 mnMax( 100 ), 1350 mnPosition( 0 ), 1351 mnSmallChange( 1 ), 1352 mnDelay( 50 ) 1353 { 1354 } 1355 1356 ApiControlType AxSpinButtonModel::getControlType() const 1357 { 1358 return API_CONTROL_SPINBUTTON; 1359 } 1360 1361 void AxSpinButtonModel::importProperty( sal_Int32 nPropId, const OUString& rValue ) 1362 { 1363 switch( nPropId ) 1364 { 1365 case XML_ForeColor: mnArrowColor = AttributeConversion::decodeUnsigned( rValue ); break; 1366 case XML_BackColor: mnBackColor = AttributeConversion::decodeUnsigned( rValue ); break; 1367 case XML_VariousPropertyBits: mnFlags = AttributeConversion::decodeUnsigned( rValue ); break; 1368 case XML_Orientation: mnOrientation = AttributeConversion::decodeInteger( rValue ); break; 1369 case XML_Min: mnMin = AttributeConversion::decodeInteger( rValue ); break; 1370 case XML_Max: mnMax = AttributeConversion::decodeInteger( rValue ); break; 1371 case XML_Position: mnPosition = AttributeConversion::decodeInteger( rValue ); break; 1372 case XML_SmallChange: mnSmallChange = AttributeConversion::decodeInteger( rValue ); break; 1373 case XML_Delay: mnDelay = AttributeConversion::decodeInteger( rValue ); break; 1374 default: AxControlModelBase::importProperty( nPropId, rValue ); 1375 } 1376 } 1377 1378 bool AxSpinButtonModel::importBinaryModel( BinaryInputStream& rInStrm ) 1379 { 1380 AxBinaryPropertyReader aReader( rInStrm ); 1381 aReader.readIntProperty< sal_uInt32 >( mnArrowColor ); 1382 aReader.readIntProperty< sal_uInt32 >( mnBackColor ); 1383 aReader.readIntProperty< sal_uInt32 >( mnFlags ); 1384 aReader.readPairProperty( maSize ); 1385 aReader.skipIntProperty< sal_uInt32 >(); // unused 1386 aReader.readIntProperty< sal_Int32 >( mnMin ); 1387 aReader.readIntProperty< sal_Int32 >( mnMax ); 1388 aReader.readIntProperty< sal_Int32 >( mnPosition ); 1389 aReader.skipIntProperty< sal_uInt32 >(); // prev enabled 1390 aReader.skipIntProperty< sal_uInt32 >(); // next enabled 1391 aReader.readIntProperty< sal_Int32 >( mnSmallChange ); 1392 aReader.readIntProperty< sal_Int32 >( mnOrientation ); 1393 aReader.readIntProperty< sal_Int32 >( mnDelay ); 1394 aReader.skipPictureProperty(); // mouse icon 1395 aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer 1396 return aReader.finalizeImport(); 1397 } 1398 1399 void AxSpinButtonModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const 1400 { 1401 sal_Int32 nMin = ::std::min( mnMin, mnMax ); 1402 sal_Int32 nMax = ::std::max( mnMin, mnMax ); 1403 rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_FLAGS_ENABLED ) ); 1404 rPropMap.setProperty( PROP_SpinValueMin, nMin ); 1405 rPropMap.setProperty( PROP_SpinValueMax, nMax ); 1406 rPropMap.setProperty( PROP_SpinIncrement, mnSmallChange ); 1407 rPropMap.setProperty( mbAwtModel ? PROP_SpinValue : PROP_DefaultSpinValue, mnPosition ); 1408 rPropMap.setProperty( PROP_Repeat, true ); 1409 rPropMap.setProperty( PROP_RepeatDelay, mnDelay ); 1410 rPropMap.setProperty( PROP_Border, API_BORDER_NONE ); 1411 rConv.convertColor( rPropMap, PROP_SymbolColor, mnArrowColor ); 1412 rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_NOTSUPPORTED ); 1413 rConv.convertAxOrientation( rPropMap, maSize, mnOrientation ); 1414 AxControlModelBase::convertProperties( rPropMap, rConv ); 1415 } 1416 1417 // ============================================================================ 1418 1419 AxScrollBarModel::AxScrollBarModel() : 1420 mnArrowColor( AX_SYSCOLOR_BUTTONTEXT ), 1421 mnBackColor( AX_SYSCOLOR_BUTTONFACE ), 1422 mnFlags( AX_SCROLLBAR_DEFFLAGS ), 1423 mnOrientation( AX_ORIENTATION_AUTO ), 1424 mnPropThumb( AX_PROPTHUMB_ON ), 1425 mnMin( 0 ), 1426 mnMax( 32767 ), 1427 mnPosition( 0 ), 1428 mnSmallChange( 1 ), 1429 mnLargeChange( 1 ), 1430 mnDelay( 50 ) 1431 { 1432 } 1433 1434 ApiControlType AxScrollBarModel::getControlType() const 1435 { 1436 return API_CONTROL_SCROLLBAR; 1437 } 1438 1439 void AxScrollBarModel::importProperty( sal_Int32 nPropId, const OUString& rValue ) 1440 { 1441 switch( nPropId ) 1442 { 1443 case XML_ForeColor: mnArrowColor = AttributeConversion::decodeUnsigned( rValue ); break; 1444 case XML_BackColor: mnBackColor = AttributeConversion::decodeUnsigned( rValue ); break; 1445 case XML_VariousPropertyBits: mnFlags = AttributeConversion::decodeUnsigned( rValue ); break; 1446 case XML_Orientation: mnOrientation = AttributeConversion::decodeInteger( rValue ); break; 1447 case XML_ProportionalThumb: mnPropThumb = AttributeConversion::decodeInteger( rValue ); break; 1448 case XML_Min: mnMin = AttributeConversion::decodeInteger( rValue ); break; 1449 case XML_Max: mnMax = AttributeConversion::decodeInteger( rValue ); break; 1450 case XML_Position: mnPosition = AttributeConversion::decodeInteger( rValue ); break; 1451 case XML_SmallChange: mnSmallChange = AttributeConversion::decodeInteger( rValue ); break; 1452 case XML_LargeChange: mnLargeChange = AttributeConversion::decodeInteger( rValue ); break; 1453 case XML_Delay: mnDelay = AttributeConversion::decodeInteger( rValue ); break; 1454 default: AxControlModelBase::importProperty( nPropId, rValue ); 1455 } 1456 } 1457 1458 bool AxScrollBarModel::importBinaryModel( BinaryInputStream& rInStrm ) 1459 { 1460 AxBinaryPropertyReader aReader( rInStrm ); 1461 aReader.readIntProperty< sal_uInt32 >( mnArrowColor ); 1462 aReader.readIntProperty< sal_uInt32 >( mnBackColor ); 1463 aReader.readIntProperty< sal_uInt32 >( mnFlags ); 1464 aReader.readPairProperty( maSize ); 1465 aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer 1466 aReader.readIntProperty< sal_Int32 >( mnMin ); 1467 aReader.readIntProperty< sal_Int32 >( mnMax ); 1468 aReader.readIntProperty< sal_Int32 >( mnPosition ); 1469 aReader.skipIntProperty< sal_uInt32 >(); // unused 1470 aReader.skipIntProperty< sal_uInt32 >(); // prev enabled 1471 aReader.skipIntProperty< sal_uInt32 >(); // next enabled 1472 aReader.readIntProperty< sal_Int32 >( mnSmallChange ); 1473 aReader.readIntProperty< sal_Int32 >( mnLargeChange ); 1474 aReader.readIntProperty< sal_Int32 >( mnOrientation ); 1475 aReader.readIntProperty< sal_Int16 >( mnPropThumb ); 1476 aReader.readIntProperty< sal_Int32 >( mnDelay ); 1477 aReader.skipPictureProperty(); // mouse icon 1478 return aReader.finalizeImport(); 1479 } 1480 1481 void AxScrollBarModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const 1482 { 1483 rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_FLAGS_ENABLED ) ); 1484 rPropMap.setProperty( PROP_RepeatDelay, mnDelay ); 1485 rPropMap.setProperty( PROP_Border, API_BORDER_NONE ); 1486 if( (mnPropThumb == AX_PROPTHUMB_ON) && (mnMin != mnMax) && (mnLargeChange > 0) ) 1487 { 1488 // use double to prevent integer overflow in division (fInterval+mnLargeChange may become 0 when performed as int) 1489 double fInterval = fabs( static_cast< double >( mnMax - mnMin ) ); 1490 sal_Int32 nThumbLen = getLimitedValue< sal_Int32, double >( (fInterval * mnLargeChange) / (fInterval + mnLargeChange), 1, SAL_MAX_INT32 ); 1491 rPropMap.setProperty( PROP_VisibleSize, nThumbLen ); 1492 } 1493 rConv.convertColor( rPropMap, PROP_SymbolColor, mnArrowColor ); 1494 rConv.convertAxBackground( rPropMap, mnBackColor, mnFlags, API_TRANSPARENCY_NOTSUPPORTED ); 1495 rConv.convertAxOrientation( rPropMap, maSize, mnOrientation ); 1496 rConv.convertScrollBar( rPropMap, mnMin, mnMax, mnPosition, mnSmallChange, mnLargeChange, mbAwtModel ); 1497 AxControlModelBase::convertProperties( rPropMap, rConv ); 1498 } 1499 1500 // ============================================================================ 1501 1502 AxTabStripModel::AxTabStripModel() : 1503 AxFontDataModel( false ), // no support for alignment properties 1504 mnBackColor( AX_SYSCOLOR_BUTTONFACE ), 1505 mnTextColor( AX_SYSCOLOR_BUTTONTEXT ), 1506 mnFlags( AX_TABSTRIP_DEFFLAGS ), 1507 mnSelectedTab( -1 ), 1508 mnTabStyle( AX_TABSTRIP_TABS ), 1509 mnTabFlagCount( 0 ) 1510 { 1511 } 1512 1513 bool AxTabStripModel::importBinaryModel( BinaryInputStream& rInStrm ) 1514 { 1515 AxBinaryPropertyReader aReader( rInStrm ); 1516 aReader.readIntProperty< sal_Int32 >( mnSelectedTab ); 1517 aReader.readIntProperty< sal_uInt32 >( mnBackColor ); 1518 aReader.readIntProperty< sal_uInt32 >( mnTextColor ); 1519 aReader.skipUndefinedProperty(); 1520 aReader.readPairProperty( maSize ); 1521 aReader.readStringArrayProperty( maCaptions ); 1522 aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer 1523 aReader.skipUndefinedProperty(); 1524 aReader.skipIntProperty< sal_uInt32 >(); // tab orientation 1525 aReader.readIntProperty< sal_uInt32 >( mnTabStyle ); 1526 aReader.skipBoolProperty(); // multiple rows 1527 aReader.skipIntProperty< sal_uInt32 >(); // fixed width 1528 aReader.skipIntProperty< sal_uInt32 >(); // fixed height 1529 aReader.skipBoolProperty(); // tooltips 1530 aReader.skipUndefinedProperty(); 1531 aReader.skipStringArrayProperty(); // tooltip strings 1532 aReader.skipUndefinedProperty(); 1533 aReader.skipStringArrayProperty(); // tab names 1534 aReader.readIntProperty< sal_uInt32 >( mnFlags ); 1535 aReader.skipBoolProperty(); // new version 1536 aReader.skipIntProperty< sal_uInt32 >(); // tabs allocated 1537 aReader.skipStringArrayProperty(); // tags 1538 aReader.readIntProperty< sal_uInt32 >( mnTabFlagCount ); 1539 aReader.skipStringArrayProperty(); // accelerators 1540 aReader.skipPictureProperty(); // mouse icon 1541 return aReader.finalizeImport() && AxFontDataModel::importBinaryModel( rInStrm ); 1542 } 1543 1544 ApiControlType AxTabStripModel::getControlType() const 1545 { 1546 return API_CONTROL_TABSTRIP; 1547 } 1548 1549 void AxTabStripModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const 1550 { 1551 rPropMap.setProperty( PROP_Decoration, mnTabStyle != AX_TABSTRIP_NONE ); 1552 rPropMap.setProperty( PROP_MultiPageValue, mnSelectedTab ); 1553 rConv.convertColor( rPropMap, PROP_BackgroundColor, mnBackColor ); 1554 AxFontDataModel::convertProperties( rPropMap, rConv ); 1555 } 1556 1557 OUString AxTabStripModel::getCaption( sal_Int32 nIndex ) const 1558 { 1559 return ContainerHelper::getVectorElement( maCaptions, nIndex, OUString() ); 1560 } 1561 1562 // ============================================================================ 1563 1564 AxContainerModelBase::AxContainerModelBase( bool bFontSupport ) : 1565 AxFontDataModel( false ), // no support for alignment properties 1566 maLogicalSize( AX_CONTAINER_DEFWIDTH, AX_CONTAINER_DEFHEIGHT ), 1567 maScrollPos( 0, 0 ), 1568 mnBackColor( AX_SYSCOLOR_BUTTONFACE ), 1569 mnTextColor( AX_SYSCOLOR_BUTTONTEXT ), 1570 mnFlags( AX_CONTAINER_DEFFLAGS ), 1571 mnBorderColor( AX_SYSCOLOR_BUTTONTEXT ), 1572 mnBorderStyle( AX_BORDERSTYLE_NONE ), 1573 mnScrollBars( AX_CONTAINER_SCR_NONE ), 1574 mnCycleType( AX_CONTAINER_CYCLEALL ), 1575 mnSpecialEffect( AX_SPECIALEFFECT_FLAT ), 1576 mnPicAlign( AX_PICALIGN_CENTER ), 1577 mnPicSizeMode( AX_PICSIZE_CLIP ), 1578 mbPicTiling( false ), 1579 mbFontSupport( bFontSupport ) 1580 { 1581 setAwtModelMode(); 1582 // different default size for frame 1583 maSize = AxPairData( AX_CONTAINER_DEFWIDTH, AX_CONTAINER_DEFHEIGHT ); 1584 } 1585 1586 void AxContainerModelBase::importProperty( sal_Int32 nPropId, const OUString& rValue ) 1587 { 1588 if( nPropId == XML_Caption ) 1589 maCaption = rValue; 1590 } 1591 1592 bool AxContainerModelBase::importBinaryModel( BinaryInputStream& rInStrm ) 1593 { 1594 AxBinaryPropertyReader aReader( rInStrm ); 1595 aReader.skipUndefinedProperty(); 1596 aReader.readIntProperty< sal_uInt32 >( mnBackColor ); 1597 aReader.readIntProperty< sal_uInt32 >( mnTextColor ); 1598 aReader.skipIntProperty< sal_uInt32 >(); // next availbale control ID 1599 aReader.skipUndefinedProperty(); 1600 aReader.skipUndefinedProperty(); 1601 aReader.readIntProperty< sal_uInt32 >( mnFlags ); 1602 aReader.readIntProperty< sal_uInt8 >( mnBorderStyle ); 1603 aReader.skipIntProperty< sal_uInt8 >(); // mouse pointer 1604 aReader.readIntProperty< sal_uInt8 >( mnScrollBars ); 1605 aReader.readPairProperty( maSize ); 1606 aReader.readPairProperty( maLogicalSize ); 1607 aReader.readPairProperty( maScrollPos ); 1608 aReader.skipIntProperty< sal_uInt32 >(); // number of control groups 1609 aReader.skipUndefinedProperty(); 1610 aReader.skipPictureProperty(); // mouse icon 1611 aReader.readIntProperty< sal_uInt8 >( mnCycleType ); 1612 aReader.readIntProperty< sal_uInt8 >( mnSpecialEffect ); 1613 aReader.readIntProperty< sal_uInt32 >( mnBorderColor ); 1614 aReader.readStringProperty( maCaption ); 1615 aReader.readFontProperty( maFontData ); 1616 aReader.readPictureProperty( maPictureData ); 1617 aReader.skipIntProperty< sal_Int32 >(); // zoom 1618 aReader.readIntProperty< sal_uInt8 >( mnPicAlign ); 1619 aReader.readBoolProperty( mbPicTiling ); 1620 aReader.readIntProperty< sal_uInt8 >( mnPicSizeMode ); 1621 aReader.skipIntProperty< sal_uInt32 >(); // shape cookie 1622 aReader.skipIntProperty< sal_uInt32 >(); // draw buffer size 1623 return aReader.finalizeImport(); 1624 } 1625 1626 void AxContainerModelBase::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const 1627 { 1628 if( mbFontSupport ) 1629 { 1630 rConv.convertColor( rPropMap, PROP_TextColor, mnTextColor ); 1631 AxFontDataModel::convertProperties( rPropMap, rConv ); 1632 } 1633 } 1634 1635 bool AxContainerModelBase::importClassTable( BinaryInputStream& rInStrm, AxClassTable& orClassTable ) 1636 { 1637 bool bValid = true; 1638 orClassTable.clear(); 1639 if( !getFlag( mnFlags, AX_CONTAINER_NOCLASSTABLE ) ) 1640 { 1641 sal_uInt16 nCount = rInStrm.readuInt16(); 1642 for( sal_uInt16 nIndex = 0; bValid && (nIndex < nCount); ++nIndex ) 1643 { 1644 orClassTable.push_back( OUString() ); 1645 AxBinaryPropertyReader aReader( rInStrm ); 1646 aReader.readGuidProperty( orClassTable.back() ); 1647 aReader.skipGuidProperty(); // source interface GUID 1648 aReader.skipUndefinedProperty(); 1649 aReader.skipGuidProperty(); // default interface GUID 1650 aReader.skipIntProperty< sal_uInt32 >(); // class table and var flags 1651 aReader.skipIntProperty< sal_uInt32 >(); // method count 1652 aReader.skipIntProperty< sal_Int32 >(); // IDispatch identifier for linked cell access 1653 aReader.skipIntProperty< sal_uInt16 >(); // get function index for linked cell access 1654 aReader.skipIntProperty< sal_uInt16 >(); // put function index for linked cell access 1655 aReader.skipIntProperty< sal_uInt16 >(); // linked cell access property type 1656 aReader.skipIntProperty< sal_uInt16 >(); // get function index of value 1657 aReader.skipIntProperty< sal_uInt16 >(); // put function index of value 1658 aReader.skipIntProperty< sal_uInt16 >(); // value type 1659 aReader.skipIntProperty< sal_Int32 >(); // IDispatch identifier for source range access 1660 aReader.skipIntProperty< sal_uInt16 >(); // get function index for source range access 1661 bValid = aReader.finalizeImport(); 1662 } 1663 } 1664 return bValid; 1665 } 1666 1667 // ============================================================================ 1668 1669 AxFrameModel::AxFrameModel() : 1670 AxContainerModelBase( true ) 1671 { 1672 } 1673 1674 ApiControlType AxFrameModel::getControlType() const 1675 { 1676 return API_CONTROL_GROUPBOX; 1677 } 1678 1679 void AxFrameModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const 1680 { 1681 rPropMap.setProperty( PROP_Label, maCaption ); 1682 rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_CONTAINER_ENABLED ) ); 1683 AxContainerModelBase::convertProperties( rPropMap, rConv ); 1684 } 1685 1686 // ============================================================================ 1687 1688 AxFormPageModel::AxFormPageModel() 1689 { 1690 } 1691 1692 ApiControlType AxFormPageModel::getControlType() const 1693 { 1694 return API_CONTROL_PAGE; 1695 } 1696 1697 void AxFormPageModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const 1698 { 1699 rPropMap.setProperty( PROP_Title, maCaption ); 1700 rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_CONTAINER_ENABLED ) ); 1701 rConv.convertColor( rPropMap, PROP_BackgroundColor, mnBackColor ); 1702 AxContainerModelBase::convertProperties( rPropMap, rConv ); 1703 } 1704 1705 // ============================================================================ 1706 1707 AxMultiPageModel::AxMultiPageModel() 1708 { 1709 } 1710 1711 ApiControlType AxMultiPageModel::getControlType() const 1712 { 1713 return API_CONTROL_MULTIPAGE; 1714 } 1715 1716 void AxMultiPageModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const 1717 { 1718 rPropMap.setProperty( PROP_Enabled, getFlag( mnFlags, AX_CONTAINER_ENABLED ) ); 1719 if( mxTabStrip.get() ) 1720 mxTabStrip->convertProperties( rPropMap, rConv ); 1721 AxContainerModelBase::convertProperties( rPropMap, rConv ); 1722 } 1723 1724 void AxMultiPageModel::setTabStripModel( const AxTabStripModelRef& rxTabStrip ) 1725 { 1726 mxTabStrip = rxTabStrip; 1727 } 1728 1729 // ============================================================================ 1730 1731 AxUserFormModel::AxUserFormModel() 1732 { 1733 } 1734 1735 ApiControlType AxUserFormModel::getControlType() const 1736 { 1737 return API_CONTROL_DIALOG; 1738 } 1739 1740 void AxUserFormModel::convertProperties( PropertyMap& rPropMap, const ControlConverter& rConv ) const 1741 { 1742 rPropMap.setProperty( PROP_Title, maCaption ); 1743 rConv.convertColor( rPropMap, PROP_BackgroundColor, mnBackColor ); 1744 AxContainerModelBase::convertProperties( rPropMap, rConv ); 1745 } 1746 1747 // ============================================================================ 1748 1749 EmbeddedControl::EmbeddedControl( const OUString& rName ) : 1750 maName( rName ) 1751 { 1752 } 1753 1754 EmbeddedControl::~EmbeddedControl() 1755 { 1756 } 1757 1758 ControlModelBase* EmbeddedControl::createModelFromGuid( const OUString& rClassId ) 1759 { 1760 OUString aClassId = rClassId.toAsciiUpperCase(); 1761 1762 if( aClassId.equalsAscii( AX_GUID_COMMANDBUTTON ) ) return &createModel< AxCommandButtonModel >(); 1763 if( aClassId.equalsAscii( AX_GUID_LABEL ) ) return &createModel< AxLabelModel >(); 1764 if( aClassId.equalsAscii( AX_GUID_IMAGE ) ) return &createModel< AxImageModel >(); 1765 if( aClassId.equalsAscii( AX_GUID_TOGGLEBUTTON ) ) return &createModel< AxToggleButtonModel >(); 1766 if( aClassId.equalsAscii( AX_GUID_CHECKBOX ) ) return &createModel< AxCheckBoxModel >(); 1767 if( aClassId.equalsAscii( AX_GUID_OPTIONBUTTON ) ) return &createModel< AxOptionButtonModel >(); 1768 if( aClassId.equalsAscii( AX_GUID_TEXTBOX ) ) return &createModel< AxTextBoxModel >(); 1769 if( aClassId.equalsAscii( AX_GUID_LISTBOX ) ) return &createModel< AxListBoxModel >(); 1770 if( aClassId.equalsAscii( AX_GUID_COMBOBOX ) ) return &createModel< AxComboBoxModel >(); 1771 if( aClassId.equalsAscii( AX_GUID_SPINBUTTON ) ) return &createModel< AxSpinButtonModel >(); 1772 if( aClassId.equalsAscii( AX_GUID_SCROLLBAR ) ) return &createModel< AxScrollBarModel >(); 1773 if( aClassId.equalsAscii( AX_GUID_FRAME ) ) return &createModel< AxFrameModel >(); 1774 if( aClassId.equalsAscii( COMCTL_GUID_SCROLLBAR_60 ) ) return &createModel< ComCtlScrollBarModel >( COMCTL_VERSION_60 ); 1775 1776 mxModel.reset(); 1777 return 0; 1778 } 1779 1780 OUString EmbeddedControl::getServiceName() const 1781 { 1782 return mxModel.get() ? mxModel->getServiceName() : OUString(); 1783 } 1784 1785 bool EmbeddedControl::convertProperties( const Reference< XControlModel >& rxCtrlModel, const ControlConverter& rConv ) const 1786 { 1787 if( mxModel.get() && rxCtrlModel.is() && (maName.getLength() > 0) ) 1788 { 1789 PropertyMap aPropMap; 1790 aPropMap.setProperty( PROP_Name, maName ); 1791 mxModel->convertProperties( aPropMap, rConv ); 1792 PropertySet aPropSet( rxCtrlModel ); 1793 aPropSet.setProperties( aPropMap ); 1794 return true; 1795 } 1796 return false; 1797 } 1798 1799 // ============================================================================ 1800 1801 EmbeddedForm::EmbeddedForm( const Reference< XModel >& rxDocModel, 1802 const Reference< XDrawPage >& rxDrawPage, const GraphicHelper& rGraphicHelper, bool bDefaultColorBgr ) : 1803 maControlConv( rxDocModel, rGraphicHelper, bDefaultColorBgr ), 1804 mxModelFactory( rxDocModel, UNO_QUERY ), 1805 mxFormsSupp( rxDrawPage, UNO_QUERY ) 1806 { 1807 OSL_ENSURE( mxModelFactory.is(), "EmbeddedForm::EmbeddedForm - missing service factory" ); 1808 } 1809 1810 Reference< XControlModel > EmbeddedForm::convertAndInsert( const EmbeddedControl& rControl, sal_Int32& rnCtrlIndex ) 1811 { 1812 if( mxModelFactory.is() && rControl.hasModel() ) try 1813 { 1814 // create the UNO control model 1815 OUString aServiceName = rControl.getServiceName(); 1816 Reference< XFormComponent > xFormComp( mxModelFactory->createInstance( aServiceName ), UNO_QUERY_THROW ); 1817 Reference< XControlModel > xCtrlModel( xFormComp, UNO_QUERY_THROW ); 1818 1819 // insert the control into the form 1820 Reference< XIndexContainer > xFormIC( createXForm(), UNO_SET_THROW ); 1821 rnCtrlIndex = xFormIC->getCount(); 1822 xFormIC->insertByIndex( rnCtrlIndex, Any( xFormComp ) ); 1823 1824 // convert the control properties 1825 if( rControl.convertProperties( xCtrlModel, maControlConv ) ) 1826 return xCtrlModel; 1827 } 1828 catch( Exception& ) 1829 { 1830 } 1831 return Reference< XControlModel >(); 1832 } 1833 1834 Reference< XIndexContainer > EmbeddedForm::createXForm() 1835 { 1836 if( mxFormsSupp.is() ) 1837 { 1838 try 1839 { 1840 Reference< XNameContainer > xFormsNC( mxFormsSupp->getForms(), UNO_SET_THROW ); 1841 OUString aFormName = CREATE_OUSTRING( "Standard" ); 1842 if( xFormsNC->hasByName( aFormName ) ) 1843 { 1844 mxFormIC.set( xFormsNC->getByName( aFormName ), UNO_QUERY_THROW ); 1845 } 1846 else if( mxModelFactory.is() ) 1847 { 1848 Reference< XForm > xForm( mxModelFactory->createInstance( CREATE_OUSTRING( "com.sun.star.form.component.Form" ) ), UNO_QUERY_THROW ); 1849 xFormsNC->insertByName( aFormName, Any( xForm ) ); 1850 mxFormIC.set( xForm, UNO_QUERY_THROW ); 1851 } 1852 } 1853 catch( Exception& ) 1854 { 1855 } 1856 // always clear the forms supplier to not try to create the form again 1857 mxFormsSupp.clear(); 1858 } 1859 return mxFormIC; 1860 } 1861 1862 // ============================================================================ 1863 1864 } // namespace ole 1865 } // namespace oox 1866