1
0
Fork 0
libreoffice/sd/source/ui/framework/module/ModuleController.cxx
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

162 lines
5.9 KiB
C++

/* -*- 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 <framework/ModuleController.hxx>
#include <framework/PresentationFactory.hxx>
#include <framework/factories/BasicPaneFactory.hxx>
#include <framework/factories/BasicViewFactory.hxx>
#include <framework/factories/BasicToolBarFactory.hxx>
#include <DrawController.hxx>
#include <com/sun/star/frame/XController.hpp>
#include <com/sun/star/uno/XComponentContext.hpp>
#include <com/sun/star/container/XNameAccess.hpp>
#include <tools/ConfigurationAccess.hxx>
#include <comphelper/processfactory.hxx>
#include <comphelper/diagnose_ex.hxx>
#include <rtl/ref.hxx>
#include <sal/log.hxx>
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::drawing::framework;
namespace sd::framework {
ModuleController::ModuleController(const rtl::Reference<::sd::DrawController>& rxController)
{
assert(rxController);
/** Load a list of URL to service mappings.
The mappings are stored in the
mpResourceToFactoryMap member.
*/
ProcessFactory(
u"com.sun.star.drawing.framework.BasicPaneFactory"_ustr,
{ u"private:resource/pane/CenterPane"_ustr,
u"private:resource/pane/LeftImpressPane"_ustr,
u"private:resource/pane/BottomImpressPane"_ustr,
u"private:resource/pane/LeftDrawPane"_ustr });
ProcessFactory(
u"com.sun.star.drawing.framework.BasicViewFactory"_ustr,
{ u"private:resource/view/ImpressView"_ustr,
u"private:resource/view/GraphicView"_ustr,
u"private:resource/view/OutlineView"_ustr,
u"private:resource/view/NotesView"_ustr,
u"private:resource/view/NotesPanelView"_ustr,
u"private:resource/view/HandoutView"_ustr,
u"private:resource/view/SlideSorter"_ustr,
u"private:resource/view/PresentationView"_ustr });
ProcessFactory(
u"com.sun.star.drawing.framework.BasicToolBarFactory"_ustr,
{ u"private:resource/toolbar/ViewTabBar"_ustr });
try
{
mxController = rxController;
InstantiateStartupServices();
}
catch (RuntimeException&)
{}
}
ModuleController::~ModuleController() noexcept
{
}
void ModuleController::disposing(std::unique_lock<std::mutex>&)
{
// Break the cyclic reference back to DrawController object
maLoadedFactories.clear();
maResourceToFactoryMap.clear();
mxController.clear();
}
void ModuleController::ProcessFactory (const OUString& sServiceName, ::std::vector<OUString> aURLs)
{
// Get all resource URLs that are created by the factory.
SAL_INFO("sd.fwk", __func__ << ": ModuleController::adding factory " << sServiceName);
// Add the resource URLs to the map.
for (const auto& rResource : aURLs)
{
maResourceToFactoryMap[rResource] = sServiceName;
SAL_INFO("sd.fwk", __func__ << ": " << rResource);
}
}
void ModuleController::InstantiateStartupServices()
{
try
{
// Instantiate service.
// Note that when the new object will be destroyed at the end of
// this scope when it does not register itself anywhere.
// Typically it will add itself as ConfigurationChangeListener
// at the configuration controller.
sd::framework::PresentationFactory::install(mxController);
}
catch (Exception&)
{
SAL_WARN("sd.fwk", "ERROR in ModuleController::InstantiateStartupServices");
}
}
//----- XModuleController -----------------------------------------------------
void SAL_CALL ModuleController::requestResource (const OUString& rsResourceURL)
{
auto iFactory = maResourceToFactoryMap.find(rsResourceURL);
if (iFactory == maResourceToFactoryMap.end())
return;
// Check that the factory has already been loaded and not been
// destroyed in the meantime.
Reference<XInterface> xFactory;
auto iLoadedFactory = maLoadedFactories.find(iFactory->second);
if (iLoadedFactory != maLoadedFactories.end())
xFactory.set(iLoadedFactory->second, UNO_QUERY);
if ( xFactory.is())
return;
// Create a new instance of the factory.
const Reference<uno::XComponentContext>& xContext =
::comphelper::getProcessComponentContext();
// Create the factory service.
if (iFactory->second == "com.sun.star.drawing.framework.BasicPaneFactory")
xFactory = uno::Reference<css::drawing::framework::XResourceFactory>(new BasicPaneFactory(xContext, mxController));
else if (iFactory->second == "com.sun.star.drawing.framework.BasicViewFactory")
xFactory = uno::Reference<css::drawing::framework::XResourceFactory>(new BasicViewFactory(mxController));
else if (iFactory->second == "com.sun.star.drawing.framework.BasicToolBarFactory")
xFactory = uno::Reference<css::drawing::framework::XResourceFactory>(new BasicToolBarFactory(mxController));
else
throw RuntimeException(u"unknown factory"_ustr);
// Remember that this factory has been instanced.
maLoadedFactories[iFactory->second] = xFactory;
}
} // end of namespace sd::framework
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */