LibreOffice Module vcl (master) 1
logger.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
10#include <config_folders.h>
11
12#include <vcl/uitest/logger.hxx>
13
14#include <rtl/bootstrap.hxx>
15#include <rtl/ustrbuf.hxx>
16#include <osl/file.hxx>
17#include <vcl/ctrl.hxx>
18#include <vcl/event.hxx>
21#include <svdata.hxx>
22#include <com/sun/star/beans/PropertyValue.hpp>
23#include <memory>
24
25namespace
26{
27bool isDialogWindow(vcl::Window const* pWindow)
28{
29 WindowType nType = pWindow->GetType();
30 if (nType == WindowType::DIALOG || nType == WindowType::MODELESSDIALOG)
31 return true;
32
33 // MESSBOX, INFOBOX, WARNINGBOX, ERRORBOX, QUERYBOX
34 if (nType >= WindowType::MESSBOX && nType <= WindowType::QUERYBOX)
35 return true;
36
37 if (nType == WindowType::TABDIALOG)
38 return true;
39
40 return false;
41}
42
43bool isTopWindow(vcl::Window const* pWindow)
44{
45 WindowType eType = pWindow->GetType();
46 if (eType == WindowType::FLOATINGWINDOW)
47 {
48 return pWindow->GetStyle() & WB_SYSTEMFLOATWIN;
49 }
50 return false;
51}
52
53vcl::Window* get_top_parent(vcl::Window* pWindow)
54{
55 if (isDialogWindow(pWindow) || isTopWindow(pWindow))
56 return pWindow;
57
58 vcl::Window* pParent = pWindow->GetParent();
59 if (!pParent)
60 return pWindow;
61
62 return get_top_parent(pParent);
63}
64}
66 : mbValid(false)
67{
68 static const char* pFile = std::getenv("LO_COLLECT_UIINFO");
69 if (pFile)
70 {
71 OUString aDirPath("${$BRAND_BASE_DIR/" LIBO_ETC_FOLDER
72 "/" SAL_CONFIGFILE("bootstrap") ":UserInstallation}/uitest/");
73 rtl::Bootstrap::expandMacros(aDirPath);
74 osl::Directory::createPath(aDirPath);
75 OUString aFilePath = aDirPath + OUString::fromUtf8(pFile);
76
77 maStream.Open(aFilePath, StreamMode::READWRITE | StreamMode::TRUNC);
78 mbValid = true;
79 }
80}
81
82void UITestLogger::logCommand(std::u16string_view rAction,
83 const css::uno::Sequence<css::beans::PropertyValue>& rArgs)
84{
85 if (!mbValid)
86 return;
87
88 OUStringBuffer aBuffer(rAction);
89
90 if (rArgs.hasElements())
91 {
92 aBuffer.append(" {");
93 for (const css::beans::PropertyValue& rProp : rArgs)
94 {
95 OUString aTypeName = rProp.Value.getValueTypeName();
96
97 if (aTypeName == "long" || aTypeName == "short")
98 {
99 sal_Int32 nValue = 0;
100 rProp.Value >>= nValue;
101 aBuffer.append("\"" + rProp.Name + "\": " + OUString::number(nValue) + ", ");
102 }
103 else if (aTypeName == "unsigned long")
104 {
105 sal_uInt32 nValue = 0;
106 rProp.Value >>= nValue;
107 aBuffer.append("\"" + rProp.Name + "\": " + OUString::number(nValue) + ", ");
108 }
109 else if (aTypeName == "boolean")
110 {
111 bool bValue = false;
112 rProp.Value >>= bValue;
113 aBuffer.append("\"" + rProp.Name + "\": ");
114 if (bValue)
115 aBuffer.append("True, ");
116 else
117 aBuffer.append("False, ");
118 }
119 }
120 aBuffer.append("}");
121 }
122
123 OUString aCommand(aBuffer.makeStringAndClear());
124 maStream.WriteLine(OUStringToOString(aCommand, RTL_TEXTENCODING_UTF8));
125}
126
127namespace
128{
129// most likely this should be recursive
130bool child_windows_have_focus(VclPtr<vcl::Window> const& xUIElement)
131{
132 sal_Int32 nCount = xUIElement->GetChildCount();
133 for (sal_Int32 i = 0; i < nCount; ++i)
134 {
135 vcl::Window* pChild = xUIElement->GetChild(i);
136 if (pChild->HasFocus())
137 {
138 return true;
139 }
140 if (child_windows_have_focus(VclPtr<vcl::Window>(pChild)))
141 return true;
142 }
143 return false;
144}
145}
146
148{
149 if (!mbValid)
150 return;
151
152 if (xUIElement->get_id().isEmpty())
153 return;
154
155 std::unique_ptr<UIObject> pUIObject = xUIElement->GetUITestFactory()(xUIElement.get());
156 OUString aAction = pUIObject->get_action(nEvent);
157 if (!xUIElement->HasFocus() && !child_windows_have_focus(xUIElement))
158 {
159 return;
160 }
161
162 if (!aAction.isEmpty())
163 maStream.WriteLine(OUStringToOString(aAction, RTL_TEXTENCODING_UTF8));
164}
165
167{
168 if (!mbValid)
169 return;
170
171 if (xUIWin->get_id().isEmpty())
172 return;
173
174 std::unique_ptr<UIObject> pUIObject = xUIWin->GetUITestFactory()(xUIWin);
175 OUString aAction = pUIObject->get_action(nEvent);
176
177 if (!aAction.isEmpty())
178 maStream.WriteLine(OUStringToOString(aAction, RTL_TEXTENCODING_UTF8));
179}
180
181void UITestLogger::log(std::u16string_view rString)
182{
183 if (!mbValid)
184 return;
185
186 if (rString.empty())
187 return;
188
189 maStream.WriteLine(OUStringToOString(rString, RTL_TEXTENCODING_UTF8));
190}
191
192void UITestLogger::logKeyInput(VclPtr<vcl::Window> const& xUIElement, const KeyEvent& rEvent)
193{
194 if (!mbValid)
195 return;
196
197 //We need to check for Parent's ID in case the UI Element is SubEdit of Combobox/SpinField
198 const OUString& rID
199 = xUIElement->get_id().isEmpty() ? xUIElement->GetParent()->get_id() : xUIElement->get_id();
200 if (rID.isEmpty())
201 return;
202
203 sal_Unicode nChar = rEvent.GetCharCode();
204 sal_uInt16 nKeyCode = rEvent.GetKeyCode().GetCode();
205 bool bShift = rEvent.GetKeyCode().IsShift();
206 bool bMod1 = rEvent.GetKeyCode().IsMod1();
207 bool bMod2 = rEvent.GetKeyCode().IsMod2();
208 bool bMod3 = rEvent.GetKeyCode().IsMod3();
209
210 std::map<OUString, sal_uInt16> aKeyMap
211 = { { "ESC", KEY_ESCAPE }, { "TAB", KEY_TAB }, { "DOWN", KEY_DOWN },
212 { "UP", KEY_UP }, { "LEFT", KEY_LEFT }, { "RIGHT", KEY_RIGHT },
213 { "DELETE", KEY_DELETE }, { "INSERT", KEY_INSERT }, { "BACKSPACE", KEY_BACKSPACE },
214 { "RETURN", KEY_RETURN }, { "HOME", KEY_HOME }, { "END", KEY_END },
215 { "PAGEUP", KEY_PAGEUP }, { "PAGEDOWN", KEY_PAGEDOWN } };
216
217 OUString aFound;
218 for (const auto& itr : aKeyMap)
219 {
220 if (itr.second == nKeyCode)
221 {
222 aFound = itr.first;
223 break;
224 }
225 }
226
227 OUString aKeyCode;
228 if (!aFound.isEmpty() || bShift || bMod1 || bMod2 || bMod3)
229 {
230 aKeyCode = "{\"KEYCODE\": \"";
231 if (bShift)
232 aKeyCode += "SHIFT+";
233
234 if (bMod1)
235 aKeyCode += "CTRL+";
236
237 if (bMod2)
238 aKeyCode += "ALT+";
239
240 if (aFound.isEmpty())
241 aKeyCode += OUStringChar(nChar) + "\"}";
242 else
243 aKeyCode += aFound + "\"}";
244 }
245 else
246 {
247 aKeyCode = "{\"TEXT\": \"" + OUStringChar(nChar) + "\"}";
248 }
249
250 std::unique_ptr<UIObject> pUIObject = xUIElement->GetUITestFactory()(xUIElement.get());
251
252 VclPtr<vcl::Window> pParent = xUIElement->GetParent();
253
254 while (pParent && !pParent->IsTopWindow())
255 {
256 pParent = pParent->GetParent();
257 }
258
259 OUString aParentID = pParent ? pParent->get_id() : OUString();
260
261 OUString aContent;
262
263 if (pUIObject->get_type() == "EditUIObject")
264 {
265 if (aParentID.isEmpty())
266 {
267 VclPtr<vcl::Window> pParent_top = get_top_parent(xUIElement);
268 aParentID = pParent_top->get_id();
269 }
270 if (aParentID.isEmpty())
271 {
272 aContent += "Type on '" + rID + "' " + aKeyCode;
273 }
274 else
275 {
276 aContent += "Type on '" + rID + "' " + aKeyCode + " from " + aParentID;
277 }
278 }
279 else if (pUIObject->get_type() == "SwEditWinUIObject" && rID == "writer_edit")
280 {
281 aContent = "Type on writer " + aKeyCode;
282 }
283 else if (pUIObject->get_type() == "ScGridWinUIObject" && rID == "grid_window")
284 {
285 aContent = "Type on current cell " + aKeyCode;
286 }
287 else if (pUIObject->get_type() == "ImpressWindowUIObject" && rID == "impress_win")
288 {
289 aContent = "Type on impress " + aKeyCode;
290 }
291 else if (pUIObject->get_type() == "WindowUIObject" && rID == "math_edit")
292 {
293 aContent = "Type on math " + aKeyCode;
294 }
295 else if (rID == "draw_win")
296 {
297 aContent = "Type on draw " + aKeyCode;
298 }
299 else
300 {
301 if (aParentID.isEmpty())
302 {
303 VclPtr<vcl::Window> pParent_top = get_top_parent(xUIElement);
304 aParentID = pParent_top->get_id();
305 }
306 if (aParentID.isEmpty())
307 {
308 aContent = "Type on '" + rID + "' " + aKeyCode;
309 }
310 else
311 {
312 aContent = "Type on '" + rID + "' " + aKeyCode + " from " + aParentID;
313 }
314 }
315 maStream.WriteLine(OUStringToOString(aContent, RTL_TEXTENCODING_UTF8));
316}
317
318namespace
319{
320OUString StringMapToOUString(const std::map<OUString, OUString>& rParameters)
321{
322 if (rParameters.empty())
323 return "";
324
325 OUStringBuffer aParameterString(static_cast<int>(rParameters.size() * 32));
326 aParameterString.append(" {");
327
328 for (std::map<OUString, OUString>::const_iterator itr = rParameters.begin();
329 itr != rParameters.end(); ++itr)
330 {
331 if (itr != rParameters.begin())
332 aParameterString.append(", ");
333 aParameterString.append("\"" + itr->first + "\": \"" + itr->second + "\"");
334 }
335
336 aParameterString.append("}");
337
338 return aParameterString.makeStringAndClear();
339}
340
341const OUString& GetValueInMapWithIndex(const std::map<OUString, OUString>& rParameters,
342 sal_Int32 index)
343{
344 sal_Int32 j = 0;
345
346 std::map<OUString, OUString>::const_iterator itr = rParameters.begin();
347
348 for (; itr != rParameters.end() && j < index; ++itr, ++j)
349 ;
350
351 assert(itr != rParameters.end());
352
353 return itr->second;
354}
355
356const OUString& GetKeyInMapWithIndex(const std::map<OUString, OUString>& rParameters,
357 sal_Int32 index)
358{
359 sal_Int32 j = 0;
360
361 std::map<OUString, OUString>::const_iterator itr = rParameters.begin();
362
363 for (; itr != rParameters.end() && j < index; ++itr, ++j)
364 ;
365
366 assert(itr != rParameters.end());
367
368 return itr->first;
369}
370}
371
373{
374 OUString aParameterString = StringMapToOUString(rDescription.aParameters);
375
376 //here we will customize our statements depending on the caller of this function
377 OUString aLogLine;
378 //first check on general commands
379 if (rDescription.aAction == "SET")
380 {
381 aLogLine = "Set Zoom to " + GetValueInMapWithIndex(rDescription.aParameters, 0);
382 }
383 else if (rDescription.aAction == "SIDEBAR")
384 {
385 aLogLine = "From SIDEBAR Choose " + aParameterString;
386 }
387 else if (rDescription.aKeyWord == "ValueSet")
388 {
389 aLogLine = "Choose element with position "
390 + GetValueInMapWithIndex(rDescription.aParameters, 0) + " in '"
391 + rDescription.aID + "' from '" + rDescription.aParent + "'";
392 }
393 else if (rDescription.aAction == "SELECT" && rDescription.aID.isEmpty())
394 {
395 aLogLine = "Select " + aParameterString;
396 }
397 else if (rDescription.aID == "writer_edit")
398 {
399 if (rDescription.aAction == "GOTO")
400 {
401 aLogLine = "GOTO page number " + GetValueInMapWithIndex(rDescription.aParameters, 0);
402 }
403 else if (rDescription.aAction == "SELECT")
404 {
405 OUString to = GetValueInMapWithIndex(rDescription.aParameters, 0);
406 OUString from = GetValueInMapWithIndex(rDescription.aParameters, 1);
407 aLogLine = "Select from Pos " + from + " to Pos " + to;
408 }
409 else if (rDescription.aAction == "CREATE_TABLE")
410 {
411 OUString size = GetValueInMapWithIndex(rDescription.aParameters, 0);
412 aLogLine = "Create Table with " + size;
413 ;
414 }
415 else if (rDescription.aAction == "COPY")
416 {
417 aLogLine = "Copy the Selected Text";
418 }
419 else if (rDescription.aAction == "CUT")
420 {
421 aLogLine = "Cut the Selected Text";
422 }
423 else if (rDescription.aAction == "PASTE")
424 {
425 aLogLine = "Paste in the Current Cursor Location";
426 }
427 else if (rDescription.aAction == "BREAK_PAGE")
428 {
429 aLogLine = "Insert Break Page";
430 }
431 }
432 else if (rDescription.aID == "grid_window")
433 {
434 if (rDescription.aAction == "SELECT")
435 {
436 OUString type = GetKeyInMapWithIndex(rDescription.aParameters, 0);
437 if (type == "CELL" || type == "RANGE")
438 {
439 aLogLine = "Select from calc" + aParameterString;
440 }
441 else if (type == "TABLE")
442 {
443 aLogLine = "Switch to sheet number "
444 + GetValueInMapWithIndex(rDescription.aParameters, 0);
445 }
446 }
447 else if (rDescription.aAction == "LAUNCH")
448 {
449 aLogLine = "Launch" + GetKeyInMapWithIndex(rDescription.aParameters, 2) + " from Col "
450 + GetValueInMapWithIndex(rDescription.aParameters, 2) + " and Row "
451 + GetValueInMapWithIndex(rDescription.aParameters, 1);
452 }
453 else if (rDescription.aAction == "DELETE_CONTENT")
454 {
455 aLogLine = "Remove Content from This " + aParameterString;
456 }
457 else if (rDescription.aAction == "DELETE_CELLS")
458 {
459 aLogLine = "Delete The Cells in" + aParameterString;
460 }
461 else if (rDescription.aAction == "INSERT_CELLS")
462 {
463 aLogLine = "Insert Cell around the " + aParameterString;
464 }
465 else if (rDescription.aAction == "CUT")
466 {
467 aLogLine = "CUT the selected " + aParameterString;
468 }
469 else if (rDescription.aAction == "COPY")
470 {
471 aLogLine = "COPY the selected " + aParameterString;
472 }
473 else if (rDescription.aAction == "PASTE")
474 {
475 aLogLine = "Paste in the " + aParameterString;
476 }
477 else if (rDescription.aAction == "MERGE_CELLS")
478 {
479 aLogLine = "Merge " + aParameterString;
480 }
481 else if (rDescription.aAction == "UNMERGE_CELL")
482 {
483 aLogLine = "Delete the merged " + aParameterString;
484 }
485 else if (rDescription.aAction == "Rename_Sheet")
486 {
487 aLogLine = "Rename The Selected Tab to \""
488 + GetValueInMapWithIndex(rDescription.aParameters, 0) + "\"";
489 }
490 else if (rDescription.aAction == "InsertTab")
491 {
492 aLogLine = "Insert New Tab ";
493 }
494 else if (rDescription.aAction == "COMMENT")
495 {
496 OUString type = GetKeyInMapWithIndex(rDescription.aParameters, 0);
497 if (type == "OPEN")
498 {
499 aLogLine = "Open Comment";
500 }
501 else if (type == "CLOSE")
502 {
503 aLogLine = "Close Comment";
504 }
505 }
506 }
507 else if (rDescription.aID == "impress_win_or_draw_win")
508 {
509 if (rDescription.aAction == "Insert_New_Page_or_Slide")
510 {
511 if (UITestLogger::getInstance().getAppName() == "impress")
512 {
513 aLogLine = "Insert New Slide at Position "
514 + GetValueInMapWithIndex(rDescription.aParameters, 0);
515 }
516 else if (UITestLogger::getInstance().getAppName() == "draw")
517 {
518 aLogLine = "Insert New Page at Position "
519 + GetValueInMapWithIndex(rDescription.aParameters, 0);
520 }
521 }
522 else if (rDescription.aAction == "Delete_Slide_or_Page")
523 {
524 if (UITestLogger::getInstance().getAppName() == "impress")
525 {
526 aLogLine
527 = "Delete Slide number " + GetValueInMapWithIndex(rDescription.aParameters, 0);
528 }
529 else if (UITestLogger::getInstance().getAppName() == "draw")
530 {
531 aLogLine
532 = "Delete Page number " + GetValueInMapWithIndex(rDescription.aParameters, 0);
533 }
534 }
535 else if (rDescription.aAction == "Duplicate")
536 {
537 aLogLine = "Duplicate The Selected Slide ";
538 }
539 else if (rDescription.aAction == "RENAME")
540 {
541 if (UITestLogger::getInstance().getAppName() == "impress")
542 {
543 aLogLine = "Rename The Selected Slide from \""
544 + GetValueInMapWithIndex(rDescription.aParameters, 1) + "\" to \""
545 + GetValueInMapWithIndex(rDescription.aParameters, 0) + "\"";
546 }
547 else if (UITestLogger::getInstance().getAppName() == "draw")
548 {
549 aLogLine = "Rename The Selected Page from \""
550 + GetValueInMapWithIndex(rDescription.aParameters, 1) + "\" to \""
551 + GetValueInMapWithIndex(rDescription.aParameters, 0) + "\"";
552 }
553 }
554 }
555 else if (rDescription.aKeyWord == "SwEditWinUIObject")
556 {
557 if (rDescription.aAction == "LEAVE")
558 {
559 aLogLine = "Leave '" + rDescription.aID + "'";
560 }
561 else if (rDescription.aAction == "SHOW")
562 {
563 aLogLine = "Show '" + rDescription.aID + "'";
564 }
565 else if (rDescription.aAction == "HIDE")
566 {
567 aLogLine = "Hide '" + rDescription.aID + "'";
568 }
569 else if (rDescription.aAction == "DELETE")
570 {
571 aLogLine = "Delete '" + rDescription.aID + "'";
572 }
573 else if (rDescription.aAction == "SETRESOLVED")
574 {
575 aLogLine = "Resolve '" + rDescription.aID + "'";
576 }
577 }
578 else if (rDescription.aParent == "element_selector")
579 {
580 aLogLine = "Select element no " + rDescription.aID + " From " + rDescription.aParent;
581 }
582 else if (rDescription.aKeyWord == "MenuButton")
583 {
584 if (rDescription.aAction == "OPENLIST")
585 {
586 aLogLine = "Open List From " + rDescription.aID;
587 }
588 else if (rDescription.aAction == "CLOSELIST")
589 {
590 aLogLine = "Close List From " + rDescription.aID;
591 }
592 else if (rDescription.aAction == "OPENFROMLIST")
593 {
594 aLogLine = "Select item no " + GetValueInMapWithIndex(rDescription.aParameters, 0)
595 + " From List of " + rDescription.aID;
596 }
597 }
598 else if (rDescription.aKeyWord == "VerticalTab")
599 {
600 aLogLine = "Choose Tab number " + GetValueInMapWithIndex(rDescription.aParameters, 0)
601 + " in '" + rDescription.aID + "'";
602 }
603 else
604 {
605 aLogLine = rDescription.aKeyWord + " Action:" + rDescription.aAction + " Id:"
606 + rDescription.aID + " Parent:" + rDescription.aParent + aParameterString;
607 }
608 log(aLogLine);
609}
610
612{
613 ImplSVData* const pSVData = ImplGetSVData();
614 assert(pSVData);
615
616 if (!pSVData->maFrameData.m_pUITestLogger)
617 {
618 pSVData->maFrameData.m_pUITestLogger.reset(new UITestLogger);
619 }
620
621 return *pSVData->maFrameData.m_pUITestLogger;
622}
623
624/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
UBlockCode from
UBlockCode to
sal_Unicode GetCharCode() const
Definition: event.hxx:56
const vcl::KeyCode & GetKeyCode() const
Definition: event.hxx:57
void Open(const OUString &rFileName, StreamMode eOpenMode)
bool WriteLine(std::string_view rStr)
void logCommand(std::u16string_view rAction, const css::uno::Sequence< css::beans::PropertyValue > &rArgs)
Definition: logger.cxx:82
bool mbValid
Definition: logger.hxx:39
void logAction(VclPtr< Control > const &xUIElement, VclEventId nEvent)
Definition: logger.cxx:147
const OUString & getAppName() const
Definition: logger.hxx:63
UITestLogger()
Definition: logger.cxx:65
void log(std::u16string_view rString)
Definition: logger.cxx:181
static UITestLogger & getInstance()
Definition: logger.cxx:611
void logKeyInput(VclPtr< vcl::Window > const &xUIElement, const KeyEvent &rEvent)
Definition: logger.cxx:192
void logEvent(const EventDescription &rDescription)
Definition: logger.cxx:372
SvFileStream maStream
Definition: logger.hxx:37
reference_type * get() const
Get the body.
Definition: vclptr.hxx:143
bool IsMod1() const
Definition: keycod.hxx:56
sal_uInt16 GetCode() const
Definition: keycod.hxx:49
bool IsShift() const
Definition: keycod.hxx:54
bool IsMod2() const
Definition: keycod.hxx:58
bool IsMod3() const
Definition: keycod.hxx:60
vcl::Window * GetParent() const
Definition: window2.cxx:1123
const OUString & get_id() const
Get the ID of the window.
Definition: window.cxx:3935
sal_uInt16 GetChildCount() const
Definition: stacking.cxx:1002
WindowType GetType() const
Definition: window2.cxx:1000
bool HasFocus() const
Definition: window.cxx:2981
WinBits GetStyle() const
Definition: window2.cxx:979
bool IsTopWindow() const
Definition: stacking.cxx:609
vcl::Window * GetChild(sal_uInt16 nChild) const
Definition: stacking.cxx:1018
virtual FactoryFunction GetUITestFactory() const
Definition: window.cxx:3941
#define SAL_CONFIGFILE(name)
int nCount
DocumentType eType
sal_Int16 nValue
constexpr sal_uInt16 KEY_RETURN
Definition: keycodes.hxx:119
constexpr sal_uInt16 KEY_ESCAPE
Definition: keycodes.hxx:120
constexpr sal_uInt16 KEY_HOME
Definition: keycodes.hxx:114
constexpr sal_uInt16 KEY_LEFT
Definition: keycodes.hxx:112
constexpr sal_uInt16 KEY_PAGEDOWN
Definition: keycodes.hxx:117
constexpr sal_uInt16 KEY_TAB
Definition: keycodes.hxx:121
constexpr sal_uInt16 KEY_UP
Definition: keycodes.hxx:111
constexpr sal_uInt16 KEY_RIGHT
Definition: keycodes.hxx:113
constexpr sal_uInt16 KEY_DELETE
Definition: keycodes.hxx:125
constexpr sal_uInt16 KEY_DOWN
Definition: keycodes.hxx:110
constexpr sal_uInt16 KEY_PAGEUP
Definition: keycodes.hxx:116
constexpr sal_uInt16 KEY_INSERT
Definition: keycodes.hxx:124
constexpr sal_uInt16 KEY_BACKSPACE
Definition: keycodes.hxx:122
constexpr sal_uInt16 KEY_END
Definition: keycodes.hxx:115
size
int i
OString OUStringToOString(std::u16string_view str, ConnectionSettings const *settings)
QPRO_FUNC_TYPE nType
bool mbValid
std::map< OUString, OUString > aParameters
ImplSVFrameData maFrameData
Definition: svdata.hxx:399
std::unique_ptr< UITestLogger > m_pUITestLogger
Definition: svdata.hxx:245
ImplSVData * ImplGetSVData()
Definition: svdata.cxx:77
OUString aCommand
sal_uInt16 sal_Unicode
ResultType type
VclEventId
Definition: vclevent.hxx:38
WindowType
Definition: wintypes.hxx:27
WinBits const WB_SYSTEMFLOATWIN
Definition: wintypes.hxx:169
std::unique_ptr< char[]> aBuffer