1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_sfx2.hxx" 30*cdf0e10cSrcweir #include "sfx2/imagemgr.hxx" 31*cdf0e10cSrcweir #include <com/sun/star/frame/XController.hpp> 32*cdf0e10cSrcweir #include <com/sun/star/ui/XImageManager.hpp> 33*cdf0e10cSrcweir #include <com/sun/star/frame/XModuleManager.hpp> 34*cdf0e10cSrcweir #include <com/sun/star/ui/XModuleUIConfigurationManagerSupplier.hpp> 35*cdf0e10cSrcweir #include <com/sun/star/ui/ImageType.hpp> 36*cdf0e10cSrcweir #include <com/sun/star/ui/XUIConfigurationManagerSupplier.hpp> 37*cdf0e10cSrcweir 38*cdf0e10cSrcweir #include <tools/urlobj.hxx> 39*cdf0e10cSrcweir #include <svtools/imagemgr.hxx> 40*cdf0e10cSrcweir #include <comphelper/processfactory.hxx> 41*cdf0e10cSrcweir #include <rtl/ustring.hxx> 42*cdf0e10cSrcweir #include <rtl/logfile.hxx> 43*cdf0e10cSrcweir 44*cdf0e10cSrcweir #include "sfx2/imgmgr.hxx" 45*cdf0e10cSrcweir #include <sfx2/app.hxx> 46*cdf0e10cSrcweir #include <sfx2/unoctitm.hxx> 47*cdf0e10cSrcweir #include <sfx2/dispatch.hxx> 48*cdf0e10cSrcweir #include <sfx2/msg.hxx> 49*cdf0e10cSrcweir #include <sfx2/msgpool.hxx> 50*cdf0e10cSrcweir #include <sfx2/viewfrm.hxx> 51*cdf0e10cSrcweir #include <sfx2/module.hxx> 52*cdf0e10cSrcweir #include <sfx2/objsh.hxx> 53*cdf0e10cSrcweir #include <sfx2/docfac.hxx> 54*cdf0e10cSrcweir 55*cdf0e10cSrcweir #include <hash_map> 56*cdf0e10cSrcweir 57*cdf0e10cSrcweir using namespace ::com::sun::star::uno; 58*cdf0e10cSrcweir using namespace ::com::sun::star::frame; 59*cdf0e10cSrcweir using namespace ::com::sun::star::lang; 60*cdf0e10cSrcweir using namespace ::com::sun::star::util; 61*cdf0e10cSrcweir using namespace ::com::sun::star::ui; 62*cdf0e10cSrcweir using namespace ::com::sun::star::frame; 63*cdf0e10cSrcweir 64*cdf0e10cSrcweir typedef std::hash_map< ::rtl::OUString, 65*cdf0e10cSrcweir WeakReference< XImageManager >, 66*cdf0e10cSrcweir ::rtl::OUStringHash, 67*cdf0e10cSrcweir ::std::equal_to< ::rtl::OUString > > ModuleIdToImagegMgr; 68*cdf0e10cSrcweir 69*cdf0e10cSrcweir static WeakReference< XModuleManager > m_xModuleManager; 70*cdf0e10cSrcweir static WeakReference< XModuleUIConfigurationManagerSupplier > m_xModuleCfgMgrSupplier; 71*cdf0e10cSrcweir static WeakReference< XURLTransformer > m_xURLTransformer; 72*cdf0e10cSrcweir static ModuleIdToImagegMgr m_aModuleIdToImageMgrMap; 73*cdf0e10cSrcweir 74*cdf0e10cSrcweir Image SAL_CALL GetImage( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame, const ::rtl::OUString& aURL, sal_Bool bBig, sal_Bool bHiContrast ) 75*cdf0e10cSrcweir { 76*cdf0e10cSrcweir // TODO/LATeR: shouldn't this become a method at SfxViewFrame?! That would save the UnoTunnel 77*cdf0e10cSrcweir if ( !rFrame.is() ) 78*cdf0e10cSrcweir return Image(); 79*cdf0e10cSrcweir 80*cdf0e10cSrcweir INetURLObject aObj( aURL ); 81*cdf0e10cSrcweir INetProtocol nProtocol = aObj.GetProtocol(); 82*cdf0e10cSrcweir 83*cdf0e10cSrcweir Reference < XController > xController; 84*cdf0e10cSrcweir Reference < XModel > xModel; 85*cdf0e10cSrcweir if ( rFrame.is() ) 86*cdf0e10cSrcweir xController = rFrame->getController(); 87*cdf0e10cSrcweir if ( xController.is() ) 88*cdf0e10cSrcweir xModel = xController->getModel(); 89*cdf0e10cSrcweir 90*cdf0e10cSrcweir rtl::OUString aCommandURL( aURL ); 91*cdf0e10cSrcweir if ( nProtocol == INET_PROT_SLOT ) 92*cdf0e10cSrcweir { 93*cdf0e10cSrcweir /* 94*cdf0e10cSrcweir // Support old way to retrieve image via slot URL 95*cdf0e10cSrcweir Reference< XURLTransformer > xURLTransformer = m_xURLTransformer; 96*cdf0e10cSrcweir if ( !xURLTransformer.is() ) 97*cdf0e10cSrcweir { 98*cdf0e10cSrcweir xURLTransformer = Reference< XURLTransformer >( 99*cdf0e10cSrcweir ::comphelper::getProcessServiceFactory()->createInstance( 100*cdf0e10cSrcweir rtl::OUString::createFromAscii("com.sun.star.util.URLTransformer" )), 101*cdf0e10cSrcweir UNO_QUERY ); 102*cdf0e10cSrcweir m_xURLTransformer = xURLTransformer; 103*cdf0e10cSrcweir } 104*cdf0e10cSrcweir 105*cdf0e10cSrcweir URL aTargetURL; 106*cdf0e10cSrcweir aTargetURL.Complete = aURL; 107*cdf0e10cSrcweir xURLTransformer->parseStrict( aTargetURL ); 108*cdf0e10cSrcweir sal_uInt16 nId = ( sal_uInt16 ) aTargetURL.Path.toInt32();*/ 109*cdf0e10cSrcweir sal_uInt16 nId = ( sal_uInt16 ) String(aURL).Copy(5).ToInt32(); 110*cdf0e10cSrcweir const SfxSlot* pSlot = 0; 111*cdf0e10cSrcweir if ( xModel.is() ) 112*cdf0e10cSrcweir { 113*cdf0e10cSrcweir Reference < XUnoTunnel > xObj( xModel, UNO_QUERY ); 114*cdf0e10cSrcweir Sequence < sal_Int8 > aSeq( SvGlobalName( SFX_GLOBAL_CLASSID ).GetByteSequence() ); 115*cdf0e10cSrcweir sal_Int64 nHandle = xObj.is() ? xObj->getSomething( aSeq ) : 0; 116*cdf0e10cSrcweir if ( nHandle ) 117*cdf0e10cSrcweir { 118*cdf0e10cSrcweir SfxObjectShell* pDoc = reinterpret_cast<SfxObjectShell*>(sal::static_int_cast<sal_IntPtr>( nHandle )); 119*cdf0e10cSrcweir SfxModule* pModule = pDoc->GetFactory().GetModule(); 120*cdf0e10cSrcweir pSlot = pModule->GetSlotPool()->GetSlot( nId ); 121*cdf0e10cSrcweir } 122*cdf0e10cSrcweir } 123*cdf0e10cSrcweir else 124*cdf0e10cSrcweir pSlot = SfxSlotPool::GetSlotPool().GetSlot( nId ); 125*cdf0e10cSrcweir 126*cdf0e10cSrcweir if ( pSlot ) 127*cdf0e10cSrcweir { 128*cdf0e10cSrcweir aCommandURL = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:" )); 129*cdf0e10cSrcweir aCommandURL += rtl::OUString::createFromAscii( pSlot->GetUnoName() ); 130*cdf0e10cSrcweir } 131*cdf0e10cSrcweir else 132*cdf0e10cSrcweir aCommandURL = rtl::OUString(); 133*cdf0e10cSrcweir } 134*cdf0e10cSrcweir 135*cdf0e10cSrcweir Reference< XImageManager > xDocImgMgr; 136*cdf0e10cSrcweir if ( xModel.is() ) 137*cdf0e10cSrcweir { 138*cdf0e10cSrcweir Reference< XUIConfigurationManagerSupplier > xSupplier( xModel, UNO_QUERY ); 139*cdf0e10cSrcweir if ( xSupplier.is() ) 140*cdf0e10cSrcweir { 141*cdf0e10cSrcweir Reference< XUIConfigurationManager > xDocUICfgMgr( xSupplier->getUIConfigurationManager(), UNO_QUERY ); 142*cdf0e10cSrcweir xDocImgMgr = Reference< XImageManager >( xDocUICfgMgr->getImageManager(), UNO_QUERY ); 143*cdf0e10cSrcweir } 144*cdf0e10cSrcweir } 145*cdf0e10cSrcweir 146*cdf0e10cSrcweir sal_Int16 nImageType( ::com::sun::star::ui::ImageType::COLOR_NORMAL| 147*cdf0e10cSrcweir ::com::sun::star::ui::ImageType::SIZE_DEFAULT ); 148*cdf0e10cSrcweir if ( bBig ) 149*cdf0e10cSrcweir nImageType |= ::com::sun::star::ui::ImageType::SIZE_LARGE; 150*cdf0e10cSrcweir if ( bHiContrast ) 151*cdf0e10cSrcweir nImageType |= ::com::sun::star::ui::ImageType::COLOR_HIGHCONTRAST; 152*cdf0e10cSrcweir 153*cdf0e10cSrcweir if ( xDocImgMgr.is() ) 154*cdf0e10cSrcweir { 155*cdf0e10cSrcweir Sequence< Reference< ::com::sun::star::graphic::XGraphic > > aGraphicSeq; 156*cdf0e10cSrcweir Sequence< rtl::OUString > aImageCmdSeq( 1 ); 157*cdf0e10cSrcweir aImageCmdSeq[0] = aCommandURL; 158*cdf0e10cSrcweir 159*cdf0e10cSrcweir try 160*cdf0e10cSrcweir { 161*cdf0e10cSrcweir aGraphicSeq = xDocImgMgr->getImages( nImageType, aImageCmdSeq ); 162*cdf0e10cSrcweir Reference< ::com::sun::star::graphic::XGraphic > xGraphic = aGraphicSeq[0]; 163*cdf0e10cSrcweir Image aImage( xGraphic ); 164*cdf0e10cSrcweir 165*cdf0e10cSrcweir if ( !!aImage ) 166*cdf0e10cSrcweir return aImage; 167*cdf0e10cSrcweir } 168*cdf0e10cSrcweir catch ( Exception& ) 169*cdf0e10cSrcweir { 170*cdf0e10cSrcweir } 171*cdf0e10cSrcweir } 172*cdf0e10cSrcweir 173*cdf0e10cSrcweir Reference< XModuleManager > xModuleManager = m_xModuleManager; 174*cdf0e10cSrcweir 175*cdf0e10cSrcweir if ( !xModuleManager.is() ) 176*cdf0e10cSrcweir { 177*cdf0e10cSrcweir xModuleManager = Reference< XModuleManager >( 178*cdf0e10cSrcweir ::comphelper::getProcessServiceFactory()->createInstance( 179*cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( 180*cdf0e10cSrcweir "com.sun.star.frame.ModuleManager" ))), 181*cdf0e10cSrcweir UNO_QUERY ); 182*cdf0e10cSrcweir m_xModuleManager = xModuleManager; 183*cdf0e10cSrcweir } 184*cdf0e10cSrcweir 185*cdf0e10cSrcweir try 186*cdf0e10cSrcweir { 187*cdf0e10cSrcweir if ( aCommandURL.getLength() > 0 ) 188*cdf0e10cSrcweir { 189*cdf0e10cSrcweir Reference< XImageManager > xModuleImageManager; 190*cdf0e10cSrcweir rtl::OUString aModuleId = xModuleManager->identify( rFrame ); 191*cdf0e10cSrcweir ModuleIdToImagegMgr::iterator pIter = m_aModuleIdToImageMgrMap.find( aModuleId ); 192*cdf0e10cSrcweir if ( pIter != m_aModuleIdToImageMgrMap.end() ) 193*cdf0e10cSrcweir xModuleImageManager = pIter->second; 194*cdf0e10cSrcweir else 195*cdf0e10cSrcweir { 196*cdf0e10cSrcweir Reference< XModuleUIConfigurationManagerSupplier > xModuleCfgMgrSupplier = m_xModuleCfgMgrSupplier; 197*cdf0e10cSrcweir 198*cdf0e10cSrcweir if ( !xModuleCfgMgrSupplier.is() ) 199*cdf0e10cSrcweir { 200*cdf0e10cSrcweir xModuleCfgMgrSupplier = Reference< XModuleUIConfigurationManagerSupplier >( 201*cdf0e10cSrcweir ::comphelper::getProcessServiceFactory()->createInstance( 202*cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( 203*cdf0e10cSrcweir "com.sun.star.ui.ModuleUIConfigurationManagerSupplier" ))), 204*cdf0e10cSrcweir UNO_QUERY ); 205*cdf0e10cSrcweir 206*cdf0e10cSrcweir m_xModuleCfgMgrSupplier = xModuleCfgMgrSupplier; 207*cdf0e10cSrcweir } 208*cdf0e10cSrcweir 209*cdf0e10cSrcweir Reference< XUIConfigurationManager > xUICfgMgr = xModuleCfgMgrSupplier->getUIConfigurationManager( aModuleId ); 210*cdf0e10cSrcweir xModuleImageManager = Reference< XImageManager >( xUICfgMgr->getImageManager(), UNO_QUERY ); 211*cdf0e10cSrcweir m_aModuleIdToImageMgrMap.insert( ModuleIdToImagegMgr::value_type( aModuleId, xModuleImageManager )); 212*cdf0e10cSrcweir } 213*cdf0e10cSrcweir 214*cdf0e10cSrcweir Sequence< Reference< ::com::sun::star::graphic::XGraphic > > aGraphicSeq; 215*cdf0e10cSrcweir Sequence< rtl::OUString > aImageCmdSeq( 1 ); 216*cdf0e10cSrcweir aImageCmdSeq[0] = aCommandURL; 217*cdf0e10cSrcweir 218*cdf0e10cSrcweir aGraphicSeq = xModuleImageManager->getImages( nImageType, aImageCmdSeq ); 219*cdf0e10cSrcweir 220*cdf0e10cSrcweir Reference< ::com::sun::star::graphic::XGraphic > xGraphic = aGraphicSeq[0]; 221*cdf0e10cSrcweir Image aImage( xGraphic ); 222*cdf0e10cSrcweir 223*cdf0e10cSrcweir if ( !!aImage ) 224*cdf0e10cSrcweir return aImage; 225*cdf0e10cSrcweir else if ( nProtocol != INET_PROT_UNO && nProtocol != INET_PROT_SLOT ) 226*cdf0e10cSrcweir return SvFileInformationManager::GetImageNoDefault( aObj, bBig, bHiContrast ); 227*cdf0e10cSrcweir } 228*cdf0e10cSrcweir } 229*cdf0e10cSrcweir catch ( Exception& ) 230*cdf0e10cSrcweir { 231*cdf0e10cSrcweir } 232*cdf0e10cSrcweir 233*cdf0e10cSrcweir return Image(); 234*cdf0e10cSrcweir } 235