xref: /aoo42x/main/sfx2/source/appl/imagemgr.cxx (revision cdf0e10c)
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