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