LCOV - code coverage report
Current view: top level - sfx2/source/appl - module.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 152 167 91.0 %
Date: 2015-06-13 12:38:46 Functions: 37 44 84.1 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.11