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 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_svx.hxx" 30 #include <com/sun/star/awt/XBitmap.hpp> 31 #include <com/sun/star/graphic/XGraphic.hpp> 32 #include <tools/stream.hxx> 33 #include <vcl/window.hxx> 34 #include <vcl/virdev.hxx> 35 #include <vcl/bitmapex.hxx> 36 #include <toolkit/unohlp.hxx> 37 #include <svl/style.hxx> 38 #include <editeng/memberids.hrc> 39 40 #include <svx/dialogs.hrc> 41 #include "svx/xattr.hxx" 42 #include <svx/xtable.hxx> 43 #include <svx/xdef.hxx> 44 #include <svx/unomid.hxx> 45 #include <editeng/unoprnms.hxx> 46 47 #include "svx/unoapi.hxx" 48 #include <svx/svdmodel.hxx> 49 #include <com/sun/star/beans/PropertyValue.hpp> 50 51 #define GLOBALOVERFLOW 52 53 using namespace ::com::sun::star; 54 55 // --------------- 56 // class XOBitmap 57 // --------------- 58 59 /************************************************************************* 60 |* 61 |* XOBitmap::XOBitmap() 62 |* 63 |* Beschreibung 64 |* Ersterstellung 27.07.95 65 |* Letzte Aenderung 27.07.95 66 |* 67 *************************************************************************/ 68 69 XOBitmap::XOBitmap() : 70 eType ( XBITMAP_NONE ), 71 eStyle ( XBITMAP_STRETCH ), 72 pPixelArray ( NULL ), 73 bGraphicDirty ( sal_False ) 74 { 75 } 76 77 /************************************************************************* 78 |* 79 |* XOBitmap::XOBitmap( Bitmap aBitmap, XBitmapStyle eStyle = XBITMAP_TILE ) 80 |* 81 |* Beschreibung 82 |* Ersterstellung 26.07.95 83 |* Letzte Aenderung 26.07.95 84 |* 85 *************************************************************************/ 86 87 XOBitmap::XOBitmap( const Bitmap& rBmp, XBitmapStyle eInStyle ) : 88 eType ( XBITMAP_IMPORT ), 89 eStyle ( eInStyle ), 90 aGraphicObject ( rBmp ), 91 pPixelArray ( NULL ), 92 bGraphicDirty ( sal_False ) 93 { 94 } 95 96 /************************************************************************* 97 |* 98 |* XOBitmap::XOBitmap( Bitmap aBitmap, XBitmapStyle eStyle = XBITMAP_TILE ) 99 |* 100 |* Beschreibung 101 |* Ersterstellung 26.07.95 102 |* Letzte Aenderung 26.07.95 103 |* 104 *************************************************************************/ 105 106 XOBitmap::XOBitmap( const GraphicObject& rGraphicObject, XBitmapStyle eInStyle ) : 107 eType ( XBITMAP_IMPORT ), 108 eStyle ( eInStyle ), 109 aGraphicObject ( rGraphicObject ), 110 pPixelArray ( NULL ), 111 bGraphicDirty ( sal_False ) 112 { 113 } 114 115 /************************************************************************* 116 |* 117 |* XOBitmap::XOBitmap( sal_uInt16* pArray, const Color& aPixelColor, 118 |* const Color& aBckgrColor, const Size& rSize = Size( 8, 8 ), 119 |* XBitmapStyle eStyle = XBITMAP_TILE ) 120 |* 121 |* Beschreibung 122 |* Ersterstellung 26.07.95 123 |* Letzte Aenderung 26.07.95 124 |* 125 *************************************************************************/ 126 127 XOBitmap::XOBitmap( const sal_uInt16* pArray, const Color& rPixelColor, 128 const Color& rBckgrColor, const Size& rSize, 129 XBitmapStyle eInStyle ) : 130 eStyle ( eInStyle ), 131 pPixelArray ( NULL ), 132 aArraySize ( rSize ), 133 aPixelColor ( rPixelColor ), 134 aBckgrColor ( rBckgrColor ), 135 bGraphicDirty ( sal_True ) 136 137 { 138 if( aArraySize.Width() == 8 && aArraySize.Height() == 8 ) 139 { 140 eType = XBITMAP_8X8; 141 pPixelArray = new sal_uInt16[ 64 ]; 142 143 for( sal_uInt16 i = 0; i < 64; i++ ) 144 *( pPixelArray + i ) = *( pArray + i ); 145 } 146 else 147 { 148 DBG_ASSERT( 0, "Nicht unterstuetzte Bitmapgroesse" ); 149 } 150 } 151 152 /************************************************************************* 153 |* 154 |* XOBitmap::XOBitmap( const XOBitmap& rXBmp ) 155 |* 156 |* Beschreibung 157 |* Ersterstellung 27.07.95 158 |* Letzte Aenderung 27.07.95 159 |* 160 *************************************************************************/ 161 162 XOBitmap::XOBitmap( const XOBitmap& rXBmp ) : 163 pPixelArray ( NULL ) 164 { 165 eType = rXBmp.eType; 166 eStyle = rXBmp.eStyle; 167 aGraphicObject = rXBmp.aGraphicObject; 168 aArraySize = rXBmp.aArraySize; 169 aPixelColor = rXBmp.aPixelColor; 170 aBckgrColor = rXBmp.aBckgrColor; 171 bGraphicDirty = rXBmp.bGraphicDirty; 172 173 if( rXBmp.pPixelArray ) 174 { 175 if( eType == XBITMAP_8X8 ) 176 { 177 pPixelArray = new sal_uInt16[ 64 ]; 178 179 for( sal_uInt16 i = 0; i < 64; i++ ) 180 *( pPixelArray + i ) = *( rXBmp.pPixelArray + i ); 181 } 182 } 183 } 184 185 /************************************************************************* 186 |* 187 |* XOBitmap::XOBitmap( Bitmap aBitmap, XBitmapStyle eStyle = XBITMAP_TILE ) 188 |* 189 |* Beschreibung 190 |* Ersterstellung 26.07.95 191 |* Letzte Aenderung 26.07.95 192 |* 193 *************************************************************************/ 194 195 XOBitmap::~XOBitmap() 196 { 197 if( pPixelArray ) 198 delete []pPixelArray; 199 } 200 201 /************************************************************************* 202 |* 203 |* XOBitmap& XOBitmap::operator=( const XOBitmap& rXBmp ) 204 |* 205 |* Beschreibung 206 |* Ersterstellung 27.07.95 207 |* Letzte Aenderung 27.07.95 208 |* 209 *************************************************************************/ 210 211 XOBitmap& XOBitmap::operator=( const XOBitmap& rXBmp ) 212 { 213 eType = rXBmp.eType; 214 eStyle = rXBmp.eStyle; 215 aGraphicObject = rXBmp.aGraphicObject; 216 aArraySize = rXBmp.aArraySize; 217 aPixelColor = rXBmp.aPixelColor; 218 aBckgrColor = rXBmp.aBckgrColor; 219 bGraphicDirty = rXBmp.bGraphicDirty; 220 221 if( rXBmp.pPixelArray ) 222 { 223 if( eType == XBITMAP_8X8 ) 224 { 225 pPixelArray = new sal_uInt16[ 64 ]; 226 227 for( sal_uInt16 i = 0; i < 64; i++ ) 228 *( pPixelArray + i ) = *( rXBmp.pPixelArray + i ); 229 } 230 } 231 return( *this ); 232 } 233 234 /************************************************************************* 235 |* 236 |* int XOBitmap::operator==( const XOBitmap& rXOBitmap ) const 237 |* 238 |* Beschreibung 239 |* Ersterstellung 26.07.95 240 |* Letzte Aenderung 26.07.95 241 |* 242 *************************************************************************/ 243 244 int XOBitmap::operator==( const XOBitmap& rXOBitmap ) const 245 { 246 if( eType != rXOBitmap.eType || 247 eStyle != rXOBitmap.eStyle || 248 aGraphicObject != rXOBitmap.aGraphicObject || 249 aArraySize != rXOBitmap.aArraySize || 250 aPixelColor != rXOBitmap.aPixelColor || 251 aBckgrColor != rXOBitmap.aBckgrColor || 252 bGraphicDirty != rXOBitmap.bGraphicDirty ) 253 { 254 return( sal_False ); 255 } 256 257 if( pPixelArray && rXOBitmap.pPixelArray ) 258 { 259 sal_uInt16 nCount = (sal_uInt16) ( aArraySize.Width() * aArraySize.Height() ); 260 for( sal_uInt16 i = 0; i < nCount; i++ ) 261 { 262 if( *( pPixelArray + i ) != *( rXOBitmap.pPixelArray + i ) ) 263 return( sal_False ); 264 } 265 } 266 return( sal_True ); 267 } 268 269 /************************************************************************* 270 |* 271 |* void SetPixelArray( const sal_uInt16* pArray ) 272 |* 273 |* Beschreibung 274 |* Ersterstellung 27.07.95 275 |* Letzte Aenderung 27.07.95 276 |* 277 *************************************************************************/ 278 279 void XOBitmap::SetPixelArray( const sal_uInt16* pArray ) 280 { 281 if( eType == XBITMAP_8X8 ) 282 { 283 if( pPixelArray ) 284 delete []pPixelArray; 285 286 pPixelArray = new sal_uInt16[ 64 ]; 287 288 for( sal_uInt16 i = 0; i < 64; i++ ) 289 *( pPixelArray + i ) = *( pArray + i ); 290 291 bGraphicDirty = sal_True; 292 } 293 else 294 { 295 DBG_ASSERT( 0, "Nicht unterstuetzter Bitmaptyp" ); 296 } 297 } 298 299 /************************************************************************* 300 |* 301 |* Bitmap XOBitmap::GetBitmap() 302 |* 303 |* Beschreibung 304 |* Ersterstellung 26.07.95 305 |* Letzte Aenderung 26.07.95 306 |* 307 *************************************************************************/ 308 309 Bitmap XOBitmap::GetBitmap() const 310 { 311 return GetGraphicObject().GetGraphic().GetBitmap(); 312 } 313 314 /************************************************************************* 315 |* 316 |* Bitmap XOBitmap::GetGraphicObject() 317 |* 318 |* Beschreibung 319 |* Ersterstellung 320 |* Letzte Aenderung 321 |* 322 *************************************************************************/ 323 324 const GraphicObject& XOBitmap::GetGraphicObject() const 325 { 326 if( bGraphicDirty ) 327 ( (XOBitmap*) this )->Array2Bitmap(); 328 329 return aGraphicObject; 330 } 331 332 /************************************************************************* 333 |* 334 |* void XOBitmap::Bitmap2Array() 335 |* 336 |* Beschreibung Umwandlung der Bitmap in Array, Hinter- u. 337 |* Vordergrundfarbe 338 |* Ersterstellung 27.07.95 339 |* Letzte Aenderung 27.07.95 340 |* 341 *************************************************************************/ 342 343 void XOBitmap::Bitmap2Array() 344 { 345 VirtualDevice aVD; 346 sal_Bool bPixelColor = sal_False; 347 const Bitmap aBitmap( GetBitmap() ); 348 const sal_uInt16 nLines = 8; // von Type abhaengig 349 350 if( !pPixelArray ) 351 pPixelArray = new sal_uInt16[ nLines * nLines ]; 352 353 aVD.SetOutputSizePixel( aBitmap.GetSizePixel() ); 354 aVD.DrawBitmap( Point(), aBitmap ); 355 aPixelColor = aBckgrColor = aVD.GetPixel( Point() ); 356 357 // Aufbau des Arrays und Ermittlung der Vorder-, bzw. 358 // Hintergrundfarbe 359 for( sal_uInt16 i = 0; i < nLines; i++ ) 360 { 361 for( sal_uInt16 j = 0; j < nLines; j++ ) 362 { 363 if ( aVD.GetPixel( Point( j, i ) ) == aBckgrColor ) 364 *( pPixelArray + j + i * nLines ) = 0; 365 else 366 { 367 *( pPixelArray + j + i * nLines ) = 1; 368 if( !bPixelColor ) 369 { 370 aPixelColor = aVD.GetPixel( Point( j, i ) ); 371 bPixelColor = sal_True; 372 } 373 } 374 } 375 } 376 } 377 378 /************************************************************************* 379 |* 380 |* void XOBitmap::Array2Bitmap() 381 |* 382 |* Beschreibung Umwandlung des Arrays, Hinter- u. 383 |* Vordergrundfarbe in eine Bitmap 384 |* Ersterstellung 27.07.95 385 |* Letzte Aenderung 27.07.95 386 |* 387 *************************************************************************/ 388 389 void XOBitmap::Array2Bitmap() 390 { 391 VirtualDevice aVD; 392 sal_uInt16 nLines = 8; // von Type abhaengig 393 394 if( !pPixelArray ) 395 return; 396 397 aVD.SetOutputSizePixel( Size( nLines, nLines ) ); 398 399 // Aufbau der Bitmap 400 for( sal_uInt16 i = 0; i < nLines; i++ ) 401 { 402 for( sal_uInt16 j = 0; j < nLines; j++ ) 403 { 404 if( *( pPixelArray + j + i * nLines ) == 0 ) 405 aVD.DrawPixel( Point( j, i ), aBckgrColor ); 406 else 407 aVD.DrawPixel( Point( j, i ), aPixelColor ); 408 } 409 } 410 411 aGraphicObject = GraphicObject( aVD.GetBitmap( Point(), Size( nLines, nLines ) ) ); 412 bGraphicDirty = sal_False; 413 } 414 415 // ----------------------- 416 // class XFillBitmapItem 417 // ----------------------- 418 TYPEINIT1_AUTOFACTORY(XFillBitmapItem, NameOrIndex); 419 420 /************************************************************************* 421 |* 422 |* XFillBitmapItem::XFillBitmapItem(long nIndex, 423 |* const Bitmap& rTheBitmap) 424 |* 425 |* Beschreibung 426 |* Ersterstellung 17.11.94 427 |* Letzte Aenderung 17.11.94 428 |* 429 *************************************************************************/ 430 431 XFillBitmapItem::XFillBitmapItem(long nIndex, 432 const XOBitmap& rTheBitmap) : 433 NameOrIndex( XATTR_FILLBITMAP, nIndex ), 434 aXOBitmap( rTheBitmap ) 435 { 436 } 437 438 /************************************************************************* 439 |* 440 |* XFillBitmapItem::XFillBitmapItem(const XubString& rName, 441 |* const Bitmap& rTheBitmap) 442 |* 443 |* Beschreibung 444 |* Ersterstellung 17.11.94 445 |* Letzte Aenderung 17.11.94 446 |* 447 *************************************************************************/ 448 449 XFillBitmapItem::XFillBitmapItem(const XubString& rName, 450 const XOBitmap& rTheBitmap) : 451 NameOrIndex( XATTR_FILLBITMAP, rName ), 452 aXOBitmap( rTheBitmap ) 453 { 454 } 455 456 /************************************************************************* 457 |* 458 |* XFillBitmapItem::XFillBitmapItem(const XFillBitmapItem& rItem) 459 |* 460 |* Beschreibung 461 |* Ersterstellung 17.11.94 462 |* Letzte Aenderung 17.11.94 463 |* 464 *************************************************************************/ 465 466 XFillBitmapItem::XFillBitmapItem(const XFillBitmapItem& rItem) : 467 NameOrIndex( rItem ), 468 aXOBitmap( rItem.aXOBitmap ) 469 { 470 } 471 472 /************************************************************************* 473 |* 474 |* XFillBitmapItem::XFillBitmapItem(SvStream& rIn) 475 |* 476 |* Beschreibung 477 |* Ersterstellung 17.11.94 478 |* Letzte Aenderung 26.07.94 479 |* 480 *************************************************************************/ 481 482 XFillBitmapItem::XFillBitmapItem( SvStream& rIn, sal_uInt16 nVer ) : 483 NameOrIndex( XATTR_FILLBITMAP, rIn ) 484 { 485 if( nVer == 0 ) 486 { 487 if (!IsIndex()) 488 { 489 // Behandlung der alten Bitmaps 490 Bitmap aBmp; 491 492 rIn >> aBmp; 493 494 aXOBitmap.SetBitmap( aBmp ); 495 aXOBitmap.SetBitmapStyle( XBITMAP_TILE ); 496 497 if( aBmp.GetSizePixel().Width() == 8 && 498 aBmp.GetSizePixel().Height() == 8 ) 499 { 500 aXOBitmap.SetBitmapType( XBITMAP_8X8 ); 501 aXOBitmap.Bitmap2Array(); 502 } 503 else 504 aXOBitmap.SetBitmapType( XBITMAP_IMPORT ); 505 } 506 } 507 else if( nVer == 1 ) 508 { 509 if (!IsIndex()) 510 { 511 sal_Int16 iTmp; 512 rIn >> iTmp; 513 aXOBitmap.SetBitmapStyle( (XBitmapStyle) iTmp ); 514 rIn >> iTmp; 515 aXOBitmap.SetBitmapType( (XBitmapType) iTmp ); 516 517 if( aXOBitmap.GetBitmapType() == XBITMAP_IMPORT ) 518 { 519 Bitmap aBmp; 520 rIn >> aBmp; 521 aXOBitmap.SetBitmap( aBmp ); 522 } 523 else if( aXOBitmap.GetBitmapType() == XBITMAP_8X8 ) 524 { 525 sal_uInt16* pArray = new sal_uInt16[ 64 ]; 526 Color aColor; 527 528 for( sal_uInt16 i = 0; i < 64; i++ ) 529 rIn >> *( pArray + i ); 530 aXOBitmap.SetPixelArray( pArray ); 531 532 rIn >> aColor; 533 aXOBitmap.SetPixelColor( aColor ); 534 rIn >> aColor; 535 aXOBitmap.SetBackgroundColor( aColor ); 536 537 delete []pArray; 538 } 539 } 540 } 541 542 // #81908# force bitmap to exist 543 aXOBitmap.GetBitmap(); 544 } 545 546 //************************************************************************* 547 548 XFillBitmapItem::XFillBitmapItem( SfxItemPool* /*pPool*/, const XOBitmap& rTheBitmap ) 549 : NameOrIndex( XATTR_FILLBITMAP, -1 ), 550 aXOBitmap( rTheBitmap ) 551 { 552 } 553 554 //************************************************************************* 555 556 XFillBitmapItem::XFillBitmapItem( SfxItemPool* /*pPool*/) 557 : NameOrIndex(XATTR_FILLBITMAP, -1 ) 558 { 559 } 560 561 /************************************************************************* 562 |* 563 |* XFillBitmapItem::Clone(SfxItemPool* pPool) const 564 |* 565 |* Beschreibung 566 |* Ersterstellung 17.11.94 567 |* Letzte Aenderung 17.11.94 568 |* 569 *************************************************************************/ 570 571 SfxPoolItem* XFillBitmapItem::Clone(SfxItemPool* /*pPool*/) const 572 { 573 return new XFillBitmapItem(*this); 574 } 575 576 /************************************************************************* 577 |* 578 |* int XFillBitmapItem::operator==(const SfxPoolItem& rItem) const 579 |* 580 |* Beschreibung 581 |* Ersterstellung 17.11.94 582 |* Letzte Aenderung 26.07.95 583 |* 584 *************************************************************************/ 585 586 int XFillBitmapItem::operator==(const SfxPoolItem& rItem) const 587 { 588 return ( NameOrIndex::operator==(rItem) && 589 aXOBitmap == ((const XFillBitmapItem&) rItem).aXOBitmap ); 590 } 591 592 /************************************************************************* 593 |* 594 |* SfxPoolItem* XFillBitmapItem::Create(SvStream& rIn, sal_uInt16 nVer) const 595 |* 596 |* Beschreibung 597 |* Ersterstellung 17.11.94 598 |* Letzte Aenderung 17.11.94 599 |* 600 *************************************************************************/ 601 602 SfxPoolItem* XFillBitmapItem::Create(SvStream& rIn, sal_uInt16 nVer) const 603 { 604 return new XFillBitmapItem( rIn, nVer ); 605 } 606 607 /************************************************************************* 608 |* 609 |* SfxPoolItem* XFillBitmapItem::Store(SvStream& rOut) const 610 |* 611 |* Beschreibung 612 |* Ersterstellung 17.11.94 613 |* Letzte Aenderung 26.07.94 614 |* 615 *************************************************************************/ 616 617 SvStream& XFillBitmapItem::Store( SvStream& rOut, sal_uInt16 nItemVersion ) const 618 { 619 NameOrIndex::Store( rOut, nItemVersion ); 620 621 if (!IsIndex()) 622 { 623 rOut << (sal_Int16) aXOBitmap.GetBitmapStyle(); 624 if( !aXOBitmap.GetBitmap() ) 625 rOut << (sal_Int16) XBITMAP_NONE; 626 else 627 { 628 rOut << (sal_Int16) aXOBitmap.GetBitmapType(); 629 if( aXOBitmap.GetBitmapType() == XBITMAP_IMPORT ) 630 { 631 const sal_uInt16 nOldComprMode = rOut.GetCompressMode(); 632 sal_uInt16 nNewComprMode = nOldComprMode; 633 634 if( rOut.GetVersion() >= SOFFICE_FILEFORMAT_50 ) 635 nNewComprMode |= COMPRESSMODE_ZBITMAP; 636 else 637 nNewComprMode &= ~COMPRESSMODE_ZBITMAP; 638 639 rOut.SetCompressMode( nNewComprMode ); 640 rOut << aXOBitmap.GetBitmap(); 641 rOut.SetCompressMode( nOldComprMode ); 642 } 643 else if( aXOBitmap.GetBitmapType() == XBITMAP_8X8 ) 644 { 645 sal_uInt16* pArray = aXOBitmap.GetPixelArray(); 646 for( sal_uInt16 i = 0; i < 64; i++ ) 647 rOut << (sal_uInt16) *( pArray + i ); 648 649 rOut << aXOBitmap.GetPixelColor(); 650 rOut << aXOBitmap.GetBackgroundColor(); 651 } 652 } 653 } 654 655 return rOut; 656 } 657 658 /************************************************************************* 659 |* 660 |* const Bitmap& XFillBitmapItem::GetValue(const XBitmapTable* pTable) const 661 |* 662 |* Beschreibung 663 |* Ersterstellung 15.11.94 664 |* Letzte Aenderung 26.07.94 665 |* 666 *************************************************************************/ 667 668 const XOBitmap& XFillBitmapItem::GetBitmapValue(const XBitmapTable* pTable) const // GetValue -> GetBitmapValue 669 { 670 if (!IsIndex()) 671 return aXOBitmap; 672 else 673 return pTable->GetBitmap(GetIndex())->GetXBitmap(); 674 } 675 676 677 /************************************************************************* 678 |* 679 |* sal_uInt16 XFillBitmapItem::GetVersion() const 680 |* 681 |* Beschreibung 682 |* Ersterstellung 26.07.95 683 |* Letzte Aenderung 26.07.95 684 |* 685 *************************************************************************/ 686 687 sal_uInt16 XFillBitmapItem::GetVersion( sal_uInt16 /*nFileFormatVersion*/) const 688 { 689 // 2. Version 690 return( 1 ); 691 } 692 693 //------------------------------------------------------------------------ 694 695 SfxItemPresentation XFillBitmapItem::GetPresentation 696 ( 697 SfxItemPresentation ePres, 698 SfxMapUnit /*eCoreUnit*/, 699 SfxMapUnit /*ePresUnit*/, 700 XubString& rText, const IntlWrapper * 701 ) const 702 { 703 switch ( ePres ) 704 { 705 case SFX_ITEM_PRESENTATION_NONE: 706 rText.Erase(); 707 return ePres; 708 case SFX_ITEM_PRESENTATION_NAMELESS: 709 case SFX_ITEM_PRESENTATION_COMPLETE: 710 rText += GetName(); 711 return ePres; 712 default: 713 return SFX_ITEM_PRESENTATION_NONE; 714 } 715 } 716 717 //------------------------------------------------------------------------ 718 719 sal_Bool XFillBitmapItem::QueryValue( ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId ) const 720 { 721 // sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS); 722 nMemberId &= ~CONVERT_TWIPS; 723 724 // needed for MID_NAME 725 ::rtl::OUString aApiName; 726 // needed for complete item (MID 0) 727 ::rtl::OUString aInternalName; 728 729 ::rtl::OUString aURL; 730 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XBitmap > xBmp; 731 732 if( nMemberId == MID_NAME ) 733 { 734 SvxUnogetApiNameForItem( Which(), GetName(), aApiName ); 735 } 736 else if( nMemberId == 0 ) 737 { 738 aInternalName = GetName(); 739 } 740 741 if( nMemberId == MID_GRAFURL || 742 nMemberId == 0 ) 743 { 744 XOBitmap aLocalXOBitmap( GetBitmapValue() ); 745 aURL = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(UNO_NAME_GRAPHOBJ_URLPREFIX)); 746 aURL += ::rtl::OUString::createFromAscii( aLocalXOBitmap.GetGraphicObject().GetUniqueID().GetBuffer() ); 747 } 748 if( nMemberId == MID_BITMAP || 749 nMemberId == 0 ) 750 { 751 XOBitmap aLocalXOBitmap( GetBitmapValue() ); 752 Bitmap aBmp( aLocalXOBitmap.GetBitmap() ); 753 BitmapEx aBmpEx( aBmp ); 754 755 xBmp.set( VCLUnoHelper::CreateBitmap( aBmpEx ) ); 756 } 757 758 if( nMemberId == MID_NAME ) 759 rVal <<= aApiName; 760 else if( nMemberId == MID_GRAFURL ) 761 rVal <<= aURL; 762 else if( nMemberId == MID_BITMAP ) 763 rVal <<= xBmp; 764 else 765 { 766 // member-id 0 => complete item (e.g. for toolbars) 767 DBG_ASSERT( nMemberId == 0, "invalid member-id" ); 768 uno::Sequence< beans::PropertyValue > aPropSeq( 3 ); 769 770 aPropSeq[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Name" )); 771 aPropSeq[0].Value = uno::makeAny( aInternalName ); 772 aPropSeq[1].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillBitmapURL" )); 773 aPropSeq[1].Value = uno::makeAny( aURL ); 774 aPropSeq[2].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Bitmap" )); 775 aPropSeq[2].Value = uno::makeAny( xBmp ); 776 777 rVal <<= aPropSeq; 778 } 779 780 return sal_True; 781 } 782 783 //------------------------------------------------------------------------ 784 785 sal_Bool XFillBitmapItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId ) 786 { 787 // sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS); 788 nMemberId &= ~CONVERT_TWIPS; 789 790 ::rtl::OUString aName; 791 ::rtl::OUString aURL; 792 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XBitmap > xBmp; 793 ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic > xGraphic; 794 795 bool bSetName = false; 796 bool bSetURL = false; 797 bool bSetBitmap = false; 798 799 if( nMemberId == MID_NAME ) 800 bSetName = (rVal >>= aName); 801 else if( nMemberId == MID_GRAFURL ) 802 bSetURL = (rVal >>= aURL); 803 else if( nMemberId == MID_BITMAP ) 804 { 805 bSetBitmap = (rVal >>= xBmp); 806 if ( !bSetBitmap ) 807 bSetBitmap = (rVal >>= xGraphic ); 808 } 809 else 810 { 811 DBG_ASSERT( nMemberId == 0, "invalid member-id" ); 812 uno::Sequence< beans::PropertyValue > aPropSeq; 813 if( rVal >>= aPropSeq ) 814 { 815 for ( sal_Int32 n = 0; n < aPropSeq.getLength(); n++ ) 816 { 817 if( aPropSeq[n].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Name" ))) 818 bSetName = (aPropSeq[n].Value >>= aName); 819 else if( aPropSeq[n].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "FillBitmapURL" ))) 820 bSetURL = (aPropSeq[n].Value >>= aURL); 821 else if( aPropSeq[n].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Bitmap" ))) 822 bSetBitmap = (aPropSeq[n].Value >>= xBmp); 823 } 824 } 825 } 826 827 if( bSetName ) 828 { 829 SetName( aName ); 830 } 831 if( bSetURL ) 832 { 833 GraphicObject aGrafObj( GraphicObject::CreateGraphicObjectFromURL( aURL ) ); 834 XOBitmap aBMP( aGrafObj ); 835 SetBitmapValue( aBMP ); 836 } 837 if( bSetBitmap ) 838 { 839 Bitmap aInput; 840 if ( xBmp.is() ) 841 { 842 BitmapEx aInputEx( VCLUnoHelper::GetBitmap( xBmp ) ); 843 aInput = aInputEx.GetBitmap(); 844 } 845 else if ( xGraphic.is() ) 846 { 847 Graphic aGraphic( xGraphic ); 848 aInput = aGraphic.GetBitmap(); 849 } 850 851 // note: aXOBitmap is the member bitmap 852 aXOBitmap.SetBitmap( aInput ); 853 aXOBitmap.SetBitmapType(XBITMAP_IMPORT); 854 855 if(aInput.GetSizePixel().Width() == 8 856 && aInput.GetSizePixel().Height() == 8 857 && aInput.GetColorCount() == 2) 858 { 859 aXOBitmap.Bitmap2Array(); 860 aXOBitmap.SetBitmapType(XBITMAP_8X8); 861 aXOBitmap.SetPixelSize(aInput.GetSizePixel()); 862 } 863 } 864 865 return (bSetName || bSetURL || bSetBitmap); 866 } 867 868 sal_Bool XFillBitmapItem::CompareValueFunc( const NameOrIndex* p1, const NameOrIndex* p2 ) 869 { 870 return ((XFillBitmapItem*)p1)->GetBitmapValue().GetGraphicObject().GetUniqueID() == 871 ((XFillBitmapItem*)p2)->GetBitmapValue().GetGraphicObject().GetUniqueID(); 872 } 873 874 XFillBitmapItem* XFillBitmapItem::checkForUniqueItem( SdrModel* pModel ) const 875 { 876 if( pModel ) 877 { 878 const String aUniqueName = NameOrIndex::CheckNamedItem( this, 879 XATTR_FILLBITMAP, 880 &pModel->GetItemPool(), 881 pModel->GetStyleSheetPool() ? &pModel->GetStyleSheetPool()->GetPool() : NULL, 882 XFillBitmapItem::CompareValueFunc, 883 RID_SVXSTR_BMP21, 884 pModel->GetBitmapList() ); 885 886 // if the given name is not valid, replace it! 887 if( aUniqueName != GetName() ) 888 { 889 return new XFillBitmapItem( aUniqueName, aXOBitmap ); 890 } 891 } 892 893 return (XFillBitmapItem*)this; 894 } 895