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