xref: /core/sfx2/source/view/viewfrm.cxx (revision fdd24dabb6f8c520e8307bacab2bd8b09ebc763d)
1c1452e73STor Lillqvist /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2e2799d25SMichael Meeks /*
3e2799d25SMichael Meeks  * This file is part of the LibreOffice project.
4fd069beeSJens-Heiner Rechtien  *
5e2799d25SMichael Meeks  * This Source Code Form is subject to the terms of the Mozilla Public
6e2799d25SMichael Meeks  * License, v. 2.0. If a copy of the MPL was not distributed with this
7e2799d25SMichael Meeks  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8cbace7a9SRüdiger Timm  *
9e2799d25SMichael Meeks  * This file incorporates work covered by the following license notice:
10cbace7a9SRüdiger Timm  *
11e2799d25SMichael Meeks  *   Licensed to the Apache Software Foundation (ASF) under one or more
12e2799d25SMichael Meeks  *   contributor license agreements. See the NOTICE file distributed
13e2799d25SMichael Meeks  *   with this work for additional information regarding copyright
14e2799d25SMichael Meeks  *   ownership. The ASF licenses this file to you under the Apache
15e2799d25SMichael Meeks  *   License, Version 2.0 (the "License"); you may not use this file
16e2799d25SMichael Meeks  *   except in compliance with the License. You may obtain a copy of
17e2799d25SMichael Meeks  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18e2799d25SMichael Meeks  */
19fd069beeSJens-Heiner Rechtien 
204704acf6SLuboš Luňák #include <config_feature_desktop.h>
2102140554SArmin Le Grand (Allotropia) #include <config_wasm_strip.h>
2202140554SArmin Le Grand (Allotropia) 
2368a96f74SMike Kaganski #include <o3tl/test_info.hxx>
24236714e8SStephan Bergmann #include <osl/file.hxx>
251d39c5aaSGabor Kelemen #include <sfx2/docfilt.hxx>
2697aa108fSCédric Bosdonnat #include <sfx2/infobar.hxx>
279d90a173SHeiko Tietze #include <sfx2/sfxdlg.hxx>
284a6dc219SGabor Kelemen #include <sfx2/sfxsids.hrc>
29c6993d7fSJens-Heiner Rechtien #include <sfx2/viewfrm.hxx>
30823e8d65SMiklos Vajna #include <sfx2/classificationhelper.hxx>
313b6ee27eSXisco Fauli #include <sfx2/notebookbar/SfxNotebookBar.hxx>
321f440348SBalazs Varga #include <sfx2/pageids.hxx>
33c6f9f644SSander Vesik #include <com/sun/star/document/MacroExecMode.hpp>
34bb121c86SNoel Grandin #include <com/sun/star/frame/Desktop.hpp>
3589d4ecc1SNoel Grandin #include <com/sun/star/frame/DispatchRecorder.hpp>
369b63e4e6SNoel Grandin #include <com/sun/star/frame/DispatchRecorderSupplier.hpp>
376c1be809SKurt Zenker #include <com/sun/star/frame/XLoadable.hpp>
387dc22ef8SKurt Zenker #include <com/sun/star/frame/XLayoutManager.hpp>
3905aee339SFrank Schoenheit [fs] #include <com/sun/star/frame/XComponentLoader.hpp>
40bbd196ffSCaolán McNamara #include <com/sun/star/task/PasswordContainer.hpp>
412beaa3beSSarper Akdemir #include <com/sun/star/security/DocumentDigitalSignatures.hpp>
429a26a423SNorbert Thiebaud #include <officecfg/Office/Common.hxx>
43c3fa7a82SJan Holesovsky #include <officecfg/Setup.hxx>
445cb2e310SThomas Arnhold #include <toolkit/helper/vclunohelper.hxx>
452cd6ff8aSCaolán McNamara #include <vcl/wrkwin.hxx>
46bff284e2SMathias Bauer #include <unotools/moduleoptions.hxx>
479f2fde7aSMathias Bauer #include <svl/intitem.hxx>
481cf2a482SFrank Schoenheit [fs] #include <svl/visitem.hxx>
499f2fde7aSMathias Bauer #include <svl/stritem.hxx>
509f2fde7aSMathias Bauer #include <svl/eitem.hxx>
519f2fde7aSMathias Bauer #include <svl/whiter.hxx>
529f2fde7aSMathias Bauer #include <svl/undo.hxx>
5361e4f850SCaolán McNamara #include <vcl/help.hxx>
5428fc9860SCaolán McNamara #include <vcl/stdtext.hxx>
556a4c464bSCaolán McNamara #include <vcl/weld.hxx>
5683d91ebbSTomaž Vajngerl #include <vcl/weldutils.hxx>
5702140554SArmin Le Grand (Allotropia) #if !ENABLE_WASM_STRIP_PINGUSER
5807e269f2Shomeboy445 #include <unotools/VersionConfig.hxx>
5902140554SArmin Le Grand (Allotropia) #endif
60f41627abSSamuel Mehrbrodt #include <unotools/securityoptions.hxx>
61e89fdd12SMichael Meeks #include <svtools/miscopt.hxx>
6291ba9654SStephan Bergmann #include <comphelper/diagnose_ex.hxx>
632a044205SRüdiger Timm #include <com/sun/star/container/XIndexAccess.hpp>
64fd069beeSJens-Heiner Rechtien #include <com/sun/star/frame/XFramesSupplier.hpp>
65fd069beeSJens-Heiner Rechtien #include <com/sun/star/frame/FrameSearchFlag.hpp>
66fd069beeSJens-Heiner Rechtien #include <com/sun/star/frame/XFrame.hpp>
67fd069beeSJens-Heiner Rechtien #include <com/sun/star/awt/XWindow.hpp>
68fd069beeSJens-Heiner Rechtien #include <com/sun/star/frame/XController.hpp>
690fcd1a73SNoel Grandin #include <com/sun/star/util/URLTransformer.hpp>
7021be778cSMathias Bauer #include <com/sun/star/util/XURLTransformer.hpp>
7105aee339SFrank Schoenheit [fs] #include <com/sun/star/util/XCloseable.hpp>
728f826827SMathias Bauer #include <com/sun/star/frame/XDispatchRecorderSupplier.hpp>
73164da69aSJens-Heiner Rechtien #include <com/sun/star/document/UpdateDocMode.hpp>
7468a4deacSRüdiger Timm #include <com/sun/star/beans/XPropertySet.hpp>
755aa2cd1dSNoel Grandin #include <com/sun/star/uri/UriReferenceFactory.hpp>
7641caf02eSOliver Bolte #include <com/sun/star/uri/XVndSunStarScriptUrl.hpp>
777c006c81SFrank Schoenheit [fs] #include <com/sun/star/document/XViewDataSupplier.hpp>
787c006c81SFrank Schoenheit [fs] #include <com/sun/star/container/XIndexContainer.hpp>
79dc00ad1eSNoel Grandin #include <com/sun/star/task/InteractionHandler.hpp>
808a07588cSMiklos Vajna #include <com/sun/star/drawing/XDrawView.hpp>
818a07588cSMiklos Vajna #include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
828f826827SMathias Bauer #include <rtl/ustrbuf.hxx>
83b5867945SGabor Kelemen #include <sal/log.hxx>
84a2c09afeSMatt K #include <com/sun/star/frame/ModuleManager.hpp>
85fd069beeSJens-Heiner Rechtien 
86ac49eeddSIvo Hinkelmann #include <unotools/ucbhelper.hxx>
870e8d0fe0SPranav Kant #include <comphelper/lok.hxx>
8821be778cSMathias Bauer #include <comphelper/processfactory.hxx>
8905aee339SFrank Schoenheit [fs] #include <comphelper/namedvaluecollection.hxx>
902005bc7bSThomas Lange [tl] #include <comphelper/docpasswordrequest.hxx>
913d2a5111SMikhail Voytenko #include <comphelper/docpasswordhelper.hxx>
922a044205SRüdiger Timm 
93fd069beeSJens-Heiner Rechtien #include <com/sun/star/uno/Reference.h>
94fd069beeSJens-Heiner Rechtien 
958f826827SMathias Bauer #include <basic/basmgr.hxx>
968f826827SMathias Bauer #include <basic/sbmod.hxx>
978f826827SMathias Bauer #include <basic/sbmeth.hxx>
9800657aefSCaolán McNamara #include <svtools/strings.hrc>
99a4feeebdSCaolán McNamara #include <svtools/svtresid.hxx>
10096775610SMikhail Voytenko #include <framework/framelistanalyzer.hxx>
1018f826827SMathias Bauer 
1029ad252b2SStephan Bergmann #include <optional>
1031cf2a482SFrank Schoenheit [fs] 
104a201ab6fSMiklos Vajna #include <comphelper/sequenceashashmap.hxx>
10517d981d7SChristian Lohmaier 
10683d91ebbSTomaž Vajngerl #include <commandpopup/CommandPopup.hxx>
10783d91ebbSTomaž Vajngerl 
108f5f7b4efSAlbert Thuswaldner // Due to ViewFrame::Current
1091c46c7a0SStephan Bergmann #include <appdata.hxx>
110c6993d7fSJens-Heiner Rechtien #include <sfx2/app.hxx>
111c6993d7fSJens-Heiner Rechtien #include <sfx2/objface.hxx>
1121c46c7a0SStephan Bergmann #include <openflag.hxx>
1131c46c7a0SStephan Bergmann #include <objshimp.hxx>
114c6993d7fSJens-Heiner Rechtien #include <sfx2/viewsh.hxx>
115c6993d7fSJens-Heiner Rechtien #include <sfx2/objsh.hxx>
116c6993d7fSJens-Heiner Rechtien #include <sfx2/bindings.hxx>
117c6993d7fSJens-Heiner Rechtien #include <sfx2/dispatch.hxx>
118c6993d7fSJens-Heiner Rechtien #include <sfx2/request.hxx>
119c6993d7fSJens-Heiner Rechtien #include <sfx2/docfac.hxx>
120c6993d7fSJens-Heiner Rechtien #include <sfx2/ipclient.hxx>
1219a26a423SNorbert Thiebaud #include <sfx2/sfxresid.hxx>
1229a26a423SNorbert Thiebaud #include <sfx2/viewfac.hxx>
123c6993d7fSJens-Heiner Rechtien #include <sfx2/event.hxx>
12402a3f860SNoel Grandin #include <sfx2/fcontnr.hxx>
125c6993d7fSJens-Heiner Rechtien #include <sfx2/docfile.hxx>
126c6993d7fSJens-Heiner Rechtien #include <sfx2/module.hxx>
127c6993d7fSJens-Heiner Rechtien #include <sfx2/sfxuno.hxx>
128c6993d7fSJens-Heiner Rechtien #include <sfx2/progress.hxx>
129a836afe4SSamuel Mehrbrodt #include <sfx2/sidebar/Sidebar.hxx>
1301c46c7a0SStephan Bergmann #include <workwin.hxx>
1319a26a423SNorbert Thiebaud #include <sfx2/minfitem.hxx>
1321c46c7a0SStephan Bergmann #include <sfx2/strings.hrc>
133419e42edSFrank Schoenheit [fs] #include "impviewframe.hxx"
13468c96a54SJim Raykowski #include <vcl/commandinfoprovider.hxx>
135942f0599SCaolán McNamara #include <vcl/svapp.hxx>
1369dd225eeSMiklos Vajna #include <svl/cryptosign.hxx>
137419e42edSFrank Schoenheit [fs] 
1386ab9f0cfSMike Kaganski #define ShellClass_SfxViewFrame
1391c46c7a0SStephan Bergmann #include <sfxslots.hxx>
140fd069beeSJens-Heiner Rechtien 
141e23d2be0SNoel Grandin using namespace ::com::sun::star;
142e23d2be0SNoel Grandin using namespace ::com::sun::star::uno;
143e23d2be0SNoel Grandin using namespace ::com::sun::star::ucb;
144e23d2be0SNoel Grandin using namespace ::com::sun::star::frame;
145e23d2be0SNoel Grandin using namespace ::com::sun::star::lang;
146e23d2be0SNoel Grandin using ::com::sun::star::awt::XWindow;
147e23d2be0SNoel Grandin using ::com::sun::star::beans::PropertyValue;
148e23d2be0SNoel Grandin using ::com::sun::star::document::XViewDataSupplier;
149e23d2be0SNoel Grandin using ::com::sun::star::container::XIndexContainer;
150e23d2be0SNoel Grandin 
1516ece6454SStephan Bergmann constexpr OUString CHANGES_STR = u"private:resource/toolbar/changes"_ustr;
152d8978605SLászló Németh 
SFX_IMPL_SUPERCLASS_INTERFACE(SfxViewFrame,SfxShell)15383078214SCaolán McNamara SFX_IMPL_SUPERCLASS_INTERFACE(SfxViewFrame,SfxShell)
154b731d71cSJan Holesovsky 
155b731d71cSJan Holesovsky void SfxViewFrame::InitInterface_Impl()
156fd069beeSJens-Heiner Rechtien {
157f4d61ecaSJan Holesovsky     GetStaticInterface()->RegisterChildWindow(SID_BROWSER);
158f4d61ecaSJan Holesovsky     GetStaticInterface()->RegisterChildWindow(SID_RECORDING_FLOATWINDOW);
159ad55d4e9STor Lillqvist #if HAVE_FEATURE_DESKTOP
160490e9dbaSCaolán McNamara     GetStaticInterface()->RegisterObjectBar(SFX_OBJECTBAR_FULLSCREEN, SfxVisibilityFlags::FullScreen, ToolbarId::FullScreenToolbox);
161490e9dbaSCaolán McNamara     GetStaticInterface()->RegisterObjectBar(SFX_OBJECTBAR_APPLICATION, SfxVisibilityFlags::Standard, ToolbarId::EnvToolbox);
162e7255834STor Lillqvist #endif
163fd069beeSJens-Heiner Rechtien }
164fd069beeSJens-Heiner Rechtien 
1652a705725SMike Kaganski namespace {
166d4460b70SMiklos Vajna /// Asks the user if editing a read-only document is really wanted.
16748bca65fSCaolán McNamara class SfxEditDocumentDialog : public weld::MessageDialogController
168d4460b70SMiklos Vajna {
169d4460b70SMiklos Vajna public:
1706a4c464bSCaolán McNamara     SfxEditDocumentDialog(weld::Widget* pParent);
171d4460b70SMiklos Vajna };
172d4460b70SMiklos Vajna 
SfxEditDocumentDialog(weld::Widget * pParent)1736a4c464bSCaolán McNamara SfxEditDocumentDialog::SfxEditDocumentDialog(weld::Widget* pParent)
174ca5c9591SNoel Grandin     : MessageDialogController(pParent, u"sfx/ui/editdocumentdialog.ui"_ustr,
175ca5c9591SNoel Grandin             u"EditDocumentDialog"_ustr)
176d4460b70SMiklos Vajna {
177d4460b70SMiklos Vajna }
178d4460b70SMiklos Vajna 
179942f0599SCaolán McNamara class SfxQueryOpenAsTemplate
1802a705725SMike Kaganski {
181942f0599SCaolán McNamara private:
182942f0599SCaolán McNamara     std::unique_ptr<weld::MessageDialog> m_xQueryBox;
1832a705725SMike Kaganski public:
SfxQueryOpenAsTemplate(weld::Window * pParent,bool bAllowIgnoreLock,LockFileEntry & rLockData)1840f9599b6SMike Kaganski     SfxQueryOpenAsTemplate(weld::Window* pParent, bool bAllowIgnoreLock, LockFileEntry& rLockData)
1850f9599b6SMike Kaganski         : m_xQueryBox(Application::CreateMessageDialog(pParent, VclMessageType::Question,
186ca5c9591SNoel Grandin                                                        VclButtonsType::NONE, u""_ustr))
1872a705725SMike Kaganski     {
188942f0599SCaolán McNamara         m_xQueryBox->add_button(SfxResId(STR_QUERY_OPENASTEMPLATE_OPENCOPY_BTN), RET_YES);
18910136818SSamuel Mehrbrodt         bAllowIgnoreLock
19010136818SSamuel Mehrbrodt             = bAllowIgnoreLock && officecfg::Office::Common::Misc::AllowOverrideLocking::get();
1912a705725SMike Kaganski         if (bAllowIgnoreLock)
192942f0599SCaolán McNamara             m_xQueryBox->add_button(SfxResId(STR_QUERY_OPENASTEMPLATE_OPEN_BTN), RET_IGNORE);
19328fc9860SCaolán McNamara         m_xQueryBox->add_button(GetStandardText( StandardButtonType::Cancel ), RET_CANCEL);
19410136818SSamuel Mehrbrodt         m_xQueryBox->set_primary_text(QueryString(bAllowIgnoreLock, rLockData));
195942f0599SCaolán McNamara         m_xQueryBox->set_default_response(RET_YES);
1962a705725SMike Kaganski     }
run()197942f0599SCaolán McNamara     short run() { return m_xQueryBox->run(); }
1980f9599b6SMike Kaganski 
1990f9599b6SMike Kaganski private:
QueryString(bool bAllowIgnoreLock,LockFileEntry & rLockData)2000f9599b6SMike Kaganski     static OUString QueryString(bool bAllowIgnoreLock, LockFileEntry& rLockData)
2010f9599b6SMike Kaganski     {
2020f9599b6SMike Kaganski         OUString sLockUserData;
2030f9599b6SMike Kaganski         if (!rLockData[LockFileComponent::OOOUSERNAME].isEmpty())
2040f9599b6SMike Kaganski             sLockUserData = rLockData[LockFileComponent::OOOUSERNAME];
2050f9599b6SMike Kaganski         else
2060f9599b6SMike Kaganski             sLockUserData = rLockData[LockFileComponent::SYSUSERNAME];
2070f9599b6SMike Kaganski 
2080f9599b6SMike Kaganski         if (!sLockUserData.isEmpty() && !rLockData[LockFileComponent::EDITTIME].isEmpty())
2090f9599b6SMike Kaganski             sLockUserData += " ( " + rLockData[LockFileComponent::EDITTIME] + " )";
2100f9599b6SMike Kaganski 
2110f9599b6SMike Kaganski         if (!sLockUserData.isEmpty())
2120f9599b6SMike Kaganski             sLockUserData = "\n\n" + sLockUserData + "\n";
2130f9599b6SMike Kaganski 
2140f9599b6SMike Kaganski         const bool bUseLockStr = bAllowIgnoreLock || !sLockUserData.isEmpty();
2150f9599b6SMike Kaganski 
2160f9599b6SMike Kaganski         OUString sMsg(
2170f9599b6SMike Kaganski             SfxResId(bUseLockStr ? STR_QUERY_OPENASTEMPLATE_LOCKED : STR_QUERY_OPENASTEMPLATE));
2180f9599b6SMike Kaganski 
2190f9599b6SMike Kaganski         if (bAllowIgnoreLock)
2200f9599b6SMike Kaganski             sMsg += "\n\n" + SfxResId(STR_QUERY_OPENASTEMPLATE_ALLOW_IGNORE);
2210f9599b6SMike Kaganski 
2220f9599b6SMike Kaganski         return sMsg.replaceFirst("%LOCKINFO", sLockUserData);
2230f9599b6SMike Kaganski     }
224942f0599SCaolán McNamara };
2252a705725SMike Kaganski 
AskPasswordToModify_Impl(const uno::Reference<task::XInteractionHandler> & xHandler,const OUString & aPath,const std::shared_ptr<const SfxFilter> & pFilter,sal_uInt32 nPasswordHash,const uno::Sequence<beans::PropertyValue> & aInfo)2262a705725SMike Kaganski bool AskPasswordToModify_Impl( const uno::Reference< task::XInteractionHandler >& xHandler, const OUString& aPath, const std::shared_ptr<const SfxFilter>& pFilter, sal_uInt32 nPasswordHash, const uno::Sequence< beans::PropertyValue >& aInfo )
227e0986b32SMikhail Voytenko {
2283d2a5111SMikhail Voytenko     // TODO/LATER: In future the info should replace the direct hash completely
229f20810f7SArkadiy Illarionov     bool bResult = ( !nPasswordHash && !aInfo.hasElements() );
230e0986b32SMikhail Voytenko 
2313dc91d3fSJulien Nabet     SAL_WARN_IF( !(pFilter && ( pFilter->GetFilterFlags() & SfxFilterFlags::PASSWORDTOMODIFY )), "sfx.view",
2323dc91d3fSJulien Nabet                        "PasswordToModify feature is active for a filter that does not support it!");
233e0986b32SMikhail Voytenko 
234e0986b32SMikhail Voytenko     if ( pFilter && xHandler.is() )
235e0986b32SMikhail Voytenko     {
2369278df2cSNoel Grandin         bool bCancel = false;
2379278df2cSNoel Grandin         bool bFirstTime = true;
238e0986b32SMikhail Voytenko 
239e0986b32SMikhail Voytenko         while ( !bResult && !bCancel )
240e0986b32SMikhail Voytenko         {
2419278df2cSNoel Grandin             bool bMSType = !pFilter->IsOwnFormat();
242e0986b32SMikhail Voytenko 
243e0986b32SMikhail Voytenko             ::rtl::Reference< ::comphelper::DocPasswordRequest > pPasswordRequest(
244e0986b32SMikhail Voytenko                  new ::comphelper::DocPasswordRequest(
2453b168bc6SNoel Grandin                  bMSType ? ::comphelper::DocPasswordRequestType::MS : ::comphelper::DocPasswordRequestType::Standard,
246913a2d36SNoel Grandin                  bFirstTime ? css::task::PasswordRequestMode_PASSWORD_ENTER : css::task::PasswordRequestMode_PASSWORD_REENTER,
247e0986b32SMikhail Voytenko                  aPath,
24805f742d2SStephan Bergmann                  true ) );
249e0986b32SMikhail Voytenko 
25097fa8702SNoel             xHandler->handle( pPasswordRequest );
251e0986b32SMikhail Voytenko 
252e0986b32SMikhail Voytenko             if ( pPasswordRequest->isPassword() )
2533d2a5111SMikhail Voytenko             {
254f20810f7SArkadiy Illarionov                 if ( aInfo.hasElements() )
2553d2a5111SMikhail Voytenko                 {
2563d2a5111SMikhail Voytenko                     bResult = ::comphelper::DocPasswordHelper::IsModifyPasswordCorrect( pPasswordRequest->getPasswordToModify(), aInfo );
2573d2a5111SMikhail Voytenko                 }
2583d2a5111SMikhail Voytenko                 else
2593d2a5111SMikhail Voytenko                 {
2603d2a5111SMikhail Voytenko                     // the binary format
261e256519aSMatteo Casalin                     bResult = ( SfxMedium::CreatePasswordToModifyHash( pPasswordRequest->getPasswordToModify(), pFilter->GetServiceName()=="com.sun.star.text.TextDocument" ) == nPasswordHash );
2623d2a5111SMikhail Voytenko                 }
2633d2a5111SMikhail Voytenko             }
264e0986b32SMikhail Voytenko             else
2659278df2cSNoel Grandin                 bCancel = true;
266e0986b32SMikhail Voytenko 
2679278df2cSNoel Grandin             bFirstTime = false;
268e0986b32SMikhail Voytenko         }
269e0986b32SMikhail Voytenko     }
270e0986b32SMikhail Voytenko 
271e0986b32SMikhail Voytenko     return bResult;
272e0986b32SMikhail Voytenko }
27327ffdcf0SStephan Bergmann 
physObjIsOlder(INetURLObject const & aMedObj,INetURLObject const & aPhysObj)27427ffdcf0SStephan Bergmann bool physObjIsOlder(INetURLObject const & aMedObj, INetURLObject const & aPhysObj) {
27527ffdcf0SStephan Bergmann     return ::utl::UCBContentHelper::IsYounger(aMedObj.GetMainURL( INetURLObject::DecodeMechanism::NONE),
27627ffdcf0SStephan Bergmann                                            aPhysObj.GetMainURL( INetURLObject::DecodeMechanism::NONE ) );
27727ffdcf0SStephan Bergmann }
2782a705725SMike Kaganski }
279e0986b32SMikhail Voytenko 
ExecReload_Impl(SfxRequest & rReq)280fd069beeSJens-Heiner Rechtien void SfxViewFrame::ExecReload_Impl( SfxRequest& rReq )
281fd069beeSJens-Heiner Rechtien {
282*fdd24dabSMike Kaganski     // Open as editable?
283*fdd24dabSMike Kaganski     std::optional<bool> oForEdit;
284*fdd24dabSMike Kaganski 
285fd069beeSJens-Heiner Rechtien     SfxObjectShell* pSh = GetObjectShell();
286fd069beeSJens-Heiner Rechtien     switch ( rReq.GetSlot() )
287fd069beeSJens-Heiner Rechtien     {
288fd069beeSJens-Heiner Rechtien         case SID_EDITDOC:
2895afa7678SGulsah Kose         case SID_READONLYDOC:
290fd069beeSJens-Heiner Rechtien         {
291f5f7b4efSAlbert Thuswaldner             // Due to Double occupancy in toolboxes (with or without Ctrl),
292f5f7b4efSAlbert Thuswaldner             // it is also possible that the slot is enabled, but Ctrl-click
293f5f7b4efSAlbert Thuswaldner             // despite this is not!
294ccfa9fa1SNoel Grandin             if( !pSh || !pSh->HasName() || !(pSh->Get_Impl()->nLoadedFlags & SfxLoadedFlags::MAINDOCUMENT ))
295fd069beeSJens-Heiner Rechtien                 break;
296fd069beeSJens-Heiner Rechtien 
297523922eeSSamuel Mehrbrodt             if (pSh->isEditDocLocked())
298a474e226SSerge Krot                 break;
299a474e226SSerge Krot 
3002a705725SMike Kaganski             // Only change read-only UI and remove info bar when we succeed
3012a705725SMike Kaganski             struct ReadOnlyUIGuard
3022a705725SMike Kaganski             {
3032a705725SMike Kaganski                 SfxViewFrame* m_pFrame;
3042a705725SMike Kaganski                 SfxObjectShell* m_pSh;
3057dd704abSMike Kaganski                 SfxMedium* m_pMed = nullptr;
3062a705725SMike Kaganski                 bool m_bSetRO;
3077dd704abSMike Kaganski                 ReadOnlyUIGuard(SfxViewFrame* pFrame, SfxObjectShell* p_Sh)
3087dd704abSMike Kaganski                     : m_pFrame(pFrame), m_pSh(p_Sh), m_bSetRO(p_Sh->IsReadOnlyUI())
3097dd704abSMike Kaganski                 {}
310681dd10bSCaolán McNamara                 ~ReadOnlyUIGuard() COVERITY_NOEXCEPT_FALSE
3112a705725SMike Kaganski                 {
3122a705725SMike Kaganski                     if (m_bSetRO != m_pSh->IsReadOnlyUI())
3132a705725SMike Kaganski                     {
3142a705725SMike Kaganski                         m_pSh->SetReadOnlyUI(m_bSetRO);
3152a705725SMike Kaganski                         if (!m_bSetRO)
316bb06f513SNoel                             m_pFrame->RemoveInfoBar(u"readonly");
3177dd704abSMike Kaganski                         if (m_pMed)
3187dd704abSMike Kaganski                         {
31979241a1fSMichael Stahl                             bool const isEnableSetModified(m_pSh->IsEnableSetModified());
32079241a1fSMichael Stahl                             m_pSh->EnableSetModified(false);
3217dd704abSMike Kaganski                             // tdf#116066: DoSaveCompleted should be called after SetReadOnlyUI
3227dd704abSMike Kaganski                             m_pSh->DoSaveCompleted(m_pMed);
3237dd704abSMike Kaganski                             m_pSh->Broadcast(SfxHint(SfxHintId::ModeChanged));
32479241a1fSMichael Stahl                             m_pSh->EnableSetModified(isEnableSetModified);
3252a705725SMike Kaganski                         }
3262a705725SMike Kaganski                     }
3277dd704abSMike Kaganski                 }
3287dd704abSMike Kaganski             } aReadOnlyUIGuard(this, pSh);
3292a705725SMike Kaganski 
330e0986b32SMikhail Voytenko             SfxMedium* pMed = pSh->GetMedium();
331e0986b32SMikhail Voytenko 
33295eb0888SMatt K             std::shared_ptr<std::recursive_mutex> pChkEditMutex = pMed->GetCheckEditableMutex();
33395eb0888SMatt K             std::unique_lock<std::recursive_mutex> chkEditLock;
33495eb0888SMatt K             if (pChkEditMutex != nullptr)
33595eb0888SMatt K                 chkEditLock = std::unique_lock<std::recursive_mutex>(*pChkEditMutex);
33695eb0888SMatt K             pMed->CancelCheckEditableEntry();
33795eb0888SMatt K 
338f5dd4faeSMike Kaganski             const SfxBoolItem* pItem = pMed->GetItemSet().GetItem(SID_VIEWONLY, false);
3395be98ebaSJens-Heiner Rechtien             if ( pItem && pItem->GetValue() )
3405be98ebaSJens-Heiner Rechtien             {
341d92aa2f4SNorbert Thiebaud                 SfxApplication* pApp = SfxGetpApp();
3425be98ebaSJens-Heiner Rechtien                 SfxAllItemSet aSet( pApp->GetPool() );
343bfde4866SNoel Grandin                 aSet.Put( SfxStringItem( SID_FILE_NAME, pMed->GetURLObject().GetMainURL(INetURLObject::DecodeMechanism::NONE) ) );
344c35616ddSStephan Bergmann                 aSet.Put( SfxBoolItem( SID_TEMPLATE, true ) );
345ca5c9591SNoel Grandin                 aSet.Put( SfxStringItem( SID_TARGETNAME, u"_blank"_ustr ) );
346f5dd4faeSMike Kaganski                 const SfxStringItem* pReferer = pMed->GetItemSet().GetItem(SID_REFERER, false);
3475be98ebaSJens-Heiner Rechtien                 if ( pReferer )
3485be98ebaSJens-Heiner Rechtien                     aSet.Put( *pReferer );
349f5dd4faeSMike Kaganski                 const SfxInt16Item* pVersionItem = pMed->GetItemSet().GetItem(SID_VERSION, false);
3505be98ebaSJens-Heiner Rechtien                 if ( pVersionItem )
3515be98ebaSJens-Heiner Rechtien                     aSet.Put( *pVersionItem );
3525be98ebaSJens-Heiner Rechtien 
3535be98ebaSJens-Heiner Rechtien                 if( pMed->GetFilter() )
3545be98ebaSJens-Heiner Rechtien                 {
3555be98ebaSJens-Heiner Rechtien                     aSet.Put( SfxStringItem( SID_FILTER_NAME, pMed->GetFilter()->GetFilterName() ) );
356f5dd4faeSMike Kaganski                     const SfxStringItem* pOptions = pMed->GetItemSet().GetItem(SID_FILE_FILTEROPTIONS, false);
3575be98ebaSJens-Heiner Rechtien                     if ( pOptions )
3585be98ebaSJens-Heiner Rechtien                         aSet.Put( *pOptions );
3595be98ebaSJens-Heiner Rechtien                 }
3605be98ebaSJens-Heiner Rechtien 
3618044acf2SNoel Grandin                 GetDispatcher()->Execute( SID_OPENDOC, SfxCallMode::ASYNCHRON, aSet );
3625be98ebaSJens-Heiner Rechtien                 return;
3635be98ebaSJens-Heiner Rechtien             }
364fd069beeSJens-Heiner Rechtien 
3657f8f277bSNoel Grandin             StreamMode nOpenMode;
3669278df2cSNoel Grandin             bool bNeedsReload = false;
367c0821580STünde Tóth             bool bPasswordEntered = false;
368fd069beeSJens-Heiner Rechtien             if ( !pSh->IsReadOnly() )
369fd069beeSJens-Heiner Rechtien             {
370f5f7b4efSAlbert Thuswaldner                 // Save and reload Readonly
371fd069beeSJens-Heiner Rechtien                 if( pSh->IsModified() )
372fd069beeSJens-Heiner Rechtien                 {
37309733434SMikhail Voytenko                     if ( pSh->PrepareClose() )
37409733434SMikhail Voytenko                     {
37509733434SMikhail Voytenko                         // the storing could let the medium be changed
37609733434SMikhail Voytenko                         pMed = pSh->GetMedium();
3779278df2cSNoel Grandin                         bNeedsReload = true;
37809733434SMikhail Voytenko                     }
37909733434SMikhail Voytenko                     else
380fd069beeSJens-Heiner Rechtien                     {
381c35616ddSStephan Bergmann                         rReq.SetReturnValue( SfxBoolItem( rReq.GetSlot(), false ) );
382fd069beeSJens-Heiner Rechtien                         return;
383fd069beeSJens-Heiner Rechtien                     }
384fd069beeSJens-Heiner Rechtien                 }
385fd069beeSJens-Heiner Rechtien                 nOpenMode = SFX_STREAM_READONLY;
3862a705725SMike Kaganski                 aReadOnlyUIGuard.m_bSetRO = true;
387fd069beeSJens-Heiner Rechtien             }
388fd069beeSJens-Heiner Rechtien             else
3891ec1371cSRüdiger Timm             {
390e0986b32SMikhail Voytenko                 if ( pSh->IsReadOnlyMedium()
391f20810f7SArkadiy Illarionov                   && ( pSh->GetModifyPasswordHash() || pSh->GetModifyPasswordInfo().hasElements() )
392e0986b32SMikhail Voytenko                   && !pSh->IsModifyPasswordEntered() )
393e0986b32SMikhail Voytenko                 {
394429c7a49SMatteo Casalin                     const OUString aDocumentName = INetURLObject( pMed->GetOrigURL() ).GetMainURL( INetURLObject::DecodeMechanism::WithCharset );
3950e8e5c19SNoel Grandin                     if( !AskPasswordToModify_Impl( pMed->GetInteractionHandler(), aDocumentName, pMed->GetFilter(), pSh->GetModifyPasswordHash(), pSh->GetModifyPasswordInfo() ) )
396e0986b32SMikhail Voytenko                     {
397e0986b32SMikhail Voytenko                         // this is a read-only document, if it has "Password to modify"
398e0986b32SMikhail Voytenko                         // the user should enter password before he can edit the document
399c35616ddSStephan Bergmann                         rReq.SetReturnValue( SfxBoolItem( rReq.GetSlot(), false ) );
400e0986b32SMikhail Voytenko                         return;
401e0986b32SMikhail Voytenko                     }
402e0986b32SMikhail Voytenko 
403e0986b32SMikhail Voytenko                     pSh->SetModifyPasswordEntered();
404c0821580STünde Tóth                     bPasswordEntered = true;
405e0986b32SMikhail Voytenko                 }
406e0986b32SMikhail Voytenko 
407b9ecec7cSStephan Bergmann                 nOpenMode = pSh->IsOriginallyReadOnlyMedium() ? SFX_STREAM_READONLY : SFX_STREAM_READWRITE;
4082a705725SMike Kaganski                 aReadOnlyUIGuard.m_bSetRO = false;
409*fdd24dabSMike Kaganski                 if (pMed->HasRestrictedFonts())
410*fdd24dabSMike Kaganski                     bNeedsReload = true; // Let it ask user, reload fonts, etc.
4111ec1371cSRüdiger Timm 
4121ec1371cSRüdiger Timm                 // if only the view was in the readonly mode then there is no need to do the reload
413b9ecec7cSStephan Bergmann                 if ( !pSh->IsReadOnlyMedium() )
414b9ecec7cSStephan Bergmann                 {
415b9ecec7cSStephan Bergmann                     // SetReadOnlyUI causes recomputation of window title, using
416b9ecec7cSStephan Bergmann                     // open mode among other things, so call SetOpenMode before
417b9ecec7cSStephan Bergmann                     // SetReadOnlyUI:
418b9ecec7cSStephan Bergmann                     pMed->SetOpenMode( nOpenMode );
4191ec1371cSRüdiger Timm                     return;
4201ec1371cSRüdiger Timm                 }
421b9ecec7cSStephan Bergmann             }
422b9ecec7cSStephan Bergmann 
423fd069beeSJens-Heiner Rechtien             if ( rReq.IsAPI() )
424fd069beeSJens-Heiner Rechtien             {
425f5f7b4efSAlbert Thuswaldner                 // Control through API if r/w or r/o
426e5be07f5SJan Holesovsky                 const SfxBoolItem* pEditItem = rReq.GetArg<SfxBoolItem>(SID_EDITDOC);
427fd069beeSJens-Heiner Rechtien                 if ( pEditItem )
428fd069beeSJens-Heiner Rechtien                     nOpenMode = pEditItem->GetValue() ? SFX_STREAM_READWRITE : SFX_STREAM_READONLY;
429fd069beeSJens-Heiner Rechtien             }
430fd069beeSJens-Heiner Rechtien 
431fd069beeSJens-Heiner Rechtien             // doing
432007c3c99SThomas Lange [tl] 
433429c7a49SMatteo Casalin             OUString sTemp;
434429c7a49SMatteo Casalin             osl::FileBase::getFileURLFromSystemPath( pMed->GetPhysicalName(), sTemp );
435429c7a49SMatteo Casalin             INetURLObject aPhysObj( sTemp );
436f5dd4faeSMike Kaganski             const SfxInt16Item* pVersionItem = pMed->GetItemSet().GetItem(SID_VERSION, false);
437fd069beeSJens-Heiner Rechtien 
4385be98ebaSJens-Heiner Rechtien             INetURLObject aMedObj( pMed->GetName() );
439f1035312SRüdiger Timm 
440b4576f3dSGiuseppe Castagno             // -> tdf#82744
441b4576f3dSGiuseppe Castagno             // the logic below is following:
442b4576f3dSGiuseppe Castagno             // if the document seems not to need to be reloaded
443b4576f3dSGiuseppe Castagno             //     and the physical name is different to the logical one,
444b4576f3dSGiuseppe Castagno             // then on file system it can be checked that the copy is still newer than the original and no document reload is required.
445b4576f3dSGiuseppe Castagno             // Did some semplification to enhance readability of the 'if' expression
446b4576f3dSGiuseppe Castagno             //
447b4576f3dSGiuseppe Castagno             // when the 'http/https' protocol is active, the bool bPhysObjIsYounger relies upon the getlastmodified Property of a WebDAV resource.
448b4576f3dSGiuseppe Castagno             // Said property should be implemented, but sometimes it's not.
449b4576f3dSGiuseppe Castagno             // implemented. On this case the reload activated here will not work properly.
450b4576f3dSGiuseppe Castagno             // TODO: change the check age method for WebDAV to etag (entity-tag) property value, need some rethinking, since the
451b4576f3dSGiuseppe Castagno             // etag tells that the cache representation (e.g. in LO) is different from the one on the server,
452b4576f3dSGiuseppe Castagno             // but tells nothing about the age
453b4576f3dSGiuseppe Castagno             // Details at this link: http://tools.ietf.org/html/rfc4918#section-15, section 15.7
454b4576f3dSGiuseppe Castagno             bool bIsWebDAV = aMedObj.isAnyKnownWebDAVScheme();
455b4576f3dSGiuseppe Castagno 
456c0821580STünde Tóth             // tdf#118938 Reload the document when the user enters the editing password,
457c0821580STünde Tóth             //            even if the physical name isn't different to the logical name.
45854e87df1SStephan Bergmann             if ( ( !bNeedsReload && ( ( aMedObj.GetProtocol() == INetProtocol::File &&
459c0821580STünde Tóth                                         ( aMedObj.getFSysPath( FSysStyle::Detect ) != aPhysObj.getFSysPath( FSysStyle::Detect )
460c0821580STünde Tóth                                           || bPasswordEntered ) &&
46127ffdcf0SStephan Bergmann                                         !physObjIsOlder(aMedObj, aPhysObj))
46227ffdcf0SStephan Bergmann                                       || (bIsWebDAV && !physObjIsOlder(aMedObj, aPhysObj))
463b4576f3dSGiuseppe Castagno                                       || ( pMed->IsRemote() && !bIsWebDAV ) ) )
4641e6802f4SRüdiger Timm                  || pVersionItem )
465b4576f3dSGiuseppe Castagno             // <- tdf#82744
466fd069beeSJens-Heiner Rechtien             {
4679278df2cSNoel Grandin                 bool bOK = false;
4682a705725SMike Kaganski                 bool bRetryIgnoringLock = false;
4692a705725SMike Kaganski                 bool bOpenTemplate = false;
4709ad252b2SStephan Bergmann                 std::optional<bool> aOrigROVal;
471df9adfc9SMike Kaganski                 if (!pVersionItem)
472df9adfc9SMike Kaganski                 {
473f5dd4faeSMike Kaganski                     auto pRO = pMed->GetItemSet().GetItem<SfxBoolItem>(SID_DOC_READONLY, false);
474df9adfc9SMike Kaganski                     if (pRO)
475df9adfc9SMike Kaganski                         aOrigROVal = pRO->GetValue();
476df9adfc9SMike Kaganski                 }
4772a705725SMike Kaganski                 do {
4780f9599b6SMike Kaganski                     LockFileEntry aLockData;
479fd069beeSJens-Heiner Rechtien                     if ( !pVersionItem )
480fd069beeSJens-Heiner Rechtien                     {
4812a705725SMike Kaganski                         if (bRetryIgnoringLock)
4822a705725SMike Kaganski                             pMed->ResetError();
4832a705725SMike Kaganski 
4849278df2cSNoel Grandin                         bool bHasStorage = pMed->HasStorage_Impl();
4851e6802f4SRüdiger Timm                         // switching edit mode could be possible without reload
48688d06aafSVladimir Glazounov                         if ( bHasStorage && pMed->GetStorage() == pSh->GetStorage() )
4871ec1371cSRüdiger Timm                         {
4881ec1371cSRüdiger Timm                             // TODO/LATER: faster creation of copy
489fc5184d5SRüdiger Timm                             if ( !pSh->ConnectTmpStorage_Impl( pMed->GetStorage(), pMed ) )
4901ec1371cSRüdiger Timm                                 return;
4911ec1371cSRüdiger Timm                         }
4921ec1371cSRüdiger Timm 
49335fa2104SOliver Bolte                         pMed->CloseAndRelease();
49468331237SStephan Bergmann                         pMed->SetOpenMode( nOpenMode );
49560dffd80SMike Kaganski                         // We need to clear the SID_DOC_READONLY item from the set, to allow
49660dffd80SMike Kaganski                         // MediaDescriptor::impl_openStreamWithURL (called indirectly by
49760dffd80SMike Kaganski                         // SfxMedium::CompleteReOpen) to properly fill input stream of the
49860dffd80SMike Kaganski                         // descriptor, even when the file can't be open in read-write mode.
49960dffd80SMike Kaganski                         // Only then can following call to SfxMedium::LockOrigFileOnDemand
50060dffd80SMike Kaganski                         // return proper information about who has locked the file, to show
50160dffd80SMike Kaganski                         // in the SfxQueryOpenAsTemplate box below; otherwise it exits right
50260dffd80SMike Kaganski                         // after call to SfxMedium::GetMedium_Impl. This mimics what happens
50360dffd80SMike Kaganski                         // when the file is opened initially, when filter detection code also
50460dffd80SMike Kaganski                         // calls MediaDescriptor::impl_openStreamWithURL without the item set.
505f5dd4faeSMike Kaganski                         pMed->GetItemSet().ClearItem(SID_DOC_READONLY);
506f1035312SRüdiger Timm                         pMed->CompleteReOpen();
507f5dd4faeSMike Kaganski                         pMed->GetItemSet().Put(
50860dffd80SMike Kaganski                             SfxBoolItem(SID_DOC_READONLY, !(nOpenMode & StreamMode::WRITE)));
5097f8f277bSNoel Grandin                         if ( nOpenMode & StreamMode::WRITE )
5102a705725SMike Kaganski                         {
5110f9599b6SMike Kaganski                             auto eResult = pMed->LockOrigFileOnDemand(
5120f9599b6SMike Kaganski                                 true, true, bRetryIgnoringLock, &aLockData);
5130f9599b6SMike Kaganski                             bRetryIgnoringLock
5140f9599b6SMike Kaganski                                 = eResult == SfxMedium::LockFileResult::FailedLockFile;
5152a705725SMike Kaganski                         }
5161d100003SJens-Heiner Rechtien 
5171d100003SJens-Heiner Rechtien                         // LockOrigFileOnDemand might set the readonly flag itself, it should be set back
518f5dd4faeSMike Kaganski                         pMed->GetItemSet().Put( SfxBoolItem( SID_DOC_READONLY, !( nOpenMode & StreamMode::WRITE ) ) );
51988d06aafSVladimir Glazounov 
520fd069beeSJens-Heiner Rechtien                         if ( !pMed->GetErrorCode() )
5219278df2cSNoel Grandin                             bOK = true;
522fd069beeSJens-Heiner Rechtien                     }
523fd069beeSJens-Heiner Rechtien 
524fd069beeSJens-Heiner Rechtien                     if( !bOK )
525fd069beeSJens-Heiner Rechtien                     {
5262a705725SMike Kaganski                         if (nOpenMode == SFX_STREAM_READWRITE && !rReq.IsAPI())
5272a705725SMike Kaganski                         {
5282a705725SMike Kaganski                             // css::sdbcx::User offering to open it as a template
5290f9599b6SMike Kaganski                             SfxQueryOpenAsTemplate aBox(GetWindow().GetFrameWeld(),
5300f9599b6SMike Kaganski                                                         bRetryIgnoringLock, aLockData);
5312a705725SMike Kaganski 
532942f0599SCaolán McNamara                             short nUserAnswer = aBox.run();
5332a705725SMike Kaganski                             bOpenTemplate = RET_YES == nUserAnswer;
5342a705725SMike Kaganski                             // Always reset this here to avoid infinite loop
5352a705725SMike Kaganski                             bRetryIgnoringLock = RET_IGNORE == nUserAnswer;
53695eb0888SMatt K                             if (RET_CANCEL == nUserAnswer)
53795eb0888SMatt K                                 pMed->AddToCheckEditableWorkerList();
5382a705725SMike Kaganski                         }
5392a705725SMike Kaganski                         else
5402a705725SMike Kaganski                             bRetryIgnoringLock = false;
5412a705725SMike Kaganski                     }
5422a705725SMike Kaganski                 }
5432a705725SMike Kaganski                 while ( !bOK && bRetryIgnoringLock );
5442a705725SMike Kaganski 
5452a705725SMike Kaganski                 if( !bOK )
5462a705725SMike Kaganski                 {
547d9e322d6SNoel Grandin                     ErrCodeMsg nErr = pMed->GetErrorCode();
548fd069beeSJens-Heiner Rechtien                     if ( pVersionItem )
549fd069beeSJens-Heiner Rechtien                         nErr = ERRCODE_IO_ACCESSDENIED;
550fd069beeSJens-Heiner Rechtien                     else
551fd069beeSJens-Heiner Rechtien                     {
552fd069beeSJens-Heiner Rechtien                         pMed->ResetError();
55368331237SStephan Bergmann                         pMed->SetOpenMode( SFX_STREAM_READONLY );
554df9adfc9SMike Kaganski                         if (aOrigROVal)
555f5dd4faeSMike Kaganski                             pMed->GetItemSet().Put(SfxBoolItem(SID_DOC_READONLY, *aOrigROVal));
556df9adfc9SMike Kaganski                         else
557f5dd4faeSMike Kaganski                             pMed->GetItemSet().ClearItem(SID_DOC_READONLY);
558fd069beeSJens-Heiner Rechtien                         pMed->ReOpen();
559fd069beeSJens-Heiner Rechtien                         pSh->DoSaveCompleted( pMed );
560fd069beeSJens-Heiner Rechtien                     }
561fd069beeSJens-Heiner Rechtien 
562f5f7b4efSAlbert Thuswaldner                     // Readonly document can not be switched to edit mode?
563e5da350eSNoel Grandin                     rReq.Done();
564fd069beeSJens-Heiner Rechtien 
565fd069beeSJens-Heiner Rechtien                     if ( nOpenMode == SFX_STREAM_READWRITE && !rReq.IsAPI() )
566fd069beeSJens-Heiner Rechtien                     {
5672a705725SMike Kaganski                         if ( bOpenTemplate )
568fd069beeSJens-Heiner Rechtien                         {
569d92aa2f4SNorbert Thiebaud                             SfxApplication* pApp = SfxGetpApp();
570fd069beeSJens-Heiner Rechtien                             SfxAllItemSet aSet( pApp->GetPool() );
571fd069beeSJens-Heiner Rechtien                             aSet.Put( SfxStringItem( SID_FILE_NAME, pMed->GetName() ) );
572f5dd4faeSMike Kaganski                             const SfxStringItem* pReferer = pMed->GetItemSet().GetItem(SID_REFERER, false);
573fd069beeSJens-Heiner Rechtien                             if ( pReferer )
574fd069beeSJens-Heiner Rechtien                                 aSet.Put( *pReferer );
575c35616ddSStephan Bergmann                             aSet.Put( SfxBoolItem( SID_TEMPLATE, true ) );
576fd069beeSJens-Heiner Rechtien                             if ( pVersionItem )
577fd069beeSJens-Heiner Rechtien                                 aSet.Put( *pVersionItem );
578fd069beeSJens-Heiner Rechtien 
579fd069beeSJens-Heiner Rechtien                             if( pMed->GetFilter() )
580fd069beeSJens-Heiner Rechtien                             {
5813861003bSMathias Bauer                                 aSet.Put( SfxStringItem( SID_FILTER_NAME, pMed->GetFilter()->GetFilterName() ) );
582f5dd4faeSMike Kaganski                                 const SfxStringItem* pOptions = pMed->GetItemSet().GetItem(SID_FILE_FILTEROPTIONS, false);
583fd069beeSJens-Heiner Rechtien                                 if ( pOptions )
584fd069beeSJens-Heiner Rechtien                                     aSet.Put( *pOptions );
585fd069beeSJens-Heiner Rechtien                             }
586fd069beeSJens-Heiner Rechtien 
5878044acf2SNoel Grandin                             GetDispatcher()->Execute( SID_OPENDOC, SfxCallMode::ASYNCHRON, aSet );
588fd069beeSJens-Heiner Rechtien                             return;
589fd069beeSJens-Heiner Rechtien                         }
5902a705725SMike Kaganski 
591a6aa57ffSNoel Grandin                         nErr = ERRCODE_NONE;
592fd069beeSJens-Heiner Rechtien                     }
593fd069beeSJens-Heiner Rechtien 
5942a705725SMike Kaganski                     // Keep the read-only UI
5952a705725SMike Kaganski                     aReadOnlyUIGuard.m_bSetRO = true;
5962a705725SMike Kaganski 
597fd069beeSJens-Heiner Rechtien                     ErrorHandler::HandleError( nErr );
598fd069beeSJens-Heiner Rechtien                     rReq.SetReturnValue(
599c35616ddSStephan Bergmann                         SfxBoolItem( rReq.GetSlot(), false ) );
600fd069beeSJens-Heiner Rechtien                     return;
601fd069beeSJens-Heiner Rechtien                 }
602fd069beeSJens-Heiner Rechtien                 else
603fd069beeSJens-Heiner Rechtien                 {
6047dd704abSMike Kaganski                     aReadOnlyUIGuard.m_pMed = pMed;
605c35616ddSStephan Bergmann                     rReq.SetReturnValue( SfxBoolItem( rReq.GetSlot(), true ) );
606fb77ab1dSNoel Grandin                     rReq.Done( true );
607fd069beeSJens-Heiner Rechtien                     return;
608fd069beeSJens-Heiner Rechtien                 }
609fd069beeSJens-Heiner Rechtien             }
610fd069beeSJens-Heiner Rechtien 
611c929c563SMichael Stahl             rReq.AppendItem( SfxBoolItem(SID_FORCERELOAD,
612ed4d4d47SMichael Stahl                     (rReq.GetSlot() == SID_EDITDOC
613ed4d4d47SMichael Stahl                      // tdf#151715 exclude files loaded from /tmp to avoid Notebookbar bugs
614ed4d4d47SMichael Stahl                      && (!pSh->IsOriginallyReadOnlyMedium() || pSh->IsOriginallyLoadedReadOnlyMedium()))
615ed4d4d47SMichael Stahl                     || bNeedsReload) );
616c35616ddSStephan Bergmann             rReq.AppendItem( SfxBoolItem( SID_SILENT, true ));
61701f787a2SStephan Bergmann 
618*fdd24dabSMike Kaganski             oForEdit = !aReadOnlyUIGuard.m_bSetRO;
619*fdd24dabSMike Kaganski 
620ab9b67bbSStephan Bergmann             [[fallthrough]]; //TODO ???
621fd069beeSJens-Heiner Rechtien         }
622fd069beeSJens-Heiner Rechtien 
623fd069beeSJens-Heiner Rechtien         case SID_RELOAD:
624fd069beeSJens-Heiner Rechtien         {
625f5f7b4efSAlbert Thuswaldner             // Due to Double occupancy in toolboxes (with or without Ctrl),
626f5f7b4efSAlbert Thuswaldner             // it is also possible that the slot is enabled, but Ctrl-click
627f5f7b4efSAlbert Thuswaldner             // despite this is not!
628fd069beeSJens-Heiner Rechtien             if ( !pSh || !pSh->CanReload_Impl() )
629fd069beeSJens-Heiner Rechtien                 break;
630d92aa2f4SNorbert Thiebaud             SfxApplication* pApp = SfxGetpApp();
631e5be07f5SJan Holesovsky             const SfxBoolItem* pForceReloadItem = rReq.GetArg<SfxBoolItem>(SID_FORCERELOAD);
632fd069beeSJens-Heiner Rechtien             if(  pForceReloadItem && !pForceReloadItem->GetValue() &&
633fd069beeSJens-Heiner Rechtien                 !pSh->GetMedium()->IsExpired() )
634fd069beeSJens-Heiner Rechtien                 return;
6351c087eb5SXisco Fauli             if( m_pImpl->bReloading || pSh->IsInModalMode() )
636fd069beeSJens-Heiner Rechtien                 return;
637fd069beeSJens-Heiner Rechtien 
638f5f7b4efSAlbert Thuswaldner             // AutoLoad is prohibited if possible
639e5be07f5SJan Holesovsky             const SfxBoolItem* pAutoLoadItem = rReq.GetArg<SfxBoolItem>(SID_AUTOLOAD);
640fd069beeSJens-Heiner Rechtien             if ( pAutoLoadItem && pAutoLoadItem->GetValue() &&
641ef15b85eSFrank Schoenheit [fs]                  GetFrame().IsAutoLoadLocked_Impl() )
642fd069beeSJens-Heiner Rechtien                 return;
643fd069beeSJens-Heiner Rechtien 
644fd069beeSJens-Heiner Rechtien             SfxObjectShellLock xOldObj( pSh );
6451c087eb5SXisco Fauli             m_pImpl->bReloading = true;
646e5be07f5SJan Holesovsky             const SfxStringItem* pURLItem = rReq.GetArg<SfxStringItem>(SID_FILE_NAME);
647f5f7b4efSAlbert Thuswaldner             // Open as editable?
648*fdd24dabSMike Kaganski             if (!oForEdit.has_value())
649*fdd24dabSMike Kaganski                 oForEdit = !pSh->IsReadOnly();
650fd069beeSJens-Heiner Rechtien 
651f5f7b4efSAlbert Thuswaldner             // If possible ask the User
6520d0fd7b4SStephan Bergmann             bool bDo = GetViewShell()->PrepareClose();
653e5be07f5SJan Holesovsky             const SfxBoolItem* pSilentItem = rReq.GetArg<SfxBoolItem>(SID_SILENT);
6547f2bcfe5SHeiko Tietze             if (getenv("SAL_NO_QUERYSAVE"))
6557f2bcfe5SHeiko Tietze                 bDo = true;
6567f2bcfe5SHeiko Tietze             else if (bDo && GetFrame().DocIsModified_Impl() && !rReq.IsAPI()
6577f2bcfe5SHeiko Tietze                      && (!pSilentItem || !pSilentItem->GetValue()))
658fd069beeSJens-Heiner Rechtien             {
6597f2bcfe5SHeiko Tietze                 std::unique_ptr<weld::MessageDialog> xBox(Application::CreateMessageDialog(
6607f2bcfe5SHeiko Tietze                     GetWindow().GetFrameWeld(), VclMessageType::Question, VclButtonsType::YesNo,
6616a4c464bSCaolán McNamara                     SfxResId(STR_QUERY_LASTVERSION)));
6626a4c464bSCaolán McNamara                 bDo = RET_YES == xBox->run();
663fd069beeSJens-Heiner Rechtien             }
664fd069beeSJens-Heiner Rechtien 
665fd069beeSJens-Heiner Rechtien             if ( bDo )
666fd069beeSJens-Heiner Rechtien             {
667fd069beeSJens-Heiner Rechtien                 SfxMedium *pMedium = xOldObj->GetMedium();
66895eb0888SMatt K                 std::shared_ptr<std::recursive_mutex> pChkEditMutex
66995eb0888SMatt K                     = pMedium->GetCheckEditableMutex();
67095eb0888SMatt K                 std::unique_lock<std::recursive_mutex> chkEditLock;
67195eb0888SMatt K                 if (pChkEditMutex != nullptr)
67295eb0888SMatt K                     chkEditLock = std::unique_lock<std::recursive_mutex>(*pChkEditMutex);
67395eb0888SMatt K                 pMedium->CancelCheckEditableEntry();
674fd069beeSJens-Heiner Rechtien 
6759278df2cSNoel Grandin                 bool bHandsOff =
67654e87df1SStephan Bergmann                     ( pMedium->GetURLObject().GetProtocol() == INetProtocol::File && !xOldObj->IsDocShared() );
677fd069beeSJens-Heiner Rechtien 
678c27798b2SJulien Nabet                 // Empty existing SfxMDIFrames for this Document
679f5f7b4efSAlbert Thuswaldner                 // in native format or R/O, open it now for editing?
680fd069beeSJens-Heiner Rechtien                 SfxObjectShellLock xNewObj;
681fd069beeSJens-Heiner Rechtien 
68205aee339SFrank Schoenheit [fs]                 // collect the views of the document
68305aee339SFrank Schoenheit [fs]                 // TODO: when UNO ViewFactories are available for SFX-based documents, the below code should
68405aee339SFrank Schoenheit [fs]                 // be UNOized, too
685d615af61SNoel Grandin                 typedef ::std::pair< Reference< XFrame >, SfxInterfaceId >  ViewDescriptor;
6861651dee9SJulien Nabet                 ::std::vector< ViewDescriptor > aViewFrames;
6876c1be809SKurt Zenker                 SfxViewFrame *pView = GetFirst( xOldObj );
688fd069beeSJens-Heiner Rechtien                 while ( pView )
689fd069beeSJens-Heiner Rechtien                 {
690ef15b85eSFrank Schoenheit [fs]                     Reference< XFrame > xFrame( pView->GetFrame().GetFrameInterface() );
6913dc91d3fSJulien Nabet                     SAL_WARN_IF( !xFrame.is(), "sfx.view", "SfxViewFrame::ExecReload_Impl: no XFrame?!");
692c460201dSNoel Grandin                     aViewFrames.emplace_back( xFrame, pView->GetCurViewId() );
693fd069beeSJens-Heiner Rechtien 
694419e42edSFrank Schoenheit [fs]                     pView = GetNext( *pView, xOldObj );
695fd069beeSJens-Heiner Rechtien                 }
696fd069beeSJens-Heiner Rechtien 
6970cc70223SNoel Grandin                 xOldObj->Get_Impl()->pReloadTimer.reset();
698fd069beeSJens-Heiner Rechtien 
699608f273eSNoel Grandin                 std::optional<SfxAllItemSet> pNewSet;
700e94d5233SMarkus Mohrhard                 std::shared_ptr<const SfxFilter> pFilter = pMedium->GetFilter();
701c9abf168SOliver Bolte                 if( pURLItem )
702c9abf168SOliver Bolte                 {
703608f273eSNoel Grandin                     pNewSet.emplace( pApp->GetPool() );
704c9abf168SOliver Bolte                     pNewSet->Put( *pURLItem );
7056c1be809SKurt Zenker 
706c9abf168SOliver Bolte                     // Filter Detection
7077dca2226SStephan Bergmann                     OUString referer;
708e5be07f5SJan Holesovsky                     const SfxStringItem* refererItem = rReq.GetArg<SfxStringItem>(SID_REFERER);
70928034eafSStephan Bergmann                     if (refererItem != nullptr) {
7107dca2226SStephan Bergmann                         referer = refererItem->GetValue();
7117dca2226SStephan Bergmann                     }
7127dca2226SStephan Bergmann                     SfxMedium aMedium( pURLItem->GetValue(), referer, SFX_STREAM_READWRITE );
713e94d5233SMarkus Mohrhard                     SfxFilterMatcher().GuessFilter( aMedium, pFilter );
714c9abf168SOliver Bolte                     if ( pFilter )
715c9abf168SOliver Bolte                         pNewSet->Put( SfxStringItem( SID_FILTER_NAME, pFilter->GetName() ) );
716f5dd4faeSMike Kaganski                     pNewSet->Put( aMedium.GetItemSet() );
717c9abf168SOliver Bolte                 }
718c9abf168SOliver Bolte                 else
719fd069beeSJens-Heiner Rechtien                 {
720f5dd4faeSMike Kaganski                     pNewSet.emplace( pMedium->GetItemSet() );
721fd069beeSJens-Heiner Rechtien                     pNewSet->ClearItem( SID_VIEW_ID );
7220834676aSRüdiger Timm                     pNewSet->ClearItem( SID_STREAM );
7230834676aSRüdiger Timm                     pNewSet->ClearItem( SID_INPUTSTREAM );
7246c1be809SKurt Zenker                     pNewSet->Put( SfxStringItem( SID_FILTER_NAME, pMedium->GetFilter()->GetName() ) );
725401f480bSVladimir Glazounov 
726401f480bSVladimir Glazounov                     // let the current security settings be checked again
727401f480bSVladimir Glazounov                     pNewSet->Put( SfxUInt16Item( SID_MACROEXECMODE, document::MacroExecMode::USE_CONFIG ) );
728401f480bSVladimir Glazounov 
729191c0a9eSStephan Bergmann                     if ( pSh->IsOriginallyReadOnlyMedium()
730191c0a9eSStephan Bergmann                          || pSh->IsOriginallyLoadedReadOnlyMedium() )
7311e6802f4SRüdiger Timm                         // edit mode is switched or reload of readonly document
732b9ecec7cSStephan Bergmann                         pNewSet->Put( SfxBoolItem( SID_DOC_READONLY, true ) );
7331e6802f4SRüdiger Timm                     else
7341e6802f4SRüdiger Timm                         // Reload of file opened for writing
7351e6802f4SRüdiger Timm                         pNewSet->ClearItem( SID_DOC_READONLY );
736fd069beeSJens-Heiner Rechtien                 }
737fd069beeSJens-Heiner Rechtien 
738f5f7b4efSAlbert Thuswaldner                 // If a salvaged file is present, do not enclose the OrigURL
73904724c97SAndrea Gelmini                 // again, since the Template is invalid after reload.
740608f273eSNoel Grandin                 const SfxStringItem* pSalvageItem = SfxItemSet::GetItem<SfxStringItem>(&*pNewSet, SID_DOC_SALVAGE, false);
741c6f9f644SSander Vesik                 if( pSalvageItem )
742fd069beeSJens-Heiner Rechtien                 {
743fd069beeSJens-Heiner Rechtien                     pNewSet->ClearItem( SID_DOC_SALVAGE );
744fd069beeSJens-Heiner Rechtien                 }
745fd069beeSJens-Heiner Rechtien 
746a8c3c673STor Lillqvist #if HAVE_FEATURE_MULTIUSER_ENVIRONMENT
74788d06aafSVladimir Glazounov                 // TODO/LATER: Temporary solution, the SfxMedium must know the original URL as aLogicName
748f5f7b4efSAlbert Thuswaldner                 //             SfxMedium::Transfer_Impl() will be forbidden then.
74988d06aafSVladimir Glazounov                 if ( xOldObj->IsDocShared() )
75088d06aafSVladimir Glazounov                     pNewSet->Put( SfxStringItem( SID_FILE_NAME, xOldObj->GetSharedFileURL() ) );
75183a48654STor Lillqvist #endif
752fd069beeSJens-Heiner Rechtien                 if ( pURLItem )
753fd069beeSJens-Heiner Rechtien                     pNewSet->Put( SfxStringItem( SID_REFERER, pMedium->GetName() ) );
754a14066bdSMathias Bauer                 else
75535c24f9bSNoel Grandin                     pNewSet->Put( SfxStringItem( SID_REFERER, OUString() ) );
756fd069beeSJens-Heiner Rechtien 
757fd069beeSJens-Heiner Rechtien                 xOldObj->CancelTransfers();
758fd069beeSJens-Heiner Rechtien 
759ac49eeddSIvo Hinkelmann 
760ac49eeddSIvo Hinkelmann                 if ( pSilentItem && pSilentItem->GetValue() )
761c35616ddSStephan Bergmann                     pNewSet->Put( SfxBoolItem( SID_SILENT, true ) );
762fd069beeSJens-Heiner Rechtien 
763608f273eSNoel Grandin                 const SfxUnoAnyItem* pInteractionItem = SfxItemSet::GetItem<SfxUnoAnyItem>(&*pNewSet, SID_INTERACTIONHANDLER, false);
764608f273eSNoel Grandin                 const SfxUInt16Item* pMacroExecItem = SfxItemSet::GetItem<SfxUInt16Item>(&*pNewSet, SID_MACROEXECMODE, false);
765608f273eSNoel Grandin                 const SfxUInt16Item* pDocTemplateItem = SfxItemSet::GetItem<SfxUInt16Item>(&*pNewSet, SID_UPDATEDOCMODE, false);
766164da69aSJens-Heiner Rechtien 
767164da69aSJens-Heiner Rechtien                 if (!pInteractionItem)
768164da69aSJens-Heiner Rechtien                 {
76928034eafSStephan Bergmann                     Reference < task::XInteractionHandler2 > xHdl = task::InteractionHandler::createWithParent( ::comphelper::getProcessComponentContext(), nullptr );
770164da69aSJens-Heiner Rechtien                     if (xHdl.is())
7710bfa6a18SStephan Bergmann                         pNewSet->Put( SfxUnoAnyItem(SID_INTERACTIONHANDLER,css::uno::Any(xHdl)) );
772164da69aSJens-Heiner Rechtien                 }
773164da69aSJens-Heiner Rechtien 
774164da69aSJens-Heiner Rechtien                 if (!pMacroExecItem)
775913a2d36SNoel Grandin                     pNewSet->Put( SfxUInt16Item(SID_MACROEXECMODE,css::document::MacroExecMode::USE_CONFIG) );
776164da69aSJens-Heiner Rechtien                 if (!pDocTemplateItem)
777913a2d36SNoel Grandin                     pNewSet->Put( SfxUInt16Item(SID_UPDATEDOCMODE,css::document::UpdateDocMode::ACCORDING_TO_CONFIG) );
778164da69aSJens-Heiner Rechtien 
779ac01de88SNoel Grandin                 xOldObj->SetModified( false );
780ba9b525eSAndrea Gelmini                 // Do not cache the old Document! Is invalid when loading
781f5f7b4efSAlbert Thuswaldner                 // another document.
78248babf1eSMathias Bauer 
7839278df2cSNoel Grandin                 bool bHasStorage = pMedium->HasStorage_Impl();
78459146f7eSMathias Bauer                 if( bHandsOff )
7856c1be809SKurt Zenker                 {
78688d06aafSVladimir Glazounov                     if ( bHasStorage && pMedium->GetStorage() == xOldObj->GetStorage() )
7876c1be809SKurt Zenker                     {
7886c1be809SKurt Zenker                         // TODO/LATER: faster creation of copy
789fc5184d5SRüdiger Timm                         if ( !xOldObj->ConnectTmpStorage_Impl( pMedium->GetStorage(), pMedium ) )
7906c1be809SKurt Zenker                             return;
7916c1be809SKurt Zenker                     }
7921ec1371cSRüdiger Timm 
79335fa2104SOliver Bolte                     pMedium->CloseAndRelease();
7946c1be809SKurt Zenker                 }
79559146f7eSMathias Bauer 
796e5da350eSNoel Grandin                 xNewObj = SfxObjectShell::CreateObject( pFilter->GetServiceName() );
797db223660SMikhail Voytenko 
798db223660SMikhail Voytenko                 if ( xOldObj->IsModifyPasswordEntered() )
799db223660SMikhail Voytenko                     xNewObj->SetModifyPasswordEntered();
800db223660SMikhail Voytenko 
80105aee339SFrank Schoenheit [fs]                 uno::Sequence < beans::PropertyValue > aLoadArgs;
80205aee339SFrank Schoenheit [fs]                 TransformItems( SID_OPENDOC, *pNewSet, aLoadArgs );
8036c1be809SKurt Zenker                 try
8046c1be809SKurt Zenker                 {
8056c1be809SKurt Zenker                     uno::Reference < frame::XLoadable > xLoad( xNewObj->GetModel(), uno::UNO_QUERY );
80605aee339SFrank Schoenheit [fs]                     xLoad->load( aLoadArgs );
8076c1be809SKurt Zenker                 }
8086c1be809SKurt Zenker                 catch ( uno::Exception& )
8096c1be809SKurt Zenker                 {
8106c1be809SKurt Zenker                     xNewObj->DoClose();
81128034eafSStephan Bergmann                     xNewObj = nullptr;
81295eb0888SMatt K                     pMedium->AddToCheckEditableWorkerList();
8136c1be809SKurt Zenker                 }
814fd069beeSJens-Heiner Rechtien 
815a8694d21SNoel Grandin                 pNewSet.reset();
816778dd981SPascal Junck 
817fd069beeSJens-Heiner Rechtien                 if( !xNewObj.Is() )
818fd069beeSJens-Heiner Rechtien                 {
819fd069beeSJens-Heiner Rechtien                     if( bHandsOff )
8201e6802f4SRüdiger Timm                     {
8211e6802f4SRüdiger Timm                         // back to old medium
8221e6802f4SRüdiger Timm                         pMedium->ReOpen();
8235fe7ecc0SNoel Grandin                         pMedium->LockOrigFileOnDemand( false, true );
82488d06aafSVladimir Glazounov 
8251e6802f4SRüdiger Timm                         xOldObj->DoSaveCompleted( pMedium );
8261e6802f4SRüdiger Timm                     }
827fd069beeSJens-Heiner Rechtien                 }
8281e6802f4SRüdiger Timm                 else
829f11a6e38SMathias Bauer                 {
830db223660SMikhail Voytenko                     if ( xNewObj->GetModifyPasswordHash() && xNewObj->GetModifyPasswordHash() != xOldObj->GetModifyPasswordHash() )
831db223660SMikhail Voytenko                     {
832ac01de88SNoel Grandin                         xNewObj->SetModifyPasswordEntered( false );
833db223660SMikhail Voytenko                         xNewObj->SetReadOnly();
834db223660SMikhail Voytenko                     }
83544ac1579SMaxim Monastirsky                     else if ( rReq.GetSlot() == SID_EDITDOC || rReq.GetSlot() == SID_READONLYDOC )
836a18c6fe8SMikhail Voytenko                     {
837*fdd24dabSMike Kaganski                         xNewObj->SetReadOnlyUI(!*oForEdit);
838a18c6fe8SMikhail Voytenko                     }
839db223660SMikhail Voytenko 
840a8c3c673STor Lillqvist #if HAVE_FEATURE_MULTIUSER_ENVIRONMENT
84188d06aafSVladimir Glazounov                     if ( xNewObj->IsDocShared() )
84288d06aafSVladimir Glazounov                     {
84305aee339SFrank Schoenheit [fs]                         // the file is shared but the closing can change the sharing control file
84488d06aafSVladimir Glazounov                         xOldObj->DoNotCleanShareControlFile();
84588d06aafSVladimir Glazounov                     }
84683a48654STor Lillqvist #endif
84705aee339SFrank Schoenheit [fs]                     // the Reload and Silent items were only temporary, remove them
848f5dd4faeSMike Kaganski                     xNewObj->GetMedium()->GetItemSet().ClearItem( SID_RELOAD );
849f5dd4faeSMike Kaganski                     xNewObj->GetMedium()->GetItemSet().ClearItem( SID_SILENT );
850f5dd4faeSMike Kaganski                     TransformItems( SID_OPENDOC, xNewObj->GetMedium()->GetItemSet(), aLoadArgs );
85105aee339SFrank Schoenheit [fs] 
852c6f9f644SSander Vesik                     UpdateDocument_Impl();
853fd069beeSJens-Heiner Rechtien 
854ef1484c7SJustin Luth                     auto sModule = vcl::CommandInfoProvider::GetModuleIdentifier(GetFrame().GetFrameInterface());
855ef1484c7SJustin Luth                     OUString sReloadNotebookBar;
856ef1484c7SJustin Luth                     if (sModule == "com.sun.star.text.TextDocument")
857e0c33ec1SStephan Bergmann                         sReloadNotebookBar = u"modules/swriter/ui/"_ustr;
858ef1484c7SJustin Luth                     else if (sModule == "com.sun.star.sheet.SpreadsheetDocument")
859e0c33ec1SStephan Bergmann                         sReloadNotebookBar = u"modules/scalc/ui/"_ustr;
860ef1484c7SJustin Luth                     else if (sfx2::SfxNotebookBar::IsActive()
861ef1484c7SJustin Luth                              && sModule != "presentation.PresentationDocument"
862ef1484c7SJustin Luth                              && sModule != "com.sun.star.drawing.DrawingDocument")
863ef1484c7SJustin Luth                     {
864ef1484c7SJustin Luth                         assert(false && "SID_RELOAD Notebookbar active, but not refreshed here");
865ef1484c7SJustin Luth                     }
86668c96a54SJim Raykowski 
86705aee339SFrank Schoenheit [fs]                     try
868fd069beeSJens-Heiner Rechtien                     {
8691651dee9SJulien Nabet                         for (auto const& viewFrame : aViewFrames)
87005aee339SFrank Schoenheit [fs]                         {
8711651dee9SJulien Nabet                             LoadViewIntoFrame_Impl( *xNewObj, viewFrame.first, aLoadArgs, viewFrame.second, false );
87205aee339SFrank Schoenheit [fs]                         }
8731651dee9SJulien Nabet                         aViewFrames.clear();
87405aee339SFrank Schoenheit [fs]                     }
87505aee339SFrank Schoenheit [fs]                     catch( const Exception& )
87605aee339SFrank Schoenheit [fs]                     {
87705aee339SFrank Schoenheit [fs]                         // close the remaining frames
87805aee339SFrank Schoenheit [fs]                         // Don't catch exceptions herein, if this fails, then we're left in an indetermined state, and
87905aee339SFrank Schoenheit [fs]                         // crashing is better than trying to proceed
8801651dee9SJulien Nabet                         for (auto const& viewFrame : aViewFrames)
88105aee339SFrank Schoenheit [fs]                         {
8821651dee9SJulien Nabet                             Reference< util::XCloseable > xClose( viewFrame.first, UNO_QUERY_THROW );
8839278df2cSNoel Grandin                             xClose->close( true );
884fd069beeSJens-Heiner Rechtien                         }
8851651dee9SJulien Nabet                         aViewFrames.clear();
8861e6802f4SRüdiger Timm                     }
887fd069beeSJens-Heiner Rechtien 
8888a07588cSMiklos Vajna                     const SfxInt32Item* pPageNumber = rReq.GetArg<SfxInt32Item>(SID_PAGE_NUMBER);
8898a07588cSMiklos Vajna                     if (pPageNumber && pPageNumber->GetValue() >= 0)
8908a07588cSMiklos Vajna                     {
8918a07588cSMiklos Vajna                         // Restore current page after reload.
8928a07588cSMiklos Vajna                         uno::Reference<drawing::XDrawView> xController(
8938a07588cSMiklos Vajna                             xNewObj->GetModel()->getCurrentController(), uno::UNO_QUERY);
8948a07588cSMiklos Vajna                         uno::Reference<drawing::XDrawPagesSupplier> xSupplier(xNewObj->GetModel(),
8958a07588cSMiklos Vajna                                                                               uno::UNO_QUERY);
8968a07588cSMiklos Vajna                         uno::Reference<drawing::XDrawPages> xDrawPages = xSupplier->getDrawPages();
8978a07588cSMiklos Vajna                         uno::Reference<drawing::XDrawPage> xDrawPage(
8988a07588cSMiklos Vajna                             xDrawPages->getByIndex(pPageNumber->GetValue()), uno::UNO_QUERY);
8998a07588cSMiklos Vajna                         xController->setCurrentPage(xDrawPage);
9008a07588cSMiklos Vajna                     }
9018a07588cSMiklos Vajna 
9029e6352a2SOliver Bolte                     // Propagate document closure.
903ed2b8ca9SNoel Grandin                     SfxGetpApp()->NotifyEvent( SfxEventHint( SfxEventHintId::CloseDoc, GlobalEventConfig::GetEventName( GlobalEventId::CLOSEDOC ), xOldObj ) );
904ef1484c7SJustin Luth 
905ef1484c7SJustin Luth                     // tdf#126006 Calc needs to reload the notebookbar after closing the document
906ef1484c7SJustin Luth                     if (!sReloadNotebookBar.isEmpty())
907ef1484c7SJustin Luth                         sfx2::SfxNotebookBar::ReloadNotebookBar(sReloadNotebookBar);
9089e6352a2SOliver Bolte                 }
9099e6352a2SOliver Bolte 
910f5f7b4efSAlbert Thuswaldner                 // Record as done
911fb77ab1dSNoel Grandin                 rReq.Done( true );
912c35616ddSStephan Bergmann                 rReq.SetReturnValue(SfxBoolItem(rReq.GetSlot(), true));
913fd069beeSJens-Heiner Rechtien                 return;
914fd069beeSJens-Heiner Rechtien             }
915fd069beeSJens-Heiner Rechtien             else
916fd069beeSJens-Heiner Rechtien             {
917f5f7b4efSAlbert Thuswaldner                 // Record as not done
918fd069beeSJens-Heiner Rechtien                 rReq.Done();
919c35616ddSStephan Bergmann                 rReq.SetReturnValue(SfxBoolItem(rReq.GetSlot(), false));
9201c087eb5SXisco Fauli                 m_pImpl->bReloading = false;
921fd069beeSJens-Heiner Rechtien                 return;
922fd069beeSJens-Heiner Rechtien             }
923fd069beeSJens-Heiner Rechtien         }
924fd069beeSJens-Heiner Rechtien     }
925fd069beeSJens-Heiner Rechtien }
926fd069beeSJens-Heiner Rechtien 
StateReload_Impl(SfxItemSet & rSet)927fd069beeSJens-Heiner Rechtien void SfxViewFrame::StateReload_Impl( SfxItemSet& rSet )
928fd069beeSJens-Heiner Rechtien {
929fd069beeSJens-Heiner Rechtien     SfxObjectShell* pSh = GetObjectShell();
930fd069beeSJens-Heiner Rechtien     if ( !pSh )
9317185e84bSCaolán McNamara     {
932f5f7b4efSAlbert Thuswaldner         // I'm just on reload and am yielding myself ...
933fd069beeSJens-Heiner Rechtien         return;
9347185e84bSCaolán McNamara     }
935fd069beeSJens-Heiner Rechtien 
936fd069beeSJens-Heiner Rechtien     SfxWhichIter aIter( rSet );
937fd069beeSJens-Heiner Rechtien     for ( sal_uInt16 nWhich = aIter.FirstWhich(); nWhich; nWhich = aIter.NextWhich() )
938fd069beeSJens-Heiner Rechtien     {
939fd069beeSJens-Heiner Rechtien         switch ( nWhich )
940fd069beeSJens-Heiner Rechtien         {
941fd069beeSJens-Heiner Rechtien             case SID_EDITDOC:
9425afa7678SGulsah Kose             case SID_READONLYDOC:
943fd069beeSJens-Heiner Rechtien             {
944b3062ae6SLionel Elie Mamane                 const SfxViewShell *pVSh;
945b3062ae6SLionel Elie Mamane                 const SfxShell *pFSh;
9467e2a6709SJochen Nitschke                 if ( !pSh->HasName() ||
947ccfa9fa1SNoel Grandin                      !( pSh->Get_Impl()->nLoadedFlags &  SfxLoadedFlags::MAINDOCUMENT ) ||
948523922eeSSamuel Mehrbrodt                      (pSh->isEditDocLocked()) ||
94989dd3f80SNoel Grandin                      ( pSh->GetCreateMode() == SfxObjectCreateMode::EMBEDDED &&
950b3062ae6SLionel Elie Mamane                        ( !(pVSh = pSh->GetViewShell())  ||
951b3062ae6SLionel Elie Mamane                          !(pFSh = pVSh->GetFormShell()) ||
952b3062ae6SLionel Elie Mamane                          !pFSh->IsDesignMode())))
9535afa7678SGulsah Kose                     rSet.DisableItem( nWhich );
954fd069beeSJens-Heiner Rechtien                 else
955fd069beeSJens-Heiner Rechtien                 {
9567ce3ff3eSMiklos Vajna                     SfxMedium* pMedium = pSh->GetMedium();
9577ce3ff3eSMiklos Vajna                     const SfxBoolItem* pItem = pMedium ? pMedium->GetItemSet().GetItem(SID_EDITDOC, false) : nullptr;
958fd069beeSJens-Heiner Rechtien                     if ( pItem && !pItem->GetValue() )
9595afa7678SGulsah Kose                         rSet.DisableItem( nWhich );
960fd069beeSJens-Heiner Rechtien                     else
9615afa7678SGulsah Kose                     {
9625afa7678SGulsah Kose                         if (nWhich==SID_EDITDOC)
963fd069beeSJens-Heiner Rechtien                             rSet.Put( SfxBoolItem( nWhich, !pSh->IsReadOnly() ) );
9645afa7678SGulsah Kose                         else if (nWhich==SID_READONLYDOC)
9655afa7678SGulsah Kose                             rSet.Put( SfxBoolItem( nWhich, pSh->IsReadOnly() ) );
9665afa7678SGulsah Kose                     }
967fd069beeSJens-Heiner Rechtien                 }
968fd069beeSJens-Heiner Rechtien                 break;
969fd069beeSJens-Heiner Rechtien             }
970fd069beeSJens-Heiner Rechtien 
971fd069beeSJens-Heiner Rechtien             case SID_RELOAD:
972fd069beeSJens-Heiner Rechtien             {
9737e2a6709SJochen Nitschke                 if ( !pSh->CanReload_Impl() || pSh->GetCreateMode() == SfxObjectCreateMode::EMBEDDED )
97405558d91SKurt Zenker                     rSet.DisableItem(nWhich);
975a9634d6cSSamuel Mehrbrodt                 else
976a9634d6cSSamuel Mehrbrodt                 {
977a9634d6cSSamuel Mehrbrodt                     // If any ChildFrame is reloadable, the slot is enabled,
978a9634d6cSSamuel Mehrbrodt                     // so you can perform CTRL-Reload
979a9634d6cSSamuel Mehrbrodt                     rSet.Put( SfxBoolItem( nWhich, false));
980a9634d6cSSamuel Mehrbrodt                 }
981a9634d6cSSamuel Mehrbrodt 
982fd069beeSJens-Heiner Rechtien                 break;
983fd069beeSJens-Heiner Rechtien             }
984fd069beeSJens-Heiner Rechtien         }
985fd069beeSJens-Heiner Rechtien     }
986fd069beeSJens-Heiner Rechtien }
987fd069beeSJens-Heiner Rechtien 
ExecHistory_Impl(SfxRequest & rReq)988fd069beeSJens-Heiner Rechtien void SfxViewFrame::ExecHistory_Impl( SfxRequest &rReq )
989fd069beeSJens-Heiner Rechtien {
990f5f7b4efSAlbert Thuswaldner     // Is there an Undo-Manager on the top Shell?
991fd069beeSJens-Heiner Rechtien     SfxShell *pSh = GetDispatcher()->GetShell(0);
9929eb083abSXisco Fauli     if (!pSh)
9939eb083abSXisco Fauli         return;
9949eb083abSXisco Fauli 
9952d71dd52SNoel Grandin     SfxUndoManager* pShUndoMgr = pSh->GetUndoManager();
9969278df2cSNoel Grandin     bool bOK = false;
997513f80abSJens-Heiner Rechtien     if ( pShUndoMgr )
998fd069beeSJens-Heiner Rechtien     {
999fd069beeSJens-Heiner Rechtien         switch ( rReq.GetSlot() )
1000fd069beeSJens-Heiner Rechtien         {
1001fd069beeSJens-Heiner Rechtien             case SID_CLEARHISTORY:
1002513f80abSJens-Heiner Rechtien                 pShUndoMgr->Clear();
10039278df2cSNoel Grandin                 bOK = true;
1004fd069beeSJens-Heiner Rechtien                 break;
1005fd069beeSJens-Heiner Rechtien 
1006fd069beeSJens-Heiner Rechtien             case SID_UNDO:
1007ee04c3f3SFrank Schoenheit [fs]                 pShUndoMgr->Undo();
1008c2324940SNoel Grandin                 GetBindings().InvalidateAll(false);
10099278df2cSNoel Grandin                 bOK = true;
1010fd069beeSJens-Heiner Rechtien                 break;
1011fd069beeSJens-Heiner Rechtien 
1012fd069beeSJens-Heiner Rechtien             case SID_REDO:
1013ee04c3f3SFrank Schoenheit [fs]                 pShUndoMgr->Redo();
1014c2324940SNoel Grandin                 GetBindings().InvalidateAll(false);
10159278df2cSNoel Grandin                 bOK = true;
1016fd069beeSJens-Heiner Rechtien                 break;
1017fd069beeSJens-Heiner Rechtien 
1018fd069beeSJens-Heiner Rechtien             case SID_REPEAT:
1019fd069beeSJens-Heiner Rechtien                 if ( pSh->GetRepeatTarget() )
1020bd8a6553SFrank Schoenheit [fs]                     pShUndoMgr->Repeat( *pSh->GetRepeatTarget() );
10219278df2cSNoel Grandin                 bOK = true;
1022fd069beeSJens-Heiner Rechtien                 break;
1023fd069beeSJens-Heiner Rechtien         }
1024fd069beeSJens-Heiner Rechtien     }
1025fd069beeSJens-Heiner Rechtien     else if ( GetViewShell() )
1026fd069beeSJens-Heiner Rechtien     {
1027f5f7b4efSAlbert Thuswaldner         // The SW has its own undo in the View
1028789a737aSArmin Le Grand (allotropia)         const SfxPoolItemHolder& rResult(GetViewShell()->ExecuteSlot(rReq));
10292ddec231SArmin Le Grand (allotropia)         if (rResult)
1030789a737aSArmin Le Grand (allotropia)             bOK = static_cast<const SfxBoolItem*>(rResult.getItem())->GetValue();
1031fd069beeSJens-Heiner Rechtien     }
1032fd069beeSJens-Heiner Rechtien 
1033fd069beeSJens-Heiner Rechtien     rReq.SetReturnValue( SfxBoolItem( rReq.GetSlot(), bOK ) );
1034fd069beeSJens-Heiner Rechtien     rReq.Done();
1035fd069beeSJens-Heiner Rechtien }
1036fd069beeSJens-Heiner Rechtien 
StateHistory_Impl(SfxItemSet & rSet)1037fd069beeSJens-Heiner Rechtien void SfxViewFrame::StateHistory_Impl( SfxItemSet &rSet )
1038fd069beeSJens-Heiner Rechtien {
1039f5f7b4efSAlbert Thuswaldner     // Search for Undo-Manager
1040fd069beeSJens-Heiner Rechtien     SfxShell *pSh = GetDispatcher()->GetShell(0);
1041fd069beeSJens-Heiner Rechtien     if ( !pSh )
1042f5f7b4efSAlbert Thuswaldner         // I'm just on reload and am yielding myself ...
1043fd069beeSJens-Heiner Rechtien         return;
1044fd069beeSJens-Heiner Rechtien 
10452d71dd52SNoel Grandin     SfxUndoManager *pShUndoMgr = pSh->GetUndoManager();
1046513f80abSJens-Heiner Rechtien     if ( !pShUndoMgr )
1047fd069beeSJens-Heiner Rechtien     {
1048f5f7b4efSAlbert Thuswaldner         // The SW has its own undo in the View
1049fd069beeSJens-Heiner Rechtien         SfxWhichIter aIter( rSet );
1050fd069beeSJens-Heiner Rechtien         SfxViewShell *pViewSh = GetViewShell();
1051fd069beeSJens-Heiner Rechtien         if( !pViewSh ) return;
1052fd069beeSJens-Heiner Rechtien         for ( sal_uInt16 nSID = aIter.FirstWhich(); nSID; nSID = aIter.NextWhich() )
105328034eafSStephan Bergmann             pViewSh->GetSlotState( nSID, nullptr, &rSet );
1054fd069beeSJens-Heiner Rechtien         return;
1055fd069beeSJens-Heiner Rechtien     }
1056fd069beeSJens-Heiner Rechtien 
1057513f80abSJens-Heiner Rechtien     if ( pShUndoMgr->GetUndoActionCount() == 0 &&
1058513f80abSJens-Heiner Rechtien          pShUndoMgr->GetRedoActionCount() == 0 &&
1059513f80abSJens-Heiner Rechtien          pShUndoMgr->GetRepeatActionCount() == 0 )
1060fd069beeSJens-Heiner Rechtien         rSet.DisableItem( SID_CLEARHISTORY );
1061fd069beeSJens-Heiner Rechtien 
106204c1a98cSMike Kaganski     if (pShUndoMgr->GetUndoActionCount())
10630ac92837SHenry Castro     {
10640ac92837SHenry Castro         const SfxUndoAction* pAction = pShUndoMgr->GetUndoAction();
10650ac92837SHenry Castro         SfxViewShell *pViewSh = GetViewShell();
10660ac92837SHenry Castro         if (pViewSh && pAction->GetViewShellId() != pViewSh->GetViewShellId())
10670ac92837SHenry Castro         {
10680ac92837SHenry Castro             rSet.Put(SfxUInt32Item(SID_UNDO, static_cast<sal_uInt32>(SID_REPAIRPACKAGE)));
10690ac92837SHenry Castro         }
10700ac92837SHenry Castro         else
10710ac92837SHenry Castro         {
10722155e04dSCaolán McNamara             rSet.Put( SfxStringItem( SID_UNDO, SvtResId(STR_UNDO)+pShUndoMgr->GetUndoActionComment() ) );
10730ac92837SHenry Castro         }
10740ac92837SHenry Castro     }
1075fd069beeSJens-Heiner Rechtien     else
1076fd069beeSJens-Heiner Rechtien         rSet.DisableItem( SID_UNDO );
1077fd069beeSJens-Heiner Rechtien 
107804c1a98cSMike Kaganski     if (pShUndoMgr->GetRedoActionCount())
10790ac92837SHenry Castro     {
10800ac92837SHenry Castro         const SfxUndoAction* pAction = pShUndoMgr->GetRedoAction();
10810ac92837SHenry Castro         SfxViewShell *pViewSh = GetViewShell();
10820ac92837SHenry Castro         if (pViewSh && pAction->GetViewShellId() != pViewSh->GetViewShellId())
10830ac92837SHenry Castro         {
10840ac92837SHenry Castro             rSet.Put(SfxUInt32Item(SID_REDO, static_cast<sal_uInt32>(SID_REPAIRPACKAGE)));
10850ac92837SHenry Castro         }
10860ac92837SHenry Castro         else
10870ac92837SHenry Castro         {
1088ec266879SCaolán McNamara             rSet.Put(SfxStringItem(SID_REDO, SvtResId(STR_REDO) + pShUndoMgr->GetRedoActionComment()));
10890ac92837SHenry Castro         }
10900ac92837SHenry Castro     }
1091fd069beeSJens-Heiner Rechtien     else
1092fd069beeSJens-Heiner Rechtien         rSet.DisableItem( SID_REDO );
1093e256519aSMatteo Casalin 
1094fd069beeSJens-Heiner Rechtien     SfxRepeatTarget *pTarget = pSh->GetRepeatTarget();
109504c1a98cSMike Kaganski     if (pTarget && pShUndoMgr->GetRepeatActionCount() && pShUndoMgr->CanRepeat(*pTarget))
10962155e04dSCaolán McNamara         rSet.Put( SfxStringItem( SID_REPEAT, SvtResId(STR_REPEAT)+pShUndoMgr->GetRepeatActionComment(*pTarget) ) );
1097fd069beeSJens-Heiner Rechtien     else
1098fd069beeSJens-Heiner Rechtien         rSet.DisableItem( SID_REPEAT );
1099fd069beeSJens-Heiner Rechtien }
1100fd069beeSJens-Heiner Rechtien 
PopShellAndSubShells_Impl(SfxViewShell & i_rViewShell)110183ee99a9SFrank Schoenheit [fs] void SfxViewFrame::PopShellAndSubShells_Impl( SfxViewShell& i_rViewShell )
1102fd069beeSJens-Heiner Rechtien {
110383ee99a9SFrank Schoenheit [fs]     i_rViewShell.PopSubShells_Impl();
110498b6e387SMiklos Vajna     sal_uInt16 nLevel = m_pDispatcher->GetShellLevel( i_rViewShell );
110583ee99a9SFrank Schoenheit [fs]     if ( nLevel != USHRT_MAX )
110683ee99a9SFrank Schoenheit [fs]     {
110783ee99a9SFrank Schoenheit [fs]         if ( nLevel )
110883ee99a9SFrank Schoenheit [fs]         {
110983ee99a9SFrank Schoenheit [fs]             // more sub shells on the stack, which were not affected by PopSubShells_Impl
111050fa7d25SXisco Fauli             if (SfxShell *pSubShell = m_pDispatcher->GetShell( nLevel-1 ))
111198b6e387SMiklos Vajna                 m_pDispatcher->Pop( *pSubShell, SfxDispatcherPopFlags::POP_UNTIL | SfxDispatcherPopFlags::POP_DELETE );
111283ee99a9SFrank Schoenheit [fs]         }
111398b6e387SMiklos Vajna         m_pDispatcher->Pop( i_rViewShell );
111498b6e387SMiklos Vajna         m_pDispatcher->Flush();
1115fd069beeSJens-Heiner Rechtien     }
1116fd069beeSJens-Heiner Rechtien 
1117fd069beeSJens-Heiner Rechtien }
1118fd069beeSJens-Heiner Rechtien 
1119f5f7b4efSAlbert Thuswaldner /*  [Description]
1120fd069beeSJens-Heiner Rechtien 
1121f5f7b4efSAlbert Thuswaldner     This method empties the SfxViewFrame, i.e. takes the <SfxObjectShell>
1122f5f7b4efSAlbert Thuswaldner     from the dispatcher and ends its <SfxListener> Relationship to this
1123f5f7b4efSAlbert Thuswaldner     SfxObjectShell (by which they may even destroy themselves).
1124fd069beeSJens-Heiner Rechtien 
1125f5f7b4efSAlbert Thuswaldner     Thus, by invoking ReleaseObjectShell() and  SetObjectShell() the
1126f5f7b4efSAlbert Thuswaldner     SfxObjectShell can be replaced.
1127fd069beeSJens-Heiner Rechtien 
11285cba5821SMichael Meeks     Between ReleaseObjectShell() and SetObjectShell() the control cannot
1129f5f7b4efSAlbert Thuswaldner     be handed over to the system.
1130fd069beeSJens-Heiner Rechtien 
1131f5f7b4efSAlbert Thuswaldner     [Cross-reference]
1132fd069beeSJens-Heiner Rechtien 
1133fd069beeSJens-Heiner Rechtien     <SfxViewFrame::SetObjectShell(SfxObjectShell&)>
1134fd069beeSJens-Heiner Rechtien */
ReleaseObjectShell_Impl()1135278e2b36SMarkus Mohrhard void SfxViewFrame::ReleaseObjectShell_Impl()
1136fd069beeSJens-Heiner Rechtien {
113749783285SNoel Grandin     DBG_ASSERT( m_xObjSh.is(), "no SfxObjectShell to release!" );
1138fd069beeSJens-Heiner Rechtien 
1139b47cb646SNoel Grandin     GetFrame().ReleasingComponent_Impl();
1140e8f8f24cSStephan Bergmann     if ( GetWindow().HasChildPathFocus( true ) )
11418868592eSRüdiger Timm     {
11428868592eSRüdiger Timm         GetWindow().GrabFocus();
11438868592eSRüdiger Timm     }
11448868592eSRüdiger Timm 
1145fd069beeSJens-Heiner Rechtien     SfxViewShell *pDyingViewSh = GetViewShell();
1146fd069beeSJens-Heiner Rechtien     if ( pDyingViewSh )
1147fd069beeSJens-Heiner Rechtien     {
114883ee99a9SFrank Schoenheit [fs]         PopShellAndSubShells_Impl( *pDyingViewSh );
11498868592eSRüdiger Timm         pDyingViewSh->DisconnectAllClients();
115028034eafSStephan Bergmann         SetViewShell_Impl(nullptr);
11518868592eSRüdiger Timm         delete pDyingViewSh;
1152fd069beeSJens-Heiner Rechtien     }
1153fd069beeSJens-Heiner Rechtien #ifdef DBG_UTIL
1154fd069beeSJens-Heiner Rechtien     else
1155f5f7b4efSAlbert Thuswaldner         OSL_FAIL("No Shell");
1156fd069beeSJens-Heiner Rechtien #endif
1157fd069beeSJens-Heiner Rechtien 
115849783285SNoel Grandin     if ( m_xObjSh.is() )
1159fd069beeSJens-Heiner Rechtien     {
116098b6e387SMiklos Vajna         m_pDispatcher->Pop( *m_xObjSh );
116198b6e387SMiklos Vajna         SfxModule* pModule = m_xObjSh->GetModule();
1162fd069beeSJens-Heiner Rechtien         if( pModule )
116398b6e387SMiklos Vajna             m_pDispatcher->RemoveShell_Impl( *pModule );
116498b6e387SMiklos Vajna         m_pDispatcher->Flush();
116598b6e387SMiklos Vajna         EndListening( *m_xObjSh );
11668868592eSRüdiger Timm 
1167a6673198SNoel Grandin         Notify( *m_xObjSh, SfxHint(SfxHintId::TitleChanged) );
1168a6673198SNoel Grandin         Notify( *m_xObjSh, SfxHint(SfxHintId::DocChanged) );
1169fd069beeSJens-Heiner Rechtien 
11701c087eb5SXisco Fauli         if ( 1 == m_xObjSh->GetOwnerLockCount() && m_pImpl->bObjLocked && m_xObjSh->GetCreateMode() == SfxObjectCreateMode::EMBEDDED )
117198b6e387SMiklos Vajna             m_xObjSh->DoClose();
117298b6e387SMiklos Vajna         SfxObjectShellRef xDyingObjSh = m_xObjSh;
117349783285SNoel Grandin         m_xObjSh.clear();
11749c90c5e4SNoel Grandin         if( GetFrame().GetHasTitle() && m_pImpl->nDocViewNo )
11751c087eb5SXisco Fauli             xDyingObjSh->GetNoSet_Impl().ReleaseIndex(m_pImpl->nDocViewNo-1);
11761c087eb5SXisco Fauli         if ( m_pImpl->bObjLocked )
1177fd069beeSJens-Heiner Rechtien         {
1178c35616ddSStephan Bergmann             xDyingObjSh->OwnerLock( false );
11791c087eb5SXisco Fauli             m_pImpl->bObjLocked = false;
1180fd069beeSJens-Heiner Rechtien         }
11818868592eSRüdiger Timm     }
1182fd069beeSJens-Heiner Rechtien 
1183e9c7d259SNoel Grandin     GetDispatcher()->SetDisableFlags( SfxDisableFlags::NONE );
1184fd069beeSJens-Heiner Rechtien }
1185fd069beeSJens-Heiner Rechtien 
Close()1186c9dcd0a6SNoel Grandin void SfxViewFrame::Close()
1187fd069beeSJens-Heiner Rechtien {
1188fd069beeSJens-Heiner Rechtien 
1189ef15b85eSFrank Schoenheit [fs]     DBG_ASSERT( GetFrame().IsClosing_Impl() || !GetFrame().GetFrameInterface().is(), "ViewFrame closed too early!" );
1190fd069beeSJens-Heiner Rechtien 
1191f5f7b4efSAlbert Thuswaldner     // If no saving have been made up until now, then embedded Objects should
1192f5f7b4efSAlbert Thuswaldner     // not be saved automatically anymore.
1193fd069beeSJens-Heiner Rechtien     if ( GetViewShell() )
1194ce470df9STakeshi Abe         GetViewShell()->DisconnectAllClients();
1195a6673198SNoel Grandin     Broadcast( SfxHint( SfxHintId::Dying ) );
1196fd069beeSJens-Heiner Rechtien 
1197419e42edSFrank Schoenheit [fs]     if (SfxViewFrame::Current() == this)
119828034eafSStephan Bergmann         SfxViewFrame::SetViewFrame( nullptr );
1199419e42edSFrank Schoenheit [fs] 
12002eae33e8SAndrea Gelmini     // Since the Dispatcher is emptied, it can not be used in any reasonable
1201f5f7b4efSAlbert Thuswaldner     // manner, thus it is better to let the dispatcher be.
12025fe7ecc0SNoel Grandin     GetDispatcher()->Lock(true);
1203419e42edSFrank Schoenheit [fs]     delete this;
1204fd069beeSJens-Heiner Rechtien }
1205fd069beeSJens-Heiner Rechtien 
DoActivate(bool bUI)1206bd5ceabbSNoel Grandin void SfxViewFrame::DoActivate( bool bUI )
1207fd069beeSJens-Heiner Rechtien {
120820c14c81SNoel Grandin     m_pDispatcher->DoActivate_Impl( bUI );
1209fd069beeSJens-Heiner Rechtien }
1210fd069beeSJens-Heiner Rechtien 
DoDeactivate(bool bUI,SfxViewFrame const * pNewFrame)12117ed17807SNoel Grandin void SfxViewFrame::DoDeactivate(bool bUI, SfxViewFrame const * pNewFrame )
1212fd069beeSJens-Heiner Rechtien {
121398b6e387SMiklos Vajna     m_pDispatcher->DoDeactivate_Impl( bUI, pNewFrame );
1214fd069beeSJens-Heiner Rechtien }
1215fd069beeSJens-Heiner Rechtien 
InvalidateBorderImpl(const SfxViewShell * pSh)12166c1be809SKurt Zenker void SfxViewFrame::InvalidateBorderImpl( const SfxViewShell* pSh )
1217fd069beeSJens-Heiner Rechtien {
1218536a6d6cSNoel Grandin     if( !pSh || m_nAdjustPosPixelLock )
1219536a6d6cSNoel Grandin         return;
1220536a6d6cSNoel Grandin 
12216c1be809SKurt Zenker     if ( GetViewShell() && GetWindow().IsVisible() )
12226c1be809SKurt Zenker     {
1223ef15b85eSFrank Schoenheit [fs]         if ( GetFrame().IsInPlace() )
12246c1be809SKurt Zenker         {
12256c1be809SKurt Zenker             return;
12266c1be809SKurt Zenker         }
12276c1be809SKurt Zenker 
122877e6854aSStephan Bergmann         DoAdjustPosSizePixel( GetViewShell(), Point(),
1229424d17e6SStephan Bergmann                                         GetWindow().GetOutputSizePixel(),
1230424d17e6SStephan Bergmann                                         false );
12316c1be809SKurt Zenker     }
1232fd069beeSJens-Heiner Rechtien }
1233fd069beeSJens-Heiner Rechtien 
SetBorderPixelImpl(const SfxViewShell * pVSh,const SvBorder & rBorder)123438c23520SNoel Grandin void SfxViewFrame::SetBorderPixelImpl
1235fd069beeSJens-Heiner Rechtien (
1236419e42edSFrank Schoenheit [fs]     const SfxViewShell* pVSh,
1237fd069beeSJens-Heiner Rechtien     const SvBorder&     rBorder
1238fd069beeSJens-Heiner Rechtien )
1239fd069beeSJens-Heiner Rechtien 
1240fd069beeSJens-Heiner Rechtien {
12411c087eb5SXisco Fauli     m_pImpl->aBorder = rBorder;
1242419e42edSFrank Schoenheit [fs] 
12431f7c5d2aSNoel Grandin     if ( m_pImpl->bResizeInToOut && !GetFrame().IsInPlace() )
1244419e42edSFrank Schoenheit [fs]     {
1245419e42edSFrank Schoenheit [fs]         Size aSize = pVSh->GetWindow()->GetOutputSizePixel();
1246419e42edSFrank Schoenheit [fs]         if ( aSize.Width() && aSize.Height() )
1247419e42edSFrank Schoenheit [fs]         {
12483987c2b0SNoel Grandin             aSize.AdjustWidth(rBorder.Left() + rBorder.Right() );
12493987c2b0SNoel Grandin             aSize.AdjustHeight(rBorder.Top() + rBorder.Bottom() );
1250419e42edSFrank Schoenheit [fs] 
1251419e42edSFrank Schoenheit [fs]             Size aOldSize = GetWindow().GetOutputSizePixel();
1252419e42edSFrank Schoenheit [fs]             GetWindow().SetOutputSizePixel( aSize );
1253827c46e7SNoel Grandin             vcl::Window* pParent = &GetWindow();
1254419e42edSFrank Schoenheit [fs]             while ( pParent->GetParent() )
1255419e42edSFrank Schoenheit [fs]                 pParent = pParent->GetParent();
1256419e42edSFrank Schoenheit [fs]             Size aOuterSize = pParent->GetOutputSizePixel();
12573987c2b0SNoel Grandin             aOuterSize.AdjustWidth( aSize.Width() - aOldSize.Width() );
12583987c2b0SNoel Grandin             aOuterSize.AdjustHeight( aSize.Height() - aOldSize.Height() );
1259419e42edSFrank Schoenheit [fs]             pParent->SetOutputSizePixel( aOuterSize );
1260419e42edSFrank Schoenheit [fs]         }
1261419e42edSFrank Schoenheit [fs]     }
1262419e42edSFrank Schoenheit [fs]     else
1263419e42edSFrank Schoenheit [fs]     {
126408ab1f46SNoel Grandin         tools::Rectangle aEditArea( Point(), GetWindow().GetOutputSizePixel() );
12653987c2b0SNoel Grandin         aEditArea.AdjustLeft(rBorder.Left() );
12663987c2b0SNoel Grandin         aEditArea.AdjustRight( -(rBorder.Right()) );
12673987c2b0SNoel Grandin         aEditArea.AdjustTop(rBorder.Top() );
12683987c2b0SNoel Grandin         aEditArea.AdjustBottom( -(rBorder.Bottom()) );
1269419e42edSFrank Schoenheit [fs]         pVSh->GetWindow()->SetPosSizePixel( aEditArea.TopLeft(), aEditArea.GetSize() );
1270419e42edSFrank Schoenheit [fs]     }
1271fd069beeSJens-Heiner Rechtien }
1272fd069beeSJens-Heiner Rechtien 
GetBorderPixelImpl() const127338c23520SNoel Grandin const SvBorder& SfxViewFrame::GetBorderPixelImpl() const
1274fd069beeSJens-Heiner Rechtien {
12751c087eb5SXisco Fauli     return m_pImpl->aBorder;
1276fd069beeSJens-Heiner Rechtien }
1277fd069beeSJens-Heiner Rechtien 
AppendReadOnlyInfobar()1278a201ab6fSMiklos Vajna void SfxViewFrame::AppendReadOnlyInfobar()
1279a201ab6fSMiklos Vajna {
128021bba18bSMike Kaganski     if (officecfg::Office::Common::Misc::ViewerAppMode::get())
128121bba18bSMike Kaganski         return;
128221bba18bSMike Kaganski 
1283a201ab6fSMiklos Vajna     bool bSignPDF = m_xObjSh->IsSignPDF();
1284a201ab6fSMiklos Vajna     bool bSignWithCert = false;
1285a201ab6fSMiklos Vajna     if (bSignPDF)
1286a201ab6fSMiklos Vajna     {
128762dd6274SMiklos Vajna         SfxViewShell* pViewShell = GetViewShell();
128862dd6274SMiklos Vajna         uno::Reference<security::XCertificate> xCertificate = pViewShell->GetSignPDFCertificate().m_xCertificate;
12895e040ad0SMiklos Vajna         bSignWithCert = xCertificate.is();
1290a201ab6fSMiklos Vajna     }
1291a201ab6fSMiklos Vajna 
1292ca5c9591SNoel Grandin     auto pInfoBar = AppendInfoBar(u"readonly"_ustr, u""_ustr,
1293a201ab6fSMiklos Vajna                                   SfxResId(bSignPDF ? STR_READONLY_PDF : STR_READONLY_DOCUMENT),
1294a201ab6fSMiklos Vajna                                   InfobarType::INFO);
1295f659ec61SNoel Grandin     if (!pInfoBar)
1296f659ec61SNoel Grandin         return;
1297f659ec61SNoel Grandin 
1298a201ab6fSMiklos Vajna     if (bSignPDF)
1299a201ab6fSMiklos Vajna     {
1300a201ab6fSMiklos Vajna         // SID_SIGNPDF opened a read-write PDF
1301a201ab6fSMiklos Vajna         // read-only for signing purposes.
1302af90b808SCaolán McNamara         weld::Button& rSignButton = pInfoBar->addButton();
1303a201ab6fSMiklos Vajna         if (bSignWithCert)
1304a201ab6fSMiklos Vajna         {
1305af90b808SCaolán McNamara             rSignButton.set_label(SfxResId(STR_READONLY_FINISH_SIGN));
1306a201ab6fSMiklos Vajna         }
1307a201ab6fSMiklos Vajna         else
1308a201ab6fSMiklos Vajna         {
1309af90b808SCaolán McNamara             rSignButton.set_label(SfxResId(STR_READONLY_SIGN));
1310a201ab6fSMiklos Vajna         }
1311a201ab6fSMiklos Vajna 
1312af90b808SCaolán McNamara         rSignButton.connect_clicked(LINK(this, SfxViewFrame, SignDocumentHandler));
1313a201ab6fSMiklos Vajna     }
1314a201ab6fSMiklos Vajna 
1315a201ab6fSMiklos Vajna     bool showEditDocumentButton = true;
1316a201ab6fSMiklos Vajna     if (m_xObjSh->isEditDocLocked())
1317a201ab6fSMiklos Vajna         showEditDocumentButton = false;
1318a201ab6fSMiklos Vajna 
1319a201ab6fSMiklos Vajna     if (showEditDocumentButton)
1320a201ab6fSMiklos Vajna     {
1321af90b808SCaolán McNamara         weld::Button& rBtn = pInfoBar->addButton();
1322af90b808SCaolán McNamara         rBtn.set_label(SfxResId(STR_READONLY_EDIT));
1323af90b808SCaolán McNamara         rBtn.connect_clicked(LINK(this, SfxViewFrame, SwitchReadOnlyHandler));
1324a201ab6fSMiklos Vajna     }
1325a201ab6fSMiklos Vajna }
1326a201ab6fSMiklos Vajna 
HandleSecurityInfobar(const OUString & sSecondaryMessage)13271f440348SBalazs Varga void SfxViewFrame::HandleSecurityInfobar(const OUString& sSecondaryMessage)
13281f440348SBalazs Varga {
13291f440348SBalazs Varga     if (!HasInfoBarWithID(u"securitywarn"))
13301f440348SBalazs Varga     {
13311f440348SBalazs Varga         // new info bar
13321f440348SBalazs Varga         if (!sSecondaryMessage.isEmpty())
13331f440348SBalazs Varga         {
1334ca5c9591SNoel Grandin             auto pInfoBar = AppendInfoBar(u"securitywarn"_ustr, SfxResId(STR_HIDDENINFO_CONTAINS).replaceAll("\n\n", " "),
13351f440348SBalazs Varga                 sSecondaryMessage, InfobarType::WARNING);
13361f440348SBalazs Varga             if (!pInfoBar)
13371f440348SBalazs Varga                 return;
13381f440348SBalazs Varga 
13391f440348SBalazs Varga             weld::Button& rGetInvolvedButton = pInfoBar->addButton();
13401f440348SBalazs Varga             rGetInvolvedButton.set_label(SfxResId(STR_SECURITY_OPTIONS));
13411f440348SBalazs Varga             rGetInvolvedButton.connect_clicked(LINK(this, SfxViewFrame, SecurityButtonHandler));
13421f440348SBalazs Varga         }
13431f440348SBalazs Varga     }
13441f440348SBalazs Varga     else
13451f440348SBalazs Varga     {
13461f440348SBalazs Varga         // info bar exists already
13471f440348SBalazs Varga         if (sSecondaryMessage.isEmpty())
13481f440348SBalazs Varga         {
13491f440348SBalazs Varga             RemoveInfoBar(u"securitywarn");
13501f440348SBalazs Varga         }
13511f440348SBalazs Varga         else
13521f440348SBalazs Varga         {
13531f440348SBalazs Varga             UpdateInfoBar(u"securitywarn", SfxResId(STR_HIDDENINFO_CONTAINS).replaceAll("\n\n", " "),
13541f440348SBalazs Varga                 sSecondaryMessage, InfobarType::WARNING);
13551f440348SBalazs Varga         }
13561f440348SBalazs Varga     }
13571f440348SBalazs Varga }
13581f440348SBalazs Varga 
AppendContainsMacrosInfobar()13596691816fSCaolán McNamara void SfxViewFrame::AppendContainsMacrosInfobar()
13606691816fSCaolán McNamara {
136121bba18bSMike Kaganski     if (officecfg::Office::Common::Misc::ViewerAppMode::get())
136221bba18bSMike Kaganski         return;
136321bba18bSMike Kaganski 
13646691816fSCaolán McNamara     SfxObjectShell_Impl* pObjImpl = m_xObjSh->Get_Impl();
13656691816fSCaolán McNamara 
136664a5509dSCaolán McNamara     auto aResId = STR_CONTAINS_MACROS;
136764a5509dSCaolán McNamara     if (SvtSecurityOptions::IsMacroDisabled())
136864a5509dSCaolán McNamara         aResId = STR_MACROS_DISABLED;
136964a5509dSCaolán McNamara     else if (pObjImpl->aMacroMode.hasUnsignedContentError())
137064a5509dSCaolán McNamara         aResId = STR_MACROS_DISABLED_CONTENT_UNSIGNED;
13712beaa3beSSarper Akdemir     else if(pObjImpl->aMacroMode.hasInvalidSignaturesError())
13722beaa3beSSarper Akdemir         aResId = STR_MACROS_DISABLED_SIGNATURE_INVALID;
137364a5509dSCaolán McNamara     // The idea here is to always present an infobar is there was some
137464a5509dSCaolán McNamara     // macro/script related potential hazard disabled in the source document
1375ca5c9591SNoel Grandin     auto pInfoBar = AppendInfoBar(u"macro"_ustr, SfxResId(STR_MACROS_DISABLED_TITLE),
137664a5509dSCaolán McNamara                                   SfxResId(aResId), InfobarType::WARNING);
137764a5509dSCaolán McNamara     if (!pInfoBar)
137864a5509dSCaolán McNamara         return;
137964a5509dSCaolán McNamara 
138064a5509dSCaolán McNamara     // Then show buttons to help navigate to whatever that hazard is.  Whether
138164a5509dSCaolán McNamara     // that is included macros, so the user could delete them.  Or events bound
138264a5509dSCaolán McNamara     // to scripts which could be cleared.  But there are likely other cases not
138364a5509dSCaolán McNamara     // captured here, which could be added, various blocked features where its
138464a5509dSCaolán McNamara     // likely still worth displaying the infobar that they have been disabled,
138564a5509dSCaolán McNamara     // even if we don't currently provide a way to indicate what exactly those
138664a5509dSCaolán McNamara     // are and how to remove them.
138764a5509dSCaolán McNamara 
138864a5509dSCaolán McNamara     // No access to macro dialog when macros are disabled globally, so return
138964a5509dSCaolán McNamara     // early without adding buttons to help explore what the macros/script/events
139064a5509dSCaolán McNamara     // might be.
139164a5509dSCaolán McNamara     if (SvtSecurityOptions::IsMacroDisabled())
139264a5509dSCaolán McNamara         return;
139364a5509dSCaolán McNamara 
13946691816fSCaolán McNamara     // what's the difference between pObjImpl->documentStorageHasMacros() and pObjImpl->aMacroMode.hasMacroLibrary() ?
1395f41627abSSamuel Mehrbrodt     bool bHasDocumentMacros = pObjImpl->aMacroMode.hasMacroLibrary();
13966691816fSCaolán McNamara 
13976691816fSCaolán McNamara     Reference<XModel> xModel = m_xObjSh->GetModel();
13986691816fSCaolán McNamara     uno::Reference<document::XEventsSupplier> xSupplier(xModel, uno::UNO_QUERY);
13996691816fSCaolán McNamara     bool bHasBoundConfigEvents(false);
14006691816fSCaolán McNamara     if (xSupplier.is())
14016691816fSCaolán McNamara     {
14026691816fSCaolán McNamara         css::uno::Reference<css::container::XNameReplace> xDocumentEvents = xSupplier->getEvents();
14036691816fSCaolán McNamara 
14046691816fSCaolán McNamara         Sequence<OUString> eventNames = xDocumentEvents->getElementNames();
14056691816fSCaolán McNamara         sal_Int32 nEventCount = eventNames.getLength();
14066691816fSCaolán McNamara         for (sal_Int32 nEvent = 0; nEvent < nEventCount; ++nEvent)
14076691816fSCaolán McNamara         {
14086691816fSCaolán McNamara             OUString url;
14096691816fSCaolán McNamara             try
14106691816fSCaolán McNamara             {
14116691816fSCaolán McNamara                 Any aAny(xDocumentEvents->getByName(eventNames[nEvent]));
14126691816fSCaolán McNamara                 Sequence<beans::PropertyValue> props;
14136691816fSCaolán McNamara                 if (aAny >>= props)
14146691816fSCaolán McNamara                 {
14156691816fSCaolán McNamara                     ::comphelper::NamedValueCollection aProps(props);
1416ca5c9591SNoel Grandin                     url = aProps.getOrDefault(u"Script"_ustr, url);
14176691816fSCaolán McNamara                 }
14186691816fSCaolán McNamara             }
14196691816fSCaolán McNamara             catch (const Exception&)
14206691816fSCaolán McNamara             {
14216691816fSCaolán McNamara             }
14226691816fSCaolán McNamara             if (!url.isEmpty())
14236691816fSCaolán McNamara             {
14246691816fSCaolán McNamara                 bHasBoundConfigEvents = true;
14256691816fSCaolán McNamara                 break;
14266691816fSCaolán McNamara             }
14276691816fSCaolán McNamara         }
14286691816fSCaolán McNamara     }
14296691816fSCaolán McNamara 
1430f41627abSSamuel Mehrbrodt     if (bHasDocumentMacros)
1431f41627abSSamuel Mehrbrodt     {
1432f41627abSSamuel Mehrbrodt         weld::Button& rMacroButton = pInfoBar->addButton();
1433f41627abSSamuel Mehrbrodt         rMacroButton.set_label(SfxResId(STR_MACROS));
1434f41627abSSamuel Mehrbrodt         rMacroButton.connect_clicked(LINK(this, SfxViewFrame, MacroButtonHandler));
1435f41627abSSamuel Mehrbrodt     }
1436f41627abSSamuel Mehrbrodt 
14376691816fSCaolán McNamara     if (bHasBoundConfigEvents)
14386691816fSCaolán McNamara     {
14396691816fSCaolán McNamara         weld::Button& rEventButton = pInfoBar->addButton();
14406691816fSCaolán McNamara         rEventButton.set_label(SfxResId(STR_EVENTS));
14416691816fSCaolán McNamara         rEventButton.connect_clicked(LINK(this, SfxViewFrame, EventButtonHandler));
14426691816fSCaolán McNamara     }
14432beaa3beSSarper Akdemir 
14442beaa3beSSarper Akdemir     if (pObjImpl->aMacroMode.hasInvalidSignaturesError())
14452beaa3beSSarper Akdemir     {
14462beaa3beSSarper Akdemir         weld::Button& rSignaturesButton = pInfoBar->addButton();
14472beaa3beSSarper Akdemir         rSignaturesButton.set_label(SfxResId(STR_SIGNATURE_SHOW));
14482beaa3beSSarper Akdemir         rSignaturesButton.connect_clicked(LINK(this, SfxViewFrame, ViewSignaturesButtonHandler));
14492beaa3beSSarper Akdemir     }
14506691816fSCaolán McNamara }
14516691816fSCaolán McNamara 
1452d8978605SLászló Németh namespace
1453d8978605SLászló Németh {
getLayoutManager(const SfxFrame & rFrame)1454d8978605SLászló Németh css::uno::Reference<css::frame::XLayoutManager> getLayoutManager(const SfxFrame& rFrame)
1455d8978605SLászló Németh {
1456d8978605SLászló Németh     css::uno::Reference<css::frame::XLayoutManager> xLayoutManager;
1457d8978605SLászló Németh     css::uno::Reference<css::beans::XPropertySet> xPropSet(rFrame.GetFrameInterface(),
1458d8978605SLászló Németh                                                  uno::UNO_QUERY);
1459d8978605SLászló Németh     if (xPropSet.is())
1460d8978605SLászló Németh     {
1461d8978605SLászló Németh         try
1462d8978605SLászló Németh         {
1463ca5c9591SNoel Grandin             xLayoutManager.set(xPropSet->getPropertyValue(u"LayoutManager"_ustr), uno::UNO_QUERY);
1464d8978605SLászló Németh         }
1465d8978605SLászló Németh         catch (const Exception& e)
1466d8978605SLászló Németh         {
1467d8978605SLászló Németh             SAL_WARN("sfx.view", "Failure getting layout manager: " + e.Message);
1468d8978605SLászló Németh         }
1469d8978605SLászló Németh     }
1470d8978605SLászló Németh     return xLayoutManager;
1471d8978605SLászló Németh }
1472d8978605SLászló Németh }
1473d8978605SLászló Németh 
IsHeadlessOrUITest()14741f42157eSCaolán McNamara bool SfxApplication::IsHeadlessOrUITest()
14751f42157eSCaolán McNamara {
14761f42157eSCaolán McNamara     if (Application::IsHeadlessModeEnabled())
14771f42157eSCaolán McNamara         return true;
14781f42157eSCaolán McNamara 
147968a96f74SMike Kaganski     bool bRet = o3tl::IsRunningUITest(); //uitest.uicheck fails when the dialog is open
14801f42157eSCaolán McNamara     for (sal_uInt16 i = 0, nCount = Application::GetCommandLineParamCount(); i < nCount; ++i)
14811f42157eSCaolán McNamara     {
14821f42157eSCaolán McNamara         if (Application::GetCommandLineParam(i) == "--nologo")
14831f42157eSCaolán McNamara         {
148469e7000eSNoel Grandin             bRet = true;
14851f42157eSCaolán McNamara             break;
14861f42157eSCaolán McNamara         }
14871f42157eSCaolán McNamara     }
148869e7000eSNoel Grandin     return bRet;
14891f42157eSCaolán McNamara }
14901f42157eSCaolán McNamara 
IsTipOfTheDayDue()14911f42157eSCaolán McNamara bool SfxApplication::IsTipOfTheDayDue()
14921f42157eSCaolán McNamara {
14931f42157eSCaolán McNamara     const bool bShowTipOfTheDay = officecfg::Office::Common::Misc::ShowTipOfTheDay::get();
14941f42157eSCaolán McNamara     if (!bShowTipOfTheDay)
14951f42157eSCaolán McNamara         return false;
14961f42157eSCaolán McNamara 
14971f42157eSCaolán McNamara     const auto t0 = std::chrono::system_clock::now().time_since_epoch();
14981f42157eSCaolán McNamara 
14991f42157eSCaolán McNamara     // show tip-of-the-day dialog ?
15001f42157eSCaolán McNamara     const sal_Int32 nLastTipOfTheDay = officecfg::Office::Common::Misc::LastTipOfTheDayShown::get();
15011f42157eSCaolán McNamara     const sal_Int32 nDay = std::chrono::duration_cast<std::chrono::hours>(t0).count()/24; // days since 1970-01-01
15021f42157eSCaolán McNamara     return nDay - nLastTipOfTheDay > 0; //only once per day
15031f42157eSCaolán McNamara }
15041f42157eSCaolán McNamara 
Notify(SfxBroadcaster &,const SfxHint & rHint)1505513f80abSJens-Heiner Rechtien void SfxViewFrame::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
1506fd069beeSJens-Heiner Rechtien {
15071f7c5d2aSNoel Grandin     if(m_pImpl->bIsDowning)
1508fd069beeSJens-Heiner Rechtien         return;
1509fd069beeSJens-Heiner Rechtien 
15107d8196eaSEike Rathke     // we know only SfxEventHint or simple SfxHint
1511757a7337SCaolán McNamara     if (rHint.GetId() == SfxHintId::ThisIsAnSfxEventHint)
1512fd069beeSJens-Heiner Rechtien     {
1513f5f7b4efSAlbert Thuswaldner         // When the Document is loaded asynchronously, was the Dispatcher
1514f5f7b4efSAlbert Thuswaldner         // set as ReadOnly, to what must be returned when the document itself
1515f5f7b4efSAlbert Thuswaldner         // is not read only, and the loading is finished.
1516757a7337SCaolán McNamara         switch (static_cast<const SfxEventHint&>(rHint).GetEventId())
1517fd069beeSJens-Heiner Rechtien         {
1518ed2b8ca9SNoel Grandin             case SfxEventHintId::ModifyChanged:
1519fd069beeSJens-Heiner Rechtien             {
1520fd069beeSJens-Heiner Rechtien                 SfxBindings& rBind = GetBindings();
1521fd069beeSJens-Heiner Rechtien                 rBind.Invalidate( SID_DOC_MODIFIED );
1522fd069beeSJens-Heiner Rechtien                 rBind.Invalidate( SID_RELOAD );
1523c7e172b2SJens-Heiner Rechtien                 rBind.Invalidate( SID_EDITDOC );
1524fd069beeSJens-Heiner Rechtien                 break;
1525fd069beeSJens-Heiner Rechtien             }
1526fd069beeSJens-Heiner Rechtien 
1527ed2b8ca9SNoel Grandin             case SfxEventHintId::OpenDoc:
1528ed2b8ca9SNoel Grandin             case SfxEventHintId::CreateDoc:
1529fd069beeSJens-Heiner Rechtien             {
153049783285SNoel Grandin                 if ( !m_xObjSh.is() )
1531419e42edSFrank Schoenheit [fs]                     break;
1532419e42edSFrank Schoenheit [fs] 
1533c7e172b2SJens-Heiner Rechtien                 SfxBindings& rBind = GetBindings();
1534c7e172b2SJens-Heiner Rechtien                 rBind.Invalidate( SID_RELOAD );
1535c7e172b2SJens-Heiner Rechtien                 rBind.Invalidate( SID_EDITDOC );
15362dff5e85SSamuel Mehrbrodt 
153760774065SHeiko Tietze                 bool bIsInfobarShown(false);
153860774065SHeiko Tietze 
153960774065SHeiko Tietze                 if (officecfg::Office::Common::Passwords::HasMaster::get() &&
154060774065SHeiko Tietze                     officecfg::Office::Common::Passwords::StorageVersion::get() == 0)
154160774065SHeiko Tietze                 {
154260774065SHeiko Tietze                     // master password stored in deprecated format
154360774065SHeiko Tietze                     VclPtr<SfxInfoBarWindow> pOldMasterPasswordInfoBar =
1544ca5c9591SNoel Grandin                         AppendInfoBar(u"oldmasterpassword"_ustr, u""_ustr,
154560774065SHeiko Tietze                                       SfxResId(STR_REFRESH_MASTER_PASSWORD), InfobarType::DANGER, false);
154660774065SHeiko Tietze                     bIsInfobarShown = true;
154760774065SHeiko Tietze                     if (pOldMasterPasswordInfoBar)
154860774065SHeiko Tietze                     {
154960774065SHeiko Tietze                         weld::Button& rButton = pOldMasterPasswordInfoBar->addButton();
155060774065SHeiko Tietze                         rButton.set_label(SfxResId(STR_REFRESH_PASSWORD));
155160774065SHeiko Tietze                         rButton.connect_clicked(LINK(this,
155260774065SHeiko Tietze                                                    SfxViewFrame, RefreshMasterPasswordHdl));
155360774065SHeiko Tietze                         if (Application::GetHelp())
155460774065SHeiko Tietze                         {
155560774065SHeiko Tietze                             weld::Button& rHelp = pOldMasterPasswordInfoBar->addButton();
155660774065SHeiko Tietze                             rHelp.set_label(SfxResId(RID_STR_HELP));
155760774065SHeiko Tietze                             rHelp.connect_clicked(LINK(this, SfxViewFrame, HelpMasterPasswordHdl));
155860774065SHeiko Tietze                         }
155960774065SHeiko Tietze                     }
156060774065SHeiko Tietze                 }
156160774065SHeiko Tietze 
156260774065SHeiko Tietze                 const bool bEmbedded = m_xObjSh->GetCreateMode() == SfxObjectCreateMode::EMBEDDED;
156360774065SHeiko Tietze 
156460774065SHeiko Tietze                 // read-only infobar if necessary
156560774065SHeiko Tietze                 const SfxViewShell *pVSh;
156660774065SHeiko Tietze                 const SfxShell *pFSh;
156760774065SHeiko Tietze                 if ( m_xObjSh->IsReadOnly() &&
156860774065SHeiko Tietze                     ! m_xObjSh->IsSecurityOptOpenReadOnly() &&
156960774065SHeiko Tietze                     ( !bEmbedded ||
157060774065SHeiko Tietze                         (( pVSh = m_xObjSh->GetViewShell()) && (pFSh = pVSh->GetFormShell()) && pFSh->IsDesignMode())))
157160774065SHeiko Tietze                 {
157260774065SHeiko Tietze                     AppendReadOnlyInfobar();
157360774065SHeiko Tietze                     bIsInfobarShown = true;
157460774065SHeiko Tietze                 }
157560774065SHeiko Tietze 
157660774065SHeiko Tietze                 if (!bEmbedded && m_xObjSh->Get_Impl()->getCurrentMacroExecMode() == css::document::MacroExecMode::NEVER_EXECUTE)
157760774065SHeiko Tietze                 {
157860774065SHeiko Tietze                     AppendContainsMacrosInfobar();
157960774065SHeiko Tietze                     bIsInfobarShown = true;
158060774065SHeiko Tietze                 }
158160774065SHeiko Tietze 
158260774065SHeiko Tietze                 if (vcl::CommandInfoProvider::GetModuleIdentifier(GetFrame().GetFrameInterface()) == "com.sun.star.text.TextDocument")
158360774065SHeiko Tietze                     sfx2::SfxNotebookBar::ReloadNotebookBar(u"modules/swriter/ui/");
158460774065SHeiko Tietze 
158560774065SHeiko Tietze                 if (SfxClassificationHelper::IsClassified(m_xObjSh->getDocProperties()))
158660774065SHeiko Tietze                 {
158760774065SHeiko Tietze                     // Document has BAILS properties, display an infobar accordingly.
158860774065SHeiko Tietze                     SfxClassificationHelper aHelper(m_xObjSh->getDocProperties());
158960774065SHeiko Tietze                     aHelper.UpdateInfobar(*this);
159060774065SHeiko Tietze                 }
159160774065SHeiko Tietze 
159260774065SHeiko Tietze                 // Add pending infobars
159360774065SHeiko Tietze                 std::vector<InfobarData>& aPendingInfobars = m_xObjSh->getPendingInfobars();
159460774065SHeiko Tietze                 while (!aPendingInfobars.empty())
159560774065SHeiko Tietze                 {
159660774065SHeiko Tietze                     InfobarData& aInfobarData = aPendingInfobars.back();
159760774065SHeiko Tietze 
159860774065SHeiko Tietze                     // don't show Track Changes infobar, if Track Changes toolbar is visible
159960774065SHeiko Tietze                     if (aInfobarData.msId == "hiddentrackchanges")
160060774065SHeiko Tietze                     {
160160774065SHeiko Tietze                         if (auto xLayoutManager = getLayoutManager(GetFrame()))
160260774065SHeiko Tietze                         {
160360774065SHeiko Tietze                             if ( xLayoutManager->getElement(CHANGES_STR).is() )
160460774065SHeiko Tietze                             {
160560774065SHeiko Tietze                                 aPendingInfobars.pop_back();
160660774065SHeiko Tietze                                 continue;
160760774065SHeiko Tietze                             }
160860774065SHeiko Tietze                         }
160960774065SHeiko Tietze                     }
161060774065SHeiko Tietze 
161160774065SHeiko Tietze                     // Track Changes infobar: add a button to show/hide Track Changes functions
161260774065SHeiko Tietze                     // Hyphenation infobar: add a button to get more information
161360774065SHeiko Tietze                     // tdf#148913 limit VclPtr usage for these
161460774065SHeiko Tietze                     bool bTrackChanges = aInfobarData.msId == "hiddentrackchanges";
161560774065SHeiko Tietze                     if ( bTrackChanges || aInfobarData.msId == "hyphenationmissing" )
161660774065SHeiko Tietze                     {
161760774065SHeiko Tietze                         VclPtr<SfxInfoBarWindow> pInfoBar =
161860774065SHeiko Tietze                             AppendInfoBar(aInfobarData.msId, aInfobarData.msPrimaryMessage,
161960774065SHeiko Tietze                                   aInfobarData.msSecondaryMessage, aInfobarData.maInfobarType,
162060774065SHeiko Tietze                                   aInfobarData.mbShowCloseButton);
162160774065SHeiko Tietze                         bIsInfobarShown = true;
162260774065SHeiko Tietze 
162360774065SHeiko Tietze                         // tdf#148913 don't extend this condition to keep it thread-safe
162460774065SHeiko Tietze                         if (pInfoBar)
162560774065SHeiko Tietze                         {
162660774065SHeiko Tietze                             weld::Button& rButton = pInfoBar->addButton();
162760774065SHeiko Tietze                             rButton.set_label(SfxResId(bTrackChanges
162860774065SHeiko Tietze                                     ? STR_TRACK_CHANGES_BUTTON
162960774065SHeiko Tietze                                     : STR_HYPHENATION_BUTTON));
163060774065SHeiko Tietze                             if (bTrackChanges)
163160774065SHeiko Tietze                             {
163260774065SHeiko Tietze                                 rButton.connect_clicked(LINK(this,
163360774065SHeiko Tietze                                                     SfxViewFrame, HiddenTrackChangesHandler));
163460774065SHeiko Tietze                             }
163560774065SHeiko Tietze                             else
163660774065SHeiko Tietze                             {
163760774065SHeiko Tietze                                 rButton.connect_clicked(LINK(this,
163860774065SHeiko Tietze                                                     SfxViewFrame, HyphenationMissingHandler));
163960774065SHeiko Tietze                             }
164060774065SHeiko Tietze                         }
164160774065SHeiko Tietze                     }
164260774065SHeiko Tietze                     else
164360774065SHeiko Tietze                     {
164460774065SHeiko Tietze                         AppendInfoBar(aInfobarData.msId, aInfobarData.msPrimaryMessage,
164560774065SHeiko Tietze                                   aInfobarData.msSecondaryMessage, aInfobarData.maInfobarType,
164660774065SHeiko Tietze                                   aInfobarData.mbShowCloseButton);
164760774065SHeiko Tietze                         bIsInfobarShown = true;
164860774065SHeiko Tietze                     }
164960774065SHeiko Tietze 
165060774065SHeiko Tietze                     aPendingInfobars.pop_back();
165160774065SHeiko Tietze                 }
165260774065SHeiko Tietze 
165302140554SArmin Le Grand (Allotropia) #if !ENABLE_WASM_STRIP_PINGUSER
16541bd9747aSHeiko Tietze                 if (!SfxApplication::IsHeadlessOrUITest()) //uitest.uicheck fails when the dialog is open
16551bd9747aSHeiko Tietze                 {
16569e1470c0SHeiko Tietze                     bool bIsWhatsNewShown = false; //suppress tipoftheday if whatsnew was shown
16579e1470c0SHeiko Tietze 
16589d90a173SHeiko Tietze                     static const bool bRunningUnitTest = o3tl::IsRunningUnitTest() || o3tl::IsRunningUITest();
1659aadde536SMike Kaganski                     //what's new dialog
1660aadde536SMike Kaganski                     static bool wantsWhatsNew = officecfg::Setup::Product::WhatsNew::get()
1661aadde536SMike Kaganski                                                 && !IsInModalMode() && !bRunningUnitTest
1662aadde536SMike Kaganski                                                 && utl::isProductVersionUpgraded(); //sets isProductVersionNew
1663aadde536SMike Kaganski                     if (wantsWhatsNew)
1664aadde536SMike Kaganski                     {
1665aadde536SMike Kaganski                         wantsWhatsNew = false;
1666aadde536SMike Kaganski 
1667aadde536SMike Kaganski                         if (utl::isProductVersionNew()) //welcome dialog
16689d90a173SHeiko Tietze                         {
16699d90a173SHeiko Tietze                             SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
16709d90a173SHeiko Tietze                             ScopedVclPtr<SfxAbstractTabDialog> pDlg(
16719e1470c0SHeiko Tietze                                 pFact->CreateWelcomeDialog(GetWindow().GetFrameWeld(), true));
16729d90a173SHeiko Tietze                             pDlg->Execute();
16739d90a173SHeiko Tietze                         }
1674aadde536SMike Kaganski                         else if (officecfg::Setup::Product::WhatsNewDialog::get()) //whatsnew dialog
16759e1470c0SHeiko Tietze                         {
16769e1470c0SHeiko Tietze                             SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
16779e1470c0SHeiko Tietze                             ScopedVclPtr<SfxAbstractTabDialog> pDlg(
16789e1470c0SHeiko Tietze                                 pFact->CreateWelcomeDialog(GetWindow().GetFrameWeld(), false));
16799e1470c0SHeiko Tietze                             pDlg->Execute();
16809e1470c0SHeiko Tietze                         }
1681aadde536SMike Kaganski                         else //whatsnew infobar
16829e1470c0SHeiko Tietze                         {
16839e1470c0SHeiko Tietze                             OUString sText(SfxResId(STR_WHATSNEW_TEXT));
16849e1470c0SHeiko Tietze                             VclPtr<SfxInfoBarWindow> pInfoBar = AppendInfoBar(u"whatsnew"_ustr, u""_ustr, sText.replaceAll("\n",""), InfobarType::INFO);
16851bd9747aSHeiko Tietze                             if (pInfoBar)
16861bd9747aSHeiko Tietze                             {
16871bd9747aSHeiko Tietze                                 weld::Button& rWhatsNewButton = pInfoBar->addButton();
16881bd9747aSHeiko Tietze                                 rWhatsNewButton.set_label(SfxResId(STR_WHATSNEW_BUTTON));
16891bd9747aSHeiko Tietze                                 rWhatsNewButton.connect_clicked(LINK(this, SfxViewFrame, WhatsNewHandler));
16901bd9747aSHeiko Tietze                             }
16919e1470c0SHeiko Tietze                         }
16921bd9747aSHeiko Tietze                         bIsInfobarShown = true;
1693dd889b29SHeiko Tietze                         bIsWhatsNewShown = true;
1694dd889b29SHeiko Tietze                     }
16955187d3aeSheiko tietze 
16961f42157eSCaolán McNamara                     // show tip-of-the-day dialog if it due, but not if there is the impress modal template dialog
16971f42157eSCaolán McNamara                     // open where SdModule::ExecuteNewDocument will launch it instead when that dialog is dismissed
16981bd9747aSHeiko Tietze                     if (SfxApplication::IsTipOfTheDayDue() && !IsInModalMode() && !bIsWhatsNewShown)
16991f42157eSCaolán McNamara                     {
1700a2c09afeSMatt K                         bool bIsBaseFormOpen = false;
1701a2c09afeSMatt K 
1702a2c09afeSMatt K                         const auto xCurrentFrame = GetFrame().GetFrameInterface();
170341ab82d5SNoel Grandin                         const auto& xContext = comphelper::getProcessComponentContext();
1704a2c09afeSMatt K                         const auto xModuleManager = css::frame::ModuleManager::create(xContext);
1705a2c09afeSMatt K                         switch (vcl::EnumContext::GetApplicationEnum(
170643dcd826SCaolán McNamara                             vcl::CommandInfoProvider::GetModuleIdentifier(xCurrentFrame)))
1707a2c09afeSMatt K                         {
1708a2c09afeSMatt K                             case vcl::EnumContext::Application::WriterForm:
170943dcd826SCaolán McNamara                             case vcl::EnumContext::Application::WriterReport:
1710a2c09afeSMatt K                                 bIsBaseFormOpen = true;
1711a2c09afeSMatt K                                 break;
1712a2c09afeSMatt K                             default:
1713a2c09afeSMatt K                                 break;
1714a2c09afeSMatt K                         }
1715a2c09afeSMatt K                         if (!bIsBaseFormOpen)
1716a2c09afeSMatt K                         {
17179be58fddSCaolán McNamara                             // tdf#127946 pass in argument for dialog parent
171843dcd826SCaolán McNamara                             SfxUnoFrameItem aDocFrame(SID_FILLFRAME, xCurrentFrame);
1719a2c09afeSMatt K                             GetDispatcher()->ExecuteList(SID_TIPOFTHEDAY, SfxCallMode::SLOT, {},
1720a2c09afeSMatt K                                                         { &aDocFrame });
1721a2c09afeSMatt K                         }
17229be58fddSCaolán McNamara                     }
1723a1700d52Sheiko tietze 
1724c3fa7a82SJan Holesovsky                     // inform about the community involvement
17251f42157eSCaolán McNamara                     const auto t0 = std::chrono::system_clock::now().time_since_epoch();
17267f38b582Sheiko tietze                     const sal_Int64 nLastGetInvolvedShown = officecfg::Setup::Product::LastTimeGetInvolvedShown::get();
1727a1700d52Sheiko tietze                     const sal_Int64 nNow = std::chrono::duration_cast<std::chrono::seconds>(t0).count();
17289fb7c77eSheiko tietze                     const sal_Int64 nPeriodSec(60 * 60 * 24 * 180); // 180 days in seconds
1729c3fa7a82SJan Holesovsky                     bool bUpdateLastTimeGetInvolvedShown = false;
1730c3fa7a82SJan Holesovsky 
17317f38b582Sheiko tietze                     if (nLastGetInvolvedShown == 0)
1732c3fa7a82SJan Holesovsky                         bUpdateLastTimeGetInvolvedShown = true;
173360774065SHeiko Tietze                     else if (!bIsInfobarShown && nPeriodSec < nNow && nLastGetInvolvedShown < (nNow + nPeriodSec/2) - nPeriodSec) // 90d alternating with donation
1734c3fa7a82SJan Holesovsky                     {
1735c3fa7a82SJan Holesovsky                         bUpdateLastTimeGetInvolvedShown = true;
1736c3fa7a82SJan Holesovsky 
1737ca5c9591SNoel Grandin                         VclPtr<SfxInfoBarWindow> pInfoBar = AppendInfoBar(u"getinvolved"_ustr, u""_ustr, SfxResId(STR_GET_INVOLVED_TEXT), InfobarType::INFO);
173860774065SHeiko Tietze                         bIsInfobarShown = true;
1739be4fcac7SJulien Nabet                         if (pInfoBar)
1740be4fcac7SJulien Nabet                         {
1741af90b808SCaolán McNamara                             weld::Button& rGetInvolvedButton = pInfoBar->addButton();
1742af90b808SCaolán McNamara                             rGetInvolvedButton.set_label(SfxResId(STR_GET_INVOLVED_BUTTON));
1743af90b808SCaolán McNamara                             rGetInvolvedButton.connect_clicked(LINK(this, SfxViewFrame, GetInvolvedHandler));
1744c3fa7a82SJan Holesovsky                         }
1745be4fcac7SJulien Nabet                     }
1746c3fa7a82SJan Holesovsky 
1747ec235750SMike Kaganski                     if (bUpdateLastTimeGetInvolvedShown
1748ec235750SMike Kaganski                         && !officecfg::Setup::Product::LastTimeGetInvolvedShown::isReadOnly())
1749c3fa7a82SJan Holesovsky                     {
1750c3fa7a82SJan Holesovsky                         std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create());
1751c3fa7a82SJan Holesovsky                         officecfg::Setup::Product::LastTimeGetInvolvedShown::set(nNow, batch);
1752c3fa7a82SJan Holesovsky                         batch->commit();
1753c3fa7a82SJan Holesovsky                     }
1754c3fa7a82SJan Holesovsky 
17557f38b582Sheiko tietze                     // inform about donations
17567f38b582Sheiko tietze                     const sal_Int64 nLastDonateShown = officecfg::Setup::Product::LastTimeDonateShown::get();
17577f38b582Sheiko tietze                     bool bUpdateLastTimeDonateShown = false;
17587f38b582Sheiko tietze 
17597f38b582Sheiko tietze                     if (nLastDonateShown == 0)
17607f38b582Sheiko tietze                         bUpdateLastTimeDonateShown = true;
176160774065SHeiko Tietze                     else if (!bIsInfobarShown && nPeriodSec < nNow && nLastDonateShown < nNow - nPeriodSec) // 90d alternating with getinvolved
17627f38b582Sheiko tietze                     {
17637f38b582Sheiko tietze                         bUpdateLastTimeDonateShown = true;
17647f38b582Sheiko tietze 
1765ca5c9591SNoel Grandin                         VclPtr<SfxInfoBarWindow> pInfoBar = AppendInfoBar(u"donate"_ustr, u""_ustr, SfxResId(STR_DONATE_TEXT), InfobarType::INFO);
1766be4fcac7SJulien Nabet                         if (pInfoBar)
1767be4fcac7SJulien Nabet                         {
1768af90b808SCaolán McNamara                             weld::Button& rDonateButton = pInfoBar->addButton();
1769af90b808SCaolán McNamara                             rDonateButton.set_label(SfxResId(STR_DONATE_BUTTON));
1770af90b808SCaolán McNamara                             rDonateButton.connect_clicked(LINK(this, SfxViewFrame, DonationHandler));
17717f38b582Sheiko tietze                         }
1772be4fcac7SJulien Nabet                     }
17737f38b582Sheiko tietze 
17747f38b582Sheiko tietze                     if (bUpdateLastTimeDonateShown
17757f38b582Sheiko tietze                         && !officecfg::Setup::Product::LastTimeDonateShown::isReadOnly())
17767f38b582Sheiko tietze                     {
17777f38b582Sheiko tietze                         std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create());
17787f38b582Sheiko tietze                         officecfg::Setup::Product::LastTimeDonateShown::set(nNow, batch);
17797f38b582Sheiko tietze                         batch->commit();
17807f38b582Sheiko tietze                     }
17819f55ef05SThorsten Behrens                 }
1782c39b832eSStephan Bergmann #else
1783c39b832eSStephan Bergmann                 (void) bIsInfobarShown;
178402140554SArmin Le Grand (Allotropia) #endif
1785506d8f17SSamuel Mehrbrodt 
1786fd069beeSJens-Heiner Rechtien                 break;
1787fd069beeSJens-Heiner Rechtien             }
1788ed2b8ca9SNoel Grandin             default: break;
1789fd069beeSJens-Heiner Rechtien         }
1790fd069beeSJens-Heiner Rechtien     }
17917d8196eaSEike Rathke     else
17927d8196eaSEike Rathke     {
17937d8196eaSEike Rathke         switch( rHint.GetId() )
17947d8196eaSEike Rathke         {
1795a6673198SNoel Grandin             case SfxHintId::ModeChanged:
17967d8196eaSEike Rathke             {
17977d8196eaSEike Rathke                 UpdateTitle();
17987d8196eaSEike Rathke 
179949783285SNoel Grandin                 if ( !m_xObjSh.is() )
18007d8196eaSEike Rathke                     break;
18017d8196eaSEike Rathke 
18027d8196eaSEike Rathke                 // Switch r/o?
18037d8196eaSEike Rathke                 SfxBindings& rBind = GetBindings();
18047d8196eaSEike Rathke                 rBind.Invalidate( SID_RELOAD );
18057d8196eaSEike Rathke                 SfxDispatcher *pDispat = GetDispatcher();
18067d8196eaSEike Rathke                 bool bWasReadOnly = pDispat->GetReadOnly_Impl();
18077d8196eaSEike Rathke                 bool bIsReadOnly = m_xObjSh->IsReadOnly();
18087d8196eaSEike Rathke                 if ( bWasReadOnly != bIsReadOnly )
18097d8196eaSEike Rathke                 {
18107d8196eaSEike Rathke                     // Then also TITLE_CHANGED
18117d8196eaSEike Rathke                     UpdateTitle();
18127d8196eaSEike Rathke                     rBind.Invalidate( SID_FILE_NAME );
18137d8196eaSEike Rathke                     rBind.Invalidate( SID_DOCINFO_TITLE );
18147d8196eaSEike Rathke                     rBind.Invalidate( SID_EDITDOC );
18157d8196eaSEike Rathke 
18167d8196eaSEike Rathke                     pDispat->GetBindings()->InvalidateAll(true);
18177d8196eaSEike Rathke                     pDispat->SetReadOnly_Impl( bIsReadOnly );
18187d8196eaSEike Rathke 
18197d8196eaSEike Rathke                     // Only force and Dispatcher-Update, if it is done next
1820dd2b3210SAndrea Gelmini                     // anyway, otherwise flickering or GPF is possible since
18217d8196eaSEike Rathke                     // the Writer for example prefers in Resize perform some
18227d8196eaSEike Rathke                     // actions which has a SetReadOnlyUI in Dispatcher as a
18237d8196eaSEike Rathke                     // result!
18247d8196eaSEike Rathke 
18257d8196eaSEike Rathke                     if ( pDispat->IsUpdated_Impl() )
18267d8196eaSEike Rathke                         pDispat->Update_Impl(true);
18277d8196eaSEike Rathke                 }
18287d8196eaSEike Rathke 
18297d8196eaSEike Rathke                 Enable( !m_xObjSh->IsInModalMode() );
18307d8196eaSEike Rathke                 break;
18317d8196eaSEike Rathke             }
18327d8196eaSEike Rathke 
1833a6673198SNoel Grandin             case SfxHintId::TitleChanged:
18347d8196eaSEike Rathke             {
18357d8196eaSEike Rathke                 UpdateTitle();
18367d8196eaSEike Rathke                 SfxBindings& rBind = GetBindings();
18377d8196eaSEike Rathke                 rBind.Invalidate( SID_FILE_NAME );
18387d8196eaSEike Rathke                 rBind.Invalidate( SID_DOCINFO_TITLE );
18397d8196eaSEike Rathke                 rBind.Invalidate( SID_EDITDOC );
18407d8196eaSEike Rathke                 rBind.Invalidate( SID_RELOAD );
18417d8196eaSEike Rathke                 break;
18427d8196eaSEike Rathke             }
18437d8196eaSEike Rathke 
18446fd6e3c1SHenry Castro             case SfxHintId::DocumentRepair:
18456fd6e3c1SHenry Castro             {
18466fd6e3c1SHenry Castro                 GetBindings().Invalidate( SID_DOC_REPAIR );
18476fd6e3c1SHenry Castro                 break;
18486fd6e3c1SHenry Castro             }
18496fd6e3c1SHenry Castro 
1850a6673198SNoel Grandin             case SfxHintId::Deinitializing:
1851072e3ce1SHenry Castro             {
1852d5d8fa63SHenry Castro                 vcl::Window* pFrameWin = GetWindow().GetFrameWindow();
1853d5d8fa63SHenry Castro                 if (pFrameWin && pFrameWin->GetLOKNotifier())
1854d5d8fa63SHenry Castro                     pFrameWin->ReleaseLOKNotifier();
1855072e3ce1SHenry Castro 
18567d8196eaSEike Rathke                 GetFrame().DoClose();
18577d8196eaSEike Rathke                 break;
1858072e3ce1SHenry Castro             }
1859a6673198SNoel Grandin             case SfxHintId::Dying:
18607d8196eaSEike Rathke                 // when the Object is being deleted, destroy the view too
186149783285SNoel Grandin                 if ( m_xObjSh.is() )
18627d8196eaSEike Rathke                     ReleaseObjectShell_Impl();
18637d8196eaSEike Rathke                 else
18647d8196eaSEike Rathke                     GetFrame().DoClose();
18657d8196eaSEike Rathke                 break;
1866a6673198SNoel Grandin             default: break;
18677d8196eaSEike Rathke         }
18687d8196eaSEike Rathke     }
1869fd069beeSJens-Heiner Rechtien }
1870fd069beeSJens-Heiner Rechtien 
187102140554SArmin Le Grand (Allotropia) #if !ENABLE_WASM_STRIP_PINGUSER
IMPL_LINK_NOARG(SfxViewFrame,WhatsNewHandler,weld::Button &,void)18721bd9747aSHeiko Tietze IMPL_LINK_NOARG(SfxViewFrame, WhatsNewHandler, weld::Button&, void)
18731bd9747aSHeiko Tietze {
18741bd9747aSHeiko Tietze     GetDispatcher()->Execute(SID_WHATSNEW);
18751bd9747aSHeiko Tietze }
18761bd9747aSHeiko Tietze 
IMPL_LINK_NOARG(SfxViewFrame,GetInvolvedHandler,weld::Button &,void)1877af90b808SCaolán McNamara IMPL_LINK_NOARG(SfxViewFrame, GetInvolvedHandler, weld::Button&, void)
1878c3fa7a82SJan Holesovsky {
18799fb7c77eSheiko tietze     GetDispatcher()->Execute(SID_GETINVOLVED);
1880c3fa7a82SJan Holesovsky }
1881c3fa7a82SJan Holesovsky 
IMPL_LINK_NOARG(SfxViewFrame,DonationHandler,weld::Button &,void)1882af90b808SCaolán McNamara IMPL_LINK_NOARG(SfxViewFrame, DonationHandler, weld::Button&, void)
18837f38b582Sheiko tietze {
18847f38b582Sheiko tietze     GetDispatcher()->Execute(SID_DONATION);
18857f38b582Sheiko tietze }
188602140554SArmin Le Grand (Allotropia) #endif
18877f38b582Sheiko tietze 
IMPL_LINK(SfxViewFrame,SwitchReadOnlyHandler,weld::Button &,rButton,void)1888af90b808SCaolán McNamara IMPL_LINK(SfxViewFrame, SwitchReadOnlyHandler, weld::Button&, rButton, void)
1889c6270de9SSamuel Mehrbrodt {
18902c46c24eSMiklos Vajna     if (m_xObjSh.is() && m_xObjSh->IsSignPDF())
1891d4460b70SMiklos Vajna     {
1892af90b808SCaolán McNamara         SfxEditDocumentDialog aDialog(&rButton);
18936a4c464bSCaolán McNamara         if (aDialog.run() != RET_OK)
1894d4460b70SMiklos Vajna             return;
1895d4460b70SMiklos Vajna     }
1896c6270de9SSamuel Mehrbrodt     GetDispatcher()->Execute(SID_EDITDOC);
1897c6270de9SSamuel Mehrbrodt }
1898c6270de9SSamuel Mehrbrodt 
IMPL_LINK_NOARG(SfxViewFrame,SignDocumentHandler,weld::Button &,void)1899af90b808SCaolán McNamara IMPL_LINK_NOARG(SfxViewFrame, SignDocumentHandler, weld::Button&, void)
1900289158d5SMichael Stahl {
1901289158d5SMichael Stahl     GetDispatcher()->Execute(SID_SIGNATURE);
1902289158d5SMichael Stahl }
1903289158d5SMichael Stahl 
IMPL_LINK(SfxViewFrame,HiddenTrackChangesHandler,weld::Button &,rButton,void)1904d8978605SLászló Németh IMPL_LINK(SfxViewFrame, HiddenTrackChangesHandler, weld::Button&, rButton, void)
1905d8978605SLászló Németh {
1906d8978605SLászló Németh     // enable Track Changes toolbar, if it is disabled.
1907d8978605SLászló Németh     // Otherwise disable the toolbar, and close the infobar
190829489b33SNoel Grandin     auto xLayoutManager = getLayoutManager(GetFrame());
190929489b33SNoel Grandin     if (!xLayoutManager)
191029489b33SNoel Grandin         return;
191129489b33SNoel Grandin 
1912d8978605SLászló Németh     if (!xLayoutManager->getElement(CHANGES_STR).is())
1913d8978605SLászló Németh     {
1914d8978605SLászló Németh         xLayoutManager->createElement(CHANGES_STR);
1915d8978605SLászló Németh         xLayoutManager->showElement(CHANGES_STR);
1916d8978605SLászló Németh         rButton.set_label(SfxResId(STR_TRACK_CHANGES_BUTTON_HIDE));
1917d8978605SLászló Németh     }
1918d8978605SLászló Németh     else
1919d8978605SLászló Németh     {
1920d8978605SLászló Németh         xLayoutManager->hideElement(CHANGES_STR);
1921d8978605SLászló Németh         xLayoutManager->destroyElement(CHANGES_STR);
1922d8978605SLászló Németh         RemoveInfoBar(u"hiddentrackchanges");
1923d8978605SLászló Németh     }
1924d8978605SLászló Németh }
1925d8978605SLászló Németh 
IMPL_LINK_NOARG(SfxViewFrame,HyphenationMissingHandler,weld::Button &,void)19266c94eeb9SAndrea Gelmini IMPL_LINK_NOARG(SfxViewFrame, HyphenationMissingHandler, weld::Button&, void)
192714653f89SHeiko Tietze {
192814653f89SHeiko Tietze     GetDispatcher()->Execute(SID_HYPHENATIONMISSING);
192914653f89SHeiko Tietze     RemoveInfoBar(u"hyphenationmissing");
193014653f89SHeiko Tietze }
193114653f89SHeiko Tietze 
IMPL_LINK_NOARG(SfxViewFrame,MacroButtonHandler,weld::Button &,void)19326691816fSCaolán McNamara IMPL_LINK_NOARG(SfxViewFrame, MacroButtonHandler, weld::Button&, void)
19336691816fSCaolán McNamara {
19346691816fSCaolán McNamara     // start with tab 0 displayed
19356691816fSCaolán McNamara     SfxUInt16Item aTabItem(SID_MACROORGANIZER, 0);
19366691816fSCaolán McNamara     SfxBoolItem aCurrentDocItem(FN_PARAM_2, true);
19376691816fSCaolán McNamara     SfxUnoFrameItem aDocFrame(SID_FILLFRAME, GetFrame().GetFrameInterface());
19386691816fSCaolán McNamara     GetDispatcher()->ExecuteList(SID_MACROORGANIZER, SfxCallMode::ASYNCHRON,
19396691816fSCaolán McNamara                                  { &aTabItem, &aCurrentDocItem }, { &aDocFrame });
19406691816fSCaolán McNamara }
19416691816fSCaolán McNamara 
IMPL_LINK_NOARG(SfxViewFrame,SecurityButtonHandler,weld::Button &,void)19421f440348SBalazs Varga IMPL_LINK_NOARG(SfxViewFrame, SecurityButtonHandler, weld::Button&, void)
19431f440348SBalazs Varga {
19442c16ea16SBalazs Varga     GetDispatcher()->Execute(SID_OPTIONS_SECURITY, SfxCallMode::SYNCHRON);
19451f440348SBalazs Varga     RemoveInfoBar(u"securitywarn");
19461f440348SBalazs Varga }
19471f440348SBalazs Varga 
IMPL_LINK_NOARG(SfxViewFrame,EventButtonHandler,weld::Button &,void)19486691816fSCaolán McNamara IMPL_LINK_NOARG(SfxViewFrame, EventButtonHandler, weld::Button&, void)
19496691816fSCaolán McNamara {
19506691816fSCaolán McNamara     SfxUnoFrameItem aDocFrame(SID_FILLFRAME, GetFrame().GetFrameInterface());
19516691816fSCaolán McNamara     GetDispatcher()->ExecuteList(SID_CONFIGEVENT, SfxCallMode::ASYNCHRON,
19526691816fSCaolán McNamara                                  {}, { &aDocFrame });
19536691816fSCaolán McNamara }
19546691816fSCaolán McNamara 
IMPL_LINK_NOARG(SfxViewFrame,ViewSignaturesButtonHandler,weld::Button &,void)19552beaa3beSSarper Akdemir IMPL_LINK_NOARG(SfxViewFrame, ViewSignaturesButtonHandler, weld::Button&, void)
19562beaa3beSSarper Akdemir {
19572beaa3beSSarper Akdemir     SfxObjectShell* pDoc = GetObjectShell();
19582beaa3beSSarper Akdemir     if (!pDoc)
19592beaa3beSSarper Akdemir         return;
19602beaa3beSSarper Akdemir 
19612beaa3beSSarper Akdemir     SfxMedium* pMedium = pDoc->GetMedium();
19622beaa3beSSarper Akdemir     if (!pMedium)
19632beaa3beSSarper Akdemir         return;
19642beaa3beSSarper Akdemir 
19652beaa3beSSarper Akdemir     OUString maODFVersion{};
19662beaa3beSSarper Akdemir     try
19672beaa3beSSarper Akdemir     {
19682beaa3beSSarper Akdemir         uno::Reference<beans::XPropertySet> xPropSet(pDoc->GetStorage(), uno::UNO_QUERY_THROW);
19692beaa3beSSarper Akdemir         xPropSet->getPropertyValue(u"Version"_ustr) >>= maODFVersion;
19702beaa3beSSarper Akdemir     }
19712beaa3beSSarper Akdemir     catch (uno::Exception&)
19722beaa3beSSarper Akdemir     {
19732beaa3beSSarper Akdemir     }
19742beaa3beSSarper Akdemir 
19752beaa3beSSarper Akdemir     uno::Reference<security::XDocumentDigitalSignatures> xDigitalSignatures(
19762beaa3beSSarper Akdemir         security::DocumentDigitalSignatures::createWithVersion(
19772beaa3beSSarper Akdemir             comphelper::getProcessComponentContext(), maODFVersion));
19782beaa3beSSarper Akdemir 
19792beaa3beSSarper Akdemir     if (!xDigitalSignatures.is())
19802beaa3beSSarper Akdemir         return;
19812beaa3beSSarper Akdemir 
19822beaa3beSSarper Akdemir     if (auto xScriptingStorage = pMedium->GetScriptingStorageToSign_Impl())
19832beaa3beSSarper Akdemir         xDigitalSignatures->showScriptingContentSignatures(xScriptingStorage, {});
19842beaa3beSSarper Akdemir }
19852beaa3beSSarper Akdemir 
IMPL_LINK_NOARG(SfxViewFrame,RefreshMasterPasswordHdl,weld::Button &,void)1986bbd196ffSCaolán McNamara IMPL_LINK_NOARG(SfxViewFrame, RefreshMasterPasswordHdl, weld::Button&, void)
1987bbd196ffSCaolán McNamara {
1988bbd196ffSCaolán McNamara     bool bChanged = false;
1989bbd196ffSCaolán McNamara     try
1990bbd196ffSCaolán McNamara     {
1991bbd196ffSCaolán McNamara         Reference< task::XPasswordContainer2 > xMasterPasswd(
1992bbd196ffSCaolán McNamara             task::PasswordContainer::create(comphelper::getProcessComponentContext()));
1993bbd196ffSCaolán McNamara 
1994bbd196ffSCaolán McNamara         css::uno::Reference<css::frame::XFrame> xFrame = GetFrame().GetFrameInterface();
1995bbd196ffSCaolán McNamara         css::uno::Reference<css::awt::XWindow> xContainerWindow = xFrame->getContainerWindow();
1996bbd196ffSCaolán McNamara 
1997bbd196ffSCaolán McNamara         uno::Reference<task::XInteractionHandler> xTmpHandler(task::InteractionHandler::createWithParent(comphelper::getProcessComponentContext(),
1998bbd196ffSCaolán McNamara                                                               xContainerWindow));
1999bbd196ffSCaolán McNamara         bChanged = xMasterPasswd->changeMasterPassword(xTmpHandler);
2000bbd196ffSCaolán McNamara     }
2001bbd196ffSCaolán McNamara     catch (const Exception&)
2002bbd196ffSCaolán McNamara     {}
2003bbd196ffSCaolán McNamara     if (bChanged)
2004bbd196ffSCaolán McNamara         RemoveInfoBar(u"oldmasterpassword");
2005bbd196ffSCaolán McNamara }
2006bbd196ffSCaolán McNamara 
IMPL_STATIC_LINK_NOARG(SfxViewFrame,HelpMasterPasswordHdl,weld::Button &,void)200761e4f850SCaolán McNamara IMPL_STATIC_LINK_NOARG(SfxViewFrame, HelpMasterPasswordHdl, weld::Button&, void)
200861e4f850SCaolán McNamara {
200961e4f850SCaolán McNamara     if (Help* pHelp = Application::GetHelp())
2010ca5c9591SNoel Grandin         pHelp->Start(u"cui/ui/optsecuritypage/savepassword"_ustr);
201161e4f850SCaolán McNamara }
201261e4f850SCaolán McNamara 
Construct_Impl(SfxObjectShell * pObjSh)2013fd069beeSJens-Heiner Rechtien void SfxViewFrame::Construct_Impl( SfxObjectShell *pObjSh )
2014fd069beeSJens-Heiner Rechtien {
20151c087eb5SXisco Fauli     m_pImpl->bResizeInToOut = true;
20161c087eb5SXisco Fauli     m_pImpl->bObjLocked = false;
20172b789f2eSNoel Grandin     m_pImpl->nCurViewId = SFX_INTERFACE_NONE;
20181c087eb5SXisco Fauli     m_pImpl->bReloading = false;
20191c087eb5SXisco Fauli     m_pImpl->bIsDowning = false;
20201c087eb5SXisco Fauli     m_pImpl->bModal = false;
20211c087eb5SXisco Fauli     m_pImpl->bEnabled = true;
20221c087eb5SXisco Fauli     m_pImpl->nDocViewNo = 0;
20231c087eb5SXisco Fauli     m_pImpl->aMargin = Size( -1, -1 );
20241c087eb5SXisco Fauli     m_pImpl->pWindow = nullptr;
2025fd069beeSJens-Heiner Rechtien 
2026d92aa2f4SNorbert Thiebaud     SetPool( &SfxGetpApp()->GetPool() );
2027e2282a94SNoel Grandin     m_pDispatcher.reset( new SfxDispatcher(this) );
2028e391ef4aSMathias Bauer     if ( !GetBindings().GetDispatcher() )
2029e2282a94SNoel Grandin         GetBindings().SetDispatcher( m_pDispatcher.get() );
2030fd069beeSJens-Heiner Rechtien 
203198b6e387SMiklos Vajna     m_xObjSh = pObjSh;
203249783285SNoel Grandin     if ( m_xObjSh.is() && m_xObjSh->IsPreview() )
2033337e19bfSNoel Grandin         GetDispatcher()->SetQuietMode_Impl( true );
2034fd069beeSJens-Heiner Rechtien 
2035fd069beeSJens-Heiner Rechtien     if ( pObjSh )
2036fd069beeSJens-Heiner Rechtien     {
203798b6e387SMiklos Vajna         m_pDispatcher->Push( *SfxGetpApp() );
203898b6e387SMiklos Vajna         SfxModule* pModule = m_xObjSh->GetModule();
2039fd069beeSJens-Heiner Rechtien         if( pModule )
204098b6e387SMiklos Vajna             m_pDispatcher->Push( *pModule );
204198b6e387SMiklos Vajna         m_pDispatcher->Push( *this );
204298b6e387SMiklos Vajna         m_pDispatcher->Push( *pObjSh );
204398b6e387SMiklos Vajna         m_pDispatcher->Flush();
2044fd069beeSJens-Heiner Rechtien         StartListening( *pObjSh );
2045a6673198SNoel Grandin         Notify( *pObjSh, SfxHint(SfxHintId::TitleChanged) );
2046a6673198SNoel Grandin         Notify( *pObjSh, SfxHint(SfxHintId::DocChanged) );
204798b6e387SMiklos Vajna         m_pDispatcher->SetReadOnly_Impl( pObjSh->IsReadOnly() );
2048fd069beeSJens-Heiner Rechtien     }
2049fd069beeSJens-Heiner Rechtien     else
2050fd069beeSJens-Heiner Rechtien     {
205198b6e387SMiklos Vajna         m_pDispatcher->Push( *SfxGetpApp() );
205298b6e387SMiklos Vajna         m_pDispatcher->Push( *this );
205398b6e387SMiklos Vajna         m_pDispatcher->Flush();
2054fd069beeSJens-Heiner Rechtien     }
2055fd069beeSJens-Heiner Rechtien 
20564b64d6acSNoel Grandin     SfxGetpApp()->GetViewFrames_Impl().push_back(this);
2057fd069beeSJens-Heiner Rechtien }
2058fd069beeSJens-Heiner Rechtien 
2059f5f7b4efSAlbert Thuswaldner /*  [Description]
2060fd069beeSJens-Heiner Rechtien 
2061f5f7b4efSAlbert Thuswaldner     Constructor of SfxViewFrame for a <SfxObjectShell> from the Resource.
2062f5f7b4efSAlbert Thuswaldner     The 'nViewId' to the created <SfxViewShell> can be returned.
2063f5f7b4efSAlbert Thuswaldner     (default is the SfxViewShell-Subclass that was registered first).
2064419e42edSFrank Schoenheit [fs] */
SfxViewFrame(SfxFrame & rFrame,SfxObjectShell * pObjShell)2065278e2b36SMarkus Mohrhard SfxViewFrame::SfxViewFrame
2066278e2b36SMarkus Mohrhard (
2067278e2b36SMarkus Mohrhard     SfxFrame&           rFrame,
2068278e2b36SMarkus Mohrhard     SfxObjectShell*     pObjShell
2069278e2b36SMarkus Mohrhard )
20701c087eb5SXisco Fauli     : m_pImpl( new SfxViewFrame_Impl( rFrame ) )
207198b6e387SMiklos Vajna     , m_pBindings( new SfxBindings )
207213eb488cSTamás Zolnai     , m_pHelpData(CreateSVHelpData())
2073c2f8929eSAshod Nakashian     , m_pWinData(CreateSVWinData())
207498b6e387SMiklos Vajna     , m_nAdjustPosPixelLock( 0 )
207583d91ebbSTomaž Vajngerl     , m_pCommandPopupHandler(new CommandPopupHandler)
2076fd069beeSJens-Heiner Rechtien {
2077fd069beeSJens-Heiner Rechtien 
2078ef15b85eSFrank Schoenheit [fs]     rFrame.SetCurrentViewFrame_Impl( this );
20797c98099cSNoel Grandin     rFrame.SetHasTitle( true );
2080419e42edSFrank Schoenheit [fs]     Construct_Impl( pObjShell );
2081419e42edSFrank Schoenheit [fs] 
20821c087eb5SXisco Fauli     m_pImpl->pWindow = VclPtr<SfxFrameViewWindow_Impl>::Create( this, rFrame.GetWindow() );
20831c087eb5SXisco Fauli     m_pImpl->pWindow->SetSizePixel( rFrame.GetWindow().GetOutputSizePixel() );
2084e7ea15aeSNoel Grandin     rFrame.SetOwnsBindings_Impl( true );
2085ef15b85eSFrank Schoenheit [fs]     rFrame.CreateWorkWindow_Impl();
2086fd069beeSJens-Heiner Rechtien }
2087fd069beeSJens-Heiner Rechtien 
~SfxViewFrame()2088fd069beeSJens-Heiner Rechtien SfxViewFrame::~SfxViewFrame()
2089fd069beeSJens-Heiner Rechtien {
20901f7c5d2aSNoel Grandin     m_pImpl->bIsDowning = true;
2091fd069beeSJens-Heiner Rechtien 
2092419e42edSFrank Schoenheit [fs]     if ( SfxViewFrame::Current() == this )
209328034eafSStephan Bergmann         SfxViewFrame::SetViewFrame( nullptr );
2094419e42edSFrank Schoenheit [fs] 
2095419e42edSFrank Schoenheit [fs]     ReleaseObjectShell_Impl();
2096419e42edSFrank Schoenheit [fs] 
2097ef15b85eSFrank Schoenheit [fs]     if ( GetFrame().OwnsBindings_Impl() )
2098f5f7b4efSAlbert Thuswaldner         // The Bindings delete the Frame!
2099419e42edSFrank Schoenheit [fs]         KillDispatcher_Impl();
2100419e42edSFrank Schoenheit [fs] 
21011c087eb5SXisco Fauli     m_pImpl->pWindow.disposeAndClear();
2102419e42edSFrank Schoenheit [fs] 
2103ef15b85eSFrank Schoenheit [fs]     if ( GetFrame().GetCurrentViewFrame() == this )
210428034eafSStephan Bergmann         GetFrame().SetCurrentViewFrame_Impl( nullptr );
2105fd069beeSJens-Heiner Rechtien 
2106f5f7b4efSAlbert Thuswaldner     // Unregister from the Frame List.
210767070d58SCaolán McNamara     SfxApplication *pSfxApp = SfxApplication::Get();
210867070d58SCaolán McNamara     if (pSfxApp)
210967070d58SCaolán McNamara     {
21104b64d6acSNoel Grandin         auto &rFrames = pSfxApp->GetViewFrames_Impl();
21114b64d6acSNoel Grandin         auto it = std::find( rFrames.begin(), rFrames.end(), this );
2112af50c7d9SNoel Grandin         rFrames.erase( it );
211367070d58SCaolán McNamara     }
2114fd069beeSJens-Heiner Rechtien 
2115f5f7b4efSAlbert Thuswaldner     // Delete Member
2116fd069beeSJens-Heiner Rechtien     KillDispatcher_Impl();
211713eb488cSTamás Zolnai 
211813eb488cSTamás Zolnai     DestroySVHelpData(m_pHelpData);
211913eb488cSTamás Zolnai     m_pHelpData = nullptr;
2120c2f8929eSAshod Nakashian 
2121c2f8929eSAshod Nakashian     DestroySVWinData(m_pWinData);
2122c2f8929eSAshod Nakashian     m_pWinData = nullptr;
2123fd069beeSJens-Heiner Rechtien }
2124fd069beeSJens-Heiner Rechtien 
2125f5f7b4efSAlbert Thuswaldner // Remove and delete the Dispatcher.
KillDispatcher_Impl()2126278e2b36SMarkus Mohrhard void SfxViewFrame::KillDispatcher_Impl()
2127fd069beeSJens-Heiner Rechtien {
2128fd069beeSJens-Heiner Rechtien 
212949783285SNoel Grandin     SfxModule* pModule = m_xObjSh.is() ? m_xObjSh->GetModule() : nullptr;
213049783285SNoel Grandin     if ( m_xObjSh.is() )
2131fd069beeSJens-Heiner Rechtien         ReleaseObjectShell_Impl();
213298b6e387SMiklos Vajna     if ( m_pDispatcher )
2133fd069beeSJens-Heiner Rechtien     {
2134fd069beeSJens-Heiner Rechtien         if( pModule )
213598b6e387SMiklos Vajna             m_pDispatcher->Pop( *pModule, SfxDispatcherPopFlags::POP_UNTIL );
2136fd069beeSJens-Heiner Rechtien         else
213798b6e387SMiklos Vajna             m_pDispatcher->Pop( *this );
2138e2282a94SNoel Grandin         m_pDispatcher.reset();
2139fd069beeSJens-Heiner Rechtien     }
2140fd069beeSJens-Heiner Rechtien }
2141fd069beeSJens-Heiner Rechtien 
Current()2142fe599b2eSCaolán McNamara SfxViewFrame* SfxViewFrame::Current()
2143fd069beeSJens-Heiner Rechtien {
2144a91dc9ebSCaolán McNamara     SfxApplication* pApp = SfxApplication::Get();
2145a91dc9ebSCaolán McNamara     return pApp ? pApp->Get_Impl()->pViewFrame : nullptr;
2146fd069beeSJens-Heiner Rechtien }
2147fd069beeSJens-Heiner Rechtien 
2148fd069beeSJens-Heiner Rechtien // returns the first window of spec. type viewing the specified doc.
GetFirst(const SfxObjectShell * pDoc,bool bOnlyIfVisible)2149fe599b2eSCaolán McNamara SfxViewFrame* SfxViewFrame::GetFirst
2150fd069beeSJens-Heiner Rechtien (
2151fd069beeSJens-Heiner Rechtien     const SfxObjectShell*   pDoc,
21529278df2cSNoel Grandin     bool                    bOnlyIfVisible
2153fd069beeSJens-Heiner Rechtien )
2154fd069beeSJens-Heiner Rechtien {
215567070d58SCaolán McNamara     SfxApplication *pSfxApp = SfxApplication::Get();
215667070d58SCaolán McNamara     if (!pSfxApp)
215767070d58SCaolán McNamara         return nullptr;
215867070d58SCaolán McNamara 
2159fd069beeSJens-Heiner Rechtien     // search for a SfxDocument of the specified type
21604b64d6acSNoel Grandin     for (SfxViewFrame* pFrame : pSfxApp->GetViewFrames_Impl())
2161fd069beeSJens-Heiner Rechtien     {
2162419e42edSFrank Schoenheit [fs]         if  (   ( !pDoc || pDoc == pFrame->GetObjectShell() )
21636eb33fcaSFrank Schoenheit [fs]             &&  ( !bOnlyIfVisible || pFrame->IsVisible() )
2164419e42edSFrank Schoenheit [fs]             )
2165fd069beeSJens-Heiner Rechtien             return pFrame;
2166fd069beeSJens-Heiner Rechtien     }
2167fd069beeSJens-Heiner Rechtien 
216828034eafSStephan Bergmann     return nullptr;
2169fd069beeSJens-Heiner Rechtien }
21700ce0c369SAlexander Wilms 
2171fd069beeSJens-Heiner Rechtien // returns the next window of spec. type viewing the specified doc.
GetNext(const SfxViewFrame & rPrev,const SfxObjectShell * pDoc,bool bOnlyIfVisible)2172fe599b2eSCaolán McNamara SfxViewFrame* SfxViewFrame::GetNext
2173fd069beeSJens-Heiner Rechtien (
2174fd069beeSJens-Heiner Rechtien     const SfxViewFrame&     rPrev,
2175fd069beeSJens-Heiner Rechtien     const SfxObjectShell*   pDoc,
21769278df2cSNoel Grandin     bool                    bOnlyIfVisible
2177fd069beeSJens-Heiner Rechtien )
2178fd069beeSJens-Heiner Rechtien {
217967070d58SCaolán McNamara     SfxApplication *pSfxApp = SfxApplication::Get();
218067070d58SCaolán McNamara     if (!pSfxApp)
218167070d58SCaolán McNamara         return nullptr;
218267070d58SCaolán McNamara 
21834b64d6acSNoel Grandin     auto &rFrames = pSfxApp->GetViewFrames_Impl();
2184fd069beeSJens-Heiner Rechtien 
2185fd069beeSJens-Heiner Rechtien     // refind the specified predecessor
21866271381bSStephan Bergmann     size_t nPos;
2187af50c7d9SNoel Grandin     for ( nPos = 0; nPos < rFrames.size(); ++nPos )
2188af50c7d9SNoel Grandin         if ( rFrames[nPos] == &rPrev )
2189fd069beeSJens-Heiner Rechtien             break;
2190fd069beeSJens-Heiner Rechtien 
2191fd069beeSJens-Heiner Rechtien     // search for a Frame of the specified type
2192af50c7d9SNoel Grandin     for ( ++nPos; nPos < rFrames.size(); ++nPos )
2193fd069beeSJens-Heiner Rechtien     {
2194af50c7d9SNoel Grandin         SfxViewFrame *pFrame = rFrames[nPos];
2195419e42edSFrank Schoenheit [fs]         if  (   ( !pDoc || pDoc == pFrame->GetObjectShell() )
21966eb33fcaSFrank Schoenheit [fs]             &&  ( !bOnlyIfVisible || pFrame->IsVisible() )
2197419e42edSFrank Schoenheit [fs]             )
2198fd069beeSJens-Heiner Rechtien             return pFrame;
2199fd069beeSJens-Heiner Rechtien     }
220028034eafSStephan Bergmann     return nullptr;
2201fd069beeSJens-Heiner Rechtien }
2202fd069beeSJens-Heiner Rechtien 
GetProgress() const2203fd069beeSJens-Heiner Rechtien SfxProgress* SfxViewFrame::GetProgress() const
2204fd069beeSJens-Heiner Rechtien {
22051f7c5d2aSNoel Grandin     SfxObjectShell *pObjSh = m_xObjSh.get();
220628034eafSStephan Bergmann     return pObjSh ? pObjSh->GetProgress() : nullptr;
2207fd069beeSJens-Heiner Rechtien }
2208fd069beeSJens-Heiner Rechtien 
DoAdjustPosSizePixel(SfxViewShell * pSh,const Point & rPos,const Size & rSize,bool inplaceEditModeChange)2209f5f7b4efSAlbert Thuswaldner void SfxViewFrame::DoAdjustPosSizePixel //! divide on Inner.../Outer...
2210fd069beeSJens-Heiner Rechtien (
2211fd069beeSJens-Heiner Rechtien     SfxViewShell*   pSh,
2212fd069beeSJens-Heiner Rechtien     const Point&    rPos,
2213424d17e6SStephan Bergmann     const Size&     rSize,
2214424d17e6SStephan Bergmann     bool inplaceEditModeChange
2215fd069beeSJens-Heiner Rechtien )
2216fd069beeSJens-Heiner Rechtien {
2217fd069beeSJens-Heiner Rechtien 
2218f5f7b4efSAlbert Thuswaldner     // Components do not use this Method!
221998b6e387SMiklos Vajna     if( pSh && pSh->GetWindow() && !m_nAdjustPosPixelLock )
2220fd069beeSJens-Heiner Rechtien     {
222198b6e387SMiklos Vajna         m_nAdjustPosPixelLock++;
22221c087eb5SXisco Fauli         if ( m_pImpl->bResizeInToOut )
2223424d17e6SStephan Bergmann             pSh->InnerResizePixel( rPos, rSize, inplaceEditModeChange );
2224fd069beeSJens-Heiner Rechtien         else
2225fd069beeSJens-Heiner Rechtien             pSh->OuterResizePixel( rPos, rSize );
222698b6e387SMiklos Vajna         m_nAdjustPosPixelLock--;
2227fd069beeSJens-Heiner Rechtien     }
2228fd069beeSJens-Heiner Rechtien }
2229fd069beeSJens-Heiner Rechtien 
operator ==(const SfxPoolItem & rItem) const2230d1043892SStephan Bergmann bool SfxViewFrameItem::operator==( const SfxPoolItem &rItem ) const
2231fd069beeSJens-Heiner Rechtien {
22326a789e61SNoel Grandin     return SfxPoolItem::operator==(rItem) &&
22336a789e61SNoel Grandin         static_cast<const SfxViewFrameItem&>(rItem).pFrame == pFrame;
2234fd069beeSJens-Heiner Rechtien }
2235fd069beeSJens-Heiner Rechtien 
Clone(SfxItemPool *) const223624314773SCaolán McNamara SfxViewFrameItem* SfxViewFrameItem::Clone( SfxItemPool *) const
2237fd069beeSJens-Heiner Rechtien {
2238d7322511SJochen Nitschke     return new SfxViewFrameItem( *this );
2239fd069beeSJens-Heiner Rechtien }
2240fd069beeSJens-Heiner Rechtien 
SetViewShell_Impl(SfxViewShell * pVSh)2241fd069beeSJens-Heiner Rechtien void SfxViewFrame::SetViewShell_Impl( SfxViewShell *pVSh )
2242f5f7b4efSAlbert Thuswaldner /*  [Description]
2243fd069beeSJens-Heiner Rechtien 
2244f5f7b4efSAlbert Thuswaldner     Internal Method to set the current <SfxViewShell> Instance,
2245f5f7b4efSAlbert Thuswaldner     that is active int this SfxViewFrame at the moment.
2246fd069beeSJens-Heiner Rechtien */
2247fd069beeSJens-Heiner Rechtien {
2248fd069beeSJens-Heiner Rechtien     SfxShell::SetViewShell_Impl( pVSh );
22496c1be809SKurt Zenker 
22506c1be809SKurt Zenker     // Hack: InPlaceMode
2251f1f8a59dSFrank Schoenheit [fs]     if ( pVSh )
22521c087eb5SXisco Fauli         m_pImpl->bResizeInToOut = false;
2253fd069beeSJens-Heiner Rechtien }
2254fd069beeSJens-Heiner Rechtien 
ForceOuterResize_Impl()2255435d6d50SNoel Grandin void SfxViewFrame::ForceOuterResize_Impl()
2256fd069beeSJens-Heiner Rechtien {
22571c087eb5SXisco Fauli     m_pImpl->bResizeInToOut = true;
2258fd069beeSJens-Heiner Rechtien }
2259fd069beeSJens-Heiner Rechtien 
GetDocNumber_Impl()2260fd069beeSJens-Heiner Rechtien void SfxViewFrame::GetDocNumber_Impl()
2261fd069beeSJens-Heiner Rechtien {
2262f5f7b4efSAlbert Thuswaldner     DBG_ASSERT( GetObjectShell(), "No Document!" );
2263fd069beeSJens-Heiner Rechtien     GetObjectShell()->SetNamedVisibility_Impl();
22641c087eb5SXisco Fauli     m_pImpl->nDocViewNo = GetObjectShell()->GetNoSet_Impl().GetFreeIndex()+1;
2265fd069beeSJens-Heiner Rechtien }
2266fd069beeSJens-Heiner Rechtien 
Enable(bool bEnable)22679278df2cSNoel Grandin void SfxViewFrame::Enable( bool bEnable )
2268fd069beeSJens-Heiner Rechtien {
2269536a6d6cSNoel Grandin     if ( bEnable == m_pImpl->bEnabled )
2270536a6d6cSNoel Grandin         return;
2271536a6d6cSNoel Grandin 
22721c087eb5SXisco Fauli     m_pImpl->bEnabled = bEnable;
2273fd069beeSJens-Heiner Rechtien 
22742b3de550SNoel Grandin     vcl::Window *pWindow = &GetFrame().GetWindow();
22758868592eSRüdiger Timm     if ( !bEnable )
22761c087eb5SXisco Fauli         m_pImpl->bWindowWasEnabled = pWindow->IsInputEnabled();
22771c087eb5SXisco Fauli     if ( !bEnable || m_pImpl->bWindowWasEnabled )
2278e5da350eSNoel Grandin         pWindow->EnableInput( bEnable );
2279fd069beeSJens-Heiner Rechtien 
2280fd069beeSJens-Heiner Rechtien     // cursor and focus
2281fd069beeSJens-Heiner Rechtien     SfxViewShell* pViewSh = GetViewShell();
2282fd069beeSJens-Heiner Rechtien     if ( bEnable )
2283fd069beeSJens-Heiner Rechtien     {
2284fd069beeSJens-Heiner Rechtien         // show cursor
2285fd069beeSJens-Heiner Rechtien         if ( pViewSh )
2286fd069beeSJens-Heiner Rechtien             pViewSh->ShowCursor();
2287fd069beeSJens-Heiner Rechtien     }
2288fd069beeSJens-Heiner Rechtien     else
2289fd069beeSJens-Heiner Rechtien     {
2290fd069beeSJens-Heiner Rechtien         // hide cursor
2291fd069beeSJens-Heiner Rechtien         if ( pViewSh )
2292c35616ddSStephan Bergmann             pViewSh->ShowCursor(false);
2293fd069beeSJens-Heiner Rechtien     }
2294fd069beeSJens-Heiner Rechtien }
2295fd069beeSJens-Heiner Rechtien 
2296f5f7b4efSAlbert Thuswaldner /*  [Description]
2297fd069beeSJens-Heiner Rechtien 
229864d624b6SAndrea Gelmini     This method makes the Frame-Window visible and before transmits the
2299f5f7b4efSAlbert Thuswaldner     window name. In addition, the document is held. In general one can never
2300f5f7b4efSAlbert Thuswaldner     show the window directly!
2301fd069beeSJens-Heiner Rechtien */
Show()2302278e2b36SMarkus Mohrhard void SfxViewFrame::Show()
2303fd069beeSJens-Heiner Rechtien {
2304f5f7b4efSAlbert Thuswaldner     // First lock the objectShell so that UpdateTitle() is valid:
23059278df2cSNoel Grandin     // IsVisible() == true (:#)
230649783285SNoel Grandin     if ( m_xObjSh.is() )
2307fd069beeSJens-Heiner Rechtien     {
2308f5dd4faeSMike Kaganski         m_xObjSh->GetMedium()->GetItemSet().ClearItem( SID_HIDDEN );
23091c087eb5SXisco Fauli         if ( !m_pImpl->bObjLocked )
2310e5da350eSNoel Grandin             LockObjectShell_Impl();
2311fd069beeSJens-Heiner Rechtien 
23123bd26180SThomas Arnhold         // Adjust Doc-Shell title number, get unique view-no
23131c087eb5SXisco Fauli         if ( 0 == m_pImpl->nDocViewNo  )
2314fd069beeSJens-Heiner Rechtien         {
2315fd069beeSJens-Heiner Rechtien             GetDocNumber_Impl();
2316fd069beeSJens-Heiner Rechtien             UpdateTitle();
2317fd069beeSJens-Heiner Rechtien         }
2318fd069beeSJens-Heiner Rechtien     }
2319fd069beeSJens-Heiner Rechtien     else
2320fd069beeSJens-Heiner Rechtien         UpdateTitle();
2321fd069beeSJens-Heiner Rechtien 
2322f5f7b4efSAlbert Thuswaldner     // Display Frame-window, but only if the ViewFrame has no window of its
2323f5f7b4efSAlbert Thuswaldner     // own or if it does not contain a Component
2324fd069beeSJens-Heiner Rechtien     GetWindow().Show();
2325ef15b85eSFrank Schoenheit [fs]     GetFrame().GetWindow().Show();
2326fd069beeSJens-Heiner Rechtien }
2327fd069beeSJens-Heiner Rechtien 
23280ce0c369SAlexander Wilms 
IsVisible() const23299278df2cSNoel Grandin bool SfxViewFrame::IsVisible() const
2330fd069beeSJens-Heiner Rechtien {
23311c087eb5SXisco Fauli     return m_pImpl->bObjLocked;
2332fd069beeSJens-Heiner Rechtien }
2333fd069beeSJens-Heiner Rechtien 
23340ce0c369SAlexander Wilms 
LockObjectShell_Impl()2335bd5ceabbSNoel Grandin void SfxViewFrame::LockObjectShell_Impl()
2336fd069beeSJens-Heiner Rechtien {
23371c087eb5SXisco Fauli     DBG_ASSERT( !m_pImpl->bObjLocked, "Wrong Locked status!" );
2338fd069beeSJens-Heiner Rechtien 
2339f5f7b4efSAlbert Thuswaldner     DBG_ASSERT( GetObjectShell(), "No Document!" );
2340bd5ceabbSNoel Grandin     GetObjectShell()->OwnerLock(true);
23411c087eb5SXisco Fauli     m_pImpl->bObjLocked = true;
2342fd069beeSJens-Heiner Rechtien }
2343fd069beeSJens-Heiner Rechtien 
23440ce0c369SAlexander Wilms 
MakeActive_Impl(bool bGrabFocus)23459278df2cSNoel Grandin void SfxViewFrame::MakeActive_Impl( bool bGrabFocus )
2346fd069beeSJens-Heiner Rechtien {
2347536a6d6cSNoel Grandin     if ( !GetViewShell() || GetFrame().IsClosing_Impl() )
2348536a6d6cSNoel Grandin         return;
2349536a6d6cSNoel Grandin 
2350536a6d6cSNoel Grandin     if ( !IsVisible() )
2351536a6d6cSNoel Grandin         return;
2352536a6d6cSNoel Grandin 
23539278df2cSNoel Grandin     bool bPreview = false;
2354b907a15bSMathias Bauer     if (GetObjectShell()->IsPreview())
2355b907a15bSMathias Bauer     {
23569278df2cSNoel Grandin         bPreview = true;
2357b907a15bSMathias Bauer     }
2358fd069beeSJens-Heiner Rechtien 
2359ef15b85eSFrank Schoenheit [fs]     css::uno::Reference<css::frame::XFrame> xFrame = GetFrame().GetFrameInterface();
2360185d8414SVladimir Glazounov     if (!bPreview)
2361fd069beeSJens-Heiner Rechtien     {
2362f605b16eSRüdiger Timm         SetViewFrame(this);
2363236d68a5SKurt Zenker         GetBindings().SetActiveFrame(css::uno::Reference<css::frame::XFrame>());
2364185d8414SVladimir Glazounov         uno::Reference<frame::XFramesSupplier> xSupp(xFrame, uno::UNO_QUERY);
2365185d8414SVladimir Glazounov         if (xSupp.is())
2366185d8414SVladimir Glazounov             xSupp->setActiveFrame(uno::Reference<frame::XFrame>());
2367185d8414SVladimir Glazounov 
2368236d68a5SKurt Zenker         css::uno::Reference< css::awt::XWindow > xContainerWindow = xFrame->getContainerWindow();
236978b4a1fbSNoel Grandin         VclPtr<vcl::Window> pWindow = VCLUnoHelper::GetWindow(xContainerWindow);
2370236d68a5SKurt Zenker         if (pWindow && pWindow->HasChildPathFocus() && bGrabFocus)
2371fd069beeSJens-Heiner Rechtien         {
23726c1be809SKurt Zenker             SfxInPlaceClient *pCli = GetViewShell()->GetUIActiveClient();
23733d5d631eSStephan Bergmann             if (!pCli || !pCli->IsObjectUIActive())
2374ef15b85eSFrank Schoenheit [fs]                 GetFrame().GrabFocusOnComponent_Impl();
2375fd069beeSJens-Heiner Rechtien         }
2376fd069beeSJens-Heiner Rechtien     }
2377fd069beeSJens-Heiner Rechtien     else
2378fd069beeSJens-Heiner Rechtien     {
2379fd069beeSJens-Heiner Rechtien         GetBindings().SetDispatcher(GetDispatcher());
2380913a2d36SNoel Grandin         GetBindings().SetActiveFrame(css::uno::Reference<css::frame::XFrame>());
2381e5da350eSNoel Grandin         GetDispatcher()->Update_Impl();
2382fd069beeSJens-Heiner Rechtien     }
2383fd069beeSJens-Heiner Rechtien }
2384fd069beeSJens-Heiner Rechtien 
GetObjectShell()2385fd069beeSJens-Heiner Rechtien SfxObjectShell* SfxViewFrame::GetObjectShell()
2386fd069beeSJens-Heiner Rechtien {
2387f004aa99SJacek Fraczek     return m_xObjSh.get();
2388fd069beeSJens-Heiner Rechtien }
2389fd069beeSJens-Heiner Rechtien 
GetMargin_Impl() const2390fd069beeSJens-Heiner Rechtien const Size& SfxViewFrame::GetMargin_Impl() const
2391fd069beeSJens-Heiner Rechtien {
23921c087eb5SXisco Fauli     return m_pImpl->aMargin;
2393fd069beeSJens-Heiner Rechtien }
2394fd069beeSJens-Heiner Rechtien 
LoadViewIntoFrame_Impl_NoThrow(const SfxObjectShell & i_rDoc,const Reference<XFrame> & i_rFrame,const SfxInterfaceId i_nViewId,const bool i_bHidden)23957522c1c5SFrank Schoenheit [fs] SfxViewFrame* SfxViewFrame::LoadViewIntoFrame_Impl_NoThrow( const SfxObjectShell& i_rDoc, const Reference< XFrame >& i_rFrame,
2396d615af61SNoel Grandin                                                    const SfxInterfaceId i_nViewId, const bool i_bHidden )
23977522c1c5SFrank Schoenheit [fs] {
23987522c1c5SFrank Schoenheit [fs]     Reference< XFrame > xFrame( i_rFrame );
23997522c1c5SFrank Schoenheit [fs]     bool bOwnFrame = false;
240028034eafSStephan Bergmann     SfxViewShell* pSuccessView = nullptr;
24017522c1c5SFrank Schoenheit [fs]     try
24027522c1c5SFrank Schoenheit [fs]     {
24037522c1c5SFrank Schoenheit [fs]         if ( !xFrame.is() )
24047522c1c5SFrank Schoenheit [fs]         {
2405bb121c86SNoel Grandin             Reference < XDesktop2 > xDesktop = Desktop::create( ::comphelper::getProcessComponentContext() );
240696775610SMikhail Voytenko 
240796775610SMikhail Voytenko             if ( !i_bHidden )
240896775610SMikhail Voytenko             {
240996775610SMikhail Voytenko                 try
241096775610SMikhail Voytenko                 {
241196775610SMikhail Voytenko                     // if there is a backing component, use it
2412d76d1555SNoel Grandin                     ::framework::FrameListAnalyzer aAnalyzer( xDesktop, Reference< XFrame >(), FrameAnalyzerFlags::BackingComponent );
241396775610SMikhail Voytenko 
241496775610SMikhail Voytenko                     if ( aAnalyzer.m_xBackingComponent.is() )
241596775610SMikhail Voytenko                         xFrame = aAnalyzer.m_xBackingComponent;
241696775610SMikhail Voytenko                 }
241796775610SMikhail Voytenko                 catch( uno::Exception& )
241896775610SMikhail Voytenko                 {}
241996775610SMikhail Voytenko             }
242096775610SMikhail Voytenko 
242196775610SMikhail Voytenko             if ( !xFrame.is() )
2422ca5c9591SNoel Grandin                 xFrame.set( xDesktop->findFrame( u"_blank"_ustr, 0 ), UNO_SET_THROW );
242396775610SMikhail Voytenko 
24247522c1c5SFrank Schoenheit [fs]             bOwnFrame = true;
24257522c1c5SFrank Schoenheit [fs]         }
24267522c1c5SFrank Schoenheit [fs] 
2427d8bba185SFrank Schoenheit [fs]         pSuccessView = LoadViewIntoFrame_Impl(
2428d8bba185SFrank Schoenheit [fs]             i_rDoc,
2429d8bba185SFrank Schoenheit [fs]             xFrame,
2430d8bba185SFrank Schoenheit [fs]             Sequence< PropertyValue >(),    // means "reuse existing model's args"
2431d8bba185SFrank Schoenheit [fs]             i_nViewId,
2432d8bba185SFrank Schoenheit [fs]             i_bHidden
2433d8bba185SFrank Schoenheit [fs]         );
24347522c1c5SFrank Schoenheit [fs] 
24353faf9628SFrank Schoenheit [fs]         if ( bOwnFrame && !i_bHidden )
24367522c1c5SFrank Schoenheit [fs]         {
24377522c1c5SFrank Schoenheit [fs]             // ensure the frame/window is visible
24387522c1c5SFrank Schoenheit [fs]             Reference< XWindow > xContainerWindow( xFrame->getContainerWindow(), UNO_SET_THROW );
24399278df2cSNoel Grandin             xContainerWindow->setVisible( true );
24407522c1c5SFrank Schoenheit [fs]         }
24417522c1c5SFrank Schoenheit [fs]     }
24427522c1c5SFrank Schoenheit [fs]     catch( const Exception& )
24437522c1c5SFrank Schoenheit [fs]     {
24444450b2a1SNoel Grandin         DBG_UNHANDLED_EXCEPTION("sfx.view");
24457522c1c5SFrank Schoenheit [fs]     }
24467522c1c5SFrank Schoenheit [fs] 
2447d8bba185SFrank Schoenheit [fs]     if ( pSuccessView )
24480908c7c1SCaolán McNamara         return &pSuccessView->GetViewFrame();
24497522c1c5SFrank Schoenheit [fs] 
24507522c1c5SFrank Schoenheit [fs]     if ( bOwnFrame )
24517522c1c5SFrank Schoenheit [fs]     {
24527522c1c5SFrank Schoenheit [fs]         try
24537522c1c5SFrank Schoenheit [fs]         {
24547522c1c5SFrank Schoenheit [fs]             xFrame->dispose();
24557522c1c5SFrank Schoenheit [fs]         }
24567522c1c5SFrank Schoenheit [fs]         catch( const Exception& )
24577522c1c5SFrank Schoenheit [fs]         {
24584450b2a1SNoel Grandin             DBG_UNHANDLED_EXCEPTION("sfx.view");
24597522c1c5SFrank Schoenheit [fs]         }
24607522c1c5SFrank Schoenheit [fs]     }
24617522c1c5SFrank Schoenheit [fs] 
246228034eafSStephan Bergmann     return nullptr;
24637522c1c5SFrank Schoenheit [fs] }
24647522c1c5SFrank Schoenheit [fs] 
LoadViewIntoFrame_Impl(const SfxObjectShell & i_rDoc,const Reference<XFrame> & i_rFrame,const Sequence<PropertyValue> & i_rLoadArgs,const SfxInterfaceId i_nViewId,const bool i_bHidden)2465d8bba185SFrank Schoenheit [fs] SfxViewShell* SfxViewFrame::LoadViewIntoFrame_Impl( const SfxObjectShell& i_rDoc, const Reference< XFrame >& i_rFrame,
2466d615af61SNoel Grandin                                            const Sequence< PropertyValue >& i_rLoadArgs, const SfxInterfaceId i_nViewId,
24673faf9628SFrank Schoenheit [fs]                                            const bool i_bHidden )
246823abd103SFrank Schoenheit [fs] {
246923abd103SFrank Schoenheit [fs]     Reference< XModel > xDocument( i_rDoc.GetModel(), UNO_SET_THROW );
247023abd103SFrank Schoenheit [fs] 
2471f20810f7SArkadiy Illarionov     ::comphelper::NamedValueCollection aTransformLoadArgs( i_rLoadArgs.hasElements() ? i_rLoadArgs : xDocument->getArgs() );
2472ca5c9591SNoel Grandin     aTransformLoadArgs.put( u"Model"_ustr, xDocument );
24733faf9628SFrank Schoenheit [fs]     if ( i_nViewId )
2474ca5c9591SNoel Grandin         aTransformLoadArgs.put( u"ViewId"_ustr, sal_uInt16( i_nViewId ) );
24753faf9628SFrank Schoenheit [fs]     if ( i_bHidden )
2476ca5c9591SNoel Grandin         aTransformLoadArgs.put( u"Hidden"_ustr, i_bHidden );
2477d8bba185SFrank Schoenheit [fs]     else
2478ca5c9591SNoel Grandin         aTransformLoadArgs.remove( u"Hidden"_ustr );
247923abd103SFrank Schoenheit [fs] 
248023abd103SFrank Schoenheit [fs]     Reference< XComponentLoader > xLoader( i_rFrame, UNO_QUERY_THROW );
2481ca5c9591SNoel Grandin     xLoader->loadComponentFromURL( u"private:object"_ustr, u"_self"_ustr, 0,
248223abd103SFrank Schoenheit [fs]         aTransformLoadArgs.getPropertyValues() );
248323abd103SFrank Schoenheit [fs] 
2484d8bba185SFrank Schoenheit [fs]     SfxViewShell* pViewShell = SfxViewShell::Get( i_rFrame->getController() );
2485d8bba185SFrank Schoenheit [fs]     ENSURE_OR_THROW( pViewShell,
2486d8bba185SFrank Schoenheit [fs]         "SfxViewFrame::LoadViewIntoFrame_Impl: loading an SFX doc into a frame resulted in a non-SFX view - quite impossible" );
248783ee99a9SFrank Schoenheit [fs]     return pViewShell;
248883ee99a9SFrank Schoenheit [fs] }
248983ee99a9SFrank Schoenheit [fs] 
LoadHiddenDocument(SfxObjectShell const & i_rDoc,SfxInterfaceId i_nViewId)24907ed17807SNoel Grandin SfxViewFrame* SfxViewFrame::LoadHiddenDocument( SfxObjectShell const & i_rDoc, SfxInterfaceId i_nViewId )
24913faf9628SFrank Schoenheit [fs] {
24923faf9628SFrank Schoenheit [fs]     return LoadViewIntoFrame_Impl_NoThrow( i_rDoc, Reference< XFrame >(), i_nViewId, true );
24933faf9628SFrank Schoenheit [fs] }
24943faf9628SFrank Schoenheit [fs] 
LoadDocument(SfxObjectShell const & i_rDoc,SfxInterfaceId i_nViewId)24957ed17807SNoel Grandin SfxViewFrame* SfxViewFrame::LoadDocument( SfxObjectShell const & i_rDoc, SfxInterfaceId i_nViewId )
24960247f431SFrank Schoenheit [fs] {
24970247f431SFrank Schoenheit [fs]     return LoadViewIntoFrame_Impl_NoThrow( i_rDoc, Reference< XFrame >(), i_nViewId, false );
24980247f431SFrank Schoenheit [fs] }
24990247f431SFrank Schoenheit [fs] 
LoadDocumentIntoFrame(SfxObjectShell const & i_rDoc,const Reference<XFrame> & i_rTargetFrame)25007ed17807SNoel Grandin SfxViewFrame* SfxViewFrame::LoadDocumentIntoFrame( SfxObjectShell const & i_rDoc, const Reference< XFrame >& i_rTargetFrame )
25017522c1c5SFrank Schoenheit [fs] {
25022b789f2eSNoel Grandin     return LoadViewIntoFrame_Impl_NoThrow( i_rDoc, i_rTargetFrame, SFX_INTERFACE_NONE, false );
25037522c1c5SFrank Schoenheit [fs] }
25047522c1c5SFrank Schoenheit [fs] 
LoadDocumentIntoFrame(SfxObjectShell const & i_rDoc,const SfxFrameItem * i_pFrameItem,SfxInterfaceId i_nViewId)25057ed17807SNoel Grandin SfxViewFrame* SfxViewFrame::LoadDocumentIntoFrame( SfxObjectShell const & i_rDoc, const SfxFrameItem* i_pFrameItem, SfxInterfaceId i_nViewId )
25067522c1c5SFrank Schoenheit [fs] {
250728034eafSStephan Bergmann     return LoadViewIntoFrame_Impl_NoThrow( i_rDoc, i_pFrameItem && i_pFrameItem->GetFrame() ? i_pFrameItem->GetFrame()->GetFrameInterface() : nullptr, i_nViewId, false );
250816dacff3SFrank Schoenheit [fs] }
250916dacff3SFrank Schoenheit [fs] 
DisplayNewDocument(SfxObjectShell const & i_rDoc,const SfxRequest & i_rCreateDocRequest)25107ed17807SNoel Grandin SfxViewFrame* SfxViewFrame::DisplayNewDocument( SfxObjectShell const & i_rDoc, const SfxRequest& i_rCreateDocRequest )
251116dacff3SFrank Schoenheit [fs] {
2512e5be07f5SJan Holesovsky     const SfxUnoFrameItem* pFrameItem = i_rCreateDocRequest.GetArg<SfxUnoFrameItem>(SID_FILLFRAME);
2513e5be07f5SJan Holesovsky     const SfxBoolItem* pHiddenItem = i_rCreateDocRequest.GetArg<SfxBoolItem>(SID_HIDDEN);
25142dc2be78SFrank Schoenheit [fs] 
25152dc2be78SFrank Schoenheit [fs]     return LoadViewIntoFrame_Impl_NoThrow(
25162dc2be78SFrank Schoenheit [fs]         i_rDoc,
251728034eafSStephan Bergmann         pFrameItem ? pFrameItem->GetFrame() : nullptr,
25182b789f2eSNoel Grandin         SFX_INTERFACE_NONE,
2519ef5f02d9SStephan Bergmann         pHiddenItem && pHiddenItem->GetValue()
25202dc2be78SFrank Schoenheit [fs]     );
25217522c1c5SFrank Schoenheit [fs] }
25227522c1c5SFrank Schoenheit [fs] 
Get(const Reference<XController> & i_rController,const SfxObjectShell * i_pDoc)2523fe599b2eSCaolán McNamara SfxViewFrame* SfxViewFrame::Get( const Reference< XController>& i_rController, const SfxObjectShell* i_pDoc )
25247522c1c5SFrank Schoenheit [fs] {
25257522c1c5SFrank Schoenheit [fs]     if ( !i_rController.is() )
252628034eafSStephan Bergmann         return nullptr;
25277522c1c5SFrank Schoenheit [fs] 
25287522c1c5SFrank Schoenheit [fs]     const SfxObjectShell* pDoc = i_pDoc;
25297522c1c5SFrank Schoenheit [fs]     if ( !pDoc )
25307522c1c5SFrank Schoenheit [fs]     {
25317522c1c5SFrank Schoenheit [fs]         Reference< XModel > xDocument( i_rController->getModel() );
253289d39bc1SOliver Specht         for (   pDoc = SfxObjectShell::GetFirst( nullptr, false );
25337522c1c5SFrank Schoenheit [fs]                 pDoc;
253489d39bc1SOliver Specht                 pDoc = SfxObjectShell::GetNext( *pDoc, nullptr, false )
25357522c1c5SFrank Schoenheit [fs]             )
25367522c1c5SFrank Schoenheit [fs]         {
25377522c1c5SFrank Schoenheit [fs]             if ( pDoc->GetModel() == xDocument )
25387522c1c5SFrank Schoenheit [fs]                 break;
25397522c1c5SFrank Schoenheit [fs]         }
25407522c1c5SFrank Schoenheit [fs]     }
25417522c1c5SFrank Schoenheit [fs] 
254228034eafSStephan Bergmann     SfxViewFrame* pViewFrame = nullptr;
25439278df2cSNoel Grandin     for (   pViewFrame = SfxViewFrame::GetFirst( pDoc, false );
25447522c1c5SFrank Schoenheit [fs]             pViewFrame;
25459278df2cSNoel Grandin             pViewFrame = SfxViewFrame::GetNext( *pViewFrame, pDoc, false )
25467522c1c5SFrank Schoenheit [fs]         )
25477522c1c5SFrank Schoenheit [fs]     {
25487522c1c5SFrank Schoenheit [fs]         if ( pViewFrame->GetViewShell()->GetController() == i_rController )
25497522c1c5SFrank Schoenheit [fs]             break;
25507522c1c5SFrank Schoenheit [fs]     }
25517522c1c5SFrank Schoenheit [fs] 
25527522c1c5SFrank Schoenheit [fs]     return pViewFrame;
25537522c1c5SFrank Schoenheit [fs] }
25547522c1c5SFrank Schoenheit [fs] 
SaveCurrentViewData_Impl(const SfxInterfaceId i_nNewViewId)2555d615af61SNoel Grandin void SfxViewFrame::SaveCurrentViewData_Impl( const SfxInterfaceId i_nNewViewId )
25567c006c81SFrank Schoenheit [fs] {
25577c006c81SFrank Schoenheit [fs]     SfxViewShell* pCurrentShell = GetViewShell();
255828034eafSStephan Bergmann     ENSURE_OR_RETURN_VOID( pCurrentShell != nullptr, "SfxViewFrame::SaveCurrentViewData_Impl: no current view shell -> no current view data!" );
25597c006c81SFrank Schoenheit [fs] 
25607c006c81SFrank Schoenheit [fs]     // determine the logical (API) view name
25617c006c81SFrank Schoenheit [fs]     const SfxObjectFactory& rDocFactory( pCurrentShell->GetObjectShell()->GetFactory() );
25621f01f13dSFrank Schoenheit [fs]     const sal_uInt16 nCurViewNo = rDocFactory.GetViewNo_Impl( GetCurViewId(), 0 );
256335c24f9bSNoel Grandin     const OUString sCurrentViewName = rDocFactory.GetViewFactory( nCurViewNo ).GetAPIViewName();
25641f01f13dSFrank Schoenheit [fs]     const sal_uInt16 nNewViewNo = rDocFactory.GetViewNo_Impl( i_nNewViewId, 0 );
256535c24f9bSNoel Grandin     const OUString sNewViewName = rDocFactory.GetViewFactory( nNewViewNo ).GetAPIViewName();
256635c24f9bSNoel Grandin     if ( sCurrentViewName.isEmpty() || sNewViewName.isEmpty() )
25677c006c81SFrank Schoenheit [fs]     {
25687c006c81SFrank Schoenheit [fs]         // can't say anything about the view, the respective application did not yet migrate its code to
25697c006c81SFrank Schoenheit [fs]         // named view factories => bail out
25701c881a9eSThomas Arnhold         OSL_FAIL( "SfxViewFrame::SaveCurrentViewData_Impl: views without API names? Shouldn't happen anymore?" );
25717c006c81SFrank Schoenheit [fs]         return;
25727c006c81SFrank Schoenheit [fs]     }
25733dc91d3fSJulien Nabet     SAL_WARN_IF(sNewViewName == sCurrentViewName, "sfx.view", "SfxViewFrame::SaveCurrentViewData_Impl: suspicious: new and old view name are identical!");
25747c006c81SFrank Schoenheit [fs] 
25751f01f13dSFrank Schoenheit [fs]     // save the view data only when we're moving from a non-print-preview to the print-preview view
257635c24f9bSNoel Grandin     if ( sNewViewName != "PrintPreview" )
25777c006c81SFrank Schoenheit [fs]         return;
25787c006c81SFrank Schoenheit [fs] 
25797c006c81SFrank Schoenheit [fs]     // retrieve the view data from the view
25807c006c81SFrank Schoenheit [fs]     Sequence< PropertyValue > aViewData;
25817c006c81SFrank Schoenheit [fs]     pCurrentShell->WriteUserDataSequence( aViewData );
25827c006c81SFrank Schoenheit [fs] 
25837c006c81SFrank Schoenheit [fs]     try
25847c006c81SFrank Schoenheit [fs]     {
25857c006c81SFrank Schoenheit [fs]         // retrieve view data (for *all* views) from the model
25867c006c81SFrank Schoenheit [fs]         const Reference< XController > xController( pCurrentShell->GetController(), UNO_SET_THROW );
25877c006c81SFrank Schoenheit [fs]         const Reference< XViewDataSupplier > xViewDataSupplier( xController->getModel(), UNO_QUERY_THROW );
25887c006c81SFrank Schoenheit [fs]         const Reference< XIndexContainer > xViewData( xViewDataSupplier->getViewData(), UNO_QUERY_THROW );
25897c006c81SFrank Schoenheit [fs] 
25907c006c81SFrank Schoenheit [fs]         // look up the one view data item which corresponds to our current view, and remove it
25917c006c81SFrank Schoenheit [fs]         const sal_Int32 nCount = xViewData->getCount();
25927c006c81SFrank Schoenheit [fs]         for ( sal_Int32 i=0; i<nCount; ++i )
25937c006c81SFrank Schoenheit [fs]         {
2594bfac8e3fSFrank Schoenheit [fs]             const ::comphelper::NamedValueCollection aCurViewData( xViewData->getByIndex(i) );
2595ca5c9591SNoel Grandin             const OUString sViewId( aCurViewData.getOrDefault( u"ViewId"_ustr, OUString() ) );
2596e24a27b4SOlivier Hallot             if ( sViewId.isEmpty() )
25977c006c81SFrank Schoenheit [fs]                 continue;
25987c006c81SFrank Schoenheit [fs] 
25997c006c81SFrank Schoenheit [fs]             const SfxViewFactory* pViewFactory = rDocFactory.GetViewFactoryByViewName( sViewId );
260028034eafSStephan Bergmann             if ( pViewFactory == nullptr )
26017c006c81SFrank Schoenheit [fs]                 continue;
26027c006c81SFrank Schoenheit [fs] 
26037c006c81SFrank Schoenheit [fs]             if ( pViewFactory->GetOrdinal() == GetCurViewId() )
26047c006c81SFrank Schoenheit [fs]             {
26057c006c81SFrank Schoenheit [fs]                 xViewData->removeByIndex(i);
26067c006c81SFrank Schoenheit [fs]                 break;
26077c006c81SFrank Schoenheit [fs]             }
26087c006c81SFrank Schoenheit [fs]         }
26097c006c81SFrank Schoenheit [fs] 
26107c006c81SFrank Schoenheit [fs]         // then replace it with the most recent view data we just obtained
26110bfa6a18SStephan Bergmann         xViewData->insertByIndex( 0, Any( aViewData ) );
26127c006c81SFrank Schoenheit [fs]     }
26137c006c81SFrank Schoenheit [fs]     catch( const Exception& )
26147c006c81SFrank Schoenheit [fs]     {
26154450b2a1SNoel Grandin         DBG_UNHANDLED_EXCEPTION("sfx.view");
26167c006c81SFrank Schoenheit [fs]     }
26177c006c81SFrank Schoenheit [fs] }
26187c006c81SFrank Schoenheit [fs] 
2619f5f7b4efSAlbert Thuswaldner /*  [Description]
2620fd069beeSJens-Heiner Rechtien 
2621f5f7b4efSAlbert Thuswaldner     Internal Method for switching to another <SfxViewShell> subclass,
2622f5f7b4efSAlbert Thuswaldner     which should be created in this SfxMDIFrame. If no SfxViewShell exist
2623f5f7b4efSAlbert Thuswaldner     in this SfxMDIFrame, then one will first be created.
2624fd069beeSJens-Heiner Rechtien 
2625fd069beeSJens-Heiner Rechtien 
2626f5f7b4efSAlbert Thuswaldner     [Return Value]
2627fd069beeSJens-Heiner Rechtien 
26289278df2cSNoel Grandin     bool                        true
2629f5f7b4efSAlbert Thuswaldner                                 requested SfxViewShell was created and a
2630f5f7b4efSAlbert Thuswaldner                                 possibly existing one deleted
2631fd069beeSJens-Heiner Rechtien 
26329278df2cSNoel Grandin                                 false
2633f5f7b4efSAlbert Thuswaldner                                 SfxViewShell requested could not be created,
2634f5f7b4efSAlbert Thuswaldner                                 the existing SfxViewShell thus continue to exist
2635fd069beeSJens-Heiner Rechtien */
SwitchToViewShell_Impl(sal_uInt16 nViewIdOrNo,bool bIsIndex)2636278e2b36SMarkus Mohrhard bool SfxViewFrame::SwitchToViewShell_Impl
2637278e2b36SMarkus Mohrhard (
2638278e2b36SMarkus Mohrhard     sal_uInt16  nViewIdOrNo,    /*  > 0
2639278e2b36SMarkus Mohrhard                                 Registration-Id of the View, to which the
26407e24cedbSdennisroczek                                 method should switch, for example the one
2641278e2b36SMarkus Mohrhard                                 that will be created.
2642fd069beeSJens-Heiner Rechtien 
2643278e2b36SMarkus Mohrhard                                 == 0
2644278e2b36SMarkus Mohrhard                                 First use the Default view. */
2645278e2b36SMarkus Mohrhard 
2646278e2b36SMarkus Mohrhard     bool        bIsIndex        /*  true
2647278e2b36SMarkus Mohrhard                                 'nViewIdOrNo' is no Registration-Id instead
2648278e2b36SMarkus Mohrhard                                 an Index of <SfxViewFrame> in <SfxObjectShell>.
2649278e2b36SMarkus Mohrhard                                 */
2650278e2b36SMarkus Mohrhard )
2651fd069beeSJens-Heiner Rechtien {
265283ee99a9SFrank Schoenheit [fs]     try
2653fd069beeSJens-Heiner Rechtien     {
265428034eafSStephan Bergmann         ENSURE_OR_THROW( GetObjectShell() != nullptr, "not possible without a document" );
2655fd069beeSJens-Heiner Rechtien 
265683ee99a9SFrank Schoenheit [fs]         // if we already have a view shell, remove it
265783ee99a9SFrank Schoenheit [fs]         SfxViewShell* pOldSh = GetViewShell();
26586732980bSFrank Schoenheit [fs]         OSL_PRECOND( pOldSh, "SfxViewFrame::SwitchToViewShell_Impl: that's called *switch* (not for *initial-load*) for a reason" );
2659fd069beeSJens-Heiner Rechtien         if ( pOldSh )
2660fd069beeSJens-Heiner Rechtien         {
266123af031bSElton Chung             // ask whether it can be closed
2662e5da350eSNoel Grandin             if ( !pOldSh->PrepareClose() )
26639278df2cSNoel Grandin                 return false;
2664fd069beeSJens-Heiner Rechtien 
266583ee99a9SFrank Schoenheit [fs]             // remove sub shells from Dispatcher before switching to new ViewShell
266683ee99a9SFrank Schoenheit [fs]             PopShellAndSubShells_Impl( *pOldSh );
2667fd069beeSJens-Heiner Rechtien         }
266822f81876SRüdiger Timm 
2669fd069beeSJens-Heiner Rechtien         GetBindings().ENTERREGISTRATIONS();
26706732980bSFrank Schoenheit [fs]         LockAdjustPosSizePixel();
2671fd069beeSJens-Heiner Rechtien 
2672d8bba185SFrank Schoenheit [fs]         // ID of the new view
267383ee99a9SFrank Schoenheit [fs]         SfxObjectFactory& rDocFact = GetObjectShell()->GetFactory();
2674d615af61SNoel Grandin         const SfxInterfaceId nViewId = ( bIsIndex || !nViewIdOrNo ) ? rDocFact.GetViewFactory( nViewIdOrNo ).GetOrdinal() : SfxInterfaceId(nViewIdOrNo);
2675a966a3b5SKurt Zenker 
26767c006c81SFrank Schoenheit [fs]         // save the view data of the old view, so it can be restored later on (when needed)
26771f01f13dSFrank Schoenheit [fs]         SaveCurrentViewData_Impl( nViewId );
26787c006c81SFrank Schoenheit [fs] 
2679557579ecSCaolán McNamara         if (pOldSh)
2680164fb25fSMiklos Vajna             pOldSh->SetDying();
2681164fb25fSMiklos Vajna 
2682d8bba185SFrank Schoenheit [fs]         // create and load new ViewShell
2683d8bba185SFrank Schoenheit [fs]         SfxViewShell* pNewSh = LoadViewIntoFrame_Impl(
2684d8bba185SFrank Schoenheit [fs]             *GetObjectShell(),
2685ef15b85eSFrank Schoenheit [fs]             GetFrame().GetFrameInterface(),
2686d8bba185SFrank Schoenheit [fs]             Sequence< PropertyValue >(),    // means "reuse existing model's args"
2687d8bba185SFrank Schoenheit [fs]             nViewId,
2688d8bba185SFrank Schoenheit [fs]             false
2689d8bba185SFrank Schoenheit [fs]         );
2690fd069beeSJens-Heiner Rechtien 
269122f81876SRüdiger Timm         // allow resize events to be processed
2692fd069beeSJens-Heiner Rechtien         UnlockAdjustPosSizePixel();
2693fd069beeSJens-Heiner Rechtien 
2694fd069beeSJens-Heiner Rechtien         if ( GetWindow().IsReallyVisible() )
2695424d17e6SStephan Bergmann             DoAdjustPosSizePixel( pNewSh, Point(), GetWindow().GetOutputSizePixel(), false );
2696fd069beeSJens-Heiner Rechtien 
2697fd069beeSJens-Heiner Rechtien         GetBindings().LEAVEREGISTRATIONS();
2698fd069beeSJens-Heiner Rechtien         delete pOldSh;
269922f81876SRüdiger Timm     }
2700913a2d36SNoel Grandin     catch ( const css::uno::Exception& )
270122f81876SRüdiger Timm     {
27022715d3f8SJens-Heiner Rechtien         // the SfxCode is not able to cope with exceptions thrown while creating views
27032715d3f8SJens-Heiner Rechtien         // the code will crash in the stack unwinding procedure, so we shouldn't let exceptions go through here
27044450b2a1SNoel Grandin         DBG_UNHANDLED_EXCEPTION("sfx.view");
27059278df2cSNoel Grandin         return false;
270622f81876SRüdiger Timm     }
270722f81876SRüdiger Timm 
2708d92aa2f4SNorbert Thiebaud     DBG_ASSERT( SfxGetpApp()->GetViewFrames_Impl().size() == SfxGetpApp()->GetViewShells_Impl().size(), "Inconsistent view arrays!" );
27099278df2cSNoel Grandin     return true;
2710fd069beeSJens-Heiner Rechtien }
2711fd069beeSJens-Heiner Rechtien 
SetCurViewId_Impl(const SfxInterfaceId i_nID)2712d615af61SNoel Grandin void SfxViewFrame::SetCurViewId_Impl( const SfxInterfaceId i_nID )
2713fd069beeSJens-Heiner Rechtien {
27141c087eb5SXisco Fauli     m_pImpl->nCurViewId = i_nID;
2715fd069beeSJens-Heiner Rechtien }
2716fd069beeSJens-Heiner Rechtien 
GetCurViewId() const2717d615af61SNoel Grandin SfxInterfaceId SfxViewFrame::GetCurViewId() const
2718fd069beeSJens-Heiner Rechtien {
27191c087eb5SXisco Fauli     return m_pImpl->nCurViewId;
2720fd069beeSJens-Heiner Rechtien }
2721fd069beeSJens-Heiner Rechtien 
2722f5f7b4efSAlbert Thuswaldner /*  [Description]
2723fd069beeSJens-Heiner Rechtien 
2724f5f7b4efSAlbert Thuswaldner     Internal method to run the slot for the <SfxShell> Subclass in the
2725f5f7b4efSAlbert Thuswaldner     SfxViewFrame <SVIDL> described slots.
2726fd069beeSJens-Heiner Rechtien */
ExecView_Impl(SfxRequest & rReq)2727278e2b36SMarkus Mohrhard void SfxViewFrame::ExecView_Impl
2728278e2b36SMarkus Mohrhard (
2729278e2b36SMarkus Mohrhard     SfxRequest& rReq        // The executable <SfxRequest>
2730278e2b36SMarkus Mohrhard )
2731fd069beeSJens-Heiner Rechtien {
2732fd069beeSJens-Heiner Rechtien 
2733f5f7b4efSAlbert Thuswaldner     // If the Shells are just being replaced...
2734fd069beeSJens-Heiner Rechtien     if ( !GetObjectShell() || !GetViewShell() )
2735fd069beeSJens-Heiner Rechtien         return;
2736fd069beeSJens-Heiner Rechtien 
2737fd069beeSJens-Heiner Rechtien     switch ( rReq.GetSlot() )
2738fd069beeSJens-Heiner Rechtien     {
27396c1be809SKurt Zenker         case SID_TERMINATE_INPLACEACTIVATION :
27406c1be809SKurt Zenker         {
27416c1be809SKurt Zenker             SfxInPlaceClient* pClient = GetViewShell()->GetUIActiveClient();
27426c1be809SKurt Zenker             if ( pClient )
2743185d8414SVladimir Glazounov                 pClient->DeactivateObject();
27446c1be809SKurt Zenker             break;
27456c1be809SKurt Zenker         }
27466c1be809SKurt Zenker 
2747fd069beeSJens-Heiner Rechtien         case SID_VIEWSHELL:
2748fd069beeSJens-Heiner Rechtien         {
274951b995b9SNoel Grandin             const SfxUInt16Item *pItem = nullptr;
27506732980bSFrank Schoenheit [fs]             if  (   rReq.GetArgs()
275151b995b9SNoel Grandin                 &&  (pItem = rReq.GetArgs()->GetItemIfSet( SID_VIEWSHELL, false ))
27526732980bSFrank Schoenheit [fs]                 )
27536732980bSFrank Schoenheit [fs]             {
275451b995b9SNoel Grandin                 const sal_uInt16 nViewId = pItem->GetValue();
27559278df2cSNoel Grandin                 bool bSuccess = SwitchToViewShell_Impl( nViewId );
27566732980bSFrank Schoenheit [fs]                 rReq.SetReturnValue( SfxBoolItem( 0, bSuccess ) );
27576732980bSFrank Schoenheit [fs]             }
2758fd069beeSJens-Heiner Rechtien             break;
2759fd069beeSJens-Heiner Rechtien         }
2760fd069beeSJens-Heiner Rechtien 
2761fd069beeSJens-Heiner Rechtien         case SID_VIEWSHELL0:
2762fd069beeSJens-Heiner Rechtien         case SID_VIEWSHELL1:
2763fd069beeSJens-Heiner Rechtien         case SID_VIEWSHELL2:
2764b9b2ab0fSNoel Grandin         case SID_VIEWSHELL3:
2765b9b2ab0fSNoel Grandin         case SID_VIEWSHELL4:
2766fd069beeSJens-Heiner Rechtien         {
27676732980bSFrank Schoenheit [fs]             const sal_uInt16 nViewNo = rReq.GetSlot() - SID_VIEWSHELL0;
27689278df2cSNoel Grandin             bool bSuccess = SwitchToViewShell_Impl( nViewNo, true );
27696732980bSFrank Schoenheit [fs]             rReq.SetReturnValue( SfxBoolItem( 0, bSuccess ) );
2770fd069beeSJens-Heiner Rechtien             break;
2771fd069beeSJens-Heiner Rechtien         }
2772fd069beeSJens-Heiner Rechtien 
2773fd069beeSJens-Heiner Rechtien         case SID_NEWWINDOW:
2774fd069beeSJens-Heiner Rechtien         {
2775f5f7b4efSAlbert Thuswaldner             // Hack. at the moment a virtual Function
2776fd069beeSJens-Heiner Rechtien             if ( !GetViewShell()->NewWindowAllowed() )
2777fd069beeSJens-Heiner Rechtien             {
27781c881a9eSThomas Arnhold                 OSL_FAIL( "You should have disabled the 'Window/New Window' slot!" );
2779fd069beeSJens-Heiner Rechtien                 return;
2780a9f5987aSMathias Bauer             }
2781a9f5987aSMathias Bauer 
278272c68a3dSAndrea Gelmini             // Get ViewData of FrameSets recursively.
2783ef15b85eSFrank Schoenheit [fs]             GetFrame().GetViewData_Impl();
2784fd069beeSJens-Heiner Rechtien             SfxMedium* pMed = GetObjectShell()->GetMedium();
2785fd069beeSJens-Heiner Rechtien 
278691a0cf61SFrank Schoenheit [fs]             // do not open the new window hidden
2787f5dd4faeSMike Kaganski             pMed->GetItemSet().ClearItem( SID_HIDDEN );
278891a0cf61SFrank Schoenheit [fs] 
278991a0cf61SFrank Schoenheit [fs]             // the view ID (optional arg. TODO: this is currently not supported in the slot definition ...)
2790e5be07f5SJan Holesovsky             const SfxUInt16Item* pViewIdItem = rReq.GetArg<SfxUInt16Item>(SID_VIEW_ID);
2791d615af61SNoel Grandin             const SfxInterfaceId nViewId = pViewIdItem ? SfxInterfaceId(pViewIdItem->GetValue()) : GetCurViewId();
279291a0cf61SFrank Schoenheit [fs] 
279391a0cf61SFrank Schoenheit [fs]             Reference < XFrame > xFrame;
279491a0cf61SFrank Schoenheit [fs]             // the frame (optional arg. TODO: this is currently not supported in the slot definition ...)
2795e5be07f5SJan Holesovsky             const SfxUnoFrameItem* pFrameItem = rReq.GetArg<SfxUnoFrameItem>(SID_FILLFRAME);
2796a9f5987aSMathias Bauer             if ( pFrameItem )
279716dacff3SFrank Schoenheit [fs]                 xFrame = pFrameItem->GetFrame();
279891a0cf61SFrank Schoenheit [fs] 
27993faf9628SFrank Schoenheit [fs]             LoadViewIntoFrame_Impl_NoThrow( *GetObjectShell(), xFrame, nViewId, false );
2800fd069beeSJens-Heiner Rechtien 
2801fd069beeSJens-Heiner Rechtien             rReq.Done();
2802fd069beeSJens-Heiner Rechtien             break;
2803fd069beeSJens-Heiner Rechtien         }
2804528599d1SKurt Zenker 
2805528599d1SKurt Zenker         case SID_OBJECT:
2806528599d1SKurt Zenker         {
2807e5be07f5SJan Holesovsky             const SfxInt16Item* pItem = rReq.GetArg<SfxInt16Item>(SID_OBJECT);
2808528599d1SKurt Zenker 
280904c1a98cSMike Kaganski             if (pItem)
2810528599d1SKurt Zenker             {
281104c1a98cSMike Kaganski                 GetViewShell()->DoVerb( pItem->GetValue() );
2812528599d1SKurt Zenker                 rReq.Done();
281364d624b6SAndrea Gelmini                 break;
2814528599d1SKurt Zenker             }
2815528599d1SKurt Zenker         }
2816fd069beeSJens-Heiner Rechtien     }
2817fd069beeSJens-Heiner Rechtien }
2818fd069beeSJens-Heiner Rechtien 
28192a044205SRüdiger Timm /* TODO as96863:
2820db7a4413SGregg King         This method try to collect information about the count of currently open documents.
28212a044205SRüdiger Timm         But the algorithm is implemented very simple ...
28222a044205SRüdiger Timm         E.g. hidden documents should be ignored here ... but they are counted.
28232a044205SRüdiger Timm         TODO: export special helper "framework::FrameListAnalyzer" within the framework module
28242a044205SRüdiger Timm         and use it here.
28252a044205SRüdiger Timm */
impl_maxOpenDocCountReached()2826206b5b26SStephan Bergmann static bool impl_maxOpenDocCountReached()
28272a044205SRüdiger Timm {
2828ed0b12f4SNoel Grandin     const css::uno::Reference< css::uno::XComponentContext >& xContext = ::comphelper::getProcessComponentContext();
28294256c764SLuboš Luňák     std::optional<sal_Int32> x(officecfg::Office::Common::Misc::MaxOpenDocuments::get());
28302a044205SRüdiger Timm     // NIL means: count of allowed documents = infinite !
283178c5a2ceSJulien Nabet     if (!x)
28329278df2cSNoel Grandin         return false;
283347dd2c63SStephan Bergmann     sal_Int32 nMaxDocs(*x);
28342a044205SRüdiger Timm     sal_Int32 nOpenDocs = 0;
28352a044205SRüdiger Timm 
2836bb121c86SNoel Grandin     css::uno::Reference< css::frame::XDesktop2 >  xDesktop = css::frame::Desktop::create(xContext);
28372a044205SRüdiger Timm     css::uno::Reference< css::container::XIndexAccess > xCont(xDesktop->getFrames(), css::uno::UNO_QUERY_THROW);
28382a044205SRüdiger Timm 
28392a044205SRüdiger Timm     sal_Int32 c = xCont->getCount();
28402a044205SRüdiger Timm     sal_Int32 i = 0;
28412a044205SRüdiger Timm 
28422a044205SRüdiger Timm     for (i=0; i<c; ++i)
28432a044205SRüdiger Timm     {
28442a044205SRüdiger Timm         try
28452a044205SRüdiger Timm         {
28462a044205SRüdiger Timm             css::uno::Reference< css::frame::XFrame > xFrame;
28472a044205SRüdiger Timm             xCont->getByIndex(i) >>= xFrame;
28482a044205SRüdiger Timm             if ( ! xFrame.is())
28492a044205SRüdiger Timm                 continue;
28502a044205SRüdiger Timm 
28512a044205SRüdiger Timm             // a) do not count the help window
2852d6bc02f8SSzabolcs Dezsi             if ( xFrame->getName() == "OFFICE_HELP_TASK" )
28532a044205SRüdiger Timm                 continue;
28542a044205SRüdiger Timm 
28552a044205SRüdiger Timm             // b) count all other frames
28562a044205SRüdiger Timm             ++nOpenDocs;
28572a044205SRüdiger Timm         }
28582a044205SRüdiger Timm         catch(const css::uno::Exception&)
2859bef93028SMichael Stahl             // An IndexOutOfBoundsException can happen in multithreaded
2860f5f7b4efSAlbert Thuswaldner             // environments, where any other thread can change this
2861f5f7b4efSAlbert Thuswaldner             // container !
28622a044205SRüdiger Timm             { continue; }
28632a044205SRüdiger Timm     }
28642a044205SRüdiger Timm 
28652a044205SRüdiger Timm     return (nOpenDocs >= nMaxDocs);
28662a044205SRüdiger Timm }
28672a044205SRüdiger Timm 
2868f5f7b4efSAlbert Thuswaldner /*  [Description]
2869fd069beeSJens-Heiner Rechtien 
287007675885SNoel Grandin     This internal method returns in 'rSet' the Status for the  <SfxShell>
2871f5f7b4efSAlbert Thuswaldner     Subclass SfxViewFrame in the <SVIDL> described <Slots>.
2872fd069beeSJens-Heiner Rechtien 
287343048493SJulien Nabet     Thus exactly those Slots-IDs that are recognized as being invalid by Sfx
2874f5f7b4efSAlbert Thuswaldner     are included as Which-ranges in 'rSet'. If there exists a mapping for
2875f5f7b4efSAlbert Thuswaldner     single slot-IDs of the <SfxItemPool> set in the shell, then the respective
2876f5f7b4efSAlbert Thuswaldner     Which-IDs are used so that items can be replaced directly with a working
2877f5f7b4efSAlbert Thuswaldner     Core::sun::com::star::script::Engine of the Which-IDs if possible. .
2878fd069beeSJens-Heiner Rechtien */
StateView_Impl(SfxItemSet & rSet)2879278e2b36SMarkus Mohrhard void SfxViewFrame::StateView_Impl
2880278e2b36SMarkus Mohrhard (
2881278e2b36SMarkus Mohrhard     SfxItemSet&     rSet            /*  empty <SfxItemSet> with <Which-Ranges>,
2882278e2b36SMarkus Mohrhard                                         which describes the Slot Ids */
2883278e2b36SMarkus Mohrhard )
2884fd069beeSJens-Heiner Rechtien {
2885fd069beeSJens-Heiner Rechtien 
2886fd069beeSJens-Heiner Rechtien     SfxObjectShell *pDocSh = GetObjectShell();
2887fd069beeSJens-Heiner Rechtien 
2888fd069beeSJens-Heiner Rechtien     if ( !pDocSh )
2889f5f7b4efSAlbert Thuswaldner         // I'm just on reload and am yielding myself ...
2890fd069beeSJens-Heiner Rechtien         return;
2891fd069beeSJens-Heiner Rechtien 
28925d0a231bSNoel Grandin     const WhichRangesContainer & pRanges = rSet.GetRanges();
28935d0a231bSNoel Grandin     assert(!pRanges.empty() && "Set with no Range");
28945d0a231bSNoel Grandin     for ( auto const & pRange : pRanges )
2895fd069beeSJens-Heiner Rechtien     {
28965d0a231bSNoel Grandin         sal_uInt16 nStartWhich = pRange.first;
28975d0a231bSNoel Grandin         sal_uInt16 nEndWhich = pRange.second;
2898ea4a47d7SNoel Grandin         for ( sal_uInt16 nWhich = nStartWhich; nWhich <= nEndWhich; ++nWhich )
2899fd069beeSJens-Heiner Rechtien         {
2900fd069beeSJens-Heiner Rechtien             switch(nWhich)
2901fd069beeSJens-Heiner Rechtien             {
2902fd069beeSJens-Heiner Rechtien                 case SID_VIEWSHELL:
2903fd069beeSJens-Heiner Rechtien                 {
2904d615af61SNoel Grandin                     rSet.Put( SfxUInt16Item( nWhich, sal_uInt16(m_pImpl->nCurViewId )) );
2905fd069beeSJens-Heiner Rechtien                     break;
2906fd069beeSJens-Heiner Rechtien                 }
2907fd069beeSJens-Heiner Rechtien 
2908fd069beeSJens-Heiner Rechtien                 case SID_VIEWSHELL0:
2909fd069beeSJens-Heiner Rechtien                 case SID_VIEWSHELL1:
2910fd069beeSJens-Heiner Rechtien                 case SID_VIEWSHELL2:
2911b9b2ab0fSNoel Grandin                 case SID_VIEWSHELL3:
2912b9b2ab0fSNoel Grandin                 case SID_VIEWSHELL4:
2913fd069beeSJens-Heiner Rechtien                 {
2914fd069beeSJens-Heiner Rechtien                     sal_uInt16 nViewNo = nWhich - SID_VIEWSHELL0;
2915fd069beeSJens-Heiner Rechtien                     if ( GetObjectShell()->GetFactory().GetViewFactoryCount() >
29166c1be809SKurt Zenker                          nViewNo && !GetObjectShell()->IsInPlaceActive() )
2917fd069beeSJens-Heiner Rechtien                     {
2918fd069beeSJens-Heiner Rechtien                         SfxViewFactory &rViewFactory =
2919fd069beeSJens-Heiner Rechtien                             GetObjectShell()->GetFactory().GetViewFactory(nViewNo);
2920fd069beeSJens-Heiner Rechtien                         rSet.Put( SfxBoolItem(
29211c087eb5SXisco Fauli                             nWhich, m_pImpl->nCurViewId == rViewFactory.GetOrdinal() ) );
2922fd069beeSJens-Heiner Rechtien                     }
2923fd069beeSJens-Heiner Rechtien                     else
2924fd069beeSJens-Heiner Rechtien                         rSet.DisableItem( nWhich );
2925fd069beeSJens-Heiner Rechtien                     break;
2926fd069beeSJens-Heiner Rechtien                 }
2927fd069beeSJens-Heiner Rechtien 
2928fd069beeSJens-Heiner Rechtien                 case SID_NEWWINDOW:
2929fd069beeSJens-Heiner Rechtien                 {
293091a0cf61SFrank Schoenheit [fs]                     if  (   !GetViewShell()->NewWindowAllowed()
293191a0cf61SFrank Schoenheit [fs]                         ||  impl_maxOpenDocCountReached()
293291a0cf61SFrank Schoenheit [fs]                         )
2933fd069beeSJens-Heiner Rechtien                         rSet.DisableItem( nWhich );
2934fd069beeSJens-Heiner Rechtien                     break;
2935fd069beeSJens-Heiner Rechtien                 }
2936fd069beeSJens-Heiner Rechtien             }
2937fd069beeSJens-Heiner Rechtien         }
2938fd069beeSJens-Heiner Rechtien     }
2939fd069beeSJens-Heiner Rechtien }
2940fd069beeSJens-Heiner Rechtien 
29410ce0c369SAlexander Wilms 
ToTop()2942fd069beeSJens-Heiner Rechtien void SfxViewFrame::ToTop()
2943fd069beeSJens-Heiner Rechtien {
2944ef15b85eSFrank Schoenheit [fs]     GetFrame().Appear();
2945fd069beeSJens-Heiner Rechtien }
2946fd069beeSJens-Heiner Rechtien 
29470ce0c369SAlexander Wilms 
2948f5f7b4efSAlbert Thuswaldner /*  [Description]
2949f5f7b4efSAlbert Thuswaldner 
2950f5f7b4efSAlbert Thuswaldner     GetFrame returns the Frame, in which the ViewFrame is located.
2951fd069beeSJens-Heiner Rechtien */
GetFrame() const2952278e2b36SMarkus Mohrhard SfxFrame& SfxViewFrame::GetFrame() const
2953fd069beeSJens-Heiner Rechtien {
29541c087eb5SXisco Fauli     return m_pImpl->rFrame;
2955fd069beeSJens-Heiner Rechtien }
2956fd069beeSJens-Heiner Rechtien 
GetTopViewFrame() const2957fd069beeSJens-Heiner Rechtien SfxViewFrame* SfxViewFrame::GetTopViewFrame() const
2958fd069beeSJens-Heiner Rechtien {
29592b3de550SNoel Grandin     return GetFrame().GetCurrentViewFrame();
2960fd069beeSJens-Heiner Rechtien }
2961fd069beeSJens-Heiner Rechtien 
GetWindow() const2962827c46e7SNoel Grandin vcl::Window& SfxViewFrame::GetWindow() const
2963fd069beeSJens-Heiner Rechtien {
29641c087eb5SXisco Fauli     return m_pImpl->pWindow ? *m_pImpl->pWindow : GetFrame().GetWindow();
2965fd069beeSJens-Heiner Rechtien }
2966fd069beeSJens-Heiner Rechtien 
GetFrameWeld() const2967200626e4SCaolán McNamara weld::Window* SfxViewFrame::GetFrameWeld() const
2968200626e4SCaolán McNamara {
2969200626e4SCaolán McNamara     return GetWindow().GetFrameWeld();
2970200626e4SCaolán McNamara }
2971200626e4SCaolán McNamara 
DoClose()29729278df2cSNoel Grandin bool SfxViewFrame::DoClose()
2973fd069beeSJens-Heiner Rechtien {
2974ef15b85eSFrank Schoenheit [fs]     return GetFrame().DoClose();
2975fd069beeSJens-Heiner Rechtien }
2976fd069beeSJens-Heiner Rechtien 
GetActualPresentationURL_Impl() const29771580c31fSNoel Grandin const OUString & SfxViewFrame::GetActualPresentationURL_Impl() const
2978fd069beeSJens-Heiner Rechtien {
297949783285SNoel Grandin     if ( m_xObjSh.is() )
298098b6e387SMiklos Vajna         return m_xObjSh->GetMedium()->GetName();
29811580c31fSNoel Grandin     return EMPTY_OUSTRING;
2982fd069beeSJens-Heiner Rechtien }
2983fd069beeSJens-Heiner Rechtien 
SetModalMode(bool bModal)29849278df2cSNoel Grandin void SfxViewFrame::SetModalMode( bool bModal )
2985fd069beeSJens-Heiner Rechtien {
29860e8d0fe0SPranav Kant     // no real modality for LOK
29870e8d0fe0SPranav Kant     if (comphelper::LibreOfficeKit::isActive())
29880e8d0fe0SPranav Kant         return;
29890e8d0fe0SPranav Kant 
29901c087eb5SXisco Fauli     m_pImpl->bModal = bModal;
299149783285SNoel Grandin     if ( m_xObjSh.is() )
2992fd069beeSJens-Heiner Rechtien     {
2993f004aa99SJacek Fraczek         for ( SfxViewFrame* pFrame = SfxViewFrame::GetFirst( m_xObjSh.get() );
2994f004aa99SJacek Fraczek               !bModal && pFrame; pFrame = SfxViewFrame::GetNext( *pFrame, m_xObjSh.get() ) )
29951c087eb5SXisco Fauli             bModal = pFrame->m_pImpl->bModal;
299698b6e387SMiklos Vajna         m_xObjSh->SetModalMode_Impl( bModal );
2997fd069beeSJens-Heiner Rechtien     }
2998fd069beeSJens-Heiner Rechtien }
2999fd069beeSJens-Heiner Rechtien 
IsInModalMode() const30009278df2cSNoel Grandin bool SfxViewFrame::IsInModalMode() const
3001fd069beeSJens-Heiner Rechtien {
30021c087eb5SXisco Fauli     return m_pImpl->bModal || GetFrame().GetWindow().IsInModalMode();
3003fd069beeSJens-Heiner Rechtien }
3004fd069beeSJens-Heiner Rechtien 
Resize(bool bForce)30059278df2cSNoel Grandin void SfxViewFrame::Resize( bool bForce )
3006fd069beeSJens-Heiner Rechtien {
3007fd069beeSJens-Heiner Rechtien     Size aSize = GetWindow().GetOutputSizePixel();
3008536a6d6cSNoel Grandin     if ( !bForce && aSize == m_pImpl->aSize )
3009536a6d6cSNoel Grandin         return;
3010536a6d6cSNoel Grandin 
30111c087eb5SXisco Fauli     m_pImpl->aSize = aSize;
3012fd069beeSJens-Heiner Rechtien     SfxViewShell *pShell = GetViewShell();
3013fd069beeSJens-Heiner Rechtien     if ( pShell )
3014fd069beeSJens-Heiner Rechtien     {
3015ef15b85eSFrank Schoenheit [fs]         if ( GetFrame().IsInPlace() )
30166c1be809SKurt Zenker         {
30176c1be809SKurt Zenker             Point aPoint = GetWindow().GetPosPixel();
3018424d17e6SStephan Bergmann             DoAdjustPosSizePixel( pShell, aPoint, aSize, true );
30196c1be809SKurt Zenker         }
30206c1be809SKurt Zenker         else
30216c1be809SKurt Zenker         {
3022424d17e6SStephan Bergmann             DoAdjustPosSizePixel( pShell, Point(), aSize, false );
3023fd069beeSJens-Heiner Rechtien         }
3024fd069beeSJens-Heiner Rechtien     }
3025fd069beeSJens-Heiner Rechtien }
3026fd069beeSJens-Heiner Rechtien 
302783dd72cbSTor Lillqvist #if HAVE_FEATURE_SCRIPTING
302883dd72cbSTor Lillqvist 
30298f826827SMathias Bauer #define LINE_SEP 0x0A
30308f826827SMathias Bauer 
CutLines(OUString & rStr,sal_Int32 nStartLine,sal_Int32 nLines)3031206b5b26SStephan Bergmann static void CutLines( OUString& rStr, sal_Int32 nStartLine, sal_Int32 nLines )
30328f826827SMathias Bauer {
30337d4ec83bSRüdiger Timm     sal_Int32 nStartPos = 0;
30347d4ec83bSRüdiger Timm     sal_Int32 nLine = 0;
30358f826827SMathias Bauer     while ( nLine < nStartLine )
30368f826827SMathias Bauer     {
30377d4ec83bSRüdiger Timm         nStartPos = rStr.indexOf( LINE_SEP, nStartPos );
30387d4ec83bSRüdiger Timm         if( nStartPos == -1 )
30397d4ec83bSRüdiger Timm             break;
3040f5f7b4efSAlbert Thuswaldner         nStartPos++;    // not the \n.
30418f826827SMathias Bauer         nLine++;
30428f826827SMathias Bauer     }
30438f826827SMathias Bauer 
30443dc91d3fSJulien Nabet     SAL_WARN_IF(nStartPos == -1, "sfx.view", "CutLines: Start row not found!");
30458f826827SMathias Bauer 
30467d4ec83bSRüdiger Timm     if ( nStartPos != -1 )
30478f826827SMathias Bauer     {
3048d2f7b78bSCaolán McNamara         sal_Int32 nEndPos = nStartPos;
30497d4ec83bSRüdiger Timm         for ( sal_Int32 i = 0; i < nLines; i++ )
30507d4ec83bSRüdiger Timm             nEndPos = rStr.indexOf( LINE_SEP, nEndPos+1 );
30518f826827SMathias Bauer 
3052f5f7b4efSAlbert Thuswaldner         if ( nEndPos == -1 ) // Can happen at the last row.
30537d4ec83bSRüdiger Timm             nEndPos = rStr.getLength();
30547d4ec83bSRüdiger Timm         else
30558f826827SMathias Bauer             nEndPos++;
30568f826827SMathias Bauer 
305793c64a61SNoel         rStr = OUString::Concat(rStr.subView( 0, nStartPos )) + rStr.subView( nEndPos );
30588f826827SMathias Bauer     }
30593ad6957dSNoel Grandin     // erase trailing lines
30603ad6957dSNoel Grandin     if ( nStartPos != -1 )
30618f826827SMathias Bauer     {
30627d4ec83bSRüdiger Timm         sal_Int32 n = nStartPos;
30637d4ec83bSRüdiger Timm         sal_Int32 nLen = rStr.getLength();
30640e6a2601SNoel Grandin         while ( ( n < nLen ) && ( rStr[ n ] == LINE_SEP ) )
30658f826827SMathias Bauer             n++;
30668f826827SMathias Bauer 
30678f826827SMathias Bauer         if ( n > nStartPos )
306893c64a61SNoel             rStr = OUString::Concat(rStr.subView( 0, nStartPos )) + rStr.subView( n );
30698f826827SMathias Bauer     }
30708f826827SMathias Bauer }
30718f826827SMathias Bauer 
307283dd72cbSTor Lillqvist #endif
307383dd72cbSTor Lillqvist 
30748f826827SMathias Bauer /*
3075f5f7b4efSAlbert Thuswaldner     add new recorded dispatch macro script into the application global basic
3076f5f7b4efSAlbert Thuswaldner     lib container. It generates a new unique id for it and insert the macro
30777bc1c438SAndrea Gelmini     by using this number as name for the module
30788f826827SMathias Bauer  */
AddDispatchMacroToBasic_Impl(const OUString & sMacro)30791946794aSLuboš Luňák void SfxViewFrame::AddDispatchMacroToBasic_Impl( const OUString& sMacro )
30808f826827SMathias Bauer {
30819ecac387STor Lillqvist #if !HAVE_FEATURE_SCRIPTING
3082e4251554STor Lillqvist     (void) sMacro;
3083e4251554STor Lillqvist #else
3084e24a27b4SOlivier Hallot     if ( sMacro.isEmpty() )
308570907f0dSMathias Bauer         return;
30868f826827SMathias Bauer 
3087d92aa2f4SNorbert Thiebaud     SfxApplication* pSfxApp = SfxGetpApp();
3088473d4f84SCaolán McNamara     SfxItemPool& rPool = pSfxApp->GetPool();
3089473d4f84SCaolán McNamara     SfxRequest aReq(SID_BASICCHOOSER, SfxCallMode::SYNCHRON, rPool);
3090473d4f84SCaolán McNamara 
3091473d4f84SCaolán McNamara     //seen in tdf#122598, no parent for subsequent dialog
3092473d4f84SCaolán McNamara     SfxAllItemSet aSet(rPool);
30938c3a651aSCaolán McNamara     aSet.Put(SfxUnoFrameItem(SID_FILLFRAME,
30948c3a651aSCaolán McNamara                 GetFrame().GetFrameInterface()));
3095473d4f84SCaolán McNamara     aReq.SetInternalArgs_Impl(aSet);
3096473d4f84SCaolán McNamara 
3097c35616ddSStephan Bergmann     aReq.AppendItem( SfxBoolItem(SID_RECORDMACRO,true) );
3098789a737aSArmin Le Grand (allotropia)     const SfxPoolItemHolder& rResult(SfxGetpApp()->ExecuteSlot(aReq));
309935c24f9bSNoel Grandin     OUString aScriptURL;
31002ddec231SArmin Le Grand (allotropia)     if (rResult)
3101789a737aSArmin Le Grand (allotropia)         aScriptURL = static_cast<const SfxStringItem*>(rResult.getItem())->GetValue();
310235c24f9bSNoel Grandin     if ( !aScriptURL.isEmpty() )
31038f826827SMathias Bauer     {
31048f826827SMathias Bauer         // parse scriptURL
310535c24f9bSNoel Grandin         OUString aLibName;
310635c24f9bSNoel Grandin         OUString aModuleName;
310735c24f9bSNoel Grandin         OUString aMacroName;
310835c24f9bSNoel Grandin         OUString aLocation;
3109ed0b12f4SNoel Grandin         const Reference< XComponentContext >& xContext = ::comphelper::getProcessComponentContext();
3110913a2d36SNoel Grandin         Reference< css::uri::XUriReferenceFactory > xFactory =
3111913a2d36SNoel Grandin             css::uri::UriReferenceFactory::create( xContext );
3112913a2d36SNoel Grandin         Reference< css::uri::XVndSunStarScriptUrl > xUrl( xFactory->parse( aScriptURL ), UNO_QUERY );
311341caf02eSOliver Bolte         if ( xUrl.is() )
311441caf02eSOliver Bolte         {
311541caf02eSOliver Bolte             // get name
3116429c7a49SMatteo Casalin             const OUString aName = xUrl->getName();
3117429c7a49SMatteo Casalin             const sal_Unicode cTok = '.';
311841caf02eSOliver Bolte             sal_Int32 nIndex = 0;
311941caf02eSOliver Bolte             aLibName = aName.getToken( 0, cTok, nIndex );
312041caf02eSOliver Bolte             if ( nIndex != -1 )
312141caf02eSOliver Bolte                 aModuleName = aName.getToken( 0, cTok, nIndex );
312241caf02eSOliver Bolte             if ( nIndex != -1 )
312341caf02eSOliver Bolte                 aMacroName = aName.getToken( 0, cTok, nIndex );
31248f826827SMathias Bauer 
31258f826827SMathias Bauer             // get location
3126ca5c9591SNoel Grandin             aLocation = xUrl->getParameter( u"location"_ustr );
312741caf02eSOliver Bolte         }
31288f826827SMathias Bauer 
312928034eafSStephan Bergmann         BasicManager* pBasMgr = nullptr;
3130bc4ba245SStephan Bergmann         if ( aLocation == "application" )
31318f826827SMathias Bauer         {
31328f826827SMathias Bauer             // application basic
313312ba9e3cSNoel Grandin             pBasMgr = SfxApplication::GetBasicManager();
31348f826827SMathias Bauer         }
3135bc4ba245SStephan Bergmann         else if ( aLocation == "document" )
31368f826827SMathias Bauer         {
31378f826827SMathias Bauer             pBasMgr = GetObjectShell()->GetBasicManager();
31388f826827SMathias Bauer         }
31398f826827SMathias Bauer 
31401946794aSLuboš Luňák         OUString aOUSource;
31418f826827SMathias Bauer         if ( pBasMgr)
31428f826827SMathias Bauer         {
31438f826827SMathias Bauer             StarBASIC* pBasic = pBasMgr->GetLib( aLibName );
31448f826827SMathias Bauer             if ( pBasic )
31458f826827SMathias Bauer             {
31468f826827SMathias Bauer                 SbModule* pModule = pBasic->FindModule( aModuleName );
3147c0d7dfa5SArnaud Versini                 SbMethod* pMethod = pModule ? pModule->FindMethod(aMacroName, SbxClassType::Method) : nullptr;
3148d176c0f3SCaolán McNamara                 if (pMethod)
31498f826827SMathias Bauer                 {
31507d4ec83bSRüdiger Timm                     aOUSource = pModule->GetSource32();
3151dcd8e466SMikhail Voytenko                     sal_uInt16 nStart, nEnd;
31528f826827SMathias Bauer                     pMethod->GetLineRange( nStart, nEnd );
3153d66ddcffSYusuf Keten                     sal_uInt16 nlStart = nStart;
3154d66ddcffSYusuf Keten                     sal_uInt16 nlEnd = nEnd;
31553ad6957dSNoel Grandin                     CutLines( aOUSource, nlStart-1, nlEnd-nlStart+1 );
31568f826827SMathias Bauer                 }
31578f826827SMathias Bauer             }
31588f826827SMathias Bauer         }
31598f826827SMathias Bauer 
31608f826827SMathias Bauer         // open lib container and break operation if it couldn't be opened
3161913a2d36SNoel Grandin         css::uno::Reference< css::script::XLibraryContainer > xLibCont;
3162bc4ba245SStephan Bergmann         if ( aLocation == "application" )
31638f826827SMathias Bauer         {
3164d92aa2f4SNorbert Thiebaud             xLibCont = SfxGetpApp()->GetBasicContainer();
31658f826827SMathias Bauer         }
3166bc4ba245SStephan Bergmann         else if ( aLocation == "document" )
31678f826827SMathias Bauer         {
31688f826827SMathias Bauer             xLibCont = GetObjectShell()->GetBasicContainer();
31698f826827SMathias Bauer         }
31708f826827SMathias Bauer 
31718f826827SMathias Bauer         if(!xLibCont.is())
31728f826827SMathias Bauer         {
3173d38cb53eSMichael Stahl             SAL_WARN("sfx.view", "couldn't get access to the basic lib container. Adding of macro isn't possible.");
31748f826827SMathias Bauer             return;
31758f826827SMathias Bauer         }
31768f826827SMathias Bauer 
31778f826827SMathias Bauer         // get LibraryContainer
3178913a2d36SNoel Grandin         css::uno::Any aTemp;
31798f826827SMathias Bauer 
3180913a2d36SNoel Grandin         css::uno::Reference< css::container::XNameAccess > xLib;
3181476a6523SNoel Grandin         if(xLibCont->hasByName(aLibName))
31828f826827SMathias Bauer         {
31838f826827SMathias Bauer             // library must be loaded
3184476a6523SNoel Grandin             aTemp = xLibCont->getByName(aLibName);
3185e256519aSMatteo Casalin             xLibCont->loadLibrary(aLibName);
31868f826827SMathias Bauer             aTemp >>= xLib;
31878f826827SMathias Bauer         }
31888f826827SMathias Bauer         else
31898f826827SMathias Bauer         {
3190476a6523SNoel Grandin             xLib = xLibCont->createLibrary(aLibName);
31918f826827SMathias Bauer         }
31928f826827SMathias Bauer 
31938f826827SMathias Bauer         // pack the macro as direct usable "sub" routine
31941946794aSLuboš Luňák         OUStringBuffer sRoutine(10000);
31959278df2cSNoel Grandin         bool bReplace = false;
31968f826827SMathias Bauer 
31978f826827SMathias Bauer         // get module
3198e256519aSMatteo Casalin         if(xLib->hasByName(aModuleName))
31998f826827SMathias Bauer         {
3200e24a27b4SOlivier Hallot             if ( !aOUSource.isEmpty() )
32018f826827SMathias Bauer             {
32027d4ec83bSRüdiger Timm                 sRoutine.append( aOUSource );
32038f826827SMathias Bauer             }
32048f826827SMathias Bauer             else
32058f826827SMathias Bauer             {
3206429c7a49SMatteo Casalin                 OUString sCode;
3207e256519aSMatteo Casalin                 aTemp = xLib->getByName(aModuleName);
32088f826827SMathias Bauer                 aTemp >>= sCode;
32098f826827SMathias Bauer                 sRoutine.append( sCode );
32108f826827SMathias Bauer             }
32118f826827SMathias Bauer 
32129278df2cSNoel Grandin             bReplace = true;
32138f826827SMathias Bauer         }
32148f826827SMathias Bauer 
32158f826827SMathias Bauer         // append new method
32161c8d43d8SNoel Grandin         sRoutine.append( "\nsub "
32171c8d43d8SNoel Grandin             + aMacroName
32181c8d43d8SNoel Grandin             + "\n"
32191c8d43d8SNoel Grandin             + sMacro
32201c8d43d8SNoel Grandin             + "\nend sub\n" );
32218f826827SMathias Bauer 
32227bc1c438SAndrea Gelmini         // create the module inside the library and insert the macro routine
32238f826827SMathias Bauer         aTemp <<= sRoutine.makeStringAndClear();
32248f826827SMathias Bauer         if ( bReplace )
32258f826827SMathias Bauer         {
3226913a2d36SNoel Grandin             css::uno::Reference< css::container::XNameContainer > xModulCont(
32278f826827SMathias Bauer                 xLib,
3228913a2d36SNoel Grandin                 css::uno::UNO_QUERY);
3229e256519aSMatteo Casalin             xModulCont->replaceByName(aModuleName,aTemp);
32308f826827SMathias Bauer         }
32318f826827SMathias Bauer         else
32328f826827SMathias Bauer         {
3233913a2d36SNoel Grandin             css::uno::Reference< css::container::XNameContainer > xModulCont(
32348f826827SMathias Bauer                 xLib,
3235913a2d36SNoel Grandin                 css::uno::UNO_QUERY);
3236e256519aSMatteo Casalin             xModulCont->insertByName(aModuleName,aTemp);
32378f826827SMathias Bauer         }
32388f826827SMathias Bauer 
32395d221e2cSJens-Heiner Rechtien         // #i17355# update the Basic IDE
32405d221e2cSJens-Heiner Rechtien         for ( SfxViewShell* pViewShell = SfxViewShell::GetFirst(); pViewShell; pViewShell = SfxViewShell::GetNext( *pViewShell ) )
32415d221e2cSJens-Heiner Rechtien         {
324282ecc260SNoel Grandin             if ( pViewShell->GetName() == "BasicIDE" )
32435d221e2cSJens-Heiner Rechtien             {
32440908c7c1SCaolán McNamara                 SfxViewFrame& rViewFrame = pViewShell->GetViewFrame();
32450908c7c1SCaolán McNamara                 SfxDispatcher* pDispat = rViewFrame.GetDispatcher();
3246513f80abSJens-Heiner Rechtien                 if ( pDispat )
32475d221e2cSJens-Heiner Rechtien                 {
324835c24f9bSNoel Grandin                     SfxMacroInfoItem aInfoItem( SID_BASICIDE_ARG_MACROINFO, pBasMgr, aLibName, aModuleName, OUString(), OUString() );
324951d7f466SMichael Stahl                     pDispat->ExecuteList(SID_BASICIDE_UPDATEMODULESOURCE,
325051d7f466SMichael Stahl                             SfxCallMode::SYNCHRON, { &aInfoItem });
32515d221e2cSJens-Heiner Rechtien                 }
32525d221e2cSJens-Heiner Rechtien             }
32535d221e2cSJens-Heiner Rechtien         }
32548f826827SMathias Bauer     }
32558f826827SMathias Bauer     else
32568f826827SMathias Bauer     {
32578f826827SMathias Bauer         // add code for "session only" macro
32588f826827SMathias Bauer     }
3259e4251554STor Lillqvist #endif
32608f826827SMathias Bauer }
32618f826827SMathias Bauer 
MiscExec_Impl(SfxRequest & rReq)3262fd069beeSJens-Heiner Rechtien void SfxViewFrame::MiscExec_Impl( SfxRequest& rReq )
3263fd069beeSJens-Heiner Rechtien {
3264fd069beeSJens-Heiner Rechtien     switch ( rReq.GetSlot() )
3265fd069beeSJens-Heiner Rechtien     {
326632856115SMathias Bauer         case SID_STOP_RECORDING :
3267aee0103dSMathias Bauer         case SID_RECORDMACRO :
3268aee0103dSMathias Bauer         {
32698f826827SMathias Bauer             // try to find any active recorder on this frame
32706ece6454SStephan Bergmann             static constexpr OUString sProperty(u"DispatchRecorderSupplier"_ustr);
3271476a6523SNoel Grandin             css::uno::Reference< css::frame::XFrame > xFrame =
3272476a6523SNoel Grandin                     GetFrame().GetFrameInterface();
32738f826827SMathias Bauer 
3274913a2d36SNoel Grandin             css::uno::Reference< css::beans::XPropertySet > xSet(xFrame,css::uno::UNO_QUERY);
3275913a2d36SNoel Grandin             css::uno::Any aProp = xSet->getPropertyValue(sProperty);
3276913a2d36SNoel Grandin             css::uno::Reference< css::frame::XDispatchRecorderSupplier > xSupplier;
32778f826827SMathias Bauer             aProp >>= xSupplier;
3278913a2d36SNoel Grandin             css::uno::Reference< css::frame::XDispatchRecorder > xRecorder;
32798f826827SMathias Bauer             if (xSupplier.is())
32808f826827SMathias Bauer                 xRecorder = xSupplier->getDispatchRecorder();
32818f826827SMathias Bauer 
328261a2c9fbSTor Lillqvist             bool bIsRecording = xRecorder.is();
3283e5be07f5SJan Holesovsky             const SfxBoolItem* pItem = rReq.GetArg<SfxBoolItem>(SID_RECORDMACRO);
328432856115SMathias Bauer             if ( pItem && pItem->GetValue() == bIsRecording )
328532856115SMathias Bauer                 return;
328632856115SMathias Bauer 
32878f826827SMathias Bauer             if ( xRecorder.is() )
32888f826827SMathias Bauer             {
328932856115SMathias Bauer                 // disable active recording
3290913a2d36SNoel Grandin                 aProp <<= css::uno::Reference< css::frame::XDispatchRecorderSupplier >();
32918f826827SMathias Bauer                 xSet->setPropertyValue(sProperty,aProp);
329232856115SMathias Bauer 
3293e5be07f5SJan Holesovsky                 const SfxBoolItem* pRecordItem = rReq.GetArg<SfxBoolItem>(FN_PARAM_1);
329432856115SMathias Bauer                 if ( !pRecordItem || !pRecordItem->GetValue() )
329532856115SMathias Bauer                     // insert script into basic library container of application
32968f826827SMathias Bauer                     AddDispatchMacroToBasic_Impl(xRecorder->getRecordedMacro());
329732856115SMathias Bauer 
3298fefd6f61SMathias Bauer                 xRecorder->endRecording();
329928034eafSStephan Bergmann                 xRecorder = nullptr;
33006abc2937SMathias Bauer                 GetBindings().SetRecorder_Impl( xRecorder );
330132856115SMathias Bauer 
33029278df2cSNoel Grandin                 SetChildWindow( SID_RECORDING_FLOATWINDOW, false );
3303eb70f01dSMathias Bauer                 if ( rReq.GetSlot() != SID_RECORDMACRO )
330432856115SMathias Bauer                     GetBindings().Invalidate( SID_RECORDMACRO );
33058f826827SMathias Bauer             }
330632856115SMathias Bauer             else if ( rReq.GetSlot() == SID_RECORDMACRO )
33078f826827SMathias Bauer             {
33088f826827SMathias Bauer                 // enable recording
3309ed0b12f4SNoel Grandin                 const css::uno::Reference< css::uno::XComponentContext >& xContext(
33109b63e4e6SNoel Grandin                         ::comphelper::getProcessComponentContext());
33118f826827SMathias Bauer 
3312913a2d36SNoel Grandin                 xRecorder = css::frame::DispatchRecorder::create( xContext );
33138f826827SMathias Bauer 
3314913a2d36SNoel Grandin                 xSupplier = css::frame::DispatchRecorderSupplier::create( xContext );
33158f826827SMathias Bauer 
33168f826827SMathias Bauer                 xSupplier->setDispatchRecorder(xRecorder);
33178f826827SMathias Bauer                 xRecorder->startRecording(xFrame);
33188f826827SMathias Bauer                 aProp <<= xSupplier;
33198f826827SMathias Bauer                 xSet->setPropertyValue(sProperty,aProp);
33206abc2937SMathias Bauer                 GetBindings().SetRecorder_Impl( xRecorder );
33219278df2cSNoel Grandin                 SetChildWindow( SID_RECORDING_FLOATWINDOW, true );
33228f826827SMathias Bauer             }
33238f826827SMathias Bauer 
3324aee0103dSMathias Bauer             rReq.Done();
3325aee0103dSMathias Bauer             break;
3326aee0103dSMathias Bauer         }
3327aee0103dSMathias Bauer 
3328fd069beeSJens-Heiner Rechtien         case SID_TOGGLESTATUSBAR:
3329fd069beeSJens-Heiner Rechtien         {
3330d8978605SLászló Németh             if ( auto xLayoutManager = getLayoutManager(GetFrame()) )
33313520798eSOliver Bolte             {
33326ece6454SStephan Bergmann                 static constexpr OUString aStatusbarResString( u"private:resource/statusbar/statusbar"_ustr );
3333f5f7b4efSAlbert Thuswaldner                 // Evaluate parameter.
3334e5be07f5SJan Holesovsky                 const SfxBoolItem* pShowItem = rReq.GetArg<SfxBoolItem>(rReq.GetSlot());
33359278df2cSNoel Grandin                 bool bShow( true );
33363520798eSOliver Bolte                 if ( !pShowItem )
33373520798eSOliver Bolte                     bShow = xLayoutManager->isElementVisible( aStatusbarResString );
33383520798eSOliver Bolte                 else
33393520798eSOliver Bolte                     bShow = pShowItem->GetValue();
33403520798eSOliver Bolte 
33413520798eSOliver Bolte                 if ( bShow )
33426b6c0e88SIvo Hinkelmann                 {
33436b6c0e88SIvo Hinkelmann                     xLayoutManager->createElement( aStatusbarResString );
33443520798eSOliver Bolte                     xLayoutManager->showElement( aStatusbarResString );
33456b6c0e88SIvo Hinkelmann                 }
33463520798eSOliver Bolte                 else
33473520798eSOliver Bolte                     xLayoutManager->hideElement( aStatusbarResString );
33483520798eSOliver Bolte 
33496e3fa3afSMathias Bauer                 if ( !pShowItem )
33506e3fa3afSMathias Bauer                     rReq.AppendItem( SfxBoolItem( SID_TOGGLESTATUSBAR, bShow ) );
33513520798eSOliver Bolte             }
3352fd069beeSJens-Heiner Rechtien             rReq.Done();
3353fd069beeSJens-Heiner Rechtien             break;
3354fd069beeSJens-Heiner Rechtien         }
335583d91ebbSTomaž Vajngerl         case SID_COMMAND_POPUP:
335683d91ebbSTomaž Vajngerl         {
335783d91ebbSTomaž Vajngerl             tools::Rectangle aRectangle(Point(0,0), GetWindow().GetSizePixel());
335883d91ebbSTomaž Vajngerl             weld::Window* pParent = weld::GetPopupParent(GetWindow(), aRectangle);
335983d91ebbSTomaž Vajngerl             m_pCommandPopupHandler->showPopup(pParent, GetFrame().GetFrameInterface());
3360fd069beeSJens-Heiner Rechtien 
336183d91ebbSTomaž Vajngerl             rReq.Done();
336283d91ebbSTomaž Vajngerl             break;
336383d91ebbSTomaž Vajngerl         }
3364fd069beeSJens-Heiner Rechtien         case SID_WIN_FULLSCREEN:
3365fd069beeSJens-Heiner Rechtien         {
3366e5be07f5SJan Holesovsky             const SfxBoolItem* pItem = rReq.GetArg<SfxBoolItem>(rReq.GetSlot());
3367419e42edSFrank Schoenheit [fs]             SfxViewFrame *pTop = GetTopViewFrame();
3368fd069beeSJens-Heiner Rechtien             if ( pTop )
3369fd069beeSJens-Heiner Rechtien             {
33700abf268fSNoel Grandin                 WorkWindow* pWork = static_cast<WorkWindow*>( pTop->GetFrame().GetTopWindow_Impl() );
337161595728SMathias Bauer                 if ( pWork )
337261595728SMathias Bauer                 {
3373d8978605SLászló Németh                     Reference< css::frame::XLayoutManager > xLayoutManager = getLayoutManager(GetFrame());
3374e8f8f24cSStephan Bergmann                     bool bNewFullScreenMode = pItem ? pItem->GetValue() : !pWork->IsFullScreenMode();
33755be98ebaSJens-Heiner Rechtien                     if ( bNewFullScreenMode != pWork->IsFullScreenMode() )
33765be98ebaSJens-Heiner Rechtien                     {
33773b6ee27eSXisco Fauli                         if ( bNewFullScreenMode )
33783b6ee27eSXisco Fauli                             sfx2::SfxNotebookBar::LockNotebookBar();
33793b6ee27eSXisco Fauli                         else
33803b6ee27eSXisco Fauli                             sfx2::SfxNotebookBar::UnlockNotebookBar();
33813b6ee27eSXisco Fauli 
3382913a2d36SNoel Grandin                         Reference< css::beans::XPropertySet > xLMPropSet( xLayoutManager, UNO_QUERY );
33838eb047dbSOliver Bolte                         if ( xLMPropSet.is() )
33848eb047dbSOliver Bolte                         {
33858eb047dbSOliver Bolte                             try
33868eb047dbSOliver Bolte                             {
33878eb047dbSOliver Bolte                                 xLMPropSet->setPropertyValue(
3388ca5c9591SNoel Grandin                                     u"HideCurrentUI"_ustr,
33890bfa6a18SStephan Bergmann                                     Any( bNewFullScreenMode ));
33908eb047dbSOliver Bolte                             }
3391913a2d36SNoel Grandin                             catch ( css::beans::UnknownPropertyException& )
33928eb047dbSOliver Bolte                             {
33938eb047dbSOliver Bolte                             }
33948eb047dbSOliver Bolte                         }
3395fd069beeSJens-Heiner Rechtien                         pWork->ShowFullScreenMode( bNewFullScreenMode );
33965b248f13SNoel Grandin                         pWork->SetMenuBarMode( bNewFullScreenMode ? MenuBarMode::Hide : MenuBarMode::Normal );
3397ef15b85eSFrank Schoenheit [fs]                         GetFrame().GetWorkWindow_Impl()->SetFullScreen_Impl( bNewFullScreenMode );
33986e3fa3afSMathias Bauer                         if ( !pItem )
33996e3fa3afSMathias Bauer                             rReq.AppendItem( SfxBoolItem( SID_WIN_FULLSCREEN, bNewFullScreenMode ) );
34006e3fa3afSMathias Bauer                         rReq.Done();
3401fd069beeSJens-Heiner Rechtien                     }
34025be98ebaSJens-Heiner Rechtien                     else
34035be98ebaSJens-Heiner Rechtien                         rReq.Ignore();
34045be98ebaSJens-Heiner Rechtien                 }
340561595728SMathias Bauer             }
34066e3fa3afSMathias Bauer             else
34076e3fa3afSMathias Bauer                 rReq.Ignore();
3408fd069beeSJens-Heiner Rechtien 
34095fe7ecc0SNoel Grandin             GetDispatcher()->Update_Impl( true );
3410fd069beeSJens-Heiner Rechtien             break;
3411fd069beeSJens-Heiner Rechtien         }
3412fd069beeSJens-Heiner Rechtien     }
3413fd069beeSJens-Heiner Rechtien }
3414fd069beeSJens-Heiner Rechtien 
MiscState_Impl(SfxItemSet & rSet)3415fd069beeSJens-Heiner Rechtien void SfxViewFrame::MiscState_Impl(SfxItemSet &rSet)
3416fd069beeSJens-Heiner Rechtien {
34175d0a231bSNoel Grandin     const WhichRangesContainer & pRanges = rSet.GetRanges();
34185d0a231bSNoel Grandin     DBG_ASSERT(!pRanges.empty(), "Set without range");
34195d0a231bSNoel Grandin     for ( auto const & pRange : pRanges )
3420fd069beeSJens-Heiner Rechtien     {
34215d0a231bSNoel Grandin         for(sal_uInt16 nWhich = pRange.first; nWhich <= pRange.second; ++nWhich)
3422fd069beeSJens-Heiner Rechtien         {
3423fd069beeSJens-Heiner Rechtien             switch(nWhich)
3424fd069beeSJens-Heiner Rechtien             {
34250dc959d1SMathias Bauer                 case SID_CURRENT_URL:
34260dc959d1SMathias Bauer                 {
34273d5d631eSStephan Bergmann                     rSet.Put( SfxStringItem( nWhich, GetActualPresentationURL_Impl() ) );
34280dc959d1SMathias Bauer                     break;
34290dc959d1SMathias Bauer                 }
34300dc959d1SMathias Bauer 
3431aee0103dSMathias Bauer                 case SID_RECORDMACRO :
3432aee0103dSMathias Bauer                 {
34334a268ebcSMatteo Casalin                     const OUString& sName{GetObjectShell()->GetFactory().GetFactoryName()};
3434a049c6efSMike Kaganski                     if (SvtSecurityOptions::IsMacroDisabled() ||
34350f3a8a97SNoel Grandin                          !officecfg::Office::Common::Misc::MacroRecorderMode::get() ||
3436b165f0f9SMatteo Casalin                          ( sName!="swriter" && sName!="scalc" ) )
34372561e3f7SAugust Sodora                     {
34382561e3f7SAugust Sodora                         rSet.DisableItem( nWhich );
343912f1faf7SStephan Bergmann                         rSet.Put(SfxVisibilityItem(nWhich, false));
34402561e3f7SAugust Sodora                         break;
34412561e3f7SAugust Sodora                     }
3442848f8d6cSMathias Bauer 
3443913a2d36SNoel Grandin                     css::uno::Reference< css::beans::XPropertySet > xSet(
3444ef15b85eSFrank Schoenheit [fs]                             GetFrame().GetFrameInterface(),
3445913a2d36SNoel Grandin                             css::uno::UNO_QUERY);
3446c2c3537dSMathias Bauer 
3447ca5c9591SNoel Grandin                     css::uno::Any aProp = xSet->getPropertyValue(u"DispatchRecorderSupplier"_ustr);
3448913a2d36SNoel Grandin                     css::uno::Reference< css::frame::XDispatchRecorderSupplier > xSupplier;
3449c2c3537dSMathias Bauer                     if ( aProp >>= xSupplier )
3450c2c3537dSMathias Bauer                         rSet.Put( SfxBoolItem( nWhich, xSupplier.is() ) );
3451c2c3537dSMathias Bauer                     else
3452c2c3537dSMathias Bauer                         rSet.DisableItem( nWhich );
3453aee0103dSMathias Bauer                     break;
3454aee0103dSMathias Bauer                 }
3455aee0103dSMathias Bauer 
3456e0aefa5cSMathias Bauer                 case SID_STOP_RECORDING :
3457e0aefa5cSMathias Bauer                 {
34584a268ebcSMatteo Casalin                     const OUString& sName{GetObjectShell()->GetFactory().GetFactoryName()};
34590f3a8a97SNoel Grandin                     if ( !officecfg::Office::Common::Misc::MacroRecorderMode::get() ||
3460b165f0f9SMatteo Casalin                          ( sName!="swriter" && sName!="scalc" ) )
34612561e3f7SAugust Sodora                     {
34622561e3f7SAugust Sodora                         rSet.DisableItem( nWhich );
34632561e3f7SAugust Sodora                         break;
34642561e3f7SAugust Sodora                     }
3465848f8d6cSMathias Bauer 
3466913a2d36SNoel Grandin                     css::uno::Reference< css::beans::XPropertySet > xSet(
3467ef15b85eSFrank Schoenheit [fs]                             GetFrame().GetFrameInterface(),
3468913a2d36SNoel Grandin                             css::uno::UNO_QUERY);
3469e0aefa5cSMathias Bauer 
3470ca5c9591SNoel Grandin                     css::uno::Any aProp = xSet->getPropertyValue(u"DispatchRecorderSupplier"_ustr);
3471913a2d36SNoel Grandin                     css::uno::Reference< css::frame::XDispatchRecorderSupplier > xSupplier;
3472e0aefa5cSMathias Bauer                     if ( !(aProp >>= xSupplier) || !xSupplier.is() )
3473e0aefa5cSMathias Bauer                         rSet.DisableItem( nWhich );
3474e0aefa5cSMathias Bauer                     break;
3475e0aefa5cSMathias Bauer                 }
3476e0aefa5cSMathias Bauer 
3477fd069beeSJens-Heiner Rechtien                 case SID_TOGGLESTATUSBAR:
3478fd069beeSJens-Heiner Rechtien                 {
3479913a2d36SNoel Grandin                     css::uno::Reference< css::frame::XLayoutManager > xLayoutManager;
3480913a2d36SNoel Grandin                     css::uno::Reference< css::beans::XPropertySet > xSet(
3481ef15b85eSFrank Schoenheit [fs]                             GetFrame().GetFrameInterface(),
3482913a2d36SNoel Grandin                             css::uno::UNO_QUERY);
3483ca5c9591SNoel Grandin                     css::uno::Any aProp = xSet->getPropertyValue( u"LayoutManager"_ustr );
34843520798eSOliver Bolte 
34853520798eSOliver Bolte                     if ( !( aProp >>= xLayoutManager ))
3486c35616ddSStephan Bergmann                         rSet.Put( SfxBoolItem( nWhich, false ));
34873520798eSOliver Bolte                     else
34883520798eSOliver Bolte                     {
3489ca5c9591SNoel Grandin                         bool bShow = xLayoutManager->isElementVisible( u"private:resource/statusbar/statusbar"_ustr );
34903520798eSOliver Bolte                         rSet.Put( SfxBoolItem( nWhich, bShow ));
34913520798eSOliver Bolte                     }
3492fd069beeSJens-Heiner Rechtien                     break;
3493fd069beeSJens-Heiner Rechtien                 }
3494fd069beeSJens-Heiner Rechtien 
3495fd069beeSJens-Heiner Rechtien                 case SID_WIN_FULLSCREEN:
3496fd069beeSJens-Heiner Rechtien                 {
3497419e42edSFrank Schoenheit [fs]                     SfxViewFrame* pTop = GetTopViewFrame();
3498fd069beeSJens-Heiner Rechtien                     if ( pTop )
3499fd069beeSJens-Heiner Rechtien                     {
35000abf268fSNoel Grandin                         WorkWindow* pWork = static_cast<WorkWindow*>( pTop->GetFrame().GetTopWindow_Impl() );
350161595728SMathias Bauer                         if ( pWork )
350261595728SMathias Bauer                         {
3503fd069beeSJens-Heiner Rechtien                             rSet.Put( SfxBoolItem( nWhich, pWork->IsFullScreenMode() ) );
350461595728SMathias Bauer                             break;
3505fd069beeSJens-Heiner Rechtien                         }
350661595728SMathias Bauer                     }
350761595728SMathias Bauer 
3508fd069beeSJens-Heiner Rechtien                     rSet.DisableItem( nWhich );
3509fd069beeSJens-Heiner Rechtien                     break;
3510fd069beeSJens-Heiner Rechtien                 }
3511fd069beeSJens-Heiner Rechtien 
3512fd069beeSJens-Heiner Rechtien                 default:
3513fd069beeSJens-Heiner Rechtien                     break;
3514fd069beeSJens-Heiner Rechtien             }
3515fd069beeSJens-Heiner Rechtien         }
3516fd069beeSJens-Heiner Rechtien     }
3517fd069beeSJens-Heiner Rechtien }
3518fd069beeSJens-Heiner Rechtien 
3519f5f7b4efSAlbert Thuswaldner /*  [Description]
3520fd069beeSJens-Heiner Rechtien 
3521f5f7b4efSAlbert Thuswaldner     This method can be included in the Execute method for the on- and off-
3522f5f7b4efSAlbert Thuswaldner     switching of ChildWindows, to implement this and API-bindings.
3523fd069beeSJens-Heiner Rechtien 
3524f5f7b4efSAlbert Thuswaldner     Simply include as 'ExecuteMethod' in the IDL.
3525fd069beeSJens-Heiner Rechtien */
ChildWindowExecute(SfxRequest & rReq)3526278e2b36SMarkus Mohrhard void SfxViewFrame::ChildWindowExecute( SfxRequest &rReq )
3527fd069beeSJens-Heiner Rechtien {
3528f5f7b4efSAlbert Thuswaldner     // Evaluate Parameter
3529dcd8e466SMikhail Voytenko     sal_uInt16 nSID = rReq.GetSlot();
3530fd069beeSJens-Heiner Rechtien 
3531a80eefb7SJim Raykowski     if (nSID == SID_SIDEBAR_DECK)
3532a80eefb7SJim Raykowski     {
3533a80eefb7SJim Raykowski         const SfxStringItem* pDeckIdItem = rReq.GetArg<SfxStringItem>(SID_SIDEBAR_DECK);
3534a80eefb7SJim Raykowski         if (pDeckIdItem)
3535a80eefb7SJim Raykowski         {
3536a80eefb7SJim Raykowski             const OUString aDeckId(pDeckIdItem->GetValue());
35374eb62f0eSSzymon Kłos             // Compatibility with old LOK "toggle always"
35384eb62f0eSSzymon Kłos             // TODO: check LOK with tdf#142978 Show a11y sidebar when finding issues on PDF export, hash: 53fc5fa
35394eb62f0eSSzymon Kłos             const bool isLOK = comphelper::LibreOfficeKit::isActive();
354053fc5fa0SSamuel Mehrbrodt             const SfxBoolItem* pToggleItem = rReq.GetArg<SfxBoolItem>(SID_SIDEBAR_DECK_TOGGLE);
35414eb62f0eSSzymon Kłos             bool bToggle = isLOK || (pToggleItem && pToggleItem->GetValue());
354253fc5fa0SSamuel Mehrbrodt             ::sfx2::sidebar::Sidebar::ShowDeck(aDeckId, this, bToggle);
3543a80eefb7SJim Raykowski         }
3544a80eefb7SJim Raykowski         rReq.Done();
3545a80eefb7SJim Raykowski         return;
3546a80eefb7SJim Raykowski     }
3547a80eefb7SJim Raykowski 
3548e5be07f5SJan Holesovsky     const SfxBoolItem* pShowItem = rReq.GetArg<SfxBoolItem>(nSID);
354921be778cSMathias Bauer     if ( nSID == SID_VIEW_DATA_SOURCE_BROWSER )
355021be778cSMathias Bauer     {
3551fec15013SMike Kaganski         if (!SvtModuleOptions().IsDataBaseInstalled())
35527993a1d1SRüdiger Timm             return;
35532b3de550SNoel Grandin         Reference < XFrame > xFrame = GetFrame().GetFrameInterface();
3554ca5c9591SNoel Grandin         Reference < XFrame > xBeamer( xFrame->findFrame( u"_beamer"_ustr, FrameSearchFlag::CHILDREN ) );
35559278df2cSNoel Grandin         bool bHasChild = xBeamer.is();
35569278df2cSNoel Grandin         bool bShow = pShowItem ? pShowItem->GetValue() : !bHasChild;
35576e3fa3afSMathias Bauer         if ( pShowItem )
35586e3fa3afSMathias Bauer         {
35596e3fa3afSMathias Bauer             if( bShow == bHasChild )
35606e3fa3afSMathias Bauer                 return;
35616e3fa3afSMathias Bauer         }
35626e3fa3afSMathias Bauer         else
35636e3fa3afSMathias Bauer             rReq.AppendItem( SfxBoolItem( nSID, bShow ) );
35646e3fa3afSMathias Bauer 
35656e3fa3afSMathias Bauer         if ( !bShow )
35666e3fa3afSMathias Bauer         {
35679278df2cSNoel Grandin             SetChildWindow( SID_BROWSER, false );
35686e3fa3afSMathias Bauer         }
356921be778cSMathias Bauer         else
357021be778cSMathias Bauer         {
3571913a2d36SNoel Grandin             css::util::URL aTargetURL;
35729d7712b4SNoel Grandin             aTargetURL.Complete = ".component:DB/DataSourceBrowser";
3573913a2d36SNoel Grandin             Reference < css::util::XURLTransformer > xTrans(
3574913a2d36SNoel Grandin                     css::util::URLTransformer::create(
35750fcd1a73SNoel Grandin                          ::comphelper::getProcessComponentContext() ) );
357621be778cSMathias Bauer             xTrans->parseStrict( aTargetURL );
357721be778cSMathias Bauer 
357821be778cSMathias Bauer             Reference < XDispatchProvider > xProv( xFrame, UNO_QUERY );
3579913a2d36SNoel Grandin             Reference < css::frame::XDispatch > xDisp;
358021be778cSMathias Bauer             if ( xProv.is() )
3581ca5c9591SNoel Grandin                 xDisp = xProv->queryDispatch( aTargetURL, u"_beamer"_ustr, 31 );
358221be778cSMathias Bauer             if ( xDisp.is() )
358321be778cSMathias Bauer             {
3584913a2d36SNoel Grandin                 Sequence < css::beans::PropertyValue > aArgs(1);
3585913a2d36SNoel Grandin                 css::beans::PropertyValue* pArg = aArgs.getArray();
35869d7712b4SNoel Grandin                 pArg[0].Name = "Referer";
3587ca5c9591SNoel Grandin                 pArg[0].Value <<= u"private:user"_ustr;
358821be778cSMathias Bauer                 xDisp->dispatch( aTargetURL, aArgs );
358921be778cSMathias Bauer             }
359021be778cSMathias Bauer         }
359121be778cSMathias Bauer 
35926e3fa3afSMathias Bauer         rReq.Done();
359321be778cSMathias Bauer         return;
359421be778cSMathias Bauer     }
3595a836afe4SSamuel Mehrbrodt     if (nSID == SID_STYLE_DESIGNER)
3596a836afe4SSamuel Mehrbrodt     {
3597a836afe4SSamuel Mehrbrodt         // First make sure that the sidebar is visible
3598a836afe4SSamuel Mehrbrodt         ShowChildWindow(SID_SIDEBAR);
3599a836afe4SSamuel Mehrbrodt 
3600bb06f513SNoel         ::sfx2::sidebar::Sidebar::ShowPanel(u"StyleListPanel",
3601b5af679cSJim Raykowski                                             GetFrame().GetFrameInterface(), true);
3602a836afe4SSamuel Mehrbrodt         rReq.Done();
3603a836afe4SSamuel Mehrbrodt         return;
3604a836afe4SSamuel Mehrbrodt     }
360521be778cSMathias Bauer 
36069278df2cSNoel Grandin     bool bHasChild = HasChildWindow(nSID);
36079278df2cSNoel Grandin     bool bShow = pShowItem ? pShowItem->GetValue() : !bHasChild;
36085fe7ecc0SNoel Grandin     GetDispatcher()->Update_Impl( true );
3609fd069beeSJens-Heiner Rechtien 
3610f5f7b4efSAlbert Thuswaldner     // Perform action.
3611fd069beeSJens-Heiner Rechtien     if ( !pShowItem || bShow != bHasChild )
3612fd069beeSJens-Heiner Rechtien         ToggleChildWindow( nSID );
3613fd069beeSJens-Heiner Rechtien 
3614fd069beeSJens-Heiner Rechtien     GetBindings().Invalidate( nSID );
3615fd069beeSJens-Heiner Rechtien 
3616f5f7b4efSAlbert Thuswaldner     // Record if possible.
361770907f0dSMathias Bauer     if ( nSID == SID_HYPERLINK_DIALOG || nSID == SID_SEARCH_DLG )
3618686447c3SMathias Bauer     {
3619686447c3SMathias Bauer         rReq.Ignore();
3620686447c3SMathias Bauer     }
3621686447c3SMathias Bauer     else
3622686447c3SMathias Bauer     {
3623fd069beeSJens-Heiner Rechtien         rReq.AppendItem( SfxBoolItem( nSID, bShow ) );
3624fd069beeSJens-Heiner Rechtien         rReq.Done();
3625fd069beeSJens-Heiner Rechtien     }
3626686447c3SMathias Bauer }
3627fd069beeSJens-Heiner Rechtien 
3628f5f7b4efSAlbert Thuswaldner /*  [Description]
3629fd069beeSJens-Heiner Rechtien 
3630f5f7b4efSAlbert Thuswaldner     This method can be used in the state method for the on and off-state
3631f5f7b4efSAlbert Thuswaldner     of child-windows, in order to implement this.
3632fd069beeSJens-Heiner Rechtien 
3633f5f7b4efSAlbert Thuswaldner     Just register the IDL as 'StateMethod'.
3634fd069beeSJens-Heiner Rechtien */
ChildWindowState(SfxItemSet & rState)3635278e2b36SMarkus Mohrhard void SfxViewFrame::ChildWindowState( SfxItemSet& rState )
3636fd069beeSJens-Heiner Rechtien {
3637fd069beeSJens-Heiner Rechtien     SfxWhichIter aIter( rState );
3638dcd8e466SMikhail Voytenko     for ( sal_uInt16 nSID = aIter.FirstWhich(); nSID; nSID = aIter.NextWhich() )
3639fd069beeSJens-Heiner Rechtien     {
364021be778cSMathias Bauer         if ( nSID == SID_VIEW_DATA_SOURCE_BROWSER )
364121be778cSMathias Bauer         {
364221be778cSMathias Bauer             rState.Put( SfxBoolItem( nSID, HasChildWindow( SID_BROWSER ) ) );
364321be778cSMathias Bauer         }
364421be778cSMathias Bauer         else if ( nSID == SID_HYPERLINK_DIALOG )
364521be778cSMathias Bauer         {
3646789a737aSArmin Le Grand (allotropia)             SfxPoolItemHolder aDummy;
3647789a737aSArmin Le Grand (allotropia)             SfxItemState eState = GetDispatcher()->QueryState(SID_HYPERLINK_SETLINK, aDummy);
3648ea733ab5SStephan Bergmann             if ( SfxItemState::DISABLED == eState )
364921be778cSMathias Bauer                 rState.DisableItem(nSID);
365021be778cSMathias Bauer             else
365121be778cSMathias Bauer             {
365221be778cSMathias Bauer                 if ( KnowsChildWindow(nSID) )
365321be778cSMathias Bauer                     rState.Put( SfxBoolItem( nSID, HasChildWindow(nSID)) );
365421be778cSMathias Bauer                 else
365521be778cSMathias Bauer                     rState.DisableItem(nSID);
365621be778cSMathias Bauer             }
365721be778cSMathias Bauer         }
365821be778cSMathias Bauer         else if ( nSID == SID_BROWSER )
3659bb05f573SMathias Bauer         {
36602b3de550SNoel Grandin             Reference < XFrame > xFrame = GetFrame().GetFrameInterface()->
3661ca5c9591SNoel Grandin                             findFrame( u"_beamer"_ustr, FrameSearchFlag::CHILDREN );
3662bb05f573SMathias Bauer             if ( !xFrame.is() )
3663bb05f573SMathias Bauer                 rState.DisableItem( nSID );
3664bb05f573SMathias Bauer             else if ( KnowsChildWindow(nSID) )
3665bb05f573SMathias Bauer                 rState.Put( SfxBoolItem( nSID, HasChildWindow(nSID) ) );
3666bb05f573SMathias Bauer         }
3667b6f4d3b9SAshod Nakashian         else if ( nSID == SID_SIDEBAR )
3668d02f75a8SOliver-Rainer Wittmann         {
3669b8669df1SMichael Meeks             if  ( !KnowsChildWindow( nSID ) )
3670b8669df1SMichael Meeks             {
3671330f26beSMiklos Vajna                 SAL_INFO("sfx.view", "SID_SIDEBAR state requested, but no task pane child window exists for this ID!");
3672b8669df1SMichael Meeks                 rState.DisableItem( nSID );
3673b8669df1SMichael Meeks             }
3674b8669df1SMichael Meeks             else
3675b8669df1SMichael Meeks             {
3676d02f75a8SOliver-Rainer Wittmann                 rState.Put( SfxBoolItem( nSID, HasChildWindow( nSID ) ) );
3677d02f75a8SOliver-Rainer Wittmann             }
3678d02f75a8SOliver-Rainer Wittmann         }
3679fd069beeSJens-Heiner Rechtien         else if ( KnowsChildWindow(nSID) )
3680fd069beeSJens-Heiner Rechtien             rState.Put( SfxBoolItem( nSID, HasChildWindow(nSID) ) );
3681fd069beeSJens-Heiner Rechtien         else
3682fd069beeSJens-Heiner Rechtien             rState.DisableItem(nSID);
3683fd069beeSJens-Heiner Rechtien     }
3684fd069beeSJens-Heiner Rechtien }
3685fd069beeSJens-Heiner Rechtien 
GetWorkWindow_Impl()3686d4e9fe5aSNoel Grandin SfxWorkWindow* SfxViewFrame::GetWorkWindow_Impl()
3687fd069beeSJens-Heiner Rechtien {
36886c7b5b03SMarkus Mohrhard     SfxWorkWindow* pWork = GetFrame().GetWorkWindow_Impl();
3689fd069beeSJens-Heiner Rechtien     return pWork;
3690fd069beeSJens-Heiner Rechtien }
3691fd069beeSJens-Heiner Rechtien 
SetChildWindow(sal_uInt16 nId,bool bOn,bool bSetFocus)36929278df2cSNoel Grandin void SfxViewFrame::SetChildWindow(sal_uInt16 nId, bool bOn, bool bSetFocus )
36930dc959d1SMathias Bauer {
3694d4e9fe5aSNoel Grandin     SfxWorkWindow* pWork = GetWorkWindow_Impl();
36957e10429dSMathias Bauer     if ( pWork )
36960dc959d1SMathias Bauer         pWork->SetChildWindow_Impl( nId, bOn, bSetFocus );
3697fd069beeSJens-Heiner Rechtien }
3698fd069beeSJens-Heiner Rechtien 
ToggleChildWindow(sal_uInt16 nId)3699dcd8e466SMikhail Voytenko void SfxViewFrame::ToggleChildWindow(sal_uInt16 nId)
3700fd069beeSJens-Heiner Rechtien {
3701d4e9fe5aSNoel Grandin     SfxWorkWindow* pWork = GetWorkWindow_Impl();
37027e10429dSMathias Bauer     if ( pWork )
37039278df2cSNoel Grandin         pWork->ToggleChildWindow_Impl( nId, true );
3704fd069beeSJens-Heiner Rechtien }
3705fd069beeSJens-Heiner Rechtien 
HasChildWindow(sal_uInt16 nId)3706768c7438SStephan Bergmann bool SfxViewFrame::HasChildWindow( sal_uInt16 nId )
3707fd069beeSJens-Heiner Rechtien {
3708d4e9fe5aSNoel Grandin     SfxWorkWindow* pWork = GetWorkWindow_Impl();
3709768c7438SStephan Bergmann     return pWork && pWork->HasChildWindow_Impl(nId);
3710fd069beeSJens-Heiner Rechtien }
3711fd069beeSJens-Heiner Rechtien 
KnowsChildWindow(sal_uInt16 nId)37129278df2cSNoel Grandin bool SfxViewFrame::KnowsChildWindow( sal_uInt16 nId )
3713fd069beeSJens-Heiner Rechtien {
3714d4e9fe5aSNoel Grandin     SfxWorkWindow* pWork = GetWorkWindow_Impl();
37159278df2cSNoel Grandin     return pWork && pWork->KnowsChildWindow_Impl(nId);
3716fd069beeSJens-Heiner Rechtien }
3717fd069beeSJens-Heiner Rechtien 
ShowChildWindow(sal_uInt16 nId,bool bVisible)37189278df2cSNoel Grandin void SfxViewFrame::ShowChildWindow( sal_uInt16 nId, bool bVisible )
3719fd069beeSJens-Heiner Rechtien {
3720d4e9fe5aSNoel Grandin     SfxWorkWindow* pWork = GetWorkWindow_Impl();
37217e10429dSMathias Bauer     if ( pWork )
372238c67b3dSRüdiger Timm     {
37235fe7ecc0SNoel Grandin         GetDispatcher()->Update_Impl(true);
37249278df2cSNoel Grandin         pWork->ShowChildWindow_Impl(nId, bVisible, true );
3725fd069beeSJens-Heiner Rechtien     }
372638c67b3dSRüdiger Timm }
3727fd069beeSJens-Heiner Rechtien 
GetChildWindow(sal_uInt16 nId)3728dcd8e466SMikhail Voytenko SfxChildWindow* SfxViewFrame::GetChildWindow(sal_uInt16 nId)
3729fd069beeSJens-Heiner Rechtien {
3730d4e9fe5aSNoel Grandin     SfxWorkWindow* pWork = GetWorkWindow_Impl();
373128034eafSStephan Bergmann     return pWork ? pWork->GetChildWindow_Impl(nId) : nullptr;
3732fd069beeSJens-Heiner Rechtien }
3733fd069beeSJens-Heiner Rechtien 
UpdateDocument_Impl()3734c6f9f644SSander Vesik void SfxViewFrame::UpdateDocument_Impl()
3735c6f9f644SSander Vesik {
37361e870a64SKurt Zenker     SfxObjectShell* pDoc = GetObjectShell();
3737cefd260aSOliver Bolte     if ( pDoc->IsLoadingFinished() )
37389c269844SIvo Hinkelmann         pDoc->CheckSecurityOnLoading_Impl();
3739c6f9f644SSander Vesik 
37409c269844SIvo Hinkelmann     // check if document depends on a template
37411e870a64SKurt Zenker     pDoc->UpdateFromTemplate_Impl();
3742c6f9f644SSander Vesik }
3743c6f9f644SSander Vesik 
SetViewFrame(SfxViewFrame * pFrame)3744f605b16eSRüdiger Timm void SfxViewFrame::SetViewFrame( SfxViewFrame* pFrame )
3745f605b16eSRüdiger Timm {
374613eb488cSTamás Zolnai     if(pFrame)
374713eb488cSTamás Zolnai         SetSVHelpData(pFrame->m_pHelpData);
3748c2f8929eSAshod Nakashian 
3749c2f8929eSAshod Nakashian     SetSVWinData(pFrame ? pFrame->m_pWinData : nullptr);
3750c2f8929eSAshod Nakashian 
3751d92aa2f4SNorbert Thiebaud     SfxGetpApp()->SetViewFrame_Impl( pFrame );
3752f605b16eSRüdiger Timm }
37530434aa57SFrank Schoenheit [fs] 
AppendInfoBar(const OUString & sId,const OUString & sPrimaryMessage,const OUString & sSecondaryMessage,InfobarType aInfobarType,bool bShowCloseButton)3754f82cd9c7SStephan Bergmann VclPtr<SfxInfoBarWindow> SfxViewFrame::AppendInfoBar(const OUString& sId,
37559e3ba7c3SSamuel Mehrbrodt                                                const OUString& sPrimaryMessage,
37569e3ba7c3SSamuel Mehrbrodt                                                const OUString& sSecondaryMessage,
37579e3ba7c3SSamuel Mehrbrodt                                                InfobarType aInfobarType, bool bShowCloseButton)
3758e78be1c1SSamuel Mehrbrodt {
3759e78be1c1SSamuel Mehrbrodt     SfxChildWindow* pChild = GetChildWindow(SfxInfoBarContainerChild::GetChildWindowId());
3760e78be1c1SSamuel Mehrbrodt     if (!pChild)
3761e78be1c1SSamuel Mehrbrodt         return nullptr;
3762e78be1c1SSamuel Mehrbrodt 
3763506d8f17SSamuel Mehrbrodt     if (HasInfoBarWithID(sId))
3764506d8f17SSamuel Mehrbrodt         return nullptr;
3765506d8f17SSamuel Mehrbrodt 
3766e78be1c1SSamuel Mehrbrodt     SfxInfoBarContainerWindow* pInfoBarContainer = static_cast<SfxInfoBarContainerWindow*>(pChild->GetWindow());
37679e3ba7c3SSamuel Mehrbrodt     auto pInfoBar = pInfoBarContainer->appendInfoBar(sId, sPrimaryMessage, sSecondaryMessage,
3768af90b808SCaolán McNamara                                                      aInfobarType, bShowCloseButton);
3769e78be1c1SSamuel Mehrbrodt     ShowChildWindow(SfxInfoBarContainerChild::GetChildWindowId());
3770e78be1c1SSamuel Mehrbrodt     return pInfoBar;
3771e78be1c1SSamuel Mehrbrodt }
3772e78be1c1SSamuel Mehrbrodt 
UpdateInfoBar(std::u16string_view sId,const OUString & sPrimaryMessage,const OUString & sSecondaryMessage,InfobarType eType)3773bb06f513SNoel void SfxViewFrame::UpdateInfoBar(std::u16string_view sId, const OUString& sPrimaryMessage,
37749e3ba7c3SSamuel Mehrbrodt                                  const OUString& sSecondaryMessage, InfobarType eType)
377543459bacSKatarina Behrens {
377643459bacSKatarina Behrens     const sal_uInt16 nId = SfxInfoBarContainerChild::GetChildWindowId();
377743459bacSKatarina Behrens 
377843459bacSKatarina Behrens     // Make sure the InfoBar container is visible
377943459bacSKatarina Behrens     if (!HasChildWindow(nId))
378043459bacSKatarina Behrens         ToggleChildWindow(nId);
378143459bacSKatarina Behrens 
378243459bacSKatarina Behrens     SfxChildWindow* pChild = GetChildWindow(nId);
378343459bacSKatarina Behrens     if (pChild)
378443459bacSKatarina Behrens     {
378543459bacSKatarina Behrens         SfxInfoBarContainerWindow* pInfoBarContainer = static_cast<SfxInfoBarContainerWindow*>(pChild->GetWindow());
378643459bacSKatarina Behrens         auto pInfoBar = pInfoBarContainer->getInfoBar(sId);
378743459bacSKatarina Behrens 
378843459bacSKatarina Behrens         if (pInfoBar)
37899e3ba7c3SSamuel Mehrbrodt              pInfoBar->Update(sPrimaryMessage, sSecondaryMessage, eType);
379043459bacSKatarina Behrens     }
379143459bacSKatarina Behrens }
379243459bacSKatarina Behrens 
RemoveInfoBar(std::u16string_view sId)3793bb06f513SNoel void SfxViewFrame::RemoveInfoBar( std::u16string_view sId )
3794c767f824SCédric Bosdonnat {
3795c767f824SCédric Bosdonnat     const sal_uInt16 nId = SfxInfoBarContainerChild::GetChildWindowId();
3796c767f824SCédric Bosdonnat 
3797c767f824SCédric Bosdonnat     // Make sure the InfoBar container is visible
3798c767f824SCédric Bosdonnat     if (!HasChildWindow(nId))
3799c767f824SCédric Bosdonnat         ToggleChildWindow(nId);
38001049511cSTomaž Vajngerl 
3801c767f824SCédric Bosdonnat     SfxChildWindow* pChild = GetChildWindow(nId);
3802c767f824SCédric Bosdonnat     if (pChild)
3803c767f824SCédric Bosdonnat     {
38041049511cSTomaž Vajngerl         SfxInfoBarContainerWindow* pInfoBarContainer = static_cast<SfxInfoBarContainerWindow*>(pChild->GetWindow());
3805f82cd9c7SStephan Bergmann         auto pInfoBar = pInfoBarContainer->getInfoBar(sId);
38061049511cSTomaž Vajngerl         pInfoBarContainer->removeInfoBar(pInfoBar);
3807c767f824SCédric Bosdonnat         ShowChildWindow(nId);
3808c767f824SCédric Bosdonnat     }
3809c767f824SCédric Bosdonnat }
381097aa108fSCédric Bosdonnat 
HasInfoBarWithID(std::u16string_view sId)3811bb06f513SNoel bool SfxViewFrame::HasInfoBarWithID( std::u16string_view sId )
3812e744e9f4SKatarina Behrens {
3813e744e9f4SKatarina Behrens     const sal_uInt16 nId = SfxInfoBarContainerChild::GetChildWindowId();
3814e744e9f4SKatarina Behrens 
3815e744e9f4SKatarina Behrens     SfxChildWindow* pChild = GetChildWindow(nId);
3816e744e9f4SKatarina Behrens     if (pChild)
3817e744e9f4SKatarina Behrens     {
3818e744e9f4SKatarina Behrens         SfxInfoBarContainerWindow* pInfoBarContainer = static_cast<SfxInfoBarContainerWindow*>(pChild->GetWindow());
3819e744e9f4SKatarina Behrens         return pInfoBarContainer->hasInfoBarWithID(sId);
3820e744e9f4SKatarina Behrens     }
3821e744e9f4SKatarina Behrens 
3822e744e9f4SKatarina Behrens     return false;
3823e744e9f4SKatarina Behrens }
3824e744e9f4SKatarina Behrens 
38258694d2bcSSebastian Spaeth /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
3826