1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
19 #ifndef INCLUDED_SFX2_VIEWFRM_HXX
20 #define INCLUDED_SFX2_VIEWFRM_HXX
23 #include <sal/config.h>
24 #include <sfx2/dllapi.h>
25 #include <sal/types.h>
26 #include <svl/lstner.hxx>
27 #include <sfx2/frame.hxx>
28 #include <sfx2/objsh.hxx>
29 #include <sfx2/shell.hxx>
30 #include <svl/poolitem.hxx>
31 #include <vcl/svapp.hxx>
45 class SfxInfoBarWindow
;
46 enum class InfobarType
;
47 class CommandPopupHandler
;
49 class SFX2_DLLPUBLIC SfxViewFrame final
: public SfxShell
, public SfxListener
51 std::unique_ptr
<struct SfxViewFrame_Impl
> m_pImpl
;
53 SfxObjectShellRef m_xObjSh
;
54 std::unique_ptr
<SfxDispatcher
> m_pDispatcher
;
55 SfxBindings
* m_pBindings
;
56 ImplSVHelpData
* m_pHelpData
;
57 ImplSVWinData
* m_pWinData
;
58 sal_uInt16 m_nAdjustPosPixelLock
;
60 std::unique_ptr
<CommandPopupHandler
> m_pCommandPopupHandler
;
62 SAL_DLLPRIVATE
void Construct_Impl( SfxObjectShell
*pObjSh
);
63 virtual void Notify( SfxBroadcaster
& rBC
, const SfxHint
& rHint
) override
;
64 DECL_DLLPRIVATE_LINK(GetInvolvedHandler
, weld::Button
&, void);
65 DECL_DLLPRIVATE_LINK(DonationHandler
, weld::Button
&, void);
66 DECL_DLLPRIVATE_LINK(WhatsNewHandler
, weld::Button
&, void);
67 DECL_DLLPRIVATE_LINK(MacroButtonHandler
, weld::Button
&, void);
68 DECL_DLLPRIVATE_LINK(SecurityButtonHandler
, weld::Button
&, void);
69 DECL_DLLPRIVATE_LINK(EventButtonHandler
, weld::Button
&, void);
70 DECL_DLLPRIVATE_LINK(SwitchReadOnlyHandler
, weld::Button
&, void);
71 DECL_DLLPRIVATE_LINK(SignDocumentHandler
, weld::Button
&, void);
72 DECL_DLLPRIVATE_LINK(HiddenTrackChangesHandler
, weld::Button
&, void);
73 DECL_DLLPRIVATE_LINK(HyphenationMissingHandler
, weld::Button
&, void);
74 DECL_DLLPRIVATE_LINK(RefreshMasterPasswordHdl
, weld::Button
&, void);
75 DECL_DLLPRIVATE_STATIC_LINK(SfxViewFrame
, HelpMasterPasswordHdl
, weld::Button
&, void);
76 SAL_DLLPRIVATE
void KillDispatcher_Impl();
78 virtual ~SfxViewFrame() override
;
81 SfxViewFrame( SfxFrame
& rFrame
, SfxObjectShell
*pDoc
);
83 SFX_DECL_INTERFACE(SFX_INTERFACE_SFXVIEWFRM
)
86 /// SfxInterface initializer.
87 static void InitInterface_Impl();
89 void AppendContainsMacrosInfobar();
92 static void SetViewFrame( SfxViewFrame
* );
94 static SfxViewFrame
* LoadHiddenDocument( SfxObjectShell
const & i_rDoc
, SfxInterfaceId i_nViewId
);
95 static SfxViewFrame
* LoadDocument( SfxObjectShell
const & i_rDoc
, SfxInterfaceId i_nViewId
);
96 static SfxViewFrame
* LoadDocumentIntoFrame( SfxObjectShell
const & i_rDoc
, const SfxFrameItem
* i_pFrameItem
, SfxInterfaceId i_nViewId
);
97 static SfxViewFrame
* LoadDocumentIntoFrame( SfxObjectShell
const & i_rDoc
, const css::uno::Reference
< css::frame::XFrame
>& i_rFrameItem
);
98 static SfxViewFrame
* DisplayNewDocument( SfxObjectShell
const & i_rDoc
, const SfxRequest
& i_rCreateDocRequest
);
100 SAL_WARN_UNUSED_RESULT
static SfxViewFrame
* Current();
101 SAL_WARN_UNUSED_RESULT
static SfxViewFrame
* GetFirst( const SfxObjectShell
* pDoc
= nullptr, bool bOnlyVisible
= true );
102 SAL_WARN_UNUSED_RESULT
static SfxViewFrame
* GetNext( const SfxViewFrame
& rPrev
, const SfxObjectShell
* pDoc
= nullptr, bool bOnlyVisible
= true );
104 SAL_WARN_UNUSED_RESULT
static SfxViewFrame
* Get( const css::uno::Reference
< css::frame::XController
>& i_rController
, const SfxObjectShell
* i_pDoc
);
106 void DoActivate(bool bMDI
);
107 void DoDeactivate(bool bMDI
, SfxViewFrame
const *pOld
);
109 using SfxShell::GetDispatcher
;
110 SfxDispatcher
* GetDispatcher() { return m_pDispatcher
.get(); }
111 SfxBindings
& GetBindings() { return *m_pBindings
; }
112 const SfxBindings
& GetBindings() const { return *m_pBindings
; }
113 vcl::Window
& GetWindow() const;
114 weld::Window
* GetFrameWeld() const;
116 SfxProgress
* GetProgress() const;
118 void LockAdjustPosSizePixel()
119 { m_nAdjustPosPixelLock
++; }
120 void UnlockAdjustPosSizePixel()
121 { m_nAdjustPosPixelLock
--; }
122 void DoAdjustPosSizePixel( SfxViewShell
* pSh
,
123 const Point
&rPos
, const Size
&rSize
,
124 bool inplaceEditModeChange
);
126 bool IsVisible() const;
128 void Enable( bool bEnable
);
130 virtual void Activate( bool bUI
) override
;
131 virtual void Deactivate( bool bUI
) override
;
136 SAL_DLLPRIVATE
void SetBorderPixelImpl( const SfxViewShell
*pSh
, const SvBorder
&rBorder
);
137 SAL_DLLPRIVATE
const SvBorder
& GetBorderPixelImpl() const;
138 SAL_DLLPRIVATE
void InvalidateBorderImpl( const SfxViewShell
*pSh
);
140 virtual SfxObjectShell
* GetObjectShell() override
;
141 SfxInterfaceId
GetCurViewId() const;
142 SfxFrame
& GetFrame() const;
143 SfxViewFrame
* GetTopViewFrame() const;
146 static void GetTargetList( TargetList
& rList
)
147 { SfxFrame::GetDefaultTargetList( rList
); }
149 void SetModalMode( bool );
150 bool IsInModalMode() const;
151 void Resize(bool bForce
=false);
153 void SetChildWindow(sal_uInt16 nId
, bool bVisible
, bool bSetFocus
=true);
154 void ToggleChildWindow(sal_uInt16
);
155 bool HasChildWindow(sal_uInt16
);
156 bool KnowsChildWindow(sal_uInt16
);
157 void ShowChildWindow(sal_uInt16
,bool bVisible
=true);
158 SfxChildWindow
* GetChildWindow(sal_uInt16
);
159 void ChildWindowExecute(SfxRequest
&);
160 void ChildWindowState(SfxItemSet
&);
162 /** Append a new InfoBar (see https://wiki.documentfoundation.org/Design/Whiteboards/Infobar).
164 The buttons will be added from Right to Left at the right of the info bar. The parent, size
165 and position of each button will be changed: only the width will remain unchanged.
167 VclPtr
<SfxInfoBarWindow
> AppendInfoBar(const OUString
& sId
,
168 const OUString
& sPrimaryMessage
,
169 const OUString
& sSecondaryMessage
,
170 InfobarType aInfobarType
,
171 bool bShowCloseButton
=true);
172 void RemoveInfoBar(std::u16string_view sId
);
173 void UpdateInfoBar(std::u16string_view sId
, const OUString
& sPrimaryMessage
,
174 const OUString
& sSecondaryMessage
,
176 bool HasInfoBarWithID(std::u16string_view sId
);
177 void AppendReadOnlyInfobar();
178 void HandleSecurityInfobar(const OUString
& sSecondaryMessage
);
180 SAL_DLLPRIVATE
void GetDocNumber_Impl();
181 SAL_DLLPRIVATE
void SetViewShell_Impl( SfxViewShell
*pVSh
);
182 SAL_DLLPRIVATE
void ReleaseObjectShell_Impl();
184 SAL_DLLPRIVATE
void GetState_Impl( SfxItemSet
&rSet
);
185 void ExecReload_Impl(SfxRequest
& rReq
);
186 SAL_DLLPRIVATE
void StateReload_Impl( SfxItemSet
&rSet
);
187 SAL_DLLPRIVATE
void ExecView_Impl( SfxRequest
&rReq
);
188 SAL_DLLPRIVATE
void StateView_Impl( SfxItemSet
&rSet
);
189 SAL_DLLPRIVATE
void ExecHistory_Impl( SfxRequest
&rReq
);
190 SAL_DLLPRIVATE
void StateHistory_Impl( SfxItemSet
&rSet
);
191 SAL_DLLPRIVATE
void ForceOuterResize_Impl();
192 SAL_DLLPRIVATE
void UpdateDocument_Impl();
194 SAL_DLLPRIVATE
void LockObjectShell_Impl();
196 SAL_DLLPRIVATE
void MakeActive_Impl( bool bActivate
);
197 SAL_DLLPRIVATE
const Size
& GetMargin_Impl() const;
198 SAL_DLLPRIVATE OUString
GetActualPresentationURL_Impl() const;
199 SAL_DLLPRIVATE
void MiscExec_Impl(SfxRequest
&);
200 SAL_DLLPRIVATE
void MiscState_Impl(SfxItemSet
&);
201 SAL_DLLPRIVATE SfxWorkWindow
* GetWorkWindow_Impl();
202 SAL_DLLPRIVATE
void AddDispatchMacroToBasic_Impl(const OUString
& sMacro
);
204 SAL_DLLPRIVATE
void Exec_Impl(SfxRequest
&);
205 SAL_DLLPRIVATE
void INetExecute_Impl(SfxRequest
&);
206 SAL_DLLPRIVATE
void INetState_Impl(SfxItemSet
&);
208 SAL_DLLPRIVATE
void SetCurViewId_Impl( const SfxInterfaceId i_nID
);
211 SAL_DLLPRIVATE
bool SwitchToViewShell_Impl( sal_uInt16 nNo
, bool bIsIndex
= false );
212 SAL_DLLPRIVATE
void PopShellAndSubShells_Impl( SfxViewShell
& i_rViewShell
);
213 SAL_DLLPRIVATE
void SaveCurrentViewData_Impl( const SfxInterfaceId i_nNewViewId
);
215 /** loads the given existing document into the given frame
217 This is done using the XComponentLoader interface of the frame, so the SFX document loader is invoked.
222 the frame to load the document into
224 the arguments to pass to the component loader. If this sequence is empty, then the current arguments of the
225 model will be obtained, and passed to the loader. This ensures that any arguments in the model will be preserved,
226 instead of being reset.
228 the ID of the view to create
230 if something goes wrong. The caller is responsible for handling this.
232 SAL_DLLPRIVATE
static SfxViewShell
* LoadViewIntoFrame_Impl(
233 const SfxObjectShell
& i_rDoc
,
234 const css::uno::Reference
< css::frame::XFrame
>& i_rFrame
,
235 const css::uno::Sequence
< css::beans::PropertyValue
>& i_rLoadArgs
,
236 const SfxInterfaceId i_nViewId
,
240 /** loads the given existing document into the given frame
242 This is done using the XComponentLoader interface of the frame, so the SFX document loader is invoked.
244 If no frame is given, a blank top level frame is created.
246 If anything fails during the process, as much as possible is cleaned up.
251 the frame to load the document into. Might be <NULL/>, in which case a new frame is created.
253 the ID of the view to create
255 SAL_DLLPRIVATE
static SfxViewFrame
* LoadViewIntoFrame_Impl_NoThrow(
256 const SfxObjectShell
& i_rDoc
,
257 const css::uno::Reference
< css::frame::XFrame
>& i_rFrame
,
258 const SfxInterfaceId i_nViewId
,
264 class SFX2_DLLPUBLIC SfxViewFrameItem final
: public SfxPoolItem
266 SfxViewFrame
* pFrame
;
269 SfxViewFrameItem( SfxViewFrame
*pViewFrame
):
274 virtual bool operator==( const SfxPoolItem
& ) const override
;
275 virtual SfxViewFrameItem
* Clone( SfxItemPool
*pPool
= nullptr ) const override
;
277 SfxViewFrame
* GetFrame() const
283 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */