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>
19 #include <vcl/uitest/uiobject.hxx>
21 #include <svdata.hxx>
22 #include <com/sun/star/beans/PropertyValue.hpp>
23 #include <memory>
24 
25 namespace
26 {
27 bool 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 
43 bool 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 
53 vcl::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 
82 void UITestLogger::logCommand(const OUString& 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 
127 namespace
128 {
129 // most likely this should be recursive
130 bool 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 
147 void UITestLogger::logAction(VclPtr<Control> const& xUIElement, VclEventId nEvent)
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 
166 void UITestLogger::logAction(vcl::Window* const& xUIWin, VclEventId nEvent)
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 
181 void 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 
192 void 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->IsTopWindow())
255  {
256  pParent = pParent->GetParent();
257  }
258 
259  OUString aParentID = pParent->get_id();
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 
318 namespace
319 {
320 OUString 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 
341 const 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 
356 const 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 
372 void UITestLogger::logEvent(const EventDescription& rDescription)
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 + "' from " + rDescription.aParent;
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: */
virtual FactoryFunction GetUITestFactory() const
Definition: window.cxx:3931
void log(std::u16string_view rString)
Definition: logger.cxx:181
sal_uInt16 GetCode() const
Definition: keycod.hxx:49
bool WriteLine(std::string_view rStr)
constexpr sal_uInt16 KEY_UP
Definition: keycodes.hxx:111
void logAction(VclPtr< Control > const &xUIElement, VclEventId nEvent)
Definition: logger.cxx:147
constexpr sal_uInt16 KEY_END
Definition: keycodes.hxx:115
static UITestLogger & getInstance()
Definition: logger.cxx:611
void logEvent(const EventDescription &rDescription)
Definition: logger.cxx:372
sal_uInt16 sal_Unicode
const OUString & get_id() const
Get the ID of the window.
Definition: window.cxx:3925
int nCount
constexpr sal_uInt16 KEY_PAGEUP
Definition: keycodes.hxx:116
UBlockCode from
const OUString & getAppName() const
Definition: logger.hxx:63
VclEventId
Definition: vclevent.hxx:37
UBlockCode to
bool IsTopWindow() const
Definition: stacking.cxx:608
WinBits const WB_SYSTEMFLOATWIN
OString OUStringToOString(std::u16string_view str, ConnectionSettings const *settings)
void Open(const OUString &rFileName, StreamMode eOpenMode)
UITestLogger()
Definition: logger.cxx:65
DocumentType eType
constexpr sal_uInt16 KEY_DOWN
Definition: keycodes.hxx:110
ImplSVData * ImplGetSVData()
Definition: svdata.cxx:75
#define SAL_CONFIGFILE(name)
void logCommand(const OUString &rAction, const css::uno::Sequence< css::beans::PropertyValue > &rArgs)
Definition: logger.cxx:82
int i
SvFileStream maStream
Definition: logger.hxx:37
constexpr sal_uInt16 KEY_HOME
Definition: keycodes.hxx:114
void logKeyInput(VclPtr< vcl::Window > const &xUIElement, const KeyEvent &rEvent)
Definition: logger.cxx:192
constexpr sal_uInt16 KEY_PAGEDOWN
Definition: keycodes.hxx:117
size
vcl::Window * GetParent() const
Definition: window2.cxx:1091
constexpr sal_uInt16 KEY_RETURN
Definition: keycodes.hxx:119
constexpr sal_uInt16 KEY_RIGHT
Definition: keycodes.hxx:113
sal_uInt16 GetChildCount() const
Definition: stacking.cxx:1001
const vcl::KeyCode & GetKeyCode() const
Definition: event.hxx:57
std::unique_ptr< char[]> aBuffer
bool IsShift() const
Definition: keycod.hxx:54
WindowType
constexpr sal_uInt16 KEY_ESCAPE
Definition: keycodes.hxx:120
ImplSVFrameData maFrameData
Definition: svdata.hxx:395
std::unique_ptr< UITestLogger > m_pUITestLogger
Definition: svdata.hxx:244
sal_Unicode GetCharCode() const
Definition: event.hxx:56
bool IsMod1() const
Definition: keycod.hxx:56
QPRO_FUNC_TYPE nType
bool mbValid
Definition: logger.hxx:39
constexpr sal_uInt16 KEY_BACKSPACE
Definition: keycodes.hxx:122
WindowType GetType() const
Definition: window2.cxx:968
reference_type * get() const
Get the body.
Definition: vclptr.hxx:143
ResultType type
OUString aCommand
WinBits GetStyle() const
Definition: window2.cxx:947
constexpr sal_uInt16 KEY_DELETE
Definition: keycodes.hxx:125
constexpr sal_uInt16 KEY_LEFT
Definition: keycodes.hxx:112
std::map< OUString, OUString > aParameters
constexpr sal_uInt16 KEY_INSERT
Definition: keycodes.hxx:124
bool HasFocus() const
Definition: window.cxx:2978
bool IsMod3() const
Definition: keycod.hxx:60
bool mbValid
constexpr sal_uInt16 KEY_TAB
Definition: keycodes.hxx:121
sal_Int16 nValue
vcl::Window * GetChild(sal_uInt16 nChild) const
Definition: stacking.cxx:1017
bool IsMod2() const
Definition: keycod.hxx:58