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 : #include <stdio.h>
21 : #include <tools/rcid.h>
22 :
23 : #include <cstdarg>
24 : #include <sfx2/module.hxx>
25 : #include <sfx2/app.hxx>
26 : #include <sfx2/sfxresid.hxx>
27 : #include <sfx2/msgpool.hxx>
28 : #include <sfx2/tbxctrl.hxx>
29 : #include <sfx2/stbitem.hxx>
30 : #include <sfx2/mnuitem.hxx>
31 : #include <sfx2/childwin.hxx>
32 : #include <sfx2/mnumgr.hxx>
33 : #include <sfx2/docfac.hxx>
34 : #include <sfx2/objface.hxx>
35 : #include <sfx2/viewfrm.hxx>
36 : #include <svl/intitem.hxx>
37 : #include <sfx2/taskpane.hxx>
38 : #include <tools/diagnose_ex.h>
39 : #include <rtl/strbuf.hxx>
40 : #include <sal/log.hxx>
41 :
42 : #define SfxModule
43 : #include "sfxslots.hxx"
44 :
45 : static SfxModuleArr_Impl* pModules=0;
46 :
47 : class SfxModule_Impl
48 : {
49 : public:
50 :
51 : SfxSlotPool* pSlotPool;
52 : SfxTbxCtrlFactArr_Impl* pTbxCtrlFac;
53 : SfxStbCtrlFactArr_Impl* pStbCtrlFac;
54 : SfxMenuCtrlFactArr_Impl* pMenuCtrlFac;
55 : SfxChildWinFactArr_Impl* pFactArr;
56 : ImageList* pImgListSmall;
57 : ImageList* pImgListBig;
58 :
59 : SfxModule_Impl();
60 : ~SfxModule_Impl();
61 : ImageList* GetImageList( ResMgr* pResMgr, bool bBig );
62 : };
63 :
64 224 : SfxModule_Impl::SfxModule_Impl()
65 224 : : pSlotPool(0), pTbxCtrlFac(0), pStbCtrlFac(0), pMenuCtrlFac(0), pFactArr(0), pImgListSmall(0), pImgListBig(0)
66 : {
67 224 : }
68 :
69 82 : SfxModule_Impl::~SfxModule_Impl()
70 : {
71 82 : delete pSlotPool;
72 82 : delete pTbxCtrlFac;
73 82 : delete pStbCtrlFac;
74 82 : delete pMenuCtrlFac;
75 82 : delete pFactArr;
76 82 : delete pImgListSmall;
77 82 : delete pImgListBig;
78 82 : }
79 :
80 58 : ImageList* SfxModule_Impl::GetImageList( ResMgr* pResMgr, bool bBig )
81 : {
82 58 : ImageList*& rpList = bBig ? pImgListBig : pImgListSmall;
83 58 : if ( !rpList )
84 : {
85 58 : ResId aResId( bBig ? ( RID_DEFAULTIMAGELIST_LC ) : ( RID_DEFAULTIMAGELIST_SC ), *pResMgr );
86 :
87 58 : aResId.SetRT( RSC_IMAGELIST );
88 :
89 : DBG_ASSERT( pResMgr->IsAvailable(aResId), "No default ImageList!" );
90 :
91 58 : if ( pResMgr->IsAvailable(aResId) )
92 58 : rpList = new ImageList( aResId );
93 : else
94 0 : rpList = new ImageList();
95 : }
96 :
97 58 : return rpList; }
98 :
99 105721 : TYPEINIT1(SfxModule, SfxShell);
100 :
101 754 : SFX_IMPL_INTERFACE(SfxModule, SfxShell, SfxResId(0))
102 :
103 303 : void SfxModule::InitInterface_Impl()
104 : {
105 303 : }
106 :
107 120102 : ResMgr* SfxModule::GetResMgr()
108 : {
109 120102 : return pResMgr;
110 : }
111 :
112 224 : SfxModule::SfxModule( ResMgr* pMgrP, bool bDummyP,
113 : SfxObjectFactory* pFactoryP, ... )
114 224 : : pResMgr( pMgrP ), bDummy( bDummyP ), pImpl(0L)
115 : {
116 224 : Construct_Impl();
117 : va_list pVarArgs;
118 224 : va_start( pVarArgs, pFactoryP );
119 1008 : for ( SfxObjectFactory *pArg = pFactoryP; pArg;
120 524 : pArg = va_arg( pVarArgs, SfxObjectFactory* ) )
121 436 : pArg->SetModule_Impl( this );
122 224 : va_end(pVarArgs);
123 224 : }
124 :
125 224 : void SfxModule::Construct_Impl()
126 : {
127 224 : if( !bDummy )
128 : {
129 224 : SfxApplication *pApp = SfxGetpApp();
130 224 : SfxModuleArr_Impl& rArr = GetModules_Impl();
131 224 : SfxModule* pPtr = (SfxModule*)this;
132 224 : rArr.push_back( pPtr );
133 224 : pImpl = new SfxModule_Impl;
134 224 : pImpl->pSlotPool = new SfxSlotPool( &pApp->GetAppSlotPool_Impl(), pResMgr );
135 :
136 224 : pImpl->pTbxCtrlFac=0;
137 224 : pImpl->pStbCtrlFac=0;
138 224 : pImpl->pMenuCtrlFac=0;
139 224 : pImpl->pFactArr=0;
140 224 : pImpl->pImgListSmall=0;
141 224 : pImpl->pImgListBig=0;
142 :
143 224 : SetPool( &pApp->GetPool() );
144 : }
145 224 : }
146 :
147 :
148 :
149 164 : SfxModule::~SfxModule()
150 : {
151 82 : if( !bDummy )
152 : {
153 82 : if ( SfxGetpApp()->Get_Impl() )
154 : {
155 : // The module will be destroyed before the Deinitialize,
156 : // so remove from the array
157 82 : SfxModuleArr_Impl& rArr = GetModules_Impl();
158 164 : for( sal_uInt16 nPos = rArr.size(); nPos--; )
159 : {
160 82 : if( rArr[ nPos ] == this )
161 : {
162 82 : rArr.erase( rArr.begin() + nPos );
163 82 : break;
164 : }
165 : }
166 :
167 82 : delete pImpl;
168 : }
169 :
170 82 : delete pResMgr;
171 : }
172 82 : }
173 :
174 :
175 :
176 1093636 : SfxSlotPool* SfxModule::GetSlotPool() const
177 : {
178 1093636 : return pImpl->pSlotPool;
179 : }
180 :
181 :
182 :
183 5252 : void SfxModule::RegisterChildWindow(SfxChildWinFactory *pFact)
184 : {
185 : DBG_ASSERT( pImpl, "No real Module!" );
186 :
187 5252 : if (!pImpl->pFactArr)
188 224 : pImpl->pFactArr = new SfxChildWinFactArr_Impl;
189 :
190 81564 : for (sal_uInt16 nFactory=0; nFactory<pImpl->pFactArr->size(); ++nFactory)
191 : {
192 76312 : if (pFact->nId == (*pImpl->pFactArr)[nFactory].nId)
193 : {
194 0 : pImpl->pFactArr->erase( pImpl->pFactArr->begin() + nFactory );
195 : SAL_WARN("sfx.appl", "ChildWindow registered multiple times!");
196 5252 : return;
197 : }
198 : }
199 :
200 5252 : pImpl->pFactArr->push_back( pFact );
201 : }
202 :
203 :
204 :
205 10924 : void SfxModule::RegisterToolBoxControl( SfxTbxCtrlFactory *pFact )
206 : {
207 10924 : if (!pImpl->pTbxCtrlFac)
208 224 : pImpl->pTbxCtrlFac = new SfxTbxCtrlFactArr_Impl;
209 :
210 : #ifdef DBG_UTIL
211 : for ( sal_uInt16 n=0; n<pImpl->pTbxCtrlFac->size(); n++ )
212 : {
213 : SfxTbxCtrlFactory *pF = &(*pImpl->pTbxCtrlFac)[n];
214 : if ( pF->nTypeId && pF->nTypeId == pFact->nTypeId &&
215 : (pF->nSlotId == pFact->nSlotId || pF->nSlotId == 0) )
216 : {
217 : DBG_WARNING("TbxController-Registering is not clearly defined!");
218 : }
219 : }
220 : #endif
221 :
222 10924 : pImpl->pTbxCtrlFac->push_back( pFact );
223 10924 : }
224 :
225 :
226 :
227 1872 : void SfxModule::RegisterStatusBarControl( SfxStbCtrlFactory *pFact )
228 : {
229 1872 : if (!pImpl->pStbCtrlFac)
230 224 : pImpl->pStbCtrlFac = new SfxStbCtrlFactArr_Impl;
231 :
232 : #ifdef DBG_UTIL
233 : for ( sal_uInt16 n=0; n<pImpl->pStbCtrlFac->size(); n++ )
234 : {
235 : SfxStbCtrlFactory *pF = &(*pImpl->pStbCtrlFac)[n];
236 : if ( pF->nTypeId && pF->nTypeId == pFact->nTypeId &&
237 : (pF->nSlotId == pFact->nSlotId || pF->nSlotId == 0) )
238 : {
239 : DBG_WARNING("TbxController-Registering is not clearly defined!");
240 : }
241 : }
242 : #endif
243 :
244 1872 : pImpl->pStbCtrlFac->push_back( pFact );
245 1872 : }
246 :
247 :
248 :
249 596 : void SfxModule::RegisterMenuControl( SfxMenuCtrlFactory *pFact )
250 : {
251 596 : if (!pImpl->pMenuCtrlFac)
252 200 : pImpl->pMenuCtrlFac = new SfxMenuCtrlFactArr_Impl;
253 :
254 : #ifdef DBG_UTIL
255 : for ( sal_uInt16 n=0; n<pImpl->pMenuCtrlFac->size(); n++ )
256 : {
257 : SfxMenuCtrlFactory *pF = &(*pImpl->pMenuCtrlFac)[n];
258 : if ( pF->nTypeId && pF->nTypeId == pFact->nTypeId &&
259 : (pF->nSlotId == pFact->nSlotId || pF->nSlotId == 0) )
260 : {
261 : DBG_WARNING("MenuController-Registering is not clearly defined!");
262 : }
263 : }
264 : #endif
265 :
266 596 : pImpl->pMenuCtrlFac->push_back( pFact );
267 596 : }
268 :
269 :
270 :
271 109908 : SfxTbxCtrlFactArr_Impl* SfxModule::GetTbxCtrlFactories_Impl() const
272 : {
273 109908 : return pImpl->pTbxCtrlFac;
274 : }
275 :
276 :
277 :
278 14960 : SfxStbCtrlFactArr_Impl* SfxModule::GetStbCtrlFactories_Impl() const
279 : {
280 14960 : return pImpl->pStbCtrlFac;
281 : }
282 :
283 :
284 :
285 0 : SfxMenuCtrlFactArr_Impl* SfxModule::GetMenuCtrlFactories_Impl() const
286 : {
287 0 : return pImpl->pMenuCtrlFac;
288 : }
289 :
290 :
291 :
292 97458 : SfxChildWinFactArr_Impl* SfxModule::GetChildWinFactories_Impl() const
293 : {
294 97458 : return pImpl->pFactArr;
295 : }
296 :
297 58 : ImageList* SfxModule::GetImageList_Impl( bool bBig )
298 : {
299 58 : return pImpl->GetImageList( pResMgr, bBig );
300 : }
301 :
302 0 : SfxTabPage* SfxModule::CreateTabPage( sal_uInt16, vcl::Window*, const SfxItemSet& )
303 : {
304 0 : return NULL;
305 : }
306 :
307 306 : SfxModuleArr_Impl& SfxModule::GetModules_Impl()
308 : {
309 306 : if( !pModules )
310 174 : pModules = new SfxModuleArr_Impl;
311 306 : return *pModules;
312 : };
313 :
314 168 : void SfxModule::DestroyModules_Impl()
315 : {
316 168 : if ( pModules )
317 : {
318 64 : SfxModuleArr_Impl& rModules = *pModules;
319 210 : for( sal_uInt16 nPos = rModules.size(); nPos--; )
320 : {
321 82 : SfxModule* pMod = rModules[nPos];
322 82 : delete pMod;
323 : }
324 64 : delete pModules, pModules = 0;
325 : }
326 168 : }
327 :
328 0 : void SfxModule::Invalidate( sal_uInt16 nId )
329 : {
330 0 : for( SfxViewFrame* pFrame = SfxViewFrame::GetFirst(); pFrame; pFrame = SfxViewFrame::GetNext( *pFrame ) )
331 0 : if ( pFrame->GetObjectShell()->GetModule() == this )
332 0 : Invalidate_Impl( pFrame->GetBindings(), nId );
333 0 : }
334 :
335 24061 : bool SfxModule::IsChildWindowAvailable( const sal_uInt16 i_nId, const SfxViewFrame* i_pViewFrame ) const
336 : {
337 24061 : if ( i_nId != SID_TASKPANE )
338 : // by default, assume it is
339 24061 : return true;
340 :
341 0 : const SfxViewFrame* pViewFrame = i_pViewFrame ? i_pViewFrame : GetFrame();
342 0 : ENSURE_OR_RETURN( pViewFrame, "SfxModule::IsChildWindowAvailable: no frame to ask for the module identifier!", false );
343 0 : return ::sfx2::ModuleTaskPane::ModuleHasToolPanels( pViewFrame->GetFrame().GetFrameInterface() );
344 : }
345 :
346 695912 : SfxModule* SfxModule::GetActiveModule( SfxViewFrame* pFrame )
347 : {
348 695912 : if ( !pFrame )
349 108000 : pFrame = SfxViewFrame::Current();
350 695912 : SfxObjectShell* pSh = 0;
351 695912 : if( pFrame )
352 600762 : pSh = pFrame->GetObjectShell();
353 695912 : return pSh ? pSh->GetModule() : 0;
354 : }
355 :
356 800 : FieldUnit SfxModule::GetModuleFieldUnit( ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > const & i_frame )
357 : {
358 800 : ENSURE_OR_RETURN( i_frame.is(), "SfxModule::GetModuleFieldUnit: invalid frame!", FUNIT_100TH_MM );
359 :
360 : // find SfxViewFrame for the given XFrame
361 800 : SfxViewFrame* pViewFrame = SfxViewFrame::GetFirst();
362 1654 : while ( pViewFrame != NULL )
363 : {
364 854 : if ( pViewFrame->GetFrame().GetFrameInterface() == i_frame )
365 800 : break;
366 54 : pViewFrame = SfxViewFrame::GetNext( *pViewFrame );
367 : }
368 800 : ENSURE_OR_RETURN( pViewFrame != NULL, "SfxModule::GetModuleFieldUnit: unable to find an SfxViewFrame for the given XFrame", FUNIT_100TH_MM );
369 :
370 : // find the module
371 800 : SfxModule const * pModule = GetActiveModule( pViewFrame );
372 800 : ENSURE_OR_RETURN( pModule != NULL, "SfxModule::GetModuleFieldUnit: no SfxModule for the given frame!", FUNIT_100TH_MM );
373 800 : return pModule->GetFieldUnit();
374 : }
375 :
376 742 : FieldUnit SfxModule::GetCurrentFieldUnit()
377 : {
378 742 : FieldUnit eUnit = FUNIT_INCH;
379 742 : SfxModule* pModule = GetActiveModule();
380 742 : if ( pModule )
381 : {
382 742 : const SfxPoolItem* pItem = pModule->GetItem( SID_ATTR_METRIC );
383 742 : if ( pItem )
384 0 : eUnit = (FieldUnit) static_cast<const SfxUInt16Item*>(pItem)->GetValue();
385 : }
386 : else
387 : SAL_WARN( "sfx.appl", "GetModuleFieldUnit(): no module found" );
388 742 : return eUnit;
389 : }
390 :
391 800 : FieldUnit SfxModule::GetFieldUnit() const
392 : {
393 800 : FieldUnit eUnit = FUNIT_INCH;
394 800 : const SfxPoolItem* pItem = GetItem( SID_ATTR_METRIC );
395 800 : if ( pItem )
396 800 : eUnit = (FieldUnit) static_cast<const SfxUInt16Item*>(pItem)->GetValue();
397 800 : return eUnit;
398 951 : }
399 :
400 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|