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