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(EventButtonHandler
, weld::Button
&, void);
69 DECL_DLLPRIVATE_LINK(SwitchReadOnlyHandler
, weld::Button
&, void);
70 DECL_DLLPRIVATE_LINK(SignDocumentHandler
, weld::Button
&, void);
71 DECL_DLLPRIVATE_LINK(HiddenTrackChangesHandler
, weld::Button
&, void);
72 DECL_DLLPRIVATE_LINK(HyphenationMissingHandler
, weld::Button
&, void);
73 DECL_DLLPRIVATE_LINK(RefreshMasterPasswordHdl
, weld::Button
&, void);
74 DECL_DLLPRIVATE_STATIC_LINK(SfxViewFrame
, HelpMasterPasswordHdl
, weld::Button
&, void);
75 SAL_DLLPRIVATE
void KillDispatcher_Impl();
77 virtual ~SfxViewFrame() override
;
80 SfxViewFrame( SfxFrame
& rFrame
, SfxObjectShell
*pDoc
);
82 SFX_DECL_INTERFACE(SFX_INTERFACE_SFXVIEWFRM
)
85 /// SfxInterface initializer.
86 static void InitInterface_Impl();
88 void AppendContainsMacrosInfobar();
91 static void SetViewFrame( SfxViewFrame
* );
93 static SfxViewFrame
* LoadHiddenDocument( SfxObjectShell
const & i_rDoc
, SfxInterfaceId i_nViewId
);
94 static SfxViewFrame
* LoadDocument( SfxObjectShell
const & i_rDoc
, SfxInterfaceId i_nViewId
);
95 static SfxViewFrame
* LoadDocumentIntoFrame( SfxObjectShell
const & i_rDoc
, const SfxFrameItem
* i_pFrameItem
, SfxInterfaceId i_nViewId
);
96 static SfxViewFrame
* LoadDocumentIntoFrame( SfxObjectShell
const & i_rDoc
, const css::uno::Reference
< css::frame::XFrame
>& i_rFrameItem
);
97 static SfxViewFrame
* DisplayNewDocument( SfxObjectShell
const & i_rDoc
, const SfxRequest
& i_rCreateDocRequest
);
99 SAL_WARN_UNUSED_RESULT
static SfxViewFrame
* Current();
100 SAL_WARN_UNUSED_RESULT
static SfxViewFrame
* GetFirst( const SfxObjectShell
* pDoc
= nullptr, bool bOnlyVisible
= true );
101 SAL_WARN_UNUSED_RESULT
static SfxViewFrame
* GetNext( const SfxViewFrame
& rPrev
, const SfxObjectShell
* pDoc
= nullptr, bool bOnlyVisible
= true );
103 SAL_WARN_UNUSED_RESULT
static SfxViewFrame
* Get( const css::uno::Reference
< css::frame::XController
>& i_rController
, const SfxObjectShell
* i_pDoc
);
105 void DoActivate(bool bMDI
);
106 void DoDeactivate(bool bMDI
, SfxViewFrame
const *pOld
);
108 using SfxShell::GetDispatcher
;
109 SfxDispatcher
* GetDispatcher() { return m_pDispatcher
.get(); }
110 SfxBindings
& GetBindings() { return *m_pBindings
; }
111 const SfxBindings
& GetBindings() const { return *m_pBindings
; }
112 vcl::Window
& GetWindow() const;
113 weld::Window
* GetFrameWeld() const;
115 SfxProgress
* GetProgress() const;
117 void LockAdjustPosSizePixel()
118 { m_nAdjustPosPixelLock
++; }
119 void UnlockAdjustPosSizePixel()
120 { m_nAdjustPosPixelLock
--; }
121 void DoAdjustPosSizePixel( SfxViewShell
* pSh
,
122 const Point
&rPos
, const Size
&rSize
,
123 bool inplaceEditModeChange
);
125 bool IsVisible() const;
127 void Enable( bool bEnable
);
129 virtual void Activate( bool bUI
) override
;
130 virtual void Deactivate( bool bUI
) override
;
135 SAL_DLLPRIVATE
void SetBorderPixelImpl( const SfxViewShell
*pSh
, const SvBorder
&rBorder
);
136 SAL_DLLPRIVATE
const SvBorder
& GetBorderPixelImpl() const;
137 SAL_DLLPRIVATE
void InvalidateBorderImpl( const SfxViewShell
*pSh
);
139 virtual SfxObjectShell
* GetObjectShell() override
;
140 SfxInterfaceId
GetCurViewId() const;
141 SfxFrame
& GetFrame() const;
142 SfxViewFrame
* GetTopViewFrame() const;
145 static void GetTargetList( TargetList
& rList
)
146 { SfxFrame::GetDefaultTargetList( rList
); }
148 void SetModalMode( bool );
149 bool IsInModalMode() const;
150 void Resize(bool bForce
=false);
152 void SetChildWindow(sal_uInt16 nId
, bool bVisible
, bool bSetFocus
=true);
153 void ToggleChildWindow(sal_uInt16
);
154 bool HasChildWindow(sal_uInt16
);
155 bool KnowsChildWindow(sal_uInt16
);
156 void ShowChildWindow(sal_uInt16
,bool bVisible
=true);
157 SfxChildWindow
* GetChildWindow(sal_uInt16
);
158 void ChildWindowExecute(SfxRequest
&);
159 void ChildWindowState(SfxItemSet
&);
161 /** Append a new InfoBar (see https://wiki.documentfoundation.org/Design/Whiteboards/Infobar).
163 The buttons will be added from Right to Left at the right of the info bar. The parent, size
164 and position of each button will be changed: only the width will remain unchanged.
166 VclPtr
<SfxInfoBarWindow
> AppendInfoBar(const OUString
& sId
,
167 const OUString
& sPrimaryMessage
,
168 const OUString
& sSecondaryMessage
,
169 InfobarType aInfobarType
,
170 bool bShowCloseButton
=true);
171 void RemoveInfoBar(std::u16string_view sId
);
172 void UpdateInfoBar(std::u16string_view sId
, const OUString
& sPrimaryMessage
,
173 const OUString
& sSecondaryMessage
,
175 bool HasInfoBarWithID(std::u16string_view sId
);
176 void AppendReadOnlyInfobar();
178 SAL_DLLPRIVATE
void GetDocNumber_Impl();
179 SAL_DLLPRIVATE
void SetViewShell_Impl( SfxViewShell
*pVSh
);
180 SAL_DLLPRIVATE
void ReleaseObjectShell_Impl();
182 SAL_DLLPRIVATE
void GetState_Impl( SfxItemSet
&rSet
);
183 void ExecReload_Impl(SfxRequest
& rReq
);
184 SAL_DLLPRIVATE
void StateReload_Impl( SfxItemSet
&rSet
);
185 SAL_DLLPRIVATE
void ExecView_Impl( SfxRequest
&rReq
);
186 SAL_DLLPRIVATE
void StateView_Impl( SfxItemSet
&rSet
);
187 SAL_DLLPRIVATE
void ExecHistory_Impl( SfxRequest
&rReq
);
188 SAL_DLLPRIVATE
void StateHistory_Impl( SfxItemSet
&rSet
);
189 SAL_DLLPRIVATE
void ForceOuterResize_Impl();
190 SAL_DLLPRIVATE
void UpdateDocument_Impl();
192 SAL_DLLPRIVATE
void LockObjectShell_Impl();
194 SAL_DLLPRIVATE
void MakeActive_Impl( bool bActivate
);
195 SAL_DLLPRIVATE
const Size
& GetMargin_Impl() const;
196 SAL_DLLPRIVATE OUString
GetActualPresentationURL_Impl() const;
197 SAL_DLLPRIVATE
void MiscExec_Impl(SfxRequest
&);
198 SAL_DLLPRIVATE
void MiscState_Impl(SfxItemSet
&);
199 SAL_DLLPRIVATE SfxWorkWindow
* GetWorkWindow_Impl();
200 SAL_DLLPRIVATE
void AddDispatchMacroToBasic_Impl(const OUString
& sMacro
);
202 SAL_DLLPRIVATE
void Exec_Impl(SfxRequest
&);
203 SAL_DLLPRIVATE
void INetExecute_Impl(SfxRequest
&);
204 SAL_DLLPRIVATE
void INetState_Impl(SfxItemSet
&);
206 SAL_DLLPRIVATE
void SetCurViewId_Impl( const SfxInterfaceId i_nID
);
209 SAL_DLLPRIVATE
bool SwitchToViewShell_Impl( sal_uInt16 nNo
, bool bIsIndex
= false );
210 SAL_DLLPRIVATE
void PopShellAndSubShells_Impl( SfxViewShell
& i_rViewShell
);
211 SAL_DLLPRIVATE
void SaveCurrentViewData_Impl( const SfxInterfaceId i_nNewViewId
);
213 /** loads the given existing document into the given frame
215 This is done using the XComponentLoader interface of the frame, so the SFX document loader is invoked.
220 the frame to load the document into
222 the arguments to pass to the component loader. If this sequence is empty, then the current arguments of the
223 model will be obtained, and passed to the loader. This ensures that any arguments in the model will be preserved,
224 instead of being reset.
226 the ID of the view to create
228 if something goes wrong. The caller is responsible for handling this.
230 SAL_DLLPRIVATE
static SfxViewShell
* LoadViewIntoFrame_Impl(
231 const SfxObjectShell
& i_rDoc
,
232 const css::uno::Reference
< css::frame::XFrame
>& i_rFrame
,
233 const css::uno::Sequence
< css::beans::PropertyValue
>& i_rLoadArgs
,
234 const SfxInterfaceId i_nViewId
,
238 /** loads the given existing document into the given frame
240 This is done using the XComponentLoader interface of the frame, so the SFX document loader is invoked.
242 If no frame is given, a blank top level frame is created.
244 If anything fails during the process, as much as possible is cleaned up.
249 the frame to load the document into. Might be <NULL/>, in which case a new frame is created.
251 the ID of the view to create
253 SAL_DLLPRIVATE
static SfxViewFrame
* LoadViewIntoFrame_Impl_NoThrow(
254 const SfxObjectShell
& i_rDoc
,
255 const css::uno::Reference
< css::frame::XFrame
>& i_rFrame
,
256 const SfxInterfaceId i_nViewId
,
262 class SFX2_DLLPUBLIC SfxViewFrameItem final
: public SfxPoolItem
264 SfxViewFrame
* pFrame
;
267 SfxViewFrameItem( SfxViewFrame
*pViewFrame
):
272 virtual bool operator==( const SfxPoolItem
& ) const override
;
273 virtual SfxViewFrameItem
* Clone( SfxItemPool
*pPool
= nullptr ) const override
;
275 SfxViewFrame
* GetFrame() const
281 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */