lok: vcl: fix multiple floatwin removal case more robustly.
[LibreOffice.git] / include / vcl / floatwin.hxx
blob91a6ae3c8c0efd41a49e0a132dcab1e6840d18f6
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 .
20 #ifndef INCLUDED_VCL_FLOATWIN_HXX
21 #define INCLUDED_VCL_FLOATWIN_HXX
23 #include <vcl/dllapi.h>
24 #include <vcl/syswin.hxx>
25 #include <memory>
26 #include <o3tl/typed_flags_set.hxx>
28 class ToolBox;
31 enum class FloatWinPopupFlags
33 NONE = 0x000000,
34 AllowTearOff = 0x000001,
35 Down = 0x000002,
36 Up = 0x000004,
37 Left = 0x000008,
38 Right = 0x000010,
39 NoKeyClose = 0x000020,
40 AllMouseButtonClose = 0x000040,
41 NoAppFocusClose = 0x000080,
42 NewLevel = 0x000100,
43 NoMouseUpClose = 0x000200,
44 GrabFocus = 0x000400,
45 NoHorzPlacement = 0x000800,
47 namespace o3tl
49 template<> struct typed_flags<FloatWinPopupFlags> : is_typed_flags<FloatWinPopupFlags, 0x0fff> {};
52 enum class FloatWinPopupEndFlags
54 NONE = 0x00,
55 Cancel = 0x01,
56 TearOff = 0x02,
57 DontCallHdl = 0x04,
58 CloseAll = 0x08,
59 NoCloseChildren = 0x10,
61 namespace o3tl
63 template<> struct typed_flags<FloatWinPopupEndFlags> : is_typed_flags<FloatWinPopupEndFlags, 0x1f> {};
66 enum class FloatWinTitleType
68 Unknown = 0,
69 Normal = 1,
70 TearOff = 2,
71 Popup = 3,
72 NONE = 4,
75 class VCL_DLLPUBLIC FloatingWindow : public SystemWindow
77 class SAL_DLLPRIVATE ImplData;
78 private:
79 VclPtr<FloatingWindow> mpNextFloat;
80 VclPtr<vcl::Window> mpFirstPopupModeWin;
81 VclPtr<vcl::Window> mxPrevFocusWin;
82 std::unique_ptr<ImplData> mpImplData;
83 tools::Rectangle maFloatRect;
84 ImplSVEvent * mnPostId;
85 FloatWinPopupFlags mnPopupModeFlags;
86 FloatWinTitleType mnTitle;
87 FloatWinTitleType mnOldTitle;
88 bool mbInPopupMode;
89 bool mbPopupMode;
90 bool mbPopupModeCanceled;
91 bool mbPopupModeTearOff;
92 bool mbMouseDown;
93 bool mbGrabFocus; // act as key input window, although focus is not set
94 bool mbInCleanUp;
95 Link<FloatingWindow*,void> maPopupModeEndHdl;
97 SAL_DLLPRIVATE void ImplCallPopupModeEnd();
98 DECL_DLLPRIVATE_LINK( ImplEndPopupModeHdl, void*, void );
100 FloatingWindow (const FloatingWindow &) = delete;
101 FloatingWindow & operator= (const FloatingWindow &) = delete;
103 protected:
104 SAL_DLLPRIVATE void ImplInitFloating( vcl::Window* pParent, WinBits nStyle );
105 SAL_DLLPRIVATE void ImplInitSettings();
107 virtual void ApplySettings(vcl::RenderContext& rRenderContext) override;
109 public:
110 SAL_DLLPRIVATE FloatingWindow* ImplFloatHitTest( vcl::Window* pReference, const Point& rPos, bool& rbHitTestInsideRect );
111 SAL_DLLPRIVATE FloatingWindow* ImplFindLastLevelFloat();
112 SAL_DLLPRIVATE bool ImplIsFloatPopupModeWindow( const vcl::Window* pWindow );
113 SAL_DLLPRIVATE void ImplSetMouseDown() { mbMouseDown = true; }
114 SAL_DLLPRIVATE bool ImplIsMouseDown() const { return mbMouseDown; }
115 static Point ImplCalcPos(vcl::Window* pWindow,
116 const tools::Rectangle& rRect, FloatWinPopupFlags nFlags,
117 sal_uInt16& rArrangeIndex, Point* pLOKTwipsPos = nullptr);
118 static Point ImplConvertToAbsPos(vcl::Window* pReference, const Point& rPos);
119 static tools::Rectangle ImplConvertToAbsPos(vcl::Window* pReference, const tools::Rectangle& rRect);
120 SAL_DLLPRIVATE void ImplEndPopupMode( FloatWinPopupEndFlags nFlags, const VclPtr<vcl::Window>& xFocusId );
121 SAL_DLLPRIVATE tools::Rectangle& ImplGetItemEdgeClipRect();
122 SAL_DLLPRIVATE bool ImplIsInPrivatePopupMode() const { return mbInPopupMode; }
123 virtual void doDeferredInit(WinBits nBits) override;
124 void PixelInvalidate(const tools::Rectangle* pRectangle) override;
126 public:
127 explicit FloatingWindow(vcl::Window* pParent, WinBits nStyle);
128 explicit FloatingWindow(vcl::Window* pParent, const OString& rID, const OUString& rUIXMLDescription,
129 const css::uno::Reference<css::frame::XFrame> &rFrame = css::uno::Reference<css::frame::XFrame>());
130 virtual ~FloatingWindow() override;
131 virtual void dispose() override;
133 virtual bool EventNotify( NotifyEvent& rNEvt ) override;
134 virtual void StateChanged( StateChangedType nType ) override;
135 virtual void DataChanged( const DataChangedEvent& rDCEvt ) override;
137 virtual void PopupModeEnd();
139 void SetTitleType( FloatWinTitleType nTitle );
140 FloatWinTitleType GetTitleType() const { return mnTitle; }
142 void StartPopupMode( const tools::Rectangle& rRect, FloatWinPopupFlags nFlags );
143 void StartPopupMode( ToolBox* pBox, FloatWinPopupFlags nFlags );
144 void EndPopupMode( FloatWinPopupEndFlags nFlags = FloatWinPopupEndFlags::NONE );
145 void AddPopupModeWindow( vcl::Window* pWindow );
146 FloatWinPopupFlags GetPopupModeFlags() const { return mnPopupModeFlags; }
147 void SetPopupModeFlags( FloatWinPopupFlags nFlags ) { mnPopupModeFlags = nFlags; }
148 bool IsInPopupMode() const { return mbPopupMode; }
149 bool IsInCleanUp() const { return mbInCleanUp; }
150 bool IsPopupModeCanceled() const { return mbPopupModeCanceled; }
151 bool IsPopupModeTearOff() const { return mbPopupModeTearOff; }
153 void SetPopupModeEndHdl( const Link<FloatingWindow*,void>& rLink ) { maPopupModeEndHdl = rLink; }
155 bool GrabsFocus() const { return mbGrabFocus; }
156 bool UpdatePositionData();
158 static Point CalcFloatingPosition( vcl::Window* pWindow, const tools::Rectangle& rRect, FloatWinPopupFlags nFlags, sal_uInt16& rArrangeIndex );
161 #endif // INCLUDED_VCL_FLOATWIN_HXX
163 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */