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

Generated by: LCOV version 1.10