Avoid potential negative array index access to cached text.
[LibreOffice.git] / include / sfx2 / viewfrm.hxx
blob7e038e9d6b961249633c1bfc70bb68a2f87b5f93
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
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
22 #include <memory>
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>
33 namespace weld {
34 class Button;
35 class Window;
37 class SvBorder;
38 class SfxDispatcher;
39 class SfxBindings;
40 class SfxProgress;
41 class SfxViewShell;
42 class Point;
43 class Size;
44 class SfxChildWindow;
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;
80 public:
81 SfxViewFrame( SfxFrame& rFrame, SfxObjectShell *pDoc );
83 SFX_DECL_INTERFACE(SFX_INTERFACE_SFXVIEWFRM)
85 private:
86 /// SfxInterface initializer.
87 static void InitInterface_Impl();
89 void AppendContainsMacrosInfobar();
90 public:
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 );
125 void Show();
126 bool IsVisible() const;
127 void ToTop();
128 void Enable( bool bEnable );
129 void Close();
130 virtual void Activate( bool bUI ) override;
131 virtual void Deactivate( bool bUI ) override;
133 void UpdateTitle();
135 // interne Handler
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;
145 bool DoClose();
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,
175 InfobarType eType);
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 );
210 private:
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.
219 @param i_rDoc
220 the document to load
221 @param i_rFrame
222 the frame to load the document into
223 @param i_rLoadArgs
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.
227 @param i_nViewId
228 the ID of the view to create
229 @throws Exception
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,
237 const bool i_bHidden
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.
248 @param i_rDoc
249 the document to load
250 @param i_rFrame
251 the frame to load the document into. Might be <NULL/>, in which case a new frame is created.
252 @param i_nViewId
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,
259 const bool i_bHidden
264 class SFX2_DLLPUBLIC SfxViewFrameItem final : public SfxPoolItem
266 SfxViewFrame* pFrame;
268 public:
269 SfxViewFrameItem( SfxViewFrame *pViewFrame ):
270 SfxPoolItem( 0 ),
271 pFrame( pViewFrame)
274 virtual bool operator==( const SfxPoolItem& ) const override;
275 virtual SfxViewFrameItem* Clone( SfxItemPool *pPool = nullptr ) const override;
277 SfxViewFrame* GetFrame() const
278 { return pFrame; }
281 #endif
283 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */