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