/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define ShellClass_SfxModule #include #include #include class SfxModule_Impl { public: std::unique_ptr pSlotPool; std::unique_ptr pTbxCtrlFac; std::unique_ptr pStbCtrlFac; std::unique_ptr pFactArr; OString maResName; SfxModule_Impl(); ~SfxModule_Impl(); }; SfxModule_Impl::SfxModule_Impl() { } SfxModule_Impl::~SfxModule_Impl() { pSlotPool.reset(); pTbxCtrlFac.reset(); pStbCtrlFac.reset(); pFactArr.reset(); } SFX_IMPL_SUPERCLASS_INTERFACE(SfxModule, SfxShell) SfxModule::SfxModule(const OString& rResName, std::initializer_list pFactoryList) : pImpl(nullptr) { Construct_Impl(rResName); for (auto pFactory : pFactoryList) { if (pFactory) pFactory->SetModule_Impl( this ); } } void SfxModule::Construct_Impl(const OString& rResName) { SfxApplication *pApp = SfxApplication::GetOrCreate(); pImpl = new SfxModule_Impl; pImpl->pSlotPool.reset( new SfxSlotPool(&pApp->GetAppSlotPool_Impl()) ); pImpl->maResName = rResName; SetPool( &pApp->GetPool() ); } SfxModule::~SfxModule() { //TODO how to silence useuniqueptr if (true) { delete pImpl; } } std::locale SfxModule::GetResLocale() const { return Translate::Create(pImpl->maResName.getStr()); } SfxSlotPool* SfxModule::GetSlotPool() const { return pImpl->pSlotPool.get(); } void SfxModule::RegisterChildWindow(std::unique_ptr pFact) { DBG_ASSERT( pImpl, "No real Module!" ); if (!pImpl->pFactArr) pImpl->pFactArr.reset( new SfxChildWinFactArr_Impl ); for (size_t nFactory=0; nFactorypFactArr->size(); ++nFactory) { if (pFact->nId == (*pImpl->pFactArr)[nFactory].nId) { pImpl->pFactArr->erase( pImpl->pFactArr->begin() + nFactory ); SAL_WARN("sfx.appl", "ChildWindow registered multiple times!"); return; } } pImpl->pFactArr->push_back( std::move(pFact) ); } void SfxModule::RegisterToolBoxControl( const SfxTbxCtrlFactory& rFact ) { if (!pImpl->pTbxCtrlFac) pImpl->pTbxCtrlFac.reset( new SfxTbxCtrlFactArr_Impl ); #ifdef DBG_UTIL for ( size_t n=0; npTbxCtrlFac->size(); n++ ) { SfxTbxCtrlFactory *pF = &(*pImpl->pTbxCtrlFac)[n]; if ( pF->nTypeId == rFact.nTypeId && (pF->nSlotId == rFact.nSlotId || pF->nSlotId == 0) ) { SAL_INFO("sfx.appl", "TbxController-Registering is not clearly defined!"); } } #endif pImpl->pTbxCtrlFac->push_back( rFact ); } void SfxModule::RegisterStatusBarControl( const SfxStbCtrlFactory& rFact ) { if (!pImpl->pStbCtrlFac) pImpl->pStbCtrlFac.reset( new SfxStbCtrlFactArr_Impl ); #ifdef DBG_UTIL for ( size_t n=0; npStbCtrlFac->size(); n++ ) { SfxStbCtrlFactory *pF = &(*pImpl->pStbCtrlFac)[n]; if ( pF->nTypeId == rFact.nTypeId && (pF->nSlotId == rFact.nSlotId || pF->nSlotId == 0) ) { SAL_INFO("sfx.appl", "TbxController-Registering is not clearly defined!"); } } #endif pImpl->pStbCtrlFac->push_back( rFact ); } SfxTbxCtrlFactArr_Impl* SfxModule::GetTbxCtrlFactories_Impl() const { return pImpl->pTbxCtrlFac.get(); } SfxStbCtrlFactArr_Impl* SfxModule::GetStbCtrlFactories_Impl() const { return pImpl->pStbCtrlFac.get(); } SfxChildWinFactArr_Impl* SfxModule::GetChildWinFactories_Impl() const { return pImpl->pFactArr.get(); } VclPtr SfxModule::CreateTabPage(sal_uInt16, TabPageParent, const SfxItemSet&) { return VclPtr(); } void SfxModule::Invalidate( sal_uInt16 nId ) { for( SfxViewFrame* pFrame = SfxViewFrame::GetFirst(); pFrame; pFrame = SfxViewFrame::GetNext( *pFrame ) ) if ( pFrame->GetObjectShell()->GetModule() == this ) Invalidate_Impl( pFrame->GetBindings(), nId ); } SfxModule* SfxModule::GetActiveModule( SfxViewFrame* pFrame ) { if ( !pFrame ) pFrame = SfxViewFrame::Current(); SfxObjectShell* pSh = nullptr; if( pFrame ) pSh = pFrame->GetObjectShell(); return pSh ? pSh->GetModule() : nullptr; } FieldUnit SfxModule::GetModuleFieldUnit( css::uno::Reference< css::frame::XFrame > const & i_frame ) { ENSURE_OR_RETURN( i_frame.is(), "SfxModule::GetModuleFieldUnit: invalid frame!", FieldUnit::MM_100TH ); // find SfxViewFrame for the given XFrame SfxViewFrame* pViewFrame = SfxViewFrame::GetFirst(); while ( pViewFrame != nullptr ) { if ( pViewFrame->GetFrame().GetFrameInterface() == i_frame ) break; pViewFrame = SfxViewFrame::GetNext( *pViewFrame ); } ENSURE_OR_RETURN( pViewFrame != nullptr, "SfxModule::GetModuleFieldUnit: unable to find an SfxViewFrame for the given XFrame", FieldUnit::MM_100TH); // find the module SfxModule const * pModule = GetActiveModule( pViewFrame ); ENSURE_OR_RETURN(pModule != nullptr, "SfxModule::GetModuleFieldUnit: no SfxModule for the given frame!", FieldUnit::MM_100TH); return pModule->GetFieldUnit(); } FieldUnit SfxModule::GetCurrentFieldUnit() { FieldUnit eUnit = FieldUnit::INCH; SfxModule* pModule = GetActiveModule(); if ( pModule ) { const SfxPoolItem* pItem = pModule->GetItem( SID_ATTR_METRIC ); if ( pItem ) eUnit = static_cast(static_cast(pItem)->GetValue()); } else SAL_WARN( "sfx.appl", "GetModuleFieldUnit(): no module found" ); return eUnit; } FieldUnit SfxModule::GetFieldUnit() const { FieldUnit eUnit = FieldUnit::INCH; const SfxPoolItem* pItem = GetItem( SID_ATTR_METRIC ); if ( pItem ) eUnit = static_cast(static_cast(pItem)->GetValue()); return eUnit; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */