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 :
21 : #include <comphelper/string.hxx>
22 : #include <sot/formats.hxx>
23 : #include <vcl/msgbox.hxx>
24 : #include <svl/urlbmk.hxx>
25 : #include <svl/stritem.hxx>
26 : #include <svl/intitem.hxx>
27 : #include <svl/eitem.hxx>
28 : #include <svtools/transfer.hxx>
29 : #include <sfx2/bindings.hxx>
30 : #include <sfx2/dispatch.hxx>
31 : #include <sfx2/viewfrm.hxx>
32 : #include <sfx2/sfxsids.hrc>
33 : #include <vcl/graphicfilter.hxx>
34 : #include <editeng/brushitem.hxx>
35 : #include "helpid.hrc"
36 : #include "svx/gallery.hxx"
37 : #include "galobj.hxx"
38 : #include "svx/gallery1.hxx"
39 : #include "svx/galtheme.hxx"
40 : #include "svx/galctrl.hxx"
41 : #include "svx/galmisc.hxx"
42 : #include "galbrws2.hxx"
43 : #include "gallery.hrc"
44 : #include <vcl/svapp.hxx>
45 : #include <vcl/settings.hxx>
46 : #include <svx/fmmodel.hxx>
47 : #include <svx/dialmgr.hxx>
48 : #include <svx/svxdlg.hxx>
49 : #include <svx/dialogs.hrc>
50 : #include "GalleryControl.hxx"
51 :
52 : #include <svx/svxcommands.h>
53 : #include <svx/galleryitem.hxx>
54 : #include <comphelper/processfactory.hxx>
55 : #include <com/sun/star/frame/FrameSearchFlag.hpp>
56 : #include <com/sun/star/gallery/GalleryItemType.hpp>
57 : #include <com/sun/star/graphic/XGraphic.hpp>
58 : #include <com/sun/star/style/GraphicLocation.hpp>
59 : #include <map>
60 : #include <boost/scoped_ptr.hpp>
61 :
62 : #undef GALLERY_USE_CLIPBOARD
63 :
64 : #define TBX_ID_ICON 1
65 : #define TBX_ID_LIST 2
66 :
67 : GalleryBrowserMode GalleryBrowser2::meInitMode = GALLERYBROWSERMODE_ICON;
68 :
69 0 : struct DispatchInfo
70 : {
71 : css::util::URL TargetURL;
72 : css::uno::Sequence< css::beans::PropertyValue > Arguments;
73 : css::uno::Reference< css::frame::XDispatch > Dispatch;
74 : };
75 :
76 0 : IMPL_STATIC_LINK( GalleryBrowser2, AsyncDispatch_Impl, DispatchInfo*, pDispatchInfo )
77 : {
78 0 : if ( pDispatchInfo && pDispatchInfo->Dispatch.is() )
79 : {
80 : try
81 : {
82 0 : pDispatchInfo->Dispatch->dispatch( pDispatchInfo->TargetURL,
83 0 : pDispatchInfo->Arguments );
84 : }
85 0 : catch ( const css::uno::Exception& )
86 : {
87 : }
88 : }
89 :
90 0 : delete pDispatchInfo;
91 0 : return 0;
92 : }
93 :
94 : namespace
95 : {
96 :
97 0 : struct CommandInfo
98 : {
99 : css::util::URL URL;
100 : css::uno::Reference< css::frame::XDispatch > Dispatch;
101 :
102 0 : explicit CommandInfo( const OUString &rURL )
103 0 : {
104 0 : URL.Complete = rURL;
105 0 : }
106 : };
107 :
108 : class GalleryThemePopup : public ::cppu::WeakImplHelper1< css::frame::XStatusListener >
109 : {
110 : private:
111 : const GalleryTheme* mpTheme;
112 : sal_uIntPtr mnObjectPos;
113 : bool mbPreview;
114 : PopupMenu maPopupMenu;
115 : PopupMenu maBackgroundPopup;
116 : VclPtr<GalleryBrowser2> mpBrowser;
117 :
118 : typedef std::map< int, CommandInfo > CommandInfoMap;
119 : CommandInfoMap m_aCommandInfo;
120 :
121 : static void Execute( const CommandInfo &rCmdInfo,
122 : const css::uno::Sequence< css::beans::PropertyValue > &rArguments );
123 :
124 : DECL_LINK( MenuSelectHdl, Menu* pMenu );
125 : DECL_LINK( BackgroundMenuSelectHdl, Menu* pMenu );
126 : public:
127 : GalleryThemePopup( const GalleryTheme* pTheme,
128 : sal_uIntPtr nObjectPos,
129 : bool bPreview,
130 : GalleryBrowser2* pBrowser );
131 : virtual ~GalleryThemePopup();
132 :
133 : void ExecutePopup( vcl::Window *pParent, const ::Point &aPos );
134 :
135 : virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent &rEvent) throw ( css::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
136 : virtual void SAL_CALL disposing( const css::lang::EventObject &rSource) throw ( css::uno::RuntimeException, std::exception ) SAL_OVERRIDE;
137 : };
138 :
139 :
140 0 : GalleryThemePopup::GalleryThemePopup(
141 : const GalleryTheme* pTheme,
142 : sal_uIntPtr nObjectPos,
143 : bool bPreview,
144 : GalleryBrowser2* pBrowser )
145 : : mpTheme( pTheme )
146 : , mnObjectPos( nObjectPos )
147 : , mbPreview( bPreview )
148 0 : , maPopupMenu( GAL_RES( RID_SVXMN_GALLERY2 ) )
149 : , maBackgroundPopup()
150 0 : , mpBrowser( pBrowser )
151 : {
152 :
153 : // SID_GALLERY_ENABLE_ADDCOPY
154 : m_aCommandInfo.insert(
155 : CommandInfoMap::value_type(
156 : SID_GALLERY_ENABLE_ADDCOPY,
157 0 : CommandInfo( OUString(CMD_SID_GALLERY_ENABLE_ADDCOPY ))));
158 : // SID_GALLERY_BG_BRUSH
159 : m_aCommandInfo.insert(
160 : CommandInfoMap::value_type(
161 : SID_GALLERY_BG_BRUSH,
162 0 : CommandInfo(OUString(CMD_SID_GALLERY_BG_BRUSH ))));
163 : // SID_GALLERY_FORMATS
164 : m_aCommandInfo.insert(
165 : CommandInfoMap::value_type(
166 : SID_GALLERY_FORMATS,
167 0 : CommandInfo(OUString(CMD_SID_GALLERY_FORMATS ))));
168 :
169 0 : }
170 :
171 0 : GalleryThemePopup::~GalleryThemePopup()
172 : {
173 0 : }
174 :
175 0 : void SAL_CALL GalleryThemePopup::statusChanged(
176 : const css::frame::FeatureStateEvent &rEvent )
177 : throw ( css::uno::RuntimeException, std::exception )
178 : {
179 0 : const OUString &rURL = rEvent.FeatureURL.Complete;
180 0 : if ( rURL == CMD_SID_GALLERY_ENABLE_ADDCOPY )
181 : {
182 0 : if ( !rEvent.IsEnabled )
183 : {
184 0 : maPopupMenu.EnableItem( MN_ADD, false );
185 : }
186 : }
187 0 : else if ( rURL == CMD_SID_GALLERY_BG_BRUSH )
188 : {
189 0 : maBackgroundPopup.Clear();
190 0 : if ( rEvent.IsEnabled )
191 : {
192 0 : OUString sItem;
193 0 : css::uno::Sequence< OUString > sItems;
194 0 : if ( ( rEvent.State >>= sItem ) && sItem.getLength() )
195 : {
196 0 : maBackgroundPopup.InsertItem( 1, sItem );
197 : }
198 0 : else if ( ( rEvent.State >>= sItems ) && sItems.getLength() )
199 : {
200 0 : const OUString *pStr = sItems.getConstArray();
201 0 : const OUString *pEnd = pStr + sItems.getLength();
202 0 : for ( sal_uInt16 nId = 1; pStr != pEnd; pStr++, nId++ )
203 : {
204 0 : maBackgroundPopup.InsertItem( nId, *pStr );
205 : }
206 0 : }
207 : }
208 : }
209 0 : }
210 :
211 0 : void SAL_CALL GalleryThemePopup::disposing(
212 : const css::lang::EventObject &/*rSource*/)
213 : throw ( css::uno::RuntimeException, std::exception )
214 : {
215 0 : }
216 :
217 0 : void GalleryThemePopup::Execute(
218 : const CommandInfo &rCmdInfo,
219 : const css::uno::Sequence< css::beans::PropertyValue > &rArguments )
220 : {
221 0 : if ( rCmdInfo.Dispatch.is() )
222 : {
223 0 : DispatchInfo *pInfo = new DispatchInfo;
224 0 : pInfo->TargetURL = rCmdInfo.URL;
225 0 : pInfo->Arguments = rArguments;
226 0 : pInfo->Dispatch = rCmdInfo.Dispatch;
227 :
228 0 : if ( !Application::PostUserEvent(
229 0 : LINK( 0, GalleryBrowser2, AsyncDispatch_Impl), pInfo ) )
230 0 : delete pInfo;
231 : }
232 0 : }
233 :
234 0 : void GalleryThemePopup::ExecutePopup( vcl::Window *pWindow, const ::Point &aPos )
235 : {
236 0 : css::uno::Reference< css::frame::XStatusListener > xThis( this );
237 :
238 0 : const SgaObjKind eObjKind = mpTheme->GetObjectKind( mnObjectPos );
239 0 : INetURLObject aURL;
240 :
241 0 : const_cast< GalleryTheme* >( mpTheme )->GetURL( mnObjectPos, aURL );
242 0 : const bool bValidURL = ( aURL.GetProtocol() != INetProtocol::NotValid );
243 :
244 0 : maPopupMenu.EnableItem( MN_ADD, bValidURL && SGA_OBJ_SOUND != eObjKind );
245 :
246 0 : maPopupMenu.EnableItem( MN_PREVIEW, bValidURL );
247 :
248 0 : maPopupMenu.CheckItem( MN_PREVIEW, mbPreview );
249 :
250 0 : if( mpTheme->IsReadOnly() || !mpTheme->GetObjectCount() )
251 : {
252 0 : maPopupMenu.EnableItem( MN_DELETE, false );
253 0 : maPopupMenu.EnableItem( MN_TITLE, false );
254 :
255 0 : if( mpTheme->IsReadOnly() )
256 0 : maPopupMenu.EnableItem( MN_PASTECLIPBOARD, false );
257 :
258 0 : if( !mpTheme->GetObjectCount() )
259 0 : maPopupMenu.EnableItem( MN_COPYCLIPBOARD, false );
260 : }
261 : else
262 : {
263 0 : maPopupMenu.EnableItem( MN_DELETE, !mbPreview );
264 0 : maPopupMenu.EnableItem( MN_TITLE, true );
265 0 : maPopupMenu.EnableItem( MN_COPYCLIPBOARD, true );
266 0 : maPopupMenu.EnableItem( MN_PASTECLIPBOARD, true );
267 : }
268 :
269 : #ifdef GALLERY_USE_CLIPBOARD
270 : if( maPopupMenu.IsItemEnabled( MN_PASTECLIPBOARD ) )
271 : {
272 : TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( this ) );
273 : sal_Bool bEnable = sal_False;
274 :
275 : if( aDataHelper.GetFormatCount() )
276 : {
277 : if( aDataHelper.HasFormat( SotClipboardFormatId::DRAWING ) ||
278 : aDataHelper.HasFormat( SotClipboardFormatId::FILE_LIST ) ||
279 : aDataHelper.HasFormat( SotClipboardFormatId::SIMPLE_FILE ) ||
280 : aDataHelper.HasFormat( SotClipboardFormatId::SVXB ) ||
281 : aDataHelper.HasFormat( SotClipboardFormatId::GDIMETAFILE ) ||
282 : aDataHelper.HasFormat( SotClipboardFormatId::BITMAP ) )
283 : {
284 : bEnable = sal_True;
285 : }
286 : }
287 :
288 : if( !bEnable )
289 : maPopupMenu.EnableItem( MN_PASTECLIPBOARD, sal_False );
290 : }
291 : #else
292 0 : maPopupMenu.EnableItem( MN_COPYCLIPBOARD, false );
293 0 : maPopupMenu.EnableItem( MN_PASTECLIPBOARD, false );
294 : #endif
295 :
296 : // update status
297 : css::uno::Reference< css::frame::XDispatchProvider> xDispatchProvider(
298 0 : GalleryBrowser2::GetFrame(), css::uno::UNO_QUERY );
299 : css::uno::Reference< css::util::XURLTransformer > xTransformer(
300 0 : mpBrowser->GetURLTransformer() );
301 0 : for ( CommandInfoMap::iterator it = m_aCommandInfo.begin();
302 0 : it != m_aCommandInfo.end(); ++it )
303 : {
304 : try
305 : {
306 0 : CommandInfo &rCmdInfo = it->second;
307 0 : if ( xTransformer.is() )
308 0 : xTransformer->parseStrict( rCmdInfo.URL );
309 :
310 0 : if ( xDispatchProvider.is() )
311 : {
312 0 : rCmdInfo.Dispatch = xDispatchProvider->queryDispatch(
313 : rCmdInfo.URL,
314 : OUString( "_self" ),
315 0 : css::frame::FrameSearchFlag::SELF );
316 : }
317 :
318 0 : if ( rCmdInfo.Dispatch.is() )
319 : {
320 0 : rCmdInfo.Dispatch->addStatusListener( this, rCmdInfo.URL );
321 0 : rCmdInfo.Dispatch->removeStatusListener( this, rCmdInfo.URL );
322 : }
323 : }
324 0 : catch ( ... )
325 : {}
326 : }
327 :
328 0 : if( !maBackgroundPopup.GetItemCount() || ( eObjKind == SGA_OBJ_SVDRAW ) || ( eObjKind == SGA_OBJ_SOUND ) )
329 0 : maPopupMenu.EnableItem( MN_BACKGROUND, false );
330 : else
331 : {
332 0 : maPopupMenu.EnableItem( MN_BACKGROUND, true );
333 0 : maPopupMenu.SetPopupMenu( MN_BACKGROUND, &maBackgroundPopup );
334 0 : maBackgroundPopup.SetSelectHdl( LINK( this, GalleryThemePopup, BackgroundMenuSelectHdl ) );
335 : }
336 :
337 0 : maPopupMenu.RemoveDisabledEntries();
338 :
339 0 : maPopupMenu.SetSelectHdl( LINK( this, GalleryThemePopup, MenuSelectHdl ) );
340 0 : maPopupMenu.Execute( pWindow, aPos );
341 0 : }
342 :
343 0 : IMPL_LINK( GalleryThemePopup, MenuSelectHdl, Menu*, pMenu )
344 : {
345 0 : if( !pMenu )
346 0 : return 0;
347 :
348 0 : sal_uInt16 nId( pMenu->GetCurItemId() );
349 0 : switch ( nId )
350 : {
351 : case( MN_ADD ):
352 : {
353 0 : const CommandInfoMap::const_iterator it = m_aCommandInfo.find( SID_GALLERY_FORMATS );
354 0 : if ( it != m_aCommandInfo.end() )
355 : mpBrowser->Dispatch( nId,
356 0 : it->second.Dispatch,
357 0 : it->second.URL );
358 : }
359 0 : break;
360 :
361 : default:
362 0 : mpBrowser->Execute( nId );
363 : }
364 :
365 0 : return 0;
366 : }
367 :
368 0 : IMPL_LINK( GalleryThemePopup, BackgroundMenuSelectHdl, Menu*, pMenu )
369 : {
370 0 : if( !pMenu )
371 0 : return 0;
372 :
373 0 : sal_uInt16 nPos( pMenu->GetCurItemId() - 1 );
374 0 : OUString aURL( mpBrowser->GetURL().GetMainURL( INetURLObject::NO_DECODE ) );
375 0 : OUString aFilterName( mpBrowser->GetFilterName() );
376 :
377 0 : css::uno::Sequence< css::beans::PropertyValue > aArgs( 6 );
378 0 : aArgs[0].Name = "Background.Transparent";
379 0 : aArgs[0].Value <<= sal_Int32( 0 ); // 0 - 100
380 0 : aArgs[1].Name = "Background.BackColor";
381 0 : aArgs[1].Value <<= sal_Int32( - 1 );
382 0 : aArgs[2].Name = "Background.URL";
383 0 : aArgs[2].Value <<= aURL;
384 0 : aArgs[3].Name = "Background.Filtername"; // FIXME should be FilterName
385 0 : aArgs[3].Value <<= aFilterName;
386 0 : aArgs[4].Name = "Background.Position";
387 0 : aArgs[4].Value <<= css::style::GraphicLocation_TILED;
388 0 : aArgs[5].Name = "Position";
389 0 : aArgs[5].Value <<= nPos;
390 :
391 0 : const CommandInfoMap::const_iterator it = m_aCommandInfo.find( SID_GALLERY_BG_BRUSH );
392 0 : if ( it != m_aCommandInfo.end() )
393 0 : Execute( it->second, aArgs );
394 :
395 0 : return 0;
396 : }
397 :
398 : } // end anonymous namespace
399 :
400 :
401 0 : GalleryToolBox::GalleryToolBox( GalleryBrowser2* pParent ) :
402 0 : ToolBox( pParent, WB_TABSTOP )
403 : {
404 0 : }
405 :
406 0 : void GalleryToolBox::KeyInput( const KeyEvent& rKEvt )
407 : {
408 0 : if( !static_cast< GalleryBrowser2* >( GetParent() )->KeyInput( rKEvt, this ) )
409 0 : ToolBox::KeyInput( rKEvt );
410 0 : }
411 :
412 :
413 0 : GalleryBrowser2::GalleryBrowser2( vcl::Window* pParent, Gallery* pGallery ) :
414 : Control ( pParent, WB_TABSTOP ),
415 : mpGallery ( pGallery ),
416 : mpCurTheme ( NULL ),
417 : mpIconView ( VclPtr<GalleryIconView>::Create( this, nullptr ) ),
418 : mpListView ( VclPtr<GalleryListView>::Create( this, nullptr ) ),
419 : mpPreview ( VclPtr<GalleryPreview>::Create(this) ),
420 : maViewBox ( VclPtr<GalleryToolBox>::Create(this) ),
421 : maSeparator ( VclPtr<FixedLine>::Create(this, WB_VERT) ),
422 : maInfoBar ( VclPtr<FixedText>::Create(this, WB_LEFT | WB_VCENTER) ),
423 : mnCurActionPos ( 0xffffffff ),
424 : meMode ( GALLERYBROWSERMODE_NONE ),
425 0 : meLastMode ( GALLERYBROWSERMODE_NONE )
426 : {
427 :
428 0 : m_xContext.set( ::comphelper::getProcessComponentContext() );
429 :
430 : m_xTransformer.set(
431 0 : m_xContext->getServiceManager()->createInstanceWithContext(
432 0 : OUString( "com.sun.star.util.URLTransformer" ), m_xContext ),
433 0 : css::uno::UNO_QUERY );
434 :
435 0 : Image aDummyImage;
436 0 : const Link<> aSelectHdl( LINK( this, GalleryBrowser2, SelectObjectHdl ) );
437 0 : vcl::Font aInfoFont( maInfoBar->GetControlFont() );
438 :
439 0 : maMiscOptions.AddListenerLink( LINK( this, GalleryBrowser2, MiscHdl ) );
440 :
441 0 : maViewBox->InsertItem( TBX_ID_ICON, aDummyImage );
442 0 : maViewBox->SetItemBits( TBX_ID_ICON, ToolBoxItemBits::RADIOCHECK | ToolBoxItemBits::AUTOCHECK );
443 0 : maViewBox->SetHelpId( TBX_ID_ICON, HID_GALLERY_ICONVIEW );
444 0 : maViewBox->SetQuickHelpText( TBX_ID_ICON, GAL_RESSTR(RID_SVXSTR_GALLERY_ICONVIEW) );
445 :
446 0 : maViewBox->InsertItem( TBX_ID_LIST, aDummyImage );
447 0 : maViewBox->SetItemBits( TBX_ID_LIST, ToolBoxItemBits::RADIOCHECK | ToolBoxItemBits::AUTOCHECK );
448 0 : maViewBox->SetHelpId( TBX_ID_LIST, HID_GALLERY_LISTVIEW );
449 0 : maViewBox->SetQuickHelpText( TBX_ID_LIST, GAL_RESSTR(RID_SVXSTR_GALLERY_LISTVIEW) );
450 :
451 0 : MiscHdl( NULL );
452 0 : maViewBox->SetSelectHdl( LINK( this, GalleryBrowser2, SelectTbxHdl ) );
453 0 : maViewBox->Show();
454 :
455 0 : mpIconView->SetAccessibleName(SVX_RESSTR(RID_SVXSTR_GALLERY_THEMEITEMS));
456 0 : mpListView->SetAccessibleName(SVX_RESSTR(RID_SVXSTR_GALLERY_THEMEITEMS));
457 :
458 0 : maInfoBar->Show();
459 0 : maSeparator->Show();
460 :
461 0 : mpIconView->SetSelectHdl( aSelectHdl );
462 0 : mpListView->SetSelectHdl( aSelectHdl );
463 :
464 0 : InitSettings();
465 :
466 0 : SetMode( ( GALLERYBROWSERMODE_PREVIEW != GalleryBrowser2::meInitMode ) ? GalleryBrowser2::meInitMode : GALLERYBROWSERMODE_ICON );
467 :
468 0 : if(maInfoBar->GetText().isEmpty())
469 0 : mpIconView->SetAccessibleRelationLabeledBy(mpIconView);
470 : else
471 0 : mpIconView->SetAccessibleRelationLabeledBy(maInfoBar.get());
472 0 : mpIconView->SetAccessibleRelationMemberOf(mpIconView);
473 0 : }
474 :
475 0 : GalleryBrowser2::~GalleryBrowser2()
476 : {
477 0 : disposeOnce();
478 0 : }
479 :
480 0 : void GalleryBrowser2::dispose()
481 : {
482 0 : maMiscOptions.RemoveListenerLink( LINK( this, GalleryBrowser2, MiscHdl ) );
483 :
484 0 : mpPreview.disposeAndClear();
485 0 : mpListView.disposeAndClear();
486 0 : mpIconView.disposeAndClear();
487 :
488 0 : if( mpCurTheme )
489 0 : mpGallery->ReleaseTheme( mpCurTheme, *this );
490 0 : maSeparator.disposeAndClear();
491 0 : maInfoBar.disposeAndClear();
492 0 : maViewBox.disposeAndClear();
493 0 : Control::dispose();
494 0 : }
495 :
496 0 : void GalleryBrowser2::InitSettings()
497 : {
498 0 : vcl::Font aInfoFont( maInfoBar->GetControlFont() );
499 :
500 0 : aInfoFont.SetWeight( WEIGHT_BOLD );
501 0 : aInfoFont.SetColor( GALLERY_FG_COLOR );
502 0 : maInfoBar->SetControlFont( aInfoFont );
503 :
504 0 : maInfoBar->SetBackground( Wallpaper( GALLERY_DLG_COLOR ) );
505 0 : maInfoBar->SetControlBackground( GALLERY_DLG_COLOR );
506 :
507 0 : maSeparator->SetBackground( Wallpaper( GALLERY_BG_COLOR ) );
508 0 : maSeparator->SetControlBackground( GALLERY_BG_COLOR );
509 0 : maSeparator->SetControlForeground( GALLERY_FG_COLOR );
510 0 : }
511 :
512 0 : void GalleryBrowser2::DataChanged( const DataChangedEvent& rDCEvt )
513 : {
514 0 : if ( ( rDCEvt.GetType() == DataChangedEventType::SETTINGS ) && ( rDCEvt.GetFlags() & AllSettingsFlags::STYLE ) )
515 0 : InitSettings();
516 : else
517 0 : Control::DataChanged( rDCEvt );
518 0 : }
519 :
520 0 : void GalleryBrowser2::Resize()
521 : {
522 0 : Control::Resize();
523 :
524 0 : mpIconView->Hide();
525 0 : mpListView->Hide();
526 0 : mpPreview->Hide();
527 :
528 0 : const Size aOutSize( GetOutputSizePixel() );
529 0 : const Size aBoxSize( maViewBox->GetOutputSizePixel() );
530 0 : const long nOffset = 2, nSepWidth = 2;
531 0 : const long nInfoBarX = aBoxSize.Width() + ( nOffset * 3 ) + nSepWidth;
532 0 : const Point aPt( 0, aBoxSize.Height() + 3 );
533 0 : const Size aSz( aOutSize.Width(), aOutSize.Height() - aPt.Y() );
534 :
535 0 : maSeparator->SetPosSizePixel( Point( aBoxSize.Width() + nOffset, 0 ), Size( nSepWidth, aBoxSize.Height() ) );
536 0 : maInfoBar->SetPosSizePixel( Point( nInfoBarX, 0 ), Size( aOutSize.Width() - nInfoBarX, aBoxSize.Height() ) );
537 :
538 0 : mpIconView->SetPosSizePixel( aPt, aSz );
539 0 : mpListView->SetPosSizePixel( aPt, aSz );
540 0 : mpPreview->SetPosSizePixel( aPt, aSz );
541 :
542 0 : switch( GetMode() )
543 : {
544 0 : case( GALLERYBROWSERMODE_ICON ): mpIconView->Show(); break;
545 0 : case( GALLERYBROWSERMODE_LIST ): mpListView->Show(); break;
546 0 : case( GALLERYBROWSERMODE_PREVIEW ): mpPreview->Show(); break;
547 :
548 : default:
549 0 : break;
550 : }
551 0 : }
552 :
553 0 : void GalleryBrowser2::Notify( SfxBroadcaster&, const SfxHint& rHint )
554 : {
555 0 : const GalleryHint& rGalleryHint = static_cast<const GalleryHint&>(rHint);
556 :
557 0 : switch( rGalleryHint.GetType() )
558 : {
559 : case( GalleryHintType::THEME_UPDATEVIEW ):
560 : {
561 0 : if( GALLERYBROWSERMODE_PREVIEW == GetMode() )
562 0 : SetMode( meLastMode );
563 :
564 0 : ImplUpdateViews( (sal_uInt16) rGalleryHint.GetData1() + 1 );
565 : }
566 0 : break;
567 :
568 : default:
569 0 : break;
570 : }
571 0 : }
572 :
573 0 : sal_Int8 GalleryBrowser2::AcceptDrop( DropTargetHelper& rTarget, const AcceptDropEvent& )
574 : {
575 0 : sal_Int8 nRet = DND_ACTION_NONE;
576 :
577 0 : if( mpCurTheme && !mpCurTheme->IsReadOnly() )
578 : {
579 0 : if( !mpCurTheme->IsDragging() )
580 : {
581 0 : if( rTarget.IsDropFormatSupported( SotClipboardFormatId::DRAWING ) ||
582 0 : rTarget.IsDropFormatSupported( SotClipboardFormatId::FILE_LIST ) ||
583 0 : rTarget.IsDropFormatSupported( SotClipboardFormatId::SIMPLE_FILE ) ||
584 0 : rTarget.IsDropFormatSupported( SotClipboardFormatId::SVXB ) ||
585 0 : rTarget.IsDropFormatSupported( SotClipboardFormatId::GDIMETAFILE ) ||
586 0 : rTarget.IsDropFormatSupported( SotClipboardFormatId::BITMAP ) )
587 : {
588 0 : nRet = DND_ACTION_COPY;
589 : }
590 : }
591 : else
592 0 : nRet = DND_ACTION_COPY;
593 : }
594 :
595 0 : return nRet;
596 : }
597 :
598 0 : sal_Int8 GalleryBrowser2::ExecuteDrop( DropTargetHelper&, const ExecuteDropEvent& rEvt )
599 : {
600 0 : sal_Int8 nRet = DND_ACTION_NONE;
601 :
602 0 : if( mpCurTheme )
603 : {
604 0 : Point aSelPos;
605 0 : const sal_uIntPtr nItemId = ImplGetSelectedItemId( &rEvt.maPosPixel, aSelPos );
606 0 : const sal_uIntPtr nInsertPos = (nItemId ? (nItemId - 1) : mpCurTheme->GetObjectCount());
607 :
608 0 : if( mpCurTheme->IsDragging() )
609 0 : mpCurTheme->ChangeObjectPos( mpCurTheme->GetDragPos(), nInsertPos );
610 : else
611 0 : nRet = mpCurTheme->InsertTransferable( rEvt.maDropEvent.Transferable, nInsertPos ) ? 1 : 0;
612 : }
613 :
614 0 : return nRet;
615 : }
616 :
617 0 : void GalleryBrowser2::StartDrag( vcl::Window*, const Point* pDragPoint )
618 : {
619 0 : if( mpCurTheme )
620 : {
621 0 : Point aSelPos;
622 0 : const sal_uIntPtr nItemId = ImplGetSelectedItemId( pDragPoint, aSelPos );
623 :
624 0 : if( nItemId )
625 0 : mpCurTheme->StartDrag( this, nItemId - 1 );
626 : }
627 0 : }
628 :
629 0 : void GalleryBrowser2::TogglePreview( vcl::Window*, const Point* )
630 : {
631 0 : SetMode( ( GALLERYBROWSERMODE_PREVIEW != GetMode() ) ? GALLERYBROWSERMODE_PREVIEW : meLastMode );
632 0 : GetViewWindow()->GrabFocus();
633 0 : }
634 :
635 0 : void GalleryBrowser2::ShowContextMenu( vcl::Window*, const Point* pContextPoint )
636 : {
637 0 : Point aSelPos;
638 0 : const sal_uIntPtr nItemId = ImplGetSelectedItemId( pContextPoint, aSelPos );
639 :
640 0 : if( mpCurTheme && nItemId && ( nItemId <= mpCurTheme->GetObjectCount() ) )
641 : {
642 0 : ImplSelectItemId( nItemId );
643 :
644 0 : css::uno::Reference< css::frame::XFrame > xFrame( GetFrame() );
645 0 : if ( xFrame.is() )
646 : {
647 0 : mnCurActionPos = nItemId - 1;
648 : rtl::Reference< GalleryThemePopup > rPopup(
649 : new GalleryThemePopup(
650 : mpCurTheme,
651 : mnCurActionPos,
652 0 : GALLERYBROWSERMODE_PREVIEW == GetMode(),
653 0 : this ) );
654 0 : rPopup->ExecutePopup( this, aSelPos );
655 0 : }
656 : }
657 0 : }
658 :
659 0 : bool GalleryBrowser2::KeyInput( const KeyEvent& rKEvt, vcl::Window* pWindow )
660 : {
661 0 : Point aSelPos;
662 0 : const sal_uIntPtr nItemId = ImplGetSelectedItemId( NULL, aSelPos );
663 0 : bool bRet = false;
664 0 : svx::sidebar::GalleryControl* pParentControl = dynamic_cast<svx::sidebar::GalleryControl*>(GetParent());
665 0 : if (pParentControl != NULL)
666 0 : bRet = pParentControl->GalleryKeyInput(rKEvt, pWindow);
667 :
668 0 : if( !bRet && !maViewBox->HasFocus() && nItemId && mpCurTheme )
669 : {
670 0 : sal_uInt16 nExecuteId = 0;
671 0 : INetURLObject aURL;
672 :
673 0 : mpCurTheme->GetURL( nItemId - 1, aURL );
674 :
675 0 : const bool bValidURL = ( aURL.GetProtocol() != INetProtocol::NotValid );
676 0 : bool bPreview = bValidURL;
677 0 : bool bDelete = false;
678 0 : bool bTitle = false;
679 :
680 0 : if( !mpCurTheme->IsReadOnly() && mpCurTheme->GetObjectCount() )
681 : {
682 0 : bDelete = ( GALLERYBROWSERMODE_PREVIEW != GetMode() );
683 0 : bTitle = true;
684 : }
685 :
686 0 : switch( rKEvt.GetKeyCode().GetCode() )
687 : {
688 : case( KEY_SPACE ):
689 : case( KEY_RETURN ):
690 : case( KEY_P ):
691 : {
692 0 : if( bPreview )
693 : {
694 0 : TogglePreview( pWindow );
695 0 : bRet = true;
696 : }
697 : }
698 0 : break;
699 :
700 : case( KEY_INSERT ):
701 : case( KEY_I ):
702 : {
703 : // Inserting a gallery item in the document must be dispatched
704 0 : if( bValidURL )
705 : {
706 0 : Dispatch( MN_ADD );
707 0 : return true;
708 : }
709 : }
710 0 : break;
711 :
712 : case( KEY_DELETE ):
713 : case( KEY_D ):
714 : {
715 0 : if( bDelete )
716 0 : nExecuteId = MN_DELETE;
717 : }
718 0 : break;
719 :
720 : case( KEY_T ):
721 : {
722 0 : if( bTitle )
723 0 : nExecuteId = MN_TITLE;
724 : }
725 0 : break;
726 :
727 : default:
728 0 : break;
729 : }
730 :
731 0 : if( nExecuteId )
732 : {
733 0 : Execute( nExecuteId );
734 0 : bRet = true;
735 0 : }
736 : }
737 :
738 0 : return bRet;
739 : }
740 :
741 0 : void GalleryBrowser2::SelectTheme( const OUString& rThemeName )
742 : {
743 0 : mpIconView.disposeAndClear();
744 0 : mpListView.disposeAndClear();
745 0 : mpPreview.disposeAndClear();
746 :
747 0 : if( mpCurTheme )
748 0 : mpGallery->ReleaseTheme( mpCurTheme, *this );
749 :
750 0 : mpCurTheme = mpGallery->AcquireTheme( rThemeName, *this );
751 :
752 0 : mpIconView = VclPtr<GalleryIconView>::Create( this, mpCurTheme );
753 0 : mpListView = VclPtr<GalleryListView>::Create( this, mpCurTheme );
754 0 : mpPreview = VclPtr<GalleryPreview>::Create( this, WB_TABSTOP | WB_BORDER, mpCurTheme );
755 :
756 0 : mpIconView->SetAccessibleName(SVX_RESSTR(RID_SVXSTR_GALLERY_THEMEITEMS));
757 0 : mpListView->SetAccessibleName(SVX_RESSTR(RID_SVXSTR_GALLERY_THEMEITEMS));
758 0 : mpPreview->SetAccessibleName(SVX_RESSTR(RID_SVXSTR_GALLERY_PREVIEW));
759 :
760 0 : const Link<> aSelectHdl( LINK( this, GalleryBrowser2, SelectObjectHdl ) );
761 :
762 0 : mpIconView->SetSelectHdl( aSelectHdl );
763 0 : mpListView->SetSelectHdl( aSelectHdl );
764 :
765 0 : if( GALLERYBROWSERMODE_PREVIEW == GetMode() )
766 0 : meMode = meLastMode;
767 :
768 0 : Resize();
769 0 : ImplUpdateViews( 1 );
770 :
771 0 : maViewBox->EnableItem( TBX_ID_ICON, true );
772 0 : maViewBox->EnableItem( TBX_ID_LIST, true );
773 0 : maViewBox->CheckItem( ( GALLERYBROWSERMODE_ICON == GetMode() ) ? TBX_ID_ICON : TBX_ID_LIST, true );
774 :
775 0 : if(maInfoBar->GetText().isEmpty())
776 0 : mpIconView->SetAccessibleRelationLabeledBy(mpIconView);
777 : else
778 0 : mpIconView->SetAccessibleRelationLabeledBy(maInfoBar.get());
779 0 : mpIconView->SetAccessibleRelationMemberOf(mpIconView);
780 0 : }
781 :
782 0 : void GalleryBrowser2::SetMode( GalleryBrowserMode eMode )
783 : {
784 0 : if( GetMode() != eMode )
785 : {
786 0 : meLastMode = GetMode();
787 :
788 0 : switch( eMode )
789 : {
790 : case( GALLERYBROWSERMODE_ICON ):
791 : {
792 0 : mpListView->Hide();
793 :
794 0 : mpPreview->Hide();
795 0 : mpPreview->SetGraphic( Graphic() );
796 0 : GalleryPreview::PreviewMedia( INetURLObject() );
797 :
798 0 : mpIconView->Show();
799 :
800 0 : maViewBox->EnableItem( TBX_ID_ICON, true );
801 0 : maViewBox->EnableItem( TBX_ID_LIST, true );
802 :
803 0 : maViewBox->CheckItem( TBX_ID_ICON, true );
804 0 : maViewBox->CheckItem( TBX_ID_LIST, false );
805 : }
806 0 : break;
807 :
808 : case( GALLERYBROWSERMODE_LIST ):
809 : {
810 0 : mpIconView->Hide();
811 :
812 0 : mpPreview->Hide();
813 0 : mpPreview->SetGraphic( Graphic() );
814 0 : GalleryPreview::PreviewMedia( INetURLObject() );
815 :
816 0 : mpListView->Show();
817 :
818 0 : maViewBox->EnableItem( TBX_ID_ICON, true );
819 0 : maViewBox->EnableItem( TBX_ID_LIST, true );
820 :
821 0 : maViewBox->CheckItem( TBX_ID_ICON, false );
822 0 : maViewBox->CheckItem( TBX_ID_LIST, true );
823 : }
824 0 : break;
825 :
826 : case( GALLERYBROWSERMODE_PREVIEW ):
827 : {
828 0 : Graphic aGraphic;
829 0 : Point aSelPos;
830 0 : const sal_uIntPtr nItemId = ImplGetSelectedItemId( NULL, aSelPos );
831 :
832 0 : if( nItemId )
833 : {
834 0 : const sal_uIntPtr nPos = nItemId - 1;
835 :
836 0 : mpIconView->Hide();
837 0 : mpListView->Hide();
838 :
839 0 : if( mpCurTheme )
840 0 : mpCurTheme->GetGraphic( nPos, aGraphic );
841 :
842 0 : mpPreview->SetGraphic( aGraphic );
843 0 : mpPreview->Show();
844 :
845 0 : if( mpCurTheme && mpCurTheme->GetObjectKind( nPos ) == SGA_OBJ_SOUND )
846 0 : GalleryPreview::PreviewMedia( mpCurTheme->GetObjectURL( nPos ) );
847 :
848 0 : maViewBox->EnableItem( TBX_ID_ICON, false );
849 0 : maViewBox->EnableItem( TBX_ID_LIST, false );
850 0 : }
851 : }
852 0 : break;
853 :
854 : default:
855 0 : break;
856 : }
857 :
858 0 : GalleryBrowser2::meInitMode = meMode = eMode;
859 : }
860 0 : }
861 :
862 0 : vcl::Window* GalleryBrowser2::GetViewWindow() const
863 : {
864 : vcl::Window* pRet;
865 :
866 0 : switch( GetMode() )
867 : {
868 0 : case( GALLERYBROWSERMODE_LIST ): pRet = mpListView; break;
869 0 : case( GALLERYBROWSERMODE_PREVIEW ): pRet = mpPreview; break;
870 :
871 : default:
872 0 : pRet = mpIconView;
873 0 : break;
874 : }
875 :
876 0 : return pRet;
877 : }
878 :
879 0 : void GalleryBrowser2::Travel( GalleryBrowserTravel eTravel )
880 : {
881 0 : if( mpCurTheme )
882 : {
883 0 : Point aSelPos;
884 0 : const sal_uIntPtr nItemId = ImplGetSelectedItemId( NULL, aSelPos );
885 :
886 0 : if( nItemId )
887 : {
888 0 : sal_uIntPtr nNewItemId = nItemId;
889 :
890 0 : switch( eTravel )
891 : {
892 0 : case( GALLERYBROWSERTRAVEL_FIRST ): nNewItemId = 1; break;
893 0 : case( GALLERYBROWSERTRAVEL_LAST ): nNewItemId = mpCurTheme->GetObjectCount(); break;
894 0 : case( GALLERYBROWSERTRAVEL_PREVIOUS ): nNewItemId--; break;
895 0 : case( GALLERYBROWSERTRAVEL_NEXT ): nNewItemId++; break;
896 : default:
897 0 : break;
898 : }
899 :
900 0 : if( nNewItemId < 1 )
901 0 : nNewItemId = 1;
902 0 : else if( nNewItemId > mpCurTheme->GetObjectCount() )
903 0 : nNewItemId = mpCurTheme->GetObjectCount();
904 :
905 0 : if( nNewItemId != nItemId )
906 : {
907 0 : ImplSelectItemId( nNewItemId );
908 0 : ImplUpdateInfoBar();
909 :
910 0 : if( GALLERYBROWSERMODE_PREVIEW == GetMode() )
911 : {
912 0 : Graphic aGraphic;
913 0 : const sal_uIntPtr nPos = nNewItemId - 1;
914 :
915 0 : mpCurTheme->GetGraphic( nPos, aGraphic );
916 0 : mpPreview->SetGraphic( aGraphic );
917 :
918 0 : if( SGA_OBJ_SOUND == mpCurTheme->GetObjectKind( nPos ) )
919 0 : GalleryPreview::PreviewMedia( mpCurTheme->GetObjectURL( nPos ) );
920 :
921 0 : mpPreview->Invalidate();
922 : }
923 : }
924 : }
925 : }
926 0 : }
927 :
928 0 : void GalleryBrowser2::ImplUpdateViews( sal_uInt16 nSelectionId )
929 : {
930 0 : mpIconView->Hide();
931 0 : mpListView->Hide();
932 0 : mpPreview->Hide();
933 :
934 0 : mpIconView->Clear();
935 0 : mpListView->Clear();
936 :
937 0 : if( mpCurTheme )
938 : {
939 0 : for( sal_uIntPtr i = 0, nCount = mpCurTheme->GetObjectCount(); i < nCount; )
940 : {
941 0 : mpListView->RowInserted( i++ );
942 0 : mpIconView->InsertItem( (sal_uInt16) i );
943 : }
944 :
945 0 : ImplSelectItemId( ( ( nSelectionId > mpCurTheme->GetObjectCount() ) ? mpCurTheme->GetObjectCount() : nSelectionId ) );
946 : }
947 :
948 0 : switch( GetMode() )
949 : {
950 0 : case( GALLERYBROWSERMODE_ICON ): mpIconView->Show(); break;
951 0 : case( GALLERYBROWSERMODE_LIST ): mpListView->Show(); break;
952 0 : case( GALLERYBROWSERMODE_PREVIEW ): mpPreview->Show(); break;
953 :
954 : default:
955 0 : break;
956 : }
957 :
958 0 : ImplUpdateInfoBar();
959 0 : }
960 :
961 0 : void GalleryBrowser2::ImplUpdateInfoBar()
962 : {
963 0 : if( mpCurTheme )
964 0 : maInfoBar->SetText( mpCurTheme->GetName() );
965 0 : }
966 :
967 0 : sal_uIntPtr GalleryBrowser2::ImplGetSelectedItemId( const Point* pSelPos, Point& rSelPos )
968 : {
969 0 : const Size aOutputSizePixel( GetOutputSizePixel() );
970 0 : sal_uIntPtr nRet = 0;
971 :
972 0 : if( GALLERYBROWSERMODE_PREVIEW == GetMode() )
973 : {
974 0 : nRet = ( ( GALLERYBROWSERMODE_ICON == meLastMode ) ? mpIconView->GetSelectItemId() : ( mpListView->FirstSelectedRow() + 1 ) );
975 :
976 0 : if( pSelPos )
977 0 : rSelPos = GetPointerPosPixel();
978 : else
979 0 : rSelPos = Point( aOutputSizePixel.Width() >> 1, aOutputSizePixel.Height() >> 1 );
980 : }
981 0 : else if( GALLERYBROWSERMODE_ICON == GetMode() )
982 : {
983 0 : if( pSelPos )
984 : {
985 0 : nRet = mpIconView->GetItemId( *pSelPos );
986 0 : rSelPos = GetPointerPosPixel();
987 : }
988 : else
989 : {
990 0 : nRet = mpIconView->GetSelectItemId();
991 0 : rSelPos = mpIconView->GetItemRect( (sal_uInt16) nRet ).Center();
992 : }
993 : }
994 : else
995 : {
996 0 : if( pSelPos )
997 : {
998 0 : nRet = mpListView->GetRowAtYPosPixel( pSelPos->Y() ) + 1;
999 0 : rSelPos = GetPointerPosPixel();
1000 : }
1001 : else
1002 : {
1003 0 : nRet = mpListView->FirstSelectedRow() + 1;
1004 0 : rSelPos = mpListView->GetFieldRectPixel( (sal_uInt16) nRet, 1 ).Center();
1005 : }
1006 : }
1007 :
1008 0 : rSelPos.X() = std::max( std::min( rSelPos.X(), aOutputSizePixel.Width() - 1L ), 0L );
1009 0 : rSelPos.Y() = std::max( std::min( rSelPos.Y(), aOutputSizePixel.Height() - 1L ), 0L );
1010 :
1011 0 : if( nRet && ( !mpCurTheme || ( nRet > mpCurTheme->GetObjectCount() ) ) )
1012 : {
1013 0 : nRet = 0;
1014 : }
1015 :
1016 0 : return nRet;
1017 : }
1018 :
1019 0 : void GalleryBrowser2::ImplSelectItemId( sal_uIntPtr nItemId )
1020 : {
1021 0 : if( nItemId )
1022 : {
1023 :
1024 0 : mpIconView->SelectItem( (sal_uInt16) nItemId );
1025 0 : mpListView->SelectRow( nItemId - 1 );
1026 : }
1027 0 : }
1028 :
1029 : css::uno::Reference< css::frame::XFrame >
1030 0 : GalleryBrowser2::GetFrame()
1031 : {
1032 0 : css::uno::Reference< css::frame::XFrame > xFrame;
1033 0 : SfxViewFrame* pCurrentViewFrame = SfxViewFrame::Current();
1034 0 : if ( pCurrentViewFrame )
1035 : {
1036 0 : SfxBindings& rBindings = pCurrentViewFrame->GetBindings();
1037 0 : xFrame.set( rBindings.GetActiveFrame() );
1038 : }
1039 :
1040 0 : return xFrame;
1041 : }
1042 :
1043 0 : void GalleryBrowser2::Dispatch(
1044 : sal_uInt16 nId,
1045 : const css::uno::Reference< css::frame::XDispatch > &rxDispatch,
1046 : const css::util::URL &rURL )
1047 : {
1048 0 : Point aSelPos;
1049 0 : const sal_uIntPtr nItemId = ImplGetSelectedItemId( NULL, aSelPos );
1050 :
1051 0 : if( !mpCurTheme || !nItemId )
1052 0 : return;
1053 :
1054 0 : mnCurActionPos = nItemId - 1;
1055 :
1056 0 : switch( nId )
1057 : {
1058 : case( MN_ADD ):
1059 : {
1060 0 : css::uno::Reference< css::frame::XDispatch > xDispatch( rxDispatch );
1061 0 : css::util::URL aURL = rURL;
1062 :
1063 0 : if ( !xDispatch.is() )
1064 : {
1065 : css::uno::Reference< css::frame::XDispatchProvider > xDispatchProvider(
1066 0 : GetFrame(), css::uno::UNO_QUERY );
1067 0 : if ( !xDispatchProvider.is() || !m_xTransformer.is() )
1068 0 : return;
1069 :
1070 0 : aURL.Complete = CMD_SID_GALLERY_FORMATS;
1071 0 : m_xTransformer->parseStrict( aURL );
1072 0 : xDispatch = xDispatchProvider->queryDispatch(
1073 : aURL,
1074 : OUString( "_self" ),
1075 0 : css::frame::FrameSearchFlag::SELF );
1076 : }
1077 :
1078 0 : if ( !xDispatch.is() )
1079 0 : return;
1080 :
1081 0 : sal_Int8 nType = 0;
1082 0 : OUString aFileURL, aFilterName;
1083 0 : css::uno::Reference< css::lang::XComponent > xDrawing;
1084 0 : css::uno::Reference< css::graphic::XGraphic > xGraphic;
1085 :
1086 0 : aFilterName = GetFilterName();
1087 :
1088 0 : switch( mpCurTheme->GetObjectKind( mnCurActionPos ) )
1089 : {
1090 : case( SGA_OBJ_BMP ):
1091 : case( SGA_OBJ_ANIM ):
1092 : case( SGA_OBJ_INET ):
1093 : // TODO drawing objects are inserted as drawings only via drag&drop
1094 : case( SGA_OBJ_SVDRAW ):
1095 0 : nType = css::gallery::GalleryItemType::GRAPHIC;
1096 0 : break;
1097 :
1098 : case ( SGA_OBJ_SOUND ) :
1099 0 : nType = css::gallery::GalleryItemType::MEDIA;
1100 0 : break;
1101 :
1102 : default:
1103 0 : nType = css::gallery::GalleryItemType::EMPTY;
1104 0 : break;
1105 : }
1106 :
1107 0 : Graphic aGraphic;
1108 0 : bool bGraphic = mpCurTheme->GetGraphic( mnCurActionPos, aGraphic );
1109 0 : if ( bGraphic && !!aGraphic )
1110 0 : xGraphic.set( aGraphic.GetXGraphic() );
1111 : OSL_ENSURE( xGraphic.is(), "gallery item is graphic, but the reference is invalid!" );
1112 :
1113 0 : css::uno::Sequence< css::beans::PropertyValue > aSeq( SVXGALLERYITEM_PARAMS );
1114 :
1115 0 : aSeq[0].Name = SVXGALLERYITEM_TYPE;
1116 0 : aSeq[0].Value <<= nType;
1117 0 : aSeq[1].Name = SVXGALLERYITEM_URL;
1118 0 : aSeq[1].Value <<= aFileURL;
1119 0 : aSeq[2].Name = SVXGALLERYITEM_FILTER;
1120 0 : aSeq[2].Value <<= aFilterName;
1121 0 : aSeq[3].Name = SVXGALLERYITEM_DRAWING;
1122 0 : aSeq[3].Value <<= xDrawing;
1123 0 : aSeq[4].Name = SVXGALLERYITEM_GRAPHIC;
1124 0 : aSeq[4].Value <<= xGraphic;
1125 :
1126 0 : css::uno::Sequence< css::beans::PropertyValue > aArgs( 1 );
1127 0 : aArgs[0].Name = SVXGALLERYITEM_ARGNAME;
1128 0 : aArgs[0].Value <<= aSeq;
1129 :
1130 0 : DispatchInfo *pInfo = new DispatchInfo;
1131 0 : pInfo->TargetURL = aURL;
1132 0 : pInfo->Arguments = aArgs;
1133 0 : pInfo->Dispatch = xDispatch;
1134 :
1135 0 : if ( !Application::PostUserEvent(
1136 0 : LINK( 0, GalleryBrowser2, AsyncDispatch_Impl), pInfo ) )
1137 0 : delete pInfo;
1138 : }
1139 0 : break;
1140 :
1141 : default:
1142 0 : break;
1143 : }
1144 : }
1145 :
1146 0 : void GalleryBrowser2::Execute( sal_uInt16 nId )
1147 : {
1148 0 : Point aSelPos;
1149 0 : const sal_uIntPtr nItemId = ImplGetSelectedItemId( NULL, aSelPos );
1150 :
1151 0 : if( mpCurTheme && nItemId )
1152 : {
1153 0 : mnCurActionPos = nItemId - 1;
1154 :
1155 0 : switch( nId )
1156 : {
1157 : case( MN_PREVIEW ):
1158 0 : SetMode( ( GALLERYBROWSERMODE_PREVIEW != GetMode() ) ? GALLERYBROWSERMODE_PREVIEW : meLastMode );
1159 0 : break;
1160 :
1161 : case( MN_DELETE ):
1162 : {
1163 0 : if( !mpCurTheme->IsReadOnly() &&
1164 0 : ScopedVclPtrInstance<MessageDialog>::Create(nullptr, "QueryDeleteObjectDialog","svx/ui/querydeleteobjectdialog.ui")->Execute() == RET_YES )
1165 : {
1166 0 : mpCurTheme->RemoveObject( mnCurActionPos );
1167 : }
1168 : }
1169 0 : break;
1170 :
1171 : case( MN_TITLE ):
1172 : {
1173 0 : SgaObject* pObj = mpCurTheme->AcquireObject( mnCurActionPos );
1174 :
1175 0 : if( pObj )
1176 : {
1177 0 : const OUString aOldTitle( GetItemText( *mpCurTheme, *pObj, GALLERY_ITEM_TITLE ) );
1178 :
1179 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
1180 0 : if(pFact)
1181 : {
1182 0 : boost::scoped_ptr<AbstractTitleDialog> aDlg(pFact->CreateTitleDialog( this, aOldTitle ));
1183 : DBG_ASSERT(aDlg, "Dialog creation failed!");
1184 0 : if( aDlg->Execute() == RET_OK )
1185 : {
1186 0 : OUString aNewTitle( aDlg->GetTitle() );
1187 :
1188 0 : if( ( aNewTitle.isEmpty() && !pObj->GetTitle().isEmpty() ) || ( aNewTitle != aOldTitle ) )
1189 : {
1190 0 : if( aNewTitle.isEmpty() )
1191 0 : aNewTitle = "__<empty>__";
1192 :
1193 0 : pObj->SetTitle( aNewTitle );
1194 0 : mpCurTheme->InsertObject( *pObj );
1195 0 : }
1196 : }
1197 :
1198 0 : GalleryTheme::ReleaseObject( pObj );
1199 0 : }
1200 : }
1201 : }
1202 0 : break;
1203 :
1204 : case( MN_COPYCLIPBOARD ):
1205 : {
1206 : vcl::Window* pWindow;
1207 :
1208 0 : switch( GetMode() )
1209 : {
1210 0 : case( GALLERYBROWSERMODE_ICON ): pWindow = static_cast<vcl::Window*>(mpIconView); break;
1211 0 : case( GALLERYBROWSERMODE_LIST ): pWindow = static_cast<vcl::Window*>(mpListView); break;
1212 0 : case( GALLERYBROWSERMODE_PREVIEW ): pWindow = static_cast<vcl::Window*>(mpPreview); break;
1213 :
1214 : default:
1215 0 : pWindow = NULL;
1216 0 : break;
1217 : }
1218 :
1219 0 : mpCurTheme->CopyToClipboard( pWindow, mnCurActionPos );
1220 : }
1221 0 : break;
1222 :
1223 : case( MN_PASTECLIPBOARD ):
1224 : {
1225 0 : if( !mpCurTheme->IsReadOnly() )
1226 : {
1227 0 : TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( this ) );
1228 0 : mpCurTheme->InsertTransferable( aDataHelper.GetTransferable(), mnCurActionPos );
1229 : }
1230 : }
1231 0 : break;
1232 :
1233 : default:
1234 0 : break;
1235 : }
1236 : }
1237 0 : }
1238 :
1239 0 : OUString GalleryBrowser2::GetItemText( const GalleryTheme& rTheme, const SgaObject& rObj, sal_uIntPtr nItemTextFlags )
1240 : {
1241 0 : OUString aRet;
1242 :
1243 0 : INetURLObject aURL(rObj.GetURL());
1244 :
1245 0 : if( nItemTextFlags & GALLERY_ITEM_THEMENAME )
1246 : {
1247 0 : aRet += rTheme.GetName();
1248 0 : aRet += " - ";
1249 : }
1250 :
1251 0 : if( nItemTextFlags & GALLERY_ITEM_TITLE )
1252 : {
1253 0 : OUString aTitle( rObj.GetTitle() );
1254 :
1255 0 : if( aTitle.isEmpty() )
1256 0 : aTitle = aURL.getBase( INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_UNAMBIGUOUS );
1257 :
1258 0 : if( aTitle.isEmpty() )
1259 : {
1260 0 : aTitle = aURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS );
1261 0 : aTitle = aTitle.getToken( comphelper::string::getTokenCount(aTitle, '/') - 1, '/' );
1262 : }
1263 :
1264 0 : aRet += aTitle;
1265 : }
1266 :
1267 0 : if( nItemTextFlags & GALLERY_ITEM_PATH )
1268 : {
1269 0 : const OUString aPath( aURL.getFSysPath( INetURLObject::FSYS_DETECT ) );
1270 :
1271 0 : if( !aPath.isEmpty() && ( nItemTextFlags & GALLERY_ITEM_TITLE ) )
1272 0 : aRet += " (";
1273 :
1274 0 : aRet += aURL.getFSysPath( INetURLObject::FSYS_DETECT );
1275 :
1276 0 : if( !aPath.isEmpty() && ( nItemTextFlags & GALLERY_ITEM_TITLE ) )
1277 0 : aRet += ")";
1278 : }
1279 :
1280 0 : return aRet;
1281 : }
1282 :
1283 0 : INetURLObject GalleryBrowser2::GetURL() const
1284 : {
1285 0 : INetURLObject aURL;
1286 :
1287 0 : if( mpCurTheme && mnCurActionPos != 0xffffffff )
1288 0 : aURL = mpCurTheme->GetObjectURL( mnCurActionPos );
1289 :
1290 0 : return aURL;
1291 : }
1292 :
1293 0 : OUString GalleryBrowser2::GetFilterName() const
1294 : {
1295 0 : OUString aFilterName;
1296 :
1297 0 : if( mpCurTheme && mnCurActionPos != 0xffffffff )
1298 : {
1299 0 : const SgaObjKind eObjKind = mpCurTheme->GetObjectKind( mnCurActionPos );
1300 :
1301 0 : if( ( SGA_OBJ_BMP == eObjKind ) || ( SGA_OBJ_ANIM == eObjKind ) )
1302 : {
1303 0 : GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
1304 0 : INetURLObject aURL;
1305 0 : mpCurTheme->GetURL( mnCurActionPos, aURL );
1306 0 : sal_uInt16 nFilter = rFilter.GetImportFormatNumberForShortName( aURL.GetExtension() );
1307 :
1308 0 : if( GRFILTER_FORMAT_DONTKNOW != nFilter )
1309 0 : aFilterName = rFilter.GetImportFormatName( nFilter );
1310 : }
1311 : }
1312 :
1313 0 : return aFilterName;
1314 : }
1315 :
1316 0 : Graphic GalleryBrowser2::GetGraphic() const
1317 : {
1318 0 : Graphic aGraphic;
1319 :
1320 0 : if( mpCurTheme && mnCurActionPos != 0xffffffff )
1321 0 : mpCurTheme->GetGraphic( mnCurActionPos, aGraphic );
1322 :
1323 0 : return aGraphic;
1324 : }
1325 :
1326 0 : IMPL_LINK_NOARG(GalleryBrowser2, SelectObjectHdl)
1327 : {
1328 0 : ImplUpdateInfoBar();
1329 0 : return 0L;
1330 : }
1331 :
1332 0 : IMPL_LINK_TYPED( GalleryBrowser2, SelectTbxHdl, ToolBox*, pBox, void )
1333 : {
1334 0 : if( pBox->GetCurItemId() == TBX_ID_ICON )
1335 0 : SetMode( GALLERYBROWSERMODE_ICON );
1336 0 : else if( pBox->GetCurItemId() == TBX_ID_LIST )
1337 0 : SetMode( GALLERYBROWSERMODE_LIST );
1338 0 : }
1339 :
1340 0 : IMPL_LINK_NOARG(GalleryBrowser2, MiscHdl)
1341 : {
1342 0 : maViewBox->SetOutStyle( maMiscOptions.GetToolboxStyle() );
1343 :
1344 0 : BitmapEx aIconBmpEx = BitmapEx( Image( GAL_RES( RID_SVXIMG_GALLERY_VIEW_ICON ) ).GetBitmapEx() );
1345 0 : BitmapEx aListBmpEx = BitmapEx( Image( GAL_RES( RID_SVXIMG_GALLERY_VIEW_LIST ) ).GetBitmapEx() );
1346 :
1347 0 : if( maMiscOptions.AreCurrentSymbolsLarge() )
1348 : {
1349 0 : const Size aLargeSize( 24, 24);
1350 :
1351 0 : aIconBmpEx.Scale( aLargeSize );
1352 0 : aListBmpEx.Scale( aLargeSize );
1353 : }
1354 :
1355 0 : maViewBox->SetItemImage(TBX_ID_ICON, Image(aIconBmpEx));
1356 0 : maViewBox->SetItemImage(TBX_ID_LIST, Image(aListBmpEx));
1357 0 : maViewBox->SetSizePixel( maViewBox->CalcWindowSizePixel() );
1358 :
1359 0 : Resize();
1360 :
1361 0 : return 0L;
1362 435 : }
1363 :
1364 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|