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 <tools/datetime.hxx> 28 #include <unotools/datetime.hxx> 29 #include <vcl/msgbox.hxx> 30 #include <ucbhelper/content.hxx> 31 #include <sfx2/app.hxx> 32 #include "helpid.hrc" 33 #include "svx/gallery1.hxx" 34 #include "svx/galtheme.hxx" 35 #include "svx/galmisc.hxx" 36 #include "galbrws1.hxx" 37 #include <com/sun/star/util/DateTime.hpp> 38 #include "gallery.hrc" 39 #include <algorithm> 40 #include <svx/dialogs.hrc> 41 #include <svx/dialmgr.hxx> 42 43 #include <svx/svxdlg.hxx> //CHINA001 44 //CHINA001 #include <svx/dialogs.hrc> //CHINA001 45 46 // -------------- 47 // - Namespaces - 48 // -------------- 49 50 using namespace ::rtl; 51 using namespace ::com::sun::star; 52 53 // ----------------- 54 // - GalleryButton - 55 // ----------------- 56 DBG_NAME(GalleryButton) 57 58 GalleryButton::GalleryButton( GalleryBrowser1* pParent, WinBits nWinBits ) : 59 PushButton( pParent, nWinBits ) 60 { 61 DBG_CTOR(GalleryButton,NULL); 62 63 } 64 65 // ----------------------------------------------------------------------------- 66 67 GalleryButton::~GalleryButton() 68 { 69 70 DBG_DTOR(GalleryButton,NULL); 71 } 72 73 // ----------------------------------------------------------------------------- 74 75 void GalleryButton::KeyInput( const KeyEvent& rKEvt ) 76 { 77 if( !static_cast< GalleryBrowser1* >( GetParent() )->KeyInput( rKEvt, this ) ) 78 PushButton::KeyInput( rKEvt ); 79 } 80 81 // ----------------------- 82 // - GalleryThemeListBox - 83 // ----------------------- 84 DBG_NAME(GalleryThemeListBox) 85 86 GalleryThemeListBox::GalleryThemeListBox( GalleryBrowser1* pParent, WinBits nWinBits ) : 87 ListBox( pParent, nWinBits ) 88 { 89 DBG_CTOR(GalleryThemeListBox,NULL); 90 91 InitSettings(); 92 } 93 94 // ----------------------------------------------------------------------------- 95 96 GalleryThemeListBox::~GalleryThemeListBox() 97 { 98 99 DBG_DTOR(GalleryThemeListBox,NULL); 100 } 101 102 // ------------------------------------------------------------------------ 103 104 void GalleryThemeListBox::InitSettings() 105 { 106 SetBackground( Wallpaper( GALLERY_BG_COLOR ) ); 107 SetControlBackground( GALLERY_BG_COLOR ); 108 SetControlForeground( GALLERY_FG_COLOR ); 109 } 110 111 // ----------------------------------------------------------------------- 112 113 void GalleryThemeListBox::DataChanged( const DataChangedEvent& rDCEvt ) 114 { 115 if ( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) ) 116 InitSettings(); 117 else 118 ListBox::DataChanged( rDCEvt ); 119 } 120 121 // ----------------------------------------------------------------------------- 122 123 long GalleryThemeListBox::PreNotify( NotifyEvent& rNEvt ) 124 { 125 long nDone = 0; 126 127 if( rNEvt.GetType() == EVENT_COMMAND ) 128 { 129 const CommandEvent* pCEvt = rNEvt.GetCommandEvent(); 130 131 if( pCEvt && pCEvt->GetCommand() == COMMAND_CONTEXTMENU ) 132 static_cast< GalleryBrowser1* >( GetParent() )->ShowContextMenu(); 133 } 134 else if( rNEvt.GetType() == EVENT_KEYINPUT ) 135 { 136 const KeyEvent* pKEvt = rNEvt.GetKeyEvent(); 137 138 if( pKEvt ) 139 nDone = static_cast< GalleryBrowser1* >( GetParent() )->KeyInput( *pKEvt, this ); 140 } 141 142 return( nDone ? nDone : ListBox::PreNotify( rNEvt ) ); 143 } 144 145 // ------------------- 146 // - GalleryBrowser1 - 147 // ------------------- 148 DBG_NAME(GalleryBrowser1) 149 150 GalleryBrowser1::GalleryBrowser1( 151 Window* pParent, 152 const ResId& rResId, 153 Gallery* pGallery, 154 const ::boost::function<sal_Bool(const KeyEvent&,Window*)>& rKeyInputHandler, 155 const ::boost::function<void(void)>& rThemeSlectionHandler) 156 : 157 Control ( pParent, rResId ), 158 maNewTheme ( this, WB_3DLOOK ), 159 mpThemes ( new GalleryThemeListBox( this, WB_TABSTOP | WB_3DLOOK | WB_BORDER | WB_HSCROLL | WB_VSCROLL | WB_AUTOHSCROLL | WB_SORT ) ), 160 mpGallery ( pGallery ), 161 mpExchangeData ( new ExchangeData ), 162 mpThemePropsDlgItemSet( NULL ), 163 aImgNormal ( GalleryResGetBitmapEx( RID_SVXBMP_THEME_NORMAL ) ), 164 aImgDefault ( GalleryResGetBitmapEx( RID_SVXBMP_THEME_DEFAULT ) ), 165 aImgReadOnly ( GalleryResGetBitmapEx( RID_SVXBMP_THEME_READONLY ) ), 166 aImgImported ( GalleryResGetBitmapEx( RID_SVXBMP_THEME_IMPORTED ) ), 167 maKeyInputHandler(rKeyInputHandler), 168 maThemeSlectionHandler(rThemeSlectionHandler) 169 { 170 DBG_CTOR(GalleryBrowser1,NULL); 171 172 StartListening( *mpGallery ); 173 174 maNewTheme.SetHelpId( HID_GALLERY_NEWTHEME ); 175 maNewTheme.SetText( String( GAL_RESID( RID_SVXSTR_GALLERY_CREATETHEME ) ) ); 176 maNewTheme.SetClickHdl( LINK( this, GalleryBrowser1, ClickNewThemeHdl ) ); 177 178 // disable creation of new themes if a writable directory is not available 179 if( mpGallery->GetUserURL().GetProtocol() == INET_PROT_NOT_VALID ) 180 maNewTheme.Disable(); 181 182 mpThemes->SetHelpId( HID_GALLERY_THEMELIST ); 183 mpThemes->SetSelectHdl( LINK( this, GalleryBrowser1, SelectThemeHdl ) ); 184 mpThemes->SetAccessibleName(String(SVX_RES( RID_SVXSTR_GALLERYPROPS_GALTHEME ) ) ); 185 186 for( sal_uIntPtr i = 0, nCount = mpGallery->GetThemeCount(); i < nCount; i++ ) 187 ImplInsertThemeEntry( mpGallery->GetThemeInfo( i ) ); 188 189 ImplAdjustControls(); 190 maNewTheme.Show( sal_True ); 191 mpThemes->Show( sal_True ); 192 } 193 194 // ----------------------------------------------------------------------------- 195 196 GalleryBrowser1::~GalleryBrowser1() 197 { 198 EndListening( *mpGallery ); 199 delete mpThemes; 200 mpThemes = NULL; 201 delete mpExchangeData; 202 mpExchangeData = NULL; 203 204 DBG_DTOR(GalleryBrowser1,NULL); 205 } 206 207 // ----------------------------------------------------------------------------- 208 209 sal_uIntPtr GalleryBrowser1::ImplInsertThemeEntry( const GalleryThemeEntry* pEntry ) 210 { 211 static const sal_Bool bShowHiddenThemes = ( getenv( "GALLERY_SHOW_HIDDEN_THEMES" ) != NULL ); 212 213 sal_uIntPtr nRet = LISTBOX_ENTRY_NOTFOUND; 214 215 if( pEntry && ( !pEntry->IsHidden() || bShowHiddenThemes ) ) 216 { 217 const Image* pImage; 218 219 if( pEntry->IsImported() ) 220 pImage = &aImgImported; 221 else if( pEntry->IsReadOnly() ) 222 pImage = &aImgReadOnly; 223 else if( pEntry->IsDefault() ) 224 pImage = &aImgDefault; 225 else 226 pImage = &aImgNormal; 227 228 nRet = mpThemes->InsertEntry( pEntry->GetThemeName(), *pImage ); 229 } 230 231 return nRet; 232 } 233 234 // ----------------------------------------------------------------------------- 235 236 void GalleryBrowser1::ImplAdjustControls() 237 { 238 const Size aOutSize( GetOutputSizePixel() ); 239 const long nNewThemeHeight = LogicToPixel( Size( 0, 14 ), MAP_APPFONT ).Height(); 240 const long nStartY = nNewThemeHeight + 4; 241 242 maNewTheme.SetPosSizePixel( Point(), 243 Size( aOutSize.Width(), nNewThemeHeight ) ); 244 245 mpThemes->SetPosSizePixel( Point( 0, nStartY ), 246 Size( aOutSize.Width(), aOutSize.Height() - nStartY ) ); 247 } 248 249 // ----------------------------------------------------------------------------- 250 251 void GalleryBrowser1::ImplFillExchangeData( const GalleryTheme* pThm, ExchangeData& rData ) 252 { 253 rData.pTheme = (GalleryTheme*) pThm; 254 rData.aEditedTitle = pThm->GetName(); 255 256 try 257 { 258 ::ucbhelper::Content aCnt( pThm->GetThmURL().GetMainURL( INetURLObject::NO_DECODE ), uno::Reference< ucb::XCommandEnvironment >() ); 259 util::DateTime aDateTimeModified; 260 DateTime aDateTime; 261 262 aCnt.getPropertyValue( OUString::createFromAscii( "DateModified" ) ) >>= aDateTimeModified; 263 ::utl::typeConvert( aDateTimeModified, aDateTime ); 264 rData.aThemeChangeDate = aDateTime; 265 rData.aThemeChangeTime = aDateTime; 266 } 267 catch( const ucb::ContentCreationException& ) 268 { 269 } 270 catch( const uno::RuntimeException& ) 271 { 272 } 273 catch( const uno::Exception& ) 274 { 275 } 276 } 277 278 // ----------------------------------------------------------------------------- 279 280 void GalleryBrowser1::ImplGetExecuteVector(::std::vector< sal_uInt16 >& o_aExec) 281 { 282 GalleryTheme* pTheme = mpGallery->AcquireTheme( GetSelectedTheme(), *this ); 283 284 if( pTheme ) 285 { 286 sal_Bool bUpdateAllowed, bRenameAllowed, bRemoveAllowed; 287 static const sal_Bool bIdDialog = ( getenv( "GALLERY_ENABLE_ID_DIALOG" ) != NULL ); 288 289 if( pTheme->IsReadOnly() ) 290 bUpdateAllowed = bRenameAllowed = bRemoveAllowed = sal_False; 291 else if( pTheme->IsImported() ) 292 { 293 bUpdateAllowed = sal_False; 294 bRenameAllowed = bRemoveAllowed = sal_True; 295 } 296 else if( pTheme->IsDefault() ) 297 { 298 bUpdateAllowed = bRenameAllowed = sal_True; 299 bRemoveAllowed = sal_False; 300 } 301 else 302 bUpdateAllowed = bRenameAllowed = bRemoveAllowed = sal_True; 303 304 if( bUpdateAllowed && pTheme->GetObjectCount() ) 305 o_aExec.push_back( MN_ACTUALIZE ); 306 307 if( bRenameAllowed ) 308 o_aExec.push_back( MN_RENAME ); 309 310 if( bRemoveAllowed ) 311 o_aExec.push_back( MN_DELETE ); 312 313 if( bIdDialog && !pTheme->IsReadOnly() && !pTheme->IsImported() ) 314 o_aExec.push_back( MN_ASSIGN_ID ); 315 316 o_aExec.push_back( MN_PROPERTIES ); 317 318 mpGallery->ReleaseTheme( pTheme, *this ); 319 } 320 } 321 322 // ----------------------------------------------------------------------------- 323 324 void GalleryBrowser1::ImplGalleryThemeProperties( const String & rThemeName, bool bCreateNew ) 325 { 326 DBG_ASSERT(!mpThemePropsDlgItemSet, "mpThemePropsDlgItemSet already set!"); 327 mpThemePropsDlgItemSet = new SfxItemSet( SFX_APP()->GetPool() ); 328 GalleryTheme* pTheme = mpGallery->AcquireTheme( rThemeName, *this ); 329 330 ImplFillExchangeData( pTheme, *mpExchangeData ); 331 332 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 333 DBG_ASSERT(pFact, "Got no AbstractDialogFactory!"); 334 VclAbstractDialog2* pThemeProps = pFact->CreateGalleryThemePropertiesDialog( NULL, mpExchangeData, mpThemePropsDlgItemSet ); 335 DBG_ASSERT(pThemeProps, "Got no GalleryThemePropertiesDialog!"); 336 337 if ( bCreateNew ) 338 { 339 pThemeProps->StartExecuteModal( 340 LINK( this, GalleryBrowser1, EndNewThemePropertiesDlgHdl ) ); 341 } 342 else 343 { 344 pThemeProps->StartExecuteModal( 345 LINK( this, GalleryBrowser1, EndThemePropertiesDlgHdl ) ); 346 } 347 } 348 349 // ----------------------------------------------------------------------------- 350 351 void GalleryBrowser1::ImplEndGalleryThemeProperties( VclAbstractDialog2* pDialog, bool bCreateNew ) 352 { 353 long nRet = pDialog->GetResult(); 354 355 if( nRet == RET_OK ) 356 { 357 String aName( mpExchangeData->pTheme->GetName() ); 358 359 if( mpExchangeData->aEditedTitle.Len() && aName != mpExchangeData->aEditedTitle ) 360 { 361 const String aOldName( aName ); 362 String aTitle( mpExchangeData->aEditedTitle ); 363 sal_uInt16 nCount = 0; 364 365 while( mpGallery->HasTheme( aTitle ) && ( nCount++ < 16000 ) ) 366 { 367 aTitle = mpExchangeData->aEditedTitle; 368 aTitle += ' '; 369 aTitle += String::CreateFromInt32( nCount ); 370 } 371 372 mpGallery->RenameTheme( aOldName, aTitle ); 373 } 374 375 if ( bCreateNew ) 376 { 377 mpThemes->SelectEntry( mpExchangeData->pTheme->GetName() ); 378 SelectThemeHdl( NULL ); 379 } 380 } 381 382 String aThemeName( mpExchangeData->pTheme->GetName() ); 383 mpGallery->ReleaseTheme( mpExchangeData->pTheme, *this ); 384 385 if ( bCreateNew && ( nRet != RET_OK ) ) 386 { 387 mpGallery->RemoveTheme( aThemeName ); 388 } 389 390 // destroy mpThemeProps asynchronously 391 Application::PostUserEvent( LINK( this, GalleryBrowser1, DestroyThemePropertiesDlgHdl ) ); 392 } 393 394 // ----------------------------------------------------------------------------- 395 396 IMPL_LINK( GalleryBrowser1, EndNewThemePropertiesDlgHdl, VclAbstractDialog2*, pDialog ) 397 { 398 ImplEndGalleryThemeProperties( pDialog, true ); 399 return 0L; 400 } 401 402 // ----------------------------------------------------------------------------- 403 404 IMPL_LINK( GalleryBrowser1, EndThemePropertiesDlgHdl, VclAbstractDialog2*, pDialog ) 405 { 406 ImplEndGalleryThemeProperties( pDialog, false ); 407 return 0L; 408 } 409 410 // ----------------------------------------------------------------------------- 411 412 IMPL_LINK( GalleryBrowser1, DestroyThemePropertiesDlgHdl, VclAbstractDialog2*, pDialog ) 413 { 414 delete pDialog; 415 delete mpThemePropsDlgItemSet; 416 mpThemePropsDlgItemSet = 0; 417 return 0L; 418 } 419 420 // ----------------------------------------------------------------------------- 421 422 void GalleryBrowser1::ImplExecute( sal_uInt16 nId ) 423 { 424 switch( nId ) 425 { 426 case( MN_ACTUALIZE ): 427 { 428 GalleryTheme* pTheme = mpGallery->AcquireTheme( GetSelectedTheme(), *this ); 429 //CHINA001 ActualizeProgress aActualizeProgress( this, pTheme ); 430 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 431 if(pFact) 432 { 433 VclAbstractRefreshableDialog* aActualizeProgress = pFact->CreateActualizeProgressDialog( this, pTheme ); 434 DBG_ASSERT(aActualizeProgress, "Dialogdiet fail!");//CHINA001 435 436 aActualizeProgress->Update(); //CHINA001 aActualizeProgress.Update(); 437 aActualizeProgress->Execute(); //CHINA001 aActualizeProgress.Execute(); 438 mpGallery->ReleaseTheme( pTheme, *this ); 439 delete aActualizeProgress; //add CHINA001 440 } 441 } 442 break; 443 444 case( MN_DELETE ): 445 { 446 if( QueryBox( NULL, WB_YES_NO, String( GAL_RESID( RID_SVXSTR_GALLERY_DELETETHEME ) ) ).Execute() == RET_YES ) 447 mpGallery->RemoveTheme( mpThemes->GetSelectEntry() ); 448 } 449 break; 450 451 case( MN_RENAME ): 452 { 453 GalleryTheme* pTheme = mpGallery->AcquireTheme( GetSelectedTheme(), *this ); 454 const String aOldName( pTheme->GetName() ); 455 //CHINA001 TitleDialog aDlg( this, aOldName ); 456 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 457 DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001 458 AbstractTitleDialog* aDlg = pFact->CreateTitleDialog( this, aOldName ); 459 DBG_ASSERT(aDlg, "Dialogdiet fail!");//CHINA001 460 461 if( aDlg->Execute() == RET_OK ) //CHINA001 if( aDlg.Execute() == RET_OK ) 462 { 463 const String aNewName( aDlg->GetTitle() ); //CHINA001 aDlg.GetTitle() ); 464 465 if( aNewName.Len() && ( aNewName != aOldName ) ) 466 { 467 String aName( aNewName ); 468 sal_uInt16 nCount = 0; 469 470 while( mpGallery->HasTheme( aName ) && ( nCount++ < 16000 ) ) 471 { 472 aName = aNewName; 473 aName += ' '; 474 aName += String::CreateFromInt32( nCount ); 475 } 476 477 mpGallery->RenameTheme( aOldName, aName ); 478 } 479 } 480 mpGallery->ReleaseTheme( pTheme, *this ); 481 delete aDlg; //add CHINA001 482 } 483 break; 484 485 case( MN_ASSIGN_ID ): 486 { 487 GalleryTheme* pTheme = mpGallery->AcquireTheme( GetSelectedTheme(), *this ); 488 489 if( pTheme && !pTheme->IsReadOnly() && !pTheme->IsImported() ) 490 { 491 //CHINA001 GalleryIdDialog aDlg( this, pTheme ); 492 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 493 if(pFact) 494 { 495 AbstractGalleryIdDialog* aDlg = pFact->CreateGalleryIdDialog( this, pTheme ); 496 DBG_ASSERT(aDlg, "Dialogdiet fail!");//CHINA001 497 498 if( aDlg->Execute() == RET_OK ) //CHINA001 if( aDlg.Execute() == RET_OK ) 499 pTheme->SetId( aDlg->GetId(), sal_True ); //CHINA001 pTheme->SetId( aDlg.GetId(), sal_True ); 500 delete aDlg; //add CHINA001 501 } 502 } 503 504 mpGallery->ReleaseTheme( pTheme, *this ); 505 } 506 break; 507 508 case( MN_PROPERTIES ): 509 { 510 ImplGalleryThemeProperties( GetSelectedTheme(), false ); 511 } 512 break; 513 } 514 } 515 516 // ----------------------------------------------------------------------------- 517 518 void GalleryBrowser1::Resize() 519 { 520 Control::Resize(); 521 ImplAdjustControls(); 522 } 523 524 // ----------------------------------------------------------------------------- 525 526 void GalleryBrowser1::GetFocus() 527 { 528 Control::GetFocus(); 529 if( mpThemes ) 530 mpThemes->GrabFocus(); 531 } 532 533 // ----------------------------------------------------------------------------- 534 535 void GalleryBrowser1::Notify( SfxBroadcaster&, const SfxHint& rHint ) 536 { 537 const GalleryHint& rGalleryHint = (const GalleryHint&) rHint; 538 539 switch( rGalleryHint.GetType() ) 540 { 541 case( GALLERY_HINT_THEME_CREATED ): 542 ImplInsertThemeEntry( mpGallery->GetThemeInfo( rGalleryHint.GetThemeName() ) ); 543 break; 544 545 case( GALLERY_HINT_THEME_RENAMED ): 546 { 547 const sal_uInt16 nCurSelectPos = mpThemes->GetSelectEntryPos(); 548 const sal_uInt16 nRenameEntryPos = mpThemes->GetEntryPos( rGalleryHint.GetThemeName() ); 549 550 mpThemes->RemoveEntry( rGalleryHint.GetThemeName() ); 551 ImplInsertThemeEntry( mpGallery->GetThemeInfo( rGalleryHint.GetStringData() ) ); 552 553 if( nCurSelectPos == nRenameEntryPos ) 554 { 555 mpThemes->SelectEntry( rGalleryHint.GetStringData() ); 556 SelectThemeHdl( NULL ); 557 } 558 } 559 break; 560 561 case( GALLERY_HINT_THEME_REMOVED ): 562 { 563 mpThemes->RemoveEntry( rGalleryHint.GetThemeName() ); 564 } 565 break; 566 567 case( GALLERY_HINT_CLOSE_THEME ): 568 { 569 const sal_uInt16 nCurSelectPos = mpThemes->GetSelectEntryPos(); 570 const sal_uInt16 nCloseEntryPos = mpThemes->GetEntryPos( rGalleryHint.GetThemeName() ); 571 572 if( nCurSelectPos == nCloseEntryPos ) 573 { 574 if( nCurSelectPos < ( mpThemes->GetEntryCount() - 1 ) ) 575 mpThemes->SelectEntryPos( nCurSelectPos + 1 ); 576 else if( nCurSelectPos ) 577 mpThemes->SelectEntryPos( nCurSelectPos - 1 ); 578 else 579 mpThemes->SetNoSelection(); 580 581 SelectThemeHdl( NULL ); 582 } 583 } 584 break; 585 586 default: 587 break; 588 } 589 } 590 591 // ----------------------------------------------------------------------------- 592 593 void GalleryBrowser1::ShowContextMenu() 594 { 595 Application::PostUserEvent( LINK( this, GalleryBrowser1, ShowContextMenuHdl ), this ); 596 } 597 598 // ----------------------------------------------------------------------------- 599 600 sal_Bool GalleryBrowser1::KeyInput( const KeyEvent& rKEvt, Window* pWindow ) 601 { 602 sal_Bool bRet (sal_False); 603 if (maKeyInputHandler) 604 bRet = maKeyInputHandler(rKEvt, pWindow); 605 606 if( !bRet ) 607 { 608 ::std::vector< sal_uInt16 > aExecVector; 609 ImplGetExecuteVector(aExecVector); 610 sal_uInt16 nExecuteId = 0; 611 sal_Bool bMod1 = rKEvt.GetKeyCode().IsMod1(); 612 613 switch( rKEvt.GetKeyCode().GetCode() ) 614 { 615 case( KEY_INSERT ): 616 ClickNewThemeHdl( NULL ); 617 break; 618 619 case( KEY_I ): 620 { 621 if( bMod1 ) 622 ClickNewThemeHdl( NULL ); 623 } 624 break; 625 626 case( KEY_U ): 627 { 628 if( bMod1 ) 629 nExecuteId = MN_ACTUALIZE; 630 } 631 break; 632 633 case( KEY_DELETE ): 634 nExecuteId = MN_DELETE; 635 break; 636 637 case( KEY_D ): 638 { 639 if( bMod1 ) 640 nExecuteId = MN_DELETE; 641 } 642 break; 643 644 case( KEY_R ): 645 { 646 if( bMod1 ) 647 nExecuteId = MN_RENAME; 648 } 649 break; 650 651 case( KEY_RETURN ): 652 { 653 if( bMod1 ) 654 nExecuteId = MN_PROPERTIES; 655 } 656 break; 657 } 658 659 if( nExecuteId && ( ::std::find( aExecVector.begin(), aExecVector.end(), nExecuteId ) != aExecVector.end() ) ) 660 { 661 ImplExecute( nExecuteId ); 662 bRet = sal_True; 663 } 664 } 665 666 return bRet; 667 } 668 669 // ----------------------------------------------------------------------------- 670 671 IMPL_LINK( GalleryBrowser1, ShowContextMenuHdl, void*, EMPTYARG ) 672 { 673 ::std::vector< sal_uInt16 > aExecVector; 674 ImplGetExecuteVector(aExecVector); 675 676 if( !aExecVector.empty() ) 677 { 678 PopupMenu aMenu( GAL_RESID( RID_SVXMN_GALLERY1 ) ); 679 680 aMenu.EnableItem( MN_ACTUALIZE, ::std::find( aExecVector.begin(), aExecVector.end(), MN_ACTUALIZE ) != aExecVector.end() ); 681 aMenu.EnableItem( MN_RENAME, ::std::find( aExecVector.begin(), aExecVector.end(), MN_RENAME ) != aExecVector.end() ); 682 aMenu.EnableItem( MN_DELETE, ::std::find( aExecVector.begin(), aExecVector.end(), MN_DELETE ) != aExecVector.end() ); 683 aMenu.EnableItem( MN_ASSIGN_ID, ::std::find( aExecVector.begin(), aExecVector.end(), MN_ASSIGN_ID ) != aExecVector.end() ); 684 aMenu.EnableItem( MN_PROPERTIES, ::std::find( aExecVector.begin(), aExecVector.end(), MN_PROPERTIES ) != aExecVector.end() ); 685 aMenu.SetSelectHdl( LINK( this, GalleryBrowser1, PopupMenuHdl ) ); 686 aMenu.RemoveDisabledEntries(); 687 688 const Rectangle aThemesRect( mpThemes->GetPosPixel(), mpThemes->GetOutputSizePixel() ); 689 Point aSelPos( mpThemes->GetBoundingRectangle( mpThemes->GetSelectEntryPos() ).Center() ); 690 691 aSelPos.X() = Max( Min( aSelPos.X(), aThemesRect.Right() ), aThemesRect.Left() ); 692 aSelPos.Y() = Max( Min( aSelPos.Y(), aThemesRect.Bottom() ), aThemesRect.Top() ); 693 694 aMenu.Execute( this, aSelPos ); 695 } 696 697 return 0L; 698 } 699 700 // ----------------------------------------------------------------------------- 701 702 IMPL_LINK( GalleryBrowser1, PopupMenuHdl, Menu*, pMenu ) 703 { 704 ImplExecute( pMenu->GetCurItemId() ); 705 return 0L; 706 } 707 708 // ----------------------------------------------------------------------------- 709 710 IMPL_LINK( GalleryBrowser1, SelectThemeHdl, void*, EMPTYARG ) 711 { 712 if (maThemeSlectionHandler) 713 maThemeSlectionHandler(); 714 return 0L; 715 } 716 717 // ----------------------------------------------------------------------------- 718 719 IMPL_LINK( GalleryBrowser1, ClickNewThemeHdl, void*, EMPTYARG ) 720 { 721 String aNewTheme( GAL_RESID( RID_SVXSTR_GALLERY_NEWTHEME ) ); 722 String aName( aNewTheme ); 723 sal_uIntPtr nCount = 0; 724 725 while( mpGallery->HasTheme( aName ) && ( nCount++ < 16000 ) ) 726 { 727 aName = aNewTheme; 728 aName += ' '; 729 aName += String::CreateFromInt32( nCount ); 730 } 731 732 if( !mpGallery->HasTheme( aName ) && mpGallery->CreateTheme( aName ) ) 733 { 734 ImplGalleryThemeProperties( aName, true ); 735 } 736 737 return 0L; 738 } 739 740