tdf#79049 speed up OOXML workbook load
we spend a lot of time in ScAttrArray::GetLastVisibleAttr
which appears to be very expensive for this worksheet.
This is re-computed every time we enter SfxBaseModel::getArgs
Reduce the recomputation by introducing a new method which
only retrieves specific SfxBaseModel arguments.
This takes the load time from 5m9 to 1m9 for me.
Change-Id: I605fae0faa94760c7d6993877c9559ea5dc813cd
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/114905
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
diff --git a/framework/source/fwe/helper/titlehelper.cxx b/framework/source/fwe/helper/titlehelper.cxx
index 24d1eb3..ae9c1f3 100644
--- a/framework/source/fwe/helper/titlehelper.cxx
+++ b/framework/source/fwe/helper/titlehelper.cxx
@@ -28,6 +28,7 @@
#include <com/sun/star/frame/XStorable.hpp>
#include <com/sun/star/frame/ModuleManager.hpp>
#include <com/sun/star/frame/XUntitledNumbers.hpp>
#include <com/sun/star/frame/XModel3.hpp>
#include <com/sun/star/document/XDocumentEventBroadcaster.hpp>
#include <unotools/configmgr.hxx>
@@ -302,7 +303,7 @@ void TitleHelper::impl_sendTitleChangedEvent ()
void TitleHelper::impl_updateTitle (bool init)
{
css::uno::Reference< css::frame::XModel > xModel;
css::uno::Reference< css::frame::XModel3 > xModel;
css::uno::Reference< css::frame::XController > xController;
css::uno::Reference< css::frame::XFrame > xFrame;
// SYNCHRONIZED ->
@@ -329,7 +330,7 @@ void TitleHelper::impl_updateTitle (bool init)
}
}
void TitleHelper::impl_updateTitleForModel (const css::uno::Reference< css::frame::XModel >& xModel, bool init)
void TitleHelper::impl_updateTitleForModel (const css::uno::Reference< css::frame::XModel3 >& xModel, bool init)
{
css::uno::Reference< css::uno::XInterface > xOwner;
css::uno::Reference< css::frame::XUntitledNumbers > xNumbers;
@@ -363,7 +364,7 @@ void TitleHelper::impl_updateTitleForModel (const css::uno::Reference< css::fram
if (xURLProvider.is())
sURL = xURLProvider->getLocation ();
utl::MediaDescriptor aDescriptor(xModel->getArgs());
utl::MediaDescriptor aDescriptor(xModel->getArgs2( { utl::MediaDescriptor::PROP_SUGGESTEDSAVEASNAME() } ));
const OUString sSuggestedSaveAsName = aDescriptor.getUnpackedValueOrDefault(
utl::MediaDescriptor::PROP_SUGGESTEDSAVEASNAME(), OUString());
diff --git a/framework/source/services/autorecovery.cxx b/framework/source/services/autorecovery.cxx
index 085b627..3fdf6c0 100644
--- a/framework/source/services/autorecovery.cxx
+++ b/framework/source/services/autorecovery.cxx
@@ -34,7 +34,7 @@
#include <com/sun/star/frame/Desktop.hpp>
#include <com/sun/star/frame/theGlobalEventBroadcaster.hpp>
#include <com/sun/star/frame/XLoadable.hpp>
#include <com/sun/star/frame/XModel2.hpp>
#include <com/sun/star/frame/XModel3.hpp>
#include <com/sun/star/frame/ModuleManager.hpp>
#include <com/sun/star/frame/XTitle.hpp>
#include <com/sun/star/frame/XFrame.hpp>
@@ -636,7 +636,7 @@ private:
@threadsafe
*/
void implts_registerDocument(const css::uno::Reference< css::frame::XModel >& xDocument);
void implts_registerDocument(const css::uno::Reference< css::frame::XModel3 >& xDocument);
/** @short remove the specified document from our internal document list.
@@ -1537,7 +1537,7 @@ void SAL_CALL AutoRecovery::removeStatusListener(const css::uno::Reference< css:
void SAL_CALL AutoRecovery::documentEventOccured(const css::document::DocumentEvent& aEvent)
{
css::uno::Reference< css::frame::XModel > xDocument(aEvent.Source, css::uno::UNO_QUERY);
css::uno::Reference< css::frame::XModel3 > xDocument(aEvent.Source, css::uno::UNO_QUERY);
// new document => put it into the internal list
if (
@@ -2361,7 +2361,7 @@ IMPL_LINK_NOARG(AutoRecovery, implts_asyncDispatch, LinkParamNone*, void)
}
}
void AutoRecovery::implts_registerDocument(const css::uno::Reference< css::frame::XModel >& xDocument)
void AutoRecovery::implts_registerDocument(const css::uno::Reference< css::frame::XModel3 > & xDocument)
{
// ignore corrupted events, where no document is given ... Runtime Error ?!
if (!xDocument.is())
@@ -2386,7 +2386,7 @@ void AutoRecovery::implts_registerDocument(const css::uno::Reference< css::frame
aCacheLock.unlock();
utl::MediaDescriptor lDescriptor(xDocument->getArgs());
utl::MediaDescriptor lDescriptor(xDocument->getArgs2( { utl::MediaDescriptor::PROP_FILTERNAME(), utl::MediaDescriptor::PROP_NOAUTOSAVE() } ));
// check if this document must be ignored for recovery !
// Some use cases don't wish support for AutoSave/Recovery ... as e.g. OLE-Server / ActiveX Control etcpp.
@@ -4004,11 +4004,11 @@ void AutoRecovery::implts_verifyCacheAgainstDesktopDocumentList()
// extract the model from the frame.
// Ignore "view only" frames, which does not have a model.
css::uno::Reference< css::frame::XController > xController;
css::uno::Reference< css::frame::XModel > xModel;
css::uno::Reference< css::frame::XModel3 > xModel;
xController = xFrame->getController();
if (xController.is())
xModel = xController->getModel();
xModel.set( xController->getModel(), UNO_QUERY_THROW );
if (!xModel.is())
continue;
diff --git a/include/framework/titlehelper.hxx b/include/framework/titlehelper.hxx
index 1152cf1..9332281 100644
--- a/include/framework/titlehelper.hxx
+++ b/include/framework/titlehelper.hxx
@@ -37,7 +37,7 @@
namespace com::sun::star::frame { class XController; }
namespace com::sun::star::frame { class XFrame; }
namespace com::sun::star::frame { class XModel; }
namespace com::sun::star::frame { class XModel3; }
namespace com::sun::star::frame { class XUntitledNumbers; }
namespace com::sun::star::uno { class XComponentContext; }
namespace com::sun::star::uno { class XInterface; }
@@ -138,7 +138,7 @@ class FWK_DLLPUBLIC TitleHelper final : private ::cppu::BaseMutex
void impl_sendTitleChangedEvent ();
void impl_updateTitle (bool init = false);
void impl_updateTitleForModel (const css::uno::Reference< css::frame::XModel >& xModel, bool init);
void impl_updateTitleForModel (const css::uno::Reference< css::frame::XModel3 >& xModel, bool init);
void impl_updateTitleForController (const css::uno::Reference< css::frame::XController >& xController, bool init);
void impl_updateTitleForFrame (const css::uno::Reference< css::frame::XFrame >& xFrame, bool init);
diff --git a/include/sfx2/objsh.hxx b/include/sfx2/objsh.hxx
index 5d95f29..dfdd240 100644
--- a/include/sfx2/objsh.hxx
+++ b/include/sfx2/objsh.hxx
@@ -26,6 +26,7 @@
#include <vcl/errcode.hxx>
#include <com/sun/star/uno/Reference.h>
#include <com/sun/star/uno/Sequence.hxx>
#include <com/sun/star/frame/XModel3.hpp>
#include <vcl/bitmapex.hxx>
#include <svl/poolitem.hxx>
@@ -565,11 +566,11 @@ public:
virtual SfxObjectShell* GetObjectShell() override;
css::uno::Reference< css::frame::XModel >
css::uno::Reference< css::frame::XModel3 >
GetModel() const;
// Only temporarily for the applications!
void SetBaseModel( SfxBaseModel* pModel );
css::uno::Reference< css::frame::XModel > GetBaseModel() const;
css::uno::Reference< css::frame::XModel3 > GetBaseModel() const;
// Only temporarily for the applications!
virtual css::uno::Sequence< OUString > GetEventNames();
diff --git a/include/sfx2/sfxbasemodel.hxx b/include/sfx2/sfxbasemodel.hxx
index 8fa52fb..d2b50b6 100644
--- a/include/sfx2/sfxbasemodel.hxx
+++ b/include/sfx2/sfxbasemodel.hxx
@@ -41,7 +41,7 @@
#include <com/sun/star/document/XStorageBasedDocument.hpp>
#include <com/sun/star/document/XScriptInvocationContext.hpp>
#include <com/sun/star/lang/XEventListener.hpp>
#include <com/sun/star/frame/XModel2.hpp>
#include <com/sun/star/frame/XModel3.hpp>
#include <com/sun/star/util/XModifiable2.hpp>
#include <com/sun/star/util/XCloseable.hpp>
#include <com/sun/star/view/XPrintable.hpp>
@@ -124,7 +124,7 @@ typedef ::cppu::WeakImplHelper < css::container::XChild
, css::document::XEventsSupplier
, css::document::XEmbeddedScripts
, css::document::XScriptInvocationContext
, css::frame::XModel2
, css::frame::XModel3
, css::util::XModifiable2
, css::view::XPrintable
, css::view::XPrintJobBroadcaster
@@ -329,6 +329,10 @@ public:
virtual void SAL_CALL setArgs(const css::uno::Sequence<css::beans::PropertyValue>& aArgs) override;
// XModel3
virtual css::uno::Sequence< css::beans::PropertyValue > SAL_CALL getArgs2( const css::uno::Sequence< OUString > & requestedArgs ) override;
// XModifiable2
diff --git a/offapi/UnoApi_offapi.mk b/offapi/UnoApi_offapi.mk
index 21adff7..c958419 100644
--- a/offapi/UnoApi_offapi.mk
+++ b/offapi/UnoApi_offapi.mk
@@ -2643,6 +2643,7 @@ $(eval $(call gb_UnoApi_add_idlfiles,offapi,com/sun/star/frame,\
XMenuBarMergingAcceptor \
XModel \
XModel2 \
XModel3 \
XModule \
XModuleManager \
XModuleManager2 \
diff --git a/offapi/com/sun/star/frame/XModel3.idl b/offapi/com/sun/star/frame/XModel3.idl
new file mode 100644
index 0000000..96c527d2
--- /dev/null
+++ b/offapi/com/sun/star/frame/XModel3.idl
@@ -0,0 +1,51 @@
/* -*- 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 .
*/
#ifndef __com_sun_star_frame_XModel3_idl__
#define __com_sun_star_frame_XModel3_idl__
#include <com/sun/star/frame/XModel2.idl>
module com { module sun { module star { module frame {
/** extends interface XModel2 with optimised read access getArgs().
*/
interface XModel3 : com::sun::star::frame::XModel2
{
/** Provides optimised read access
(so we don't need to fetch expensive properties that we are not interested in)
on currently representation of the
com::sun::star::document::MediaDescriptor
of this model which describes the model and its state.
Returns only the selected args.
@param requestedArgs
@returns the requested and possibly some more arguments with which the model was originally created or
stored the last time.
*/
sequence< com::sun::star::beans::PropertyValue > getArgs2([in] sequence< string > requestedArgs);
};
}; }; }; };
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/qa/unit/copy_paste_test.cxx b/sc/qa/unit/copy_paste_test.cxx
index ba5d0a2..b9476b0 100644
--- a/sc/qa/unit/copy_paste_test.cxx
+++ b/sc/qa/unit/copy_paste_test.cxx
@@ -94,7 +94,7 @@ void ScCopyPasteTest::testCopyPasteXLS()
ScDocShellRef xDocSh = loadDoc(u"chartx2.", FORMAT_XLS);
CPPUNIT_ASSERT_MESSAGE("Failed to load chartx2.xls.", xDocSh.is());
uno::Reference< frame::XModel2 > xModel2 ( xDocSh->GetModel(), UNO_QUERY );
uno::Reference< frame::XModel2 > xModel2 = xDocSh->GetModel();
CPPUNIT_ASSERT( xModel2.is() );
Reference< frame::XController2 > xController = xModel2->createDefaultViewController( xTargetFrame );
@@ -217,7 +217,7 @@ void ScCopyPasteTest::testTdf84411()
ScDocShellRef xDocSh = dynamic_cast<ScDocShell*>(pFoundShell);
CPPUNIT_ASSERT(xDocSh);
uno::Reference< frame::XModel2 > xModel2 ( xDocSh->GetModel(), UNO_QUERY );
uno::Reference< frame::XModel2 > xModel2 = xDocSh->GetModel();
CPPUNIT_ASSERT( xModel2.is() );
Reference< frame::XController2 > xController = xModel2->createDefaultViewController( xTargetFrame );
@@ -286,7 +286,7 @@ void ScCopyPasteTest::testTdf124565()
Reference< frame::XFrame > xTargetFrame = xDesktop->findFrame( "_blank", 0 );
CPPUNIT_ASSERT( xTargetFrame.is() );
uno::Reference< frame::XModel2 > xModel2 ( xDocSh->GetModel(), UNO_QUERY );
uno::Reference< frame::XModel2 > xModel2 = xDocSh->GetModel();
CPPUNIT_ASSERT( xModel2.is() );
Reference< frame::XController2 > xController = xModel2->createDefaultViewController( xTargetFrame );
@@ -357,7 +357,7 @@ void ScCopyPasteTest::testTdf126421()
ScDocShellRef xDocSh = dynamic_cast<ScDocShell*>(pFoundShell);
CPPUNIT_ASSERT(xDocSh);
uno::Reference<frame::XModel2> xModel2(xDocSh->GetModel(), UNO_QUERY);
uno::Reference<frame::XModel2> xModel2 = xDocSh->GetModel();
CPPUNIT_ASSERT(xModel2.is());
Reference<frame::XController2> xController = xModel2->createDefaultViewController(xTargetFrame);
@@ -477,7 +477,7 @@ ScDocShellRef ScCopyPasteTest::loadDocAndSetupModelViewController(std::u16string
ScDocShellRef xDocSh = loadDoc(rFileName, nFormat, bReadWrite);
CPPUNIT_ASSERT_MESSAGE(OString("Failed to load " + OUStringToOString(rFileName, RTL_TEXTENCODING_UTF8)).getStr(), xDocSh.is());
uno::Reference< frame::XModel2 > xModel2(xDocSh->GetModel(), UNO_QUERY);
uno::Reference< frame::XModel2 > xModel2 = xDocSh->GetModel();
CPPUNIT_ASSERT(xModel2.is());
Reference< frame::XController2 > xController = xModel2->createDefaultViewController(xTargetFrame);
diff --git a/sd/qa/unit/misc-tests.cxx b/sd/qa/unit/misc-tests.cxx
index 6329ca3..1ba7d21a 100644
--- a/sd/qa/unit/misc-tests.cxx
+++ b/sd/qa/unit/misc-tests.cxx
@@ -157,7 +157,7 @@ sd::DrawDocShellRef SdMiscTest::Load(const OUString& rURL, sal_Int32 nFormat)
sd::DrawDocShellRef xDocSh = loadURL(rURL, nFormat);
CPPUNIT_ASSERT_MESSAGE("Failed to load file.", xDocSh.is());
uno::Reference< frame::XModel2 > xModel2(xDocSh->GetModel(), uno::UNO_QUERY);
uno::Reference< frame::XModel2 > xModel2 = xDocSh->GetModel();
CPPUNIT_ASSERT(xModel2.is());
uno::Reference< frame::XController2 > xController = xModel2->createDefaultViewController(xTargetFrame);
diff --git a/sfx2/source/doc/objmisc.cxx b/sfx2/source/doc/objmisc.cxx
index 81298eb..18042c7e 100644
--- a/sfx2/source/doc/objmisc.cxx
+++ b/sfx2/source/doc/objmisc.cxx
@@ -1871,48 +1871,48 @@ bool SfxObjectShell::IsContinueImportOnFilterExceptions(std::u16string_view aErr
bool SfxObjectShell::isEditDocLocked() const
{
Reference<XModel> xModel = GetModel();
Reference<XModel3> xModel = GetModel();
if (!xModel.is())
return false;
if (!officecfg::Office::Common::Misc::AllowEditReadonlyDocs::get())
return true;
comphelper::NamedValueCollection aArgs(xModel->getArgs());
comphelper::NamedValueCollection aArgs(xModel->getArgs2( { "LockEditDoc" } ));
return aArgs.getOrDefault("LockEditDoc", false);
}
bool SfxObjectShell::isContentExtractionLocked() const
{
Reference<XModel> xModel = GetModel();
Reference<XModel3> xModel = GetModel();
if (!xModel.is())
return false;
comphelper::NamedValueCollection aArgs(xModel->getArgs());
comphelper::NamedValueCollection aArgs(xModel->getArgs2( { "LockContentExtraction" } ));
return aArgs.getOrDefault("LockContentExtraction", false);
}
bool SfxObjectShell::isExportLocked() const
{
Reference<XModel> xModel = GetModel();
Reference<XModel3> xModel = GetModel();
if (!xModel.is())
return false;
comphelper::NamedValueCollection aArgs(xModel->getArgs());
comphelper::NamedValueCollection aArgs(xModel->getArgs2( { "LockExport" } ));
return aArgs.getOrDefault("LockExport", false);
}
bool SfxObjectShell::isPrintLocked() const
{
Reference<XModel> xModel = GetModel();
Reference<XModel3> xModel = GetModel();
if (!xModel.is())
return false;
comphelper::NamedValueCollection aArgs(xModel->getArgs());
comphelper::NamedValueCollection aArgs(xModel->getArgs2( { "LockPrint" } ));
return aArgs.getOrDefault("LockPrint", false);
}
bool SfxObjectShell::isSaveLocked() const
{
Reference<XModel> xModel = GetModel();
Reference<XModel3> xModel = GetModel();
if (!xModel.is())
return false;
comphelper::NamedValueCollection aArgs(xModel->getArgs());
comphelper::NamedValueCollection aArgs(xModel->getArgs2( { "LockSave" } ));
return aArgs.getOrDefault("LockSave", false);
}
diff --git a/sfx2/source/doc/objxtor.cxx b/sfx2/source/doc/objxtor.cxx
index 6c6c785..70b2e1e 100644
--- a/sfx2/source/doc/objxtor.cxx
+++ b/sfx2/source/doc/objxtor.cxx
@@ -827,7 +827,7 @@ uno::Sequence< OUString > SfxObjectShell::GetEventNames()
}
css::uno::Reference< css::frame::XModel > SfxObjectShell::GetModel() const
css::uno::Reference< css::frame::XModel3 > SfxObjectShell::GetModel() const
{
return GetBaseModel();
}
@@ -843,7 +843,7 @@ void SfxObjectShell::SetBaseModel( SfxBaseModel* pModel )
}
css::uno::Reference< css::frame::XModel > SfxObjectShell::GetBaseModel() const
css::uno::Reference< css::frame::XModel3 > SfxObjectShell::GetBaseModel() const
{
return pImpl->pBaseModel;
}
diff --git a/sfx2/source/doc/sfxbasemodel.cxx b/sfx2/source/doc/sfxbasemodel.cxx
index fa5d405..0af671f 100644
--- a/sfx2/source/doc/sfxbasemodel.cxx
+++ b/sfx2/source/doc/sfxbasemodel.cxx
@@ -931,9 +931,15 @@ OUString SAL_CALL SfxBaseModel::getURL()
// frame::XModel
Sequence< beans::PropertyValue > SAL_CALL SfxBaseModel::getArgs()
{
return getArgs2({});
}
// frame::XModel3
Sequence< beans::PropertyValue > SAL_CALL SfxBaseModel::getArgs2(const Sequence<OUString> & requestedArgsSeq )
{
SfxModelGuard aGuard( *this );
if (!SfxApplication::Get()) // tdf#113755
@@ -942,6 +948,10 @@ Sequence< beans::PropertyValue > SAL_CALL SfxBaseModel::getArgs()
return m_pData->m_seqArguments;
}
std::set<std::u16string_view> requestedArgs;
for (OUString const & s : requestedArgsSeq)
requestedArgs.insert(s);
if ( m_pData->m_pObjectShell.is() )
{
Sequence< beans::PropertyValue > seqArgsNew;
@@ -958,67 +968,79 @@ Sequence< beans::PropertyValue > SAL_CALL SfxBaseModel::getArgs()
sal_Int32 nNewLength = seqArgsNew.getLength();
// "WinExtent" property should be updated always.
// We can store it now to overwrite an old value
// since it is not from ItemSet
tools::Rectangle aTmpRect = m_pData->m_pObjectShell->GetVisArea( ASPECT_CONTENT );
aTmpRect = OutputDevice::LogicToLogic(aTmpRect, MapMode(m_pData->m_pObjectShell->GetMapUnit()), MapMode(MapUnit::Map100thMM));
Sequence< sal_Int32 > aRectSeq(4);
aRectSeq[0] = aTmpRect.Left();
aRectSeq[1] = aTmpRect.Top();
aRectSeq[2] = aTmpRect.IsWidthEmpty() ? aTmpRect.Left() : aTmpRect.Right();
aRectSeq[3] = aTmpRect.IsHeightEmpty() ? aTmpRect.Top() : aTmpRect.Bottom();
seqArgsNew.realloc( ++nNewLength );
seqArgsNew[ nNewLength - 1 ].Name = "WinExtent";
seqArgsNew[ nNewLength - 1 ].Value <<= aRectSeq;
if ( !m_pData->m_aPreusedFilterName.isEmpty() )
if (requestedArgs.empty() || requestedArgs.count(u"WinExtent"))
{
seqArgsNew.realloc( ++nNewLength );
seqArgsNew[ nNewLength - 1 ].Name = "PreusedFilterName";
seqArgsNew[ nNewLength - 1 ].Value <<= m_pData->m_aPreusedFilterName;
}
// "WinExtent" property should be updated always.
// We can store it now to overwrite an old value
// since it is not from ItemSet
tools::Rectangle aTmpRect = m_pData->m_pObjectShell->GetVisArea( ASPECT_CONTENT );
aTmpRect = OutputDevice::LogicToLogic(aTmpRect, MapMode(m_pData->m_pObjectShell->GetMapUnit()), MapMode(MapUnit::Map100thMM));
SfxViewFrame* pFrame = SfxViewFrame::GetFirst( m_pData->m_pObjectShell.get() );
if ( pFrame )
{
SvBorder aBorder = pFrame->GetBorderPixelImpl();
Sequence< sal_Int32 > aBorderSeq(4);
aBorderSeq[0] = aBorder.Left();
aBorderSeq[1] = aBorder.Top();
aBorderSeq[2] = aBorder.Right();
aBorderSeq[3] = aBorder.Bottom();
Sequence< sal_Int32 > aRectSeq(4);
aRectSeq[0] = aTmpRect.Left();
aRectSeq[1] = aTmpRect.Top();
aRectSeq[2] = aTmpRect.IsWidthEmpty() ? aTmpRect.Left() : aTmpRect.Right();
aRectSeq[3] = aTmpRect.IsHeightEmpty() ? aTmpRect.Top() : aTmpRect.Bottom();
seqArgsNew.realloc( ++nNewLength );
seqArgsNew[ nNewLength - 1 ].Name = "DocumentBorder";
seqArgsNew[ nNewLength - 1 ].Value <<= aBorderSeq;
seqArgsNew[ nNewLength - 1 ].Name = "WinExtent";
seqArgsNew[ nNewLength - 1 ].Value <<= aRectSeq;
}
// only the values that are not supported by the ItemSet must be cached here
Sequence< beans::PropertyValue > aFinalCache;
sal_Int32 nFinalLength = 0;
for ( const auto& rOrg : std::as_const(m_pData->m_seqArguments) )
if (requestedArgs.empty() || requestedArgs.count(u"PreusedFilterName"))
{
auto bNew = std::none_of(seqArgsOld.begin(), seqArgsOld.end(),
[&rOrg](const beans::PropertyValue& rOld){ return rOld.Name == rOrg.Name; });
if ( bNew )
if ( !m_pData->m_aPreusedFilterName.isEmpty() )
{
// the entity with this name should be new for seqArgsNew
// since it is not supported by transformer
seqArgsNew.realloc( ++nNewLength );
seqArgsNew[ nNewLength - 1 ] = rOrg;
aFinalCache.realloc( ++nFinalLength );
aFinalCache[ nFinalLength - 1 ] = rOrg;
seqArgsNew[ nNewLength - 1 ].Name = "PreusedFilterName";
seqArgsNew[ nNewLength - 1 ].Value <<= m_pData->m_aPreusedFilterName;
}
}
m_pData->m_seqArguments = aFinalCache;
if (requestedArgs.empty() || requestedArgs.count(u"DocumentBorder"))
{
SfxViewFrame* pFrame = SfxViewFrame::GetFirst( m_pData->m_pObjectShell.get() );
if ( pFrame )
{
SvBorder aBorder = pFrame->GetBorderPixelImpl();
Sequence< sal_Int32 > aBorderSeq(4);
aBorderSeq[0] = aBorder.Left();
aBorderSeq[1] = aBorder.Top();
aBorderSeq[2] = aBorder.Right();
aBorderSeq[3] = aBorder.Bottom();
seqArgsNew.realloc( ++nNewLength );
seqArgsNew[ nNewLength - 1 ].Name = "DocumentBorder";
seqArgsNew[ nNewLength - 1 ].Value <<= aBorderSeq;
}
}
if (requestedArgs.empty())
{
// only the values that are not supported by the ItemSet must be cached here
Sequence< beans::PropertyValue > aFinalCache;
sal_Int32 nFinalLength = 0;
for ( const auto& rOrg : std::as_const(m_pData->m_seqArguments) )
{
auto bNew = std::none_of(seqArgsOld.begin(), seqArgsOld.end(),
[&rOrg](const beans::PropertyValue& rOld){ return rOld.Name == rOrg.Name; });
if ( bNew )
{
// the entity with this name should be new for seqArgsNew
// since it is not supported by transformer
seqArgsNew.realloc( ++nNewLength );
seqArgsNew[ nNewLength - 1 ] = rOrg;
aFinalCache.realloc( ++nFinalLength );
aFinalCache[ nFinalLength - 1 ] = rOrg;
}
}
m_pData->m_seqArguments = aFinalCache;
}
return seqArgsNew;
}
@@ -4228,7 +4250,7 @@ Reference< frame::XController2 > SAL_CALL SfxBaseModel::createViewController(
pBaseController->SetCreationArguments_Impl( i_rArguments );
// some initial view settings, coming from our most recent attachResource call
::comphelper::NamedValueCollection aDocumentLoadArgs( getArgs() );
::comphelper::NamedValueCollection aDocumentLoadArgs( getArgs2( { "ViewOnly", "PluginMode" } ) );
if ( aDocumentLoadArgs.getOrDefault( "ViewOnly", false ) )
pViewFrame->GetFrame().SetMenuBarOn_Impl( false );
diff --git a/sfx2/source/view/frame2.cxx b/sfx2/source/view/frame2.cxx
index 3e96664..990f46a 100644
--- a/sfx2/source/view/frame2.cxx
+++ b/sfx2/source/view/frame2.cxx
@@ -381,7 +381,7 @@ bool SfxFrame::IsMenuBarOn_Impl() const
void SfxFrame::PrepareForDoc_Impl( SfxObjectShell& i_rDoc )
{
const ::comphelper::NamedValueCollection aDocumentArgs( i_rDoc.GetModel()->getArgs() );
const ::comphelper::NamedValueCollection aDocumentArgs( i_rDoc.GetModel()->getArgs2( { "Hidden", "PluginMode" } ) );
// hidden?
OSL_ENSURE( !pImpl->bHidden, "when does this happen?" );
diff --git a/sfx2/source/view/sfxbasecontroller.cxx b/sfx2/source/view/sfxbasecontroller.cxx
index a74674a..8f5bfdd 100644
--- a/sfx2/source/view/sfxbasecontroller.cxx
+++ b/sfx2/source/view/sfxbasecontroller.cxx
@@ -1224,7 +1224,8 @@ void SfxBaseController::ConnectSfxFrame_Impl( const ConnectSfxFrame i_eConnect )
if ( i_eConnect == E_CONNECT )
{
::comphelper::NamedValueCollection aDocumentArgs( getModel()->getArgs() );
css::uno::Reference<css::frame::XModel3> xModel(getModel(), css::uno::UNO_QUERY_THROW);
::comphelper::NamedValueCollection aDocumentArgs( xModel->getArgs2( { "PluginMode" } ) );
const sal_Int16 nPluginMode = aDocumentArgs.getOrDefault( "PluginMode", sal_Int16( 0 ) );
const bool bHasPluginMode = ( nPluginMode != 0 );