LibreOffice Module vcl (master) 1
nativecontrols.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
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/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
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 .
18 */
19
20#include <sal/log.hxx>
21
24#include <vcl/virdev.hxx>
25#include <vcl/window.hxx>
26
27#include <salgdi.hxx>
28#include <toolbarvalue.hxx>
29
30#include <cassert>
31
33{
34}
35
37{
38 assert( typeid( const ImplControlValue ) == typeid( *this ));
39 return new ImplControlValue( *this );
40}
41
43{
44}
45
47{
48 assert( typeid( const ScrollbarValue ) == typeid( *this ));
49 return new ScrollbarValue( *this );
50}
51
53{
54}
55
57{
58 assert( typeid( const SliderValue ) == typeid( *this ));
59 return new SliderValue( *this );
60}
61
63
65{
66 assert(typeid(const TabPaneValue) == typeid(*this));
67 return new TabPaneValue(*this);
68}
69
71{
72}
73
75{
76 assert( typeid( const TabitemValue ) == typeid( *this ));
77 return new TabitemValue( *this );
78}
79
81{
82}
83
85{
86 assert( typeid( const SpinbuttonValue ) == typeid( *this ));
87 return new SpinbuttonValue( *this );
88}
89
91{
92}
93
95{
96 assert( typeid( const ToolbarValue ) == typeid( *this ));
97 return new ToolbarValue( *this );
98}
99
101{
102}
103
105{
106 assert( typeid( const MenubarValue ) == typeid( *this ));
107 return new MenubarValue( *this );
108}
109
111{
112}
113
115{
116 assert( typeid( const MenupopupValue ) == typeid( *this ));
117 return new MenupopupValue( *this );
118}
119
121{
122}
123
125{
126 assert( typeid( const PushButtonValue ) == typeid( *this ));
127 return new PushButtonValue( *this );
128}
129
130// These functions are mainly passthrough functions that allow access to
131// the SalFrame behind a Window object for native widget rendering purposes.
132
134{
135 if( !CanEnableNativeWidget() )
136 return false;
137
138 if ( !mpGraphics && !AcquireGraphics() )
139 return false;
140 assert(mpGraphics);
141
143}
144
146 ControlPart nPart,
147 const tools::Rectangle& rControlRegion,
148 const Point& aPos,
149 bool& rIsInside ) const
150{
151 if( !CanEnableNativeWidget() )
152 return false;
153
154 if ( !mpGraphics && !AcquireGraphics() )
155 return false;
156 assert(mpGraphics);
157
158 Point aWinOffs( mnOutOffX, mnOutOffY );
159 tools::Rectangle screenRegion( rControlRegion );
160 screenRegion.Move( aWinOffs.X(), aWinOffs.Y());
161
162 return mpGraphics->HitTestNativeScrollbar( nPart, screenRegion, Point( aPos.X() + mnOutOffX, aPos.Y() + mnOutOffY ),
163 rIsInside, *this );
164}
165
166static std::unique_ptr< ImplControlValue > TransformControlValue( const ImplControlValue& rVal, const OutputDevice& rDev )
167{
168 std::unique_ptr< ImplControlValue > aResult;
169 switch( rVal.getType() )
170 {
172 {
173 const SliderValue* pSlVal = static_cast<const SliderValue*>(&rVal);
174 SliderValue* pNew = new SliderValue( *pSlVal );
175 aResult.reset( pNew );
176 pNew->maThumbRect = rDev.ImplLogicToDevicePixel( pSlVal->maThumbRect );
177 }
178 break;
180 {
181 const ScrollbarValue* pScVal = static_cast<const ScrollbarValue*>(&rVal);
182 ScrollbarValue* pNew = new ScrollbarValue( *pScVal );
183 aResult.reset( pNew );
184 pNew->maThumbRect = rDev.ImplLogicToDevicePixel( pScVal->maThumbRect );
185 pNew->maButton1Rect = rDev.ImplLogicToDevicePixel( pScVal->maButton1Rect );
186 pNew->maButton2Rect = rDev.ImplLogicToDevicePixel( pScVal->maButton2Rect );
187 }
188 break;
190 {
191 const SpinbuttonValue* pSpVal = static_cast<const SpinbuttonValue*>(&rVal);
192 SpinbuttonValue* pNew = new SpinbuttonValue( *pSpVal );
193 aResult.reset( pNew );
194 pNew->maUpperRect = rDev.ImplLogicToDevicePixel( pSpVal->maUpperRect );
195 pNew->maLowerRect = rDev.ImplLogicToDevicePixel( pSpVal->maLowerRect );
196 }
197 break;
199 {
200 const ToolbarValue* pTVal = static_cast<const ToolbarValue*>(&rVal);
201 ToolbarValue* pNew = new ToolbarValue( *pTVal );
202 aResult.reset( pNew );
203 pNew->maGripRect = rDev.ImplLogicToDevicePixel( pTVal->maGripRect );
204 }
205 break;
207 {
208 const TabPaneValue* pTIVal = static_cast<const TabPaneValue*>(&rVal);
209 TabPaneValue* pNew = new TabPaneValue(*pTIVal);
212 aResult.reset(pNew);
213 }
214 break;
216 {
217 const TabitemValue* pTIVal = static_cast<const TabitemValue*>(&rVal);
218 TabitemValue* pNew = new TabitemValue( *pTIVal );
220 aResult.reset( pNew );
221 }
222 break;
224 {
225 const MenubarValue* pMVal = static_cast<const MenubarValue*>(&rVal);
226 MenubarValue* pNew = new MenubarValue( *pMVal );
227 aResult.reset( pNew );
228 }
229 break;
231 {
232 const PushButtonValue* pBVal = static_cast<const PushButtonValue*>(&rVal);
233 PushButtonValue* pNew = new PushButtonValue( *pBVal );
234 aResult.reset( pNew );
235 }
236 break;
238 aResult = std::make_unique<ImplControlValue>( rVal );
239 break;
241 {
242 const MenupopupValue* pMVal = static_cast<const MenupopupValue*>(&rVal);
243 MenupopupValue* pNew = new MenupopupValue( *pMVal );
244 pNew->maItemRect = rDev.ImplLogicToDevicePixel( pMVal->maItemRect );
245 aResult.reset( pNew );
246 }
247 break;
248 default:
249 std::abort();
250 break;
251 }
252 return aResult;
253}
255 ControlPart nPart,
256 const tools::Rectangle& rControlRegion,
257 ControlState nState,
258 const ImplControlValue& aValue,
259 const OUString& aCaption,
260 const Color& rBackgroundColor )
261{
262 assert(!is_double_buffered_window());
263
264 if( !CanEnableNativeWidget() )
265 return false;
266
267 // make sure the current clip region is initialized correctly
268 if ( !mpGraphics && !AcquireGraphics() )
269 return false;
270 assert(mpGraphics);
271
272 if ( mbInitClipRegion )
274 if ( mbOutputClipped )
275 return true;
276
277 if ( mbInitLineColor )
279 if ( mbInitFillColor )
281
282 // Convert the coordinates from relative to Window-absolute, so we draw
283 // in the correct place in platform code
284 std::unique_ptr< ImplControlValue > aScreenCtrlValue( TransformControlValue( aValue, *this ) );
285 tools::Rectangle screenRegion( ImplLogicToDevicePixel( rControlRegion ) );
286
287 bool bRet = mpGraphics->DrawNativeControl(nType, nPart, screenRegion, nState, *aScreenCtrlValue, aCaption, *this, rBackgroundColor);
288
289 return bRet;
290}
291
293 ControlPart nPart,
294 const tools::Rectangle& rControlRegion,
295 ControlState nState,
296 const ImplControlValue& aValue,
297 tools::Rectangle &rNativeBoundingRegion,
298 tools::Rectangle &rNativeContentRegion ) const
299{
300 if( !CanEnableNativeWidget() )
301 return false;
302
303 if ( !mpGraphics && !AcquireGraphics() )
304 return false;
305 assert(mpGraphics);
306
307 // Convert the coordinates from relative to Window-absolute, so we draw
308 // in the correct place in platform code
309 std::unique_ptr< ImplControlValue > aScreenCtrlValue( TransformControlValue( aValue, *this ) );
310 tools::Rectangle screenRegion( ImplLogicToDevicePixel( rControlRegion ) );
311
312 bool bRet = mpGraphics->GetNativeControlRegion(nType, nPart, screenRegion, nState, *aScreenCtrlValue,
313 rNativeBoundingRegion,
314 rNativeContentRegion, *this );
315 if( bRet )
316 {
317 // transform back native regions
318 rNativeBoundingRegion = ImplDevicePixelToLogic( rNativeBoundingRegion );
319 rNativeContentRegion = ImplDevicePixelToLogic( rNativeContentRegion );
320 }
321
322 return bRet;
323}
324
325/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
ControlType
These types are all based on the supported variants vcl/salnativewidgets.hxx and must be kept in-sync...
ControlType getType() const
virtual ImplControlValue * clone() const
virtual ~ImplControlValue()
virtual ~MenubarValue() override
virtual MenubarValue * clone() const override
virtual ~MenupopupValue() override
MenupopupValue(tools::Long i_nGutterWidth, const tools::Rectangle &i_rItemRect)
tools::Rectangle maItemRect
virtual MenupopupValue * clone() const override
Some things multiple-inherit from VclAbstractDialog and OutputDevice, so we need to use virtual inher...
Definition: outdev.hxx:170
virtual void InitClipRegion()
SAL_DLLPRIVATE bool is_double_buffered_window() const
tools::Long mnOutOffY
Output offset for device output in pixel (pseudo window offset within window system's frames)
Definition: outdev.hxx:209
virtual bool CanEnableNativeWidget() const
Determine if native widgets can be enabled.
Definition: outdev.hxx:1842
SAL_DLLPRIVATE void InitLineColor()
Definition: line.cxx:85
bool mbOutputClipped
Definition: outdev.hxx:245
SAL_DLLPRIVATE tools::Rectangle ImplLogicToDevicePixel(const tools::Rectangle &rLogicRect) const
Convert a logical rectangle to a rectangle in physical device pixel units.
Definition: map.cxx:347
virtual bool AcquireGraphics() const =0
Acquire a graphics device that the output device uses to draw on.
tools::Long mnOutOffX
Output offset for device output in pixel (pseudo window offset within window system's frames)
Definition: outdev.hxx:207
SAL_DLLPRIVATE void InitFillColor()
Definition: fill.cxx:76
bool mbInitLineColor
Definition: outdev.hxx:248
SalGraphics * mpGraphics
Graphics context to draw on.
Definition: outdev.hxx:182
bool mbInitClipRegion
Definition: outdev.hxx:252
SAL_DLLPRIVATE tools::Rectangle ImplDevicePixelToLogic(const tools::Rectangle &rPixelRect) const
Convert a rectangle in physical pixel units to a rectangle in physical pixel units and coords.
Definition: map.cxx:561
bool HitTestNativeScrollbar(ControlPart nPart, const tools::Rectangle &rControlRegion, const Point &aPos, bool &rIsInside) const
Query the native control to determine if it was acted upon.
bool GetNativeControlRegion(ControlType nType, ControlPart nPart, const tools::Rectangle &rControlRegion, ControlState nState, const ImplControlValue &aValue, tools::Rectangle &rNativeBoundingRegion, tools::Rectangle &rNativeContentRegion) const
Query the native control's actual drawing region (including adornment)
bool DrawNativeControl(ControlType nType, ControlPart nPart, const tools::Rectangle &rControlRegion, ControlState nState, const ImplControlValue &aValue, const OUString &aCaption, const Color &rBackgroundColor=COL_AUTO)
Request rendering of a particular control and/or part.
bool IsNativeControlSupported(ControlType nType, ControlPart nPart) const
Query the platform layer for control support.
bool mbInitFillColor
Definition: outdev.hxx:249
virtual ~PushButtonValue() override
virtual PushButtonValue * clone() const override
bool DrawNativeControl(ControlType nType, ControlPart nPart, const tools::Rectangle &rControlRegion, ControlState nState, const ImplControlValue &aValue, const OUString &aCaption, const OutputDevice &rOutDev, const Color &rBackgroundColor=COL_AUTO)
bool GetNativeControlRegion(ControlType nType, ControlPart nPart, const tools::Rectangle &rControlRegion, ControlState nState, const ImplControlValue &aValue, tools::Rectangle &rNativeBoundingRegion, tools::Rectangle &rNativeContentRegion, const OutputDevice &rOutDev)
bool IsNativeControlSupported(ControlType, ControlPart)
Definition: salgdi.hxx:633
bool HitTestNativeScrollbar(ControlPart nPart, const tools::Rectangle &rControlRegion, const Point &aPos, bool &rIsInside, const OutputDevice &rOutDev)
tools::Rectangle maThumbRect
tools::Rectangle maButton1Rect
virtual ~ScrollbarValue() override
tools::Rectangle maButton2Rect
virtual ScrollbarValue * clone() const override
virtual SliderValue * clone() const override
tools::Rectangle maThumbRect
virtual ~SliderValue() override
tools::Rectangle maLowerRect
tools::Rectangle maUpperRect
virtual SpinbuttonValue * clone() const override
virtual ~SpinbuttonValue() override
static int m_nOverlap
tools::Rectangle m_aTabHeaderRect
TabPaneValue(const tools::Rectangle &rTabHeaderRect, const tools::Rectangle &rSelectedTabRect)
tools::Rectangle m_aSelectedTabRect
TabPaneValue * clone() const override
tools::Rectangle maContentRect
virtual ~TabitemValue() override
TabitemValue(const tools::Rectangle &rContentRect)
virtual TabitemValue * clone() const override
tools::Rectangle maGripRect
virtual ~ToolbarValue() override
virtual ToolbarValue * clone() const override
void Move(tools::Long nHorzMoveDelta, tools::Long nVertMoveDelta)
sal_Int32 nState
static std::unique_ptr< ImplControlValue > TransformControlValue(const ImplControlValue &rVal, const OutputDevice &rDev)
QPRO_FUNC_TYPE nType