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