xref: /aoo41x/main/sfx2/source/appl/module.cxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sfx2.hxx"
30 
31 #ifndef GCC
32 #endif
33 
34 #include <stdio.h>
35 #include <tools/rcid.h>
36 
37 #include <cstdarg>
38 #include <sfx2/module.hxx>
39 #include <sfx2/app.hxx>
40 #include "arrdecl.hxx"
41 #include "sfx2/sfxresid.hxx"
42 #include <sfx2/msgpool.hxx>
43 #include <sfx2/tbxctrl.hxx>
44 #include "sfx2/stbitem.hxx"
45 #include <sfx2/mnuitem.hxx>
46 #include <sfx2/childwin.hxx>
47 #include <sfx2/mnumgr.hxx>
48 #include <sfx2/docfac.hxx>
49 #include <sfx2/objface.hxx>
50 #include <sfx2/viewfrm.hxx>
51 #include <svl/intitem.hxx>
52 #include "sfx2/taskpane.hxx"
53 #include <tools/diagnose_ex.h>
54 #include <rtl/strbuf.hxx>
55 
56 #define SfxModule
57 #include "sfxslots.hxx"
58 
59 static SfxModuleArr_Impl* pModules=0;
60 
61 class SfxModule_Impl
62 {
63 public:
64 
65 	SfxSlotPool*				pSlotPool;
66 	SfxTbxCtrlFactArr_Impl* 	pTbxCtrlFac;
67 	SfxStbCtrlFactArr_Impl* 	pStbCtrlFac;
68 	SfxMenuCtrlFactArr_Impl*	pMenuCtrlFac;
69 	SfxChildWinFactArr_Impl*	pFactArr;
70     ImageList*                  pImgListSmall;
71     ImageList*                  pImgListBig;
72 	ImageList*					pImgListHiSmall;
73 	ImageList*					pImgListHiBig;
74 
75 								SfxModule_Impl();
76 								~SfxModule_Impl();
77     ImageList*                  GetImageList( ResMgr*, sal_Bool, sal_Bool bHiContrast = sal_False );
78 };
79 
80 SfxModule_Impl::SfxModule_Impl()
81  : pSlotPool(0)
82 {
83 }
84 
85 SfxModule_Impl::~SfxModule_Impl()
86 {
87     delete pSlotPool;
88     delete pTbxCtrlFac;
89     delete pStbCtrlFac;
90     delete pMenuCtrlFac;
91     delete pFactArr;
92     delete pImgListSmall;
93     delete pImgListBig;
94     delete pImgListHiSmall;
95     delete pImgListHiBig;
96 }
97 
98 ImageList* SfxModule_Impl::GetImageList( ResMgr* pResMgr, sal_Bool bBig, sal_Bool bHiContrast )
99 {
100     ImageList*& rpList = bBig ? ( bHiContrast ? pImgListHiBig: pImgListBig ) :
101 								( bHiContrast ? pImgListHiSmall : pImgListSmall );
102     if ( !rpList )
103     {
104         ResId aResId( bBig ? ( bHiContrast ? RID_DEFAULTIMAGELIST_LCH : RID_DEFAULTIMAGELIST_LC ) :
105 							 ( bHiContrast ? RID_DEFAULTIMAGELIST_SCH : RID_DEFAULTIMAGELIST_SC ), *pResMgr );
106         aResId.SetRT( RSC_IMAGELIST );
107 
108         DBG_ASSERT( pResMgr->IsAvailable(aResId), "No default ImageList!" );
109 
110         if ( pResMgr->IsAvailable(aResId) )
111             rpList = new ImageList( aResId );
112         else
113             rpList = new ImageList();
114     }
115 
116     return rpList; }
117 
118 TYPEINIT1(SfxModule, SfxShell);
119 
120 //=========================================================================
121 
122 SFX_IMPL_INTERFACE(SfxModule,SfxShell,SfxResId(0))
123 {
124 }
125 
126 //====================================================================
127 
128 ResMgr* SfxModule::GetResMgr()
129 {
130 	return pResMgr;
131 }
132 
133 //====================================================================
134 /*
135 SfxModule::SfxModule( ResMgr* pMgrP, sal_Bool bDummyP,
136 					  SfxObjectFactory* pFactoryP )
137 	: pResMgr( pMgrP ), bDummy( bDummyP ), pImpl(0L)
138 {
139 	Construct_Impl();
140 	if ( pFactoryP )
141 		pFactoryP->SetModule_Impl( this );
142 }
143 */
144 SfxModule::SfxModule( ResMgr* pMgrP, sal_Bool bDummyP,
145 					  SfxObjectFactory* pFactoryP, ... )
146 	: pResMgr( pMgrP ), bDummy( bDummyP ), pImpl(0L)
147 {
148 	Construct_Impl();
149 	va_list pVarArgs;
150 	va_start( pVarArgs, pFactoryP );
151 	for ( SfxObjectFactory *pArg = pFactoryP; pArg;
152 		 pArg = va_arg( pVarArgs, SfxObjectFactory* ) )
153 		pArg->SetModule_Impl( this );
154 	va_end(pVarArgs);
155 }
156 
157 void SfxModule::Construct_Impl()
158 {
159 	if( !bDummy )
160 	{
161 		SfxApplication *pApp = SFX_APP();
162         SfxModuleArr_Impl& rArr = GetModules_Impl();
163 		SfxModule* pPtr = (SfxModule*)this;
164 		rArr.C40_INSERT( SfxModule, pPtr, rArr.Count() );
165 		pImpl = new SfxModule_Impl;
166 		pImpl->pSlotPool = new SfxSlotPool( &pApp->GetAppSlotPool_Impl(), pResMgr );
167 
168 		pImpl->pTbxCtrlFac=0;
169 		pImpl->pStbCtrlFac=0;
170 		pImpl->pMenuCtrlFac=0;
171 		pImpl->pFactArr=0;
172         pImpl->pImgListSmall=0;
173         pImpl->pImgListBig=0;
174         pImpl->pImgListHiSmall=0;
175         pImpl->pImgListHiBig=0;
176 
177 		SetPool( &pApp->GetPool() );
178 	}
179 }
180 
181 //====================================================================
182 
183 SfxModule::~SfxModule()
184 {
185 	if( !bDummy )
186 	{
187 		if ( SFX_APP()->Get_Impl() )
188 		{
189 			// Das Modul wird noch vor dem DeInitialize zerst"ort, also auis dem Array entfernen
190             SfxModuleArr_Impl& rArr = GetModules_Impl();
191 			for( sal_uInt16 nPos = rArr.Count(); nPos--; )
192 			{
193 				if( rArr[ nPos ] == this )
194 				{
195 					rArr.Remove( nPos );
196 					break;
197 				}
198 			}
199 
200 			delete pImpl;
201 		}
202 
203 		delete pResMgr;
204 	}
205 }
206 
207 //-------------------------------------------------------------------------
208 
209 SfxSlotPool* SfxModule::GetSlotPool() const
210 {
211 	return pImpl->pSlotPool;
212 }
213 
214 //-------------------------------------------------------------------------
215 
216 void SfxModule::RegisterChildWindow(SfxChildWinFactory *pFact)
217 {
218 	DBG_ASSERT( pImpl, "Kein echtes Modul!" );
219 
220 	if (!pImpl->pFactArr)
221 		pImpl->pFactArr = new SfxChildWinFactArr_Impl;
222 
223 //#ifdef DBG_UTIL
224 	for (sal_uInt16 nFactory=0; nFactory<pImpl->pFactArr->Count(); ++nFactory)
225 	{
226 		if (pFact->nId ==  (*pImpl->pFactArr)[nFactory]->nId)
227 		{
228 			pImpl->pFactArr->Remove( nFactory );
229 			DBG_ERROR("ChildWindow mehrfach registriert!");
230 			return;
231 		}
232 	}
233 //#endif
234 
235 	pImpl->pFactArr->C40_INSERT(
236 		SfxChildWinFactory, pFact, pImpl->pFactArr->Count() );
237 }
238 
239 //-------------------------------------------------------------------------
240 
241 void SfxModule::RegisterChildWindowContext( sal_uInt16 nId,
242 		SfxChildWinContextFactory *pFact)
243 {
244 	DBG_ASSERT( pImpl, "Kein echtes Modul!" );
245 
246 	sal_uInt16 nCount = pImpl->pFactArr->Count();
247 	for (sal_uInt16 nFactory=0; nFactory<nCount; ++nFactory)
248 	{
249 		SfxChildWinFactory *pF = (*pImpl->pFactArr)[nFactory];
250 		if ( nId == pF->nId )
251 		{
252 			if ( !pF->pArr )
253 				pF->pArr = new SfxChildWinContextArr_Impl;
254 			pF->pArr->C40_INSERT( SfxChildWinContextFactory, pFact, pF->pArr->Count() );
255 			return;
256 		}
257 	}
258 
259 	DBG_ERROR( "Kein ChildWindow fuer diesen Context!" );
260 }
261 
262 //-------------------------------------------------------------------------
263 
264 void SfxModule::RegisterToolBoxControl( SfxTbxCtrlFactory *pFact )
265 {
266 	if (!pImpl->pTbxCtrlFac)
267 		pImpl->pTbxCtrlFac = new SfxTbxCtrlFactArr_Impl;
268 
269 #ifdef DBG_UTIL
270 	for ( sal_uInt16 n=0; n<pImpl->pTbxCtrlFac->Count(); n++ )
271 	{
272 		SfxTbxCtrlFactory *pF = (*pImpl->pTbxCtrlFac)[n];
273 		if ( pF->nTypeId && pF->nTypeId == pFact->nTypeId &&
274 			(pF->nSlotId == pFact->nSlotId || pF->nSlotId == 0) )
275 		{
276 			DBG_WARNING("TbxController-Registrierung ist nicht eindeutig!");
277 		}
278 	}
279 #endif
280 
281 	pImpl->pTbxCtrlFac->C40_INSERT( SfxTbxCtrlFactory, pFact, pImpl->pTbxCtrlFac->Count() );
282 }
283 
284 //-------------------------------------------------------------------------
285 
286 void SfxModule::RegisterStatusBarControl( SfxStbCtrlFactory *pFact )
287 {
288 	if (!pImpl->pStbCtrlFac)
289 		pImpl->pStbCtrlFac = new SfxStbCtrlFactArr_Impl;
290 
291 #ifdef DBG_UTIL
292 	for ( sal_uInt16 n=0; n<pImpl->pStbCtrlFac->Count(); n++ )
293 	{
294 		SfxStbCtrlFactory *pF = (*pImpl->pStbCtrlFac)[n];
295 		if ( pF->nTypeId && pF->nTypeId == pFact->nTypeId &&
296 			(pF->nSlotId == pFact->nSlotId || pF->nSlotId == 0) )
297 		{
298 			DBG_WARNING("StbController-Registrierung ist nicht eindeutig!");
299 		}
300 	}
301 #endif
302 
303 	pImpl->pStbCtrlFac->C40_INSERT( SfxStbCtrlFactory, pFact, pImpl->pStbCtrlFac->Count() );
304 }
305 
306 //-------------------------------------------------------------------------
307 
308 void SfxModule::RegisterMenuControl( SfxMenuCtrlFactory *pFact )
309 {
310 	if (!pImpl->pMenuCtrlFac)
311 		pImpl->pMenuCtrlFac = new SfxMenuCtrlFactArr_Impl;
312 
313 #ifdef DBG_UTIL
314 	for ( sal_uInt16 n=0; n<pImpl->pMenuCtrlFac->Count(); n++ )
315 	{
316 		SfxMenuCtrlFactory *pF = (*pImpl->pMenuCtrlFac)[n];
317 		if ( pF->nTypeId && pF->nTypeId == pFact->nTypeId &&
318 			(pF->nSlotId == pFact->nSlotId || pF->nSlotId == 0) )
319 		{
320 			DBG_WARNING("MenuController-Registrierung ist nicht eindeutig!");
321 		}
322 	}
323 #endif
324 
325 	pImpl->pMenuCtrlFac->C40_INSERT( SfxMenuCtrlFactory, pFact, pImpl->pMenuCtrlFac->Count() );
326 }
327 
328 //-------------------------------------------------------------------------
329 
330 SfxTbxCtrlFactArr_Impl*  SfxModule::GetTbxCtrlFactories_Impl() const
331 {
332 	return pImpl->pTbxCtrlFac;
333 }
334 
335 //-------------------------------------------------------------------------
336 
337 SfxStbCtrlFactArr_Impl*  SfxModule::GetStbCtrlFactories_Impl() const
338 {
339 	return pImpl->pStbCtrlFac;
340 }
341 
342 //-------------------------------------------------------------------------
343 
344 SfxMenuCtrlFactArr_Impl* SfxModule::GetMenuCtrlFactories_Impl() const
345 {
346 	return pImpl->pMenuCtrlFac;
347 }
348 
349 //-------------------------------------------------------------------------
350 
351 SfxChildWinFactArr_Impl* SfxModule::GetChildWinFactories_Impl() const
352 {
353 	return pImpl->pFactArr;
354 }
355 
356 ImageList* SfxModule::GetImageList_Impl( sal_Bool bBig )
357 {
358 	return pImpl->GetImageList( pResMgr, bBig, sal_False );
359 }
360 
361 ImageList* SfxModule::GetImageList_Impl( sal_Bool bBig, sal_Bool bHiContrast )
362 {
363     return pImpl->GetImageList( pResMgr, bBig, bHiContrast );
364 }
365 
366 SfxTabPage*	SfxModule::CreateTabPage( sal_uInt16, Window*, const SfxItemSet& )
367 {
368 	return NULL;
369 }
370 
371 SfxModuleArr_Impl& SfxModule::GetModules_Impl()
372 {
373     if( !pModules )
374         pModules = new SfxModuleArr_Impl;
375     return *pModules;
376 };
377 
378 void SfxModule::DestroyModules_Impl()
379 {
380     if ( pModules )
381     {
382         SfxModuleArr_Impl& rModules = *pModules;
383         for( sal_uInt16 nPos = rModules.Count(); nPos--; )
384 	{
385 	    SfxModule* pMod = rModules.GetObject(nPos);
386 	    delete pMod;
387 	}
388     }
389 }
390 
391 void SfxModule::Invalidate( sal_uInt16 nId )
392 {
393     for( SfxViewFrame* pFrame = SfxViewFrame::GetFirst(); pFrame; pFrame = SfxViewFrame::GetNext( *pFrame ) )
394         if ( pFrame->GetObjectShell()->GetModule() == this )
395             Invalidate_Impl( pFrame->GetBindings(), nId );
396 }
397 
398 sal_Bool SfxModule::IsActive() const
399 {
400 	SfxViewFrame* pFrame = SfxViewFrame::Current();
401 	if ( pFrame && pFrame->GetObjectShell()->GetFactory().GetModule() == this )
402 		return sal_True;
403 	return sal_False;
404 }
405 
406 bool SfxModule::IsChildWindowAvailable( const sal_uInt16 i_nId, const SfxViewFrame* i_pViewFrame ) const
407 {
408     if ( i_nId != SID_TASKPANE )
409         // by default, assume it is
410         return true;
411 
412     const SfxViewFrame* pViewFrame = i_pViewFrame ? i_pViewFrame : GetFrame();
413     ENSURE_OR_RETURN( pViewFrame, "SfxModule::IsChildWindowAvailable: no frame to ask for the module identifier!", false );
414     return ::sfx2::ModuleTaskPane::ModuleHasToolPanels( pViewFrame->GetFrame().GetFrameInterface() );
415 }
416 
417 SfxModule* SfxModule::GetActiveModule( SfxViewFrame* pFrame )
418 {
419 	if ( !pFrame )
420 		pFrame = SfxViewFrame::Current();
421 	SfxObjectShell* pSh = 0;
422     if( pFrame )
423         pSh = pFrame->GetObjectShell();
424 	return pSh ? pSh->GetModule() : 0;
425 }
426 
427 FieldUnit SfxModule::GetModuleFieldUnit( ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > const & i_frame )
428 {
429     ENSURE_OR_RETURN( i_frame.is(), "SfxModule::GetModuleFieldUnit: invalid frame!", FUNIT_100TH_MM );
430 
431     // find SfxViewFrame for the given XFrame
432     SfxViewFrame* pViewFrame = SfxViewFrame::GetFirst();
433     while ( pViewFrame != NULL )
434     {
435         if ( pViewFrame->GetFrame().GetFrameInterface() == i_frame )
436             break;
437         pViewFrame = SfxViewFrame::GetNext( *pViewFrame );
438     }
439     ENSURE_OR_RETURN( pViewFrame != NULL, "SfxModule::GetModuleFieldUnit: unable to find an SfxViewFrame for the given XFrame", FUNIT_100TH_MM );
440 
441     // find the module
442     SfxModule const * pModule = GetActiveModule( pViewFrame );
443     ENSURE_OR_RETURN( pModule != NULL, "SfxModule::GetModuleFieldUnit: no SfxModule for the given frame!", FUNIT_100TH_MM );
444 
445     SfxPoolItem const * pItem = pModule->GetItem( SID_ATTR_METRIC );
446     if ( pItem == NULL )
447     {
448 #if OSL_DEBUG_LEVEL > 0
449         ::rtl::OStringBuffer message;
450         message.append( "SfxModule::GetFieldUnit: no metric item in the module implemented by '" );
451         message.append( typeid( *pModule ).name() );
452         message.append( "'!" );
453         OSL_ENSURE( false, message.makeStringAndClear().getStr() );
454 #endif
455         return FUNIT_100TH_MM;
456     }
457     return (FieldUnit)( (SfxUInt16Item*)pItem )->GetValue();
458 }
459 
460 FieldUnit SfxModule::GetCurrentFieldUnit()
461 {
462 	FieldUnit eUnit = FUNIT_INCH;
463 	SfxModule* pModule = GetActiveModule();
464 	if ( pModule )
465 	{
466 		const SfxPoolItem* pItem = pModule->GetItem( SID_ATTR_METRIC );
467 		DBG_ASSERT( pItem, "GetFieldUnit(): no item" );
468 		if ( pItem )
469 			eUnit = (FieldUnit)( (SfxUInt16Item*)pItem )->GetValue();
470 	}
471     else
472 	    DBG_ERRORFILE( "GetModuleFieldUnit(): no module found" );
473 	return eUnit;
474 }
475 
476 FieldUnit SfxModule::GetFieldUnit() const
477 {
478 	FieldUnit eUnit = FUNIT_INCH;
479 	const SfxPoolItem* pItem = GetItem( SID_ATTR_METRIC );
480 	DBG_ASSERT( pItem, "GetFieldUnit(): no item" );
481 	if ( pItem )
482 		eUnit = (FieldUnit)( (SfxUInt16Item*)pItem )->GetValue();
483 	return eUnit;
484 }
485