Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "sal/config.h"
21 :
22 : #include <comphelper/processfactory.hxx>
23 : #include <tools/datetime.hxx>
24 : #include <unotools/datetime.hxx>
25 : #include <vcl/msgbox.hxx>
26 : #include <vcl/settings.hxx>
27 : #include <ucbhelper/content.hxx>
28 : #include <sfx2/app.hxx>
29 : #include "helpid.hrc"
30 : #include "svx/gallery1.hxx"
31 : #include "svx/galtheme.hxx"
32 : #include "svx/galmisc.hxx"
33 : #include "galbrws1.hxx"
34 : #include <com/sun/star/util/DateTime.hpp>
35 : #include "gallery.hrc"
36 : #include <algorithm>
37 : #include <svx/dialogs.hrc>
38 : #include <svx/dialmgr.hxx>
39 :
40 : #include <svx/svxdlg.hxx>
41 : #include <boost/scoped_ptr.hpp>
42 :
43 : // - Namespaces -
44 :
45 : using namespace ::com::sun::star;
46 :
47 : // - GalleryButton -
48 :
49 0 : GalleryButton::GalleryButton( GalleryBrowser1* pParent, WinBits nWinBits ) :
50 0 : PushButton( pParent, nWinBits )
51 : {
52 0 : }
53 :
54 0 : void GalleryButton::KeyInput( const KeyEvent& rKEvt )
55 : {
56 0 : if( !static_cast< GalleryBrowser1* >( GetParent() )->KeyInput( rKEvt, this ) )
57 0 : PushButton::KeyInput( rKEvt );
58 0 : }
59 :
60 : // - GalleryThemeListBox -
61 :
62 0 : GalleryThemeListBox::GalleryThemeListBox( GalleryBrowser1* pParent, WinBits nWinBits ) :
63 0 : ListBox( pParent, nWinBits )
64 : {
65 0 : InitSettings();
66 0 : }
67 :
68 0 : void GalleryThemeListBox::InitSettings()
69 : {
70 0 : SetBackground( Wallpaper( GALLERY_BG_COLOR ) );
71 0 : SetControlBackground( GALLERY_BG_COLOR );
72 0 : SetControlForeground( GALLERY_FG_COLOR );
73 0 : }
74 :
75 0 : void GalleryThemeListBox::DataChanged( const DataChangedEvent& rDCEvt )
76 : {
77 0 : if ( ( rDCEvt.GetType() == DataChangedEventType::SETTINGS ) && ( rDCEvt.GetFlags() & AllSettingsFlags::STYLE ) )
78 0 : InitSettings();
79 : else
80 0 : ListBox::DataChanged( rDCEvt );
81 0 : }
82 :
83 0 : bool GalleryThemeListBox::PreNotify( NotifyEvent& rNEvt )
84 : {
85 0 : bool bDone = false;
86 :
87 0 : if( rNEvt.GetType() == MouseNotifyEvent::COMMAND )
88 : {
89 0 : const CommandEvent* pCEvt = rNEvt.GetCommandEvent();
90 :
91 0 : if( pCEvt && pCEvt->GetCommand() == CommandEventId::ContextMenu )
92 0 : static_cast< GalleryBrowser1* >( GetParent() )->ShowContextMenu();
93 : }
94 0 : else if( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
95 : {
96 0 : const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
97 :
98 0 : if( pKEvt )
99 0 : bDone = static_cast< GalleryBrowser1* >( GetParent() )->KeyInput( *pKEvt, this );
100 : }
101 :
102 0 : return( bDone || ListBox::PreNotify( rNEvt ) );
103 : }
104 :
105 : // - GalleryBrowser1 -
106 :
107 0 : GalleryBrowser1::GalleryBrowser1(
108 : vcl::Window* pParent,
109 : Gallery* pGallery,
110 : const ::boost::function<sal_Bool(const KeyEvent&,Window*)>& rKeyInputHandler,
111 : const ::boost::function<void()>& rThemeSlectionHandler)
112 : :
113 : Control ( pParent, WB_TABSTOP ),
114 : maNewTheme ( VclPtr<GalleryButton>::Create(this, WB_3DLOOK) ),
115 : mpThemes ( VclPtr<GalleryThemeListBox>::Create( this, WB_TABSTOP | WB_3DLOOK | WB_BORDER | WB_HSCROLL | WB_VSCROLL | WB_AUTOHSCROLL | WB_SORT ) ),
116 : mpGallery ( pGallery ),
117 0 : mpExchangeData ( new ExchangeData ),
118 : mpThemePropsDlgItemSet( NULL ),
119 : aImgNormal ( GalleryResGetBitmapEx( RID_SVXBMP_THEME_NORMAL ) ),
120 : aImgDefault ( GalleryResGetBitmapEx( RID_SVXBMP_THEME_DEFAULT ) ),
121 : aImgReadOnly ( GalleryResGetBitmapEx( RID_SVXBMP_THEME_READONLY ) ),
122 : maKeyInputHandler(rKeyInputHandler),
123 0 : maThemeSlectionHandler(rThemeSlectionHandler)
124 : {
125 0 : StartListening( *mpGallery );
126 :
127 0 : maNewTheme->SetHelpId( HID_GALLERY_NEWTHEME );
128 0 : maNewTheme->SetText( GAL_RESSTR(RID_SVXSTR_GALLERY_CREATETHEME));
129 0 : maNewTheme->SetClickHdl( LINK( this, GalleryBrowser1, ClickNewThemeHdl ) );
130 :
131 : // disable creation of new themes if a writable directory is not available
132 0 : if( mpGallery->GetUserURL().GetProtocol() == INetProtocol::NotValid )
133 0 : maNewTheme->Disable();
134 :
135 0 : mpThemes->SetHelpId( HID_GALLERY_THEMELIST );
136 0 : mpThemes->SetSelectHdl( LINK( this, GalleryBrowser1, SelectThemeHdl ) );
137 0 : mpThemes->SetAccessibleName(SVX_RESSTR(RID_SVXSTR_GALLERYPROPS_GALTHEME));
138 :
139 0 : for( sal_uIntPtr i = 0, nCount = mpGallery->GetThemeCount(); i < nCount; i++ )
140 0 : ImplInsertThemeEntry( mpGallery->GetThemeInfo( i ) );
141 :
142 0 : ImplAdjustControls();
143 0 : maNewTheme->Show( true );
144 0 : mpThemes->Show( true );
145 0 : }
146 :
147 0 : GalleryBrowser1::~GalleryBrowser1()
148 : {
149 0 : disposeOnce();
150 0 : }
151 :
152 0 : void GalleryBrowser1::dispose()
153 : {
154 0 : EndListening( *mpGallery );
155 0 : mpThemes.disposeAndClear();
156 0 : delete mpExchangeData;
157 0 : mpExchangeData = NULL;
158 0 : maNewTheme.disposeAndClear();
159 0 : Control::dispose();
160 0 : }
161 :
162 0 : sal_uIntPtr GalleryBrowser1::ImplInsertThemeEntry( const GalleryThemeEntry* pEntry )
163 : {
164 0 : static const bool bShowHiddenThemes = ( getenv( "GALLERY_SHOW_HIDDEN_THEMES" ) != NULL );
165 :
166 0 : sal_uIntPtr nRet = LISTBOX_ENTRY_NOTFOUND;
167 :
168 0 : if( pEntry && ( !pEntry->IsHidden() || bShowHiddenThemes ) )
169 : {
170 : const Image* pImage;
171 :
172 0 : if( pEntry->IsReadOnly() )
173 0 : pImage = &aImgReadOnly;
174 0 : else if( pEntry->IsDefault() )
175 0 : pImage = &aImgDefault;
176 : else
177 0 : pImage = &aImgNormal;
178 :
179 0 : nRet = mpThemes->InsertEntry( pEntry->GetThemeName(), *pImage );
180 : }
181 :
182 0 : return nRet;
183 : }
184 :
185 0 : void GalleryBrowser1::ImplAdjustControls()
186 : {
187 0 : const Size aOutSize( GetOutputSizePixel() );
188 0 : const long nNewThemeHeight = LogicToPixel( Size( 0, 14 ), MAP_APPFONT ).Height();
189 0 : const long nStartY = nNewThemeHeight + 4;
190 :
191 0 : maNewTheme->SetPosSizePixel( Point(),
192 0 : Size( aOutSize.Width(), nNewThemeHeight ) );
193 :
194 0 : mpThemes->SetPosSizePixel( Point( 0, nStartY ),
195 0 : Size( aOutSize.Width(), aOutSize.Height() - nStartY ) );
196 0 : }
197 :
198 0 : void GalleryBrowser1::ImplFillExchangeData( const GalleryTheme* pThm, ExchangeData& rData )
199 : {
200 0 : rData.pTheme = const_cast<GalleryTheme*>(pThm);
201 0 : rData.aEditedTitle = pThm->GetName();
202 :
203 : try
204 : {
205 0 : ::ucbhelper::Content aCnt( pThm->GetThmURL().GetMainURL( INetURLObject::NO_DECODE ), uno::Reference< ucb::XCommandEnvironment >(), comphelper::getProcessComponentContext() );
206 0 : util::DateTime aDateTimeModified;
207 0 : DateTime aDateTime( DateTime::EMPTY );
208 :
209 0 : aCnt.getPropertyValue("DateModified") >>= aDateTimeModified;
210 0 : ::utl::typeConvert( aDateTimeModified, aDateTime );
211 0 : rData.aThemeChangeDate = aDateTime;
212 0 : rData.aThemeChangeTime = aDateTime;
213 : }
214 0 : catch( const ucb::ContentCreationException& )
215 : {
216 : }
217 0 : catch( const uno::RuntimeException& )
218 : {
219 : }
220 0 : catch( const uno::Exception& )
221 : {
222 : }
223 0 : }
224 :
225 0 : void GalleryBrowser1::ImplGetExecuteVector(::std::vector< sal_uInt16 >& o_aExec)
226 : {
227 0 : GalleryTheme* pTheme = mpGallery->AcquireTheme( GetSelectedTheme(), *this );
228 :
229 0 : if( pTheme )
230 : {
231 : bool bUpdateAllowed, bRenameAllowed, bRemoveAllowed;
232 0 : static const bool bIdDialog = ( getenv( "GALLERY_ENABLE_ID_DIALOG" ) != NULL );
233 :
234 0 : if( pTheme->IsReadOnly() )
235 0 : bUpdateAllowed = bRenameAllowed = bRemoveAllowed = false;
236 0 : else if( pTheme->IsDefault() )
237 : {
238 0 : bUpdateAllowed = bRenameAllowed = true;
239 0 : bRemoveAllowed = false;
240 : }
241 : else
242 0 : bUpdateAllowed = bRenameAllowed = bRemoveAllowed = true;
243 :
244 0 : if( bUpdateAllowed && pTheme->GetObjectCount() )
245 0 : o_aExec.push_back( MN_ACTUALIZE );
246 :
247 0 : if( bRenameAllowed )
248 0 : o_aExec.push_back( MN_RENAME );
249 :
250 0 : if( bRemoveAllowed )
251 0 : o_aExec.push_back( MN_DELETE );
252 :
253 0 : if( bIdDialog && !pTheme->IsReadOnly() )
254 0 : o_aExec.push_back( MN_ASSIGN_ID );
255 :
256 0 : o_aExec.push_back( MN_PROPERTIES );
257 :
258 0 : mpGallery->ReleaseTheme( pTheme, *this );
259 : }
260 0 : }
261 :
262 0 : void GalleryBrowser1::ImplGalleryThemeProperties( const OUString & rThemeName, bool bCreateNew )
263 : {
264 : DBG_ASSERT(!mpThemePropsDlgItemSet, "mpThemePropsDlgItemSet already set!");
265 0 : mpThemePropsDlgItemSet = new SfxItemSet( SfxGetpApp()->GetPool() );
266 0 : GalleryTheme* pTheme = mpGallery->AcquireTheme( rThemeName, *this );
267 :
268 0 : ImplFillExchangeData( pTheme, *mpExchangeData );
269 :
270 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
271 : assert(pFact && "Got no AbstractDialogFactory!");
272 0 : VclAbstractDialog2* pThemeProps = pFact->CreateGalleryThemePropertiesDialog( NULL, mpExchangeData, mpThemePropsDlgItemSet );
273 : assert(pThemeProps && "Got no GalleryThemePropertiesDialog!");
274 :
275 0 : if ( bCreateNew )
276 : {
277 : pThemeProps->StartExecuteModal(
278 0 : LINK( this, GalleryBrowser1, EndNewThemePropertiesDlgHdl ) );
279 : }
280 : else
281 : {
282 : pThemeProps->StartExecuteModal(
283 0 : LINK( this, GalleryBrowser1, EndThemePropertiesDlgHdl ) );
284 : }
285 0 : }
286 :
287 0 : void GalleryBrowser1::ImplEndGalleryThemeProperties( VclAbstractDialog2* pDialog, bool bCreateNew )
288 : {
289 0 : long nRet = pDialog->GetResult();
290 :
291 0 : if( nRet == RET_OK )
292 : {
293 0 : OUString aName( mpExchangeData->pTheme->GetName() );
294 :
295 0 : if( !mpExchangeData->aEditedTitle.isEmpty() && aName != mpExchangeData->aEditedTitle )
296 : {
297 0 : const OUString aOldName( aName );
298 0 : OUString aTitle( mpExchangeData->aEditedTitle );
299 0 : sal_uInt16 nCount = 0;
300 :
301 0 : while( mpGallery->HasTheme( aTitle ) && ( nCount++ < 16000 ) )
302 : {
303 0 : aTitle = mpExchangeData->aEditedTitle;
304 0 : aTitle += " ";
305 0 : aTitle += OUString::number( nCount );
306 : }
307 :
308 0 : mpGallery->RenameTheme( aOldName, aTitle );
309 : }
310 :
311 0 : if ( bCreateNew )
312 : {
313 0 : mpThemes->SelectEntry( mpExchangeData->pTheme->GetName() );
314 0 : SelectThemeHdl( NULL );
315 0 : }
316 : }
317 :
318 0 : OUString aThemeName( mpExchangeData->pTheme->GetName() );
319 0 : mpGallery->ReleaseTheme( mpExchangeData->pTheme, *this );
320 :
321 0 : if ( bCreateNew && ( nRet != RET_OK ) )
322 : {
323 0 : mpGallery->RemoveTheme( aThemeName );
324 : }
325 :
326 : // destroy mpThemeProps asynchronously
327 0 : Application::PostUserEvent( LINK( this, GalleryBrowser1, DestroyThemePropertiesDlgHdl ), pDialog, true );
328 0 : }
329 :
330 0 : IMPL_LINK( GalleryBrowser1, EndNewThemePropertiesDlgHdl, VclAbstractDialog2*, pDialog )
331 : {
332 0 : ImplEndGalleryThemeProperties( pDialog, true );
333 0 : return 0L;
334 : }
335 :
336 0 : IMPL_LINK( GalleryBrowser1, EndThemePropertiesDlgHdl, VclAbstractDialog2*, pDialog )
337 : {
338 0 : ImplEndGalleryThemeProperties( pDialog, false );
339 0 : return 0L;
340 : }
341 :
342 0 : IMPL_LINK( GalleryBrowser1, DestroyThemePropertiesDlgHdl, VclAbstractDialog2*, pDialog )
343 : {
344 0 : delete pDialog;
345 0 : delete mpThemePropsDlgItemSet;
346 0 : mpThemePropsDlgItemSet = 0;
347 0 : return 0L;
348 : }
349 :
350 0 : void GalleryBrowser1::ImplExecute( sal_uInt16 nId )
351 : {
352 0 : switch( nId )
353 : {
354 : case( MN_ACTUALIZE ):
355 : {
356 0 : GalleryTheme* pTheme = mpGallery->AcquireTheme( GetSelectedTheme(), *this );
357 :
358 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
359 0 : if(pFact)
360 : {
361 0 : boost::scoped_ptr<VclAbstractRefreshableDialog> aActualizeProgress(pFact->CreateActualizeProgressDialog( this, pTheme ));
362 : DBG_ASSERT(aActualizeProgress, "Dialog creation failed!");
363 :
364 0 : aActualizeProgress->Update();
365 0 : aActualizeProgress->Execute();
366 0 : mpGallery->ReleaseTheme( pTheme, *this );
367 : }
368 : }
369 0 : break;
370 :
371 : case( MN_DELETE ):
372 : {
373 0 : if( ScopedVclPtrInstance<MessageDialog>::Create( nullptr, "QueryDeleteThemeDialog","svx/ui/querydeletethemedialog.ui")->Execute() == RET_YES )
374 0 : mpGallery->RemoveTheme( mpThemes->GetSelectEntry() );
375 : }
376 0 : break;
377 :
378 : case( MN_RENAME ):
379 : {
380 0 : GalleryTheme* pTheme = mpGallery->AcquireTheme( GetSelectedTheme(), *this );
381 0 : const OUString aOldName( pTheme->GetName() );
382 :
383 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
384 : DBG_ASSERT(pFact, "Dialog creation failed!");
385 0 : boost::scoped_ptr<AbstractTitleDialog> aDlg(pFact->CreateTitleDialog( this, aOldName ));
386 : DBG_ASSERT(aDlg, "Dialog creation failed!");
387 :
388 0 : if( aDlg->Execute() == RET_OK )
389 : {
390 0 : const OUString aNewName( aDlg->GetTitle() );
391 :
392 0 : if( !aNewName.isEmpty() && ( aNewName != aOldName ) )
393 : {
394 0 : OUString aName( aNewName );
395 0 : sal_uInt16 nCount = 0;
396 :
397 0 : while( mpGallery->HasTheme( aName ) && ( nCount++ < 16000 ) )
398 : {
399 0 : aName = aNewName;
400 0 : aName += " ";
401 0 : aName += OUString::number( nCount );
402 : }
403 :
404 0 : mpGallery->RenameTheme( aOldName, aName );
405 0 : }
406 : }
407 0 : mpGallery->ReleaseTheme( pTheme, *this );
408 : }
409 0 : break;
410 :
411 : case( MN_ASSIGN_ID ):
412 : {
413 0 : GalleryTheme* pTheme = mpGallery->AcquireTheme( GetSelectedTheme(), *this );
414 :
415 0 : if (pTheme && !pTheme->IsReadOnly())
416 : {
417 :
418 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
419 0 : if(pFact)
420 : {
421 0 : boost::scoped_ptr<AbstractGalleryIdDialog> aDlg(pFact->CreateGalleryIdDialog( this, pTheme ));
422 : DBG_ASSERT(aDlg, "Dialog creation failed!");
423 :
424 0 : if( aDlg->Execute() == RET_OK )
425 0 : pTheme->SetId( aDlg->GetId(), true );
426 : }
427 : }
428 :
429 0 : mpGallery->ReleaseTheme( pTheme, *this );
430 : }
431 0 : break;
432 :
433 : case( MN_PROPERTIES ):
434 : {
435 0 : ImplGalleryThemeProperties( GetSelectedTheme(), false );
436 : }
437 0 : break;
438 : }
439 0 : }
440 :
441 0 : void GalleryBrowser1::Resize()
442 : {
443 0 : Control::Resize();
444 0 : ImplAdjustControls();
445 0 : }
446 :
447 0 : void GalleryBrowser1::GetFocus()
448 : {
449 0 : Control::GetFocus();
450 0 : if( mpThemes )
451 0 : mpThemes->GrabFocus();
452 0 : }
453 :
454 0 : void GalleryBrowser1::Notify( SfxBroadcaster&, const SfxHint& rHint )
455 : {
456 0 : const GalleryHint& rGalleryHint = static_cast<const GalleryHint&>(rHint);
457 :
458 0 : switch( rGalleryHint.GetType() )
459 : {
460 : case( GalleryHintType::THEME_CREATED ):
461 0 : ImplInsertThemeEntry( mpGallery->GetThemeInfo( rGalleryHint.GetThemeName() ) );
462 0 : break;
463 :
464 : case( GalleryHintType::THEME_RENAMED ):
465 : {
466 0 : const sal_uInt16 nCurSelectPos = mpThemes->GetSelectEntryPos();
467 0 : const sal_uInt16 nRenameEntryPos = mpThemes->GetEntryPos( rGalleryHint.GetThemeName() );
468 :
469 0 : mpThemes->RemoveEntry( rGalleryHint.GetThemeName() );
470 0 : ImplInsertThemeEntry( mpGallery->GetThemeInfo( rGalleryHint.GetStringData() ) );
471 :
472 0 : if( nCurSelectPos == nRenameEntryPos )
473 : {
474 0 : mpThemes->SelectEntry( rGalleryHint.GetStringData() );
475 0 : SelectThemeHdl( NULL );
476 : }
477 : }
478 0 : break;
479 :
480 : case( GalleryHintType::THEME_REMOVED ):
481 : {
482 0 : mpThemes->RemoveEntry( rGalleryHint.GetThemeName() );
483 : }
484 0 : break;
485 :
486 : case( GalleryHintType::CLOSE_THEME ):
487 : {
488 0 : const sal_uInt16 nCurSelectPos = mpThemes->GetSelectEntryPos();
489 0 : const sal_uInt16 nCloseEntryPos = mpThemes->GetEntryPos( rGalleryHint.GetThemeName() );
490 :
491 0 : if( nCurSelectPos == nCloseEntryPos )
492 : {
493 0 : if( nCurSelectPos < ( mpThemes->GetEntryCount() - 1 ) )
494 0 : mpThemes->SelectEntryPos( nCurSelectPos + 1 );
495 0 : else if( nCurSelectPos )
496 0 : mpThemes->SelectEntryPos( nCurSelectPos - 1 );
497 : else
498 0 : mpThemes->SetNoSelection();
499 :
500 0 : SelectThemeHdl( NULL );
501 : }
502 : }
503 0 : break;
504 :
505 : default:
506 0 : break;
507 : }
508 0 : }
509 :
510 0 : void GalleryBrowser1::ShowContextMenu()
511 : {
512 0 : Application::PostUserEvent( LINK( this, GalleryBrowser1, ShowContextMenuHdl ), this, true );
513 0 : }
514 :
515 0 : bool GalleryBrowser1::KeyInput( const KeyEvent& rKEvt, vcl::Window* pWindow )
516 : {
517 0 : bool bRet = false;
518 0 : if (maKeyInputHandler)
519 0 : bRet = maKeyInputHandler(rKEvt, pWindow);
520 :
521 0 : if( !bRet )
522 : {
523 0 : ::std::vector< sal_uInt16 > aExecVector;
524 0 : ImplGetExecuteVector(aExecVector);
525 0 : sal_uInt16 nExecuteId = 0;
526 0 : bool bMod1 = rKEvt.GetKeyCode().IsMod1();
527 :
528 0 : switch( rKEvt.GetKeyCode().GetCode() )
529 : {
530 : case( KEY_INSERT ):
531 0 : ClickNewThemeHdl( NULL );
532 0 : break;
533 :
534 : case( KEY_I ):
535 : {
536 0 : if( bMod1 )
537 0 : ClickNewThemeHdl( NULL );
538 : }
539 0 : break;
540 :
541 : case( KEY_U ):
542 : {
543 0 : if( bMod1 )
544 0 : nExecuteId = MN_ACTUALIZE;
545 : }
546 0 : break;
547 :
548 : case( KEY_DELETE ):
549 0 : nExecuteId = MN_DELETE;
550 0 : break;
551 :
552 : case( KEY_D ):
553 : {
554 0 : if( bMod1 )
555 0 : nExecuteId = MN_DELETE;
556 : }
557 0 : break;
558 :
559 : case( KEY_R ):
560 : {
561 0 : if( bMod1 )
562 0 : nExecuteId = MN_RENAME;
563 : }
564 0 : break;
565 :
566 : case( KEY_RETURN ):
567 : {
568 0 : if( bMod1 )
569 0 : nExecuteId = MN_PROPERTIES;
570 : }
571 0 : break;
572 : }
573 :
574 0 : if( nExecuteId && ( ::std::find( aExecVector.begin(), aExecVector.end(), nExecuteId ) != aExecVector.end() ) )
575 : {
576 0 : ImplExecute( nExecuteId );
577 0 : bRet = true;
578 0 : }
579 : }
580 :
581 0 : return bRet;
582 : }
583 :
584 0 : IMPL_LINK_NOARG(GalleryBrowser1, ShowContextMenuHdl)
585 : {
586 0 : ::std::vector< sal_uInt16 > aExecVector;
587 0 : ImplGetExecuteVector(aExecVector);
588 :
589 0 : if( !aExecVector.empty() )
590 : {
591 0 : PopupMenu aMenu( GAL_RES( RID_SVXMN_GALLERY1 ) );
592 :
593 0 : aMenu.EnableItem( MN_ACTUALIZE, ::std::find( aExecVector.begin(), aExecVector.end(), MN_ACTUALIZE ) != aExecVector.end() );
594 0 : aMenu.EnableItem( MN_RENAME, ::std::find( aExecVector.begin(), aExecVector.end(), MN_RENAME ) != aExecVector.end() );
595 0 : aMenu.EnableItem( MN_DELETE, ::std::find( aExecVector.begin(), aExecVector.end(), MN_DELETE ) != aExecVector.end() );
596 0 : aMenu.EnableItem( MN_ASSIGN_ID, ::std::find( aExecVector.begin(), aExecVector.end(), MN_ASSIGN_ID ) != aExecVector.end() );
597 0 : aMenu.EnableItem( MN_PROPERTIES, ::std::find( aExecVector.begin(), aExecVector.end(), MN_PROPERTIES ) != aExecVector.end() );
598 0 : aMenu.SetSelectHdl( LINK( this, GalleryBrowser1, PopupMenuHdl ) );
599 0 : aMenu.RemoveDisabledEntries();
600 :
601 0 : const Rectangle aThemesRect( mpThemes->GetPosPixel(), mpThemes->GetOutputSizePixel() );
602 0 : Point aSelPos( mpThemes->GetBoundingRectangle( mpThemes->GetSelectEntryPos() ).Center() );
603 :
604 0 : aSelPos.X() = std::max( std::min( aSelPos.X(), aThemesRect.Right() ), aThemesRect.Left() );
605 0 : aSelPos.Y() = std::max( std::min( aSelPos.Y(), aThemesRect.Bottom() ), aThemesRect.Top() );
606 :
607 0 : aMenu.Execute( this, aSelPos );
608 : }
609 :
610 0 : return 0L;
611 : }
612 :
613 0 : IMPL_LINK( GalleryBrowser1, PopupMenuHdl, Menu*, pMenu )
614 : {
615 0 : ImplExecute( pMenu->GetCurItemId() );
616 0 : return 0L;
617 : }
618 :
619 0 : IMPL_LINK_NOARG(GalleryBrowser1, SelectThemeHdl)
620 : {
621 0 : if (maThemeSlectionHandler)
622 0 : maThemeSlectionHandler();
623 0 : return 0L;
624 : }
625 :
626 0 : IMPL_LINK_NOARG(GalleryBrowser1, ClickNewThemeHdl)
627 : {
628 0 : OUString aNewTheme( GAL_RESSTR(RID_SVXSTR_GALLERY_NEWTHEME) );
629 0 : OUString aName( aNewTheme );
630 0 : sal_uIntPtr nCount = 0;
631 :
632 0 : while( mpGallery->HasTheme( aName ) && ( nCount++ < 16000 ) )
633 : {
634 0 : aName = aNewTheme;
635 0 : aName += " ";
636 0 : aName += OUString::number( nCount );
637 : }
638 :
639 0 : if( !mpGallery->HasTheme( aName ) && mpGallery->CreateTheme( aName ) )
640 : {
641 0 : ImplGalleryThemeProperties( aName, true );
642 : }
643 :
644 0 : return 0L;
645 435 : }
646 :
647 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|