LCOV - code coverage report
Current view: top level - svx/source/gallery2 - galbrws2.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 1 655 0.2 %
Date: 2015-06-13 12:38:46 Functions: 2 57 3.5 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.11