bump product version to 6.3.0.0.beta1
[LibreOffice.git] / include / vcl / floatwin.hxx
blob75dd4c1fec10cdb11cc3e5e53593c12bb9ef7324
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,
60 namespace o3tl
62 template<> struct typed_flags<FloatWinPopupEndFlags> : is_typed_flags<FloatWinPopupEndFlags, 0x0f> {};
65 enum class FloatWinTitleType
67 Unknown = 0,
68 Normal = 1,
69 TearOff = 2,
70 Popup = 3,
71 NONE = 4,
74 class VCL_DLLPUBLIC FloatingWindow : public SystemWindow
76 class ImplData;
77 private:
78 VclPtr<FloatingWindow> mpNextFloat;
79 VclPtr<vcl::Window> mpFirstPopupModeWin;
80 VclPtr<vcl::Window> mxPrevFocusWin;
81 std::unique_ptr<ImplData> mpImplData;
82 tools::Rectangle maFloatRect;
83 ImplSVEvent * mnPostId;
84 FloatWinPopupFlags mnPopupModeFlags;
85 FloatWinTitleType mnTitle;
86 FloatWinTitleType mnOldTitle;
87 bool mbInPopupMode;
88 bool mbPopupMode;
89 bool mbPopupModeCanceled;
90 bool mbPopupModeTearOff;
91 bool mbMouseDown;
92 bool mbGrabFocus; // act as key input window, although focus is not set
93 bool mbInCleanUp;
94 Link<FloatingWindow*,void> maPopupModeEndHdl;
96 SAL_DLLPRIVATE void ImplCallPopupModeEnd();
97 DECL_DLLPRIVATE_LINK( ImplEndPopupModeHdl, void*, void );
99 FloatingWindow (const FloatingWindow &) = delete;
100 FloatingWindow & operator= (const FloatingWindow &) = delete;
102 protected:
103 using Window::ImplInit;
104 SAL_DLLPRIVATE void ImplInit( 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: */