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