LibreOffice Module vcl (master) 1
accessibility.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 <vcl/layout.hxx>
21#include <vcl/toolkit/fixed.hxx>
22#include <vcl/window.hxx>
23#include <vcl/menu.hxx>
24#include <vcl/mnemonic.hxx>
25#include <vcl/wrkwin.hxx>
26
27#include <window.h>
28#include <brdwin.hxx>
29
30#include <com/sun/star/accessibility/XAccessible.hpp>
31#include <com/sun/star/accessibility/AccessibleRole.hpp>
32#include <com/sun/star/accessibility/AccessibleStateType.hpp>
33#include <com/sun/star/accessibility/XAccessibleEditableText.hpp>
34#include <com/sun/star/awt/XWindowPeer.hpp>
35
36#include <sal/log.hxx>
37
38using namespace ::com::sun::star::uno;
39using namespace ::com::sun::star::lang;
41using namespace ::com::sun::star::datatransfer::dnd;
42using namespace ::com::sun::star;
43
44
46{
47 nAccessibleRole = 0xFFFF;
48 pLabeledByWindow = nullptr;
49 pLabelForWindow = nullptr;
50}
51
53{
54}
55
56namespace vcl {
57
58css::uno::Reference< css::accessibility::XAccessible > Window::GetAccessible( bool bCreate )
59{
60 // do not optimize hierarchy for the top level border win (ie, when there is no parent)
61 /* // do not optimize accessible hierarchy at all to better reflect real VCL hierarchy
62 if ( GetParent() && ( GetType() == WindowType::BORDERWINDOW ) && ( GetChildCount() == 1 ) )
63 //if( !ImplIsAccessibleCandidate() )
64 {
65 vcl::Window* pChild = GetAccessibleChildWindow( 0 );
66 if ( pChild )
67 return pChild->GetAccessible();
68 }
69 */
70 if ( !mpWindowImpl )
71 return css::uno::Reference< css::accessibility::XAccessible >();
72 if ( !mpWindowImpl->mxAccessible.is() && bCreate )
73 mpWindowImpl->mxAccessible = CreateAccessible();
74
75 return mpWindowImpl->mxAccessible;
76}
77
78css::uno::Reference< css::accessibility::XAccessible > Window::CreateAccessible()
79{
80 css::uno::Reference< css::accessibility::XAccessible > xAcc( GetComponentInterface(), css::uno::UNO_QUERY );
81 return xAcc;
82}
83
84void Window::SetAccessible( const css::uno::Reference< css::accessibility::XAccessible >& x )
85{
86 if (!mpWindowImpl)
87 return;
88
89 mpWindowImpl->mxAccessible = x;
90}
91
92// skip all border windows that are not top level frames
94{
95 if( !mpWindowImpl->mbBorderWin )
96 return true;
97 else
98 // #101741 do not check for WB_CLOSEABLE because undecorated floaters (like menus!) are closeable
99 if( mpWindowImpl->mbFrame && mpWindowImpl->mnStyle & (WB_MOVEABLE | WB_SIZEABLE) )
100 return true;
101 else
102 return false;
103}
104
106{
107 if( mpWindowImpl->mbFrame )
108 // #101741 do not check for WB_CLOSEABLE because undecorated floaters (like menus!) are closeable
109 if( mpWindowImpl->mnStyle & (WB_MOVEABLE | WB_SIZEABLE) )
110 return true;
111 else
112 return false;
113 else
114 return false;
115}
116
118{
120 return nullptr;
121
122 vcl::Window* pParent = mpWindowImpl->mpParent;
124 {
125 // report the menubar as a child of THE workwindow
126 vcl::Window *pWorkWin = GetParent()->mpWindowImpl->mpFirstChild;
127 while( pWorkWin && (pWorkWin == this) )
128 pWorkWin = pWorkWin->mpWindowImpl->mpNext;
129 pParent = pWorkWin;
130 }
131 // If this is a floating window which has a native border window, then that border should be reported as
132 // the accessible parent
133 else if( GetType() == WindowType::FLOATINGWINDOW &&
134 mpWindowImpl->mpBorderWindow && mpWindowImpl->mpBorderWindow->mpWindowImpl->mbFrame )
135 {
136 pParent = mpWindowImpl->mpBorderWindow;
137 }
138 else if( pParent && !pParent->ImplIsAccessibleCandidate() )
139 {
140 pParent = pParent->mpWindowImpl->mpParent;
141 }
142 return pParent;
143}
144
146{
147 if (!mpWindowImpl)
148 return 0;
149
150 sal_uInt16 nChildren = 0;
151 vcl::Window* pChild = mpWindowImpl->mpFirstChild;
152 while( pChild )
153 {
154 if( pChild->IsVisible() )
155 nChildren++;
156 pChild = pChild->mpWindowImpl->mpNext;
157 }
158
159 // report the menubarwindow as a child of THE workwindow
161 {
162 ImplBorderWindow *pBorderWindow = static_cast<ImplBorderWindow*>(this);
163 if( pBorderWindow->mpMenuBarWindow &&
164 pBorderWindow->mpMenuBarWindow->IsVisible()
165 )
166 --nChildren;
167 }
168 else if( GetType() == WindowType::WORKWINDOW )
169 {
170 WorkWindow *pWorkWindow = static_cast<WorkWindow*>(this);
171 if( pWorkWindow->GetMenuBar() &&
172 pWorkWindow->GetMenuBar()->GetWindow() &&
173 pWorkWindow->GetMenuBar()->GetWindow()->IsVisible()
174 )
175 ++nChildren;
176 }
177
178 return nChildren;
179}
180
182{
183 // report the menubarwindow as the first child of THE workwindow
184 if( GetType() == WindowType::WORKWINDOW && static_cast<WorkWindow *>(this)->GetMenuBar() )
185 {
186 if( n == 0 )
187 {
188 MenuBar *pMenuBar = static_cast<WorkWindow *>(this)->GetMenuBar();
189 if( pMenuBar->GetWindow() && pMenuBar->GetWindow()->IsVisible() )
190 return pMenuBar->GetWindow();
191 }
192 else
193 --n;
194 }
195
196 // transform n to child number including invisible children
197 sal_uInt16 nChildren = n;
198 vcl::Window* pChild = mpWindowImpl->mpFirstChild;
199 while( pChild )
200 {
201 if( pChild->IsVisible() )
202 {
203 if( ! nChildren )
204 break;
205 nChildren--;
206 }
207 pChild = pChild->mpWindowImpl->mpNext;
208 }
209
210 if( GetType() == WindowType::BORDERWINDOW && pChild && pChild->GetType() == WindowType::MENUBARWINDOW )
211 {
212 do pChild = pChild->mpWindowImpl->mpNext; while( pChild && ! pChild->IsVisible() );
213 SAL_WARN_IF( !pChild, "vcl", "GetAccessibleChildWindow(): wrong index in border window");
214 }
215
216 if ( pChild && ( pChild->GetType() == WindowType::BORDERWINDOW ) && ( pChild->GetChildCount() == 1 ) )
217 {
218 pChild = pChild->GetChild( 0 );
219 }
220 return pChild;
221}
222
223void Window::SetAccessibleRole( sal_uInt16 nRole )
224{
225 if ( !mpWindowImpl->mpAccessibleInfos )
226 mpWindowImpl->mpAccessibleInfos.reset( new ImplAccessibleInfos );
227
228 SAL_WARN_IF( mpWindowImpl->mpAccessibleInfos->nAccessibleRole != 0xFFFF, "vcl", "AccessibleRole already set!" );
229 mpWindowImpl->mpAccessibleInfos->nAccessibleRole = nRole;
230}
231
233{
234 sal_uInt16 nRole = 0xFFFF;
235 switch ( GetType() )
236 {
237 case WindowType::MESSBOX: // MT: Would be nice to have special roles!
241 case WindowType::QUERYBOX: nRole = accessibility::AccessibleRole::ALERT; break;
242
246 case WindowType::DIALOG: nRole = accessibility::AccessibleRole::DIALOG; break;
247
253 case WindowType::MOREBUTTON: nRole = accessibility::AccessibleRole::PUSH_BUTTON; break;
254 case WindowType::MENUBUTTON: nRole = accessibility::AccessibleRole::BUTTON_MENU; break;
255
256 case WindowType::RADIOBUTTON: nRole = accessibility::AccessibleRole::RADIO_BUTTON; break;
258 case WindowType::CHECKBOX: nRole = accessibility::AccessibleRole::CHECK_BOX; break;
259
260 case WindowType::MULTILINEEDIT: nRole = accessibility::AccessibleRole::SCROLL_PANE; break;
261
263 case WindowType::EDIT: nRole = static_cast<Edit const *>(this)->IsPassword() ? accessibility::AccessibleRole::PASSWORD_TEXT : accessibility::AccessibleRole::TEXT; break;
264
270 case WindowType::COMBOBOX: nRole = accessibility::AccessibleRole::COMBO_BOX; break;
271
273 case WindowType::MULTILISTBOX: nRole = accessibility::AccessibleRole::LIST; break;
274
275 case WindowType::TREELISTBOX: nRole = accessibility::AccessibleRole::TREE; break;
276
277 case WindowType::FIXEDTEXT: nRole = accessibility::AccessibleRole::LABEL; break;
279 if( !GetText().isEmpty() )
280 nRole = accessibility::AccessibleRole::LABEL;
281 else
282 nRole = accessibility::AccessibleRole::SEPARATOR;
283 break;
284
286 case WindowType::FIXEDIMAGE: nRole = accessibility::AccessibleRole::ICON; break;
287 case WindowType::GROUPBOX: nRole = accessibility::AccessibleRole::GROUP_BOX; break;
288 case WindowType::SCROLLBAR: nRole = accessibility::AccessibleRole::SCROLL_BAR; break;
289
292 case WindowType::SPLITWINDOW: nRole = accessibility::AccessibleRole::SPLIT_PANE; break;
293
297 case WindowType::TIMEFIELD: nRole = accessibility::AccessibleRole::DATE_EDITOR; break;
298
303 case WindowType::FORMATTEDFIELD: nRole = accessibility::AccessibleRole::SPIN_BOX; break;
304
305 case WindowType::TOOLBOX: nRole = accessibility::AccessibleRole::TOOL_BAR; break;
306 case WindowType::STATUSBAR: nRole = accessibility::AccessibleRole::STATUS_BAR; break;
307
308 case WindowType::TABPAGE: nRole = accessibility::AccessibleRole::PANEL; break;
309 case WindowType::TABCONTROL: nRole = accessibility::AccessibleRole::PAGE_TAB_LIST; break;
310
311 case WindowType::DOCKINGWINDOW: nRole = (mpWindowImpl->mbFrame) ? accessibility::AccessibleRole::FRAME :
312 accessibility::AccessibleRole::PANEL; break;
313
314 case WindowType::FLOATINGWINDOW: nRole = ( mpWindowImpl->mbFrame ||
315 (mpWindowImpl->mpBorderWindow && mpWindowImpl->mpBorderWindow->mpWindowImpl->mbFrame) ||
316 (GetStyle() & WB_OWNERDRAWDECORATION) ) ? accessibility::AccessibleRole::FRAME :
317 accessibility::AccessibleRole::WINDOW; break;
318
319 case WindowType::WORKWINDOW: nRole = accessibility::AccessibleRole::ROOT_PANE; break;
320
321 case WindowType::SCROLLBARBOX: nRole = accessibility::AccessibleRole::FILLER; break;
322
323 case WindowType::HELPTEXTWINDOW: nRole = accessibility::AccessibleRole::TOOL_TIP; break;
324
325 case WindowType::RULER: nRole = accessibility::AccessibleRole::RULER; break;
326
327 case WindowType::SCROLLWINDOW: nRole = accessibility::AccessibleRole::SCROLL_PANE; break;
328
333 default:
335 nRole = accessibility::AccessibleRole::FRAME;
336 else if( IsScrollable() )
337 nRole = accessibility::AccessibleRole::SCROLL_PANE;
338 else if( this->ImplGetWindow()->IsMenuFloatingWindow() )
339 nRole = accessibility::AccessibleRole::WINDOW; // #106002#, contextmenus are windows (i.e. toplevel)
340 else
341 // #104051# WINDOW seems to be a bad default role, use LAYEREDPANE instead
342 // a WINDOW is interpreted as a top-level window, which is typically not the case
343 //nRole = accessibility::AccessibleRole::WINDOW;
344 nRole = accessibility::AccessibleRole::PANEL;
345 }
346 return nRole;
347}
348
350{
351 if (!mpWindowImpl)
352 return 0;
353
354 sal_uInt16 nRole = mpWindowImpl->mpAccessibleInfos ? mpWindowImpl->mpAccessibleInfos->nAccessibleRole : 0xFFFF;
355 if ( nRole == 0xFFFF )
356 nRole = getDefaultAccessibleRole();
357 return nRole;
358}
359
360void Window::SetAccessibleName( const OUString& rName )
361{
362 if ( !mpWindowImpl->mpAccessibleInfos )
363 mpWindowImpl->mpAccessibleInfos.reset( new ImplAccessibleInfos );
364
365 OUString oldName = GetAccessibleName();
366
367 mpWindowImpl->mpAccessibleInfos->pAccessibleName = rName;
368
370}
371
373{
374 if (!mpWindowImpl)
375 return OUString();
376
377 if (mpWindowImpl->mpAccessibleInfos && mpWindowImpl->mpAccessibleInfos->pAccessibleName)
378 return *mpWindowImpl->mpAccessibleInfos->pAccessibleName;
380}
381
383{
384 OUString aAccessibleName;
385 switch ( GetType() )
386 {
391 case WindowType::EDIT:
392
401
407 {
409 if ( pLabel && pLabel != this )
410 aAccessibleName = pLabel->GetText();
411 if (aAccessibleName.isEmpty())
412 aAccessibleName = GetQuickHelpText();
413 if (aAccessibleName.isEmpty())
414 aAccessibleName = GetText();
415 }
416 break;
417
420 aAccessibleName = GetText();
421 if (aAccessibleName.isEmpty())
422 {
423 aAccessibleName = GetQuickHelpText();
424 if (aAccessibleName.isEmpty())
425 aAccessibleName = GetHelpText();
426 }
427 break;
428
430 aAccessibleName = GetText();
431 break;
432
434 aAccessibleName = mpWindowImpl->maText;
435 break;
436
437 default:
438 aAccessibleName = GetText();
439 break;
440 }
441
442 return removeMnemonicFromString( aAccessibleName );
443}
444
445void Window::SetAccessibleDescription( const OUString& rDescription )
446{
447 if ( ! mpWindowImpl->mpAccessibleInfos )
448 mpWindowImpl->mpAccessibleInfos.reset( new ImplAccessibleInfos );
449
450 std::optional<OUString>& rCurrentDescription = mpWindowImpl->mpAccessibleInfos->pAccessibleDescription;
451 SAL_WARN_IF( rCurrentDescription && *rCurrentDescription != rDescription, "vcl", "AccessibleDescription already set" );
452 rCurrentDescription = rDescription;
453}
454
456{
457 if (!mpWindowImpl)
458 return OUString();
459
460 OUString aAccessibleDescription;
461 if ( mpWindowImpl->mpAccessibleInfos && mpWindowImpl->mpAccessibleInfos->pAccessibleDescription )
462 {
463 aAccessibleDescription = *mpWindowImpl->mpAccessibleInfos->pAccessibleDescription;
464 }
465 else
466 {
467 // Special code for help text windows. ZT asks the border window for the
468 // description so we have to forward this request to our inner window.
469 const vcl::Window* pWin = this->ImplGetWindow();
470 if ( pWin->GetType() == WindowType::HELPTEXTWINDOW )
471 aAccessibleDescription = pWin->GetHelpText();
472 else
473 aAccessibleDescription = GetHelpText();
474 }
475
476 return aAccessibleDescription;
477}
478
480{
481 if ( !mpWindowImpl->mpAccessibleInfos )
482 mpWindowImpl->mpAccessibleInfos.reset( new ImplAccessibleInfos );
483 mpWindowImpl->mpAccessibleInfos->pLabeledByWindow = pLabeledBy;
484}
485
487{
488 if ( !mpWindowImpl->mpAccessibleInfos )
489 mpWindowImpl->mpAccessibleInfos.reset( new ImplAccessibleInfos );
490 mpWindowImpl->mpAccessibleInfos->pLabelForWindow = pLabelFor;
491}
492
494{
497
498 return nullptr;
499}
500
502{
503 if (mpWindowImpl->mpAccessibleInfos && mpWindowImpl->mpAccessibleInfos->pLabelForWindow)
504 return mpWindowImpl->mpAccessibleInfos->pLabelForWindow;
505
506 return nullptr;
507}
508
510{
512
513 if (pWindow)
514 return pWindow;
515
518
519 return nullptr;
520}
521
523{
524 if (mpWindowImpl->mpAccessibleInfos && mpWindowImpl->mpAccessibleInfos->pLabeledByWindow)
525 return mpWindowImpl->mpAccessibleInfos->pLabeledByWindow;
526
527 std::vector<VclPtr<FixedText> > aMnemonicLabels(list_mnemonic_labels());
528 if (!aMnemonicLabels.empty())
529 {
530 //if we have multiple labels, then prefer the first that is visible
531 for (auto const & rCandidate : aMnemonicLabels)
532 {
533 if (rCandidate->IsVisible())
534 return rCandidate;
535 }
536 return aMnemonicLabels[0];
537 }
538
541
542 return nullptr;
543}
544
545bool Window::IsAccessibilityEventsSuppressed( bool bTraverseParentPath )
546{
547 if( !bTraverseParentPath )
548 return mpWindowImpl->mbSuppressAccessibilityEvents;
549 else
550 {
551 vcl::Window *pParent = this;
552 while ( pParent && pParent->mpWindowImpl)
553 {
554 if( pParent->mpWindowImpl->mbSuppressAccessibilityEvents )
555 return true;
556 else
557 pParent = pParent->mpWindowImpl->mpParent; // do not use GetParent() to find borderwindows that are frames
558 }
559 return false;
560 }
561}
562
564{
565 mpWindowImpl->mbSuppressAccessibilityEvents = bSuppressed;
566}
567
568} /* namespace vcl */
569
570uno::Reference<accessibility::XAccessibleEditableText>
571FindFocusedEditableText(uno::Reference<accessibility::XAccessibleContext> const& xContext)
572{
573 if (!xContext.is())
574 return uno::Reference<accessibility::XAccessibleEditableText>();
575
576 sal_Int64 nState = xContext->getAccessibleStateSet();
577 if (nState & accessibility::AccessibleStateType::FOCUSED)
578 {
579 uno::Reference<accessibility::XAccessibleEditableText> xText(xContext, uno::UNO_QUERY);
580 if (xText.is())
581 return xText;
582 if (nState & accessibility::AccessibleStateType::MANAGES_DESCENDANTS)
583 return uno::Reference<accessibility::XAccessibleEditableText>();
584 }
585
586 bool bSafeToIterate = true;
587 sal_Int64 nCount = xContext->getAccessibleChildCount();
588 if (nCount < 0 || nCount > SAL_MAX_UINT16 /* slow enough for anyone */)
589 bSafeToIterate = false;
590 if (!bSafeToIterate)
591 return uno::Reference<accessibility::XAccessibleEditableText>();
592
593 for (sal_Int64 i = 0; i < xContext->getAccessibleChildCount(); ++i)
594 {
595 uno::Reference<accessibility::XAccessible> xChild = xContext->getAccessibleChild(i);
596 if (!xChild.is())
597 continue;
598 uno::Reference<accessibility::XAccessibleContext> xChildContext
599 = xChild->getAccessibleContext();
600 if (!xChildContext.is())
601 continue;
602 uno::Reference<accessibility::XAccessibleEditableText> xText
603 = FindFocusedEditableText(xChildContext);
604 if (xText.is())
605 return xText;
606 }
607 return uno::Reference<accessibility::XAccessibleEditableText>();
608}
609
610/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
uno::Reference< accessibility::XAccessibleEditableText > FindFocusedEditableText(uno::Reference< accessibility::XAccessibleContext > const &xContext)
Definition: edit.hxx:56
VclPtr< vcl::Window > mpMenuBarWindow
Definition: brdwin.hxx:86
vcl::Window * GetWindow() const
Definition: menu.hxx:372
MenuBar * GetMenuBar() const
Definition: syswin.hxx:183
virtual vcl::Window * getAccessibleRelationLabelFor() const
vcl::Window * GetAccessibleChildWindow(sal_uInt16 n)
vcl::Window * GetParent() const
Definition: window2.cxx:1128
sal_uInt16 GetAccessibleRole() const
sal_uInt16 GetAccessibleChildWindowCount()
SAL_DLLPRIVATE bool ImplIsAccessibleCandidate() const
sal_uInt16 GetChildCount() const
Definition: stacking.cxx:1001
WindowType GetType() const
Definition: window2.cxx:1005
SAL_DLLPRIVATE vcl::Window * getLegacyNonLayoutAccessibleRelationLabeledBy() const
void SetAccessible(const css::uno::Reference< css::accessibility::XAccessible > &)
SAL_DLLPRIVATE vcl::Window * getLegacyNonLayoutAccessibleRelationMemberOf() const
bool IsAccessibilityEventsSuppressed(bool bTraverseParentPath=true)
vcl::Window * GetAccessibleParentWindow() const
void SetAccessibleDescription(const OUString &rDescr)
WinBits GetStyle() const
Definition: window2.cxx:984
vcl::Window * GetAccessibleRelationLabeledBy() const
const std::vector< VclPtr< FixedText > > & list_mnemonic_labels() const
Definition: window2.cxx:2028
virtual sal_uInt16 getDefaultAccessibleRole() const
void SetAccessibleName(const OUString &rName)
virtual css::uno::Reference< css::awt::XWindowPeer > GetComponentInterface(bool bCreate=true)
Definition: window.cxx:3152
virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessible()
void SetAccessibleRole(sal_uInt16 nRole)
std::unique_ptr< WindowImpl > mpWindowImpl
Definition: window.hxx:484
virtual OUString getDefaultAccessibleName() const
css::uno::Reference< css::accessibility::XAccessible > GetAccessible(bool bCreate=true)
vcl::Window * GetAccessibleRelationLabelFor() const
vcl::Window * GetAccessibleRelationMemberOf() const
OUString GetAccessibleName() const
bool IsVisible() const
Definition: window2.cxx:1133
void CallEventListeners(VclEventId nEvent, void *pData=nullptr)
Definition: event.cxx:219
virtual OUString GetText() const
Definition: window.cxx:3062
bool IsScrollable() const
Definition: window.cxx:3578
void SetAccessibleRelationLabelFor(vcl::Window *pLabelFor)
vcl::Window * ImplGetWindow() const
if this is a proxy return the client, otherwise itself
Definition: window2.cxx:861
bool IsMenuFloatingWindow() const
Definition: window2.cxx:1038
const OUString & GetQuickHelpText() const
Definition: window2.cxx:1263
void SetAccessibilityEventsSuppressed(bool bSuppressed)
void SetAccessibleRelationLabeledBy(vcl::Window *pLabeledBy)
vcl::Window * GetChild(sal_uInt16 nChild) const
Definition: stacking.cxx:1017
OUString GetAccessibleDescription() const
SAL_DLLPRIVATE vcl::Window * getLegacyNonLayoutAccessibleRelationLabelFor() const
const OUString & GetHelpText() const
Definition: window.cxx:3097
SAL_DLLPRIVATE bool ImplIsAccessibleNativeFrame() const
int nCount
float x
sal_Int32 nState
sal_Int64 n
bool isContainerWindow(const vcl::Window &rWindow)
Definition: layout.hxx:816
#define SAL_WARN_IF(condition, area, stream)
int i
VclPtr< vcl::Window > pLabeledByWindow
Definition: window.h:194
sal_uInt16 nAccessibleRole
Definition: window.h:189
VclPtr< vcl::Window > pLabelForWindow
Definition: window.h:195
OUString removeMnemonicFromString(OUString const &rStr)
#define SAL_MAX_UINT16
@ WindowFrameTitleChanged
WinBits const WB_MOVEABLE
Definition: wintypes.hxx:122
WinBits const WB_OWNERDRAWDECORATION
Definition: wintypes.hxx:173
WinBits const WB_SIZEABLE
Definition: wintypes.hxx:117