Bump version to 6.4-15
[LibreOffice.git] / include / vcl / floatwin.hxx
blob52d09597b59c0238f1f33a3f4e5a72f065937c7b
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 SAL_DLLPRIVATE void ImplInitFloating( vcl::Window* pParent, WinBits nStyle );
104 SAL_DLLPRIVATE void ImplInitSettings();
106 virtual void ApplySettings(vcl::RenderContext& rRenderContext) override;
108 public:
109 SAL_DLLPRIVATE FloatingWindow* ImplFloatHitTest( vcl::Window* pReference, const Point& rPos, bool& rbHitTestInsideRect );
110 SAL_DLLPRIVATE FloatingWindow* ImplFindLastLevelFloat();
111 SAL_DLLPRIVATE bool ImplIsFloatPopupModeWindow( const vcl::Window* pWindow );
112 SAL_DLLPRIVATE void ImplSetMouseDown() { mbMouseDown = true; }
113 SAL_DLLPRIVATE bool ImplIsMouseDown() const { return mbMouseDown; }
114 static Point ImplCalcPos(vcl::Window* pWindow,
115 const tools::Rectangle& rRect, FloatWinPopupFlags nFlags,
116 sal_uInt16& rArrangeIndex, Point* pLOKTwipsPos = nullptr);
117 static Point ImplConvertToAbsPos(vcl::Window* pReference, const Point& rPos);
118 static tools::Rectangle ImplConvertToAbsPos(vcl::Window* pReference, const tools::Rectangle& rRect);
119 SAL_DLLPRIVATE void ImplEndPopupMode( FloatWinPopupEndFlags nFlags, const VclPtr<vcl::Window>& xFocusId );
120 SAL_DLLPRIVATE tools::Rectangle& ImplGetItemEdgeClipRect();
121 SAL_DLLPRIVATE bool ImplIsInPrivatePopupMode() const { return mbInPopupMode; }
122 virtual void doDeferredInit(WinBits nBits) override;
123 void PixelInvalidate(const tools::Rectangle* pRectangle) override;
125 public:
126 explicit FloatingWindow(vcl::Window* pParent, WinBits nStyle);
127 explicit FloatingWindow(vcl::Window* pParent, const OString& rID, const OUString& rUIXMLDescription,
128 const css::uno::Reference<css::frame::XFrame> &rFrame = css::uno::Reference<css::frame::XFrame>());
129 virtual ~FloatingWindow() override;
130 virtual void dispose() override;
132 virtual bool EventNotify( NotifyEvent& rNEvt ) override;
133 virtual void StateChanged( StateChangedType nType ) override;
134 virtual void DataChanged( const DataChangedEvent& rDCEvt ) override;
136 virtual void PopupModeEnd();
138 void SetTitleType( FloatWinTitleType nTitle );
139 FloatWinTitleType GetTitleType() const { return mnTitle; }
141 void StartPopupMode( const tools::Rectangle& rRect, FloatWinPopupFlags nFlags );
142 void StartPopupMode( ToolBox* pBox, FloatWinPopupFlags nFlags );
143 void EndPopupMode( FloatWinPopupEndFlags nFlags = FloatWinPopupEndFlags::NONE );
144 void AddPopupModeWindow( vcl::Window* pWindow );
145 FloatWinPopupFlags GetPopupModeFlags() const { return mnPopupModeFlags; }
146 void SetPopupModeFlags( FloatWinPopupFlags nFlags ) { mnPopupModeFlags = nFlags; }
147 bool IsInPopupMode() const { return mbPopupMode; }
148 bool IsInCleanUp() const { return mbInCleanUp; }
149 bool IsPopupModeCanceled() const { return mbPopupModeCanceled; }
150 bool IsPopupModeTearOff() const { return mbPopupModeTearOff; }
152 void SetPopupModeEndHdl( const Link<FloatingWindow*,void>& rLink ) { maPopupModeEndHdl = rLink; }
154 bool GrabsFocus() const { return mbGrabFocus; }
155 bool UpdatePositionData();
157 static Point CalcFloatingPosition( vcl::Window* pWindow, const tools::Rectangle& rRect, FloatWinPopupFlags nFlags, sal_uInt16& rArrangeIndex );
160 #endif // INCLUDED_VCL_FLOATWIN_HXX
162 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */