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_cui.hxx" 26 27 // include --------------------------------------------------------------- 28 29 //svdraw.hxx 30 #define _SVDRAW_HXX 31 #define _SDR_NOITEMS 32 #define _SDR_NOTOUCH 33 #define _SDR_NOTRANSFORM 34 #define _SDR_NOOBJECTS 35 #define _SDR_NOVIEWS 36 #define _SDR_NOVIEWMARKER 37 #define _SDR_NODRAGMETHODS 38 #define _SDR_NOUNDO 39 #define _SDR_NOXOUTDEV 40 #include <vcl/wrkwin.hxx> 41 #include <tools/shl.hxx> 42 #include <vcl/msgbox.hxx> 43 #include <tools/urlobj.hxx> 44 #include <unotools/ucbstreamhelper.hxx> 45 #include <unotools/pathoptions.hxx> 46 #include <sfx2/app.hxx> 47 #include <sfx2/filedlghelper.hxx> 48 #include <unotools/localfilehelper.hxx> 49 #include "com/sun/star/ui/dialogs/TemplateDescription.hpp" 50 #include <svx/dialmgr.hxx> 51 #include <vcl/bmpacc.hxx> 52 #include <svx/dialogs.hrc> 53 54 #define _SVX_TPBITMAP_CXX 55 56 #include <cuires.hrc> 57 #include "helpid.hrc" 58 #include "svx/xattr.hxx" 59 #include <svx/xpool.hxx> 60 #include <svx/xtable.hxx> 61 #include "svx/xoutbmp.hxx" 62 #include "svx/drawitem.hxx" 63 #include "cuitabarea.hxx" 64 #include "tabarea.hrc" 65 #include "defdlgname.hxx" //CHINA001 #include "dlgname.hxx" 66 //#include "dlgname.hrc" 67 #include <svx/svxdlg.hxx> //CHINA001 68 #include <dialmgr.hxx> 69 #include "sfx2/opengrf.hxx" 70 #include "paragrph.hrc" 71 72 #define DLGWIN this->GetParent()->GetParent() 73 74 /************************************************************************* 75 |* 76 |* Dialog zum Aendern und Definieren der Bitmaps 77 |* 78 \************************************************************************/ 79 80 SvxBitmapTabPage::SvxBitmapTabPage 81 ( 82 Window* pParent, 83 const SfxItemSet& rInAttrs 84 ) : 85 86 SvxTabPage ( pParent, CUI_RES( RID_SVXPAGE_BITMAP ), rInAttrs ), 87 88 aCtlPixel ( this, CUI_RES( CTL_PIXEL ) ), 89 aFtPixelEdit ( this, CUI_RES( FT_PIXEL_EDIT ) ), 90 aFtColor ( this, CUI_RES( FT_COLOR ) ), 91 aLbColor ( this, CUI_RES( LB_COLOR ) ), 92 aFtBackgroundColor ( this, CUI_RES( FT_BACKGROUND_COLOR ) ), 93 aLbBackgroundColor ( this, CUI_RES( LB_BACKGROUND_COLOR ) ), 94 // This fix text is used only to provide the name for the following 95 // bitmap list box. The fixed text is not displayed. 96 aLbBitmapsHidden ( this, CUI_RES( FT_BITMAPS_HIDDEN ) ), 97 aLbBitmaps ( this, CUI_RES( LB_BITMAPS ) ), 98 aFlProp ( this, CUI_RES( FL_PROP ) ), 99 aCtlPreview ( this, CUI_RES( CTL_PREVIEW ) ), 100 aBtnAdd ( this, CUI_RES( BTN_ADD ) ), 101 aBtnModify ( this, CUI_RES( BTN_MODIFY ) ), 102 aBtnImport ( this, CUI_RES( BTN_IMPORT ) ), 103 aBtnDelete ( this, CUI_RES( BTN_DELETE ) ), 104 aBtnLoad ( this, CUI_RES( BTN_LOAD ) ), 105 aBtnSave ( this, CUI_RES( BTN_SAVE ) ), 106 107 aBitmapCtl ( this, aCtlPreview.GetSizePixel() ), 108 rOutAttrs ( rInAttrs ), 109 110 pColorTab( NULL ), 111 pBitmapList( NULL ), 112 113 pXPool ( (XOutdevItemPool*) rInAttrs.GetPool() ), 114 aXFStyleItem ( XFILL_BITMAP ), 115 aXBitmapItem ( String(), Graphic() ), 116 aXFillAttr ( pXPool ), 117 rXFSet ( aXFillAttr.GetItemSet() ) 118 { 119 aBtnLoad.SetModeImage( Image( CUI_RES( RID_SVXIMG_LOAD_H ) ), BMP_COLOR_HIGHCONTRAST ); 120 aBtnSave.SetModeImage( Image( CUI_RES( RID_SVXIMG_SAVE_H ) ), BMP_COLOR_HIGHCONTRAST ); 121 FreeResource(); 122 123 // diese Page braucht ExchangeSupport 124 SetExchangeSupport(); 125 126 // Setzen des Output-Devices 127 rXFSet.Put( aXFStyleItem ); 128 rXFSet.Put( aXBitmapItem ); 129 //aCtlPreview.SetAttributes( aXFillAttr ); 130 131 aBtnAdd.SetClickHdl( LINK( this, SvxBitmapTabPage, ClickAddHdl_Impl ) ); 132 aBtnImport.SetClickHdl( 133 LINK( this, SvxBitmapTabPage, ClickImportHdl_Impl ) ); 134 aBtnModify.SetClickHdl( 135 LINK( this, SvxBitmapTabPage, ClickModifyHdl_Impl ) ); 136 aBtnDelete.SetClickHdl( 137 LINK( this, SvxBitmapTabPage, ClickDeleteHdl_Impl ) ); 138 aBtnLoad.SetClickHdl( LINK( this, SvxBitmapTabPage, ClickLoadHdl_Impl ) ); 139 aBtnSave.SetClickHdl( LINK( this, SvxBitmapTabPage, ClickSaveHdl_Impl ) ); 140 141 aLbBitmaps.SetSelectHdl( 142 LINK( this, SvxBitmapTabPage, ChangeBitmapHdl_Impl ) ); 143 aLbColor.SetSelectHdl( 144 LINK( this, SvxBitmapTabPage, ChangePixelColorHdl_Impl ) ); 145 aLbBackgroundColor.SetSelectHdl( 146 LINK( this, SvxBitmapTabPage, ChangeBackgrndColorHdl_Impl ) ); 147 148 String accName = String(CUI_RES(STR_EXAMPLE)); 149 aCtlPreview.SetAccessibleName(accName); 150 aCtlPixel.SetAccessibleRelationMemberOf( &aFlProp ); 151 aCtlPixel.SetAccessibleRelationLabeledBy( &aFtPixelEdit ); 152 aLbBitmaps.SetAccessibleRelationLabeledBy(&aLbBitmaps); 153 aBtnAdd.SetAccessibleRelationMemberOf( &aFlProp ); 154 aBtnModify.SetAccessibleRelationMemberOf( &aFlProp ); 155 aBtnImport.SetAccessibleRelationMemberOf( &aFlProp ); 156 aBtnDelete.SetAccessibleRelationMemberOf( &aFlProp ); 157 158 } 159 160 // ----------------------------------------------------------------------- 161 162 void SvxBitmapTabPage::Construct() 163 { 164 // Farbtabellen 165 aLbColor.Fill( pColorTab ); 166 aLbBackgroundColor.CopyEntries( aLbColor ); 167 168 // Bitmaptabelle 169 aLbBitmaps.Fill( pBitmapList ); 170 } 171 172 // ----------------------------------------------------------------------- 173 174 void SvxBitmapTabPage::ActivatePage( const SfxItemSet& ) 175 { 176 sal_uInt16 nPos; 177 sal_uInt16 nCount; 178 179 if( *pDlgType == 0 ) // Flaechen-Dialog 180 { 181 *pbAreaTP = sal_False; 182 183 if( pColorTab ) 184 { 185 // ColorTable 186 if( *pnColorTableState & CT_CHANGED || 187 *pnColorTableState & CT_MODIFIED ) 188 { 189 if( *pnColorTableState & CT_CHANGED ) 190 pColorTab = ( (SvxAreaTabDialog*) DLGWIN )->GetNewColorTable(); 191 192 // LbColor 193 nPos = aLbColor.GetSelectEntryPos(); 194 aLbColor.Clear(); 195 aLbColor.Fill( pColorTab ); 196 nCount = aLbColor.GetEntryCount(); 197 if( nCount == 0 ) 198 ; // Dieser Fall sollte nicht auftreten 199 else if( nCount <= nPos ) 200 aLbColor.SelectEntryPos( 0 ); 201 else 202 aLbColor.SelectEntryPos( nPos ); 203 204 // LbColorBackground 205 nPos = aLbBackgroundColor.GetSelectEntryPos(); 206 aLbBackgroundColor.Clear(); 207 aLbBackgroundColor.CopyEntries( aLbColor ); 208 nCount = aLbBackgroundColor.GetEntryCount(); 209 if( nCount == 0 ) 210 ; // Dieser Fall sollte nicht auftreten 211 else if( nCount <= nPos ) 212 aLbBackgroundColor.SelectEntryPos( 0 ); 213 else 214 aLbBackgroundColor.SelectEntryPos( nPos ); 215 216 ChangePixelColorHdl_Impl( this ); 217 ChangeBackgrndColorHdl_Impl( this ); 218 } 219 220 // Ermitteln (evtl. abschneiden) des Namens und in 221 // der GroupBox darstellen 222 String aString( CUI_RES( RID_SVXSTR_TABLE ) ); aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) ); 223 INetURLObject aURL( pBitmapList->GetPath() ); 224 225 aURL.Append( pBitmapList->GetName() ); 226 DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" ); 227 228 if( aURL.getBase().getLength() > 18 ) 229 { 230 aString += String(aURL.getBase()).Copy( 0, 15 ); 231 aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "..." ) ); 232 } 233 else 234 aString += String(aURL.getBase()); 235 236 if( *pPageType == PT_BITMAP && *pPos != LISTBOX_ENTRY_NOTFOUND ) 237 { 238 aLbBitmaps.SelectEntryPos( *pPos ); 239 } 240 // Farben koennten geloescht worden sein 241 ChangeBitmapHdl_Impl( this ); 242 243 *pPageType = PT_BITMAP; 244 *pPos = LISTBOX_ENTRY_NOTFOUND; 245 } 246 } 247 } 248 249 // ----------------------------------------------------------------------- 250 251 int SvxBitmapTabPage::DeactivatePage( SfxItemSet* _pSet) 252 { 253 if ( CheckChanges_Impl() == -1L ) 254 return KEEP_PAGE; 255 256 if( _pSet ) 257 FillItemSet( *_pSet ); 258 259 return LEAVE_PAGE; 260 } 261 262 // ----------------------------------------------------------------------- 263 264 sal_Bool SvxBitmapTabPage::FillItemSet( SfxItemSet& _rOutAttrs ) 265 { 266 if( *pDlgType == 0 && *pbAreaTP == sal_False ) // Flaechen-Dialog 267 { 268 if(PT_BITMAP == *pPageType) 269 { 270 const sal_uInt16 nPos(aLbBitmaps.GetSelectEntryPos()); 271 272 _rOutAttrs.Put(XFillStyleItem(XFILL_BITMAP)); 273 274 if(LISTBOX_ENTRY_NOTFOUND != nPos) 275 { 276 const XBitmapEntry* pXBitmapEntry = pBitmapList->GetBitmap(nPos); 277 const String aString(aLbBitmaps.GetSelectEntry()); 278 279 _rOutAttrs.Put(XFillBitmapItem(aString, pXBitmapEntry->GetGraphicObject())); 280 } 281 else 282 { 283 const BitmapEx aBitmapEx(aBitmapCtl.GetBitmapEx()); 284 285 _rOutAttrs.Put(XFillBitmapItem(String(), Graphic(aBitmapEx))); 286 } 287 } 288 } 289 290 return sal_True; 291 } 292 293 // ----------------------------------------------------------------------- 294 295 void SvxBitmapTabPage::Reset( const SfxItemSet& ) 296 { 297 // aLbBitmaps.SelectEntryPos( 0 ); 298 299 aBitmapCtl.SetLines( aCtlPixel.GetLineCount() ); 300 aBitmapCtl.SetPixelColor( aLbColor.GetSelectEntryColor() ); 301 aBitmapCtl.SetBackgroundColor( aLbBackgroundColor.GetSelectEntryColor() ); 302 aBitmapCtl.SetBmpArray( aCtlPixel.GetBitmapPixelPtr() ); 303 304 // Bitmap holen und darstellen 305 const XFillBitmapItem aBmpItem(String(), Graphic(aBitmapCtl.GetBitmapEx())); 306 rXFSet.Put( aBmpItem ); 307 aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() ); 308 aCtlPreview.Invalidate(); 309 310 ChangeBitmapHdl_Impl( this ); 311 312 // Status der Buttons ermitteln 313 if( pBitmapList->Count() ) 314 { 315 aBtnAdd.Enable(); 316 aBtnModify.Enable(); 317 aBtnDelete.Enable(); 318 aBtnSave.Enable(); 319 } 320 else 321 { 322 aBtnModify.Disable(); 323 aBtnDelete.Disable(); 324 aBtnSave.Disable(); 325 } 326 } 327 328 // ----------------------------------------------------------------------- 329 330 SfxTabPage* SvxBitmapTabPage::Create( Window* pWindow, 331 const SfxItemSet& rSet ) 332 { 333 return new SvxBitmapTabPage( pWindow, rSet ); 334 } 335 336 //------------------------------------------------------------------------ 337 338 IMPL_LINK( SvxBitmapTabPage, ChangeBitmapHdl_Impl, void *, EMPTYARG ) 339 { 340 GraphicObject* pGraphicObject = 0; 341 int nPos(aLbBitmaps.GetSelectEntryPos()); 342 343 if(LISTBOX_ENTRY_NOTFOUND != nPos) 344 { 345 pGraphicObject = new GraphicObject(pBitmapList->GetBitmap(nPos)->GetGraphicObject()); 346 } 347 else 348 { 349 const SfxPoolItem* pPoolItem = 0; 350 351 if(SFX_ITEM_SET == rOutAttrs.GetItemState(GetWhich(XATTR_FILLSTYLE), true, &pPoolItem)) 352 { 353 const XFillStyle eXFS((XFillStyle)((const XFillStyleItem*)pPoolItem)->GetValue()); 354 355 if((XFILL_BITMAP == eXFS) && (SFX_ITEM_SET == rOutAttrs.GetItemState(GetWhich(XATTR_FILLBITMAP), true, &pPoolItem))) 356 { 357 pGraphicObject = new GraphicObject(((const XFillBitmapItem*)pPoolItem)->GetGraphicObject()); 358 } 359 } 360 361 if(!pGraphicObject) 362 { 363 aLbBitmaps.SelectEntryPos(0); 364 nPos = aLbBitmaps.GetSelectEntryPos(); 365 366 if(LISTBOX_ENTRY_NOTFOUND != nPos) 367 { 368 pGraphicObject = new GraphicObject(pBitmapList->GetBitmap(nPos)->GetGraphicObject()); 369 } 370 } 371 } 372 373 if(pGraphicObject) 374 { 375 BitmapColor aBack; 376 BitmapColor aFront; 377 bool bIs8x8(isHistorical8x8(pGraphicObject->GetGraphic().GetBitmap(), aBack, aFront)); 378 379 aLbColor.SetNoSelection(); 380 aLbBackgroundColor.SetNoSelection(); 381 382 if(bIs8x8) 383 { 384 aCtlPixel.SetPaintable( sal_True ); 385 aCtlPixel.Enable(); 386 aFtPixelEdit.Enable(); 387 aFtColor.Enable(); 388 aLbColor.Enable(); 389 aFtBackgroundColor.Enable(); 390 aLbBackgroundColor.Enable(); 391 aBtnModify.Enable(); 392 aBtnAdd.Enable(); 393 394 // Setzen des PixelControls 395 aCtlPixel.SetXBitmap(pGraphicObject->GetGraphic().GetBitmapEx()); 396 397 Color aPixelColor = aFront; 398 Color aBackColor = aBack; 399 400 aBitmapCtl.SetPixelColor( aPixelColor ); 401 aBitmapCtl.SetBackgroundColor( aBackColor ); 402 403 // Wenn der Eintrag nicht in der Listbox ist, wird die Farbe 404 // temporaer hinzugenommen 405 if( 0 == aLbBitmaps.GetSelectEntryPos() ) 406 { 407 aLbColor.SelectEntry( Color( COL_BLACK ) ); 408 ChangePixelColorHdl_Impl( this ); 409 } 410 else 411 aLbColor.SelectEntry( aPixelColor ); 412 if( aLbColor.GetSelectEntryCount() == 0 ) 413 { 414 aLbColor.InsertEntry( aPixelColor, String() ); 415 aLbColor.SelectEntry( aPixelColor ); 416 } 417 aLbBackgroundColor.SelectEntry( aBackColor ); 418 if( aLbBackgroundColor.GetSelectEntryCount() == 0 ) 419 { 420 aLbBackgroundColor.InsertEntry( aBackColor, String() ); 421 aLbBackgroundColor.SelectEntry( aBackColor ); 422 } 423 } 424 else 425 { 426 aCtlPixel.Reset(); 427 aCtlPixel.SetPaintable( sal_False ); 428 aCtlPixel.Disable(); 429 aFtPixelEdit.Disable(); 430 aFtColor.Disable(); 431 aLbColor.Disable(); 432 aFtBackgroundColor.Disable(); 433 aLbBackgroundColor.Disable(); 434 aBtnModify.Disable(); 435 aBtnAdd.Disable(); 436 } 437 438 aCtlPixel.Invalidate(); 439 440 // Bitmap darstellen 441 const XFillBitmapItem aXBmpItem(String(), *pGraphicObject); 442 rXFSet.Put( aXBmpItem ); 443 444 aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() ); 445 aCtlPreview.Invalidate(); 446 447 bBmpChanged = sal_False; 448 delete pGraphicObject; 449 } 450 451 return 0; 452 } 453 454 // ----------------------------------------------------------------------- 455 456 long SvxBitmapTabPage::CheckChanges_Impl() 457 { 458 sal_uInt16 nPos = aLbBitmaps.GetSelectEntryPos(); 459 if( nPos != LISTBOX_ENTRY_NOTFOUND ) 460 { 461 String aString = aLbBitmaps.GetSelectEntry(); 462 463 if( bBmpChanged ) 464 { 465 ResMgr& rMgr = CUI_MGR(); 466 Image aWarningBoxImage = WarningBox::GetStandardImage(); 467 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 468 DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001 469 AbstractSvxMessDialog* aMessDlg = pFact->CreateSvxMessDialog( DLGWIN, RID_SVXDLG_MESSBOX, 470 String( SVX_RES( RID_SVXSTR_BITMAP ) ), 471 String( CUI_RES( RID_SVXSTR_ASK_CHANGE_BITMAP ) ), 472 &aWarningBoxImage ); 473 DBG_ASSERT(aMessDlg, "Dialogdiet fail!");//CHINA001 474 aMessDlg->SetButtonText( MESS_BTN_1, //CHINA001 aMessDlg.SetButtonText( MESS_BTN_1, 475 String( ResId( RID_SVXSTR_CHANGE, rMgr ) ) ); 476 aMessDlg->SetButtonText( MESS_BTN_2, //CHINA001 aMessDlg.SetButtonText( MESS_BTN_2, 477 String( ResId( RID_SVXSTR_ADD, rMgr ) ) ); 478 479 short nRet = aMessDlg->Execute(); //CHINA001 short nRet = aMessDlg.Execute(); 480 481 switch( nRet ) 482 { 483 case RET_BTN_1: // Aendern 484 { 485 ClickModifyHdl_Impl( this ); 486 } 487 break; 488 489 case RET_BTN_2: // Hinzufuegen 490 { 491 ClickAddHdl_Impl( this ); 492 nPos = aLbBitmaps.GetSelectEntryPos(); 493 } 494 break; 495 496 case RET_CANCEL: 497 // return( -1L ); 498 break; 499 // return( sal_True ); // Abbruch 500 } 501 delete aMessDlg; //add by CHINA001 502 } 503 } 504 nPos = aLbBitmaps.GetSelectEntryPos(); 505 if( nPos != LISTBOX_ENTRY_NOTFOUND ) 506 *pPos = nPos; 507 return 0L; 508 } 509 510 //------------------------------------------------------------------------ 511 512 IMPL_LINK( SvxBitmapTabPage, ClickAddHdl_Impl, void *, EMPTYARG ) 513 { 514 ResMgr& rMgr = CUI_MGR(); 515 String aNewName( SVX_RES( RID_SVXSTR_BITMAP ) ); 516 String aDesc( CUI_RES( RID_SVXSTR_DESC_NEW_BITMAP ) ); 517 String aName; 518 519 long nCount = pBitmapList->Count(); 520 long j = 1; 521 sal_Bool bDifferent = sal_False; 522 523 while( !bDifferent ) 524 { 525 aName = aNewName; 526 aName += sal_Unicode(' '); 527 aName += UniString::CreateFromInt32( j++ ); 528 bDifferent = sal_True; 529 530 for( long i = 0; i < nCount && bDifferent; i++ ) 531 if( aName == pBitmapList->GetBitmap( i )->GetName() ) 532 bDifferent = sal_False; 533 } 534 535 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 536 DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001 537 AbstractSvxNameDialog* pDlg = pFact->CreateSvxNameDialog( DLGWIN, aName, aDesc ); 538 DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001 539 WarningBox* pWarnBox = NULL; 540 sal_uInt16 nError = RID_SVXSTR_WARN_NAME_DUPLICATE; 541 542 while( pDlg->Execute() == RET_OK ) 543 { 544 pDlg->GetName( aName ); 545 546 bDifferent = sal_True; 547 548 for( long i = 0; i < nCount && bDifferent; i++ ) 549 if( aName == pBitmapList->GetBitmap( i )->GetName() ) 550 bDifferent = sal_False; 551 552 if( bDifferent ) { 553 nError = 0; 554 break; 555 } 556 557 if( !pWarnBox ) 558 { 559 pWarnBox = new WarningBox( DLGWIN, 560 WinBits( WB_OK_CANCEL ), 561 String( ResId( nError, rMgr ) ) ); 562 pWarnBox->SetHelpId( HID_WARN_NAME_DUPLICATE ); 563 } 564 565 if( pWarnBox->Execute() != RET_OK ) 566 break; 567 } 568 //Rectangle aDlgRect( pDlg->GetPosPixel(), pDlg->GetSizePixel() ); 569 delete pDlg; 570 delete pWarnBox; 571 572 if( !nError ) 573 { 574 XBitmapEntry* pEntry = 0; 575 if( aCtlPixel.IsEnabled() ) 576 { 577 const BitmapEx aBitmapEx(aBitmapCtl.GetBitmapEx()); 578 579 pEntry = new XBitmapEntry(Graphic(aBitmapEx), aName); 580 } 581 else // Es muss sich um eine nicht vorhandene importierte Bitmap handeln 582 { 583 const SfxPoolItem* pPoolItem = 0; 584 585 if(SFX_ITEM_SET == rOutAttrs.GetItemState(XATTR_FILLBITMAP, true, &pPoolItem)) 586 { 587 pEntry = new XBitmapEntry(dynamic_cast< const XFillBitmapItem* >(pPoolItem)->GetGraphicObject(), aName); 588 } 589 } 590 591 DBG_ASSERT( pEntry, "SvxBitmapTabPage::ClickAddHdl_Impl(), pEntry == 0 ?" ); 592 593 if( pEntry ) 594 { 595 pBitmapList->Insert( pEntry ); 596 const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings(); 597 aLbBitmaps.Append(rStyleSettings.GetListBoxPreviewDefaultPixelSize(), *pEntry ); 598 aLbBitmaps.SelectEntryPos( aLbBitmaps.GetEntryCount() - 1 ); 599 600 #ifdef WNT 601 // hack: #31355# W.P. 602 Rectangle aRect( aLbBitmaps.GetPosPixel(), aLbBitmaps.GetSizePixel() ); 603 if( sal_True ) { // ??? overlapped with pDlg 604 // and srolling 605 Invalidate( aRect ); 606 //aLbBitmaps.Invalidate(); 607 } 608 #endif 609 610 // Flag fuer modifiziert setzen 611 *pnBitmapListState |= CT_MODIFIED; 612 613 ChangeBitmapHdl_Impl( this ); 614 } 615 } 616 617 // Status der Buttons ermitteln 618 if( pBitmapList->Count() ) 619 { 620 aBtnModify.Enable(); 621 aBtnDelete.Enable(); 622 aBtnSave.Enable(); 623 } 624 return 0L; 625 } 626 627 628 /******************************************************************************/ 629 /******************************************************************************/ 630 631 632 //------------------------------------------------------------------------ 633 634 #ifdef _MSC_VER 635 #pragma optimize ( "", off ) 636 #endif 637 638 IMPL_LINK( SvxBitmapTabPage, ClickImportHdl_Impl, void *, EMPTYARG ) 639 { 640 ResMgr& rMgr = CUI_MGR(); 641 SvxOpenGraphicDialog aDlg( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "Import" ) ) ); 642 aDlg.EnableLink(sal_False); 643 644 if( !aDlg.Execute() ) 645 { 646 Graphic aGraphic; 647 int nError = 1; 648 649 EnterWait(); 650 nError = aDlg.GetGraphic( aGraphic ); 651 LeaveWait(); 652 653 if( !nError ) 654 { 655 String aDesc( ResId(RID_SVXSTR_DESC_EXT_BITMAP, rMgr) ); 656 WarningBox* pWarnBox = NULL; 657 658 // convert file URL to UI name 659 String aName; 660 INetURLObject aURL( aDlg.GetPath() ); 661 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 662 DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001 663 AbstractSvxNameDialog* pDlg = pFact->CreateSvxNameDialog( DLGWIN, String(aURL.GetName()).GetToken( 0, '.' ), aDesc ); 664 DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001 665 nError = RID_SVXSTR_WARN_NAME_DUPLICATE; 666 667 while( pDlg->Execute() == RET_OK ) 668 { 669 pDlg->GetName( aName ); 670 671 sal_Bool bDifferent = sal_True; 672 long nCount = pBitmapList->Count(); 673 674 for( long i = 0; i < nCount && bDifferent; i++ ) 675 if( aName == pBitmapList->GetBitmap( i )->GetName() ) 676 bDifferent = sal_False; 677 678 if( bDifferent ) { 679 nError = 0; 680 break; 681 } 682 683 if( !pWarnBox ) 684 { 685 pWarnBox = new WarningBox( DLGWIN, 686 WinBits( WB_OK_CANCEL ), 687 String( ResId( nError, rMgr ) ) ); 688 pWarnBox->SetHelpId( HID_WARN_NAME_DUPLICATE ); 689 } 690 691 692 if( pWarnBox->Execute() != RET_OK ) 693 break; 694 } 695 //Rectangle aDlgRect( pDlg->GetPosPixel(), pDlg->GetSizePixel() ); 696 delete pDlg; 697 delete pWarnBox; 698 699 if( !nError ) 700 { 701 XBitmapEntry* pEntry = new XBitmapEntry( aGraphic, aName ); 702 pBitmapList->Insert( pEntry ); 703 704 const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings(); 705 aLbBitmaps.Append(rStyleSettings.GetListBoxPreviewDefaultPixelSize(), *pEntry ); 706 aLbBitmaps.SelectEntryPos( aLbBitmaps.GetEntryCount() - 1 ); 707 708 #ifdef WNT 709 // hack: #31355# W.P. 710 Rectangle aRect( aLbBitmaps.GetPosPixel(), aLbBitmaps.GetSizePixel() ); 711 if( sal_True ) { // ??? overlapped with pDlg 712 // and srolling 713 Invalidate( aRect ); 714 //aLbBitmaps.Invalidate(); 715 } 716 #endif 717 718 // Flag fuer modifiziert setzen 719 *pnBitmapListState |= CT_MODIFIED; 720 721 ChangeBitmapHdl_Impl( this ); 722 } 723 } 724 else 725 // Graphik konnte nicht geladen werden 726 ErrorBox( DLGWIN, 727 WinBits( WB_OK ), 728 String( ResId( RID_SVXSTR_READ_DATA_ERROR, rMgr ) ) ).Execute(); 729 } 730 731 return 0L; 732 } 733 734 #ifdef _MSC_VER 735 #pragma optimize ( "", on ) 736 #endif 737 738 //------------------------------------------------------------------------ 739 740 IMPL_LINK( SvxBitmapTabPage, ClickModifyHdl_Impl, void *, EMPTYARG ) 741 { 742 sal_uInt16 nPos = aLbBitmaps.GetSelectEntryPos(); 743 744 if ( nPos != LISTBOX_ENTRY_NOTFOUND ) 745 { 746 ResMgr& rMgr = CUI_MGR(); 747 String aNewName( SVX_RES( RID_SVXSTR_BITMAP ) ); 748 String aDesc( ResId( RID_SVXSTR_DESC_NEW_BITMAP, rMgr ) ); 749 String aName( pBitmapList->GetBitmap( nPos )->GetName() ); 750 String aOldName = aName; 751 752 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 753 DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001 754 AbstractSvxNameDialog* pDlg = pFact->CreateSvxNameDialog( DLGWIN, aName, aDesc ); 755 DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001 756 757 long nCount = pBitmapList->Count(); 758 sal_Bool bDifferent = sal_False; 759 sal_Bool bLoop = sal_True; 760 const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings(); 761 762 while( bLoop && pDlg->Execute() == RET_OK ) 763 { 764 pDlg->GetName( aName ); 765 bDifferent = sal_True; 766 767 for( long i = 0; i < nCount && bDifferent; i++ ) 768 { 769 if( aName == pBitmapList->GetBitmap( i )->GetName() && 770 aName != aOldName ) 771 bDifferent = sal_False; 772 } 773 774 if( bDifferent ) 775 { 776 bLoop = sal_False; 777 XBitmapEntry* pEntry = pBitmapList->GetBitmap( nPos ); 778 779 pEntry->SetName( aName ); 780 781 const BitmapEx aBitmapEx(aBitmapCtl.GetBitmapEx()); 782 783 pEntry->SetGraphicObject(Graphic(aBitmapEx)); 784 785 aLbBitmaps.Modify( rStyleSettings.GetListBoxPreviewDefaultPixelSize(), *pEntry, nPos ); 786 aLbBitmaps.SelectEntryPos( nPos ); 787 788 // Flag fuer modifiziert setzen 789 *pnBitmapListState |= CT_MODIFIED; 790 791 bBmpChanged = sal_False; 792 } 793 else 794 { 795 WarningBox aBox( DLGWIN, WinBits( WB_OK ), String( ResId( RID_SVXSTR_WARN_NAME_DUPLICATE, rMgr ) ) ); 796 aBox.SetHelpId( HID_WARN_NAME_DUPLICATE ); 797 aBox.Execute(); 798 } 799 } 800 delete pDlg; 801 } 802 return 0L; 803 } 804 805 //------------------------------------------------------------------------ 806 807 IMPL_LINK( SvxBitmapTabPage, ClickDeleteHdl_Impl, void *, EMPTYARG ) 808 { 809 sal_uInt16 nPos = aLbBitmaps.GetSelectEntryPos(); 810 811 if( nPos != LISTBOX_ENTRY_NOTFOUND ) 812 { 813 QueryBox aQueryBox( DLGWIN, WinBits( WB_YES_NO | WB_DEF_NO ), 814 String( CUI_RES( RID_SVXSTR_ASK_DEL_BITMAP ) ) ); 815 816 if( aQueryBox.Execute() == RET_YES ) 817 { 818 delete pBitmapList->Remove( nPos ); 819 aLbBitmaps.RemoveEntry( nPos ); 820 aLbBitmaps.SelectEntryPos( 0 ); 821 822 aCtlPreview.Invalidate(); 823 aCtlPixel.Invalidate(); 824 825 ChangeBitmapHdl_Impl( this ); 826 827 // Flag fuer modifiziert setzen 828 *pnBitmapListState |= CT_MODIFIED; 829 } 830 } 831 // Status der Buttons ermitteln 832 if( !pBitmapList->Count() ) 833 { 834 aBtnModify.Disable(); 835 aBtnDelete.Disable(); 836 aBtnSave.Disable(); 837 } 838 return 0L; 839 } 840 841 // ----------------------------------------------------------------------- 842 843 IMPL_LINK( SvxBitmapTabPage, ClickLoadHdl_Impl, void *, EMPTYARG ) 844 { 845 sal_uInt16 nReturn = RET_YES; 846 ResMgr& rMgr = CUI_MGR(); 847 848 if ( *pnBitmapListState & CT_MODIFIED ) 849 { 850 nReturn = WarningBox( DLGWIN, WinBits( WB_YES_NO_CANCEL ), 851 String( ResId( RID_SVXSTR_WARN_TABLE_OVERWRITE, rMgr ) ) ).Execute(); 852 853 if ( nReturn == RET_YES ) 854 pBitmapList->Save(); 855 } 856 857 if ( nReturn != RET_CANCEL ) 858 { 859 ::sfx2::FileDialogHelper aDlg( 860 com::sun::star::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE, 861 0 ); 862 String aStrFilterType( RTL_CONSTASCII_USTRINGPARAM( "*.sob" ) ); 863 aDlg.AddFilter( aStrFilterType, aStrFilterType ); 864 INetURLObject aFile( SvtPathOptions().GetPalettePath() ); 865 aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) ); 866 867 if ( aDlg.Execute() == ERRCODE_NONE ) 868 { 869 EnterWait(); 870 INetURLObject aURL( aDlg.GetPath() ); 871 INetURLObject aPathURL( aURL ); 872 873 aPathURL.removeSegment(); 874 aPathURL.removeFinalSlash(); 875 876 // Tabelle speichern 877 XBitmapList* pBmpList = new XBitmapList( aPathURL.GetMainURL( INetURLObject::NO_DECODE ), pXPool ); 878 pBmpList->SetName( aURL.getName() ); 879 if( pBmpList->Load() ) 880 { 881 if( pBmpList ) 882 { 883 // Pruefen, ob Tabelle geloescht werden darf: 884 if( pBitmapList != ( (SvxAreaTabDialog*) DLGWIN )->GetBitmapList() ) 885 delete pBitmapList; 886 887 pBitmapList = pBmpList; 888 ( (SvxAreaTabDialog*) DLGWIN )->SetNewBitmapList( pBitmapList ); 889 890 aLbBitmaps.Clear(); 891 aLbBitmaps.Fill( pBitmapList ); 892 Reset( rOutAttrs ); 893 894 pBitmapList->SetName( aURL.getName() ); 895 896 // Ermitteln (evtl. abschneiden) des Namens und in 897 // der GroupBox darstellen 898 String aString( ResId( RID_SVXSTR_TABLE, rMgr ) ); 899 aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) ); 900 901 if ( aURL.getBase().getLength() > 18 ) 902 { 903 aString += String(aURL.getBase()).Copy( 0, 15 ); 904 aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "..." ) ); 905 } 906 else 907 aString += String(aURL.getBase()); 908 909 // Flag fuer gewechselt setzen 910 *pnBitmapListState |= CT_CHANGED; 911 // Flag fuer modifiziert entfernen 912 *pnBitmapListState &= ~CT_MODIFIED; 913 } 914 LeaveWait(); 915 } 916 else 917 { 918 LeaveWait(); 919 ErrorBox( DLGWIN, WinBits( WB_OK ), 920 String( ResId( RID_SVXSTR_READ_DATA_ERROR, rMgr ) ) ).Execute(); 921 } 922 } 923 } 924 925 // Status der Buttons ermitteln 926 if( pBitmapList->Count() ) 927 { 928 aBtnModify.Enable(); 929 aBtnDelete.Enable(); 930 aBtnSave.Enable(); 931 } 932 else 933 { 934 aBtnModify.Disable(); 935 aBtnDelete.Disable(); 936 aBtnSave.Disable(); 937 } 938 return 0L; 939 } 940 941 // ----------------------------------------------------------------------- 942 943 IMPL_LINK( SvxBitmapTabPage, ClickSaveHdl_Impl, void *, EMPTYARG ) 944 { 945 ::sfx2::FileDialogHelper aDlg( 946 com::sun::star::ui::dialogs::TemplateDescription::FILESAVE_SIMPLE, 0 ); 947 String aStrFilterType( RTL_CONSTASCII_USTRINGPARAM( "*.sob" ) ); 948 aDlg.AddFilter( aStrFilterType, aStrFilterType ); 949 950 INetURLObject aFile( SvtPathOptions().GetPalettePath() ); 951 DBG_ASSERT( aFile.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" ); 952 953 if( pBitmapList->GetName().Len() ) 954 { 955 aFile.Append( pBitmapList->GetName() ); 956 957 if( !aFile.getExtension().getLength() ) 958 aFile.SetExtension( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "sob" ) ) ); 959 } 960 961 aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) ); 962 if ( aDlg.Execute() == ERRCODE_NONE ) 963 { 964 INetURLObject aURL( aDlg.GetPath() ); 965 INetURLObject aPathURL( aURL ); 966 967 aPathURL.removeSegment(); 968 aPathURL.removeFinalSlash(); 969 970 pBitmapList->SetName( aURL.getName() ); 971 pBitmapList->SetPath( aPathURL.GetMainURL( INetURLObject::NO_DECODE ) ); 972 973 if( pBitmapList->Save() ) 974 { 975 // Ermitteln (evtl. abschneiden) des Namens und in 976 // der GroupBox darstellen 977 String aString( CUI_RES( RID_SVXSTR_TABLE ) ); 978 aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) ); 979 980 if ( aURL.getBase().getLength() > 18 ) 981 { 982 aString += String(aURL.getBase()).Copy( 0, 15 ); 983 aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "..." ) ); 984 } 985 else 986 aString += String(aURL.getBase()); 987 988 // Flag fuer gespeichert setzen 989 *pnBitmapListState |= CT_SAVED; 990 // Flag fuer modifiziert entfernen 991 *pnBitmapListState &= ~CT_MODIFIED; 992 } 993 else 994 { 995 ErrorBox( DLGWIN, WinBits( WB_OK ), 996 String( CUI_RES( RID_SVXSTR_WRITE_DATA_ERROR ) ) ).Execute(); 997 } 998 } 999 1000 return 0L; 1001 } 1002 1003 //------------------------------------------------------------------------ 1004 1005 IMPL_LINK( SvxBitmapTabPage, ChangePixelColorHdl_Impl, void *, EMPTYARG ) 1006 { 1007 aCtlPixel.SetPixelColor( aLbColor.GetSelectEntryColor() ); 1008 aCtlPixel.Invalidate(); 1009 1010 aBitmapCtl.SetPixelColor( aLbColor.GetSelectEntryColor() ); 1011 1012 // Bitmap holen und darstellen 1013 rXFSet.Put(XFillBitmapItem(String(), Graphic(aBitmapCtl.GetBitmapEx()))); 1014 aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() ); 1015 aCtlPreview.Invalidate(); 1016 1017 bBmpChanged = sal_True; 1018 1019 return 0L; 1020 } 1021 1022 //------------------------------------------------------------------------ 1023 1024 IMPL_LINK( SvxBitmapTabPage, ChangeBackgrndColorHdl_Impl, void *, EMPTYARG ) 1025 { 1026 aCtlPixel.SetBackgroundColor( aLbBackgroundColor.GetSelectEntryColor() ); 1027 aCtlPixel.Invalidate(); 1028 1029 aBitmapCtl.SetBackgroundColor( aLbBackgroundColor.GetSelectEntryColor() ); 1030 1031 // Bitmap holen und darstellen 1032 rXFSet.Put(XFillBitmapItem(String(), Graphic(aBitmapCtl.GetBitmapEx()))); 1033 aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() ); 1034 aCtlPreview.Invalidate(); 1035 1036 bBmpChanged = sal_True; 1037 1038 return 0L; 1039 } 1040 1041 //------------------------------------------------------------------------ 1042 1043 void SvxBitmapTabPage::PointChanged( Window* pWindow, RECT_POINT ) 1044 { 1045 if( pWindow == &aCtlPixel ) 1046 { 1047 aBitmapCtl.SetBmpArray( aCtlPixel.GetBitmapPixelPtr() ); 1048 1049 // Bitmap holen und darstellen 1050 rXFSet.Put(XFillBitmapItem(String(), Graphic(aBitmapCtl.GetBitmapEx()))); 1051 aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() ); 1052 aCtlPreview.Invalidate(); 1053 1054 bBmpChanged = sal_True; 1055 } 1056 } 1057 1058 1059 1060 1061 Window* SvxBitmapTabPage::GetParentLabeledBy( const Window* pLabeled ) const 1062 { 1063 if (pLabeled == &aLbBitmaps) 1064 return const_cast<FixedText*>(&aLbBitmapsHidden); 1065 else 1066 return SvxTabPage::GetParentLabeledBy (pLabeled); 1067 } 1068