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 // -----------------
DBG_NAME(GalleryButton)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
~GalleryButton()67 GalleryButton::~GalleryButton()
68 {
69
70 DBG_DTOR(GalleryButton,NULL);
71 }
72
73 // -----------------------------------------------------------------------------
74
KeyInput(const KeyEvent & rKEvt)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 // -----------------------
DBG_NAME(GalleryThemeListBox)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
~GalleryThemeListBox()96 GalleryThemeListBox::~GalleryThemeListBox()
97 {
98
99 DBG_DTOR(GalleryThemeListBox,NULL);
100 }
101
102 // ------------------------------------------------------------------------
103
InitSettings()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
DataChanged(const DataChangedEvent & rDCEvt)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
PreNotify(NotifyEvent & rNEvt)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 // -------------------
DBG_NAME(GalleryBrowser1)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
~GalleryBrowser1()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
ImplInsertThemeEntry(const GalleryThemeEntry * pEntry)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
ImplAdjustControls()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
ImplFillExchangeData(const GalleryTheme * pThm,ExchangeData & rData)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
ImplGetExecuteVector(::std::vector<sal_uInt16> & o_aExec)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
ImplGalleryThemeProperties(const String & rThemeName,bool bCreateNew)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
ImplEndGalleryThemeProperties(VclAbstractDialog2 * pDialog,bool bCreateNew)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
IMPL_LINK(GalleryBrowser1,EndNewThemePropertiesDlgHdl,VclAbstractDialog2 *,pDialog)396 IMPL_LINK( GalleryBrowser1, EndNewThemePropertiesDlgHdl, VclAbstractDialog2*, pDialog )
397 {
398 ImplEndGalleryThemeProperties( pDialog, true );
399 return 0L;
400 }
401
402 // -----------------------------------------------------------------------------
403
IMPL_LINK(GalleryBrowser1,EndThemePropertiesDlgHdl,VclAbstractDialog2 *,pDialog)404 IMPL_LINK( GalleryBrowser1, EndThemePropertiesDlgHdl, VclAbstractDialog2*, pDialog )
405 {
406 ImplEndGalleryThemeProperties( pDialog, false );
407 return 0L;
408 }
409
410 // -----------------------------------------------------------------------------
411
IMPL_LINK(GalleryBrowser1,DestroyThemePropertiesDlgHdl,VclAbstractDialog2 *,pDialog)412 IMPL_LINK( GalleryBrowser1, DestroyThemePropertiesDlgHdl, VclAbstractDialog2*, pDialog )
413 {
414 delete pDialog;
415 delete mpThemePropsDlgItemSet;
416 mpThemePropsDlgItemSet = 0;
417 return 0L;
418 }
419
420 // -----------------------------------------------------------------------------
421
ImplExecute(sal_uInt16 nId)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
Resize()518 void GalleryBrowser1::Resize()
519 {
520 Control::Resize();
521 ImplAdjustControls();
522 }
523
524 // -----------------------------------------------------------------------------
525
GetFocus()526 void GalleryBrowser1::GetFocus()
527 {
528 Control::GetFocus();
529 if( mpThemes )
530 mpThemes->GrabFocus();
531 }
532
533 // -----------------------------------------------------------------------------
534
Notify(SfxBroadcaster &,const SfxHint & rHint)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
ShowContextMenu()593 void GalleryBrowser1::ShowContextMenu()
594 {
595 Application::PostUserEvent( LINK( this, GalleryBrowser1, ShowContextMenuHdl ), this );
596 }
597
598 // -----------------------------------------------------------------------------
599
KeyInput(const KeyEvent & rKEvt,Window * pWindow)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
IMPL_LINK(GalleryBrowser1,ShowContextMenuHdl,void *,EMPTYARG)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
IMPL_LINK(GalleryBrowser1,PopupMenuHdl,Menu *,pMenu)702 IMPL_LINK( GalleryBrowser1, PopupMenuHdl, Menu*, pMenu )
703 {
704 ImplExecute( pMenu->GetCurItemId() );
705 return 0L;
706 }
707
708 // -----------------------------------------------------------------------------
709
IMPL_LINK(GalleryBrowser1,SelectThemeHdl,void *,EMPTYARG)710 IMPL_LINK( GalleryBrowser1, SelectThemeHdl, void*, EMPTYARG )
711 {
712 if (maThemeSlectionHandler)
713 maThemeSlectionHandler();
714 return 0L;
715 }
716
717 // -----------------------------------------------------------------------------
718
IMPL_LINK(GalleryBrowser1,ClickNewThemeHdl,void *,EMPTYARG)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