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

Generated by: LCOV version 1.10