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_NOINSTANCE( 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 : 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 : GalleryBrowser2* mpBrowser;
117 :
118 : typedef std::map< int, CommandInfo > CommandInfoMap;
119 : CommandInfoMap m_aCommandInfo;
120 :
121 : 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 : STATIC_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() != INET_PROT_NOT_VALID );
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( SOT_FORMATSTR_ID_DRAWING ) ||
278 : aDataHelper.HasFormat( SOT_FORMAT_FILE_LIST ) ||
279 : aDataHelper.HasFormat( FORMAT_FILE ) ||
280 : aDataHelper.HasFormat( SOT_FORMATSTR_ID_SVXB ) ||
281 : aDataHelper.HasFormat( FORMAT_GDIMETAFILE ) ||
282 : aDataHelper.HasFormat( FORMAT_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 : mpBrowser->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 : GalleryToolBox::~GalleryToolBox()
407 : {
408 0 : }
409 :
410 0 : void GalleryToolBox::KeyInput( const KeyEvent& rKEvt )
411 : {
412 0 : if( !static_cast< GalleryBrowser2* >( GetParent() )->KeyInput( rKEvt, this ) )
413 0 : ToolBox::KeyInput( rKEvt );
414 0 : }
415 :
416 :
417 0 : GalleryBrowser2::GalleryBrowser2( vcl::Window* pParent, const ResId& rResId, Gallery* pGallery ) :
418 : Control ( pParent, rResId ),
419 : mpGallery ( pGallery ),
420 : mpCurTheme ( NULL ),
421 0 : mpIconView ( new GalleryIconView( this, NULL ) ),
422 0 : mpListView ( new GalleryListView( this, NULL ) ),
423 0 : mpPreview ( new GalleryPreview(this) ),
424 : maViewBox ( this ),
425 : maSeparator ( this, WB_VERT ),
426 : maInfoBar ( this, WB_LEFT | WB_VCENTER ),
427 : mnCurActionPos ( 0xffffffff ),
428 : meMode ( GALLERYBROWSERMODE_NONE ),
429 0 : meLastMode ( GALLERYBROWSERMODE_NONE )
430 : {
431 :
432 0 : m_xContext.set( ::comphelper::getProcessComponentContext() );
433 :
434 : m_xTransformer.set(
435 0 : m_xContext->getServiceManager()->createInstanceWithContext(
436 0 : OUString( "com.sun.star.util.URLTransformer" ), m_xContext ),
437 0 : css::uno::UNO_QUERY );
438 :
439 0 : Image aDummyImage;
440 0 : const Link aSelectHdl( LINK( this, GalleryBrowser2, SelectObjectHdl ) );
441 0 : vcl::Font aInfoFont( maInfoBar.GetControlFont() );
442 :
443 0 : maMiscOptions.AddListenerLink( LINK( this, GalleryBrowser2, MiscHdl ) );
444 :
445 0 : maViewBox.InsertItem( TBX_ID_ICON, aDummyImage );
446 0 : maViewBox.SetItemBits( TBX_ID_ICON, ToolBoxItemBits::RADIOCHECK | ToolBoxItemBits::AUTOCHECK );
447 0 : maViewBox.SetHelpId( TBX_ID_ICON, HID_GALLERY_ICONVIEW );
448 0 : maViewBox.SetQuickHelpText( TBX_ID_ICON, GAL_RESSTR(RID_SVXSTR_GALLERY_ICONVIEW) );
449 :
450 0 : maViewBox.InsertItem( TBX_ID_LIST, aDummyImage );
451 0 : maViewBox.SetItemBits( TBX_ID_LIST, ToolBoxItemBits::RADIOCHECK | ToolBoxItemBits::AUTOCHECK );
452 0 : maViewBox.SetHelpId( TBX_ID_LIST, HID_GALLERY_LISTVIEW );
453 0 : maViewBox.SetQuickHelpText( TBX_ID_LIST, GAL_RESSTR(RID_SVXSTR_GALLERY_LISTVIEW) );
454 :
455 0 : MiscHdl( NULL );
456 0 : maViewBox.SetSelectHdl( LINK( this, GalleryBrowser2, SelectTbxHdl ) );
457 0 : maViewBox.Show();
458 :
459 0 : mpIconView->SetAccessibleName(SVX_RESSTR(RID_SVXSTR_GALLERY_THEMEITEMS));
460 0 : mpListView->SetAccessibleName(SVX_RESSTR(RID_SVXSTR_GALLERY_THEMEITEMS));
461 :
462 0 : maInfoBar.Show();
463 0 : maSeparator.Show();
464 :
465 0 : mpIconView->SetSelectHdl( aSelectHdl );
466 0 : mpListView->SetSelectHdl( aSelectHdl );
467 :
468 0 : InitSettings();
469 :
470 0 : SetMode( ( GALLERYBROWSERMODE_PREVIEW != GalleryBrowser2::meInitMode ) ? GalleryBrowser2::meInitMode : GALLERYBROWSERMODE_ICON );
471 :
472 0 : if(maInfoBar.GetText().isEmpty())
473 0 : mpIconView->SetAccessibleRelationLabeledBy(mpIconView);
474 : else
475 0 : mpIconView->SetAccessibleRelationLabeledBy(&maInfoBar);
476 0 : mpIconView->SetAccessibleRelationMemberOf(mpIconView);
477 0 : }
478 :
479 0 : GalleryBrowser2::~GalleryBrowser2()
480 : {
481 0 : maMiscOptions.RemoveListenerLink( LINK( this, GalleryBrowser2, MiscHdl ) );
482 :
483 0 : delete mpPreview;
484 0 : delete mpListView;
485 0 : delete mpIconView;
486 :
487 0 : if( mpCurTheme )
488 0 : mpGallery->ReleaseTheme( mpCurTheme, *this );
489 :
490 0 : }
491 :
492 0 : void GalleryBrowser2::InitSettings()
493 : {
494 0 : vcl::Font aInfoFont( maInfoBar.GetControlFont() );
495 :
496 0 : aInfoFont.SetWeight( WEIGHT_BOLD );
497 0 : aInfoFont.SetColor( GALLERY_FG_COLOR );
498 0 : maInfoBar.SetControlFont( aInfoFont );
499 :
500 0 : maInfoBar.SetBackground( Wallpaper( GALLERY_DLG_COLOR ) );
501 0 : maInfoBar.SetControlBackground( GALLERY_DLG_COLOR );
502 :
503 0 : maSeparator.SetBackground( Wallpaper( GALLERY_BG_COLOR ) );
504 0 : maSeparator.SetControlBackground( GALLERY_BG_COLOR );
505 0 : maSeparator.SetControlForeground( GALLERY_FG_COLOR );
506 0 : }
507 :
508 0 : void GalleryBrowser2::DataChanged( const DataChangedEvent& rDCEvt )
509 : {
510 0 : if ( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
511 0 : InitSettings();
512 : else
513 0 : Control::DataChanged( rDCEvt );
514 0 : }
515 :
516 0 : void GalleryBrowser2::Resize()
517 : {
518 0 : Control::Resize();
519 :
520 0 : mpIconView->Hide();
521 0 : mpListView->Hide();
522 0 : mpPreview->Hide();
523 :
524 0 : const Size aOutSize( GetOutputSizePixel() );
525 0 : const Size aBoxSize( maViewBox.GetOutputSizePixel() );
526 0 : const long nOffset = 2, nSepWidth = 2;
527 0 : const long nInfoBarX = aBoxSize.Width() + ( nOffset * 3 ) + nSepWidth;
528 0 : const Point aPt( 0, aBoxSize.Height() + 3 );
529 0 : const Size aSz( aOutSize.Width(), aOutSize.Height() - aPt.Y() );
530 :
531 0 : maSeparator.SetPosSizePixel( Point( aBoxSize.Width() + nOffset, 0 ), Size( nSepWidth, aBoxSize.Height() ) );
532 0 : maInfoBar.SetPosSizePixel( Point( nInfoBarX, 0 ), Size( aOutSize.Width() - nInfoBarX, aBoxSize.Height() ) );
533 :
534 0 : mpIconView->SetPosSizePixel( aPt, aSz );
535 0 : mpListView->SetPosSizePixel( aPt, aSz );
536 0 : mpPreview->SetPosSizePixel( aPt, aSz );
537 :
538 0 : switch( GetMode() )
539 : {
540 0 : case( GALLERYBROWSERMODE_ICON ): mpIconView->Show(); break;
541 0 : case( GALLERYBROWSERMODE_LIST ): mpListView->Show(); break;
542 0 : case( GALLERYBROWSERMODE_PREVIEW ): mpPreview->Show(); break;
543 :
544 : default:
545 0 : break;
546 : }
547 0 : }
548 :
549 0 : void GalleryBrowser2::Notify( SfxBroadcaster&, const SfxHint& rHint )
550 : {
551 0 : const GalleryHint& rGalleryHint = static_cast<const GalleryHint&>(rHint);
552 :
553 0 : switch( rGalleryHint.GetType() )
554 : {
555 : case( GALLERY_HINT_THEME_UPDATEVIEW ):
556 : {
557 0 : if( GALLERYBROWSERMODE_PREVIEW == GetMode() )
558 0 : SetMode( meLastMode );
559 :
560 0 : ImplUpdateViews( (sal_uInt16) rGalleryHint.GetData1() + 1 );
561 : }
562 0 : break;
563 :
564 : default:
565 0 : break;
566 : }
567 0 : }
568 :
569 0 : sal_Int8 GalleryBrowser2::AcceptDrop( DropTargetHelper& rTarget, const AcceptDropEvent& )
570 : {
571 0 : sal_Int8 nRet = DND_ACTION_NONE;
572 :
573 0 : if( mpCurTheme && !mpCurTheme->IsReadOnly() )
574 : {
575 0 : if( !mpCurTheme->IsDragging() )
576 : {
577 0 : if( rTarget.IsDropFormatSupported( SOT_FORMATSTR_ID_DRAWING ) ||
578 0 : rTarget.IsDropFormatSupported( SOT_FORMAT_FILE_LIST ) ||
579 0 : rTarget.IsDropFormatSupported( FORMAT_FILE ) ||
580 0 : rTarget.IsDropFormatSupported( SOT_FORMATSTR_ID_SVXB ) ||
581 0 : rTarget.IsDropFormatSupported( FORMAT_GDIMETAFILE ) ||
582 0 : rTarget.IsDropFormatSupported( FORMAT_BITMAP ) )
583 : {
584 0 : nRet = DND_ACTION_COPY;
585 : }
586 : }
587 : else
588 0 : nRet = DND_ACTION_COPY;
589 : }
590 :
591 0 : return nRet;
592 : }
593 :
594 0 : sal_Int8 GalleryBrowser2::ExecuteDrop( DropTargetHelper&, const ExecuteDropEvent& rEvt )
595 : {
596 0 : sal_Int8 nRet = DND_ACTION_NONE;
597 :
598 0 : if( mpCurTheme )
599 : {
600 0 : Point aSelPos;
601 0 : const sal_uIntPtr nItemId = ImplGetSelectedItemId( &rEvt.maPosPixel, aSelPos );
602 0 : const sal_uIntPtr nInsertPos = (nItemId ? (nItemId - 1) : mpCurTheme->GetObjectCount());
603 :
604 0 : if( mpCurTheme->IsDragging() )
605 0 : mpCurTheme->ChangeObjectPos( mpCurTheme->GetDragPos(), nInsertPos );
606 : else
607 0 : nRet = mpCurTheme->InsertTransferable( rEvt.maDropEvent.Transferable, nInsertPos ) ? 1 : 0;
608 : }
609 :
610 0 : return nRet;
611 : }
612 :
613 0 : void GalleryBrowser2::StartDrag( vcl::Window*, const Point* pDragPoint )
614 : {
615 0 : if( mpCurTheme )
616 : {
617 0 : Point aSelPos;
618 0 : const sal_uIntPtr nItemId = ImplGetSelectedItemId( pDragPoint, aSelPos );
619 :
620 0 : if( nItemId )
621 0 : mpCurTheme->StartDrag( this, nItemId - 1 );
622 : }
623 0 : }
624 :
625 0 : void GalleryBrowser2::TogglePreview( vcl::Window*, const Point* )
626 : {
627 0 : SetMode( ( GALLERYBROWSERMODE_PREVIEW != GetMode() ) ? GALLERYBROWSERMODE_PREVIEW : meLastMode );
628 0 : GetViewWindow()->GrabFocus();
629 0 : }
630 :
631 0 : void GalleryBrowser2::ShowContextMenu( vcl::Window*, const Point* pContextPoint )
632 : {
633 0 : Point aSelPos;
634 0 : const sal_uIntPtr nItemId = ImplGetSelectedItemId( pContextPoint, aSelPos );
635 :
636 0 : if( mpCurTheme && nItemId && ( nItemId <= mpCurTheme->GetObjectCount() ) )
637 : {
638 0 : ImplSelectItemId( nItemId );
639 :
640 0 : css::uno::Reference< css::frame::XFrame > xFrame( GetFrame() );
641 0 : if ( xFrame.is() )
642 : {
643 0 : mnCurActionPos = nItemId - 1;
644 : rtl::Reference< GalleryThemePopup > rPopup(
645 : new GalleryThemePopup(
646 : mpCurTheme,
647 : mnCurActionPos,
648 0 : GALLERYBROWSERMODE_PREVIEW == GetMode(),
649 0 : this ) );
650 0 : rPopup->ExecutePopup( this, aSelPos );
651 0 : }
652 : }
653 0 : }
654 :
655 0 : bool GalleryBrowser2::KeyInput( const KeyEvent& rKEvt, vcl::Window* pWindow )
656 : {
657 0 : Point aSelPos;
658 0 : const sal_uIntPtr nItemId = ImplGetSelectedItemId( NULL, aSelPos );
659 0 : bool bRet = false;
660 0 : svx::sidebar::GalleryControl* pParentControl = dynamic_cast<svx::sidebar::GalleryControl*>(GetParent());
661 0 : if (pParentControl != NULL)
662 0 : bRet = pParentControl->GalleryKeyInput(rKEvt, pWindow);
663 :
664 0 : if( !bRet && !maViewBox.HasFocus() && nItemId && mpCurTheme )
665 : {
666 0 : sal_uInt16 nExecuteId = 0;
667 0 : INetURLObject aURL;
668 :
669 0 : const_cast< GalleryTheme* >( mpCurTheme )->GetURL( nItemId - 1, aURL );
670 :
671 0 : const bool bValidURL = ( aURL.GetProtocol() != INET_PROT_NOT_VALID );
672 0 : bool bPreview = bValidURL;
673 0 : bool bDelete = false;
674 0 : bool bTitle = false;
675 :
676 0 : if( !mpCurTheme->IsReadOnly() && mpCurTheme->GetObjectCount() )
677 : {
678 0 : bDelete = ( GALLERYBROWSERMODE_PREVIEW != GetMode() );
679 0 : bTitle = true;
680 : }
681 :
682 0 : switch( rKEvt.GetKeyCode().GetCode() )
683 : {
684 : case( KEY_SPACE ):
685 : case( KEY_RETURN ):
686 : case( KEY_P ):
687 : {
688 0 : if( bPreview )
689 : {
690 0 : TogglePreview( pWindow );
691 0 : bRet = true;
692 : }
693 : }
694 0 : break;
695 :
696 : case( KEY_INSERT ):
697 : case( KEY_I ):
698 : {
699 : // Inserting a gallery item in the document must be dispatched
700 0 : if( bValidURL )
701 : {
702 0 : Dispatch( MN_ADD );
703 0 : return true;
704 : }
705 : }
706 0 : break;
707 :
708 : case( KEY_DELETE ):
709 : case( KEY_D ):
710 : {
711 0 : if( bDelete )
712 0 : nExecuteId = MN_DELETE;
713 : }
714 0 : break;
715 :
716 : case( KEY_T ):
717 : {
718 0 : if( bTitle )
719 0 : nExecuteId = MN_TITLE;
720 : }
721 0 : break;
722 :
723 : default:
724 0 : break;
725 : }
726 :
727 0 : if( nExecuteId )
728 : {
729 0 : Execute( nExecuteId );
730 0 : bRet = true;
731 0 : }
732 : }
733 :
734 0 : return bRet;
735 : }
736 :
737 0 : void GalleryBrowser2::SelectTheme( const OUString& rThemeName )
738 : {
739 0 : delete mpIconView, mpIconView = NULL;
740 0 : delete mpListView, mpListView = NULL;
741 0 : delete mpPreview, mpPreview = NULL;
742 :
743 0 : if( mpCurTheme )
744 0 : mpGallery->ReleaseTheme( mpCurTheme, *this );
745 :
746 0 : mpCurTheme = mpGallery->AcquireTheme( rThemeName, *this );
747 :
748 0 : mpIconView = new GalleryIconView( this, mpCurTheme );
749 0 : mpListView = new GalleryListView( this, mpCurTheme );
750 0 : mpPreview = new GalleryPreview( this, WB_TABSTOP | WB_BORDER, mpCurTheme );
751 :
752 0 : mpIconView->SetAccessibleName(SVX_RESSTR(RID_SVXSTR_GALLERY_THEMEITEMS));
753 0 : mpListView->SetAccessibleName(SVX_RESSTR(RID_SVXSTR_GALLERY_THEMEITEMS));
754 0 : mpPreview->SetAccessibleName(SVX_RESSTR(RID_SVXSTR_GALLERY_PREVIEW));
755 :
756 0 : const Link aSelectHdl( LINK( this, GalleryBrowser2, SelectObjectHdl ) );
757 :
758 0 : mpIconView->SetSelectHdl( aSelectHdl );
759 0 : mpListView->SetSelectHdl( aSelectHdl );
760 :
761 0 : if( GALLERYBROWSERMODE_PREVIEW == GetMode() )
762 0 : meMode = meLastMode;
763 :
764 0 : Resize();
765 0 : ImplUpdateViews( 1 );
766 :
767 0 : maViewBox.EnableItem( TBX_ID_ICON, true );
768 0 : maViewBox.EnableItem( TBX_ID_LIST, true );
769 0 : maViewBox.CheckItem( ( GALLERYBROWSERMODE_ICON == GetMode() ) ? TBX_ID_ICON : TBX_ID_LIST, true );
770 :
771 0 : if(maInfoBar.GetText().isEmpty())
772 0 : mpIconView->SetAccessibleRelationLabeledBy(mpIconView);
773 : else
774 0 : mpIconView->SetAccessibleRelationLabeledBy(&maInfoBar);
775 0 : mpIconView->SetAccessibleRelationMemberOf(mpIconView);
776 0 : }
777 :
778 0 : void GalleryBrowser2::SetMode( GalleryBrowserMode eMode )
779 : {
780 0 : if( GetMode() != eMode )
781 : {
782 0 : meLastMode = GetMode();
783 :
784 0 : switch( eMode )
785 : {
786 : case( GALLERYBROWSERMODE_ICON ):
787 : {
788 0 : mpListView->Hide();
789 :
790 0 : mpPreview->Hide();
791 0 : mpPreview->SetGraphic( Graphic() );
792 0 : mpPreview->PreviewMedia( INetURLObject() );
793 :
794 0 : mpIconView->Show();
795 :
796 0 : maViewBox.EnableItem( TBX_ID_ICON, true );
797 0 : maViewBox.EnableItem( TBX_ID_LIST, true );
798 :
799 0 : maViewBox.CheckItem( TBX_ID_ICON, true );
800 0 : maViewBox.CheckItem( TBX_ID_LIST, false );
801 : }
802 0 : break;
803 :
804 : case( GALLERYBROWSERMODE_LIST ):
805 : {
806 0 : mpIconView->Hide();
807 :
808 0 : mpPreview->Hide();
809 0 : mpPreview->SetGraphic( Graphic() );
810 0 : mpPreview->PreviewMedia( INetURLObject() );
811 :
812 0 : mpListView->Show();
813 :
814 0 : maViewBox.EnableItem( TBX_ID_ICON, true );
815 0 : maViewBox.EnableItem( TBX_ID_LIST, true );
816 :
817 0 : maViewBox.CheckItem( TBX_ID_ICON, false );
818 0 : maViewBox.CheckItem( TBX_ID_LIST, true );
819 : }
820 0 : break;
821 :
822 : case( GALLERYBROWSERMODE_PREVIEW ):
823 : {
824 0 : Graphic aGraphic;
825 0 : Point aSelPos;
826 0 : const sal_uIntPtr nItemId = ImplGetSelectedItemId( NULL, aSelPos );
827 :
828 0 : if( nItemId )
829 : {
830 0 : const sal_uIntPtr nPos = nItemId - 1;
831 :
832 0 : mpIconView->Hide();
833 0 : mpListView->Hide();
834 :
835 0 : if( mpCurTheme )
836 0 : mpCurTheme->GetGraphic( nPos, aGraphic );
837 :
838 0 : mpPreview->SetGraphic( aGraphic );
839 0 : mpPreview->Show();
840 :
841 0 : if( mpCurTheme && mpCurTheme->GetObjectKind( nPos ) == SGA_OBJ_SOUND )
842 0 : mpPreview->PreviewMedia( mpCurTheme->GetObjectURL( nPos ) );
843 :
844 0 : maViewBox.EnableItem( TBX_ID_ICON, false );
845 0 : maViewBox.EnableItem( TBX_ID_LIST, false );
846 0 : }
847 : }
848 0 : break;
849 :
850 : default:
851 0 : break;
852 : }
853 :
854 0 : GalleryBrowser2::meInitMode = meMode = eMode;
855 : }
856 0 : }
857 :
858 0 : vcl::Window* GalleryBrowser2::GetViewWindow() const
859 : {
860 : vcl::Window* pRet;
861 :
862 0 : switch( GetMode() )
863 : {
864 0 : case( GALLERYBROWSERMODE_LIST ): pRet = mpListView; break;
865 0 : case( GALLERYBROWSERMODE_PREVIEW ): pRet = mpPreview; break;
866 :
867 : default:
868 0 : pRet = mpIconView;
869 0 : break;
870 : }
871 :
872 0 : return pRet;
873 : }
874 :
875 0 : void GalleryBrowser2::Travel( GalleryBrowserTravel eTravel )
876 : {
877 0 : if( mpCurTheme )
878 : {
879 0 : Point aSelPos;
880 0 : const sal_uIntPtr nItemId = ImplGetSelectedItemId( NULL, aSelPos );
881 :
882 0 : if( nItemId )
883 : {
884 0 : sal_uIntPtr nNewItemId = nItemId;
885 :
886 0 : switch( eTravel )
887 : {
888 0 : case( GALLERYBROWSERTRAVEL_FIRST ): nNewItemId = 1; break;
889 0 : case( GALLERYBROWSERTRAVEL_LAST ): nNewItemId = mpCurTheme->GetObjectCount(); break;
890 0 : case( GALLERYBROWSERTRAVEL_PREVIOUS ): nNewItemId--; break;
891 0 : case( GALLERYBROWSERTRAVEL_NEXT ): nNewItemId++; break;
892 : default:
893 0 : break;
894 : }
895 :
896 0 : if( nNewItemId < 1 )
897 0 : nNewItemId = 1;
898 0 : else if( nNewItemId > mpCurTheme->GetObjectCount() )
899 0 : nNewItemId = mpCurTheme->GetObjectCount();
900 :
901 0 : if( nNewItemId != nItemId )
902 : {
903 0 : ImplSelectItemId( nNewItemId );
904 0 : ImplUpdateInfoBar();
905 :
906 0 : if( GALLERYBROWSERMODE_PREVIEW == GetMode() )
907 : {
908 0 : Graphic aGraphic;
909 0 : const sal_uIntPtr nPos = nNewItemId - 1;
910 :
911 0 : mpCurTheme->GetGraphic( nPos, aGraphic );
912 0 : mpPreview->SetGraphic( aGraphic );
913 :
914 0 : if( SGA_OBJ_SOUND == mpCurTheme->GetObjectKind( nPos ) )
915 0 : mpPreview->PreviewMedia( mpCurTheme->GetObjectURL( nPos ) );
916 :
917 0 : mpPreview->Invalidate();
918 : }
919 : }
920 : }
921 : }
922 0 : }
923 :
924 0 : void GalleryBrowser2::ImplUpdateViews( sal_uInt16 nSelectionId )
925 : {
926 0 : mpIconView->Hide();
927 0 : mpListView->Hide();
928 0 : mpPreview->Hide();
929 :
930 0 : mpIconView->Clear();
931 0 : mpListView->Clear();
932 :
933 0 : if( mpCurTheme )
934 : {
935 0 : for( sal_uIntPtr i = 0, nCount = mpCurTheme->GetObjectCount(); i < nCount; )
936 : {
937 0 : mpListView->RowInserted( i++ );
938 0 : mpIconView->InsertItem( (sal_uInt16) i );
939 : }
940 :
941 0 : ImplSelectItemId( ( ( nSelectionId > mpCurTheme->GetObjectCount() ) ? mpCurTheme->GetObjectCount() : nSelectionId ) );
942 : }
943 :
944 0 : switch( GetMode() )
945 : {
946 0 : case( GALLERYBROWSERMODE_ICON ): mpIconView->Show(); break;
947 0 : case( GALLERYBROWSERMODE_LIST ): mpListView->Show(); break;
948 0 : case( GALLERYBROWSERMODE_PREVIEW ): mpPreview->Show(); break;
949 :
950 : default:
951 0 : break;
952 : }
953 :
954 0 : ImplUpdateInfoBar();
955 0 : }
956 :
957 0 : void GalleryBrowser2::ImplUpdateInfoBar()
958 : {
959 0 : if( mpCurTheme )
960 0 : maInfoBar.SetText( mpCurTheme->GetName() );
961 0 : }
962 :
963 0 : sal_uIntPtr GalleryBrowser2::ImplGetSelectedItemId( const Point* pSelPos, Point& rSelPos )
964 : {
965 0 : const Size aOutputSizePixel( GetOutputSizePixel() );
966 0 : sal_uIntPtr nRet = 0;
967 :
968 0 : if( GALLERYBROWSERMODE_PREVIEW == GetMode() )
969 : {
970 0 : nRet = ( ( GALLERYBROWSERMODE_ICON == meLastMode ) ? mpIconView->GetSelectItemId() : ( mpListView->FirstSelectedRow() + 1 ) );
971 :
972 0 : if( pSelPos )
973 0 : rSelPos = GetPointerPosPixel();
974 : else
975 0 : rSelPos = Point( aOutputSizePixel.Width() >> 1, aOutputSizePixel.Height() >> 1 );
976 : }
977 0 : else if( GALLERYBROWSERMODE_ICON == GetMode() )
978 : {
979 0 : if( pSelPos )
980 : {
981 0 : nRet = mpIconView->GetItemId( *pSelPos );
982 0 : rSelPos = GetPointerPosPixel();
983 : }
984 : else
985 : {
986 0 : nRet = mpIconView->GetSelectItemId();
987 0 : rSelPos = mpIconView->GetItemRect( (sal_uInt16) nRet ).Center();
988 : }
989 : }
990 : else
991 : {
992 0 : if( pSelPos )
993 : {
994 0 : nRet = mpListView->GetRowAtYPosPixel( pSelPos->Y() ) + 1;
995 0 : rSelPos = GetPointerPosPixel();
996 : }
997 : else
998 : {
999 0 : nRet = mpListView->FirstSelectedRow() + 1;
1000 0 : rSelPos = mpListView->GetFieldRectPixel( (sal_uInt16) nRet, 1 ).Center();
1001 : }
1002 : }
1003 :
1004 0 : rSelPos.X() = std::max( std::min( rSelPos.X(), aOutputSizePixel.Width() - 1L ), 0L );
1005 0 : rSelPos.Y() = std::max( std::min( rSelPos.Y(), aOutputSizePixel.Height() - 1L ), 0L );
1006 :
1007 0 : if( nRet && ( !mpCurTheme || ( nRet > mpCurTheme->GetObjectCount() ) ) )
1008 : {
1009 0 : nRet = 0;
1010 : }
1011 :
1012 0 : return nRet;
1013 : }
1014 :
1015 0 : void GalleryBrowser2::ImplSelectItemId( sal_uIntPtr nItemId )
1016 : {
1017 0 : if( nItemId )
1018 : {
1019 :
1020 0 : mpIconView->SelectItem( (sal_uInt16) nItemId );
1021 0 : mpListView->SelectRow( nItemId - 1 );
1022 : }
1023 0 : }
1024 :
1025 : css::uno::Reference< css::frame::XFrame >
1026 0 : GalleryBrowser2::GetFrame() const
1027 : {
1028 0 : css::uno::Reference< css::frame::XFrame > xFrame;
1029 0 : SfxViewFrame* pCurrentViewFrame = SfxViewFrame::Current();
1030 0 : if ( pCurrentViewFrame )
1031 : {
1032 0 : SfxBindings& rBindings = pCurrentViewFrame->GetBindings();
1033 0 : xFrame.set( rBindings.GetActiveFrame() );
1034 : }
1035 :
1036 0 : return xFrame;
1037 : }
1038 :
1039 0 : void GalleryBrowser2::Dispatch(
1040 : sal_uInt16 nId,
1041 : const css::uno::Reference< css::frame::XDispatch > &rxDispatch,
1042 : const css::util::URL &rURL )
1043 : {
1044 0 : Point aSelPos;
1045 0 : const sal_uIntPtr nItemId = ImplGetSelectedItemId( NULL, aSelPos );
1046 :
1047 0 : if( !mpCurTheme || !nItemId )
1048 0 : return;
1049 :
1050 0 : mnCurActionPos = nItemId - 1;
1051 :
1052 0 : switch( nId )
1053 : {
1054 : case( MN_ADD ):
1055 : {
1056 0 : css::uno::Reference< css::frame::XDispatch > xDispatch( rxDispatch );
1057 0 : css::util::URL aURL = rURL;
1058 :
1059 0 : if ( !xDispatch.is() )
1060 : {
1061 : css::uno::Reference< css::frame::XDispatchProvider > xDispatchProvider(
1062 0 : GetFrame(), css::uno::UNO_QUERY );
1063 0 : if ( !xDispatchProvider.is() || !m_xTransformer.is() )
1064 0 : return;
1065 :
1066 0 : aURL.Complete = CMD_SID_GALLERY_FORMATS;
1067 0 : m_xTransformer->parseStrict( aURL );
1068 0 : xDispatch = xDispatchProvider->queryDispatch(
1069 : aURL,
1070 : OUString( "_self" ),
1071 0 : css::frame::FrameSearchFlag::SELF );
1072 : }
1073 :
1074 0 : if ( !xDispatch.is() )
1075 0 : return;
1076 :
1077 0 : sal_Int8 nType = 0;
1078 0 : OUString aFileURL, aFilterName;
1079 0 : css::uno::Reference< css::lang::XComponent > xDrawing;
1080 0 : css::uno::Reference< css::graphic::XGraphic > xGraphic;
1081 :
1082 0 : aFilterName = GetFilterName();
1083 :
1084 0 : switch( mpCurTheme->GetObjectKind( mnCurActionPos ) )
1085 : {
1086 : case( SGA_OBJ_BMP ):
1087 : case( SGA_OBJ_ANIM ):
1088 : case( SGA_OBJ_INET ):
1089 : // TODO drawing objects are inserted as drawings only via drag&drop
1090 : case( SGA_OBJ_SVDRAW ):
1091 0 : nType = css::gallery::GalleryItemType::GRAPHIC;
1092 0 : break;
1093 :
1094 : case ( SGA_OBJ_SOUND ) :
1095 0 : nType = css::gallery::GalleryItemType::MEDIA;
1096 0 : break;
1097 :
1098 : default:
1099 0 : nType = css::gallery::GalleryItemType::EMPTY;
1100 0 : break;
1101 : }
1102 :
1103 0 : Graphic aGraphic;
1104 0 : bool bGraphic = mpCurTheme->GetGraphic( mnCurActionPos, aGraphic );
1105 0 : if ( bGraphic && !!aGraphic )
1106 0 : xGraphic.set( aGraphic.GetXGraphic() );
1107 : OSL_ENSURE( xGraphic.is(), "gallery item is graphic, but the reference is invalid!" );
1108 :
1109 0 : css::uno::Sequence< css::beans::PropertyValue > aSeq( SVXGALLERYITEM_PARAMS );
1110 :
1111 0 : aSeq[0].Name = SVXGALLERYITEM_TYPE;
1112 0 : aSeq[0].Value <<= nType;
1113 0 : aSeq[1].Name = SVXGALLERYITEM_URL;
1114 0 : aSeq[1].Value <<= aFileURL;
1115 0 : aSeq[2].Name = SVXGALLERYITEM_FILTER;
1116 0 : aSeq[2].Value <<= aFilterName;
1117 0 : aSeq[3].Name = SVXGALLERYITEM_DRAWING;
1118 0 : aSeq[3].Value <<= xDrawing;
1119 0 : aSeq[4].Name = SVXGALLERYITEM_GRAPHIC;
1120 0 : aSeq[4].Value <<= xGraphic;
1121 :
1122 0 : css::uno::Sequence< css::beans::PropertyValue > aArgs( 1 );
1123 0 : aArgs[0].Name = SVXGALLERYITEM_ARGNAME;
1124 0 : aArgs[0].Value <<= aSeq;
1125 :
1126 0 : DispatchInfo *pInfo = new DispatchInfo;
1127 0 : pInfo->TargetURL = aURL;
1128 0 : pInfo->Arguments = aArgs;
1129 0 : pInfo->Dispatch = xDispatch;
1130 :
1131 0 : if ( !Application::PostUserEvent(
1132 0 : STATIC_LINK( 0, GalleryBrowser2, AsyncDispatch_Impl), pInfo ) )
1133 0 : delete pInfo;
1134 : }
1135 0 : break;
1136 :
1137 : default:
1138 0 : break;
1139 : }
1140 : }
1141 :
1142 0 : void GalleryBrowser2::Execute( sal_uInt16 nId )
1143 : {
1144 0 : Point aSelPos;
1145 0 : const sal_uIntPtr nItemId = ImplGetSelectedItemId( NULL, aSelPos );
1146 :
1147 0 : if( mpCurTheme && nItemId )
1148 : {
1149 0 : mnCurActionPos = nItemId - 1;
1150 :
1151 0 : switch( nId )
1152 : {
1153 : case( MN_PREVIEW ):
1154 0 : SetMode( ( GALLERYBROWSERMODE_PREVIEW != GetMode() ) ? GALLERYBROWSERMODE_PREVIEW : meLastMode );
1155 0 : break;
1156 :
1157 : case( MN_DELETE ):
1158 : {
1159 0 : if( !mpCurTheme->IsReadOnly() &&
1160 0 : MessageDialog(NULL, "QueryDeleteObjectDialog","svx/ui/querydeleteobjectdialog.ui").Execute() == RET_YES )
1161 : {
1162 0 : mpCurTheme->RemoveObject( mnCurActionPos );
1163 : }
1164 : }
1165 0 : break;
1166 :
1167 : case( MN_TITLE ):
1168 : {
1169 0 : SgaObject* pObj = mpCurTheme->AcquireObject( mnCurActionPos );
1170 :
1171 0 : if( pObj )
1172 : {
1173 0 : const OUString aOldTitle( GetItemText( *mpCurTheme, *pObj, GALLERY_ITEM_TITLE ) );
1174 :
1175 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
1176 0 : if(pFact)
1177 : {
1178 0 : boost::scoped_ptr<AbstractTitleDialog> aDlg(pFact->CreateTitleDialog( this, aOldTitle ));
1179 : DBG_ASSERT(aDlg, "Dialog creation failed!");
1180 0 : if( aDlg->Execute() == RET_OK )
1181 : {
1182 0 : OUString aNewTitle( aDlg->GetTitle() );
1183 :
1184 0 : if( ( aNewTitle.isEmpty() && !pObj->GetTitle().isEmpty() ) || ( aNewTitle != aOldTitle ) )
1185 : {
1186 0 : if( aNewTitle.isEmpty() )
1187 0 : aNewTitle = "__<empty>__";
1188 :
1189 0 : pObj->SetTitle( aNewTitle );
1190 0 : mpCurTheme->InsertObject( *pObj );
1191 0 : }
1192 : }
1193 :
1194 0 : mpCurTheme->ReleaseObject( pObj );
1195 0 : }
1196 : }
1197 : }
1198 0 : break;
1199 :
1200 : case( MN_COPYCLIPBOARD ):
1201 : {
1202 : vcl::Window* pWindow;
1203 :
1204 0 : switch( GetMode() )
1205 : {
1206 0 : case( GALLERYBROWSERMODE_ICON ): pWindow = (vcl::Window*) mpIconView; break;
1207 0 : case( GALLERYBROWSERMODE_LIST ): pWindow = (vcl::Window*) mpListView; break;
1208 0 : case( GALLERYBROWSERMODE_PREVIEW ): pWindow = (vcl::Window*) mpPreview; break;
1209 :
1210 : default:
1211 0 : pWindow = NULL;
1212 0 : break;
1213 : }
1214 :
1215 0 : mpCurTheme->CopyToClipboard( pWindow, mnCurActionPos );
1216 : }
1217 0 : break;
1218 :
1219 : case( MN_PASTECLIPBOARD ):
1220 : {
1221 0 : if( !mpCurTheme->IsReadOnly() )
1222 : {
1223 0 : TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( this ) );
1224 0 : mpCurTheme->InsertTransferable( aDataHelper.GetTransferable(), mnCurActionPos );
1225 : }
1226 : }
1227 0 : break;
1228 :
1229 : default:
1230 0 : break;
1231 : }
1232 : }
1233 0 : }
1234 :
1235 0 : OUString GalleryBrowser2::GetItemText( const GalleryTheme& rTheme, const SgaObject& rObj, sal_uIntPtr nItemTextFlags )
1236 : {
1237 0 : OUString aRet;
1238 :
1239 0 : INetURLObject aURL(rObj.GetURL());
1240 :
1241 0 : if( nItemTextFlags & GALLERY_ITEM_THEMENAME )
1242 : {
1243 0 : aRet += rTheme.GetName();
1244 0 : aRet += " - ";
1245 : }
1246 :
1247 0 : if( nItemTextFlags & GALLERY_ITEM_TITLE )
1248 : {
1249 0 : OUString aTitle( rObj.GetTitle() );
1250 :
1251 0 : if( aTitle.isEmpty() )
1252 0 : aTitle = aURL.getBase( INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_UNAMBIGUOUS );
1253 :
1254 0 : if( aTitle.isEmpty() )
1255 : {
1256 0 : aTitle = aURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS );
1257 0 : aTitle = aTitle.getToken( comphelper::string::getTokenCount(aTitle, '/') - 1, '/' );
1258 : }
1259 :
1260 0 : aRet += aTitle;
1261 : }
1262 :
1263 0 : if( nItemTextFlags & GALLERY_ITEM_PATH )
1264 : {
1265 0 : const OUString aPath( aURL.getFSysPath( INetURLObject::FSYS_DETECT ) );
1266 :
1267 0 : if( !aPath.isEmpty() && ( nItemTextFlags & GALLERY_ITEM_TITLE ) )
1268 0 : aRet += " (";
1269 :
1270 0 : aRet += aURL.getFSysPath( INetURLObject::FSYS_DETECT );
1271 :
1272 0 : if( !aPath.isEmpty() && ( nItemTextFlags & GALLERY_ITEM_TITLE ) )
1273 0 : aRet += ")";
1274 : }
1275 :
1276 0 : return aRet;
1277 : }
1278 :
1279 0 : INetURLObject GalleryBrowser2::GetURL() const
1280 : {
1281 0 : INetURLObject aURL;
1282 :
1283 0 : if( mpCurTheme && mnCurActionPos != 0xffffffff )
1284 0 : aURL = mpCurTheme->GetObjectURL( mnCurActionPos );
1285 :
1286 0 : return aURL;
1287 : }
1288 :
1289 0 : OUString GalleryBrowser2::GetFilterName() const
1290 : {
1291 0 : OUString aFilterName;
1292 :
1293 0 : if( mpCurTheme && mnCurActionPos != 0xffffffff )
1294 : {
1295 0 : const SgaObjKind eObjKind = mpCurTheme->GetObjectKind( mnCurActionPos );
1296 :
1297 0 : if( ( SGA_OBJ_BMP == eObjKind ) || ( SGA_OBJ_ANIM == eObjKind ) )
1298 : {
1299 0 : GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
1300 0 : INetURLObject aURL;
1301 0 : mpCurTheme->GetURL( mnCurActionPos, aURL );
1302 0 : sal_uInt16 nFilter = rFilter.GetImportFormatNumberForShortName( aURL.GetExtension() );
1303 :
1304 0 : if( GRFILTER_FORMAT_DONTKNOW != nFilter )
1305 0 : aFilterName = rFilter.GetImportFormatName( nFilter );
1306 : }
1307 : }
1308 :
1309 0 : return aFilterName;
1310 : }
1311 :
1312 0 : Graphic GalleryBrowser2::GetGraphic() const
1313 : {
1314 0 : Graphic aGraphic;
1315 :
1316 0 : if( mpCurTheme && mnCurActionPos != 0xffffffff )
1317 0 : mpCurTheme->GetGraphic( mnCurActionPos, aGraphic );
1318 :
1319 0 : return aGraphic;
1320 : }
1321 :
1322 0 : IMPL_LINK_NOARG(GalleryBrowser2, SelectObjectHdl)
1323 : {
1324 0 : ImplUpdateInfoBar();
1325 0 : return 0L;
1326 : }
1327 :
1328 0 : IMPL_LINK( GalleryBrowser2, SelectTbxHdl, ToolBox*, pBox )
1329 : {
1330 0 : if( pBox->GetCurItemId() == TBX_ID_ICON )
1331 0 : SetMode( GALLERYBROWSERMODE_ICON );
1332 0 : else if( pBox->GetCurItemId() == TBX_ID_LIST )
1333 0 : SetMode( GALLERYBROWSERMODE_LIST );
1334 :
1335 0 : return 0L;
1336 : }
1337 :
1338 0 : IMPL_LINK_NOARG(GalleryBrowser2, MiscHdl)
1339 : {
1340 0 : maViewBox.SetOutStyle( maMiscOptions.GetToolboxStyle() );
1341 :
1342 0 : BitmapEx aIconBmpEx = BitmapEx( Image( GAL_RES( RID_SVXIMG_GALLERY_VIEW_ICON ) ).GetBitmapEx() );
1343 0 : BitmapEx aListBmpEx = BitmapEx( Image( GAL_RES( RID_SVXIMG_GALLERY_VIEW_LIST ) ).GetBitmapEx() );
1344 :
1345 0 : if( maMiscOptions.AreCurrentSymbolsLarge() )
1346 : {
1347 0 : const Size aLargeSize( 24, 24);
1348 :
1349 0 : aIconBmpEx.Scale( aLargeSize );
1350 0 : aListBmpEx.Scale( aLargeSize );
1351 : }
1352 :
1353 0 : maViewBox.SetItemImage(TBX_ID_ICON, Image(aIconBmpEx));
1354 0 : maViewBox.SetItemImage(TBX_ID_LIST, Image(aListBmpEx));
1355 0 : maViewBox.SetSizePixel( maViewBox.CalcWindowSizePixel() );
1356 :
1357 0 : Resize();
1358 :
1359 0 : return 0L;
1360 651 : }
1361 :
1362 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|