1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_toolkit.hxx" 26 #include <com/sun/star/beans/PropertyState.hpp> 27 #include <com/sun/star/beans/PropertyAttribute.hpp> 28 #include <com/sun/star/awt/FontDescriptor.hpp> 29 #include <com/sun/star/awt/FontWidth.hpp> 30 #include <com/sun/star/awt/FontWeight.hpp> 31 #include <com/sun/star/awt/FontSlant.hpp> 32 #include <com/sun/star/awt/MouseWheelBehavior.hpp> 33 #include <com/sun/star/graphic/XGraphicProvider.hpp> 34 #include <com/sun/star/awt/XDevice.hpp> 35 #include <com/sun/star/text/WritingMode2.hpp> 36 #include <com/sun/star/io/XMarkableStream.hpp> 37 #include <toolkit/controls/unocontrolmodel.hxx> 38 #include <toolkit/helper/macros.hxx> 39 #include <cppuhelper/typeprovider.hxx> 40 #include <rtl/memory.h> 41 #include <rtl/uuid.h> 42 #include <tools/diagnose_ex.h> 43 #include <tools/string.hxx> 44 #include <tools/table.hxx> 45 #include <tools/date.hxx> 46 #include <tools/time.hxx> 47 #include <tools/urlobj.hxx> 48 #include <tools/debug.hxx> 49 #include <toolkit/helper/property.hxx> 50 #include <toolkit/helper/vclunohelper.hxx> 51 #include <toolkit/helper/emptyfontdescriptor.hxx> 52 #include <com/sun/star/lang/Locale.hpp> 53 #include <unotools/localedatawrapper.hxx> 54 #include <unotools/configmgr.hxx> 55 #include <comphelper/processfactory.hxx> 56 #include <comphelper/sequence.hxx> 57 #include <comphelper/extract.hxx> 58 #include <vcl/svapp.hxx> 59 #include <uno/data.h> 60 61 #include <memory> 62 63 using namespace ::com::sun::star; 64 using namespace ::com::sun::star::uno; 65 using namespace ::com::sun::star::lang; 66 using namespace ::com::sun::star::i18n; 67 using ::com::sun::star::awt::FontDescriptor; 68 69 struct ImplControlProperty 70 { 71 private: 72 sal_uInt16 nId; 73 ::com::sun::star::uno::Any aValue; 74 75 public: 76 ImplControlProperty( const ImplControlProperty& rProp ) : aValue( rProp.aValue ) 77 { 78 nId = rProp.nId; 79 } 80 81 ImplControlProperty( sal_uInt16 nT ) 82 { 83 nId = nT; 84 } 85 86 ImplControlProperty( sal_uInt16 nT, const ::com::sun::star::uno::Any& rValue ) : aValue( rValue ) 87 { 88 nId = nT; 89 } 90 91 sal_uInt16 GetId() const { return nId; } 92 const ::com::sun::star::uno::Any& GetValue() const { return aValue; } 93 void SetValue( const ::com::sun::star::uno::Any& rValue ) { aValue = rValue; } 94 }; 95 96 DECLARE_TABLE( ImplPropertyTable, ImplControlProperty* ) 97 98 #define UNOCONTROL_STREAMVERSION (short)2 99 100 static void lcl_ImplMergeFontProperty( FontDescriptor& rFD, sal_uInt16 nPropId, const Any& rValue ) 101 { 102 // some props are defined with other types than the matching FontDescriptor members have 103 // (e.g. FontWidth, FontSlant) 104 // 78474 - 09/19/2000 - FS 105 float nExtractFloat = 0; 106 sal_Int16 nExtractShort = 0; 107 108 switch ( nPropId ) 109 { 110 case BASEPROPERTY_FONTDESCRIPTORPART_NAME: rValue >>= rFD.Name; 111 break; 112 case BASEPROPERTY_FONTDESCRIPTORPART_STYLENAME: rValue >>= rFD.StyleName; 113 break; 114 case BASEPROPERTY_FONTDESCRIPTORPART_FAMILY: rValue >>= rFD.Family; 115 break; 116 case BASEPROPERTY_FONTDESCRIPTORPART_CHARSET: rValue >>= rFD.CharSet; 117 break; 118 case BASEPROPERTY_FONTDESCRIPTORPART_HEIGHT: rValue >>= nExtractFloat; rFD.Height = (sal_Int16)nExtractFloat; 119 break; 120 case BASEPROPERTY_FONTDESCRIPTORPART_WEIGHT: rValue >>= rFD.Weight; 121 break; 122 case BASEPROPERTY_FONTDESCRIPTORPART_SLANT: if ( rValue >>= nExtractShort ) 123 rFD.Slant = (::com::sun::star::awt::FontSlant)nExtractShort; 124 else 125 rValue >>= rFD.Slant; 126 break; 127 case BASEPROPERTY_FONTDESCRIPTORPART_UNDERLINE: rValue >>= rFD.Underline; 128 break; 129 case BASEPROPERTY_FONTDESCRIPTORPART_STRIKEOUT: rValue >>= rFD.Strikeout; 130 break; 131 case BASEPROPERTY_FONTDESCRIPTORPART_WIDTH: rValue >>= rFD.Width; 132 break; 133 case BASEPROPERTY_FONTDESCRIPTORPART_PITCH: rValue >>= rFD.Pitch; 134 break; 135 case BASEPROPERTY_FONTDESCRIPTORPART_CHARWIDTH: rValue >>= rFD.CharacterWidth; 136 break; 137 case BASEPROPERTY_FONTDESCRIPTORPART_ORIENTATION: rValue >>= rFD.Orientation; 138 break; 139 case BASEPROPERTY_FONTDESCRIPTORPART_KERNING: rValue >>= rFD.Kerning; 140 break; 141 case BASEPROPERTY_FONTDESCRIPTORPART_WORDLINEMODE: rValue >>= rFD.WordLineMode; 142 break; 143 case BASEPROPERTY_FONTDESCRIPTORPART_TYPE: rValue >>= rFD.Type; 144 break; 145 default: DBG_ERROR( "FontProperty?!" ); 146 } 147 } 148 149 // ---------------------------------------------------- 150 // class UnoControlModel 151 // ---------------------------------------------------- 152 UnoControlModel::UnoControlModel() 153 :UnoControlModel_Base() 154 ,MutexAndBroadcastHelper() 155 ,OPropertySetHelper( BrdcstHelper ) 156 ,maDisposeListeners( *this ) 157 ,maContext( ::comphelper::getProcessServiceFactory() ) 158 { 159 OSL_ENSURE( false, "UnoControlModel::UnoControlModel: not implemented. Well, not really." ); 160 // just implemented to let the various FooImplInheritanceHelper compile, you should use the 161 // version taking a service factory 162 mpData = new ImplPropertyTable; 163 } 164 165 UnoControlModel::UnoControlModel( const Reference< XMultiServiceFactory >& i_factory ) 166 :UnoControlModel_Base() 167 ,MutexAndBroadcastHelper() 168 ,OPropertySetHelper( BrdcstHelper ) 169 ,maDisposeListeners( *this ) 170 ,maContext( i_factory ) 171 { 172 // Die Properties muessen vom Model in die Tabelle gestopft werden, 173 // nur vorhandene Properties sind gueltige Properties, auch wenn VOID. 174 mpData = new ImplPropertyTable; 175 } 176 177 UnoControlModel::UnoControlModel( const UnoControlModel& rModel ) 178 : UnoControlModel_Base() 179 , MutexAndBroadcastHelper() 180 , OPropertySetHelper( BrdcstHelper ) 181 , maDisposeListeners( *this ) 182 , maContext( rModel.maContext ) 183 { 184 mpData = new ImplPropertyTable; 185 186 for ( sal_uInt32 n = rModel.mpData->Count(); n; ) 187 { 188 ImplControlProperty* pProp = rModel.mpData->GetObject( --n ); 189 ImplControlProperty* pNew = new ImplControlProperty( *pProp ); 190 mpData->Insert( pNew->GetId(), pNew ); 191 } 192 } 193 194 UnoControlModel::~UnoControlModel() 195 { 196 for ( sal_uInt32 n = mpData->Count(); n; ) 197 delete mpData->GetObject( --n ); 198 delete mpData; 199 } 200 201 UnoControlModel* UnoControlModel::Clone() const 202 { 203 DBG_ERROR( "UnoControlModel::Clone() ?!" ); 204 return NULL; 205 } 206 207 ::com::sun::star::uno::Sequence<sal_Int32> UnoControlModel::ImplGetPropertyIds() const 208 { 209 sal_uInt32 nIDs = mpData->Count(); 210 ::com::sun::star::uno::Sequence<sal_Int32> aIDs( nIDs ); 211 sal_Int32* pIDs = aIDs.getArray(); 212 for ( sal_uInt32 n = 0; n < nIDs; n++ ) 213 pIDs[n] = mpData->GetObjectKey( n ); 214 return aIDs; 215 } 216 217 sal_Bool UnoControlModel::ImplHasProperty( sal_uInt16 nPropId ) const 218 { 219 if ( ( nPropId >= BASEPROPERTY_FONTDESCRIPTORPART_START ) && ( nPropId <= BASEPROPERTY_FONTDESCRIPTORPART_END ) ) 220 nPropId = BASEPROPERTY_FONTDESCRIPTOR; 221 222 return mpData->Get( nPropId ) ? sal_True : sal_False; 223 } 224 225 ::com::sun::star::uno::Any UnoControlModel::ImplGetDefaultValue( sal_uInt16 nPropId ) const 226 { 227 ::com::sun::star::uno::Any aDefault; 228 229 if ( 230 (nPropId == BASEPROPERTY_FONTDESCRIPTOR) || 231 ( 232 (nPropId >= BASEPROPERTY_FONTDESCRIPTORPART_START) && 233 (nPropId <= BASEPROPERTY_FONTDESCRIPTORPART_END) 234 ) 235 ) 236 { 237 EmptyFontDescriptor aFD; 238 switch ( nPropId ) 239 { 240 case BASEPROPERTY_FONTDESCRIPTOR: aDefault <<= aFD; break; 241 case BASEPROPERTY_FONTDESCRIPTORPART_NAME: aDefault <<= aFD.Name; break; 242 case BASEPROPERTY_FONTDESCRIPTORPART_STYLENAME: aDefault <<= aFD.StyleName; break; 243 case BASEPROPERTY_FONTDESCRIPTORPART_FAMILY: aDefault <<= aFD.Family; break; 244 case BASEPROPERTY_FONTDESCRIPTORPART_CHARSET: aDefault <<= aFD.CharSet; break; 245 case BASEPROPERTY_FONTDESCRIPTORPART_HEIGHT: aDefault <<= (float)aFD.Height; break; 246 case BASEPROPERTY_FONTDESCRIPTORPART_WEIGHT: aDefault <<= aFD.Weight; break; 247 case BASEPROPERTY_FONTDESCRIPTORPART_SLANT: aDefault <<= (sal_Int16)aFD.Slant; break; 248 case BASEPROPERTY_FONTDESCRIPTORPART_UNDERLINE: aDefault <<= aFD.Underline; break; 249 case BASEPROPERTY_FONTDESCRIPTORPART_STRIKEOUT: aDefault <<= aFD.Strikeout; break; 250 case BASEPROPERTY_FONTDESCRIPTORPART_WIDTH: aDefault <<= aFD.Width; break; 251 case BASEPROPERTY_FONTDESCRIPTORPART_PITCH: aDefault <<= aFD.Pitch; break; 252 case BASEPROPERTY_FONTDESCRIPTORPART_CHARWIDTH: aDefault <<= aFD.CharacterWidth; break; 253 case BASEPROPERTY_FONTDESCRIPTORPART_ORIENTATION: aDefault <<= aFD.Orientation; break; 254 case BASEPROPERTY_FONTDESCRIPTORPART_KERNING: aDefault <<= aFD.Kerning; break; 255 case BASEPROPERTY_FONTDESCRIPTORPART_WORDLINEMODE: aDefault <<= aFD.WordLineMode; break; 256 case BASEPROPERTY_FONTDESCRIPTORPART_TYPE: aDefault <<= aFD.Type; break; 257 default: DBG_ERROR( "FontProperty?!" ); 258 } 259 } 260 else 261 { 262 switch ( nPropId ) 263 { 264 case BASEPROPERTY_GRAPHIC: 265 aDefault <<= Reference< graphic::XGraphic >(); 266 break; 267 268 case BASEPROPERTY_REFERENCE_DEVICE: 269 aDefault <<= Reference< awt::XDevice >(); 270 break; 271 272 case BASEPROPERTY_ITEM_SEPARATOR_POS: 273 case BASEPROPERTY_VERTICALALIGN: 274 case BASEPROPERTY_BORDERCOLOR: 275 case BASEPROPERTY_SYMBOL_COLOR: 276 case BASEPROPERTY_TABSTOP: 277 case BASEPROPERTY_TEXTCOLOR: 278 case BASEPROPERTY_TEXTLINECOLOR: 279 case BASEPROPERTY_DATE: 280 case BASEPROPERTY_DATESHOWCENTURY: 281 case BASEPROPERTY_TIME: 282 case BASEPROPERTY_VALUE_DOUBLE: 283 case BASEPROPERTY_PROGRESSVALUE: 284 case BASEPROPERTY_SCROLLVALUE: 285 case BASEPROPERTY_VISIBLESIZE: 286 case BASEPROPERTY_BACKGROUNDCOLOR: 287 case BASEPROPERTY_FILLCOLOR: break; // Void 288 289 case BASEPROPERTY_FONTRELIEF: 290 case BASEPROPERTY_FONTEMPHASISMARK: 291 case BASEPROPERTY_MAXTEXTLEN: 292 case BASEPROPERTY_STATE: 293 case BASEPROPERTY_EXTDATEFORMAT: 294 case BASEPROPERTY_EXTTIMEFORMAT: 295 case BASEPROPERTY_ECHOCHAR: aDefault <<= (sal_Int16) 0; break; 296 case BASEPROPERTY_BORDER: aDefault <<= (sal_Int16) 1; break; 297 case BASEPROPERTY_DECIMALACCURACY: aDefault <<= (sal_Int16) 2; break; 298 case BASEPROPERTY_LINECOUNT: aDefault <<= (sal_Int16) 5; break; 299 case BASEPROPERTY_ALIGN: aDefault <<= (sal_Int16) PROPERTY_ALIGN_LEFT; break; 300 case BASEPROPERTY_IMAGEALIGN: aDefault <<= (sal_Int16) 1 /*ImageAlign::TOP*/; break; 301 case BASEPROPERTY_IMAGEPOSITION: aDefault <<= (sal_Int16) 12 /*ImagePosition::Centered*/; break; 302 case BASEPROPERTY_PUSHBUTTONTYPE: aDefault <<= (sal_Int16) 0 /*PushButtonType::STANDARD*/; break; 303 case BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR:aDefault <<= (sal_Int16) awt::MouseWheelBehavior::SCROLL_FOCUS_ONLY; break; 304 305 case BASEPROPERTY_DATEMAX: aDefault <<= (sal_Int32) Date( 31, 12, 2200 ).GetDate(); break; 306 case BASEPROPERTY_DATEMIN: aDefault <<= (sal_Int32) Date( 1, 1, 1900 ).GetDate(); break; 307 case BASEPROPERTY_TIMEMAX: aDefault <<= (sal_Int32) Time( 23, 59 ).GetTime(); break; 308 case BASEPROPERTY_TIMEMIN: aDefault <<= (sal_Int32) 0; break; 309 case BASEPROPERTY_VALUEMAX_DOUBLE: aDefault <<= (double) 1000000; break; 310 case BASEPROPERTY_VALUEMIN_DOUBLE: aDefault <<= (double) -1000000; break; 311 case BASEPROPERTY_VALUESTEP_DOUBLE: aDefault <<= (double ) 1; break; 312 case BASEPROPERTY_PROGRESSVALUE_MAX: aDefault <<= (sal_Int32) 100; break; 313 case BASEPROPERTY_PROGRESSVALUE_MIN: aDefault <<= (sal_Int32) 0; break; 314 case BASEPROPERTY_SCROLLVALUE_MAX: aDefault <<= (sal_Int32) 100; break; 315 case BASEPROPERTY_SCROLLVALUE_MIN: aDefault <<= (sal_Int32) 0; break; 316 case BASEPROPERTY_LINEINCREMENT: aDefault <<= (sal_Int32) 1; break; 317 case BASEPROPERTY_BLOCKINCREMENT: aDefault <<= (sal_Int32) 10; break; 318 case BASEPROPERTY_ORIENTATION: aDefault <<= (sal_Int32) 0; break; 319 case BASEPROPERTY_SPINVALUE: aDefault <<= (sal_Int32) 0; break; 320 case BASEPROPERTY_SPININCREMENT: aDefault <<= (sal_Int32) 1; break; 321 case BASEPROPERTY_SPINVALUE_MIN: aDefault <<= (sal_Int32) 0; break; 322 case BASEPROPERTY_SPINVALUE_MAX: aDefault <<= (sal_Int32) 100; break; 323 case BASEPROPERTY_REPEAT_DELAY: aDefault <<= (sal_Int32) 50; break; // 50 milliseconds 324 case BASEPROPERTY_DEFAULTCONTROL: aDefault <<= ((UnoControlModel*)this)->getServiceName(); break; 325 326 case BASEPROPERTY_AUTOHSCROLL: 327 case BASEPROPERTY_AUTOVSCROLL: 328 case BASEPROPERTY_MOVEABLE: 329 case BASEPROPERTY_CLOSEABLE: 330 case BASEPROPERTY_SIZEABLE: 331 case BASEPROPERTY_HSCROLL: 332 case BASEPROPERTY_DEFAULTBUTTON: 333 case BASEPROPERTY_MULTILINE: 334 case BASEPROPERTY_MULTISELECTION: 335 case BASEPROPERTY_TRISTATE: 336 case BASEPROPERTY_DROPDOWN: 337 case BASEPROPERTY_SPIN: 338 case BASEPROPERTY_READONLY: 339 case BASEPROPERTY_VSCROLL: 340 case BASEPROPERTY_NUMSHOWTHOUSANDSEP: 341 case BASEPROPERTY_STRICTFORMAT: 342 case BASEPROPERTY_REPEAT: 343 case BASEPROPERTY_PAINTTRANSPARENT: 344 case BASEPROPERTY_DESKTOP_AS_PARENT: 345 case BASEPROPERTY_HARDLINEBREAKS: 346 case BASEPROPERTY_NOLABEL: aDefault <<= (sal_Bool) sal_False; break; 347 348 case BASEPROPERTY_MULTISELECTION_SIMPLEMODE: 349 case BASEPROPERTY_HIDEINACTIVESELECTION: 350 case BASEPROPERTY_ENFORCE_FORMAT: 351 case BASEPROPERTY_AUTOCOMPLETE: 352 case BASEPROPERTY_SCALEIMAGE: 353 case BASEPROPERTY_ENABLED: 354 case BASEPROPERTY_PRINTABLE: 355 case BASEPROPERTY_ENABLEVISIBLE: 356 case BASEPROPERTY_DECORATION: aDefault <<= (sal_Bool) sal_True; break; 357 358 case BASEPROPERTY_HELPTEXT: 359 case BASEPROPERTY_HELPURL: 360 case BASEPROPERTY_IMAGEURL: 361 case BASEPROPERTY_DIALOGSOURCEURL: 362 case BASEPROPERTY_EDITMASK: 363 case BASEPROPERTY_LITERALMASK: 364 case BASEPROPERTY_LABEL: 365 case BASEPROPERTY_TITLE: 366 case BASEPROPERTY_TEXT: aDefault <<= ::rtl::OUString(); break; 367 368 case BASEPROPERTY_WRITING_MODE: 369 case BASEPROPERTY_CONTEXT_WRITING_MODE: 370 aDefault <<= text::WritingMode2::CONTEXT; 371 break; 372 373 case BASEPROPERTY_STRINGITEMLIST: 374 { 375 ::com::sun::star::uno::Sequence< ::rtl::OUString> aStringSeq; 376 aDefault <<= aStringSeq; 377 378 } 379 break; 380 case BASEPROPERTY_SELECTEDITEMS: 381 { 382 ::com::sun::star::uno::Sequence<sal_Int16> aINT16Seq; 383 aDefault <<= aINT16Seq; 384 } 385 break; 386 case BASEPROPERTY_CURRENCYSYMBOL: 387 { 388 Any aDefaultCurrency = ::utl::ConfigManager::GetDirectConfigProperty(::utl::ConfigManager::DEFAULTCURRENCY); 389 DBG_ASSERT( TypeClass_STRING == aDefaultCurrency.getValueTypeClass(), "UnoControlModel::ImplGetDefaultValue: invalid currency config value!" ); 390 391 ::rtl::OUString sDefaultCurrency; 392 aDefaultCurrency >>= sDefaultCurrency; 393 394 // extract the bank symbol 395 sal_Int32 nSepPos = sDefaultCurrency.indexOf( '-' ); 396 ::rtl::OUString sBankSymbol; 397 if ( nSepPos >= 0 ) 398 { 399 sBankSymbol = sDefaultCurrency.copy( 0, nSepPos ); 400 sDefaultCurrency = sDefaultCurrency.copy( nSepPos + 1 ); 401 } 402 403 // the remaming is the locale 404 Locale aLocale; 405 nSepPos = sDefaultCurrency.indexOf( '-' ); 406 if ( nSepPos >= 0 ) 407 { 408 aLocale.Language = sDefaultCurrency.copy( 0, nSepPos ); 409 aLocale.Country = sDefaultCurrency.copy( nSepPos + 1 ); 410 } 411 412 LocaleDataWrapper aLocaleInfo( maContext.getLegacyServiceFactory(), aLocale ); 413 if ( !sBankSymbol.getLength() ) 414 sBankSymbol = aLocaleInfo.getCurrBankSymbol(); 415 416 // look for the currency entry (for this language) which has the given bank symbol 417 Sequence< Currency2 > aAllCurrencies = aLocaleInfo.getAllCurrencies(); 418 const Currency2* pAllCurrencies = aAllCurrencies.getConstArray(); 419 const Currency2* pAllCurrenciesEnd = pAllCurrencies + aAllCurrencies.getLength(); 420 421 ::rtl::OUString sCurrencySymbol = aLocaleInfo.getCurrSymbol(); 422 if ( !sBankSymbol.getLength() ) 423 { 424 DBG_ASSERT( pAllCurrencies != pAllCurrenciesEnd, "UnoControlModel::ImplGetDefaultValue: no currencies at all!" ); 425 if ( pAllCurrencies != pAllCurrenciesEnd ) 426 { 427 sBankSymbol = pAllCurrencies->BankSymbol; 428 sCurrencySymbol = pAllCurrencies->Symbol; 429 } 430 } 431 432 if ( sBankSymbol.getLength() ) 433 { 434 bool bLegacy = false; 435 for ( ;pAllCurrencies != pAllCurrenciesEnd; ++pAllCurrencies ) 436 if ( pAllCurrencies->BankSymbol == sBankSymbol ) 437 { 438 sCurrencySymbol = pAllCurrencies->Symbol; 439 if ( pAllCurrencies->LegacyOnly ) 440 bLegacy = true; 441 else 442 break; 443 } 444 DBG_ASSERT( bLegacy || pAllCurrencies != pAllCurrenciesEnd, "UnoControlModel::ImplGetDefaultValue: did not find the given bank symbol!" ); 445 } 446 447 aDefault <<= sCurrencySymbol; 448 } 449 break; 450 451 default: DBG_ERROR( "ImplGetDefaultValue - unknown Property" ); 452 } 453 } 454 455 return aDefault; 456 } 457 458 void UnoControlModel::ImplRegisterProperty( sal_uInt16 nPropId, const ::com::sun::star::uno::Any& rDefault ) 459 { 460 ImplControlProperty* pProp = new ImplControlProperty( nPropId, rDefault ); 461 mpData->Insert( nPropId, pProp ); 462 } 463 464 void UnoControlModel::ImplRegisterProperty( sal_uInt16 nPropId ) 465 { 466 ImplRegisterProperty( nPropId, ImplGetDefaultValue( nPropId ) ); 467 468 if ( nPropId == BASEPROPERTY_FONTDESCRIPTOR ) 469 { 470 // some properties are not included in the FontDescriptor, but everytime 471 // when we have a FontDescriptor we want to have these properties too. 472 // => Easier to register the here, istead everywhere where I register the FontDescriptor... 473 474 ImplRegisterProperty( BASEPROPERTY_TEXTCOLOR ); 475 ImplRegisterProperty( BASEPROPERTY_TEXTLINECOLOR ); 476 ImplRegisterProperty( BASEPROPERTY_FONTRELIEF ); 477 ImplRegisterProperty( BASEPROPERTY_FONTEMPHASISMARK ); 478 } 479 } 480 481 void UnoControlModel::ImplRegisterProperties( const std::list< sal_uInt16 > &rIds ) 482 { 483 std::list< sal_uInt16 >::const_iterator iter; 484 for( iter = rIds.begin(); iter != rIds.end(); iter++) { 485 if( !ImplHasProperty( *iter ) ) 486 ImplRegisterProperty( *iter, ImplGetDefaultValue( *iter ) ); 487 } 488 } 489 490 // ::com::sun::star::uno::XInterface 491 ::com::sun::star::uno::Any UnoControlModel::queryAggregation( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException) 492 { 493 Any aRet = UnoControlModel_Base::queryAggregation( rType ); 494 if ( !aRet.hasValue() ) 495 aRet = ::cppu::OPropertySetHelper::queryInterface( rType ); 496 return aRet; 497 } 498 499 // ::com::sun::star::lang::XUnoTunnel 500 IMPL_XUNOTUNNEL( UnoControlModel ) 501 502 // XInterface 503 IMPLEMENT_FORWARD_REFCOUNT( UnoControlModel, UnoControlModel_Base ) 504 505 // ::com::sun::star::lang::XTypeProvider 506 IMPLEMENT_FORWARD_XTYPEPROVIDER2( UnoControlModel, UnoControlModel_Base, ::cppu::OPropertySetHelper ) 507 508 509 uno::Reference< util::XCloneable > UnoControlModel::createClone() throw(::com::sun::star::uno::RuntimeException) 510 { 511 UnoControlModel* pClone = Clone(); 512 uno::Reference< util::XCloneable > xClone( (::cppu::OWeakObject*) pClone, uno::UNO_QUERY ); 513 return xClone; 514 } 515 516 // ::com::sun::star::lang::XComponent 517 void UnoControlModel::dispose( ) throw(::com::sun::star::uno::RuntimeException) 518 { 519 ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 520 521 ::com::sun::star::lang::EventObject aEvt; 522 aEvt.Source = (::com::sun::star::uno::XAggregation*)(::cppu::OWeakAggObject*)this; 523 maDisposeListeners.disposeAndClear( aEvt ); 524 525 BrdcstHelper.aLC.disposeAndClear( aEvt ); 526 527 // let the property set helper notify our property listeners 528 OPropertySetHelper::disposing(); 529 } 530 531 void UnoControlModel::addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& rxListener ) throw(::com::sun::star::uno::RuntimeException) 532 { 533 ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 534 535 maDisposeListeners.addInterface( rxListener ); 536 } 537 538 void UnoControlModel::removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& rxListener ) throw(::com::sun::star::uno::RuntimeException) 539 { 540 ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 541 542 maDisposeListeners.removeInterface( rxListener ); 543 } 544 545 546 // ::com::sun::star::beans::XPropertyState 547 ::com::sun::star::beans::PropertyState UnoControlModel::getPropertyState( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException) 548 { 549 ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 550 551 sal_uInt16 nPropId = GetPropertyId( PropertyName ); 552 553 ::com::sun::star::uno::Any aValue = getPropertyValue( PropertyName ); 554 ::com::sun::star::uno::Any aDefault = ImplGetDefaultValue( nPropId ); 555 556 return CompareProperties( aValue, aDefault ) ? ::com::sun::star::beans::PropertyState_DEFAULT_VALUE : ::com::sun::star::beans::PropertyState_DIRECT_VALUE; 557 } 558 559 ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyState > UnoControlModel::getPropertyStates( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& PropertyNames ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException) 560 { 561 ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 562 563 sal_uInt32 nNames = PropertyNames.getLength(); 564 const ::rtl::OUString* pNames = PropertyNames.getConstArray(); 565 566 ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyState > aStates( nNames ); 567 ::com::sun::star::beans::PropertyState* pStates = aStates.getArray(); 568 569 for ( sal_uInt32 n = 0; n < nNames; n++ ) 570 pStates[n] = getPropertyState( pNames[n] ); 571 572 return aStates; 573 } 574 575 void UnoControlModel::setPropertyToDefault( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException) 576 { 577 Any aDefaultValue; 578 { 579 ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 580 aDefaultValue = ImplGetDefaultValue( GetPropertyId( PropertyName ) ); 581 } 582 setPropertyValue( PropertyName, aDefaultValue ); 583 } 584 585 ::com::sun::star::uno::Any UnoControlModel::getPropertyDefault( const ::rtl::OUString& rPropertyName ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException) 586 { 587 ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 588 589 return ImplGetDefaultValue( GetPropertyId( rPropertyName ) ); 590 } 591 592 593 // ::com::sun::star::io::XPersistObjec 594 ::rtl::OUString UnoControlModel::getServiceName( ) throw(::com::sun::star::uno::RuntimeException) 595 { 596 ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 597 598 DBG_ERROR( "ServiceName von UnoControlModel ?!" ); 599 return ::rtl::OUString(); 600 } 601 602 void UnoControlModel::write( const ::com::sun::star::uno::Reference< ::com::sun::star::io::XObjectOutputStream >& OutStream ) throw(::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException) 603 { 604 ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 605 606 ::com::sun::star::uno::Reference< ::com::sun::star::io::XMarkableStream > xMark( OutStream, ::com::sun::star::uno::UNO_QUERY ); 607 DBG_ASSERT( xMark.is(), "write: no ::com::sun::star::io::XMarkableStream!" ); 608 609 OutStream->writeShort( UNOCONTROL_STREAMVERSION ); 610 611 ImplPropertyTable aProps; 612 sal_uInt32 i; 613 for ( i = mpData->Count(); i; ) 614 { 615 ImplControlProperty* pProp = mpData->GetObject( --i ); 616 if ( ( ( GetPropertyAttribs( pProp->GetId() ) & ::com::sun::star::beans::PropertyAttribute::TRANSIENT ) == 0 ) 617 && ( getPropertyState( GetPropertyName( pProp->GetId() ) ) != ::com::sun::star::beans::PropertyState_DEFAULT_VALUE ) ) 618 { 619 aProps.Insert( pProp->GetId(), pProp ); 620 } 621 } 622 623 sal_uInt32 nProps = aProps.Count(); 624 625 // FontProperty wegen fehlender Unterscheidung zwischen 5.0 / 5.1 626 // immer im alten Format mitspeichern. 627 OutStream->writeLong( (long) aProps.IsKeyValid( BASEPROPERTY_FONTDESCRIPTOR ) ? ( nProps + 3 ) : nProps ); 628 for ( i = 0; i < nProps; i++ ) 629 { 630 sal_Int32 nPropDataBeginMark = xMark->createMark(); 631 OutStream->writeLong( 0L ); // DataLen 632 633 ImplControlProperty* pProp = aProps.GetObject( i ); 634 OutStream->writeShort( pProp->GetId() ); 635 636 sal_Bool bVoid = pProp->GetValue().getValueType().getTypeClass() == ::com::sun::star::uno::TypeClass_VOID; 637 638 OutStream->writeBoolean( bVoid ); 639 640 if ( !bVoid ) 641 { 642 const ::com::sun::star::uno::Any& rValue = pProp->GetValue(); 643 const ::com::sun::star::uno::Type& rType = rValue.getValueType(); 644 645 if ( rType == ::getBooleanCppuType() ) 646 { 647 sal_Bool b = false; 648 rValue >>= b; 649 OutStream->writeBoolean( b ); 650 } 651 else if ( rType == ::getCppuType((const ::rtl::OUString*)0) ) 652 { 653 ::rtl::OUString aUString; 654 rValue >>= aUString; 655 OutStream->writeUTF( aUString ); 656 } 657 else if ( rType == ::getCppuType((const sal_uInt16*)0) ) 658 { 659 sal_uInt16 n = 0; 660 rValue >>= n; 661 OutStream->writeShort( n ); 662 } 663 else if ( rType == ::getCppuType((const sal_Int16*)0) ) 664 { 665 sal_Int16 n = 0; 666 rValue >>= n; 667 OutStream->writeShort( n ); 668 } 669 else if ( rType == ::getCppuType((const sal_uInt32*)0) ) 670 { 671 sal_uInt32 n = 0; 672 rValue >>= n; 673 OutStream->writeLong( n ); 674 } 675 else if ( rType == ::getCppuType((const sal_Int32*)0) ) 676 { 677 sal_Int32 n = 0; 678 rValue >>= n; 679 OutStream->writeLong( n ); 680 } 681 else if ( rType == ::getCppuType((const double*)0) ) 682 { 683 double n = 0; 684 rValue >>= n; 685 OutStream->writeDouble( n ); 686 } 687 else if ( rType == ::getCppuType((const ::com::sun::star::awt::FontDescriptor*)0) ) 688 { 689 ::com::sun::star::awt::FontDescriptor aFD; 690 rValue >>= aFD; 691 OutStream->writeUTF( aFD.Name ); 692 OutStream->writeShort( aFD.Height ); 693 OutStream->writeShort( aFD.Width ); 694 OutStream->writeUTF( aFD.StyleName ); 695 OutStream->writeShort( aFD.Family ); 696 OutStream->writeShort( aFD.CharSet ); 697 OutStream->writeShort( aFD.Pitch ); 698 OutStream->writeDouble( aFD.CharacterWidth ); 699 OutStream->writeDouble( aFD.Weight ); 700 OutStream->writeShort( 701 sal::static_int_cast< sal_Int16 >(aFD.Slant) ); 702 OutStream->writeShort( aFD.Underline ); 703 OutStream->writeShort( aFD.Strikeout ); 704 OutStream->writeDouble( aFD.Orientation ); 705 OutStream->writeBoolean( aFD.Kerning ); 706 OutStream->writeBoolean( aFD.WordLineMode ); 707 OutStream->writeShort( aFD.Type ); 708 } 709 else if ( rType == ::getCppuType((const ::com::sun::star::uno::Sequence< ::rtl::OUString>*)0 ) ) 710 { 711 ::com::sun::star::uno::Sequence< ::rtl::OUString> aSeq; 712 rValue >>= aSeq; 713 long nEntries = aSeq.getLength(); 714 OutStream->writeLong( nEntries ); 715 for ( long n = 0; n < nEntries; n++ ) 716 OutStream->writeUTF( aSeq.getConstArray()[n] ); 717 } 718 else if ( rType == ::getCppuType((const ::com::sun::star::uno::Sequence<sal_uInt16>*)0 ) ) 719 { 720 ::com::sun::star::uno::Sequence<sal_uInt16> aSeq; 721 rValue >>= aSeq; 722 long nEntries = aSeq.getLength(); 723 OutStream->writeLong( nEntries ); 724 for ( long n = 0; n < nEntries; n++ ) 725 OutStream->writeShort( aSeq.getConstArray()[n] ); 726 } 727 else if ( rType == ::getCppuType((const ::com::sun::star::uno::Sequence<sal_Int16>*)0 ) ) 728 { 729 ::com::sun::star::uno::Sequence<sal_Int16> aSeq; 730 rValue >>= aSeq; 731 long nEntries = aSeq.getLength(); 732 OutStream->writeLong( nEntries ); 733 for ( long n = 0; n < nEntries; n++ ) 734 OutStream->writeShort( aSeq.getConstArray()[n] ); 735 } 736 else if ( rType.getTypeClass() == TypeClass_ENUM ) 737 { 738 sal_Int32 nAsInt = 0; 739 ::cppu::enum2int( nAsInt, rValue ); 740 OutStream->writeLong( nAsInt ); 741 } 742 #if OSL_DEBUG_LEVEL > 0 743 else 744 { 745 ::rtl::OString sMessage( "UnoControlModel::write: don't know how to handle a property of type '" ); 746 ::rtl::OUString sTypeName( rType.getTypeName() ); 747 sMessage += ::rtl::OString( sTypeName.getStr(), sTypeName.getLength(), RTL_TEXTENCODING_ASCII_US ); 748 sMessage += "'.\n(Currently handling property '"; 749 ::rtl::OUString sPropertyName( GetPropertyName( pProp->GetId() ) ); 750 sMessage += ::rtl::OString( sPropertyName.getStr(), sPropertyName.getLength(), osl_getThreadTextEncoding() ); 751 sMessage += "'.)"; 752 DBG_ERROR( sMessage ); 753 } 754 #endif 755 } 756 757 sal_Int32 nPropDataLen = xMark->offsetToMark( nPropDataBeginMark ); 758 xMark->jumpToMark( nPropDataBeginMark ); 759 OutStream->writeLong( nPropDataLen ); 760 xMark->jumpToFurthest(); 761 xMark->deleteMark(nPropDataBeginMark); 762 } 763 764 ImplControlProperty* pProp = aProps.Get( BASEPROPERTY_FONTDESCRIPTOR ); 765 if ( pProp ) 766 { 767 // Solange wir keinen 5.0-Export haben, muss das alte 768 // Format mit rausgeschrieben werden... 769 ::com::sun::star::awt::FontDescriptor aFD; 770 pProp->GetValue() >>= aFD; 771 772 for ( sal_uInt16 n = BASEPROPERTY_FONT_TYPE; n <= BASEPROPERTY_FONT_ATTRIBS; n++ ) 773 { 774 sal_Int32 nPropDataBeginMark = xMark->createMark(); 775 OutStream->writeLong( 0L ); // DataLen 776 OutStream->writeShort( n ); // PropId 777 OutStream->writeBoolean( sal_False ); // Void 778 779 if ( n == BASEPROPERTY_FONT_TYPE ) 780 { 781 OutStream->writeUTF( aFD.Name ); 782 OutStream->writeUTF( aFD.StyleName ); 783 OutStream->writeShort( aFD.Family ); 784 OutStream->writeShort( aFD.CharSet ); 785 OutStream->writeShort( aFD.Pitch ); 786 } 787 else if ( n == BASEPROPERTY_FONT_SIZE ) 788 { 789 OutStream->writeLong( aFD.Width ); 790 OutStream->writeLong( aFD.Height ); 791 OutStream->writeShort( 792 sal::static_int_cast< sal_Int16 >( 793 VCLUnoHelper::ConvertFontWidth( aFD.CharacterWidth )) ); 794 } 795 else if ( n == BASEPROPERTY_FONT_ATTRIBS ) 796 { 797 OutStream->writeShort( 798 sal::static_int_cast< sal_Int16 >( 799 VCLUnoHelper::ConvertFontWeight( aFD.Weight )) ); 800 OutStream->writeShort( 801 sal::static_int_cast< sal_Int16 >(aFD.Slant) ); 802 OutStream->writeShort( aFD.Underline ); 803 OutStream->writeShort( aFD.Strikeout ); 804 OutStream->writeShort( (short)(aFD.Orientation * 10) ); 805 OutStream->writeBoolean( aFD.Kerning ); 806 OutStream->writeBoolean( aFD.WordLineMode ); 807 } 808 else 809 { 810 DBG_ERROR( "Property?!" ); 811 } 812 813 sal_Int32 nPropDataLen = xMark->offsetToMark( nPropDataBeginMark ); 814 xMark->jumpToMark( nPropDataBeginMark ); 815 OutStream->writeLong( nPropDataLen ); 816 xMark->jumpToFurthest(); 817 xMark->deleteMark(nPropDataBeginMark); 818 } 819 } 820 } 821 822 void UnoControlModel::read( const ::com::sun::star::uno::Reference< ::com::sun::star::io::XObjectInputStream >& InStream ) throw(::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException) 823 { 824 ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 825 826 ::com::sun::star::uno::Reference< ::com::sun::star::io::XMarkableStream > xMark( InStream, ::com::sun::star::uno::UNO_QUERY ); 827 DBG_ASSERT( xMark.is(), "read: no ::com::sun::star::io::XMarkableStream!" ); 828 829 short nVersion = InStream->readShort(); 830 sal_uInt32 nProps = (sal_uInt32)InStream->readLong(); 831 ::com::sun::star::uno::Sequence< ::rtl::OUString> aProps( nProps ); 832 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any> aValues( nProps ); 833 sal_Bool bInvalidEntries = sal_False; 834 835 // Dummerweise kein Mark fuer den gesamten Block, es koennen also 836 // nur Properties geaendert werden, es koennen aber nicht spaeter mal Daten 837 // fuer das Model hinter den Properties geschrieben werden. 838 839 // Fuer den Import der alten ::com::sun::star::awt::FontDescriptor-Teile 840 ::com::sun::star::awt::FontDescriptor* pFD = NULL; 841 842 sal_uInt32 i; 843 for ( i = 0; i < nProps; i++ ) 844 { 845 sal_Int32 nPropDataBeginMark = xMark->createMark(); 846 sal_Int32 nPropDataLen = InStream->readLong(); 847 848 sal_uInt16 nPropId = (sal_uInt16)InStream->readShort(); 849 850 ::com::sun::star::uno::Any aValue; 851 sal_Bool bIsVoid = InStream->readBoolean(); 852 if ( !bIsVoid ) 853 { 854 const ::com::sun::star::uno::Type* pType = mpData->Get( nPropId ) ? GetPropertyType( nPropId ) : NULL; 855 if ( pType ) 856 { 857 if ( *pType == ::getBooleanCppuType() ) 858 { 859 sal_Bool b = InStream->readBoolean(); 860 aValue <<= b; 861 } 862 else if ( *pType == ::getCppuType((const ::rtl::OUString*)0) ) 863 { 864 ::rtl::OUString aUTF = InStream->readUTF(); 865 aValue <<= aUTF; 866 } 867 else if ( *pType == ::getCppuType((const sal_uInt16*)0) ) 868 { 869 sal_uInt16 n = InStream->readShort(); 870 aValue <<= n; 871 } 872 else if ( *pType == ::getCppuType((const sal_Int16*)0) ) 873 { 874 sal_Int16 n = InStream->readShort(); 875 aValue <<= n; 876 } 877 else if ( *pType == ::getCppuType((const sal_uInt32*)0) ) 878 { 879 sal_uInt32 n = InStream->readLong(); 880 aValue <<= n; 881 } 882 else if ( *pType == ::getCppuType((const sal_Int32*)0) ) 883 { 884 sal_Int32 n = InStream->readLong(); 885 aValue <<= n; 886 } 887 else if ( *pType == ::getCppuType((const double*)0) ) 888 { 889 double n = InStream->readDouble(); 890 aValue <<= n; 891 } 892 else if ( *pType == ::getCppuType((const ::com::sun::star::awt::FontDescriptor*)0) ) 893 { 894 ::com::sun::star::awt::FontDescriptor aFD; 895 aFD.Name = InStream->readUTF(); 896 aFD.Height = InStream->readShort(); 897 aFD.Width = InStream->readShort(); 898 aFD.StyleName = InStream->readUTF(); 899 aFD.Family = InStream->readShort(); 900 aFD.CharSet = InStream->readShort(); 901 aFD.Pitch = InStream->readShort(); 902 aFD.CharacterWidth = (float)InStream->readDouble(); 903 aFD.Weight = (float)InStream->readDouble(); 904 aFD.Slant = (::com::sun::star::awt::FontSlant)InStream->readShort(); 905 aFD.Underline = InStream->readShort(); 906 aFD.Strikeout = InStream->readShort(); 907 aFD.Orientation = (float)InStream->readDouble(); 908 aFD.Kerning = InStream->readBoolean(); 909 aFD.WordLineMode = InStream->readBoolean(); 910 aFD.Type = InStream->readShort(); 911 aValue <<= aFD; 912 } 913 else if ( *pType == ::getCppuType((const ::com::sun::star::uno::Sequence< ::rtl::OUString>*)0 ) ) 914 { 915 long nEntries = InStream->readLong(); 916 ::com::sun::star::uno::Sequence< ::rtl::OUString> aSeq( nEntries ); 917 for ( long n = 0; n < nEntries; n++ ) 918 aSeq.getArray()[n] = InStream->readUTF(); 919 aValue <<= aSeq; 920 921 } 922 else if ( *pType == ::getCppuType((const ::com::sun::star::uno::Sequence<sal_uInt16>*)0 ) ) 923 924 { 925 long nEntries = InStream->readLong(); 926 ::com::sun::star::uno::Sequence<sal_uInt16> aSeq( nEntries ); 927 for ( long n = 0; n < nEntries; n++ ) 928 aSeq.getArray()[n] = (sal_uInt16)InStream->readShort(); 929 aValue <<= aSeq; 930 } 931 else if ( *pType == ::getCppuType((const ::com::sun::star::uno::Sequence<sal_Int16>*)0 ) ) 932 { 933 long nEntries = InStream->readLong(); 934 ::com::sun::star::uno::Sequence<sal_Int16> aSeq( nEntries ); 935 for ( long n = 0; n < nEntries; n++ ) 936 aSeq.getArray()[n] = (sal_Int16)InStream->readShort(); 937 aValue <<= aSeq; 938 } 939 else if ( pType->getTypeClass() == TypeClass_ENUM ) 940 { 941 sal_Int32 nAsInt = InStream->readLong(); 942 aValue = ::cppu::int2enum( nAsInt, *pType ); 943 } 944 else 945 { 946 ::rtl::OString sMessage( "UnoControlModel::read: don't know how to handle a property of type '" ); 947 ::rtl::OUString sTypeName( pType->getTypeName() ); 948 sMessage += ::rtl::OString( sTypeName.getStr(), sTypeName.getLength(), RTL_TEXTENCODING_ASCII_US ); 949 sMessage += "'.\n(Currently handling property '"; 950 ::rtl::OUString sPropertyName( GetPropertyName( nPropId ) ); 951 sMessage += ::rtl::OString( sPropertyName.getStr(), sPropertyName.getLength(), osl_getThreadTextEncoding() ); 952 sMessage += "'.)"; 953 DBG_ERROR( sMessage ); 954 } 955 } 956 else 957 { 958 // Altes Geraffel aus 5.0 959 if ( nPropId == BASEPROPERTY_FONT_TYPE ) 960 { 961 // Sonst ist es nur die redundante Info fuer alte Versionen 962 // Daten werden durch MarkableStream geskippt. 963 if ( nVersion < 2 ) 964 { 965 if ( !pFD ) 966 { 967 pFD = new ::com::sun::star::awt::FontDescriptor; 968 ImplControlProperty* pProp = mpData->Get( BASEPROPERTY_FONTDESCRIPTOR ); 969 if ( pProp ) // wegen den Defaults... 970 pProp->GetValue() >>= *pFD; 971 } 972 pFD->Name = InStream->readUTF(); 973 pFD->StyleName = InStream->readUTF(); 974 pFD->Family = InStream->readShort(); 975 pFD->CharSet = InStream->readShort(); 976 pFD->Pitch = InStream->readShort(); 977 } 978 } 979 else if ( nPropId == BASEPROPERTY_FONT_SIZE ) 980 { 981 if ( nVersion < 2 ) 982 { 983 if ( !pFD ) 984 { 985 pFD = new ::com::sun::star::awt::FontDescriptor; 986 ImplControlProperty* pProp = mpData->Get( BASEPROPERTY_FONTDESCRIPTOR ); 987 if ( pProp ) // wegen den Defaults... 988 pProp->GetValue() >>= *pFD; 989 } 990 pFD->Width = (sal_Int16)InStream->readLong(); 991 pFD->Height = (sal_Int16)InStream->readLong(); 992 InStream->readShort(); // ::com::sun::star::awt::FontWidth ignorieren - wurde mal falsch geschrieben und wird nicht gebraucht. 993 pFD->CharacterWidth = ::com::sun::star::awt::FontWidth::DONTKNOW; 994 } 995 } 996 else if ( nPropId == BASEPROPERTY_FONT_ATTRIBS ) 997 { 998 if ( nVersion < 2 ) 999 { 1000 if ( !pFD ) 1001 { 1002 pFD = new ::com::sun::star::awt::FontDescriptor; 1003 ImplControlProperty* pProp = mpData->Get( BASEPROPERTY_FONTDESCRIPTOR ); 1004 if ( pProp ) // wegen den Defaults... 1005 pProp->GetValue() >>= *pFD; 1006 } 1007 pFD->Weight = VCLUnoHelper::ConvertFontWeight( (FontWeight) InStream->readShort() ); 1008 pFD->Slant = (::com::sun::star::awt::FontSlant)InStream->readShort(); 1009 pFD->Underline = InStream->readShort(); 1010 pFD->Strikeout = InStream->readShort(); 1011 pFD->Orientation = ( (float)(double)InStream->readShort() ) / 10; 1012 pFD->Kerning = InStream->readBoolean(); 1013 pFD->WordLineMode = InStream->readBoolean(); 1014 } 1015 } 1016 else 1017 { 1018 DBG_ERROR( "read: unknown Property!" ); 1019 } 1020 } 1021 } 1022 else // bVoid 1023 { 1024 if ( nPropId == BASEPROPERTY_FONTDESCRIPTOR ) 1025 { 1026 EmptyFontDescriptor aFD; 1027 aValue <<= aFD; 1028 } 1029 } 1030 1031 if ( mpData->Get( nPropId ) ) 1032 { 1033 aProps.getArray()[i] = GetPropertyName( nPropId ); 1034 aValues.getArray()[i] = aValue; 1035 } 1036 else 1037 { 1038 bInvalidEntries = sal_True; 1039 } 1040 1041 // Falls bereits mehr drinsteht als diese Version kennt: 1042 xMark->jumpToMark( nPropDataBeginMark ); 1043 InStream->skipBytes( nPropDataLen ); 1044 xMark->deleteMark(nPropDataBeginMark); 1045 } 1046 if ( bInvalidEntries ) 1047 { 1048 for ( i = 0; i < (sal_uInt32)aProps.getLength(); i++ ) 1049 { 1050 if ( !aProps.getConstArray()[i].getLength() ) 1051 { 1052 ::comphelper::removeElementAt( aProps, i ); 1053 ::comphelper::removeElementAt( aValues, i ); 1054 i--; 1055 } 1056 } 1057 } 1058 1059 try 1060 { 1061 setPropertyValues( aProps, aValues ); 1062 } 1063 catch ( const Exception& ) 1064 { 1065 DBG_UNHANDLED_EXCEPTION(); 1066 } 1067 1068 if ( pFD ) 1069 { 1070 ::com::sun::star::uno::Any aValue; 1071 aValue <<= *pFD; 1072 setPropertyValue( GetPropertyName( BASEPROPERTY_FONTDESCRIPTOR ), aValue ); 1073 delete pFD; 1074 } 1075 } 1076 1077 1078 // ::com::sun::star::lang::XServiceInfo 1079 ::rtl::OUString UnoControlModel::getImplementationName( ) throw(::com::sun::star::uno::RuntimeException) 1080 { 1081 DBG_ERROR( "This method should be overloaded!" ); 1082 return ::rtl::OUString(); 1083 1084 } 1085 1086 sal_Bool UnoControlModel::supportsService( const ::rtl::OUString& rServiceName ) throw(::com::sun::star::uno::RuntimeException) 1087 { 1088 ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 1089 1090 ::com::sun::star::uno::Sequence< ::rtl::OUString > aSNL = getSupportedServiceNames(); 1091 const ::rtl::OUString * pArray = aSNL.getConstArray(); 1092 for( sal_Int32 i = 0; i < aSNL.getLength(); i++ ) 1093 if( pArray[i] == rServiceName ) 1094 return sal_True; 1095 return sal_False; 1096 } 1097 1098 ::com::sun::star::uno::Sequence< ::rtl::OUString > UnoControlModel::getSupportedServiceNames( ) throw(::com::sun::star::uno::RuntimeException) 1099 { 1100 ::rtl::OUString sName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlModel" ) ); 1101 return Sequence< ::rtl::OUString >( &sName, 1 ); 1102 } 1103 1104 // ::cppu::OPropertySetHelper 1105 ::cppu::IPropertyArrayHelper& UnoControlModel::getInfoHelper() 1106 { 1107 DBG_ERROR( "UnoControlModel::getInfoHelper() not possible!" ); 1108 return *(::cppu::IPropertyArrayHelper*) NULL; 1109 } 1110 1111 // ------------------------------------------------------------------ 1112 template <class TYPE> 1113 sal_Bool convertType(Any& _rConvertedValue, const Any& _rNewValueTest, const TYPE* /* _pTypeDisambiguation */) 1114 { 1115 TYPE tValue; 1116 if (_rNewValueTest >>= tValue) 1117 { 1118 _rConvertedValue <<= tValue; 1119 return sal_True; 1120 } 1121 } 1122 1123 // .................................................................. 1124 sal_Bool UnoControlModel::convertFastPropertyValue( Any & rConvertedValue, Any & rOldValue, sal_Int32 nPropId, const Any& rValue ) throw (IllegalArgumentException) 1125 { 1126 ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 1127 1128 sal_Bool bVoid = rValue.getValueType().getTypeClass() == ::com::sun::star::uno::TypeClass_VOID; 1129 if ( bVoid ) 1130 { 1131 rConvertedValue.clear(); 1132 } 1133 else 1134 { 1135 const ::com::sun::star::uno::Type* pDestType = GetPropertyType( (sal_uInt16)nPropId ); 1136 if ( pDestType->getTypeClass() == TypeClass_ANY ) 1137 { 1138 rConvertedValue = rValue; 1139 } 1140 else 1141 { 1142 if ( pDestType->equals( rValue.getValueType() ) ) 1143 { 1144 rConvertedValue = rValue; 1145 } 1146 else 1147 { 1148 sal_Bool bConverted = sal_False; 1149 // 13.03.2001 - 84923 - frank.schoenheit@germany.sun.com 1150 1151 switch (pDestType->getTypeClass()) 1152 { 1153 case TypeClass_DOUBLE: 1154 { 1155 // try as double 1156 double nAsDouble = 0; 1157 bConverted = ( rValue >>= nAsDouble ); 1158 if ( bConverted ) 1159 rConvertedValue <<= nAsDouble; 1160 else 1161 { // try as integer - 96136 - 2002-10-08 - fs@openoffice.org 1162 sal_Int32 nAsInteger = 0; 1163 bConverted = ( rValue >>= nAsInteger ); 1164 if ( bConverted ) 1165 rConvertedValue <<= (double)nAsInteger; 1166 } 1167 } 1168 break; 1169 case TypeClass_SHORT: 1170 { 1171 sal_Int16 n; 1172 bConverted = ( rValue >>= n ); 1173 if ( bConverted ) 1174 rConvertedValue <<= n; 1175 } 1176 break; 1177 case TypeClass_UNSIGNED_SHORT: 1178 { 1179 sal_uInt16 n; 1180 bConverted = ( rValue >>= n ); 1181 if ( bConverted ) 1182 rConvertedValue <<= n; 1183 } 1184 break; 1185 case TypeClass_LONG: 1186 { 1187 sal_Int32 n; 1188 bConverted = ( rValue >>= n ); 1189 if ( bConverted ) 1190 rConvertedValue <<= n; 1191 } 1192 break; 1193 case TypeClass_UNSIGNED_LONG: 1194 { 1195 sal_uInt32 n; 1196 bConverted = ( rValue >>= n ); 1197 if ( bConverted ) 1198 rConvertedValue <<= n; 1199 } 1200 break; 1201 case TypeClass_INTERFACE: 1202 { 1203 if ( rValue.getValueType().getTypeClass() == TypeClass_INTERFACE ) 1204 { 1205 Reference< XInterface > xPure( rValue, UNO_QUERY ); 1206 if ( xPure.is() ) 1207 rConvertedValue = xPure->queryInterface( *pDestType ); 1208 else 1209 rConvertedValue.setValue( NULL, *pDestType ); 1210 bConverted = sal_True; 1211 } 1212 } 1213 break; 1214 case TypeClass_ENUM: 1215 { 1216 sal_Int32 nValue = 0; 1217 bConverted = ( rValue >>= nValue ); 1218 if ( bConverted ) 1219 rConvertedValue = ::cppu::int2enum( nValue, *pDestType ); 1220 } 1221 break; 1222 default: ; // avoid compiler warning 1223 } 1224 1225 if (!bConverted) 1226 { 1227 ::rtl::OUStringBuffer aErrorMessage; 1228 aErrorMessage.appendAscii( "Unable to convert the given value for the property " ); 1229 aErrorMessage.append ( GetPropertyName( (sal_uInt16)nPropId ) ); 1230 aErrorMessage.appendAscii( ".\n" ); 1231 aErrorMessage.appendAscii( "Expected type: " ); 1232 aErrorMessage.append ( pDestType->getTypeName() ); 1233 aErrorMessage.appendAscii( "\n" ); 1234 aErrorMessage.appendAscii( "Found type: " ); 1235 aErrorMessage.append ( rValue.getValueType().getTypeName() ); 1236 throw ::com::sun::star::lang::IllegalArgumentException( 1237 aErrorMessage.makeStringAndClear(), 1238 static_cast< ::com::sun::star::beans::XPropertySet* >(this), 1239 1); 1240 } 1241 } 1242 } 1243 } 1244 1245 // the current value 1246 getFastPropertyValue( rOldValue, nPropId ); 1247 return !CompareProperties( rConvertedValue, rOldValue ); 1248 } 1249 1250 void UnoControlModel::setFastPropertyValue_NoBroadcast( sal_Int32 nPropId, const ::com::sun::star::uno::Any& rValue ) throw (::com::sun::star::uno::Exception) 1251 { 1252 // Fehlt: Die gefakten Einzelproperties des FontDescriptors... 1253 1254 ImplControlProperty* pProp = mpData->Get( nPropId ); 1255 ENSURE_OR_RETURN_VOID( pProp, "UnoControlModel::setFastPropertyValue_NoBroadcast: invalid property id!" ); 1256 1257 DBG_ASSERT( ( rValue.getValueType().getTypeClass() != ::com::sun::star::uno::TypeClass_VOID ) || ( GetPropertyAttribs( (sal_uInt16)nPropId ) & ::com::sun::star::beans::PropertyAttribute::MAYBEVOID ), "Property darf nicht VOID sein!" ); 1258 pProp->SetValue( rValue ); 1259 } 1260 1261 void UnoControlModel::getFastPropertyValue( ::com::sun::star::uno::Any& rValue, sal_Int32 nPropId ) const 1262 { 1263 ::osl::Guard< ::osl::Mutex > aGuard( ((UnoControlModel*)this)->GetMutex() ); 1264 1265 ImplControlProperty* pProp = mpData->Get( nPropId ); 1266 1267 if ( pProp ) 1268 rValue = pProp->GetValue(); 1269 else if ( ( nPropId >= BASEPROPERTY_FONTDESCRIPTORPART_START ) && ( nPropId <= BASEPROPERTY_FONTDESCRIPTORPART_END ) ) 1270 { 1271 pProp = mpData->Get( BASEPROPERTY_FONTDESCRIPTOR ); 1272 ::com::sun::star::awt::FontDescriptor aFD; 1273 pProp->GetValue() >>= aFD; 1274 switch ( nPropId ) 1275 { 1276 case BASEPROPERTY_FONTDESCRIPTORPART_NAME: rValue <<= aFD.Name; 1277 break; 1278 case BASEPROPERTY_FONTDESCRIPTORPART_STYLENAME: rValue <<= aFD.StyleName; 1279 break; 1280 case BASEPROPERTY_FONTDESCRIPTORPART_FAMILY: rValue <<= aFD.Family; 1281 break; 1282 case BASEPROPERTY_FONTDESCRIPTORPART_CHARSET: rValue <<= aFD.CharSet; 1283 break; 1284 case BASEPROPERTY_FONTDESCRIPTORPART_HEIGHT: rValue <<= (float)aFD.Height; 1285 break; 1286 case BASEPROPERTY_FONTDESCRIPTORPART_WEIGHT: rValue <<= aFD.Weight; 1287 break; 1288 case BASEPROPERTY_FONTDESCRIPTORPART_SLANT: rValue <<= (sal_Int16)aFD.Slant; 1289 break; 1290 case BASEPROPERTY_FONTDESCRIPTORPART_UNDERLINE: rValue <<= aFD.Underline; 1291 break; 1292 case BASEPROPERTY_FONTDESCRIPTORPART_STRIKEOUT: rValue <<= aFD.Strikeout; 1293 break; 1294 case BASEPROPERTY_FONTDESCRIPTORPART_WIDTH: rValue <<= aFD.Width; 1295 break; 1296 case BASEPROPERTY_FONTDESCRIPTORPART_PITCH: rValue <<= aFD.Pitch; 1297 break; 1298 case BASEPROPERTY_FONTDESCRIPTORPART_CHARWIDTH: rValue <<= aFD.CharacterWidth; 1299 break; 1300 case BASEPROPERTY_FONTDESCRIPTORPART_ORIENTATION: rValue <<= aFD.Orientation; 1301 break; 1302 case BASEPROPERTY_FONTDESCRIPTORPART_KERNING: rValue <<= aFD.Kerning; 1303 break; 1304 case BASEPROPERTY_FONTDESCRIPTORPART_WORDLINEMODE: rValue <<= aFD.WordLineMode; 1305 break; 1306 case BASEPROPERTY_FONTDESCRIPTORPART_TYPE: rValue <<= aFD.Type; 1307 break; 1308 default: DBG_ERROR( "FontProperty?!" ); 1309 } 1310 } 1311 else 1312 { 1313 DBG_ERROR( "getFastPropertyValue - invalid Property!" ); 1314 } 1315 } 1316 1317 // ::com::sun::star::beans::XPropertySet 1318 void UnoControlModel::setPropertyValue( const ::rtl::OUString& rPropertyName, const ::com::sun::star::uno::Any& rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException) 1319 { 1320 sal_Int32 nPropId = 0; 1321 { 1322 ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); 1323 nPropId = (sal_Int32) GetPropertyId( rPropertyName ); 1324 DBG_ASSERT( nPropId, "Invalid ID in UnoControlModel::setPropertyValue" ); 1325 } 1326 if( nPropId ) 1327 setFastPropertyValue( nPropId, rValue ); 1328 else 1329 throw ::com::sun::star::beans::UnknownPropertyException(); 1330 } 1331 1332 // ::com::sun::star::beans::XFastPropertySet 1333 void UnoControlModel::setFastPropertyValue( sal_Int32 nPropId, const ::com::sun::star::uno::Any& rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException) 1334 { 1335 if ( ( nPropId >= BASEPROPERTY_FONTDESCRIPTORPART_START ) && ( nPropId <= BASEPROPERTY_FONTDESCRIPTORPART_END ) ) 1336 { 1337 ::osl::ClearableMutexGuard aGuard( GetMutex() ); 1338 1339 Any aOldSingleValue; 1340 getFastPropertyValue( aOldSingleValue, BASEPROPERTY_FONTDESCRIPTORPART_START ); 1341 1342 ImplControlProperty* pProp = mpData->Get( BASEPROPERTY_FONTDESCRIPTOR ); 1343 FontDescriptor aOldFontDescriptor; 1344 pProp->GetValue() >>= aOldFontDescriptor; 1345 1346 FontDescriptor aNewFontDescriptor( aOldFontDescriptor ); 1347 lcl_ImplMergeFontProperty( aNewFontDescriptor, (sal_uInt16)nPropId, rValue ); 1348 1349 Any aNewValue; 1350 aNewValue <<= aNewFontDescriptor; 1351 sal_Int32 nDescriptorId( BASEPROPERTY_FONTDESCRIPTOR ); 1352 nDescriptorId = BASEPROPERTY_FONTDESCRIPTOR; 1353 1354 // also, we need fire a propertyChange event for the single property, since with 1355 // the above line, only an event for the FontDescriptor property will be fired 1356 Any aNewSingleValue; 1357 getFastPropertyValue( aNewSingleValue, BASEPROPERTY_FONTDESCRIPTORPART_START ); 1358 1359 aGuard.clear(); 1360 setFastPropertyValues( 1, &nDescriptorId, &aNewValue, 1 ); 1361 fire( &nPropId, &aNewSingleValue, &aOldSingleValue, 1, sal_False ); 1362 } 1363 else 1364 setFastPropertyValues( 1, &nPropId, &rValue, 1 ); 1365 } 1366 1367 // ::com::sun::star::beans::XMultiPropertySet 1368 ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > UnoControlModel::getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException) 1369 { 1370 DBG_ERROR( "UnoControlModel::getPropertySetInfo() not possible!" ); 1371 return ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo >(); 1372 } 1373 1374 void UnoControlModel::setPropertyValues( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& rPropertyNames, const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& Values ) throw(::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException) 1375 { 1376 ::osl::ClearableMutexGuard aGuard( GetMutex() ); 1377 1378 sal_Int32 nProps = rPropertyNames.getLength(); 1379 1380 // sal_Int32* pHandles = new sal_Int32[nProps]; 1381 // don't do this - it leaks in case of an exception 1382 Sequence< sal_Int32 > aHandles( nProps ); 1383 sal_Int32* pHandles = aHandles.getArray(); 1384 1385 // may need to change the order in the sequence, for this we need a non-const value sequence 1386 // 15.05.2002 - 99314 - fs@openoffice.org 1387 uno::Sequence< uno::Any > aValues( Values ); 1388 uno::Any* pValues = aValues.getArray(); 1389 1390 sal_Int32 nValidHandles = getInfoHelper().fillHandles( pHandles, rPropertyNames ); 1391 1392 if ( nValidHandles ) 1393 { 1394 // if somebody sets properties which are single aspects of a font descriptor, 1395 // remove them, and build a font descriptor instead 1396 ::std::auto_ptr< awt::FontDescriptor > pFD; 1397 for ( sal_uInt16 n = 0; n < nProps; ++n ) 1398 { 1399 if ( ( pHandles[n] >= BASEPROPERTY_FONTDESCRIPTORPART_START ) && ( pHandles[n] <= BASEPROPERTY_FONTDESCRIPTORPART_END ) ) 1400 { 1401 if ( !pFD.get() ) 1402 { 1403 ImplControlProperty* pProp = mpData->Get( BASEPROPERTY_FONTDESCRIPTOR ); 1404 pFD.reset( new awt::FontDescriptor ); 1405 pProp->GetValue() >>= *pFD; 1406 } 1407 lcl_ImplMergeFontProperty( *pFD, (sal_uInt16)pHandles[n], pValues[n] ); 1408 pHandles[n] = -1; 1409 nValidHandles--; 1410 } 1411 } 1412 1413 if ( nValidHandles ) 1414 { 1415 ImplNormalizePropertySequence( nProps, pHandles, pValues, &nValidHandles ); 1416 aGuard.clear(); 1417 // clear our guard before calling into setFastPropertyValues - this method 1418 // will implicitly call property listeners, and this should not happen with 1419 // our mutex locked 1420 // #i23451# - 2004-03-18 - fs@openoffice.org 1421 setFastPropertyValues( nProps, pHandles, pValues, nValidHandles ); 1422 } 1423 else 1424 aGuard.clear(); 1425 // same as a few lines above 1426 1427 // FD-Propertie nicht in das Array mergen, weil sortiert... 1428 if ( pFD.get() ) 1429 { 1430 ::com::sun::star::uno::Any aValue; 1431 aValue <<= *pFD; 1432 sal_Int32 nHandle = BASEPROPERTY_FONTDESCRIPTOR; 1433 setFastPropertyValues( 1, &nHandle, &aValue, 1 ); 1434 } 1435 } 1436 } 1437 1438 1439 1440 void UnoControlModel::ImplNormalizePropertySequence( const sal_Int32, sal_Int32*, 1441 uno::Any*, sal_Int32* ) const SAL_THROW(()) 1442 { 1443 // nothing to do here 1444 } 1445 1446 void UnoControlModel::ImplEnsureHandleOrder( const sal_Int32 _nCount, sal_Int32* _pHandles, 1447 uno::Any* _pValues, sal_Int32 _nFirstHandle, sal_Int32 _nSecondHandle ) const 1448 { 1449 for ( sal_Int32 i=0; i < _nCount; ++_pHandles, ++_pValues, ++i ) 1450 { 1451 if ( _nSecondHandle == *_pHandles ) 1452 { 1453 sal_Int32* pLaterHandles = _pHandles + 1; 1454 uno::Any* pLaterValues = _pValues + 1; 1455 for ( sal_Int32 j = i + 1; j < _nCount; ++j, ++pLaterHandles, ++pLaterValues ) 1456 { 1457 if ( _nFirstHandle == *pLaterHandles ) 1458 { 1459 // indeed it is -> exchange the both places in the sequences 1460 sal_Int32 nHandle( *_pHandles ); 1461 *_pHandles = *pLaterHandles; 1462 *pLaterHandles = nHandle; 1463 1464 uno::Any aValue( *_pValues ); 1465 *_pValues = *pLaterValues; 1466 *pLaterValues = aValue; 1467 1468 break; 1469 // this will leave the inner loop, and continue with the outer loop. 1470 // Note that this means we will encounter the _nSecondHandle handle, again, once we reached 1471 // (in the outer loop) the place where we just put it. 1472 } 1473 } 1474 } 1475 } 1476 } 1477