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