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_svx.hxx" 26 27 // include --------------------------------------------------------------- 28 29 #include <string> // HACK: prevent conflict between STLPORT and Workshop headers 30 #include <sfx2/app.hxx> 31 #include <sfx2/dispatch.hxx> 32 #include <sfx2/objsh.hxx> 33 #include <sfx2/viewsh.hxx> 34 #include <rtl/ustring.hxx> 35 36 #include <svx/dialogs.hrc> 37 38 #define DELAY_TIMEOUT 300 39 40 #define TMP_STR_BEGIN '[' 41 #define TMP_STR_END ']' 42 43 #include "svx/drawitem.hxx" 44 #include "svx/xattr.hxx" 45 #include <svx/xtable.hxx> 46 #include <svx/fillctrl.hxx> 47 #include <svx/itemwin.hxx> 48 #include <svx/dialmgr.hxx> 49 #include "helpid.hrc" 50 51 using namespace ::com::sun::star::uno; 52 using namespace ::com::sun::star::util; 53 using namespace ::com::sun::star::beans; 54 using namespace ::com::sun::star::frame; 55 using namespace ::com::sun::star::lang; 56 57 SFX_IMPL_TOOLBOX_CONTROL( SvxFillToolBoxControl, XFillStyleItem ); 58 59 /************************************************************************* 60 |* 61 |* SvxFillToolBoxControl 62 |* 63 \************************************************************************/ 64 65 SvxFillToolBoxControl::SvxFillToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) : 66 SfxToolBoxControl( nSlotId, nId, rTbx ), 67 68 pStyleItem ( NULL ), 69 pColorItem ( NULL ), 70 pGradientItem ( NULL ), 71 pHatchItem ( NULL ), 72 pBitmapItem ( NULL ), 73 pFillControl ( NULL ), 74 pFillTypeLB ( NULL ), 75 pFillAttrLB ( NULL ), 76 bUpdate ( sal_False ), 77 eLastXFS ( XFILL_NONE ) 78 { 79 addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillColor" ))); 80 addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillGradient" ))); 81 addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillHatch" ))); 82 addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillBitmap" ))); 83 addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:ColorTableState" ))); 84 addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:GradientListState" ))); 85 addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:HatchListState" ))); 86 addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:BitmapListState" ))); 87 } 88 89 //======================================================================== 90 91 SvxFillToolBoxControl::~SvxFillToolBoxControl() 92 { 93 delete pStyleItem; 94 delete pColorItem; 95 delete pGradientItem; 96 delete pHatchItem; 97 delete pBitmapItem; 98 } 99 100 //======================================================================== 101 102 void SvxFillToolBoxControl::StateChanged( 103 104 sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState ) 105 106 { 107 bool bEnableControls = sal_False; 108 109 if( eState == SFX_ITEM_DISABLED ) 110 { 111 if( nSID == SID_ATTR_FILL_STYLE ) 112 { 113 pFillTypeLB->Disable(); 114 pFillTypeLB->SetNoSelection(); 115 } 116 pFillAttrLB->Disable(); 117 pFillAttrLB->SetNoSelection(); 118 } 119 else 120 { 121 if ( SFX_ITEM_AVAILABLE == eState ) 122 { 123 if( nSID == SID_ATTR_FILL_STYLE ) 124 { 125 delete pStyleItem; 126 pStyleItem = (XFillStyleItem*) pState->Clone(); 127 pFillTypeLB->Enable(); 128 } 129 else if( pStyleItem ) 130 { 131 XFillStyle eXFS = (XFillStyle)pStyleItem->GetValue(); 132 133 if( nSID == SID_ATTR_FILL_COLOR ) 134 { 135 delete pColorItem; 136 pColorItem = (XFillColorItem*) pState->Clone(); 137 138 if( eXFS == XFILL_SOLID ) 139 bEnableControls = sal_True; 140 } 141 else if( nSID == SID_ATTR_FILL_GRADIENT ) 142 { 143 delete pGradientItem; 144 pGradientItem = (XFillGradientItem*) pState->Clone(); 145 146 if( eXFS == XFILL_GRADIENT ) 147 bEnableControls = sal_True; 148 } 149 else if( nSID == SID_ATTR_FILL_HATCH ) 150 { 151 delete pHatchItem; 152 pHatchItem = (XFillHatchItem*) pState->Clone(); 153 154 if( eXFS == XFILL_HATCH ) 155 bEnableControls = sal_True; 156 } 157 else if( nSID == SID_ATTR_FILL_BITMAP ) 158 { 159 delete pBitmapItem; 160 pBitmapItem = (XFillBitmapItem*) pState->Clone(); 161 162 if( eXFS == XFILL_BITMAP ) 163 bEnableControls = sal_True; 164 } 165 } 166 167 if( pStyleItem ) 168 { 169 // ensure that the correct entry is selected in pFillTypeLB. It 170 // might have been changed by nSID == SID_ATTR_FILL_STYLE, but 171 // it might also be in an in-between state when user had started to 172 // change fillstyle, but not yet changed fillvalue for new style 173 // and when nSID == SID_ATTR_FILL_COLOR/SID_ATTR_FILL_GRADIENT/ 174 // SID_ATTR_FILL_HATCH/SID_ATTR_FILL_BITMAP value change is triggered 175 eLastXFS = pFillTypeLB->GetSelectEntryPos(); 176 XFillStyle eXFS = (XFillStyle)pStyleItem->GetValue(); 177 178 if(eLastXFS != eXFS) 179 { 180 bUpdate = sal_True; 181 pFillTypeLB->SelectEntryPos( sal::static_int_cast< sal_uInt16 >( eXFS ) ); 182 } 183 184 pFillAttrLB->Enable(); 185 } 186 187 if( bEnableControls ) 188 { 189 //pFillTypeLB->Enable(); 190 pFillAttrLB->Enable(); 191 192 bUpdate = sal_True; 193 } 194 195 Update( pState ); 196 } 197 else 198 { 199 // leerer oder uneindeutiger Status 200 if( nSID == SID_ATTR_FILL_STYLE ) 201 { 202 pFillTypeLB->SetNoSelection(); 203 pFillAttrLB->Disable(); 204 pFillAttrLB->SetNoSelection(); 205 bUpdate = sal_False; 206 } 207 else 208 { 209 XFillStyle eXFS = XFILL_NONE; 210 if( pStyleItem ) 211 eXFS = (XFillStyle)pStyleItem->GetValue(); 212 if( !pStyleItem || 213 ( nSID == SID_ATTR_FILL_COLOR && eXFS == XFILL_SOLID ) || 214 ( nSID == SID_ATTR_FILL_GRADIENT && eXFS == XFILL_GRADIENT ) || 215 ( nSID == SID_ATTR_FILL_HATCH && eXFS == XFILL_HATCH ) || 216 ( nSID == SID_ATTR_FILL_BITMAP && eXFS == XFILL_BITMAP ) ) 217 { 218 pFillAttrLB->SetNoSelection(); 219 //bUpdate = sal_False; 220 } 221 } 222 } 223 } 224 } 225 226 //======================================================================== 227 228 void SvxFillToolBoxControl::Update( const SfxPoolItem* pState ) 229 { 230 if ( pStyleItem && pState && bUpdate ) 231 { 232 bUpdate = sal_False; 233 234 XFillStyle eXFS = (XFillStyle)pStyleItem->GetValue(); 235 236 // Pruefen, ob Fuellstil schon vorher aktiv war 237 //if( eTmpXFS != eXFS ) 238 if( (XFillStyle) eLastXFS != eXFS ) 239 pFillControl->SelectFillTypeHdl( NULL ); 240 //eLastXFS = eXFS; 241 242 switch( eXFS ) 243 { 244 case XFILL_NONE: 245 break; 246 247 case XFILL_SOLID: 248 { 249 if ( pColorItem ) 250 { 251 String aString( pColorItem->GetName() ); 252 ::Color aColor = pColorItem->GetColorValue(); 253 254 pFillAttrLB->SelectEntry( aString ); 255 256 if ( pFillAttrLB->GetSelectEntryPos() == LISTBOX_ENTRY_NOTFOUND || 257 pFillAttrLB->GetSelectEntryColor() != aColor ) 258 pFillAttrLB->SelectEntry( aColor ); 259 260 // NEU 261 // Pruefen, ob Eintrag nicht in der Liste ist 262 if( pFillAttrLB->GetSelectEntryPos() == 263 LISTBOX_ENTRY_NOTFOUND || 264 pFillAttrLB->GetSelectEntryColor() != aColor ) 265 { 266 sal_uInt16 nCount = pFillAttrLB->GetEntryCount(); 267 String aTmpStr; 268 if( nCount > 0 ) 269 { 270 //Letzter Eintrag wird auf temporaere Farbe geprueft 271 aTmpStr = pFillAttrLB->GetEntry( nCount - 1 ); 272 if( aTmpStr.GetChar(0) == TMP_STR_BEGIN && 273 aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END ) 274 { 275 pFillAttrLB->RemoveEntry( nCount - 1 ); 276 } 277 } 278 aTmpStr = TMP_STR_BEGIN; 279 aTmpStr += aString; 280 aTmpStr += TMP_STR_END; 281 282 //pFillAttrLB->SetUpdateMode( sal_False ); 283 sal_uInt16 nPos = pFillAttrLB->InsertEntry( aColor, aTmpStr ); 284 //pFillAttrLB->SetUpdateMode( sal_True ); 285 pFillAttrLB->SelectEntryPos( nPos ); 286 } 287 // NEU 288 } 289 else 290 pFillAttrLB->SetNoSelection(); 291 } 292 break; 293 294 case XFILL_GRADIENT: 295 { 296 if ( pGradientItem ) 297 { 298 String aString( pGradientItem->GetName() ); 299 pFillAttrLB->SelectEntry( aString ); 300 // NEU 301 // Pruefen, ob Eintrag nicht in der Liste ist 302 if( pFillAttrLB->GetSelectEntry() != aString ) 303 { 304 sal_uInt16 nCount = pFillAttrLB->GetEntryCount(); 305 String aTmpStr; 306 if( nCount > 0 ) 307 { 308 //Letzter Eintrag wird auf temporaeren Eintrag geprueft 309 aTmpStr = pFillAttrLB->GetEntry( nCount - 1 ); 310 if( aTmpStr.GetChar(0) == TMP_STR_BEGIN && 311 aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END ) 312 { 313 pFillAttrLB->RemoveEntry( nCount - 1 ); 314 } 315 } 316 aTmpStr = TMP_STR_BEGIN; 317 aTmpStr += aString; 318 aTmpStr += TMP_STR_END; 319 320 XGradientEntry* pEntry = new XGradientEntry( pGradientItem->GetGradientValue(), aTmpStr ); 321 XGradientListSharedPtr aGradientList(XPropertyListFactory::CreateSharedXGradientList(String::CreateFromAscii("TmpList"))); 322 323 aGradientList->Insert(pEntry); 324 aGradientList->SetDirty(false); 325 const Bitmap aBmp = aGradientList->GetUiBitmap( 0 ); 326 327 if( !aBmp.IsEmpty() ) 328 { 329 ( (ListBox*)pFillAttrLB )->InsertEntry( pEntry->GetName(), aBmp ); 330 pFillAttrLB->SelectEntryPos( pFillAttrLB->GetEntryCount() - 1 ); 331 } 332 } 333 // NEU 334 } 335 else 336 pFillAttrLB->SetNoSelection(); 337 } 338 break; 339 340 case XFILL_HATCH: 341 { 342 if ( pHatchItem ) 343 { 344 String aString( pHatchItem->GetName() ); 345 pFillAttrLB->SelectEntry( aString ); 346 // NEU 347 // Pruefen, ob Eintrag nicht in der Liste ist 348 if( pFillAttrLB->GetSelectEntry() != aString ) 349 { 350 sal_uInt16 nCount = pFillAttrLB->GetEntryCount(); 351 String aTmpStr; 352 if( nCount > 0 ) 353 { 354 //Letzter Eintrag wird auf temporaeren Eintrag geprueft 355 aTmpStr = pFillAttrLB->GetEntry( nCount - 1 ); 356 if( aTmpStr.GetChar(0) == TMP_STR_BEGIN && 357 aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END ) 358 { 359 pFillAttrLB->RemoveEntry( nCount - 1 ); 360 } 361 } 362 aTmpStr = TMP_STR_BEGIN; 363 aTmpStr += aString; 364 aTmpStr += TMP_STR_END; 365 366 XHatchEntry* pEntry = new XHatchEntry( pHatchItem->GetHatchValue(), aTmpStr ); 367 XHatchListSharedPtr aHatchList(XPropertyListFactory::CreateSharedXHatchList(String::CreateFromAscii("TmpList"))); 368 369 aHatchList->Insert( pEntry ); 370 aHatchList->SetDirty( sal_False ); 371 const Bitmap aBmp = aHatchList->GetUiBitmap( 0 ); 372 373 if( !aBmp.IsEmpty() ) 374 { 375 ( (ListBox*)pFillAttrLB )->InsertEntry( pEntry->GetName(), aBmp ); 376 pFillAttrLB->SelectEntryPos( pFillAttrLB->GetEntryCount() - 1 ); 377 } 378 } 379 // NEU 380 } 381 else 382 pFillAttrLB->SetNoSelection(); 383 } 384 break; 385 386 case XFILL_BITMAP: 387 { 388 if ( pBitmapItem ) 389 // && 390 // SfxObjectShell::Current() && 391 // SfxObjectShell::Current()->GetItem( SID_BITMAP_LIST ) ) 392 { 393 String aString( pBitmapItem->GetName() ); 394 // Bitmap aBitmap( pBitmapItem->GetValue() ); 395 396 // SvxBitmapListItem aItem( *(const SvxBitmapListItem*)( 397 // SfxObjectShell::Current()->GetItem( SID_BITMAP_LIST ) ) ); 398 pFillAttrLB->SelectEntry( aString ); 399 // NEU 400 // Pruefen, ob Eintrag nicht in der Liste ist 401 if( pFillAttrLB->GetSelectEntry() != aString ) 402 { 403 sal_uInt16 nCount = pFillAttrLB->GetEntryCount(); 404 String aTmpStr; 405 if( nCount > 0 ) 406 { 407 //Letzter Eintrag wird auf temporaeren Eintrag geprueft 408 aTmpStr = pFillAttrLB->GetEntry( nCount - 1 ); 409 if( aTmpStr.GetChar(0) == TMP_STR_BEGIN && 410 aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END ) 411 { 412 pFillAttrLB->RemoveEntry( nCount - 1 ); 413 } 414 } 415 aTmpStr = TMP_STR_BEGIN; 416 aTmpStr += aString; 417 aTmpStr += TMP_STR_END; 418 419 XBitmapListSharedPtr aNew(XPropertyListFactory::CreateSharedXBitmapList(String::CreateFromAscii("TmpList"))); 420 aNew->Insert(new XBitmapEntry(pBitmapItem->GetGraphicObject(), aTmpStr)); 421 aNew->SetDirty(false); 422 423 pFillAttrLB->Fill( aNew ); 424 pFillAttrLB->SelectEntryPos( pFillAttrLB->GetEntryCount() - 1 ); 425 } 426 // NEU 427 } 428 else 429 pFillAttrLB->SetNoSelection(); 430 } 431 break; 432 433 default: 434 DBG_ERROR( "Nicht unterstuetzter Flaechentyp" ); 435 break; 436 } 437 } 438 439 if( pState && pStyleItem ) 440 { 441 XFillStyle eXFS = (XFillStyle) pStyleItem->GetValue(); 442 443 // Die Listen haben sich geaendert ? 444 if( pState->ISA( SvxColorTableItem ) && 445 eXFS == XFILL_SOLID ) 446 { 447 ::Color aTmpColor( pFillAttrLB->GetSelectEntryColor() ); 448 pFillAttrLB->Clear(); 449 pFillAttrLB->Fill( ( (SvxColorTableItem*)pState )->GetColorTable() ); 450 pFillAttrLB->SelectEntry( aTmpColor ); 451 } 452 if( pState->ISA( SvxGradientListItem ) && 453 eXFS == XFILL_GRADIENT ) 454 { 455 String aString( pFillAttrLB->GetSelectEntry() ); 456 pFillAttrLB->Clear(); 457 pFillAttrLB->Fill( ( (SvxGradientListItem*)pState )->GetGradientList() ); 458 pFillAttrLB->SelectEntry( aString ); 459 } 460 if( pState->ISA( SvxHatchListItem ) && 461 eXFS == XFILL_HATCH ) 462 { 463 String aString( pFillAttrLB->GetSelectEntry() ); 464 pFillAttrLB->Clear(); 465 pFillAttrLB->Fill( ( (SvxHatchListItem*)pState )->GetHatchList() ); 466 pFillAttrLB->SelectEntry( aString ); 467 } 468 if( pState->ISA( SvxBitmapListItem ) && 469 eXFS == XFILL_BITMAP ) 470 { 471 String aString( pFillAttrLB->GetSelectEntry() ); 472 pFillAttrLB->Clear(); 473 pFillAttrLB->Fill( ( (SvxBitmapListItem*)pState )->GetBitmapList() ); 474 pFillAttrLB->SelectEntry( aString ); 475 } 476 } 477 } 478 479 //======================================================================== 480 481 Window* SvxFillToolBoxControl::CreateItemWindow( Window *pParent ) 482 { 483 if ( GetSlotId() == SID_ATTR_FILL_STYLE ) 484 { 485 pFillControl = new FillControl( pParent ); 486 // Damit dem FillControl das SvxFillToolBoxControl bekannt ist 487 // (und um kompatibel zu bleiben) 488 pFillControl->SetData( this ); 489 490 pFillAttrLB = (SvxFillAttrBox*)pFillControl->pLbFillAttr; 491 pFillTypeLB = (SvxFillTypeBox*)pFillControl->pLbFillType; 492 493 pFillAttrLB->SetUniqueId( HID_FILL_ATTR_LISTBOX ); 494 pFillTypeLB->SetUniqueId( HID_FILL_TYPE_LISTBOX ); 495 496 return pFillControl; 497 } 498 return NULL; 499 } 500 501 /************************************************************************* 502 |* 503 |* FillControl 504 |* 505 \************************************************************************/ 506 507 FillControl::FillControl( Window* pParent, WinBits nStyle ) : 508 Window( pParent, nStyle | WB_DIALOGCONTROL ), 509 pLbFillType(new SvxFillTypeBox( this )), 510 aLogicalFillSize(40,80), 511 aLogicalAttrSize(50,80) 512 { 513 pLbFillAttr = new SvxFillAttrBox( this ); 514 Size aTypeSize(LogicToPixel(aLogicalFillSize, MAP_APPFONT)); 515 Size aAttrSize(LogicToPixel(aLogicalAttrSize, MAP_APPFONT)); 516 pLbFillType->SetSizePixel(aTypeSize); 517 pLbFillAttr->SetSizePixel(aAttrSize); 518 //to get the base height 519 aTypeSize = pLbFillType->GetSizePixel(); 520 aAttrSize = pLbFillAttr->GetSizePixel(); 521 Point aAttrPnt = pLbFillAttr->GetPosPixel(); 522 SetSizePixel( 523 Size( aAttrPnt.X() + aAttrSize.Width(), 524 Max( aAttrSize.Height(), aTypeSize.Height() ) ) ); 525 526 pLbFillType->SetSelectHdl( LINK( this, FillControl, SelectFillTypeHdl ) ); 527 pLbFillAttr->SetSelectHdl( LINK( this, FillControl, SelectFillAttrHdl ) ); 528 529 aDelayTimer.SetTimeout( DELAY_TIMEOUT ); 530 aDelayTimer.SetTimeoutHdl( LINK( this, FillControl, DelayHdl ) ); 531 aDelayTimer.Start(); 532 } 533 534 //------------------------------------------------------------------------ 535 536 FillControl::~FillControl() 537 { 538 delete pLbFillType; 539 delete pLbFillAttr; 540 } 541 542 //------------------------------------------------------------------------ 543 544 IMPL_LINK_INLINE_START( FillControl, DelayHdl, Timer *, EMPTYARG ) 545 { 546 SelectFillTypeHdl( NULL ); 547 ( (SvxFillToolBoxControl*)GetData() )->updateStatus( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillStyle" ))); 548 // ( (SvxFillToolBoxControl*)GetData() )->GetBindings().Invalidate( SID_ATTR_FILL_STYLE ); 549 return 0; 550 } 551 IMPL_LINK_INLINE_END( FillControl, DelayHdl, Timer *, pTimer ) 552 553 //------------------------------------------------------------------------ 554 555 IMPL_LINK( FillControl, SelectFillTypeHdl, ListBox *, pBox ) 556 { 557 XFillStyle eXFS = (XFillStyle)pLbFillType->GetSelectEntryPos(); 558 559 // Spaeter sollte eine Optimierung derart erfolgen, dass die 560 // Listen, bzw. Tables nur dann geloescht und wieder aufgebaut 561 // werden, wenn sich die Listen, bzw. Tables tatsaechlich geaendert 562 // haben (in den LBs natuerlich). 563 564 if ( ( pBox && !pBox->IsTravelSelect() ) || !pBox ) 565 { 566 // Damit wir in folgendem Fall einen Status anzeigen koennen: 567 // Ein Typ wurde ausgewaehlt aber kein Attribut. 568 // Die Selektion hat genau die gleichen Attribute wie die vorherige. 569 // SvxFillToolBoxControl* pControlerItem = (SvxFillToolBoxControl*)GetData(); 570 // if( pControlerItem ) 571 // pControlerItem->ClearCache(); 572 573 pLbFillAttr->Clear(); 574 SfxObjectShell* pSh = SfxObjectShell::Current(); 575 576 switch( eXFS ) 577 { 578 case XFILL_NONE: 579 { 580 pLbFillType->Selected(); 581 SelectFillAttrHdl( pBox ); 582 pLbFillAttr->Disable(); 583 } 584 break; 585 586 case XFILL_SOLID: 587 { 588 if ( pSh && pSh->GetItem( SID_COLOR_TABLE ) ) 589 { 590 SvxColorTableItem aItem( *(const SvxColorTableItem*)( 591 pSh->GetItem( SID_COLOR_TABLE ) ) ); 592 pLbFillAttr->Enable(); 593 pLbFillAttr->Fill( aItem.GetColorTable() ); 594 } 595 else 596 pLbFillAttr->Disable(); 597 } 598 break; 599 600 case XFILL_GRADIENT: 601 { 602 if ( pSh && pSh->GetItem( SID_GRADIENT_LIST ) ) 603 { 604 SvxGradientListItem aItem( *(const SvxGradientListItem*)( 605 pSh->GetItem( SID_GRADIENT_LIST ) ) ); 606 pLbFillAttr->Enable(); 607 pLbFillAttr->Fill( aItem.GetGradientList() ); 608 } 609 else 610 pLbFillAttr->Disable(); 611 } 612 break; 613 614 case XFILL_HATCH: 615 { 616 if ( pSh && pSh->GetItem( SID_HATCH_LIST ) ) 617 { 618 SvxHatchListItem aItem( *(const SvxHatchListItem*)( 619 pSh->GetItem( SID_HATCH_LIST ) ) ); 620 pLbFillAttr->Enable(); 621 pLbFillAttr->Fill( aItem.GetHatchList() ); 622 } 623 else 624 pLbFillAttr->Disable(); 625 } 626 break; 627 628 case XFILL_BITMAP: 629 { 630 if ( pSh && pSh->GetItem( SID_BITMAP_LIST ) ) 631 { 632 SvxBitmapListItem aItem( *(const SvxBitmapListItem*)( 633 pSh->GetItem( SID_BITMAP_LIST ) ) ); 634 pLbFillAttr->Enable(); 635 pLbFillAttr->Fill( aItem.GetBitmapList() ); 636 } 637 else 638 pLbFillAttr->Disable(); 639 } 640 break; 641 } 642 643 if( eXFS != XFILL_NONE ) // Wurde schon erledigt 644 { 645 if ( pBox ) 646 pLbFillType->Selected(); 647 648 // release focus 649 if ( pBox && pLbFillType->IsRelease() ) 650 { 651 SfxViewShell* pViewShell = SfxViewShell::Current(); 652 if( pViewShell && pViewShell->GetWindow() ) 653 pViewShell->GetWindow()->GrabFocus(); 654 } 655 } 656 } 657 return 0; 658 } 659 660 //------------------------------------------------------------------------ 661 662 IMPL_LINK( FillControl, SelectFillAttrHdl, ListBox *, pBox ) 663 { 664 XFillStyle eXFS = (XFillStyle)pLbFillType->GetSelectEntryPos(); 665 XFillStyleItem aXFillStyleItem( eXFS ); 666 sal_Bool bAction = pBox && !pLbFillAttr->IsTravelSelect(); 667 668 SfxObjectShell* pSh = SfxObjectShell::Current(); 669 if ( bAction ) 670 { 671 Any a; 672 Sequence< PropertyValue > aArgs( 1 ); 673 674 // First set the style 675 aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillStyle" )); 676 aXFillStyleItem.QueryValue( a ); 677 aArgs[0].Value = a; 678 ((SvxFillToolBoxControl*)GetData())->Dispatch( 679 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillStyle" )), aArgs ); 680 681 switch( eXFS ) 682 { 683 case XFILL_NONE: 684 { 685 } 686 break; 687 688 case XFILL_SOLID: 689 { 690 // NEU 691 //Eintrag wird auf temporaere Farbe geprueft 692 String aTmpStr = pLbFillAttr->GetSelectEntry(); 693 if( aTmpStr.GetChar(0) == TMP_STR_BEGIN && aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END ) 694 { 695 aTmpStr.Erase( aTmpStr.Len()-1, 1 ); 696 aTmpStr.Erase( 0, 1 ); 697 } 698 699 XFillColorItem aXFillColorItem( aTmpStr, pLbFillAttr->GetSelectEntryColor() ); 700 701 aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillColor" )); 702 aXFillColorItem.QueryValue( a ); 703 aArgs[0].Value = a; 704 ((SvxFillToolBoxControl*)GetData())->Dispatch( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillColor" )), 705 aArgs ); 706 } 707 break; 708 case XFILL_GRADIENT: 709 { 710 sal_uInt16 nPos = pLbFillAttr->GetSelectEntryPos(); 711 712 if ( nPos != LISTBOX_ENTRY_NOTFOUND && pSh && pSh->GetItem( SID_GRADIENT_LIST ) ) 713 { 714 SvxGradientListItem aItem( 715 *(const SvxGradientListItem*)( pSh->GetItem( SID_GRADIENT_LIST ) ) ); 716 717 if ( nPos < aItem.GetGradientList()->Count() ) // kein temp. Eintrag ? 718 { 719 XGradient aGradient = aItem.GetGradientList()->GetGradient( nPos )->GetGradient(); 720 XFillGradientItem aXFillGradientItem( pLbFillAttr->GetSelectEntry(), aGradient ); 721 722 aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillGradient" )); 723 aXFillGradientItem.QueryValue( a ); 724 aArgs[0].Value = a; 725 ((SvxFillToolBoxControl*)GetData())->Dispatch( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillGradient" )), 726 aArgs ); 727 } 728 } 729 } 730 break; 731 732 case XFILL_HATCH: 733 { 734 sal_uInt16 nPos = pLbFillAttr->GetSelectEntryPos(); 735 736 if ( nPos != LISTBOX_ENTRY_NOTFOUND && pSh && pSh->GetItem( SID_HATCH_LIST ) ) 737 { 738 SvxHatchListItem aItem( *(const SvxHatchListItem*)( pSh->GetItem( SID_HATCH_LIST ) ) ); 739 740 if ( nPos < aItem.GetHatchList()->Count() ) // kein temp. Eintrag ? 741 { 742 XHatch aHatch = aItem.GetHatchList()->GetHatch( nPos )->GetHatch(); 743 XFillHatchItem aXFillHatchItem( pLbFillAttr->GetSelectEntry(), aHatch ); 744 745 aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillHatch" )); 746 aXFillHatchItem.QueryValue( a ); 747 aArgs[0].Value = a; 748 ((SvxFillToolBoxControl*)GetData())->Dispatch( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillHatch" )), 749 aArgs ); 750 } 751 } 752 } 753 break; 754 755 case XFILL_BITMAP: 756 { 757 sal_uInt16 nPos = pLbFillAttr->GetSelectEntryPos(); 758 759 if ( nPos != LISTBOX_ENTRY_NOTFOUND && pSh && pSh->GetItem( SID_BITMAP_LIST ) ) 760 { 761 SvxBitmapListItem aItem( 762 *(const SvxBitmapListItem*)( pSh->GetItem( SID_BITMAP_LIST ) ) ); 763 764 if ( nPos < aItem.GetBitmapList()->Count() ) // kein temp. Eintrag ? 765 { 766 const XBitmapEntry* pXBitmapEntry = aItem.GetBitmapList()->GetBitmap(nPos); 767 const XFillBitmapItem aXFillBitmapItem(pLbFillAttr->GetSelectEntry(), pXBitmapEntry->GetGraphicObject()); 768 769 aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillBitmap" )); 770 aXFillBitmapItem.QueryValue( a ); 771 aArgs[0].Value = a; 772 ((SvxFillToolBoxControl*)GetData())->Dispatch(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:FillBitmap")), aArgs); 773 } 774 } 775 } 776 break; 777 } 778 779 // release focus 780 if ( pLbFillAttr->IsRelease() && pBox ) 781 { 782 SfxViewShell* pViewShell = SfxViewShell::Current(); 783 if( pViewShell && pViewShell->GetWindow() ) 784 { 785 pViewShell->GetWindow()->GrabFocus(); 786 } 787 } 788 } 789 790 return 0; 791 } 792 793 //------------------------------------------------------------------------ 794 795 void FillControl::Resize() 796 { 797 // Breite der beiden ListBoxen nicht 1/2 : 1/2, sondern 2/5 : 3/5 798 long nW = GetOutputSizePixel().Width() / 5; 799 long nH = 180; 800 long nSep = 0; // war vorher 4 801 802 pLbFillType->SetSizePixel( Size( nW * 2 - nSep, nH ) ); 803 pLbFillAttr->SetPosSizePixel( Point( nW * 2 + nSep, 0 ), Size( nW * 3 - nSep, nH ) ); 804 } 805 /* -----------------------------08.03.2002 15:04------------------------------ 806 807 ---------------------------------------------------------------------------*/ 808 809 void FillControl::DataChanged( const DataChangedEvent& rDCEvt ) 810 { 811 if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && 812 (rDCEvt.GetFlags() & SETTINGS_STYLE) ) 813 { 814 Size aTypeSize(LogicToPixel(aLogicalFillSize, MAP_APPFONT)); 815 Size aAttrSize(LogicToPixel(aLogicalAttrSize, MAP_APPFONT)); 816 pLbFillType->SetSizePixel(aTypeSize); 817 pLbFillAttr->SetSizePixel(aAttrSize); 818 //to get the base height 819 aTypeSize = pLbFillType->GetSizePixel(); 820 aAttrSize = pLbFillAttr->GetSizePixel(); 821 Point aAttrPnt = pLbFillAttr->GetPosPixel(); 822 823 SetSizePixel( 824 Size( aAttrPnt.X() + aAttrSize.Width(), 825 Max( aAttrSize.Height(), aTypeSize.Height() ) ) ); 826 } 827 Window::DataChanged( rDCEvt ); 828 } 829 830